pygame-1.9.1release/0000755000175000017500000000000011236514371014246 5ustar vincentvincentpygame-1.9.1release/test/0000755000175000017500000000000011236514371015225 5ustar vincentvincentpygame-1.9.1release/src/0000755000175000017500000000000011236514371015035 5ustar vincentvincentpygame-1.9.1release/pygame.egg-info/0000755000175000017500000000000011236514371017222 5ustar vincentvincentpygame-1.9.1release/lib/0000755000175000017500000000000011637747402015024 5ustar vincentvincentpygame-1.9.1release/examples/0000755000175000017500000000000011236514371016064 5ustar vincentvincentpygame-1.9.1release/docs/0000755000175000017500000000000011236514371015176 5ustar vincentvincentpygame-1.9.1release/test/util/0000755000175000017500000000000011236514371016202 5ustar vincentvincentpygame-1.9.1release/test/test_utils/0000755000175000017500000000000011236514371017424 5ustar vincentvincentpygame-1.9.1release/test/run_tests__tests/0000755000175000017500000000000011236514371020634 5ustar vincentvincentpygame-1.9.1release/test/fixtures/0000755000175000017500000000000011236514371017076 5ustar vincentvincentpygame-1.9.1release/src/SDL_gfx/0000755000175000017500000000000011236514371016323 5ustar vincentvincentpygame-1.9.1release/lib/threads/0000755000175000017500000000000011236514371016446 5ustar vincentvincentpygame-1.9.1release/lib/gp2x/0000755000175000017500000000000011236514371015674 5ustar vincentvincentpygame-1.9.1release/examples/macosx/0000755000175000017500000000000011236514371017356 5ustar vincentvincentpygame-1.9.1release/examples/data/0000755000175000017500000000000011236514371016775 5ustar vincentvincentpygame-1.9.1release/docs/tut/0000755000175000017500000000000011236514371016012 5ustar vincentvincentpygame-1.9.1release/docs/ref/0000755000175000017500000000000011236514371015752 5ustar vincentvincentpygame-1.9.1release/test/util/build_page/0000755000175000017500000000000011236514371020275 5ustar vincentvincentpygame-1.9.1release/test/run_tests__tests/timeout/0000755000175000017500000000000011236514371022322 5ustar vincentvincentpygame-1.9.1release/test/run_tests__tests/print_stdout/0000755000175000017500000000000011236514371023372 5ustar vincentvincentpygame-1.9.1release/test/run_tests__tests/print_stderr/0000755000175000017500000000000011236514371023353 5ustar vincentvincentpygame-1.9.1release/test/run_tests__tests/infinite_loop/0000755000175000017500000000000011236514371023472 5ustar vincentvincentpygame-1.9.1release/test/run_tests__tests/incomplete_todo/0000755000175000017500000000000011236514371024020 5ustar vincentvincentpygame-1.9.1release/test/run_tests__tests/incomplete/0000755000175000017500000000000011236514371022773 5ustar vincentvincentpygame-1.9.1release/test/run_tests__tests/failures1/0000755000175000017500000000000011236514371022527 5ustar vincentvincentpygame-1.9.1release/test/run_tests__tests/exclude/0000755000175000017500000000000011236514371022265 5ustar vincentvincentpygame-1.9.1release/test/run_tests__tests/everything/0000755000175000017500000000000011236514371023020 5ustar vincentvincentpygame-1.9.1release/test/run_tests__tests/all_ok/0000755000175000017500000000000011236514371022075 5ustar vincentvincentpygame-1.9.1release/test/fixtures/xbm_cursors/0000755000175000017500000000000011236514371021444 5ustar vincentvincentpygame-1.9.1release/examples/macosx/aliens_app_example/0000755000175000017500000000000011236514371023204 5ustar vincentvincentpygame-1.9.1release/docs/tut/tom/0000755000175000017500000000000011236514371016611 5ustar vincentvincentpygame-1.9.1release/docs/tut/surfarray/0000755000175000017500000000000011236514371020030 5ustar vincentvincentpygame-1.9.1release/docs/tut/intro/0000755000175000017500000000000011236514371017145 5ustar vincentvincentpygame-1.9.1release/docs/tut/chimp/0000755000175000017500000000000011236514371017112 5ustar vincentvincentpygame-1.9.1release/docs/tut/camera/0000755000175000017500000000000011236514371017242 5ustar vincentvincentpygame-1.9.1release/test/util/build_page/upload_results/0000755000175000017500000000000011236514371023342 5ustar vincentvincentpygame-1.9.1release/test/util/build_page/results/0000755000175000017500000000000011236514371021776 5ustar vincentvincentpygame-1.9.1release/test/util/build_page/libs/0000755000175000017500000000000011236514371021226 5ustar vincentvincentpygame-1.9.1release/examples/macosx/aliens_app_example/English.lproj/0000755000175000017500000000000011236514371025722 5ustar vincentvincentpygame-1.9.1release/test/util/build_page/libs/pywebsite/0000755000175000017500000000000011236514371023241 5ustar vincentvincentpygame-1.9.1release/test/util/build_page/libs/build_client/0000755000175000017500000000000011236514371023663 5ustar vincentvincentpygame-1.9.1release/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/0000755000175000017500000000000011236514371030202 5ustar vincentvincentpygame-1.9.1release/test/util/build_page/libs/build_client/test_fixtures/0000755000175000017500000000000011236514371026573 5ustar vincentvincentpygame-1.9.1release/test/util/build_page/libs/build_client/config/0000755000175000017500000000000011236514371025130 5ustar vincentvincentpygame-1.9.1release/WHATSNEW0000644000175000017500000016355211236512106015437 0ustar vincentvincent# This is a list of changes in pygame's history. # # SVN revision numbers, and CVS tag names are placed before the date # BREAK = change breaks existing code # BUG = fixed a bug that was (or could have been) crashing [SVN 2573] August 6, 2009 [BUG] missing readme.html in MANIFEST.in causes install to fail on pythons with setuptools installed. [SVN 2519] July 17, 2009 [BUG] fix pygame.font.get_fonts() bug for Python 3.1 and Windows. [SVN 2517-2518] July 17, 2009 [BUG] unit test framework fails for Python 3.1 on Windows due to str/bytes confusion [SVN 2516] July 16, 2009 Pygame dependency build now replaces the configure generated SDL_config.py, which MSVC can not use, with SDL_config_win32.py [SVN 2515] July 15, 2009 [BUG] surface docs typo patch submitted by Lorenz Quack [SVN 2503-2505] July 13, 2009 [BUG] bugzilla 29, patch to use SDL_VIDEO_DRIVER_X11 DISABLE_X11. Thanks Robert A. Lerche. So can compile pygame without X11 again. [BUG] fixed bad midi test. [BUG] pygame.gfxdraw docstrings were not there. Now... they... are. [SVN 2491-2495] July 9, 2009 [BUG] Fixed up quit bug in eventlist.py example. Thanks Evan Kroske! [BUG] Made the test code more compatible with python2.3. [BUG] python3.1 support for OSX. [SVN 2486-2488] July 8, 2009 [BUG] 64bit issues with Surface.get_masks and UintFromObj. thanks Lorenz Quack! [BUG] Color slicing works with python3 now too. [SVN 2481] July 7, 2009 [BUG] typo in examples/sound_array_demos.py Thanks Evan Kroske! [SVN 2472] July 6, 2009 [BUG]Fixed some failing tests for Color and LONG_MAX on 64bit python. From Campbell Barton.FloatFromObj speedup. register_quit cleanup. PyErr_Format used in CheckSDLVersions. [SVN 2454] July 2, 2009 [BUG] Patch to work around cpu detection bugs in SDL 64bit from Lenard. Thanks to Lorenz for bug hunting. [SVN 2380-2381] Jun 19, 2009 Color.set_length method... to change Color length to 1,2,3 or 4. Surface.get_palette(_at) return Color with length 3. [SVN 2366] Jun 17, 2009 [BUG] Memory leak in a few modules. Thanks Lorenz Quack. [SVN 2365] Jun 16, 2009 Started to add basic slice support to Color type. [SVN 2311] Jun 4, 2009 Fixed another Color regression... colors are now tasty again when pickled. [SVN 2305] Jun 2, 2009 Make pygame.tests.__init__.py import __main__.py. This is done consistently with other pygame.tests modules. [SVN 2294-2303] Jun 1, 2009 Added some notes about Color instead of tuple for some Surface functions. Midi, no abort on dealloc by default. have explicit close/abort available. Updated midi docs. Sysfont tests pass ok on OSX now(and windows+linux etc). Sysfont on OSX more resiliant. Broke up tests to find broken ones more easily. Updated test/README.TXT for tags files... eg: some_module_tags.py. Added a little tool to help with creating WHATSNEW from svn logs. Add a little TODO to svn_log_to_whatsnew.py to make its WHATSNEW output nicer. [SVN 2289-2293] May 31, 2009 Fix midi_test.py so Python3 compiles it without errors. Let Surface methods accept and return Color instances. Minor type correction in Rect docs. Extend background unit test default timeout to 2 minutes. Add gfxdraw unit tests and fix uncovered bugs. [SVN 2284-2287] May 30, 2009 Sysfont, added fallback for OSX that doesn't have X11. Tests and fixes for midi. Better validation Input/Output to avoid crashes. Fixed up test which was failing on ubuntu with python2.x. [SVN 2278] May 29, 2009 Fixed test to not fail on OSX which doesn't have midi devices by default. [SVN 2264-2269] May 27, 2009 Enable font_test.py on Windows. Add svn properties to track which files are converted to Python 3.x. Updated docs for cursors.load_xbm, thanks Saul Spatz, and Thomas Ibbotson. Cursors update note. [SVN 2248-2261] May 26, 2009 Disable debug printing for Windows build of portmidi. Symbian Launcher: - Removed unneeded buffer to save memory - Removed fade from slide animations to improve performance - Increased heap size to 100k,4Mb - Don't byte compile regular scripts so they can be easily edited. Symbian other: - The pygame library is now zipped as well for better performance. Removed color.py warning from Symbian. It is used as wrapper for the native module. Camera module and computer vision tutorial. Cleaning camera module documentation and makeref on transform. Added palette_colors to mask.from_threshold. TODO notes to some functions. [BUG] surflock.c PySurface_LockBy was leaking weakrefs. Thanks Tom Rothamel. [SVN 2242-2245] May 25, 2009 Added a palette_colors option to average_surfaces... which doesn't handle palette using surfaces correctly(yet). Fixed possible memory leak. Made some comments about return values. Recompile pymp.pyx with Cython. Enable Python 3.x support of midi module. Enable midi_test.py for Python 3.x. [SVN 2230-2237] May 24, 2009 Added some more midi tests. Python 3.x: disable midi_test.py and clean out movieext from setup.py. A tool for generating .doc docs from .py docstrings, and new midi.doc. Shortened midi.get_default_*_device_id to get_default_*_id. Fixed up create_doc_from_py and updated a few documentation items. Updated a doc for pygame.midi.time. [SVN 2216-2219] May 23, 2009 Simplified sysfont.initsysfonts_win() fonts directory scan. In init functions: fix minor Python 3.x related memory leaks and clean up indentation. Fix sndarray_test.py problem where failed to detect unsupported formats. [SVN 2201-2212] May 22, 2009 Added missing gfxdraw wrapper for Symbian. Fixed to work on PyS60 1.9.4 The pygame python files are compiled into byte-code. Feature of scons-for-symbian. Have sysfont.py search the Windows font directory default fonts before checking the registry. Added another possible registry key where there might be fonts on win. Fix possible problem with WINDIR, windir environment variable name. [SVN 2193-2199] May 21, 2009 Small svn prop tweak with run_tests.py and ignore font_test.py for Python 3.x on Windows. More font unit tests and a unit test bug fix. Add some interactive font unit tests to fill in some holes. Move locals.doc and remove redundant constant descriptions. instead refer to other module pages. Add TIMER_RESOLUTION description to time.doc. [SVN 2183-2189] May 20, 2009 Remove defunct movieext.c (ancient non-working ffmpeg movie module). Clean up props/modes on lib/midi.py. Undo unintended changes in r 2184. Partial support for OSX sysfont... 10.5.x onwards. just use unix method. Additions to font_test.py and sysfont.py. [SVN 2165-2180] May 19, 2009 Minor doc corrections to midi example's output_main. Add setmods script missing from r 2129. Added -x on lib files... Should this be moved into the setup.py ?. Make python -m pygame.docs bring up the docs in a browser. also fix Python 3 issues with executable packages. Add gfxdraw docs. Marked camera, gfxdraw, and scrap as experimental in the docs. House_lo.mp3 crashes smpeg on Debian Linux. Remove from unit tests and add MP3 warning to docs. Finished midi docs. Added the start of some midi tests... all stubs. Updated generated docs. [SVN 2163] May 18, 2009 Fix midi.py examples quit() bug. [SVN 2154-2161] May 17, 2009 Added channel argument to note_on and note_off methods. Fixing up spacing between functions. Fix midi.py example init bug for --list option. Fix midi channels changed default channel to 0 added to note_on and set_instrument. Starting to add docs in the pygame style to midi module. [SVN 2126-2132] May 14, 2009 Add pygame.examples.go shortcut. Add movieplayer example to the documents. Some doc updates for test tags and python -m option. Remove svn:executable tags and add setmods script to set executable permissions. Allowed the use of python -m pygame.tests. [SVN 2117-2122] May 13, 2009 A little tag test with the examples. Undo prop change in rev 2120 test. [BUG] Fixed bug in font.c where pygame.font.Font returned the wrong exception type and message when a font file was not found. Thanks Bo Jangeborg. [SVN 2113-2115] May 11, 2009 Fixed color.c for Symbian Updated Symbian build instructions Updated makeref.py with '--no-code-docs' feature to set empty module docstrings. Add _tags.py modules to pygame.tests. This is an alternative module level __tags__ globals in the unit test _test.py files themselves. The __tags__ global is placed in the corresponding _tags.py file instead. This means test modules can be skipped by the pygame.tests.go test framework without actually loading the test module and running possibly problematic code. It also means the test framework can report on which test modules were skipped and why. [SVN 2110-2112] May 10, 2009 Adapt run_tests.py test framework to Python 3.1. Add automatic skip of unimplemented modules to run_tests.py framework. Undo broken rev 2111. [SVN 2103-2106] May 9, 2009 Minor fixes for symbian merge. Merging from symbian branch. [BUG] pygame.transform.threshold behaved incorrectly when passed a Python long for the threshold argument. [SVN 2078-2102] May 8, 2009 Starting to merge in sybian_s60 branch. Pygame unit test framework now works with Python 3.1. This includes the run_tests__tests submodule. Increase timeout limit to 2 min. for run_tests.py subprocesses. This allows surface_test.py more time to complete (timed out on automated build sites Mac.) All standard Pygame extension modules compile and run with Python 3. For a Python 3 build setup.py skips unsupported modules. [SVN 2074-2077] May 7, 2009 Just skip the scrap not-init test completely; Figure out how to test for OS X later. scrap not properly supported on OS X anyway Fix string comprehension bug in sndarray_test.py. Try to allow scrap test in base_test.py on non-OS X platforms. [SVN 2065-2073] May 06, 2009 Adapt fastevent module for Python 3.1. OS X now passes tests. See if the problem in base_test.py is with scrap. Allow all Python modules to install with Python 3.1, though some may not work correctly. Update python 3.1 README to reflect current status. Adapt overlay for python 3.1; untested though importing doesn't crash anything. OS X problem with base_test.py isolated to scrap module. Try a temporary workaround. Adapt joystick and cdrom modules for Python 3.1. Try again with OS X and base_test.py. [SVN 2058-2064] May 05, 2009 Why does base_test.py fail on OS X?. Yet more OS X testing with base_test.py. More OS X testing of base_test.py. Adapt mask module for Python 3.1. Fix font.c problem with Python 3.1. Undo accidental changes to Setup.in and __init__.py. Add scroll.py example to Python 3.1 adapted programs. [SVN 2055-2057] May 04, 2009 More code fixes to transform.c for non-MMX machines. Clean up METH_NOARG functions which were accidently given a second C argument in display.c. Make scrap test in base_test.py conditional on the presence of scrap. [SVN 2052] May 03, 2009 Fix compiler error in transform.c for non-MMX machines. [SVN 2049-2050] May 02, 2009 Merging with python3 branch r 2048. Port Python 3 specific files from python3 branch. [SVN 2047] May 1, 2009 Merge python3 branch back into trunk. This allows a minimal Pygame system to be built for Python 3. It also improves error checking in module init functions. [SVN 2046] Apr 30, 2009 [BUG] SDL_gfx used WIN32 macro instead of _WIN32 to detected Windows. [SVN 2040] Apr 24, 2009 SDL_gfx module officially added to Pygame. [SVN 2024] Apr 18, 2009 A quick fix for jpeg saving not checking color order in 24 bit surfaces Note that there is a similar bug remaining in the camera module. [SVN 2019] Apr 15, 2009 Merge src/__init__.py from python3 branch back into trunk. [SVN 2009-2017] Apr 13, 2009 Add equality/inequality Event comparison as per mailing list request. Patch from Sean Berry updating missing tests for Rects. [SVN 1997] Apr 11, 2009 Make gfxdraw build on Windows. [SVN 1993] Apr 06, 2009 Bmp gives out of memory error... so use png instead. [SVN 1983-1985] Mar 30, 2009 Oops... hopefully this will work with mac/win. Trying to move the source around to fix the compile bug... Removing gfxdraw from compiling by default until get a chance to fix... [SVN 1980-1982] Mar 29, 2009 Included a couple of files from SDL_gfx for the gfxdraw module. Added some more documentation, and a TODO note to the top of the file. A tool for finding out what is documented, and what isn't. [SVN 1974-1976] Mar 26, 2009 Fixes gfxdraw.filled_polygon bug involving the point list. More point list bug fixes. [SVN 1973] Mar 25, 2009 Adds tentative SDL_gfx module. [SVN 1969] Mar 24, 2009 Some minor comment corrections. [SVN 1967] Mar 16, 2009 Yuv420 reimplemented with formulas from libv4l. [SVN 1966] Mar 13, 2009 Re-add yuyv to rgb based on libv4l by Hans de Goede, licensed LGPL. [SVN 1965] Mar 12, 2009 Licensing problems in the Camera module. Fixes the licensing for the Bayer to RGB function. Removes YUYV to RGB and YUV420 to YUV and RGB functions until they are properly licensed. [SVN 1962] Mar 05, 2009 Fix bug that let the example scroll past the bottom. [SVN 1960] Mar 03, 2009 Don't need aliens_bootstrap.py as far as I can see. Updated checks for music module. Made README.txt instructions correct. [SVN 1956-1957] Mar 01, 2009 Fixed some typos. Started adding documentation for pygame.midi module. [SVN 1954] Feb 25, 2009 Allowed holding down the mouse, or key to scroll. [SVN 1940-1953] Feb 22, 2009 Add 8 bit-per-pixel support to Surface.blit blends. Added Surface.scroll method along with the scroll.py example. Added a runtime check for old unneeded files. Made the error message nicer... and added checks for old py files too. Removed debug print from warn_unwanted_files(). Add some comments, and a doc string to warn_unwanted_files. Camera.init tries to detect correct platform camera module to use. Added a few empty methods to opencv camera class that _camera uses. Fixed dest_surf on opencv camera driver, added missing methods to vidcap one. [BUG]Made colorkey and blanket alpha blits handle a surface blit to self. This addresses Bugzilla bug 19. [SVN 1937] Feb 19, 2009 Add self-blit capacity to Pygame surfaces. [SVN 1934] Feb 18, 2009 Surface raises a ValueError if the mask argument is rejected by SDL. Before this the mangled, and invalid, SDL value was used. [SVN 1931-1932] Feb 16, 2009 Fixed to work with new test file layout. Also imports modules if not found. Moved camera.c _camera.c . created a lib/camera.py. [SVN 1928-1929] Feb 15, 2009 Made it use the pygame.examples.camera to test it. Filled in missing methods. Fix erroneous ALPHA_BLEND macro argument. [SVN 1926-1927] Feb 14, 2009 Add psuedo-import to __init__.py atexit, required by pygame.base. Remove an accidental colordict import introduced into __init__.py. [SVN 1924-1925] Feb 12, 2009 Add Rect.copy method as per Bugzilla feature request 25. Adding another import declaration for py2app/py2exe. This makes using py2exe easy again. [SVN 1922-1923] Feb 11, 2009 [BUG] Fix per-pixel-alpha unpacking in surface fill-blends. [BUG] Fix 24 bit-per-pixel fill-blends. BLEND_RGBA_xxx and more BLEND_xxx tests; related bug fixes (mostly 24 bit surface related). Fix per-pixel alpha bug involving pixel unpacking. [SVN 1920] Feb 11, 2009 The Pygame documents and examples are now part of the Pygame package, directories docs and examples respectively. [SVN 1916] Feb 8, 2009 [BUG] Fix segmentation fault with register_quit, Bugzilla bug 20. [SVN 1912] Feb 6, 2009 [BUG] Extension modules failed to raise an error when required modules failed to import, as can happen with an incomplete py2exe/py2app executable. This would later lead to mysterious segfaults. Extension modules now forward import errors in the init function. [SVN 1903] Feb 3, 2009 [BUG] _numpysurfarray.array_alpha() when a per-pixel alpha surface also has blanket alpha. [SVN 1893] Jan 29, 2009 [BUG] Documentation infers that mixer.init and mixer.pre_init have keyword arguments. Added as per Bugzilla issue 6. [BUG] Documentation states that mixer buffer sizes must be a power of 2. New default buffer size is 4096. This was the implicit size anyway as buffer size values were rounded up the the nearest power of 2. [SVN 1888-1889] Jan 29, 2009 sound_array_demos.py now uses either NumPy or Numeric. _numpysndarray.py bug fix submitted by Nicholas Dudfield. [SVN 1886] Jan 28, 2009 Updated msys config to use a fake PORTTIME variable... so it builds again with mingw. [SVN 1881-1883] Jan 27, 2009 Add array_alpha and array_colorkey tests to surfarray_test.py. array_alpha values incompatible with unmap_rgb for 16 bit surfaces - fixed in _numpysurfarray.py, ignored in deprecated _numericsurfarray.c. For 16 bit surfaces make surfarray.array_alpha values consistent with those returned by Surface.unmap_rgb. Revert unintended change to surface.rgb_map in rev 1875. Surfarray tests for make_surface, map_array, pixels2d and pixels_alpha, Finished surfarray_test.py. [SVN 1880] Jan 26, 2009 Made it so we can use ctypes, instead of requiring win32 modules for the windows test runner. [SVN 1871-1879] Jan 25, 2009 Completing the process to actually have numpy be the default. Make subprocesses mode default for test runner. Small fix for the nosubprocess change. Fix pygame.init() problem in surfarray_test.py. Surface.unmap_rgb now METH_O. Add surface.map_rgb unit test. Add surfarray.array2d, array3d, pixels2d and pixels3d unit tests. Make surfarray_test skip tests known to fail with Numeric. Making mac build with portmidi lib linked in. [SVN 1863-1870] Jan 24, 2009 Add array2d test to surfarray_test.py. Move surfarray surface lock test to surfarray_test.py. Surfarray.array3d unit test and 16 bitsize bug fix. Surfarray get_arraytype, get_arraytypes and use_arraytype tests. Edit tests module docs. Another small tests doc typo. Making it so we don't swallow exceptions... [SVN 1854-1861] Jan 23, 2009 Making it so we won't try to re-enter application installation. Fix VC compiler error and make small code tweaks. Add blit_array test for surface shifts. Surfarray_test does nothing if no array module installed. Add array tags to tests requiring NumPy or Numeric. Numpy now takes priority over Numeric in sndarry and surfarray. Fixed __hasnumpy/__hasnumeric confusion in sndarray. [SVN 1852] Jan 22, 2009 [BUG] Fix Bugzilla bug 24 where surfarray.blit_array fails with a 24 bit surface. A new blit_array, using the array structure interface, was added to a new _arraysurfarray extension module. [SVN 1849-1853] Jan 22, 2009 [BUG] Fix Bugzilla bug 24 where surfarray.blit_array fails with a 24 bit surface. A new blit_array, using the array structure interface, was added to a new _arraysurfarray extension module. Fix NumPy bug in arraydemo.py and add an array choice command line arguemnt. Removed PyObjC dependency on OSX. [SVN 1845-1848] Jan 19, 2009 Make the main function consistent accross examples, taking arguments where the programs except command line arguments. Add examples module document page. Minor change to usage message in test_runner.py. Make some hyperlinks in the examples doc work. The Pygame examples is now a Pygame subpackage. Example programs can be imported as modules and run by their main functions. The package documentation is now part of the Pygame module docs. [SVN 1841-1843] Jan 16, 2009 Add pygame/tests/fixtures to installation (broken in previous setup.py changes). Add arguments to pygame.tests.run(). Add addition fake tests to installation. [SVN 1839-1840] Jan 15, 2009 Color objects now support equality/inequality comparison with other Color objects and color tuples. Jpeg image saving is not thread safe on windows after all. [SVN 1834-1838] Jan 14, 2009 Examples\midi.py: add list option and main() function. Remove absolete Windows doc installer stuff. Remove old default Windows setup info. Fix porttime Setup.in change. [SVN 1829-1833] Jan 13, 2009 Added argv arguments to main() too, and used pygame.quit. Updated portmidi config for unix and darwin. tested on ubuntu, not osx. Added libporttime dependency, as required by ubuntu. Added get_device_info function. Printed out device info. Allowed setting device id on the cmd line. [SVN 1819-1827] Jan 12, 2009 Pygame docs: fixed some links. Docs added to Pygame package. Added __init__.py to make examples a package. Examples can be run from outside the examples directory. Corrects some terminology in the tests package doc. Call pygame.quit to clean up things. closes window when called from pygame.examples.chimp.main() finishes, and for when run from idle. Update setup.py to reflect examples becoming a package. Updated examples so that they all have a main() and use pygame.quit. Pygame documents now installed as part of the pygame package directory. [SVN 1816-1817] Jan 11, 2009 Pygame.tests: prepare run_tests__tests for addition. Pygame.examples: completely installs. [SVN 1813-1815] Jan 10, 2009 Pygame unit test suite is now the pygame.tests package. For Pygame development the unit tests still run from test in the installation directory without conflicts. [SVN 1802-1804] Jan 07, 2009 Refactored midi.py example and added comments. Finished midi.py keyboard example, added velocity. Added test command to setup.py. so you can do 'python setup.py test'. [SVN 1796-1798] Jan 05, 2009 Mask convolve function and tests from Michael George. Update docs for pygame.mixer.music.load: thanks Forrest Voight. Clean up some carriage return confusion in the docs. [SVN 1793-1794] Jan 04, 2009 Update midi example to add animated keyboard keys. Add scripts to build Python 2.6/3.0 Windows dependencies linked to msvcr90. [SVN 1776-1777] Dec 27, 2008 Add get default device functions for midi module. Expand midi output example into a musical keyboard demo. [SVN 1772-1775] Dec 24, 2008 Pypm: temporary Setup.in fix to add header and library paths for Windows prebuilt. Added Output class and atexit stuff similar to Lenards code. Added output example from Lenard, and moved input example out of midi module into the midi example. [SVN 1764-1771] Dec 23, 2008 Windows prebuilts: Python 2.6 preparation. Added pygame.mixer_music fake import in function to maybe help with py2app. Undo fake import for py2app. Try rearranging stuff for py2app. Add portmidi to Windows build. Added code from pyportmidi to be used from pygame.midi. Added pyportmidi 0.0.4 changes from Tim Thompson. Thanks!. [SVN 1759-1760] Dec 22, 2008 The freetype dll was not being copied into the site-packages/pygame dir on windows. Added start of midi module which uses portmidi. [SVN 1755-1758] Dec 19, 2008 Added in an extra debugging line... for testing with py2app. Fixed error for msvc compiler. Moved brackets closer... suspecting possible dodgey introspection in py2app. Missed freeing surface on malloc out of memory error for saving jpegs. [SVN 1751-1754] Dec 18, 2008 Added some debugging notes for py2app mixer_music issue. Msys_build_deps.py: added portmidi. Setup_Win.in: add portmidi. [SVN 1749-1750] Dec 17, 2008 Add program to list Pygame modules accessed by a unit test module. [BUG] Bug 28: possible fix. Dec 05, 2008 exposed mask C API from Michael George. Thanks! Aug 30, 2008 [BUG] Fixed CREATE_PIXEL macro's use of Aloss which was making surface.fill with surfaces with no alpha go green release_1_8_1release [SVN 1537] Jul 28, 2008 pygame 1.8.1release released. Jul 18, 2008 Added Surface.set_masks and .set_shifts useful for using data in b,g,r,a mode... and other fun hacks. Jul 14, 2008 [BUG] Fixed bug with transform.threshold() not honoring third surface Updated transform.threshold() docs Thanks Nirav Patel Jul 10, 2008 Added patch for filelikes in mixer.music.load thanks Forrest Voight! Jul 8, 2008 run_tests.py improved with --help and running stuff in subprocesses. Jun 25, 2008 Added many extra empty test stubs for untested things. Thanks Nicholas! Test runner that works with subprocess and threads to isolate tests. So that if a crash happens in one test the other tests still run. Thanks Nicholas! [BUG] Added a fix for rotate on multiples of 90.0000001-90.99999 degrees. Thanks Charlie Nolan, and Marcus! Jun 21, 2008 Added BLEND_RGBA_* special flags for blit, and fill. Jun 16, 2008 Reworked locking code. Locks are now more strict and can only be removed by the object(s), that caused them. New Surface.get_locks() method, which returns the currently existing locks. [BUG] Fixed Surface.get_locked() bug for Surfaces which do not require locking, but have third-party locks attached. Jun 13, 2008 [BUG] Fixed bug with mixer.get_init() Thanks Frankie Robertson! [BUG] Fixed long alpha overflow bug in Surface.set_alpha(). Jun 9, 2008 [BUG] Fixed locking and reference count leaks in Numeric surfarray implementation. May 31, 2008 Updated sprite documentation - mainly for new stuff added in pygame 1.8.0 May 24, 2008 New Color class for color management. Apr 30, 2008 updates to the sprite.py collision functions that update them to match the modules coding style, include appropriate comments, and are about 20% faster. It also includes a collide_circle_ratio function for completeness, and perhaps most importantly, fixes a bug in colide_mask which kept it from working correctly. Also added unittests for the collision functions. Thanks John Krukoff! [BUG] sound crackles on windows; restored chunk size calculation to pre 1143 Added \#!/usr/bin/env python to the top of examples that didn't have it. Apr 13, 2008 [BUG] Fixed pygame.surfarray.pixels3d() for 24bpp surfaces using numpy. Thanks Lorenz Quack! Apr 12, 2008 [BUG] Fixed png saving, and saving jpeg with capital letter extensions Thanks Nick Irvine! Apr 11, 2008 New PixelArray.compare() method to compare two PixelArrays. Apr 8, 2008 [BUG] Fixed pygame.draw.aaline() for cases in which only a single point has to be drawn. Apr 4, 2008 New PixelArray.replace() and PixelArray.extract() methods to quickly replace or extract a certain color. Apr 3, 2008 Added iter support to PixelArray. Apr 2, 2008 [BUG] Fixed mask settings for 8-bit surfaces created by surfarray.make_surface() [BUG] Fixed integer color value assignment bound checking in PixelArray. Mar 30, 2008 Added subscript support to PixelArray and PixelArray.make_surface() to create a new surface from the PixelArray view. Fixed mask namespace pollution and docs. release_1_8_0release Mar 18, 2008 Updated credits. Mac OSX binary now has movie module working. 1.8.0rc5 Mar 16, 2008 the play functions of mixer.Channel and mixer.Sound both now take keyword arguments, and accept a fade_ms argument that makes the sound fade in Mar 9, 2008 pygame.display.set_mode() will now respect the screen resolution settings for the width or height set to 0 as supported by SDL >= 1.2.10. Thanks Lorenz Quack! Mar 5, 2008 [BUG] Stopped releasing GIL on png, and jpeg saving functions because they do not seem to be thread safe. [BUG] A work around for 8 bit samples being stereo reversed with SDL_mixer. Also check the return value of Mix_SetPanning, and raise an error on volume errors. [BUG] Changed default chunk size for pygame.mixer to 1024*3. Which is the magic number which stops scratchy sounds on most systems. However it does make sounds a bit laggier... it's best provided as a config item for users. Updated pygame.display.update() to release the GIL whilst doing things, so other threads can do things whilst it's updating the screen. Some comments to help Mac OSX people installing, and compiling pygame. About bdist_mpkg in setup, and also fixed an exception message to be nicer about requiring pyobjc. Mar 3, 2008 [BUG] Fixed up pygame.mask.from_surface, got color key, and perpixel alpha modes reversed. Also added better test to the mask test. Also it wasn't testing pygame.mask.from_surface at all! Added pygame.sprite.collide_mask to join the mask_* collision functions. Started adding test for pygame.sprite.spritecollide. Feb 19, 2008 Added Surface.get_bounding_rect() method, which returns the smallest rect for the surface, that contains visible (non-transparent) data. Feb 14, 2008 Updated constants GL_SWAP_CONTROL,GL_ACCELERATED_VISUAL,BUTTON_X1,BUTTON_X2 Added pygame.key.get_repeat to see how holding keys down repeats. This is the sister function of pygame.ket.set_repeat. MacOSX, and Windows binaries now use latest SDL 1.2.13 Feb 11, 2008 An example of using pygame with no windowing system. Useful for webserver scripts, or for little utilities. Updated mac_scrap to pass some tests, and raise NotImplementedError otherwise. Further Windows build updates: For MinGW/MSYS the build process now finds the MSYS and MinGW directories automatically. gcc links to msvcr71.dll without requiring changes to the gcc specs file. This makes the build process GCC Version 4 ready. By default all DLLs are Win32 GUI, but can be console. The build progams will run from either the Windows or MSYS terminal. Fixed a bug where DLLs were not installed in the package directory. For Windows, everything now goes into the package directory. build_deps.py renamed to msys_build_deps.py to avoid confusion. Jan 26, 2008 pygame.sndarray noew can change between Numeric and numpy using the new methods pygame.sndarray.use_arraytype () and pygame.sndarray.get_arraytypes (). Jan 24, 2008 Updated the configuration and build process under Windows. In config_msys.py and config.py os.popen is replaced with the newer subprocess.Popen so the MSYS will run. Calls to raw_input now show the prompt on an MSYS console. In an MSYS build paths written to Setup are now Windows paths for distutils. The hard coded DLL file paths have been removed from setup.py. It now gets the paths from Setup. Consequently, setup.py is now VC/MinGW agnostic. Added build_deps.py, an all-in-one dependency builder for Windows. Requires MinGW and MSYS. Jan 8, 2008 pygame.surfarray now can change between Numeric and numpy using the new methods pygame.surfarray.use_arraytype () and pygame.surfarray.get_arraytypes (). Jan 4, 2008 Removed Numeric compile time dependency. Added numpy surface array support. Dec 31, 2007 New method pygame.get_sdl_byteorder () to get the SDL byte order. Dec 15, 2007 Mask can now get bounding rects of set bits. pygame.transform can find edges in an image, get the average surface of many surfaces and also threshold an image by color. Sep 1, 2007 Added get_buffer() methods to Surface, and Sound - which return a new BufferProxy - which is a buffer interface only class. Thanks Marcus! Aug 23, 2007 pygame.image.tostring changes from Brian Fisher. RGBA_PREMULT & ARGB_PREMULT type to image.tostring (a very nice thing for getting images into OpenGL) Aug 22, 2007 PixelArray from Marcus. It's going to be a replacement for surfarray. [BUG] Fixed some bugs in Surface with SRCALPHA and input validation. Thanks Lenard Lindstrom and Brian Fisher. Aug 15, 2007 The sprite module has had some big changes from DR0ID. It now has a LayeredUpdates, and LayeredDirty groups. For using layers when rendering the sprites. LayeredDirty is an alternative to RenderUpdates that automatically finds the best display method (either full screen updates, or dirty rect updates). It's faster if you have sprites that don't move. Thanks DR0ID! Added pygame.mask.from_surface which can make a Mask object from a surface. It's 128x faster than the python version! pygame.movie bug fix. Thanks Lenard Lindstrom! Jun 25, 2007 Removed QNX support from scrap module. Thanks Marcus! Added smoothscale(with MMX!) function from Richard Goedeken Jun 27, 2007 Fixes from Marcus for ref counting bugs. Also using METH_NOARGS for functions with no arguments. Which should make some functions slightly faster. Thanks Marcus, and thanks Campbell Barton for spotting them. May 30, 2007 Fixed some documentation. mask, scrap, font modules. Fixed the mask.set_at get_at functions to raise a nice exception. Thanks piman! surface.fill() now takes the same BLEND_ADD BLEND_SUB etc flags that surface.blit() takes. Which makes fade to white, and fade to black type operates simple and fast. Thanks Marcus!! Added the GL_SWAP_CONTROL constant from SDL. Thanks Eyal Lotem! Added the new blitters from Marcus. These speed up the blend functions and the alpha blit function. Added a -warnings flag to setup.py for extra warnings with gcc. A fix from Marcus for the scrap module in X11. May 9, 2007 Windows image copy/paste is working for scrap. Adding bitmask code from Ulf Ekström - for pixelperfect collision. Still need to get unittest, documentation and some more methods added. There's a unittest with some problems checked in. May 2, 2007 [BUG] fromstring,tostring work for alpha. Thanks Brian Fisher. [BUG] Surf.set_clip(None) works correctly. Thanks Diego Essaya. Scrap changes from Marcus so windows/osx compile. Added scancode attribute to keyboard events. Thanks Quentin Smith. [BUG] movie_set_display hangs on movie file-like object. Thanks Martin. Apr 26, 2007 Some code cleanups from Marcus von Appen. min->MIN, indentation, other. A rewritten scrap module. Hasn't been tested on osx/windows. Dec 15, 2006 Some config changes to make scrap compile correctly on freebsd and debian. Nov 27, 2006 Fixes scrap, image, overlay, compiling on windows. Thanks John Popplewell! Allowed threads within the transform module. Releasing GIL around C stuff. Nov 5, 2006 Fix for SysFont infinite loop bug. Thanks Regis Desgroppes! Compilation fix on MacOSX. Thanks Emmanuel Hainry! Nov 4, 2006 Documentation fixes. Jun 16, 2006 Allowed passing in the destination surface to the transform.scale and transform.scale2x. This is faster if reusing the surface. Jun 15, 2006 [BUG] Font fix for empty string causing segfault. Added unittest. Jun 10, 2006 64bit compile fixes for Fedora from Christopher Stone Jun 8, 2006 Documentation changes. Move to subversion instead of cvs. May 28, 2006 Added saving surfaces as a .jpg or .jpeg file. Works if imageext is there. May 27, 2006 Added saving surfaces as a .png file. Works if imageext is there. Saves as 24 bit RGB or as 32bit RGBA pngs depending on the surface. May 20, 2006 Documentation updates merged in from some doc comments on website. [BUG] pygame.transform.* functions now retain SRCALPHA info after scaling. Some new unittests for pygame.display.update, pygame.transform.scale. May 18, 2006 Patch from Peter Nicolai to add the channel to the sound queued event. April 25, 2006 Added some new blend modes to blit. Add,sub,mult,max,min. [BUG] Fixed SRCALPHA blending. Thanks Lenard Lindstrom! April 9, 2006 Added mac_scrap module for macintosh clipboard support. April 8, 2006 Added scrap module for accessing the clipboard. As well as an example. Added access to the XEvent structure on unix/X11 installs. March 11, 2006 Fix for config_unix for x86_64 and SDL lib path. Thanks Matthew L Daniel. [BUG]Fix for parent init in sprite.GroupSingle. Thanks Alexander Sashnov. March 1, 2006 A cursors.py example from Kamilche. Thanks! February 11, 2006 Changed the behaviour of Clock.tick to use SDL_Delay instead of a busy loop. Added a tick_busy_loop which uses the old behaviour. This is more consistent with what people think Clock.tick() will do. That is, not use 100% cpu to get more accurate timing. testsprite.py example, which is based off the testsprite.c in SDL shows the performance of sprites, and is a good test. Added gp2x package which contains some constants for the gp2x buttons. This will be where gp2x specific functionality will live. January 12, 2006 Endian patch for set_at() from Ivo Danihelka. December 19, 2005 Updates for Overlay. Detect hardware accel and allow "redisplay". November 7, 2005 Fix for sprite.AbstractGroup.has inf recursion bug. thanks Randy Kaelber. Began work on a sprite unittest. October 28, 2005 fix for do_set_icon when display not initialised. Thanks John Popplewell! Added missing read_unix_fonts_cache function. Thanks again John Popplewell. October 24, 2005 Add support for 64bit data types in surfarray.blit_array() October 2, 2005 switch to the new reference documentation system September 8, 2005 surface.array_colorkey now unlocks the surface after use[BUG]. September 1, 2005 music.queue() now raises exception if load fails. release_1_7_1release August 15, 2005 Fix to make Chinese fonts work better on windows. From retsyo AT eyou Dot com. Fix for Channel.set_volume() to not use panning if seting overall volume. Made setup put in missing files into the source distribution. Fix for fastevents example on linux. August 10, 2005 Fix for overlay.c to compile in windows. Fixed some warnings for font, and rotozoom with gcc4. Added an example for fastevents. Fix for config_unix.py with wrong paths for /usr/local July 28, 2005 Fix for sprite module[BUG]. fastevent module for faster sdl event processing. Updated examples. March 7, 2005 sysfont patch, which checks two places for fonts on weird windows machines from Atul Varma. pygame.get_sdl_version(), improved Mac OS X support from Bob Ippolito. new sound_array.py example from Rene Dudfield based on ShreadWheats example. August 8, 2004 cleanup aaline drawing, from Michael Urman July 17, 2004 image.frombuffer() for lightning fast fromstring()'s SysFont extra styles being applied incorrect psuedo "configure" and "Makefile" for foolproof installs draw.aaline now works with pixel alphas July 16, 2004 mixer.set_num_channels() no longer crashes [BUG] mixer.music.get_pos() properly tracks when paused pygame.display.get_wm_info() added, gets a dictionary Overlay object, from Dmitry Borisov July 6, 2004 Sound object newstyle types added Sound.get_length() July 5, 2004 Add Bo Jangeborg's cursor compile with added 'xor' Add Bo Jangeborg's system cursors as compileable strings July 3, 2004 Newstyle fonts crashing with bad filenames [BUG] June 28, 2004 Surface.set_clip(None) crashed [BUG] Remove pygame's (now) redundant lock counting June 27, 2004 Fix several negative or zero size problems [BUG] draw.arc outside image crashed [BUG] draw.arc artifacts cleaned June 26, 2004 Rect.fit() added Surface.get_rect() accepts keyword args for assignment transform.chop() added, from Matthias Spiller June 25, 2004 Font becomes new style type, inheritable, weakrefable June 22, 2004 Rect type updated, weakrefable (warning, Rect attributes broken for now) June 21, 2004 Surfaces now weakref'able display surface protected from pygame.quit() display and Surfaces protected from resolution <=0 June 19, 2004 Chad Lester's excellent work on sndarray ffmpeg movie backend renamed to movieext, experimental v1.6 movie module restored May 1, 2004 updated sprite module, Joe Wresching March 29, 2004 checkin movie current rewrite, still rough, libavcodec February 24, 2004 no longer parachute SIGPIPE, like SDL 1.2.7 February 15, 2004 small cleanups to internal Sprite and Group February 9, 2004 help protect int overflow December 25, 2003 sprite groups are now iterators SysFont better unix parsing November 18, 2003 Remove legacy python code. Ver 2.2 is minimum pygame-16 October 23, 2003 final updates for 1.6 October 15, 2003 Rects now stored with ints (not shorts) October 2, 2003 Add ARGB support to fromstring and tostring September 29, 2003 Replaced Objective C with PyObjC code for MacOS X Fixed 1 pixel horizontal/vertical line draw September 27, 2003 Fix reading from file file-like objects (thx Timothy Stranex) September 21, 2003 Fix sysfont registry bug on winNT arch September 18, 2003 Fix color problem when saving opengl screenshot September 10, 2003 SysFont now accepts None like regular Font August 10, 2003 fix JOYHAT_RIGHT input (thanks Latimerius) system font names have punctuation removed July 26, 2003 add GL_STEREO July 22, 2003 add GL_MULTISAMPLEBUFFERS and GL_MULTISAMPLESAMPLES June 11, 2003 Surface.set_at() respects clip area cleaned fill circle draw June 8, 2003 add system font; SysFont,get_system_fonts,match_system_font June 7, 2003 Font() no longer segfaults on bad filename [BUG] add color module for simple color manipulations June 6, 2003 set_palette_at() index 0 fix draw.arc() (thanks Lalo Martins) Rects are pickleable May 12, 2003 Brett Calcott's quick fix for 'trunc' on visualc May 10, 2003 fix Derek Simkowiak's find of problem alphas March 10, 2003 add OPENGL support to image.tostring() March 9, 2003 Bug in Clock.tick() was delaying double load Font objects from any python file-like object February 26, 2003 Sprite and Group now new-style classes Februrary 12, 2003 fix immediate returns for first time.delay and time.wait February 11, 2003 more OSX SDLmain.m patches from Andrew Straw February 5, 2003 antialiased lines, from Jorge Gonzalez allow Font.render() with empty string February 2, 2003 refcount bug in Font.size [BUG] December 5, 2002 tilerow stuff removed December 2, 2002 experimental pygame.draw.tilerow() November 14, 2002 fix unicode bugs in Font (thanks, hcyun) November 12, 2002 AdvanceMAME Scale2X scaling now in transform.scale2x() October 22, 2002 mixer can queue sounds and music channels can send finished event for sounds October 19, 2002 can free software surfaces without video initialized added "x", "y", "w", and "h" attribs to Rect (like SDL) RenderUpdates.draw() doesn't union nonoverlapping October 16, 2002 fix crash with subsubsurface blits [BUG] added Surface.get_offset() and get_abs_offset() added Surface.get_parent() and get_abs_parent() October 6, 2002 added event.clear() to efficiently clear the queue October 1, 2002 sprite.RenderGroups wasn't clearing killed sprites after draw() September 3, 2002 passing None as the end time to CD.play() plays to cd end added pygame.vernum, a tuple of python version values September 2, 2002 add Movie.render_frame, thanks James Mazer cursors.load_xbm skips comments, thanks Herve August 20, 2002 fix rectstyle arguments August 15, 2002 Hervé Cauwelier's fix for xbm cursors without spaces Auguest 14, 2002 switched to FSF's FreeSansBold default font new font.get_default_font() cleanup harmless void** typing July 24, 2002 Ole Martin Bjoerndalen's CD.play fix July 17, 2002 Michael Hudson's unicode cleanups June 15, 2002 added get_time() and get_rawtime() to Clock pygame-15 May 30, 2002 final updates for 1.5 May 28, 2002 changed default font to helmet bold May 27, 2002 added smart class to handle missing modules May 17, 2002 added display.set_gamma_ramp(). thx andrew May 16, 2002 custom blitters to handle destination pixel alphas fix recursive subsurfaces and subsurface blit returns May 13, 2002 fixed CD.play() May 8, 2002 music.play() start time works image.save() can save TGA images cannot subsurface a subsurface [BREAK] blits to subsurfaces are passed through May 7, 2002 added the sndarray module added surfarray.make_surface() April 25, 2002 added gl_set_attribute(), gl_get_attribute() April 16, 2002 mixer keeps a reference to playing Sound objects channel.set_volume() can take 2 volumes for panning music.play() can take a starting position for the song April 14, 2002 bug when re-initializing pygame.display [BUG] April 8, 2002 rectstyle now includes any object with a "rect" attrib rects now have collidedict() and collidedictall() March 27, 2002 fixes for windows music.get_pos() and windows config March 23, 2002 big config.py update music.get_pos() (thx Michael Urman) March 20, 2002 sprite.spritecollideany() now works as described March 4, 2002 sprite.RenderClear can accept a function as bgd February 19, 2002 event.peek() returns next event [BREAK?] Event objects have 'truth' operator February 13, 2002 all draw primitives have a default width February 11, 2002 Rect unionall() and unionall_ip() fixed February 10, 2002 pygame.init() not required for proper cleanup [BUG] CD.play() fixed for tracks above 0 February 8, 2002 Rect and Surface subclassable types February 1, 2002 locking problem with 90 degree rotate [BUG] set_icon overrides default icon January 31, 2002 removed emberrasing debug printing draw.rect does inside edge for bottomright pygame-14 January 29, 2002 everything bumped for the 1.4 release January 28, 2002 update SDL_rotozoom to 2.0.3 January 26, 2002 special cases for 90 degree transform.rotate() OSX cleanups for commandline (thanks Bob) added sprite.spritecollideany() January 23, 2002 transform.rotate() does alpha if image has alphaplane transform.rotate() no longer "off by one" in the x axis added CD.get_all() to get information for all tracks CD.play() can now take an option start and end time January 17, 2002 smarter importing code default pygame icon for window January 16, 2002 started implementing basic unit tests several bug cleanups with Rects (thx unit tests) January 14, 2002 display.update() boundaries fixed January 11, 2002 Surface.set_clip() can take None to clear the clipping January 7, 2002 fixed sprite.Group.has January 6, 2002 Merge with bob's inital MacOSX changes January 5, 2002 new and upgraded importing [BREAK?] fixed numberhandling in set_alpha and set_colorkey January 2, 2002 Group add/remove methods work December 31, 2001 pygame parachute does tracebacks with python2.2 December 20, 2001 Surface.set_alpha() and set_colorkey() accept None event.set_allowed() and set_blocked() accept None pygame-13 December 17, 2001 small preps for the full 1.3 release December 15, 2001 small changes to sprite before release December 2, 2001 small protection for display Surfaces after display.quit() December 1, 2001 made time.delay() more accurate [BREAK] created time.wait() to work like old delay() added time.Clock objects for framerate tracking November 26, 2001 Surface.convert() doesn't segfault before pygame.init() November 20, 2001 added pygame.sprite.Group.update() Surface.blit() protection for alpha->8bit relaxed November 19, 2001 fixed image.fromstring() for "RGBA" mode November 18, 2001 can stream python file-like objects to SDL threads November 15, 2001 cleanups for transform.rotate November 13, 2001 added sprite module November 12, 2001 image.tostring() "RGBA" works with colorkey November 3, 2001 filled shape drawing now clips properly [BUG] Rect object correctly compare (==,<,>) November 2, 2001 pygame.time.get_ticks() returns 0 before pygame.init() October 22, 2001 small fix for filled ellipses/circles September 27, 2001 drawing filled circles returns bounding rect ellipses and circles drawn inside given area mixer init can take chunksize fix in clipped horizontal line drawing [BUG] September 26, 2001 key.set_repeat() raises exception on error, smarter args September 22, 2001 added Rect.clamp_ip, for inplace clamping display.update(None) will update full screen September 21, 2001 Surface.convert() respects the SRCALPHA flag when passing depth pygame-12 September 1, 2001 fixed typo in pygame.cursor Aug 30, 2001 added VIDEOEXPOSE event Aug 29, 2001 changed initializations, to allow easier embedding Aug 28, 2001 added circle and rect convenciences to pygame.draw removed debug printing from draw.polygon Aug 25, 2001 added looping, scaling, and audio to for Movies Aug 15, 2001 added pygame.movie module with MPEG video playback July 31, 2001 fixed mixer.music refcount July 26, 2001 custom events work with event.peek() and event.get() added event.get_blocked() function to query blocked types July 23, 2001 music specifically halted when quitting (should not matter?) mixer.get_init() now returns the initialized playback format July 21, 2001 all events can be posted, not just USEREVENT subsurfaces inherit colorkey and alpha settings Jul 20, 2001 default font "finding" is smarter Jul 17, 2001 added polygon() and ellipse() to pygame.draw lines with width>2 are now correct (was one too small) Jul 16, 2001 can work with software surfaces before pygame.init() Surface.convert() now can take arguments like pygame.Surface() pygame.display.set_icon() sets the windowmanager icon Jul 15, 2001 fixed bad internal display reference counting [BUG] Jul 14, 2001 still makes clean-ish exit if segfault in exit handling Jul 10, 2001 image.tostring makes alpha from colorkey, if asking for RGBA Jul 6, 2001 added python 1.5.2 compatability June 25, 2001 horizontal transform.flip() was reading pixels off by one [BUG] June 24, 2001 calling set_mode will change all references to the display surface pygame-11 Jun 23, 2001 removed smooth underline font render protection Jun 19, 2001 fixed botched image.save() function Jun 15, 2001 new inplace Rect calls: move_ip, union_ip, etc Jun 11, 2001 smarter locking with subsurfaces added transform.rotozoom(), which uses builtin SDL_rotozoom May 31, 2001 correctly handle unicode filenames May 29, 2001 set display physical palette with display.set_palette() added transform module (with rotate and scale) May 26, 2001 code compiles with macos now May 23, 2001 fixed line drawing of width 1 draw.lines() was broken with sections outside clip May 22, 2001 added midleft, midright, midtop, and midbottom to Rect added Rect.unionall() function to union a list of Rects fixed problem in 16bit surfarrays new image.tostring() and image.fromstring() May 20, 2001 applied dave wallace's patch to fix memory freeing May 17, 2001 a few small compile time warning cleanups May 16, 2001 line drawing functions now use an optional width May 15, 2001 image module is now builtin, but formats are optional enhanced save function in image (handles opengl) Surface.save is now depracated May 14, 2001 smarter internal module handling fixed blit() (broken on May 9th change) May 10, 2001 USEREVENT events now pass through the queue Event() may be called with keyword args and/or a dict Font.render() won't render underlines while smoothing [BUG] May 9, 2001 8bit subsurfaces inherit their parents colormap blit keeps SDL from crashing with alpha onto 8bit Apr 30, 2001 loading Sounds from python objects now works [BUG] loading from python objects now thread safe [BUG] Apr 19, 2001 applied Niki Spahiev's memory leak patch in event.c removed minor memleak from each module's init Apr 18, 2001 added opengl support (with example) fixed display.get_init() current music is free'd when mixer is quit better thread sharing in various video calls fixed GCC compiler error in constants.c Apr 10, 2001 mixer now uses the requested sample format/size Apr 08, 2001 properly free SDL objects on malloc errors fixed rectangle cropping in pygame.display.update() pygame-10 Apr 05, 2001 Everything set for the 1.0 release Apr 04, 2001 cursors.load_xbm work on images without hotspots Apr 03, 2001 swapped endian-ness for pixels_alpha() Mar 29, 2001 fixed key.set_mods() (thanks rubysdl) rework setup scripts for 1.0 release relaxed sdl version checking Mar 21, 2001 initial support for compiling on mac fixed odd case with locking subsurfaces Mar 20, 2001 font and mixer now properly auto quit() Mar 19, 2001 Surfaces won't crash after display module is quit [BUG] Mar 18, 2001 friendlier type casting in surfarray (for some compilers) removed non-ANSI C code Mar 17, 2001 pygame.Surface is smarter with SRCALPHA flag fixed several small bugs in surfarray [BUG] new surfarray example and tutorial Mar 16, 2001 Fixed memory leak in Rect constructor Fixed improper exception in display.update(with_4_args) Feb 15, 2001 calling Sound.play() will make sure the channel that gets selected has volume set to full Feb 14, 2001 fixed Surface.set_colorkey() with no args [BUG] Feb 13, 2001 fixed return rect from line drawing routines small fix when drawing horizontal lines pygame-09 Feb 12, 2001 added NOFRAME to pygame.constants Feb 11, 2001 workaround python parsing error for pygame.time.delay(-1) Feb 9, 2001 setting rectangle width/height/size changes the right/bottom edges (instead of top/right) [BREAK] Feb 6, 2001 fixed the music unpause() function Jan 31, 2001 functions taking RGBA colors can also accept mapped ints Jan 30, 2001 added draw.lines() Jan 29, 2001 extremely revamped surface locking mechnisms new Surface.subsurface for shared surfaces Jan 25, 2001 added the draw module, with clipped line function added alpha routines in surfarray module more locking checks for surfarray make extra sure all of SDL is shutdown properly Jan 24, 2001 funcs that need locked surfaces will temporarily lock them (Surface.set_at, Surface.get_at, surfarray.arrayXd) Jan 23, 2001 display.update() no longer effects input Rects [BREAK] Surface.fill() no longer effects input Rect [BREAK] small memory leak in display.update() fixed Jan 18, 2001 cursor.read_xbm() renamed to cursor.load_xbm() [BREAK] Jan 17, 2001 documentation updated to include python modules too Jan 16, 2001 cursors module beefed up Jan 15, 2001 fix Surface.get_at() for 24bit surfaces endian cleanups for surfarray Jan 8, 2001 more warning cleanups music-finished callback fixed replaces SDL's parachute with smarter python version Jan 6, 2001 added pygame.version module pygame-05 Jan 6, 2001 Final cleanups for the new release Jan 4, 2001 Surface.blit() allows for rects as dest position surfarray cleanups and improvements Dec 22, 2000 timer threads properly shutdown Dec 14, 2000 display.set_mode pretending shorts are ints [BUG] pygame-04 Dec 14, 2000 music module had incorrect names for volume functions chimp example and full tutorial added Dec 13, 2000 display.update() is entirely better in many ways [BUG] Dec 3, 2000 fixed timing issues. negative time.delay() will become 0 Nov 30, 2000 UserRect module added all objects now have a matching type; SurfaceType, etc Nov 29, 2000 joystick module rewrite finished [BREAK] cdrom module rewrite finished [BREAK] all constructors using capitalized function names [BREAK] (Rect, pygame.Surface, pygame.font.Font, etc) Nov 28, 2000 Surface.convert() better handles surface flags All color arguments (and returns) are RGBA format [BREAK] Removed Surface.map_rgba and unmap_rgba [BREAK] Added a default font, used by passing None as font file pygame-03 Nov 20, 2000 Added Surface.save() to create BMPs. Nov 16, 2000 Surface.set_clip() fixed when passing no args [BUG] Nov 15, 2000 time.set_timer() now handles multiple timers rect(), surface(), event() renamed to \ new_rect, new_surface(), new_event() [BREAK] all new_XX() functions were added to pygame.locals Moved pygame.music to a member of pygame.mixer [BREAK] Surface.blit takes a source rectangle instead of pos, size [BREAK] pygame.display.set_clip() correctly accepts rectstyle arg [BUG] Added Surface.get_flags() and Surface.get_pitch() Added set_cursor and get_cursor to pygame.mouse New module, pygame.cursors, contains sample cursors Nov 14, 2000 Release the Python Global Interpreter Lock on delays and IO Added timer events to pygame.time (check vgrade example) New music playback finished events surfarray.blit_array() supports all bit depths Nov 11, 2000 pygame.display.set_mode() uses int, not short, for size [BUG] Nov 10, 2000 Committed to CVS Added pygame.display.get_driver() pygame-1.9.1release/setup_win_common.py0000644000175000017500000000203211112371675020203 0ustar vincentvincent# -*- encoding: utf-8 -*- # module setup_win_common.py """A module for reading the information common to all Windows setups. Exports read and get_definitions. """ path = 'Setup_Win_Common.in' class Definition(object): def __init__(self, name, value): self.name = name self.value = value def read(): """Return the contents of the Windows Common Setup as a string""" setup_in = open(path) try: return setup_in.read() finally: setup_in.close() def get_definitions(): """Return a list of definitions in the Windows Common Setup Each macro definition object has a 'name' and 'value' attribute. """ import re setup_in = open(path) try: deps = [] match = re.compile(r'([a-zA-Z0-9_]+) += +(.+)$').match for line in setup_in: m = match(line) if m is not None: deps.append(Definition(m.group(1), m.group(2))) return deps finally: setup_in.close() __all__= ['read', 'get_dependencies'] pygame-1.9.1release/Setup_Win_Common.in0000644000175000017500000000010611112371675020021 0ustar vincentvincent# Windows specific flags for Pygame modules. SCRAP = -luser32 -lgdi32 pygame-1.9.1release/Setup_Darwin.in0000644000175000017500000000015011136037612017173 0ustar vincentvincent#This file defines platform specific modules for mac os x sdlmain_osx src/sdlmain_osx.m $(SDL) $(DEBUG) pygame-1.9.1release/setup.py0000644000175000017500000004667411236512106015773 0ustar vincentvincent#!/usr/bin/env python # # This is the distutils setup script for pygame. # Full instructions are in "install.txt" or "install.html" # # To configure, compile, install, just run this script. DESCRIPTION = """Pygame is a Python wrapper module for the SDL multimedia library. It contains python functions and classes that will allow you to use SDL's support for playing cdroms, audio and video output, and keyboard, mouse and joystick input.""" EXTRAS = {} METADATA = { "name": "pygame", "version": "1.9.1release", "license": "LGPL", "url": "http://www.pygame.org", "author": "Pete Shinners, Rene Dudfield, Marcus von Appen, Bob Pendleton, others...", "author_email": "pygame@seul.org", "description": "Python Game Development", "long_description": DESCRIPTION, } import sys if "bdist_msi" in sys.argv: # hack the version name to a format msi doesn't have trouble with METADATA["version"] = METADATA["version"].replace("pre", "a0") METADATA["version"] = METADATA["version"].replace("rc", "b0") METADATA["version"] = METADATA["version"].replace("release", "") if not hasattr(sys, 'version_info') or sys.version_info < (2,3): raise SystemExit("Pygame requires Python version 2.3 or above.") #get us to the correct directory import os, sys path = os.path.split(os.path.abspath(sys.argv[0]))[0] os.chdir(path) #os.environ["CFLAGS"] = "-W -Wall -Wpointer-arith -Wcast-qual -Winline " + \ # "-Wcast-align -Wconversion -Wstrict-prototypes " + \ # "-Wmissing-prototypes -Wmissing-declarations " + \ # "-Wnested-externs -Wshadow -Wredundant-decls" if "-warnings" in sys.argv: os.environ["CFLAGS"] = "-W -Wimplicit-int " + \ "-Wimplicit-function-declaration " + \ "-Wimplicit -Wmain -Wreturn-type -Wunused -Wswitch " + \ "-Wcomment -Wtrigraphs -Wformat -Wchar-subscripts " + \ "-Wuninitialized -Wparentheses " +\ "-Wpointer-arith -Wcast-qual -Winline -Wcast-align " + \ "-Wconversion -Wstrict-prototypes " + \ "-Wmissing-prototypes -Wmissing-declarations " + \ "-Wnested-externs -Wshadow -Wredundant-decls" sys.argv.remove ("-warnings") import os.path, glob, stat import distutils.sysconfig from distutils.core import setup, Extension, Command from distutils.extension import read_setup_file from distutils.command.install_data import install_data # Python 3.0 patch if sys.version_info[0:2] == (3, 0): import distutils.version def _cmp(x, y): try: if x < y: return -1 elif x == y: return 0 return 1 except TypeError: return NotImplemented distutils.version.cmp = _cmp del _cmp def add_datafiles(data_files, dest_dir, pattern): """Add directory structures to data files according to a pattern""" src_dir, elements = pattern def do_directory(root_dest_path, root_src_path, elements): files = [] for e in elements: if isinstance(e, list): src_dir, elems = e dest_path = '/'.join([root_dest_path, src_dir]) src_path = os.path.join(root_src_path, src_dir) do_directory(dest_path, src_path, elems) else: files.extend(glob.glob(os.path.join(root_src_path, e))) if files: data_files.append((root_dest_path, files)) do_directory(dest_dir, src_dir, elements) # allow optionally using setuptools for bdist_egg. if "-setuptools" in sys.argv: from setuptools import setup, find_packages sys.argv.remove ("-setuptools") # NOTE: the bdist_mpkg_support is for darwin. try: import bdist_mpkg_support from setuptools import setup, Extension except ImportError: pass else: EXTRAS.update({ 'options': bdist_mpkg_support.options, 'setup_requires': ['bdist_mpkg>=0.4.2'], #'install_requires': ['pyobjc'], #'dependency_links': ['http://rene.f0o.com/~rene/stuff/macosx/'] }) #headers to install headers = glob.glob(os.path.join('src', '*.h')) headers.remove(os.path.join('src', 'numeric_arrayobject.h')) headers.remove(os.path.join('src', 'scale.h')) #sanity check for any arguments if len(sys.argv) == 1: reply = raw_input('\nNo Arguments Given, Perform Default Install? [Y/n]') if not reply or reply[0].lower() != 'n': sys.argv.append('install') #make sure there is a Setup file if not os.path.isfile('Setup'): print ('\n\nWARNING, No "Setup" File Exists, Running "config.py"') import config config.main() print ('\nContinuing With "setup.py"') try: s_mtime = os.stat("Setup")[stat.ST_MTIME] sin_mtime = os.stat("Setup.in")[stat.ST_MTIME] if sin_mtime > s_mtime: print ('\n\nWARNING, "Setup.in" newer than "Setup",' 'you might need to modify "Setup".') except: pass # get compile info for all extensions try: extensions = read_setup_file('Setup') except: print ("""Error with the "Setup" file, perhaps make a clean copy from "Setup.in".""") raise #python 3.x: remove modules not yet ported if sys.version_info >= (3, 0, 0): python3_skip = ['scrap', '_camera', '_numericsurfarray', '_numericsndarray', ] tmp_extensions = extensions extensions = [] for e in tmp_extensions: if e.name in python3_skip: print ("Skipping module %s for Python %s build." % (e.name, sys.version)) else: extensions.append(e) del tmp_extensions #extra files to install data_path = os.path.join(distutils.sysconfig.get_python_lib(), 'pygame') pygame_data_files = [] data_files = [('pygame', pygame_data_files)] #add files in distribution directory pygame_data_files.append('LGPL') pygame_data_files.append('readme.html') pygame_data_files.append('install.html') #add non .py files in lib directory for f in glob.glob(os.path.join('lib', '*')): if not f[-3:] == '.py' and not f[-4:] == '.doc' and os.path.isfile(f): pygame_data_files.append(f) #tests/fixtures add_datafiles(data_files, 'pygame/tests', ['test', [['fixtures', [['xbm_cursors', ['*.xbm']]]]]]) #examples add_datafiles(data_files, 'pygame/examples', ['examples', ['readme.txt', ['data', ['*']], ['macosx', ['*.py', ['aliens_app_example', ['*.py', 'README.txt', ['English.lproj', ['aliens.icns', ['MainMenu.nib', ['*']]]]]]]]]]) #docs add_datafiles(data_files, 'pygame/docs', ['docs', ['*.html', '*.gif', ['ref', ['*.html']], ['tut', ['*.html', ['chimp', ['*.html', '*.gif']], ['intro', ['*.html', '*.gif', '*.jpg']], ['surfarray', ['*.html', '*.jpg']], ['tom', ['*.html', '*.png']]]]]]) #required. This will be filled if doing a Windows build. cmdclass = {} #try to find DLLs and copy them too (only on windows) if sys.platform == 'win32': from distutils.command.build_ext import build_ext # mingw32distutils is optional. But we need the mingw32 compiler(s). try: # Allow the choice between Win32 GUI and console DLLs. import mingw32distutils except ImportError: mingw32_compilers = ['ming32'] else: mingw32_compilers = mingw32distutils.compilers if sys.version_info < (2, 4): try: import config # a separate method for finding dlls with mingw. if config.is_msys_mingw(): # fix up the paths for msys compiling. import distutils_mods distutils.cygwinccompiler.Mingw32 = distutils_mods.mingcomp except ImportError: pass #add dependency DLLs to the project lib_dependencies = {} for e in extensions: if e.name.startswith('COPYLIB_'): lib_dependencies[e.name[8:]] = e.libraries def dependencies(roots): """Return a set of dependencies for the list of library file roots The return set is a dictionary keyed on library root name with values of 1. """ root_set = {} for root in roots: try: deps = lib_dependencies[root] except KeyError: pass else: root_set[root] = 1 root_set.update(dependencies(deps)) return root_set the_dlls = {} required_dlls = {} for e in extensions: if e.name.startswith('COPYLIB_'): the_dlls[e.name[8:]] = e.library_dirs[0] else: required_dlls.update(dependencies(e.libraries)) # join the required_dlls and the_dlls keys together. lib_names = {} for lib in list(required_dlls.keys()) + list(the_dlls.keys()): lib_names[lib] = 1 for lib in lib_names.keys(): #next DLL; a distutils bug requires the paths to have Windows separators f = the_dlls[lib].replace('/', os.sep) if f == '_': print ("WARNING, DLL for %s library not found." % lib) else: pygame_data_files.append(f) class WinBuildExt(build_ext): """This build_ext sets necessary environment variables for MinGW""" # __sdl_lib_dir is possible location of msvcrt replacement import # libraries, if they exist. Pygame module base only links to SDL so # should have the SDL library directory as its only -L option. for e in extensions: if e.name == 'base': __sdl_lib_dir = e.library_dirs[0].replace('/', os.sep) break def run(self): """Extended to set MINGW_ROOT_DIRECTORY, PATH and LIBRARY_PATH""" if self.compiler in mingw32_compilers: # Add MinGW environment variables. if 'MINGW_ROOT_DIRECTORY' not in os.environ: # Use MinGW setup conifiguration file if present. import mingwcfg try: mingw_root = mingwcfg.read() except IOError: raise RuntimeError( "mingw32: required environment variable" " MINGW_ROOT_DIRECTORY not set") os.environ['MINGW_ROOT_DIRECTORY'] = mingw_root path = os.environ['PATH'] os.environ['PATH'] = ';'.join([os.path.join(mingw_root, 'bin'), path]) if sys.version_info >= (2, 6): # The Visual Studio 2008 C library is msvcr90.dll. c_runtime_path = os.path.join(self.__sdl_lib_dir, 'msvcr90') elif sys.version_info >= (2, 4): # The Visual Studio 2003 C library is msvcr71.dll. c_runtime_path = os.path.join(self.__sdl_lib_dir, 'msvcr71') else: # The Visual Studio 6.0 C library is msvcrt.dll, # the MinGW default. c_runtime_path = '' if c_runtime_path and os.path.isdir(c_runtime_path): # Override the default msvcrt.dll linkage. os.environ['LIBRARY_PATH'] = c_runtime_path elif not (c_runtime_path or glob.glob(os.path.join(self.__sdl_lib_dir, 'msvcr*'))): pass else: raise RuntimeError("The dependencies are linked to" " the wrong C runtime for" " Python %i.%i" % sys.version_info[:2]) build_ext.run(self) cmdclass['build_ext'] = WinBuildExt # Add the precompiled smooth scale MMX functions to transform. def replace_scale_mmx(): for e in extensions: if e.name == 'transform': e.extra_objects.append( os.path.join('obj', 'win32', 'scale_mmx.obj')) for i in range(len(e.sources)): if e.sources[i].endswith('scale_mmx.c'): del e.sources[i] return replace_scale_mmx() #clean up the list of extensions for e in extensions[:]: if e.name.startswith('COPYLIB_'): extensions.remove(e) #don't compile the COPYLIBs, just clean them else: e.name = 'pygame.' + e.name #prepend package name on modules #data installer with improved intelligence over distutils #data files are copied into the project directory instead #of willy-nilly class smart_install_data(install_data): def run(self): #need to change self.install_dir to the actual library dir install_cmd = self.get_finalized_command('install') self.install_dir = getattr(install_cmd, 'install_lib') return install_data.run(self) cmdclass['install_data'] = smart_install_data if "bdist_msi" in sys.argv: # if you are making an msi, we want it to overwrite files from distutils.command import bdist_msi import msilib class bdist_msi_overwrite_on_install(bdist_msi.bdist_msi): def run(self): bdist_msi.bdist_msi.run(self) # Remove obsolete files. comp = "pygame1" # Pygame component prop = comp # Directory property records = [("surfarray.pyd", comp, "SURFAR~1.PYD|surfarray.pyd", prop, 1), ("sndarray.pyd", comp, "SNDARRAY.PYD|sndarray.pyd", prop, 1), ("camera.pyd", comp, "CAMERA.PYD|camera.pyd", prop, 1), ("color.py", comp, "COLOR.PY|color.py", prop, 1), ("color.pyc", comp, "COLOR.PYC|color.pyc", prop, 1), ("color.pyo", comp, "COLOR.PYO|color.pyo", prop, 1)] msilib.add_data(self.db, "RemoveFile", records) # Overwrite outdated files. fullname = self.distribution.get_fullname() installer_name = self.get_installer_filename(fullname) print ("changing %s to overwrite files on install" % installer_name) msilib.add_data(self.db, "Property", [("REINSTALLMODE", "amus")]) self.db.Commit() cmdclass['bdist_msi'] = bdist_msi_overwrite_on_install # test command. For doing 'python setup.py test' class TestCommand(Command): user_options = [ ] def initialize_options(self): self._dir = os.getcwd() def finalize_options(self): pass def run(self): ''' runs the tests with default options. ''' import subprocess return subprocess.call([sys.executable, "run_tests.py"]) cmdclass['test'] = TestCommand # Prune empty file lists. date_files = [(path, files) for path, files in data_files if files] #finally, #call distutils with all needed info PACKAGEDATA = { "cmdclass": cmdclass, "packages": ['pygame', 'pygame.gp2x', 'pygame.threads', 'pygame.tests', 'pygame.tests.test_utils', 'pygame.tests.run_tests__tests', 'pygame.tests.run_tests__tests.all_ok', 'pygame.tests.run_tests__tests.failures1', 'pygame.tests.run_tests__tests.incomplete', 'pygame.tests.run_tests__tests.infinite_loop', 'pygame.tests.run_tests__tests.print_stderr', 'pygame.tests.run_tests__tests.print_stdout', 'pygame.tests.run_tests__tests.incomplete_todo', 'pygame.tests.run_tests__tests.exclude', 'pygame.tests.run_tests__tests.timeout', 'pygame.tests.run_tests__tests.everything', 'pygame.docs', 'pygame.examples'], "package_dir": {'pygame': 'lib', 'pygame.threads': 'lib/threads', 'pygame.gp2x': 'lib/gp2x', 'pygame.tests': 'test', 'pygame.docs': 'docs', 'pygame.examples': 'examples'}, "headers": headers, "ext_modules": extensions, "data_files": data_files, } PACKAGEDATA.update(METADATA) PACKAGEDATA.update(EXTRAS) setup(**PACKAGEDATA) def remove_old_files(): # try and figure out where we are installed. #pygame could be installed in a weird location because of # setuptools or something else. The only sane way seems to be by trying # first to import it, and see where the imported one is. # # Otherwise we might delete some files from another installation. try: import pygame.base use_pygame = 1 except: use_pygame = 0 if use_pygame: install_path= os.path.split(pygame.base.__file__)[0] extension_ext = os.path.splitext(pygame.base.__file__)[1] else: if not os.path.exists(data_path): return install_path = data_path base_file = glob.glob(os.path.join(data_path, "base*")) if not base_file: return extension_ext = os.path.splitext(base_file[0])[1] # here are the .so/.pyd files we need to ask to remove. ext_to_remove = ["camera"] # here are the .py/.pyo/.pyc files we need to ask to remove. py_to_remove = ["color"] os.path.join(data_path, 'color.py') if os.name == "e32": # Don't warn on Symbian. The color.py is used as a wrapper. py_to_remove = [] # See if any of the files are there. extension_files = ["%s%s" % (x, extension_ext) for x in ext_to_remove] py_files = ["%s%s" % (x, py_ext) for py_ext in [".py", ".pyc", ".pyo"] for x in py_to_remove] files = py_files + extension_files unwanted_files = [] for f in files: unwanted_files.append( os.path.join( install_path, f ) ) ask_remove = [] for f in unwanted_files: if os.path.exists(f): ask_remove.append(f) for f in ask_remove: try: print("trying to remove old file :%s: ..." %f) os.remove(f) print("Successfully removed :%s:." % f) except: print("FAILED to remove old file :%s:" % f) if "install" in sys.argv: # remove some old files. # only call after a successful install. Should only reach here if there is # a successful install... otherwise setup() raises an error. try: remove_old_files() except: pass pygame-1.9.1release/Setup.in0000644000175000017500000000511011223035224015662 0ustar vincentvincent#This Setup file is used by the setup.py script to configure the #python extensions. You will likely use the "config.py" which will #build a correct Setup file for you based on your system settings. #If not, the format is simple enough to edit by hand. First change #the needed commandline flags for each dependency, then comment out #any unavailable optional modules in the first optional section. #--StartConfig SDL = -I/usr/include/SDL -D_REENTRANT -lSDL FONT = -lSDL_ttf IMAGE = -lSDL_image MIXER = -lSDL_mixer SMPEG = -lsmpeg PNG = -lpng JPEG = -ljpeg SCRAP = -lX11 PORTMIDI = -lportmidi PORTTIME = -lporttime #--EndConfig #DEBUG = -C-W -C-Wall DEBUG = #the following modules are optional. you will want to compile #everything you can, but you can ignore ones you don't have #dependencies for, just comment them out imageext src/imageext.c $(SDL) $(IMAGE) $(PNG) $(JPEG) $(DEBUG) font src/font.c $(SDL) $(FONT) $(DEBUG) mixer src/mixer.c $(SDL) $(MIXER) $(DEBUG) mixer_music src/music.c $(SDL) $(MIXER) $(DEBUG) _numericsurfarray src/_numericsurfarray.c $(SDL) $(DEBUG) _numericsndarray src/_numericsndarray.c $(SDL) $(MIXER) $(DEBUG) movie src/movie.c $(SDL) $(SMPEG) $(DEBUG) scrap src/scrap.c $(SDL) $(SCRAP) $(DEBUG) _camera src/_camera.c src/camera_v4l2.c src/camera_v4l.c $(SDL) $(DEBUG) pypm src/pypm.c $(SDL) $(PORTMIDI) $(PORTTIME) $(DEBUG) GFX = src/SDL_gfx/SDL_gfxPrimitives.c #GFX = src/SDL_gfx/SDL_gfxBlitFunc.c src/SDL_gfx/SDL_gfxPrimitives.c gfxdraw src/gfxdraw.c $(SDL) $(GFX) $(DEBUG) #these modules are required for pygame to run. they only require #SDL as a dependency. these should not be altered base src/base.c $(SDL) $(DEBUG) cdrom src/cdrom.c $(SDL) $(DEBUG) color src/color.c $(SDL) $(DEBUG) constants src/constants.c $(SDL) $(DEBUG) display src/display.c $(SDL) $(DEBUG) event src/event.c $(SDL) $(DEBUG) fastevent src/fastevent.c src/fastevents.c $(SDL) $(DEBUG) key src/key.c $(SDL) $(DEBUG) mouse src/mouse.c $(SDL) $(DEBUG) rect src/rect.c $(SDL) $(DEBUG) rwobject src/rwobject.c $(SDL) $(DEBUG) surface src/surface.c src/alphablit.c src/surface_fill.c $(SDL) $(DEBUG) surflock src/surflock.c $(SDL) $(DEBUG) time src/time.c $(SDL) $(DEBUG) joystick src/joystick.c $(SDL) $(DEBUG) draw src/draw.c $(SDL) $(DEBUG) image src/image.c $(SDL) $(DEBUG) overlay src/overlay.c $(SDL) $(DEBUG) transform src/transform.c src/rotozoom.c src/scale2x.c src/scale_mmx.c $(SDL) $(DEBUG) -D_NO_MMX_FOR_X86_64 mask src/mask.c src/bitmask.c $(SDL) $(DEBUG) bufferproxy src/bufferproxy.c $(SDL) $(DEBUG) pixelarray src/pixelarray.c $(SDL) $(DEBUG) _arraysurfarray src/_arraysurfarray.c $(SDL) $(DEBUG) pygame-1.9.1release/setup.cfg0000644000175000017500000000007311236514371016067 0ustar vincentvincent[egg_info] tag_build = tag_date = 0 tag_svn_revision = 0 pygame-1.9.1release/run_tests.py0000644000175000017500000000024511205061230016632 0ustar vincentvincent#!/usr/bin/env python """Run one or more Pygame unittest modules in the test directory For command line options use the --help option. """ import test.__main__ pygame-1.9.1release/README.txt0000644000175000017500000001320611236512106015740 0ustar vincentvincent Pygame Readme Version 1.9.1release Python Game Development Originally by Pete Shinners, now an open source community project. http://www.pygame.org pygame@seul.org About Pygame is a cross-platfrom library designed to make it easy to write multimedia software, such as games, in Python. Pygame requires the Python language and SDL multimedia library. It can also make use of several other popular libraries. Installation You should definitely begin by installing a binary package for your system. The binary packages usually come with or give the information needed for dependencies. Choose an appropriate installer for your system and version of python from the pygame downloads page. http://www.pygame.org/download.shtml Installing from source is fairly automated. The most work will involve compiling and installing all the pygame dependencies. Once that is done run the "setup.py" script which will attempt to auto-configure, build, and install pygame. Much more information about installing and compiling is available in the install.html file. Help If you are just getting started with pygame, you should be able to get started fairly quickly. Pygame comes with many tutorials and introductions. There is also full reference documentation for the entire library. Browse the documentation from the documenantation index. docs/index.html. On the pygame website, there is also an online copy of this documentation. You should know that the online documentation stays up to date with the development version of pygame in svn. This may be a bit newer than the version of pygame you are using. Best of all the examples directory has many playable small programs which can get started playing with the code right away. Credits Thanks to everyone who has helped contribute to this library. Special thanks are also in order. Marcus Von Appen - many changes, and fixes, 1.7.1+ freebsd maintainer. Lenard Lindstrom - the 1.8+ windows maintainer, many changes, and fixes. Brian Fisher - for svn auto builder, bug tracker and many contributions. Rene Dudfield - many changes, and fixes, 1.7+ release manager/maintainer. Phil Hassey - for his work on the pygame.org website. DR0ID for his work on the sprite module. Richard Goedeken for his smoothscale function. Ulf Ekström for his pixel perfect collision detection code. Pete Shinners - orginal author. David Clark - for filling the right-hand-man position Ed Boraas and Francis Irving - Debian packages Maxim Sobolev - FreeBSD packaging Bob Ippolito - MacOS and OS X porting (much work!) Jan Ekhol, Ray Kelm, and Peter Nicolai - putting up with my early design ideas Nat Pryce for starting our unit tests Dan Richter for documentation work TheCorruptor for his incredible logos and graphics Nicholas Dudfield - many test improvements. Alex Folkner - for pygame-ctypes Thanks to those sending in patches and fixes: Niki Spahiev, Gordon Tyler, Nathaniel Pryce, Dave Wallace, John Popplewell, Michael Urman, Andrew Straw, Michael Hudson, Ole Martin Bjoerndalen, Hervé Cauwelier, James Mazer, Lalo Martins, Timothy Stranex, Chad Lester, Matthias Spiller, Bo Jangeborg, Dmitry Borisov, Campbell Barton, Diego Essaya, Eyal Lotem, Regis Desgroppes, Emmanuel Hainry, Randy Kaelber Matthew L Daniel, Nirav Patel, Forrest Voight, Charlie Nolan, Frankie Robertson, John Krukoff, Lorenz Quack, Nick Irvine, Michael George, Saul Spatz, Thomas Ibbotson, Tom Rothamel, Evan Kroske, Cambell Barton. And our bug hunters above and beyond: Angus, Guillaume Proux, Frank Raiser, Austin Henry, Kaweh Kazemi, Arturo Aldama, Mike Mulcheck, Michael Benfield, David Lau There's many more folks out there who've submitted helpful ideas, kept this project going, and basically made my life easer, Thanks! Many thank you's for people making documentation comments, and adding to the pygame.org wiki. Also many thanks for people creating games and putting them on the pygame.org website for others to learn from and enjoy. Lots of thanks to James Paige for hosting the pygame bugzilla. Also a big thanks to Roger Dingledine and the crew at SEUL.ORG for our excellent hosting. Dependencies Pygame is obviously strongly dependent on SDL and Python. It also links to and embeds several other smaller libraries. The font module relies on SDL_tff, which is dependent on freetype. The mixer (and mixer.music) modules depend on SDL_mixer. The image module depends on SDL_image, which also can use libjpeg and libpng. The transform module has an embedded version of SDL_rotozoom for its own rotozoom function. The surfarray module requires the python Numeric package for its multidimensional numeric arrays. Todo / Ideas (feel free to submit) http://www.pygame.org/wiki/todo/ License This library is distributed under GNU LGPL version 2.1, which can be found in the file "doc/LGPL". I reserve the right to place future versions of this library under a different license. http://www.gnu.org/copyleft/lesser.html This basically means you can use pygame in any project you want, but if you make any changes or additions to pygame itself, those must be released with a compatible license. (preferably submitted back to the pygame project). Closed source and commercial games are fine. The programs in the "examples" subdirectory are in the public domain. pygame-1.9.1release/readme.html0000644000175000017500000001515311236512106016370 0ustar vincentvincentPygame Readme
Pygame Readme
Version 1.9.1release Python Game Development
originally by Pete Shinners, now an open source community project.
http://www.pygame.org
pete@shinners.org


About

Pygame is a cross-platfrom library designed to make it easy to write multimedia software, such as games, in Python. Pygame requires the Python language and SDL multimedia library. It can also make use of several other popular libraries.


Installation

You should definitely begin by installing a binary package for your system. The binary packages usually come with or give the information needed for dependencies. Choose an appropriate installer for your system and version of python from the pygame downloads page. http://www.pygame.org/download.shtml

Installing from source is fairly automated. The most work will involve compiling and installing all the pygame dependencies. Once that is done run the "setup.py" script which will attempt to auto-configure, build, and install pygame.

Much more information about installing and compiling is available in the install.html file.


Help

If you are just getting started with pygame, you should be able to get started fairly quickly. Pygame comes with many tutorials and introductions. There is also full reference documentation for the entire library. Browse the documentation from the documenantation index. docs/index.html.

On the pygame website, there is also an online copy of this documentation. You should know that the online documentation stays up to date with the development version of pygame in svn. This may be a bit newer than the version of pygame you are using.

Best of all the examples directory has many playable small programs which can get started playing with the code right away.


Credits

Thanks to everyone who has helped contribute to this library. Special thanks are also in order.

  • Marcus Von Appen - many changes, and fixes, 1.7.1+ freebsd maintainer.
  • Lenard Lindstrom - the 1.8+ windows maintainer, many changes, and fixes.
  • Brian Fisher - for svn auto builder, bug tracker and many contributions.
  • Rene Dudfield - many changes, and fixes, 1.7+ release manager/maintainer.
  • Phil Hassey - for his work on the pygame.org website.
  • DR0ID for his work on the sprite module.
  • Richard Goedeken for his smoothscale function.
  • Ulf Ekström for his pixel perfect collision detection code.
  • Pete Shinners - orginal author.
  • David Clark - for filling the right-hand-man position
  • Ed Boraas and Francis Irving - Debian packages
  • Maxim Sobolev - FreeBSD packaging
  • Bob Ippolito - MacOS and OS X porting (much work!)
  • Jan Ekhol, Ray Kelm, and Peter Nicolai - putting up with my early design ideas
  • Nat Pryce for starting our unit tests
  • Dan Richter for documentation work
  • TheCorruptor for his incredible logos and graphics
  • Nicholas Dudfield - many test improvements.
  • Alex Folkner - for pygame-ctypes
  • Thanks to those sending in patches and fixes: Niki Spahiev, Gordon Tyler, Nathaniel Pryce, Dave Wallace, John Popplewell, Michael Urman, Andrew Straw, Michael Hudson, Ole Martin Bjoerndalen, Hervé Cauwelier, James Mazer, Lalo Martins, Timothy Stranex, Chad Lester, Matthias Spiller, Bo Jangeborg, Dmitry Borisov, Campbell Barton, Diego Essaya, Eyal Lotem, Regis Desgroppes, Emmanuel Hainry, Randy Kaelber Matthew L Daniel, Nirav Patel, Forrest Voight, Charlie Nolan, Frankie Robertson, John Krukoff, Lorenz Quack, Nick Irvine, Michael George, Saul Spatz, Thomas Ibbotson, Tom Rothamel, Evan Kroske, Cambell Barton.
  • And our bug hunters above and beyond: Angus, Guillaume Proux, Frank Raiser, Austin Henry, Kaweh Kazemi, Arturo Aldama, Mike Mulcheck, Rene Dudfield, Michael Benfield, David Lau
  • There's many more folks out there who've submitted helpful ideas, kept this project going, and basically made my life easer, Thanks!

    Many thank you's for people making documentation comments, and adding to the pygame.org wiki.

    Also many thanks for people creating games and putting them on the pygame.org website for others to learn from and enjoy.

    Lots of thanks to James Paige for hosting the pygame bugzilla.

    Also a big thanks to Roger Dingledine and the crew at SEUL.ORG for our excellent hosting.


    Dependencies

    Pygame is obviously strongly dependent on SDL and Python. It also links to and embeds several other smaller libraries. The font module relies on SDL_tff, which is dependent on freetype. The mixer (and mixer.music) modules depend on SDL_mixer. The image module depends on SDL_image, which also can use libjpeg and libpng. The transform module has an embedded version of SDL_rotozoom for its own rotozoom function. The surfarray module requires the python Numeric package for its multidimensional numeric arrays.


    Todo / Ideas (feel free to submit)
    http://www.pygame.org/wiki/todo/


    License

    This library is distributed under GNU LGPL version 2.1, which can be found in the file "doc/LGPL". I reserve the right to place future versions of this library under a different license. http://www.gnu.org/copyleft/lesser.html

    This basically means you can use pygame in any project you want, but if you make any changes or additions to pygame itself, those must be released with a compatible license. (preferably submitted back to the pygame project). Closed source and commercial games are fine.

    The programs in the "examples" subdirectory are in the public domain.


    pygame-1.9.1release/PKG-INFO0000644000175000017500000000102711236514371015343 0ustar vincentvincentMetadata-Version: 1.0 Name: pygame Version: 1.9.1release Summary: Python Game Development Home-page: http://www.pygame.org Author: Pete Shinners, Rene Dudfield, Marcus von Appen, Bob Pendleton, others... Author-email: pygame@seul.org License: LGPL Description: Pygame is a Python wrapper module for the SDL multimedia library. It contains python functions and classes that will allow you to use SDL's support for playing cdroms, audio and video output, and keyboard, mouse and joystick input. Platform: UNKNOWN pygame-1.9.1release/msysio.py0000644000175000017500000000250611207055754016151 0ustar vincentvincent# module msysio.py # Requires Python 2.2 or better. """Provide helpful routines for interactive IO on the MSYS console""" # Output needs to be flushed to be seen. It is especially important # when prompting for user input. import sys import os __all__ = ['raw_input_', 'print_', 'is_msys'] # 2.x/3.x compatibility stuff try: raw_input except NameError: raw_input = input # Exported functions __all__ = ['raw_input_', 'print_', 'is_msys'] # 2.x/3.x compatibility stuff try: raw_input except NameError: raw_input = input # Exported functions def raw_input_(prompt=None): """Prompt for user input in an MSYS console friendly way""" if prompt is None: prompt = '' print_(prompt, end='') return raw_input() def print_(*args, **kwds): """Print arguments in an MSYS console friendly way Keyword arguments: file, sep, end """ stream = kwds.get('file', sys.stdout) sep = kwds.get('sep', ' ') end = kwds.get('end', '\n') if args: stream.write(sep.join([str(arg) for arg in args])) if end: stream.write(end) try: stream.flush() except AttributeError: pass def is_msys(): """Return true if the execution environment is MSYS""" try: return os.environ['OSTYPE'] == 'msys' except KeyError: return False pygame-1.9.1release/msys_link_VC_2008_dlls.py0000644000175000017500000010574011130022066020702 0ustar vincentvincent#!/usr/bin/env python # -*- coding: ascii -*- # Program msys_link_VC_2008_dlls.py # Requires Python 2.4 or later and win32api. """Link dependency DLLs against the Visual C 2008 run-time using MinGW and MSYS Configured for Pygame 1.8 and Python 2.6 and up. By default the DLLs and export libraries are installed in directory ./lib_VC_2008. msys_build_deps.py must run first to build the static libaries. This program can be run from a Windows cmd.exe or MSYS terminal. The recognized, and optional, environment variables are: SHELL - MSYS shell program path - already defined in the MSYS terminal LDFLAGS - linker options - prepended to flags set by the program LIBRARY_PATH - library directory paths - appended to those used by this program To get a list of command line options run python build_deps.py --help This program has been tested against the following libraries: SDL 1.2 (.13) revision 4114 from SVN SDL_image 1.2.6 SDL_mixer 1.2 (.8) revision 3942 from SVN SDL_ttf 2.0.9 smpeg revision 370 from SVN freetype 2.3.7 libogg 1.1.3 libvorbis 1.2.0 FLAC 1.2.1 tiff 3.8.2 libpng 1.2.32 jpeg 6b zlib 1.2.3 The build environment used: gcc-core-3.4.5 binutils-2.17.50 mingwrt-3.15.1 win32api-3.12 pexports 0.43 MSYS-1.0.10 Builds have been performed on Windows 98 and XP. Build issues: For pre-2007 computers: MSYS bug "[ 1170716 ] executing a shell scripts gives a memory leak" (http://sourceforge.net/tracker/ index.php?func=detail&aid=1170716&group_id=2435&atid=102435) It may not be possible to use the --all option to build all Pygame dependencies in one session. Instead the job may need to be split into two or more sessions, with a reboot of the operatingsystem between each. Use the --help-args option to list the libraries in the their proper build order. """ import msys from optparse import OptionParser, Option, OptionValueError import os import sys import time import re import copy DEFAULT_DEST_DIR_NAME = 'lib_VC_2008' def print_(*args, **kwds): msys.msys_print(*args, **kwds) def merge_strings(*args, **kwds): """Returns non empty string joined by sep The default separator is an empty string. """ sep = kwds.get('sep', '') return sep.join([s for s in args if s]) class BuildError(StandardError): """Raised for missing source paths and failed script runs""" pass class Dependency(object): """Builds a library""" def __init__(self, name, dlls, shell_script): self.name = name self.dlls = dlls self.shell_script = shell_script def build(self, msys): return_code = msys.run_shell_script(self.shell_script) if return_code != 0: raise BuildError("The build for %s failed with code %d" % (self.name, return_code)) class Preparation(object): """Perform necessary build environment preperations""" def __init__(self, name, shell_script): self.name = name self.path = '' self.paths = [] self.dlls = [] self.shell_script = shell_script def build(self, msys): return_code = msys.run_shell_script(self.shell_script) if return_code != 0: raise BuildError("Preparation '%s' failed with code %d" % (self.name, return_code)) def build(dependencies, msys): """Execute that shell scripts for all dependencies""" for dep in dependencies: dep.build(msys) def check_directory_path(option, opt, value): # Remove those double quotes that Windows won't. if re.match(r'([A-Za-z]:){0,1}[^"<>:|?*]+$', value) is None: raise OptionValueError("option %s: invalid path" % value) return value class MyOption(Option): TYPES = Option.TYPES + ("dir",) TYPE_CHECKER = copy.copy(Option.TYPE_CHECKER) TYPE_CHECKER["dir"] = check_directory_path def command_line(): """Process the command line and return the options""" usage = ("usage: %prog [options] --all\n" " %prog [options] [args]\n" "\n" "Build the Pygame dependencies. The args, if given, are\n" "libraries to include or exclude.\n" "\n" "At startup this program may prompt for missing information.\n" "Be aware of this before redirecting output or leaving the\n" "program unattended. Once the 'Starting build' message appears\n" "no more user input is required. The build process will" "abort on the first error, as library build order is important.\n" "\n" "See --include and --help-args.\n" "\n" "For more details see the program's document string\n") parser = OptionParser(usage, option_class=MyOption) parser.add_option('-a', '--all', action='store_true', dest='build_all', help="Include all libraries in the build") parser.set_defaults(build_all=False) parser.add_option('--console', action='store_true', dest='console', help="Link with the console subsystem:" " defaults to Win32 GUI") parser.set_defaults(console=False) parser.add_option('--no-strip', action='store_false', dest='strip', help="Do not strip the library") parser.set_defaults(strip=True) parser.add_option('-e', '--exclude', action='store_true', dest='exclude', help="Exclude the specified libraries") parser.set_defaults(exclude=False) parser.add_option('-d', '--destination-dir', type='dir', dest='destination_dir', help="Where the DLLs and export libraries will go", metavar='PATH') parser.set_defaults(destination_dir=DEFAULT_DEST_DIR_NAME) parser.add_option('-m', '--msys-root', action='store', type='dir', dest='msys_directory', help="MSYS directory path, which may include" " the 1.x subdirectory") parser.add_option('--help-args', action='store_true', dest='arg_help', help="Show a list of recognised libraries," " in build order, and exit") parser.set_defaults(arg_help=False) return parser.parse_args() def set_environment_variables(msys, options): """Set the environment variables used by the scripts""" environ = msys.environ msys_root = msys.msys_root destination_dir = os.path.abspath(options.destination_dir) environ['BDWD'] = msys.windows_to_msys(destination_dir) environ['BDBIN'] = '/usr/local/bin' environ['BDLIB'] = '/usr/local/lib' subsystem = '-mwindows' if options.console: subsystem = '-mconsole' strip = '' if options.strip: strip = '-Wl,--strip-all' environ['LDFLAGS'] = merge_strings(environ.get('LDFLAGS', ''), subsystem, strip, sep=' ') library_path = os.path.join(msys_root, 'local', 'lib') msvcr90_path = os.path.join(destination_dir, 'msvcr90') environ['DBMSVCR90'] = msys.windows_to_msys(msvcr90_path) # For dependency libraries and msvcrt hiding. environ['LIBRARY_PATH'] = merge_strings(msvcr90_path, environ.get('LIBRARY_PATH', ''), sep=';') class ChooseError(StandardError): """Failer to select dependencies""" pass def choose_dependencies(dependencies, options, args): """Return the dependencies to actually build""" if options.build_all: if args: raise ChooseError("No library names are accepted" " for the --all option.") if options.exclude: return [] else: return dependencies if args: names = [d.name for d in dependencies] args = [a.upper() for a in args] for a in args: if a not in names: msg = ["%s is an unknown library; valid choices are:" % a] msg.extend(names) raise ChooseError('\n'.join(msg)) if options.exclude: return [d for d in dependencies if d.name not in args] return [d for d in dependencies if d.name in args] return [] def summary(dependencies, msys, start_time, chosen_deps, options): """Display a summary report of new, existing and missing DLLs""" import datetime print_("\n\n=== Summary ===") if start_time is not None: print_(" Elapse time:", datetime.timedelta(seconds=time.time()-start_time)) bin_dir = options.destination_dir for d in dependencies: name = d.name dlls = d.dlls for dll in dlls: dll_path = os.path.join(bin_dir, dll) try: mod_time = os.path.getmtime(dll_path) except: msg = "No DLL" else: if mod_time >= start_time: msg = "Installed new DLL %s" % dll_path else: msg = "-- (old DLL %s)" % dll_path print_(" %-10s: %s" % (name, msg)) def main(dependencies, msvcr90_preparation, msys_preparation): """Build the dependencies according to the command line options.""" options, args = command_line() if options.arg_help: print_("These are the Pygame library dependencies:") for dep in dependencies: print_(" ", dep.name) return 0 try: chosen_deps = choose_dependencies(dependencies, options, args) except ChooseError, e: print_(e) return 1 print_("Destination directory:", options.destination_dir) if not chosen_deps: if not args: print_("No libraries specified.") elif options.build_all: print_("All libraries excluded") chosen_deps.insert(0, msvcr90_preparation) chosen_deps.insert(0, msys_preparation) try: msys_directory = options.msys_directory except AttributeError: msys_directory = None try: m = msys.Msys(msys_directory) except msys.MsysException, e: print_(e) return 1 start_time = None return_code = 1 set_environment_variables(m, options) print_("\n=== Starting build ===") start_time = time.time() # For file timestamp checks. try: build(chosen_deps, m) except BuildError, e: print_("Build aborted:", e) else: # A successful build! return_code = 0 summary(dependencies, m, start_time, chosen_deps, options) return return_code # # Build specific code # # This list includes the MSYS shell scripts to build each library. Each script # runs in an environment where MINGW_ROOT_DIRECTORY is defined and the MinGW # bin directory is in PATH. DBWD, is the working directory. A script will cd to # it before doing anything else. BDBIN is the location of the dependency DLLs. # BDLIB is the location of the dependency libraries. LDFLAGS are linker flags. # # The list order corresponds to build order. It is critical. dependencies = [ Dependency('SDL', ['SDL.dll'], """ set -e cd "$BDWD" pexports "$BDBIN/SDL.dll" >SDL.def gcc -shared $LDFLAGS -o SDL.dll -def SDL.def "$BDLIB/libSDL.a" -lwinmm -ldxguid dlltool -D SDL.dll -d SDL.def -l libSDL.dll.a ranlib libSDL.dll.a strip --strip-all SDL.dll """), Dependency('Z', ['zlib1.dll'], """ set -e cd "$BDWD" pexports "$BDBIN/zlib1.dll" >z.def gcc -shared $LDFLAGS -o zlib1.dll -def z.def "$BDLIB/libz.a" dlltool -D zlib1.dll -d z.def -l libz.dll.a ranlib libz.dll.a strip --strip-all zlib1.dll """), Dependency('FREETYPE', ['libfreetype-6.dll'], """ set -e cd "$BDWD" pexports "$BDBIN/libfreetype-6.dll" >freetype.def gcc -shared $LDFLAGS -L. -o libfreetype-6.dll -def freetype.def \ "$BDLIB/libfreetype.a" -lz dlltool -D libfreetype-6.dll -d freetype.def -l libfreetype.dll.a ranlib libfreetype.dll.a strip --strip-all libfreetype-6.dll """), Dependency('FONT', ['SDL_ttf.dll'], """ set -e cd "$BDWD" pexports "$BDBIN/SDL_ttf.dll" >SDL_ttf.def gcc -shared $LDFLAGS -L. "-L$BDLIB" -o SDL_ttf.dll -def SDL_ttf.def \ "$BDLIB/libSDL_ttf.a" -lSDL -lfreetype dlltool -D SDL_ttf.dll -d SDL_ttf.def -l libSDL_ttf.dll.a ranlib libSDL_ttf.dll.a strip --strip-all SDL_ttf.dll """), Dependency('PNG', ['libpng12-0.dll'], """ set -e cd "$BDWD" pexports "$BDBIN/libpng12-0.dll" >png.def gcc -shared $LDFLAGS -L. -o libpng12-0.dll -def png.def "$BDLIB/libpng.a" -lz dlltool -D libpng12-0.dll -d png.def -l libpng.dll.a ranlib libpng.dll.a strip --strip-all libpng12-0.dll """), Dependency('JPEG', ['jpeg.dll'], """ set -e cd "$BDWD" pexports "$BDBIN/jpeg.dll" >jpeg.def gcc -shared $LDFLAGS -o jpeg.dll -def jpeg.def "$BDLIB/libjpeg.a" dlltool -D jpeg.dll -d jpeg.def -l libjpeg.dll.a ranlib libjpeg.dll.a strip --strip-all jpeg.dll """), Dependency('TIFF', ['libtiff.dll'], """ set -e cd "$BDWD" pexports "$BDBIN/libtiff.dll" >tiff.def gcc -shared $LDFLAGS -L. -o libtiff.dll -def tiff.def \ "$BDLIB/libtiff.a" -ljpeg -lz dlltool -D libtiff.dll -d tiff.def -l libtiff.dll.a ranlib libtiff.dll.a strip --strip-all libtiff.dll """), Dependency('IMAGE', ['SDL_image.dll'], """ set -e cd "$BDWD" pexports "$BDBIN/SDL_image.dll" >SDL_image.def gcc -shared $LDFLAGS -L. -o SDL_image.dll -def SDL_image.def \ "$BDLIB/libSDL_image.a" -lSDL -ljpeg -lpng -ltiff dlltool -D SDL_image.dll -d SDL_image.def -l libSDL_image.dll.a ranlib libSDL_image.dll.a strip --strip-all SDL_image.dll """), Dependency('SMPEG', ['smpeg.dll'], """ set -e cd "$BDWD" pexports "$BDBIN/smpeg.dll" >smpeg.def g++ -shared $LDFLAGS -L. -o smpeg.dll -def smpeg.def \ "$BDLIB/libsmpeg.a" -lSDL dlltool -D smpeg.dll -d smpeg.def -l libsmpeg.dll.a ranlib libsmpeg.dll.a strip --strip-all smpeg.dll """), Dependency('OGG', ['libogg-0.dll'], """ set -e cd "$BDWD" pexports "$BDBIN/libogg-0.dll" >ogg.def gcc -shared $LDFLAGS -o libogg-0.dll -def ogg.def "$BDLIB/libogg.a" dlltool -D libogg-0.dll -d ogg.def -l libogg.dll.a ranlib libogg.dll.a strip --strip-all libogg-0.dll """), Dependency('VORBIS', ['libvorbis-0.dll', 'libvorbisfile-3.dll'], """ set -e cd "$BDWD" pexports "$BDBIN/libvorbis-0.dll" >vorbis.def gcc -shared $LDFLAGS -L. -o libvorbis-0.dll -def vorbis.def \ "$BDLIB/libvorbis.a" -logg dlltool -D libvorbis-0.dll -d vorbis.def -l libvorbis.dll.a ranlib libvorbis.dll.a strip --strip-all libvorbis-0.dll pexports "$BDBIN/libvorbisfile-3.dll" >vorbisfile.def gcc -shared $LDFLAGS -L. -o libvorbisfile-3.dll -def vorbisfile.def \ "$BDLIB/libvorbisfile.a" -lvorbis -logg dlltool -D libvorbisfile-3.dll -d vorbisfile.def -l libvorbisfile.dll.a ranlib libvorbisfile.dll.a strip --strip-all libvorbisfile-3.dll """), Dependency('MIXER', ['SDL_mixer.dll'], """ set -e cd "$BDWD" pexports "$BDBIN/SDL_mixer.dll" >SDL_mixer.def gcc -shared $LDFLAGS -L. -L/usr/local/lib -o SDL_mixer.dll -def SDL_mixer.def \ "$BDLIB/libSDL_mixer.a" -lSDL -lsmpeg -lvorbisfile -lFLAC -lWs2_32 -lwinmm dlltool -D SDL_mixer.dll -d SDL_mixer.def -l libSDL_mixer.dll.a ranlib libSDL_mixer.dll.a strip --strip-all SDL_mixer.dll """), Dependency('PORTMIDI', ['portmidi.dll'], """ set -e cd "$BDWD" pexports "$BDBIN/portmidi.dll" >portmidi.def gcc -shared $LDFLAGS -L. -L/usr/local/lib -o portmidi.dll -def portmidi.def \ "$BDLIB/libportmidi.a" -lwinmm dlltool -D portmidi.dll -d portmidi.def -l portmidi.dll.a ranlib libSDL_mixer.dll.a strip --strip-all portmidi.dll """), ] # End dependencies = [. msys_prep = Preparation('/usr/local', """ # Ensure destination directories exists. mkdir -p "$BDWD" mkdir -p "$DBMSVCR90" """) msvcr90_prep = Preparation('msvcr90.dll linkage', r""" set -e # # msvcr90.dll support # if [ ! -f "$DBMSVCR90/libmoldnamed.dll.a" ]; then OBJS='isascii.o iscsym.o iscsymf.o toascii.o strcasecmp.o strncasecmp.o wcscmpi.o' if [ ! -d /tmp/build_deps ]; then mkdir /tmp/build_deps; fi cd /tmp/build_deps # These definitions were generated with pexports on msvcr90.dll. # The C++ stuff at the beginning was removed. _onexit and atexit made # data entries. cat > msvcr90.def << 'THE_END' EXPORTS _CIacos _CIasin _CIatan _CIatan2 _CIcos _CIcosh _CIexp _CIfmod _CIlog _CIlog10 _CIpow _CIsin _CIsinh _CIsqrt _CItan _CItanh _CRT_RTC_INIT _CRT_RTC_INITW _CreateFrameInfo _CxxThrowException _EH_prolog _FindAndUnlinkFrame _Getdays _Getmonths _Gettnames _HUGE DATA _IsExceptionObjectToBeDestroyed _NLG_Dispatch2 _NLG_Return _NLG_Return2 _Strftime _XcptFilter __AdjustPointer __BuildCatchObject __BuildCatchObjectHelper __CppXcptFilter __CxxCallUnwindDelDtor __CxxCallUnwindDtor __CxxCallUnwindStdDelDtor __CxxCallUnwindVecDtor __CxxDetectRethrow __CxxExceptionFilter __CxxFrameHandler __CxxFrameHandler2 __CxxFrameHandler3 __CxxLongjmpUnwind __CxxQueryExceptionSize __CxxRegisterExceptionObject __CxxUnregisterExceptionObject __DestructExceptionObject __FrameUnwindFilter __RTCastToVoid __RTDynamicCast __RTtypeid __STRINGTOLD __STRINGTOLD_L __TypeMatch ___fls_getvalue@4 ___fls_setvalue@8 ___lc_codepage_func ___lc_collate_cp_func ___lc_handle_func ___mb_cur_max_func ___mb_cur_max_l_func ___setlc_active_func ___unguarded_readlc_active_add_func __argc DATA __argv DATA __badioinfo DATA __clean_type_info_names_internal __control87_2 __create_locale __crtCompareStringA __crtCompareStringW __crtGetLocaleInfoW __crtGetStringTypeW __crtLCMapStringA __crtLCMapStringW __daylight __dllonexit __doserrno __dstbias __fpecode __free_locale __get_app_type __get_current_locale __get_flsindex __get_tlsindex __getmainargs __initenv DATA __iob_func __isascii __iscsym __iscsymf __iswcsym __iswcsymf __lc_clike DATA __lc_codepage DATA __lc_collate_cp DATA __lc_handle DATA __lconv DATA __lconv_init __libm_sse2_acos __libm_sse2_acosf __libm_sse2_asin __libm_sse2_asinf __libm_sse2_atan __libm_sse2_atan2 __libm_sse2_atanf __libm_sse2_cos __libm_sse2_cosf __libm_sse2_exp __libm_sse2_expf __libm_sse2_log __libm_sse2_log10 __libm_sse2_log10f __libm_sse2_logf __libm_sse2_pow __libm_sse2_powf __libm_sse2_sin __libm_sse2_sinf __libm_sse2_tan __libm_sse2_tanf __mb_cur_max DATA __p___argc __p___argv __p___initenv __p___mb_cur_max __p___wargv __p___winitenv __p__acmdln __p__amblksiz __p__commode __p__daylight __p__dstbias __p__environ __p__fmode __p__iob __p__mbcasemap __p__mbctype __p__pctype __p__pgmptr __p__pwctype __p__timezone __p__tzname __p__wcmdln __p__wenviron __p__wpgmptr __pctype_func __pioinfo DATA __pwctype_func __pxcptinfoptrs __report_gsfailure __set_app_type __set_flsgetvalue __setlc_active DATA __setusermatherr __strncnt __swprintf_l __sys_errlist __sys_nerr __threadhandle __threadid __timezone __toascii __tzname __unDName __unDNameEx __unDNameHelper __uncaught_exception __unguarded_readlc_active DATA __vswprintf_l __wargv DATA __wcserror __wcserror_s __wcsncnt __wgetmainargs __winitenv DATA _abnormal_termination _abs64 _access _access_s _acmdln DATA _adj_fdiv_m16i _adj_fdiv_m32 _adj_fdiv_m32i _adj_fdiv_m64 _adj_fdiv_r _adj_fdivr_m16i _adj_fdivr_m32 _adj_fdivr_m32i _adj_fdivr_m64 _adj_fpatan _adj_fprem _adj_fprem1 _adj_fptan _adjust_fdiv DATA _aexit_rtn DATA _aligned_free _aligned_malloc _aligned_msize _aligned_offset_malloc _aligned_offset_realloc _aligned_offset_recalloc _aligned_realloc _aligned_recalloc _amsg_exit _assert _atodbl _atodbl_l _atof_l _atoflt _atoflt_l _atoi64 _atoi64_l _atoi_l _atol_l _atoldbl _atoldbl_l _beep _beginthread _beginthreadex _byteswap_uint64 _byteswap_ulong _byteswap_ushort _c_exit _cabs _callnewh _calloc_crt _cexit _cgets _cgets_s _cgetws _cgetws_s _chdir _chdrive _chgsign _chkesp _chmod _chsize _chsize_s _clearfp _close _commit _commode DATA _configthreadlocale _control87 _controlfp _controlfp_s _copysign _cprintf _cprintf_l _cprintf_p _cprintf_p_l _cprintf_s _cprintf_s_l _cputs _cputws _creat _create_locale _crt_debugger_hook _cscanf _cscanf_l _cscanf_s _cscanf_s_l _ctime32 _ctime32_s _ctime64 _ctime64_s _cwait _cwprintf _cwprintf_l _cwprintf_p _cwprintf_p_l _cwprintf_s _cwprintf_s_l _cwscanf _cwscanf_l _cwscanf_s _cwscanf_s_l _daylight DATA _decode_pointer _difftime32 _difftime64 _dosmaperr _dstbias DATA _dup _dup2 _dupenv_s _ecvt _ecvt_s _encode_pointer _encoded_null _endthread _endthreadex _environ DATA _eof _errno _except_handler2 _except_handler3 _except_handler4_common _execl _execle _execlp _execlpe _execv _execve _execvp _execvpe _exit _expand _fclose_nolock _fcloseall _fcvt _fcvt_s _fdopen _fflush_nolock _fgetchar _fgetwc_nolock _fgetwchar _filbuf _filelength _filelengthi64 _fileno _findclose _findfirst32 _findfirst32i64 _findfirst64 _findfirst64i32 _findnext32 _findnext32i64 _findnext64 _findnext64i32 _finite _flsbuf _flushall _fmode DATA _fpclass _fpieee_flt _fpreset _fprintf_l _fprintf_p _fprintf_p_l _fprintf_s_l _fputchar _fputwc_nolock _fputwchar _fread_nolock _fread_nolock_s _free_locale _freea _freea_s _freefls _fscanf_l _fscanf_s_l _fseek_nolock _fseeki64 _fseeki64_nolock _fsopen _fstat32 _fstat32i64 _fstat64 _fstat64i32 _ftell_nolock _ftelli64 _ftelli64_nolock _ftime32 _ftime32_s _ftime64 _ftime64_s _ftol _fullpath _futime32 _futime64 _fwprintf_l _fwprintf_p _fwprintf_p_l _fwprintf_s_l _fwrite_nolock _fwscanf_l _fwscanf_s_l _gcvt _gcvt_s _get_amblksiz _get_current_locale _get_daylight _get_doserrno _get_dstbias _get_errno _get_fmode _get_heap_handle _get_invalid_parameter_handler _get_osfhandle _get_output_format _get_pgmptr _get_printf_count_output _get_purecall_handler _get_sbh_threshold _get_terminate _get_timezone _get_tzname _get_unexpected _get_wpgmptr _getc_nolock _getch _getch_nolock _getche _getche_nolock _getcwd _getdcwd _getdcwd_nolock _getdiskfree _getdllprocaddr _getdrive _getdrives _getmaxstdio _getmbcp _getpid _getptd _getsystime _getw _getwch _getwch_nolock _getwche _getwche_nolock _getws _getws_s _global_unwind2 _gmtime32 _gmtime32_s _gmtime64 _gmtime64_s _heapadd _heapchk _heapmin _heapset _heapused _heapwalk _hypot _hypotf _i64toa _i64toa_s _i64tow _i64tow_s _initptd _initterm _initterm_e _inp _inpd _inpw _invalid_parameter _invalid_parameter_noinfo _invoke_watson _iob DATA _isalnum_l _isalpha_l _isatty _iscntrl_l _isctype _isctype_l _isdigit_l _isgraph_l _isleadbyte_l _islower_l _ismbbalnum _ismbbalnum_l _ismbbalpha _ismbbalpha_l _ismbbgraph _ismbbgraph_l _ismbbkalnum _ismbbkalnum_l _ismbbkana _ismbbkana_l _ismbbkprint _ismbbkprint_l _ismbbkpunct _ismbbkpunct_l _ismbblead _ismbblead_l _ismbbprint _ismbbprint_l _ismbbpunct _ismbbpunct_l _ismbbtrail _ismbbtrail_l _ismbcalnum _ismbcalnum_l _ismbcalpha _ismbcalpha_l _ismbcdigit _ismbcdigit_l _ismbcgraph _ismbcgraph_l _ismbchira _ismbchira_l _ismbckata _ismbckata_l _ismbcl0 _ismbcl0_l _ismbcl1 _ismbcl1_l _ismbcl2 _ismbcl2_l _ismbclegal _ismbclegal_l _ismbclower _ismbclower_l _ismbcprint _ismbcprint_l _ismbcpunct _ismbcpunct_l _ismbcspace _ismbcspace_l _ismbcsymbol _ismbcsymbol_l _ismbcupper _ismbcupper_l _ismbslead _ismbslead_l _ismbstrail _ismbstrail_l _isnan _isprint_l _ispunct_l _isspace_l _isupper_l _iswalnum_l _iswalpha_l _iswcntrl_l _iswcsym_l _iswcsymf_l _iswctype_l _iswdigit_l _iswgraph_l _iswlower_l _iswprint_l _iswpunct_l _iswspace_l _iswupper_l _iswxdigit_l _isxdigit_l _itoa _itoa_s _itow _itow_s _j0 _j1 _jn _kbhit _lfind _lfind_s _loaddll _local_unwind2 _local_unwind4 _localtime32 _localtime32_s _localtime64 _localtime64_s _lock _lock_file _locking _logb _longjmpex _lrotl _lrotr _lsearch _lsearch_s _lseek _lseeki64 _ltoa _ltoa_s _ltow _ltow_s _makepath _makepath_s _malloc_crt _mbbtombc _mbbtombc_l _mbbtype _mbbtype_l _mbcasemap DATA _mbccpy _mbccpy_l _mbccpy_s _mbccpy_s_l _mbcjistojms _mbcjistojms_l _mbcjmstojis _mbcjmstojis_l _mbclen _mbclen_l _mbctohira _mbctohira_l _mbctokata _mbctokata_l _mbctolower _mbctolower_l _mbctombb _mbctombb_l _mbctoupper _mbctoupper_l _mbctype DATA _mblen_l _mbsbtype _mbsbtype_l _mbscat_s _mbscat_s_l _mbschr _mbschr_l _mbscmp _mbscmp_l _mbscoll _mbscoll_l _mbscpy_s _mbscpy_s_l _mbscspn _mbscspn_l _mbsdec _mbsdec_l _mbsicmp _mbsicmp_l _mbsicoll _mbsicoll_l _mbsinc _mbsinc_l _mbslen _mbslen_l _mbslwr _mbslwr_l _mbslwr_s _mbslwr_s_l _mbsnbcat _mbsnbcat_l _mbsnbcat_s _mbsnbcat_s_l _mbsnbcmp _mbsnbcmp_l _mbsnbcnt _mbsnbcnt_l _mbsnbcoll _mbsnbcoll_l _mbsnbcpy _mbsnbcpy_l _mbsnbcpy_s _mbsnbcpy_s_l _mbsnbicmp _mbsnbicmp_l _mbsnbicoll _mbsnbicoll_l _mbsnbset _mbsnbset_l _mbsnbset_s _mbsnbset_s_l _mbsncat _mbsncat_l _mbsncat_s _mbsncat_s_l _mbsnccnt _mbsnccnt_l _mbsncmp _mbsncmp_l _mbsncoll _mbsncoll_l _mbsncpy _mbsncpy_l _mbsncpy_s _mbsncpy_s_l _mbsnextc _mbsnextc_l _mbsnicmp _mbsnicmp_l _mbsnicoll _mbsnicoll_l _mbsninc _mbsninc_l _mbsnlen _mbsnlen_l _mbsnset _mbsnset_l _mbsnset_s _mbsnset_s_l _mbspbrk _mbspbrk_l _mbsrchr _mbsrchr_l _mbsrev _mbsrev_l _mbsset _mbsset_l _mbsset_s _mbsset_s_l _mbsspn _mbsspn_l _mbsspnp _mbsspnp_l _mbsstr _mbsstr_l _mbstok _mbstok_l _mbstok_s _mbstok_s_l _mbstowcs_l _mbstowcs_s_l _mbstrlen _mbstrlen_l _mbstrnlen _mbstrnlen_l _mbsupr _mbsupr_l _mbsupr_s _mbsupr_s_l _mbtowc_l _memccpy _memicmp _memicmp_l _mkdir _mkgmtime32 _mkgmtime64 _mktemp _mktemp_s _mktime32 _mktime64 _msize _nextafter _onexit DATA _open _open_osfhandle _outp _outpd _outpw _pclose _pctype DATA _pgmptr DATA _pipe _popen _printf_l _printf_p _printf_p_l _printf_s_l _purecall _putch _putch_nolock _putenv _putenv_s _putw _putwch _putwch_nolock _putws _pwctype DATA _read _realloc_crt _recalloc _recalloc_crt _resetstkoflw _rmdir _rmtmp _rotl _rotl64 _rotr _rotr64 _safe_fdiv _safe_fdivr _safe_fprem _safe_fprem1 _scalb _scanf_l _scanf_s_l _scprintf _scprintf_l _scprintf_p _scprintf_p_l _scwprintf _scwprintf_l _scwprintf_p _scwprintf_p_l _searchenv _searchenv_s _seh_longjmp_unwind _seh_longjmp_unwind4 _set_SSE2_enable _set_abort_behavior _set_amblksiz _set_controlfp _set_doserrno _set_errno _set_error_mode _set_fmode _set_invalid_parameter_handler _set_malloc_crt_max_wait _set_output_format _set_printf_count_output _set_purecall_handler _set_sbh_threshold _seterrormode _setjmp _setjmp3 _setmaxstdio _setmbcp _setmode _setsystime _sleep _snprintf _snprintf_c _snprintf_c_l _snprintf_l _snprintf_s _snprintf_s_l _snscanf _snscanf_l _snscanf_s _snscanf_s_l _snwprintf _snwprintf_l _snwprintf_s _snwprintf_s_l _snwscanf _snwscanf_l _snwscanf_s _snwscanf_s_l _sopen _sopen_s _spawnl _spawnle _spawnlp _spawnlpe _spawnv _spawnve _spawnvp _spawnvpe _splitpath _splitpath_s _sprintf_l _sprintf_p _sprintf_p_l _sprintf_s_l _sscanf_l _sscanf_s_l _stat32 _stat32i64 _stat64 _stat64i32 _statusfp _statusfp2 _strcoll_l _strdate _strdate_s _strdup _strerror _strerror_s _strftime_l _stricmp _stricmp_l _stricoll _stricoll_l _strlwr _strlwr_l _strlwr_s _strlwr_s_l _strncoll _strncoll_l _strnicmp _strnicmp_l _strnicoll _strnicoll_l _strnset _strnset_s _strrev _strset _strset_s _strtime _strtime_s _strtod_l _strtoi64 _strtoi64_l _strtol_l _strtoui64 _strtoui64_l _strtoul_l _strupr _strupr_l _strupr_s _strupr_s_l _strxfrm_l _swab _swprintf _swprintf_c _swprintf_c_l _swprintf_p _swprintf_p_l _swprintf_s_l _swscanf_l _swscanf_s_l _sys_errlist DATA _sys_nerr DATA _tell _telli64 _tempnam _time32 _time64 _timezone DATA _tolower _tolower_l _toupper _toupper_l _towlower_l _towupper_l _tzname DATA _tzset _ui64toa _ui64toa_s _ui64tow _ui64tow_s _ultoa _ultoa_s _ultow _ultow_s _umask _umask_s _ungetc_nolock _ungetch _ungetch_nolock _ungetwc_nolock _ungetwch _ungetwch_nolock _unlink _unloaddll _unlock _unlock_file _utime32 _utime64 _vcprintf _vcprintf_l _vcprintf_p _vcprintf_p_l _vcprintf_s _vcprintf_s_l _vcwprintf _vcwprintf_l _vcwprintf_p _vcwprintf_p_l _vcwprintf_s _vcwprintf_s_l _vfprintf_l _vfprintf_p _vfprintf_p_l _vfprintf_s_l _vfwprintf_l _vfwprintf_p _vfwprintf_p_l _vfwprintf_s_l _vprintf_l _vprintf_p _vprintf_p_l _vprintf_s_l _vscprintf _vscprintf_l _vscprintf_p _vscprintf_p_l _vscwprintf _vscwprintf_l _vscwprintf_p _vscwprintf_p_l _vsnprintf _vsnprintf_c _vsnprintf_c_l _vsnprintf_l _vsnprintf_s _vsnprintf_s_l _vsnwprintf _vsnwprintf_l _vsnwprintf_s _vsnwprintf_s_l _vsprintf_l _vsprintf_p _vsprintf_p_l _vsprintf_s_l _vswprintf _vswprintf_c _vswprintf_c_l _vswprintf_l _vswprintf_p _vswprintf_p_l _vswprintf_s_l _vwprintf_l _vwprintf_p _vwprintf_p_l _vwprintf_s_l _waccess _waccess_s _wasctime _wasctime_s _wassert _wchdir _wchmod _wcmdln DATA _wcreat _wcscoll_l _wcsdup _wcserror _wcserror_s _wcsftime_l _wcsicmp _wcsicmp_l _wcsicoll _wcsicoll_l _wcslwr _wcslwr_l _wcslwr_s _wcslwr_s_l _wcsncoll _wcsncoll_l _wcsnicmp _wcsnicmp_l _wcsnicoll _wcsnicoll_l _wcsnset _wcsnset_s _wcsrev _wcsset _wcsset_s _wcstod_l _wcstoi64 _wcstoi64_l _wcstol_l _wcstombs_l _wcstombs_s_l _wcstoui64 _wcstoui64_l _wcstoul_l _wcsupr _wcsupr_l _wcsupr_s _wcsupr_s_l _wcsxfrm_l _wctime32 _wctime32_s _wctime64 _wctime64_s _wctomb_l _wctomb_s_l _wctype _wdupenv_s _wenviron DATA _wexecl _wexecle _wexeclp _wexeclpe _wexecv _wexecve _wexecvp _wexecvpe _wfdopen _wfindfirst32 _wfindfirst32i64 _wfindfirst64 _wfindfirst64i32 _wfindnext32 _wfindnext32i64 _wfindnext64 _wfindnext64i32 _wfopen _wfopen_s _wfreopen _wfreopen_s _wfsopen _wfullpath _wgetcwd _wgetdcwd _wgetdcwd_nolock _wgetenv _wgetenv_s _wmakepath _wmakepath_s _wmkdir _wmktemp _wmktemp_s _wopen _wperror _wpgmptr DATA _wpopen _wprintf_l _wprintf_p _wprintf_p_l _wprintf_s_l _wputenv _wputenv_s _wremove _wrename _write _wrmdir _wscanf_l _wscanf_s_l _wsearchenv _wsearchenv_s _wsetlocale _wsopen _wsopen_s _wspawnl _wspawnle _wspawnlp _wspawnlpe _wspawnv _wspawnve _wspawnvp _wspawnvpe _wsplitpath _wsplitpath_s _wstat32 _wstat32i64 _wstat64 _wstat64i32 _wstrdate _wstrdate_s _wstrtime _wstrtime_s _wsystem _wtempnam _wtmpnam _wtmpnam_s _wtof _wtof_l _wtoi _wtoi64 _wtoi64_l _wtoi_l _wtol _wtol_l _wunlink _wutime32 _wutime64 _y0 _y1 _yn abort abs acos asctime asctime_s asin atan atan2 atexit DATA atof atoi atol bsearch bsearch_s btowc calloc ceil clearerr clearerr_s clock cos cosh div exit exp fabs fclose feof ferror fflush fgetc fgetpos fgets fgetwc fgetws floor fmod fopen fopen_s fprintf fprintf_s fputc fputs fputwc fputws fread fread_s free freopen freopen_s frexp fscanf fscanf_s fseek fsetpos ftell fwprintf fwprintf_s fwrite fwscanf fwscanf_s getc getchar getenv getenv_s gets gets_s getwc getwchar is_wctype isalnum isalpha iscntrl isdigit isgraph isleadbyte islower isprint ispunct isspace isupper iswalnum iswalpha iswascii iswcntrl iswctype iswdigit iswgraph iswlower iswprint iswpunct iswspace iswupper iswxdigit isxdigit labs ldexp ldiv localeconv log log10 longjmp malloc mblen mbrlen mbrtowc mbsrtowcs mbsrtowcs_s mbstowcs mbstowcs_s mbtowc memchr memcmp memcpy memcpy_s memmove memmove_s memset modf perror pow printf printf_s putc putchar puts putwc putwchar qsort qsort_s raise rand rand_s realloc remove rename rewind scanf scanf_s setbuf setlocale setvbuf signal sin sinh sprintf sprintf_s sqrt srand sscanf sscanf_s strcat strcat_s strchr strcmp strcoll strcpy strcpy_s strcspn strerror strerror_s strftime strlen strncat strncat_s strncmp strncpy strncpy_s strnlen strpbrk strrchr strspn strstr strtod strtok strtok_s strtol strtoul strxfrm swprintf_s swscanf swscanf_s system tan tanh tmpfile tmpfile_s tmpnam tmpnam_s tolower toupper towlower towupper ungetc ungetwc vfprintf vfprintf_s vfwprintf vfwprintf_s vprintf vprintf_s vsprintf vsprintf_s vswprintf_s vwprintf vwprintf_s wcrtomb wcrtomb_s wcscat wcscat_s wcschr wcscmp wcscoll wcscpy wcscpy_s wcscspn wcsftime wcslen wcsncat wcsncat_s wcsncmp wcsncpy wcsncpy_s wcsnlen wcspbrk wcsrchr wcsrtombs wcsrtombs_s wcsspn wcsstr wcstod wcstok wcstok_s wcstol wcstombs wcstombs_s wcstoul wcsxfrm wctob wctomb wctomb_s wprintf wprintf_s wscanf wscanf_s THE_END # Provide the gmtime stub required by PNG. cat > gmtime.c << 'THE_END' /* Stub function for gmtime. * This is an inline function in Visual C 2008 so is missing from msvcr90.dll */ #include struct tm* _gmtime32(const time_t *timer); struct tm* gmtime(const time_t *timer) { return _gmtime32(timer); } THE_END # Provide the _ftime stub required by numpy.random.mtrand. cat > _ftime.c << 'THE_END' /* Stub function for _ftime. * This is an inline function in Visual C 2008 so is missing from msvcr90.dll */ #include #include void _ftime32(struct _timeb *timeptr); void _ftime(struct _timeb *timeptr) { _ftime32(timeptr); } THE_END # Provide the time stub required by Numeric.RNG. cat > time.c << 'THE_END' /* Stub function for time. * This is an inline function in Visual C 2008 so is missing from msvcr90.dll */ #include time_t _time32(time_t *timer); time_t time(time_t *timer) { return _time32(timer); } THE_END gcc -c -O2 gmtime.c _ftime.c time.c dlltool -d msvcr90.def -D msvcr90.dll -l libmsvcr90.dll.a ar rc libmsvcr90.dll.a gmtime.o _ftime.o time.o ranlib libmsvcr90.dll.a cp -f libmsvcr90.dll.a "$DBMSVCR90" mv -f libmsvcr90.dll.a "$DBMSVCR90/libmsvcrt.dll.a" gcc -c -g gmtime.c dlltool -d msvcr90.def -D msvcr90d.dll -l libmsvcr90d.dll.a ar rc libmsvcr90d.dll.a gmtime.o ranlib libmsvcr90d.dll.a cp -f libmsvcr90d.dll.a "$DBMSVCR90" mv -f libmsvcr90d.dll.a "$DBMSVCR90/libmsvcrtd.dll.a" # These definitions are taken from mingw-runtime-3.12 . # The file was generated with the following command: # # gcc -DRUNTIME=msvcrt -D__FILENAME__=moldname-msvcrt.def # -D__MSVCRT__ -C -E -P -xc-header moldname.def.in >moldname-msvcrt.def # It then had fstat deleted to match with msvcr90.dll. cat > moldname-msvcrt.def << 'THE_END' EXPORTS access chdir chmod chsize close creat cwait daylight DATA dup dup2 ecvt eof execl execle execlp execlpe execv execve execvp execvpe fcvt fdopen fgetchar fgetwchar filelength fileno ; Alias fpreset is set in CRT_fp10,c and CRT_fp8.c. ; fpreset fputchar fputwchar ftime gcvt getch getche getcwd getpid getw heapwalk isatty itoa kbhit lfind lsearch lseek ltoa memccpy memicmp mkdir mktemp open pclose popen putch putenv putw read rmdir rmtmp searchenv setmode sopen spawnl spawnle spawnlp spawnlpe spawnv spawnve spawnvp spawnvpe stat strcmpi strdup stricmp stricoll strlwr strnicmp strnset strrev strset strupr swab tell tempnam timezone DATA ; export tzname for both. See tzname DATA tzset umask ungetch unlink utime wcsdup wcsicmp wcsicoll wcslwr wcsnicmp wcsnset wcsrev wcsset wcsupr wpopen write ; non-ANSI functions declared in math.h j0 j1 jn y0 y1 yn chgsign scalb finite fpclass ; C99 functions cabs hypot logb nextafter THE_END # Provide the fstat stub required by TIFF. cat > fstat.c << 'THE_END' /* Stub function for fstat. * This is an inlined functions in Visual C 2008 so is missing from msvcr90.dll */ #include int _fstat32(int fd, struct stat *buffer); int fstat(int fd, struct stat *buffer) { return _fstat32(fd, buffer); } THE_END mkdir -p "$DBMSVCR90" gcc -c -O2 fstat.c ar x /mingw/lib/libmoldname90.a $OBJS dlltool --as as -k -U \ --dllname msvcr90.dll \ --def moldname-msvcrt.def \ --output-lib libmoldname.dll.a ar rc libmoldname.dll.a $OBJS fstat.o ranlib libmoldname.dll.a mv -f libmoldname.dll.a "$DBMSVCR90" gcc -c -g fstat.c ar x /mingw/lib/libmoldname90d.a $OBJS dlltool --as as -k -U \ --dllname msvcr90.dll \ --def moldname-msvcrt.def \ --output-lib libmoldnamed.dll.a ar rc libmoldnamed.dll.a $OBJS fstat.o ranlib libmoldnamed.dll.a mv -f libmoldnamed.dll.a "$DBMSVCR90" rm -f ./* cd "$OLDPWD" rmdir /tmp/build_deps fi """) if __name__ == '__main__': sys.exit(main(dependencies, msvcr90_prep, msys_prep)) pygame-1.9.1release/msys_build_deps.py0000644000175000017500000006772411227461214020022 0ustar vincentvincent#!/usr/bin/env python # -*- coding: ascii -*- # Program msys_build_deps.py # Requires Python 2.4 or later and win32api. """Build Pygame dependencies using MinGW and MSYS Configured for Pygame 1.9.0 and Python 2.4 and up. The libraries are installed in /usr/local of the MSYS directory structure. This program can be run from a Windows cmd.exe or MSYS terminal. The current directory and its outer directory are searched for the library source directories. The recognized, and optional, environment variables are: SHELL - MSYS shell program path - already defined in the MSYS terminal CFLAGS - compiler options - overrides the defaults used by this program LDFLAGS - linker options - prepended to flags set by the program LIBRARY_PATH - library directory paths - appended to those used by this program CPATH - C/C++ header file paths - appended to the paths used by this program To get a list of command line options run python build_deps.py --help This program has been tested against the following libraries: SDL 1.2 (.13) revision 4114 from SVN SDL_image 1.2.6 SDL_mixer 1.2 (.8) revision 3942 from SVN SDL_ttf 2.0.9 smpeg revision 370 from SVN freetype 2.3.7 libogg 1.1.3 libvorbis 1.2.0 FLAC 1.2.1 tiff 3.8.2 libpng 1.2.32 jpeg 6b zlib 1.2.3 PortMidi release 82 The build environment used: gcc-core-3.4.5 gcc-c++-3.4.5 binutils-2.17.50 mingwrt-3.15.1 win32api-3.12 mingw32-make-3.81-20080326 MSYS-1.0.10 msysDTK-1.0.1 msys-automake-1.8.2 msys-autocont-2.59 m4-1.4.7-MSYS nasm-2.05rc6-win32 (SourceForge) Builds have been performed on Windows 98 and XP. Build issues: For pre-2007 computers: MSYS bug "[ 1170716 ] executing a shell scripts gives a memory leak" (http://sourceforge.net/tracker/ index.php?func=detail&aid=1170716&group_id=2435&atid=102435) It may not be possible to use the --all option to build all Pygame dependencies in one session. Instead the job may need to be split into two or more sessions, with a reboot of the operating system between each. Use the --help-args option to list the libraries in the their proper build order. """ import msys from optparse import OptionParser import os import sys from glob import glob import time # For Python 2.x/3.x compatibility def geterror(): return sys.exc_info()[1] # # Generic declarations # hunt_paths = ['.', '..'] def prompt(p=None): """MSYS friendly raw_input This provides a hook that can be replaced for testing. """ msys.msys_raw_input(p) def print_(*args, **kwds): msys.msys_print(*args, **kwds) def confirm(message): """Ask a yes/no question, return result""" reply = prompt("\n%s [Y/n]:" % message) if reply and reply[0].lower() == 'n': return 0 return 1 def as_flag(b): """Return bool b as a shell script flag '1' or '0'""" if b: return '1' return '0' def merge_strings(*args, **kwds): """Returns non empty string joined by sep The default separator is an empty string. """ sep = kwds.get('sep', '') return sep.join([s for s in args if s]) class BuildError(Exception): """Raised for missing source paths and failed script runs""" pass class Dependency(object): """Builds a library""" def __init__(self, name, wildcards, dlls, shell_script): self.name = name self.wildcards = wildcards self.shell_script = shell_script self.dlls = dlls def configure(self, hunt_paths): self.path = None self.paths = [] self.hunt(hunt_paths) self.choosepath() def hunt(self, hunt_paths): parent = os.path.abspath('..') for p in hunt_paths: for w in self.wildcards: found = glob(os.path.join(p, w)) found.sort() or found.reverse() #reverse sort for f in found: if f[:5] == '..'+os.sep+'..' and \ os.path.abspath(f)[:len(parent)] == parent: continue if os.path.isdir(f): self.paths.append(f) def choosepath(self): path = None if not self.paths: raise BuildError("Path for %s: not found" % self.name) if len(self.paths) == 1: path = self.paths[0] else: print_("Select path for %s:" % self.name) for i in range(len(self.paths)): print_(" %d = %s" % (i+1, self.paths[i])) print_(" 0 = ") choice = prompt("Select 0-%d (1=default):" % len(self.paths)) if not choice: choice = 1 else: choice = int(choice) if choice > 0: path = self.paths[choice-1] if path is not None: self.path = os.path.abspath(path) def build(self, msys): if self.path is not None: msys.environ['BDWD'] = msys.windows_to_msys(self.path) return_code = msys.run_shell_script(self.shell_script) if return_code != 0: raise BuildError("The build for %s failed with code %d" % (self.name, return_code)) else: raise BuildError("No source directory for %s" % self.name) class Preparation(object): """Perform necessary build environment preperations""" def __init__(self, name, shell_script): self.name = name self.path = '' self.paths = [] self.dlls = [] self.shell_script = shell_script def configure(self, hunt_paths): pass def build(self, msys): return_code = msys.run_shell_script(self.shell_script) if return_code != 0: raise BuildError("Preparation '%s' failed with code %d" % (self.name, return_code)) def configure(dependencies): """Find source directories of all dependencies""" success = True print_("Hunting for source directories...") for dep in dependencies: try: dep.configure(hunt_paths) except BuildError: print_(geterror()) success = False else: if dep.path: print_("Source directory for", dep.name, ":", dep.path) if not success: raise BuildError("Not all source directories were found") def build(dependencies, msys): """Execute that shell scripts for all dependencies""" for dep in dependencies: dep.build(msys) def command_line(): """Process the command line and return the options""" usage = ("usage: %prog [options] --all\n" " %prog [options] [args]\n" "\n" "Build the Pygame dependencies. The args, if given, are\n" "libraries to include or exclude.\n" "\n" "At startup this program may prompt for missing information.\n" "Be aware of this before redirecting output or leaving the\n" "program unattended. Once the 'Starting build' message appears\n" "no more user input is required. The build process will" "abort on the first error, as library build order is important.\n" "\n" "See --include and --help-args.\n" "\n" "For more details see the program's document string\n") parser = OptionParser(usage) parser.add_option('-a', '--all', action='store_true', dest='build_all', help="Include all libraries in the build") parser.set_defaults(build_all=False) parser.add_option('--no-msvcr71', action='store_false', dest='msvcr71', help="Do not link to msvcr71.dll") parser.set_defaults(msvcr71=True) parser.add_option('--console', action='store_true', dest='console', help="Link with the console subsystem:" " defaults to Win32 GUI") parser.set_defaults(console=False) parser.add_option('--no-configure', action='store_false', dest='configure', help="Do not prepare the makefiles") parser.set_defaults(configure=True) parser.add_option('--no-compile', action='store_false', dest='compile', help="Do not compile or install the libraries") parser.set_defaults(compile=True) parser.add_option('--no-install', action='store_false', dest='install', help="Do not install the libraries") parser.add_option('--no-strip', action='store_false', dest='strip', help="Do not strip the library") parser.set_defaults(strip=True) parser.set_defaults(install=True) parser.add_option('--clean', action='store_true', dest='clean', help="Remove generated files (make clean)" " as a last step") parser.set_defaults(clean=False) parser.add_option('--clean-only', action='store_true', dest='clean_only', help="Perform only a clean") parser.set_defaults(clean_only=False) parser.add_option('-e', '--exclude', action='store_true', dest='exclude', help="Exclude the specified libraries") parser.set_defaults(exclude=False) parser.add_option('-m', '--msys-root', action='store', dest='msys_directory', help="MSYS directory path, which may include" " the 1.x subdirectory") parser.set_defaults(msys_directory='') parser.add_option('--help-args', action='store_true', dest='arg_help', help="Show a list of recognised libraries," " in build order, and exit") parser.set_defaults(arg_help=False) return parser.parse_args() def set_environment_variables(msys, options): """Set the environment variables used by the scripts""" environ = msys.environ msys_root = msys.msys_root environ['BDCONF'] = as_flag(options.configure and not options.clean_only) environ['BDCOMP'] = as_flag(options.compile and not options.clean_only) environ['BDINST'] = as_flag(options.install and options.compile and not options.clean_only) environ['BDSTRIP'] = as_flag(options.install and options.strip and not options.clean_only) environ['BDCLEAN'] = as_flag(options.clean or options.clean_only) environ.pop('INCLUDE', None) # INCLUDE causes problems with MIXER. if 'CFLAGS' not in environ: environ['CFLAGS'] = '-O2' ldflags = '-mwindows' if options.console: ldflags = '-mconsole' environ['LDFLAGS'] = merge_strings(environ.get('LDFLAGS', ''), ldflags, sep=' ') library_path = os.path.join(msys_root, 'local', 'lib') msvcr71_path = '' if options.msvcr71: # Hide the msvcrt.dll import libraries with those for msvcr71.dll. # Their subdirectory is in the same directory as the SDL library. msvcr71_path = os.path.join(library_path, 'msvcr71') environ['DBMSVCR71'] = msvcr71_path # For dependency libraries and msvcrt hiding. environ['LIBRARY_PATH'] = merge_strings(library_path, msvcr71_path, environ.get('LIBRARY_PATH', ''), sep=';') # For dependency headers. include_path = os.path.join(msys_root, 'local', 'include') environ['CPATH'] = merge_strings(include_path, environ.get('CPATH', ''), sep=';') class ChooseError(Exception): """Failer to select dependencies""" pass def choose_dependencies(dependencies, options, args): """Return the dependencies to actually build""" if options.build_all: if args: raise ChooseError("No library names are accepted" " for the --all option.") if options.exclude: return [] else: return dependencies if args: names = [d.name for d in dependencies] args = [a.upper() for a in args] for a in args: if a not in names: msg = ["%s is an unknown library; valid choices are:" % a] msg.extend(names) raise ChooseError('\n'.join(msg)) if options.exclude: return [d for d in dependencies if d.name not in args] return [d for d in dependencies if d.name in args] return [] def summary(dependencies, msys, start_time, chosen_deps): """Display a summary report of new, existing and missing DLLs""" import datetime print_("\n\n=== Summary ===") if start_time is not None: print_(" Elapse time:", datetime.timedelta(seconds=time.time()-start_time)) print_() for dep in chosen_deps: if dep.path is None: print_(" ** No source directory found for", dep.name) elif dep.path: print_(" Source directory for", dep.name, ":", dep.path) print_() msys_root = msys.msys_root bin_dir = os.path.join(msys_root, 'local', 'bin') for d in dependencies: name = d.name dlls = d.dlls for dll in dlls: dll_path = os.path.join(bin_dir, dll) try: mod_time = os.path.getmtime(dll_path) except: msg = "No DLL" else: if mod_time >= start_time: msg = "Installed new DLL %s" % dll_path else: msg = "-- (old DLL %s)" % dll_path print_(" %-10s: %s" % (name, msg)) def main(dependencies, msvcr71_preparation, msys_preparation): """Build the dependencies according to the command line options.""" options, args = command_line() if options.arg_help: print_("These are the Pygame library dependencies:") for dep in dependencies: print_(" ", dep.name) return 0 try: chosen_deps = choose_dependencies(dependencies, options, args) except ChooseError: print_(geterror()) return 1 if not chosen_deps: if not args: print_("No libraries specified.") elif options.build_all: print_("All libraries excluded") if options.msvcr71: chosen_deps.insert(0, msvcr71_preparation) if chosen_deps: chosen_deps.insert(0, msys_preparation) try: m = msys.Msys(options.msys_directory) except msys.MsysException: print_(geterror()) return 1 start_time = None return_code = 1 set_environment_variables(m, options) try: configure(chosen_deps) except BuildError: print_("Build aborted:", geterror()) else: print_("\n=== Starting build ===") start_time = time.time() # For file timestamp checks. try: build(chosen_deps, m) except BuildError: print_("Build aborted:", geterror()) else: # A successful build! return_code = 0 summary(dependencies, m, start_time, chosen_deps) # MinGW configure file for setup.py (optional). try: import mingwcfg except ImportError: pass else: mingwcfg.write(m.mingw_root) return return_code # # Build specific code # # This list includes the MSYS shell scripts to build each library. Each script # runs in an environment where MINGW_ROOT_DIRECTORY is defined and the MinGW # bin directory is in PATH. Four other environment variables are defined: # BDCONF, BDCOMP, BDINST and BDCLEAN. They are either '0' or '1'. They # represent configure, compile, install and clean respectively. When '1' the # corresponding action is performed. When '0' it is skipped. A final variable, # DBWD, is the root directory of the source code. A script will cd to it before # doing anything else. # # None of these scripts end with an "exit". Exit, possibly, leads to Msys # freezing on some versions of Windows (98). # # The list order corresponds to build order. It is critical. dependencies = [ Dependency('SDL', ['SDL-[1-9].*'], ['SDL.dll'], """ set -e cd $BDWD if [ x$BDCONF == x1 ]; then # Remove NONAMELESSUNION from directx.h headers. for d in video audio; do BDDXHDR=src/$d/windx5/directx.h cp -f $BDDXHDR $BDDXHDR'_' sed 's/^\\(#define NONAMELESSUNION\\)/\\/*\\1*\\//' $BDDXHDR'_' >$BDDXHDR if [ x$? != x0 ]; then exit $?; fi rm $BDDXHDR'_' BDDXHDR= done # This comes straight from SVN so has no configure script if [ ! -f "./configure" ]; then ./autogen.sh fi ./configure fi if [ x$BDCOMP == x1 ]; then make fi if [ x$BDINST == x1 ]; then make install # Make SDL_config_win32.h available for prebuilt and MSVC cp -f "$BDWD/include/SDL_config_win32.h" "/usr/local/include/SDL" fi if [ x$BDSTRIP == x1 ]; then strip --strip-all /usr/local/bin/SDL.dll fi if [ x$BDCLEAN == x1 ]; then set +e make clean fi """), Dependency('Z', ['zlib-[1-9].*'], ['zlib1.dll'], """ set -e cd $BDWD if [ x$BDCONF == x1 ]; then # Use the existing gcc makefile, modified to add linker options. sed "s/dllwrap/dllwrap $LDFLAGS/" win32/Makefile.gcc >Makefile.gcc fi if [ x$BDCOMP == x1 ]; then # Build with the import library renamed. make IMPLIB='libz.dll.a' -fMakefile.gcc "CFLAGS=$CFLAGS" fi if [ x$BDINST == x1 ]; then # Have to do own install. cp -fp *.a /usr/local/lib cp -fp zlib.h /usr/local/include cp -fp zconf.h /usr/local/include cp -fp zlib1.dll /usr/local/bin fi if [ x$BDSTRIP == x1 ]; then strip --strip-all /usr/local/bin/zlib1.dll fi if [ x$BDCLEAN == x1 ]; then set +e make clean fi """), Dependency('FREETYPE', ['freetype-[2-9].*'], ['libfreetype-6.dll'], """ set -e cd $BDWD if [ x$BDCONF == x1 ]; then # Need to define inline as freetypes is compiled as -pedentic # yet stdlib.h is not. export CPPFLAGS="-Dinline=__inline__ $CPPFLAGS" ./configure fi if [ x$BDCOMP == x1 ]; then make fi if [ x$BDINST == x1 ]; then make install fi if [ x$BDSTRIP == x1 ]; then strip --strip-all /usr/local/bin/libfreetype-6.dll fi if [ x$BDCLEAN == x1 ]; then set +e make clean fi """), Dependency('FONT', ['SDL_ttf-[2-9].*'], ['SDL_ttf.dll'], """ set -e cd $BDWD if [ x$BDCONF == x1 ]; then ./configure fi if [ x$BDCOMP == x1 ]; then make fi if [ x$BDINST == x1 ]; then make install fi if [ x$BDSTRIP == x1 ]; then strip --strip-all /usr/local/bin/SDL_ttf.dll fi if [ x$BDCLEAN == x1 ]; then set +e make clean fi """), Dependency('PNG', ['libpng-[1-9].*'], ['libpng12-0.dll'], """ set -e cd $BDWD if [ x$BDCONF == x1 ]; then # This will only build a static library. ./configure --with-libpng-compat=no # Remove a duplicate entry in the def file. BDDEF=scripts/pngw32.def cp -f "$BDDEF" temp_ sed '222 s/^\\( png_malloc_warn @195\\)/;\\1/' temp_ >"$BDDEF" rm temp_ fi if [ x$BDCOMP == x1 ]; then make fi if [ x$BDINST == x1 ]; then make install # Sorry, but no one else recognizes png12 cp -f /usr/local/lib/libpng12.dll.a /usr/local/lib/libpng.dll.a fi if [ x$BDSTRIP == x1 ]; then strip --strip-all /usr/local/bin/libpng12-0.dll fi if [ x$BDCLEAN == x1 ]; then set +e make clean fi """), Dependency('JPEG', ['jpeg-[6-9]*'], ['jpeg.dll'], """ set -e cd $BDWD if [ x$BDCONF == x1 ]; then # This will only build a static library. ./configure --disable-shared fi if [ x$BDCOMP == x1 ]; then # Build the DLL as a win32 gui. make dlltool --export-all-symbols -D jpeg.dll -l libjpeg.dll.a -z in.def libjpeg.a ranlib libjpeg.dll.a gcc -shared -s $LDFLAGS -def in.def -o jpeg.dll libjpeg.a fi if [ x$BDINST == x1 ]; then # Only install the headers and import library, otherwise SDL_image will # statically link to jpeg. make install-headers cp -fp libjpeg.a /usr/local/lib cp -fp libjpeg.dll.a /usr/local/lib cp -fp jpeg.dll /usr/local/bin if [ x$? != x0 ]; then exit $?; fi fi if [ x$BDSTRIP == x1 ]; then strip --strip-all /usr/local/bin/jpeg.dll fi if [ x$BDCLEAN == x1 ]; then set +e make clean rm -f in.def rm -f libjpeg.dll.a rm -f jpeg.dll fi """), Dependency('TIFF', ['tiff-[3-9].*'], ['libtiff.dll'], """ set -e cd $BDWD if [ x$BDCONF == x1 ]; then # The shared library build does not work ./configure --disable-cxx --prefix=/usr/local --disable-shared fi if [ x$BDCOMP == x1 ]; then make # Build the DLL as a win32 gui cd libtiff gcc -shared -s $LDFLAGS -def libtiff.def -o libtiff.dll .libs/libtiff.a \ -ljpeg -lz dlltool -D libtiff.dll -d libtiff.def -l libtiff.dll.a ranlib libtiff.dll.a cd .. fi if [ x$BDINST == x1 ]; then # Don't install any libtools info files so SDL_image will not # statically link to jpeg. cd libtiff make install-data-am cp -fp .libs/libtiff.a /usr/local/lib cp -fp libtiff.dll.a /usr/local/lib cp -fp libtiff.dll /usr/local/bin if [ x$? != x0 ]; then exit $?; fi cd .. fi if [ x$BDSTRIP == x1 ]; then strip --strip-all /usr/local/bin/libtiff.dll fi if [ x$BDCLEAN == x1 ]; then set +e make clean rm -f libtiff/libtiff.dll.a rm -f libtiff/libtiff.dll fi """), Dependency('IMAGE', ['SDL_image-[1-9].*'], ['SDL_image.dll'], """ set -e cd $BDWD if [ x$BDCONF == x1 ]; then # Disable dynamic loading of image libraries as that uses the wrong DLL # search path ./configure --disable-jpeg-shared --disable-png-shared --disable-tif-shared fi if [ x$BDCOMP == x1 ]; then make fi if [ x$BDINST == x1 ]; then make install fi if [ x$BDSTRIP == x1 ]; then strip --strip-all /usr/local/bin/SDL_image.dll fi if [ x$BDCLEAN == x1 ]; then set +e make clean fi """), Dependency('SMPEG', ['smpeg-[0-9].*', 'smpeg'], ['smpeg.dll'], """ set -e cd $BDWD if [ x$BDCONF == x1 ]; then # This comes straight from SVN so has no configure script if [ ! -f "./configure" ]; then ./autogen.sh fi ./configure --disable-gtk-player --disable-opengl-player --disable-gtktest fi if [ x$BDCOMP == x1 ]; then make CXXLD='$(CXX) -no-undefined' fi if [ x$BDINST == x1 ]; then make install fi if [ x$BDSTRIP == x1 ]; then strip --strip-all /usr/local/bin/smpeg.dll fi if [ x$BDCLEAN == x1 ]; then set +e make clean fi """), Dependency('OGG', ['libogg-[1-9].*'], ['libogg-0.dll'], """ set -e cd $BDWD if [ x$BDCONF == x1 ]; then ./configure fi if [ x$BDCOMP == x1 ]; then make fi if [ x$BDINST == x1 ]; then make install fi if [ x$BDSTRIP == x1 ]; then strip --strip-all /usr/local/bin/libogg-0.dll fi if [ x$BDCLEAN == x1 ]; then set +e make clean fi """), Dependency('VORBIS', ['libvorbis-[1-9].*'], ['libvorbis-0.dll', 'libvorbisfile-3.dll'], """ set -e cd $BDWD if [ x$BDCONF == x1 ]; then ./configure fi if [ x$BDCOMP == x1 ]; then make LIBS='-logg' fi if [ x$BDINST == x1 ]; then make install fi if [ x$BDSTRIP == x1 ]; then strip --strip-all /usr/local/bin/libvorbis-0.dll strip --strip-all /usr/local/bin/libvorbisfile-3.dll fi if [ x$BDCLEAN == x1 ]; then set +e make clean fi """), Dependency('FLAC', ['flac-[1-9].*'], [], """ set -e cd $BDWD if [ x$BDCONF == x1 ]; then # Add __MINGW32__ to SIZE_T_MAX declaration test in alloc.h header. BDHDR='include/share/alloc.h' BDTMP='alloc.h_' cp -f "$BDHDR" "$BDTMP" sed 's/^# ifdef _MSC_VER$/# if defined _MSC_VER || defined __MINGW32__/' \ "$BDTMP" >"$BDHDR" rm "$BDTMP" # Will only install a static library, but that is all that is needed. ./configure --disable-shared --disable-ogg --disable-cpplibs \ --disable-doxygen-docs fi if [ x$BDCOMP == x1 ]; then make fi if [ x$BDINST == x1 ]; then cp src/libFLAC/.libs/libFLAC.a /usr/local/lib mkdir -p /usr/local/include/FLAC cp -f include/FLAC/*.h /usr/local/include/FLAC fi if [ x$BDCLEAN == x1 ]; then set +e make clean fi """), Dependency('MIXER', ['SDL_mixer-[1-9].*'], ['SDL_mixer.dll'], """ set -e cd $BDWD if [ x$BDCONF == x1 ]; then # This comes straight from SVN so has no configure script if [ ! -f "./configure" ]; then ./autogen.sh fi # Need to add Ws2_32 library for FLAC. cp -f configure configure_ sed ' s/\\(EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lFLAC\\)"/\\1 -lWs2_32"/ s/\\(LIBS="-lFLAC\\)\\( $LIBS"\\)/\\1 -lWs2_32\\2/' \ configure_ >configure rm configure_ # No dynamic loading of dependent libraries. ./configure --disable-music-ogg-shared --disable-music-mp3-shared \ --disable-music-flac-shared fi if [ x$BDCOMP == x1 ]; then make fi if [ x$BDINST == x1 ]; then make install fi if [ x$BDSTRIP == x1 ]; then strip --strip-all /usr/local/bin/SDL_mixer.dll fi if [ x$BDCLEAN == x1 ]; then set +e make clean fi """), Dependency('PORTMIDI', ['portmidi', 'portmidi-[1-9].*'], ['portmidi.dll'], """ set -e cd $BDWD if [ x$BDCONF == x1 ]; then cat > GNUmakefile << 'THE_END' # Makefile for portmidi, generated for Pygame by msys_build_deps.py. target = /usr/local pmcom = pm_common pmwin = pm_win pt = porttime pmdll = portmidi.dll pmlib = libportmidi.a pmimplib = libportmidi.dll.a pmcomsrc = $(pmcom)/portmidi.c $(pmcom)/pmutil.c pmwinsrc = $(pmwin)/pmwin.c $(pmwin)/pmwinmm_.c pmobj = portmidi.o pmutil.o pmwin.o pmwinmm_.o pmsrc = $(pmcomsrc) $(pmwinsrc) pmreqhdr = $(pmcom)/portmidi.h $(pmcom)/pmutil.h pmhdr = $(pmreqhdr) $(pmcom)/pminternal.h $(pmwin)/pmwinmm.h ptsrc = $(pt)/porttime.c porttime/ptwinmm.c ptobj = porttime.o ptwinmm.o ptreqhdr = $(pt)/porttime.h pthdr = $(ptreqhdr) src = $(pmsrc) $(ptsrc) reqhdr = $(pmreqhdr) $(ptreqhdr) hdr = $(pmhdr) $(pthdr) obj = $(pmobj) $(ptobj) def = portmidi.def IHDR := -I$(pmcom) -I$(pmwin) -I$(pt) LIBS := $(LOADLIBES) $(LDLIBS) -lwinmm all : $(pmdll) .PHONY : all $(pmwin)/pmwinmm_.c : $(pmwin)/pmwinmm.c \tsed 's_#define DEBUG.*$$_/*&*/_' < "$<" > "$@" $(pmlib) : $(src) $(hdr) \t$(CC) $(CPPFLAGS) $(IHDR) -c $(CFLAGS) $(src) \tar rc $(pmlib) $(obj) \tranlib $(pmlib) $(pmdll) : $(pmlib) $(def) \t$(CC) -shared $(LDFLAGS) -def $(def) $(pmlib) $(LIBS) -o $@ \tdlltool -D $(pmdll) -d $(def) -l $(pmimplib) \tranlib $(pmimplib) .PHONY : install install : $(pmdll) \tcp -f --target-directory=$(target)/bin $< \tcp -f --target-directory=$(target)/lib $(pmlib) \tcp -f --target-directory=$(target)/lib $(pmimplib) \tcp -f --target-directory=$(target)/include $(reqhdr) .PHONY : clean clean : \trm -f $(obj) $(pmdll) $(pmimplib) $(pmlib) $(pmwin)/pmwinmm_.c THE_END cat > portmidi.def << 'THE_END' LIBRARY portmidi.dll EXPORTS Pm_Abort Pm_Close Pm_CountDevices Pm_Dequeue Pm_Enqueue Pm_GetDefaultInputDeviceID Pm_GetDefaultOutputDeviceID Pm_GetDeviceInfo Pm_GetErrorText Pm_GetHostErrorText Pm_HasHostError Pm_Initialize Pm_OpenInput Pm_OpenOutput Pm_Poll Pm_QueueCreate Pm_QueueDestroy Pm_QueueEmpty Pm_QueueFull Pm_QueuePeek Pm_Read Pm_SetChannelMask Pm_SetFilter Pm_SetOverflow Pm_Terminate Pm_Write Pm_WriteShort Pm_WriteSysEx Pt_Sleep Pt_Start Pt_Started Pt_Stop Pt_Time pm_add_device pm_alloc pm_descriptor_index DATA pm_descriptor_max DATA pm_fail_fn pm_fail_timestamp_fn pm_free pm_hosterror DATA pm_hosterror_text DATA pm_init pm_none_dictionary DATA pm_read_bytes pm_read_short pm_success_fn pm_term pm_winmm_in_dictionary DATA pm_winmm_init pm_winmm_out_dictionary DATA pm_winmm_term THE_END fi if [ x$BDCOMP == x1 ]; then make fi if [ x$BDINST == x1 ]; then make install fi if [ x$BDSTRIP == x1 ]; then strip --strip-all /usr/local/bin/portmidi.dll fi if [ x$BDCLEAN == x1 ]; then set +e make clean rm -f GNUmakefile portmidi.def fi """), ] # End dependencies = [. msys_prep = Preparation('/usr/local', """ # Ensure /usr/local and its subdirectories exist. mkdir -p /usr/local/lib mkdir -p /usr/local/include mkdir -p /usr/local/bin mkdir -p /usr/local/doc mkdir -p /usr/local/man mkdir -p /usr/local/share """) msvcr71_prep = Preparation('msvcr71.dll linkage', r""" set -e # # msvcr71.dll support # if [ ! -f "$DBMSVCR71/libmoldname.a" ]; then mkdir -p "$DBMSVCR71" cp -fp /mingw/lib/libmoldname71.a "$DBMSVCR71/libmoldname.a" cp -fp /mingw/lib/libmoldname71d.a "$DBMSVCR71/libmoldnamed.a" cp -fp /mingw/lib/libmsvcr71.a "$DBMSVCR71/libmsvcrt.a" cp -fp /mingw/lib/libmsvcr71d.a "$DBMSVCR71/libmsvcrtd.a" fi """) if __name__ == '__main__': sys.exit(main(dependencies, msvcr71_prep, msys_prep)) pygame-1.9.1release/msys.py0000644000175000017500000002352111202451362015607 0ustar vincentvincent# module msys.py # Requires Python 2.4 or better and win32api. """MSYS specifics for Msys terminal IO and for running shell scripts exports msys_raw_input, MsysException, Msys """ from msysio import raw_input_ as msys_raw_input, print_ as msys_print from msysio import is_msys import os import time import subprocess import re import glob try: import _winreg except ImportError: import winreg as _winreg # For Python 2.x/3.x compatibility def geterror(): return sys.exc_info()[1] FSTAB_REGEX = (r'^[ \t]*(?P' r'([a-zA-Z]:){0,1}([\\/][^\s*^?:%\\/]+)+)' r'[ \t]+/mingw(\s|$)' ) def has_drive(path): """Return true if the MSYS path strats with a drive letter""" return re.match('/[A-Z]/', path, re.I) is not None class MsysException(Exception): """Path retrieval problem""" pass def find_msys_version_subdir(msys_dir): """Return the full MSYS root directory path If msys_dir path lacks the version subdirectory, e.g. 1.0, then the path is searched for one. The user will be prompted to choose if more than one version is found. """ regex = r'[\\/][1-9][.][0-9]$' if re.search(regex, msys_dir) is not None: return msys_dir roots = glob.glob(os.path.join(msys_dir, '[1-9].[0-9]')) roots.sort() roots.reverse() if not roots: raise MsysException("No msys versions found.\n") else: if len(roots) == 1: root = roots[0] else: msys_print("Select an Msys version:") for i, path in enumerate(roots): msys_print(" %d = %s" % (i+1, os.path.split(path)[1])) choice = msys_raw_input("Select 1-%d (1 = default):") if not choice: root = roots[0] else: root = roots[int(choice)-1] return root def input_msys_dir(): """Return user entered MSYS directory path May raise MsysException.""" while 1: dir_path = msys_raw_input("Enter the MSYS directory path,\n" "(or press [Enter] to quit):") dir_path = dir_path.strip() if not dir_path: raise MsysException("Input aborted by user") dir_path = os.path.abspath(dir_path) try: return find_msys_version_subdir(dir_path) except MsysException: msys_print(geterror()) def find_msys_registry(): """Return the MSYS 1.0 directory path stored in the Windows registry The return value is an encoded ascii str. The registry entry for the uninstaller is used. Raise a LookupError if not found. """ subkey = ( 'Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\MSYS-1.0_is1') try: key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, subkey) try: return _winreg.QueryValueEx(key, 'Inno Setup: App Path')[0].encode() finally: key.Close() except WindowsError: raise LookupError("MSYS not found in the registry") def as_shell(msys_root): """Append MSYS shell program to MSYS root directory path""" return os.path.join(msys_root, 'bin', 'sh.exe') def check_for_shell(msys_directory=None): """Check various locations for MSYS shell or root directory. May raise MsysException. """ if msys_directory is not None: try: dir_path = find_msys_version_subdir(msys_directory) except MsysException: pass else: return as_shell(dir_path) try: shell = os.environ['SHELL'] except KeyError: pass else: if is_msys(): return shell + '.exe' return shell try: dir_path = find_msys_registry() except LookupError: pass else: return as_shell(dir_path) return as_shell(input_msys_dir()) def find_msys_shell(msys_directory=None): """Retrun the MSYS shell program path MsysException is raised if the shell program is not found. The user is prompt is prompted as a last resort if no directory is found or there are multiple choices. """ shell = check_for_shell(msys_directory) while 1: shell = os.path.abspath(shell.replace('/', os.sep)) if os.path.isfile(shell): break msys_print("Directory %s has no MSYS shell." % shell) shell = as_shell(input_msys_dir()) return shell def find_mingw_root(msys_directory): """Return the Windows equivalent of /mingw""" # Look it up in the fstabs file. fstab_path = os.path.join(msys_directory, 'etc', 'fstab') try: fstab = open(fstab_path, 'r') except IOError: raise MsysException("Unable to open MSYS fstab file %s" % fstab_path) else: match = re.search(FSTAB_REGEX, fstab.read(), re.MULTILINE) if match is None: raise MsysException( "The required MinGW path is not in the MSYS fstab file") dir_path = os.path.abspath(match.groupdict()['path']) if not os.path.isdir(dir_path): raise MsysException("%s is not a directory" % dir_path) return dir_path class Msys(object): """Return a new Msys environment; May raise MsysException Msys([msys_directory, [require_mingw]]) msys_directory: A string giving the path of the MSYS directory. Either or both keyword arguments can be omitted. If msys_directory is not provided then the environment variable SHELL and the Windows registry are checked. Finally the user is prompted for the directory path. If require_mingw is True, the default, the mingw directory path is retrieved from the MSYS fstab file. An MsysException is raised if the required paths are not found. """ _is_msys = is_msys() def __init__(self, msys_directory=None, require_mingw=None): """New environment May raise MsysException""" if require_mingw is None: require_mingw = True self._environ = os.environ.copy() self._shell = find_msys_shell(msys_directory) self._msys_root = os.path.split(os.path.split(self.shell)[0])[0].lower() try: self._mingw_root = find_mingw_root(self.msys_root) except MsysException: if require_mingw: raise self._mingw_root = None else: self.environ['MINGW_ROOT_DIRECTORY'] = self._mingw_root environ = property(lambda self: self._environ, doc="Environment variables") shell = property(lambda self: self._shell, doc="MSYS shell program path") msys_root = property(lambda self: self._msys_root, doc="MSYS root directory path") mingw_root = property(lambda self: self._mingw_root, doc="MinGW root directory path") is_msys = property(lambda self: self._is_msys, doc="True if the execution environment is MSYS") def windows_to_msys(self, path): """Return an MSYS translation of an absolute Windows path""" msys_root = self.msys_root mingw_root = self.mingw_root path_lower = path.lower() if path_lower.startswith(msys_root.lower()): return '/usr' + path[len(msys_root):].replace(os.sep, '/') if mingw_root is not None and path_lower.startswith(mingw_root.lower()): return '/mingw' + path[len(mingw_root):].replace(os.sep, '/') drive, tail = os.path.splitdrive(path) return '/%s%s' % (drive[0], tail.replace(os.sep, '/')) def msys_to_windows(self, path): """Return a Windows translation of an MSYS path The Unix path separator is uses as it survives the distutils setup file read process. Raises a ValueError if the path cannot be translated. """ msys_root = self.msys_root mingw_root = self.mingw_root if path.startswith('/usr'): path = msys_root + path[4:] elif path.startswith('/mingw'): if mingw_root is None: raise ValueError('Unable to map the MinGW directory') path = mingw_root + path[6:] elif has_drive(path): path = path[1] + ":" + path[2:] elif path == '/': path = msys_root elif path.startswith('/'): path = msys_root + path return path.replace(os.sep, '/') def run_shell_script(self, script): """Run the MSYS shell script and return the shell return code script is a string representing the contents of the script. """ cmd = [self.shell] if not self._is_msys: cmd.append('--login') previous_cwd = os.getcwd() try: process = subprocess.Popen(cmd, stdin=subprocess.PIPE, env=self.environ) process.communicate(script) return process.returncode finally: time.sleep(2) # Allow shell subprocesses to terminate. os.chdir(previous_cwd) def run_shell_command(self, command): """Run the MSYS shell command and return stdout output as a string command is a list of strings giving the command and its arguments. The first list entry must be the MSYS path name of a bash shell script file. """ args = [self.shell] if not self._is_msys: args.append('--login') args.extend(command) previous_cwd = os.getcwd() try: return subprocess.Popen(args, stdout=subprocess.PIPE, env=self.environ).communicate()[0] finally: time.sleep(3) # Allow shell subprocesses to terminate. os.chdir(previous_cwd) __all__ = ['Msys', 'msys_raw_input', 'msys_print', 'MsysException'] pygame-1.9.1release/mingwcfg.py0000644000175000017500000000117211207055754016425 0ustar vincentvincent# module mingwcfg.py """Manage the MinGW configuration file for setup.py""" import os import sys if sys.version_info >= (3,): import functools open_ = functools.partial(open, encoding='utf-8') else: open_ = open directory = os.path.abspath(os.path.split(__file__)[0]) path = os.path.join(directory, 'mingw.cfg') def write(mingw_root): cnf = open_(path, 'w') try: cnf.write(os.path.abspath(mingw_root)) cnf.write('\n') finally: cnf.close() def read(): cnf = open_(path, 'r') try: for ln in cnf: return ln.strip() finally: cnf.close() pygame-1.9.1release/mingw32distutils.py0000644000175000017500000000261711207055754020064 0ustar vincentvincent# module mingw32distutils.py # Requires Python 2.1 or better. """Enhance distutils mingw32 compilation by adding Win32 GUI/console support.""" from distutils import ccompiler from distutils.errors import DistutilsModuleError compilers = ['mingw32', 'mingw32-console'] # Add the compiler classes to the ccompiler table. Unfortunate hacks follow. compiler_class = ccompiler.compiler_class value = compiler_class['mingw32'] assert len(value) == 3, "distutils.ccompiler.compiler_class has changed" compiler_class['mingw32'] = ('', '', value[2] + ", Win32 GUI shared libraries defaullt") compiler_class['mingw32-console'] = ('', '', value[2] + ", console shared libraries") original_new_compiler = ccompiler.new_compiler def new_compiler (plat=None, compiler=None, verbose=0, dry_run=0, force=0): """Recognizes replacement mingw32 compiler classes""" if compiler == 'mingw32': from mingw32ccompiler import Mingw32DefaultCCompiler return Mingw32DefaultCCompiler (None, dry_run, force) if compiler == 'mingw32-console': from mingw32ccompiler import Mingw32ConsoleCCompiler return Mingw32ConsoleCCompiler (None, dry_run, force) return original_new_compiler (plat, compiler, verbose, dry_run, force) ccompiler.new_compiler = new_compiler pygame-1.9.1release/mingw32ccompiler.py0000644000175000017500000001152011207055754020006 0ustar vincentvincent# module mingw32ccompiler.py # Requires Python 2.1 or better. """Win32 GUI/console versions of the distutils mingw32 compiler classes.""" from distutils.cygwinccompiler import Mingw32CCompiler def intersect (sequence_a, sequence_b): """Return true if the two sequences contain items in common If sequence_a is a non-sequence then return false. """ try: for item in sequence_a: if item in sequence_b: return 1 except TypeError: return 0 return 0 def difference (sequence_a, sequence_b): """Return a list of items in sequence_a but not in sequence_b Will raise a ValueError if either argument is not a sequence. """ new_sequence = [] for item in sequence_a: if item not in sequence_b: new_sequence.append(item) return new_sequence subsystem_options = ['-mwindows', '-mconsole'] # Item position is critical. class Mingw32DefaultCCompiler (Mingw32CCompiler): """This mingw32 compiler class builds a Win32 GUI DLL by default. It is overridden by subsystem options in the linker extras. """ def set_executables (self, **args): """Has no linker subsystem option for shared libraries""" Mingw32CCompiler.set_executables(self, **args) try: self.linker_so = difference (self.linker_so, subsystem_options) except TypeError: pass def link (self, target_desc, objects, output_filename, output_dir=None, libraries=None, library_dirs=None, runtime_library_dirs=None, export_symbols=None, debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, target_lang=None): """Do a Win32 GUI link if no subsystem option given.""" if (target_desc != self.EXECUTABLE and not intersect(subsystem_options, extra_preargs) and not intersect(subsystem_options, extra_postargs)): try: extra_preargs = extra_preargs + subsystem_options[0] except TypeError: extra_preargs = subsystem_options[0:1] Mingw32CCompiler.link (self, target_desc, objects, output_filename, output_dir, libraries, library_dirs, runtime_library_dirs, export_symbols, debug, extra_preargs, extra_postargs, build_temp, target_lang) class Mingw32ConsoleCCompiler (Mingw32CCompiler): """This mingw32 compiler class builds a console DLL. It is not overridden by subsystem options in the linker extras. """ def set_executables (self, **args): """Has console subsystem linker option for shared libraries.""" Mingw32CCompiler.set_executables(self, **args) try: linker_so = difference(self.linker_so, subsystem_options) except TypeError: linker_so = subsystem_options[1:2] else: linker_so.append(subsystem_options[1]) self.linker_so = linker_so def link (self, target_desc, objects, output_filename, output_dir=None, libraries=None, library_dirs=None, runtime_library_dirs=None, export_symbols=None, debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, target_lang=None): """Do a console link.""" if target_desc != self.EXECUTABLE: try: extra_preargs = difference(extra_preargs, subsystem_options) except TypeError: pass try: extra_postargs = difference(extra_postargs, subsystem_options) except TypeError: pass Mingw32CCompiler.link (self, target_desc, objects, output_filename, output_dir, libraries, library_dirs, runtime_library_dirs, export_symbols, debug, extra_preargs, extra_postargs, build_temp, target_lang) pygame-1.9.1release/MANIFEST.in0000644000175000017500000000040611236507623016006 0ustar vincentvincentinclude Setup.in Setup_Darwin.in Setup_Win_Common.in *.py WHATSNEW readme.txt install.html readme.html LGPL recursive-include docs * recursive-include lib * recursive-include src * recursive-include examples * recursive-include test * prune */CVS prune */*/CVS pygame-1.9.1release/makeref.py0000644000175000017500000003022411202644537016234 0ustar vincentvincent#!/usr/bin/env python import os, glob def sortkey(x): return os.path.basename(x).lower() def sort_list_by_keyfunc(alist, akey): """ sort(key=sortkey) is only in python2.4. this is not inplace like list.sort() """ # make a list of tupples with the key as the first. keys_and_list = list( zip(map(akey, alist), alist) ) keys_and_list.sort() alist = list( map(lambda x:x[1], keys_and_list) ) return alist def collect_doc_files(): # ABSPATH ONLY WORKS FOR docs_as_dict # # if __name__ == '__main__': Run() # must be ran from in trunk dir # get files and shuffle ordering trunk_dir = os.path.abspath(os.path.dirname(__file__)) src_dir = os.path.join(trunk_dir, 'src') lib_dir = os.path.join(trunk_dir, 'lib') pygame_doc = os.path.join(src_dir, "pygame.doc") files = ( glob.glob(os.path.join(src_dir,'*.doc')) + glob.glob(os.path.join(lib_dir,'*.doc')) ) files.remove(pygame_doc) #XXX: sort(key=) is only available in >= python2.4 # files.sort(key=sortkey) files = sort_list_by_keyfunc(files, sortkey) files.insert(0, pygame_doc) return files def Run(): from optparse import OptionParser parser = OptionParser() parser.add_option("", "--no-code-docs", dest="have_code_docs", action="store_false", default=True, help="No python documentation in code.") (options, args) = parser.parse_args() files = collect_doc_files() for file in files: # print file print (os.path.basename(file)) docs = [] pages = [] for f in files: name = os.path.splitext(os.path.basename(f))[0] pages.append(name) d = name, Doc('', open(f, "U")) docs.append(d) #pages.sort(key=str.lower) pages = sort_list_by_keyfunc(pages, str.lower) pages.insert(0, "index") index = {} justDocs = [] for name, doc in docs: justDocs.append(doc) MakeIndex(name, doc, index) for name, doc in docs: fullname = os.path.join("docs","ref","%s.html") % name outFile = open(fullname, "w") outFile.write(HTMLHeader % name) WritePageLinks(outFile, pages) outFile.write(HTMLMid) HtmlOut(doc, index, outFile) outFile.write(HTMLFinish) outFile.close() outFile = open(os.path.join("src", "pygamedocs.h"), "w") outFile.write("/* Auto generated file: with makeref.py . Docs go in src/ *.doc . */\n") for doc in justDocs: WriteDocHeader(outFile, doc, options.have_code_docs) outFile.write("\n\n/* Docs in a comments... slightly easier to read. */\n\n\n/*") # add the docs as comments to the header file. for doc in justDocs: WriteDocHeaderComments(outFile, doc) outFile.write("\n\n*/\n\n") topDoc = LayoutDocs(justDocs) outFile = open(os.path.join("docs","ref","index.html"), "w") outFile.write(HTMLHeader % "Index") WritePageLinks(outFile, pages) outFile.write(HTMLMid) outFile.write("
      \n\n") WriteIndex(outFile, index, topDoc) outFile.write("\n\n
    \n") outFile.write(HTMLFinish) outFile.close() def HtmlOut(doc, index, f): f.write('\n\n\n' % doc.fullname) f.write("%s
      \n" % doc.fullname) if doc.descr: f.write(" %s
      \n" % doc.descr) if doc.protos: for p in doc.protos: f.write(" %s
      \n" % p) if doc.kids: f.write("
        \n") for kid in doc.kids: f.write(" \n" % (index.get(kid.fullname + "()"), kid.descr or "")) f.write("
        %s%s
      \n") if doc.docs: pre = False for d in doc.docs: if d[0] == '*': f.write("
        \n") for li in d[1:].split('*'): txt = HtmlPrettyWord(li) f.write("
      • %s
      • \n" % txt) f.write("
      \n") else: txt, pre = HtmlPrettyLine(d, index, pre) f.write(txt) if pre: f.write("\n") else: f.write("  
      \n") f.write("") f.write("  
      \n") if doc.kids: for k in doc.kids: HtmlOut(k, index, f) f.write("
    \n") def HtmlPrettyWord(word): if "." in word[:-1] or word.isupper(): return "%s" % word return word def HtmlPrettyLine(line, index, pre): pretty = "" if line[0].isspace(): if not pre: pretty += "
    "
                pre = True
        elif pre:
            pre = False
            pretty += "
    " if not pre: pretty += "

    " for word in line.split(): if word[-1] in ",.": finish = word[-1] word = word[:-1] else: finish = "" link = index.get(word) if link: pretty += "%s%s " % (link, finish) elif word.isupper() or "." in word[1:-1]: pretty += "%s%s " % (word, finish) else: pretty += "%s%s " % (word, finish) pretty += "

    \n" else: pretty += line + "\n" return pretty, pre def WritePageLinks(outFile, pages): links = [] for page in pages[1:]: link = '
    %s' % (page, page.title()) links.append(link) outFile.write(" || \n".join(links)) #outFile.write("\n

    \n\n") def MakeIndex(name, doc, index): if doc.fullname: link = '%s - %s' % (name, doc.fullname, doc.fullname, doc.descr) index[doc.fullname + "()"] = link if doc.kids: for kid in doc.kids: MakeIndex(name, kid, index) def LayoutDocs(docs): levels = {} for doc in docs: if doc.fullname: topName = doc.fullname.split(".")[-1] levels[topName] = doc top = levels["pygame"] for doc in docs: if doc is top: continue #print (doc) if doc.fullname: parentName = doc.fullname.split(".")[-2] else: parentName = "" parent = levels.get(parentName) if parent is not None: parent.kids.append(doc) return top def WriteIndex(outFile, index, doc): link = index.get(doc.fullname + "()", doc.fullname) outFile.write("
  • %s
  • \n" % link) if doc.kids: outFile.write("
      \n") sortKids = list(doc.kids) #print(sortKids) sortKids = sort_list_by_keyfunc(sortKids, lambda x: x.fullname) #sortKids = sorted( sortKids ) for kid in sortKids: WriteIndex(outFile, index, kid) outFile.write("
    \n") def WriteDocHeader(f, doc, have_code_docs ): name = doc.fullname.replace(".", "") name = name.replace("_", "") name = name.upper() defineName = "DOC_" + name text = "" if have_code_docs: if doc.protos: text = "\\n".join(doc.protos) if doc.descr: if text: text += "\\n" text += doc.descr f.write('#define %s "%s"\n\n' % (defineName, text)) if doc.kids: for kid in doc.kids: WriteDocHeader(f, kid, have_code_docs) def WriteDocHeaderComments(f, doc): name = doc.fullname defineName = name text = "" if doc.protos: text = "\n".join(doc.protos) if doc.descr: if text: text += "\n" text += doc.descr text = text.replace("\\n", "\n") #f.write('\n\n/*\n%s\n %s\n\n*/' % (defineName, text)) f.write('\n\n%s\n %s\n\n' % (defineName, text)) if doc.kids: for kid in doc.kids: WriteDocHeaderComments(f, kid) class Doc(object): def __init__(self, parentname, f): self.kids = None self.protos = [] self.docs = None self.descr = "" self.name = "" self.fullname = "" self.finished = False curdocline = "" while True: line = f.readline() if not line: break line = line.rstrip() if line == "": if curdocline: self.docs.append(curdocline) curdocline = "" self.finished = True break if self.kids is not None: kid = Doc(self.fullname, f) if kid: self.kids.append(kid) if line == "
    ": if curdocline: self.docs.append(curdocline) curdocline = "" self.kids = [] continue if line: if self.docs is not None: if line[0].isspace(): if curdocline: self.docs.append(curdocline) curdocline = "" self.docs.append(line) else: curdocline += line + " " elif not self.name: self.name = line if len(line) > 1 and line[0] == '"' and line[-1] == '"': self.fullname = line[1:-1] elif parentname: splitparent = parentname.split(".") if splitparent[-1][0].isupper(): self.fullname = splitparent[-1] + "." + line else: self.fullname = parentname + "." + line else: self.fullname = line elif not self.descr: self.descr = line else: self.protos.append(line) else: if self.docs is not None: if curdocline: self.docs.append(curdocline) curdocline = "" elif self.name and self.kids is None: self.docs = [] def __repr__(self): return "" % self.name def __nonzero__(self): return self.finished def __cmp__(self, b): return cmp(self.name.lower(), b.name.lower()) def docs_as_dict(): """ Dict Format: {'pygame.rect.Rect.center': 'Rect.center: ...' ...} Generally works, has some workarounds, inspect results manually. """ import pygame files = collect_doc_files() def make_mapping(doc, parent_name): docs = {} for k in doc.kids: if k.docs: kid_name = k.fullname if parent_name == 'pygame': if hasattr(pygame.base, k.name): kid_name = '%s.%s' % ('pygame.base', k.name) elif not kid_name.startswith(parent_name): kid_name = '%s.%s' % (parent_name, kid_name) docs[kid_name] = '\n'.join(k.docs) if k.kids: docs.update(make_mapping(k, parent_name)) return docs mapping = {} for f in files: doc = Doc('', open(f, "U")) mapping.update(make_mapping(doc, doc.name.lower())) return mapping HTMLHeader = """ %s - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    """ HTMLMid = """

    """ HTMLFinish = """ """ if __name__ == '__main__': Run() pygame-1.9.1release/make_prebuilt.py0000644000175000017500000001772611227461214017455 0ustar vincentvincentimport msys from distutils.extension import read_setup_file import os import re import sys prebuilt_dir = 'prebuilt' lib_subdir = 'lib' class MakePrebuiltError(Exception): pass def file_copy(src, dest): if os.path.isdir(dest): dest = os.path.join(dest, os.path.split(src)[1]) s = open(src, 'rb') try: d = open(dest, 'wb') try: d.write(s.read()) print "%s => %s" % (src, dest) finally: d.close() finally: s.close() def find_import_libraries(path, roots): match = re.compile(r'lib(%s)\.dll\.a$' % '|'.join(roots)).match return [name for name in os.listdir(path) if match(name) is not None] def copy_dir(src, dest): if dest == '.': ignore, dest = os.path.split(src) if src == dest: raise IOError("%s: Source and destination are identical" % src) mkdir(dest) for name in os.listdir(src): src_path = os.path.join(src, name) if os.path.isfile(src_path): file_copy(src_path, os.path.join(dest, name)) def confirm(message): "ask a yes/no question, return result" reply = msys.msys_raw_input("\n%s [Y/n]:" % message) if reply and reply[0].lower() == 'n': return 0 return 1 created_dirs = set() def mkdir(path): path = os.path.abspath(path) if path in created_dirs: pass elif not os.path.exists(path): os.mkdir(path) created_dirs.add(path) elif not os.path.isdir(path): raise MakePrebuiltError("%s is not a directory" % path) def main(dest_dir=None): # Top level directories. if dest_dir is None: dest_dir = prebuilt_dir if re.match(r'([A-Za-z]:){0,1}[^"<>:|?*]+$', dest_dir) is None: print "Invalid directory path name %s" % dest_dir return 1 dest_dir = os.path.abspath(dest_dir) if os.path.isdir(dest_dir): if not confirm("Directory %s already exists;\ncontinue" % dest_dir): return 1 mkdir(dest_dir) m = msys.Msys() src_dir = os.path.join(m.msys_root, 'local') prebuilt_template = os.path.abspath('prebuilt-template') dest_lib_dir = os.path.join(dest_dir, lib_subdir) # Read setup file. src_file = os.path.join(prebuilt_template, 'Setup_Win.in') file_copy(src_file, dest_dir) deps = read_setup_file(src_file) setup_in = open(src_file) match = re.compile('[A-Z_][A-Z0-9_]* *=(.*)').match header_dir_pat = re.compile(' -I([^ ]+)') lib_pat = re.compile(' -l([^ ]+)') macros = [] for line in setup_in: matches = match(line) if matches is not None: flags = matches.group(1) header_dirs = header_dir_pat.findall(flags) libs = lib_pat.findall(flags) macros.append((header_dirs, libs)) # Copy DLLs. src_bin_dir = os.path.join(src_dir, 'bin') have_dlls = set() for dep in deps: path_elements = dep.library_dirs[0].split('/') # / required by setup. dll_name = path_elements[-1] src_dll_path = os.path.join(src_bin_dir, dll_name) if os.path.exists(src_dll_path): if path_elements[0] == '.': path_elements = path_elements[2:] else: path_elements = path_elements[1:] dest_dll_dir = dest_dir for dir_name in path_elements[:-1]: dest_dll_dir = os.path.join(dest_dll_dir, dir_name) mkdir(dest_dll_dir) file_copy(os.path.join(src_bin_dir, dll_name), os.path.join(dest_dll_dir, dll_name)) have_dlls.add(dep.name[8:]) # Copy required import libraries only. copied_files = set() src_lib_dir = os.path.join(src_dir, 'lib') mkdir(dest_lib_dir) for ignore, libs in macros: use = False for lib in libs: if lib in have_dlls: use = True break if use and lib not in copied_files: copied_files.add(lib) lib_name = 'lib%s.dll.a' % lib src_lib_path = os.path.join(src_lib_dir, lib_name) if not os.path.exists(src_lib_path): print "Missing import library %s" % lib_name return 1 file_copy(src_lib_path, os.path.join(dest_lib_dir, lib_name)) # Copy required header directories only. copied_dirs = set() for header_dirs, libs in macros: use = False for lib in libs: if lib in have_dlls: use = True break if use: for header_dir in header_dirs: path_elements = header_dir.split('/') if path_elements[0] == '.': path_elements = path_elements[2:] else: path_elements = path_elements[1:] src_header_dir = os.path.join(src_dir, *path_elements) if not os.path.exists(src_header_dir): print "Missing include directory %s" % src_header_dir return 1 dest_header_dir = dest_dir for dir_name in path_elements: dest_header_dir = os.path.join(dest_header_dir, dir_name) mkdir(dest_header_dir) if not src_header_dir in copied_dirs: copy_dir(src_header_dir, dest_header_dir) copied_dirs.add(src_header_dir) if 'SDL' in have_dlls: # For MSVC use SDL_config_win32.h in place of configure # generated SDL_config.h. file_copy( os.path.join(src_dir, 'include', 'SDL', 'SDL_config_win32.h'), os.path.join(dest_dir, 'include', 'SDL', 'SDL_config.h')) # msvcr71.dll linking support. src_msvcr71_dir = os.path.join(src_dir, 'lib', 'msvcr71') dest_msvcr71_dir = os.path.join(dest_dir, 'lib', 'msvcr71') copy_dir(src_msvcr71_dir, dest_msvcr71_dir) # Def file bat. make_defs = open(os.path.join(dest_lib_dir, 'MakeDefs.bat'), 'w') try: make_defs.write('@echo off\n' 'rem Make .def files needed for .lib file creation.\n' 'rem Requires pexports.exe on the search path\n' 'rem (found in altbinutils-pe as SourceForge,\n' 'rem http://sourceforge.net/projects/mingwrep/).\n\n') for dep in deps: dll_name = os.path.split(dep.library_dirs[0])[1] lib = dep.name[8:] lib_name = 'lib%s.dll.a' % lib if os.path.exists(os.path.join(dest_lib_dir, lib_name)): start = '' else: start = 'rem ' make_defs.write('%spexports %s >%s.def\n' % (start, dll_name, lib)) finally: make_defs.close() # Lib import files bat. make_libs = open(os.path.join(dest_lib_dir, 'MakeLibs.bat'), 'w') try: make_libs.write('@echo off\n' 'rem Make .lib import libraries.\n' 'rem Requires Visual C++ Studio or Toolkit.\n' 'rem VCVARS32.BAT (VCVARS64.BAT (?) for 64 bit build)\n' 'rem must be run first to use LIB.EXE.\n\n') for dep in deps: dll_name = os.path.split(dep.library_dirs[0])[1] lib = dep.name[8:] lib_name = 'lib%s.dll.a' % lib if os.path.exists(os.path.join(dest_lib_dir, lib_name)): start = '' else: start = 'rem ' make_libs.write('%sLIB.EXE /NOLOGO /DEF:%s.def /MACHINE:IX86 /OUT:%s.lib\n' % (start, lib, lib)) finally: make_libs.close() # Top level make batch file for 32 bit build. file_copy(os.path.join(prebuilt_template, 'Make32.bat'), dest_lib_dir) return 0 if __name__ =='__main__': dest_dir = None if len(sys.argv) > 1: dest_dir = sys.argv[1] try: sys.exit(main(dest_dir)) except MakePrebuiltError, e: print "*** %s; execution halted" % e sys.exit(1) pygame-1.9.1release/LGPL0000644000175000017500000006347610767613027014755 0ustar vincentvincent GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This 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 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! pygame-1.9.1release/install.html0000644000175000017500000002036310777531062016613 0ustar vincentvincentPygame Installation

    Pygame Installation

    Python can be built from source, but the easiest way is to get a binary package for your type of system and version of Python. This document will give you information on either type of installation.

    Windows Binary Installer

    This is probably the most popular method of installation. If you are running on windows, it is highly recommended you use this form of installing. The installers come with with nearly everything you need, and have an easy point and click installers.

    The first thing you will need is an installation of Python. Python binary installers make it easy to get this done. Pygame binaries usually come for the latest 2 releases of Python, so you'll want to be fairly up to date.

    Once that is in place, you want to download the appropriate windows binary. From the pygame downloads page you can find the .EXE file you need. This will automatically install all of pygame and all the SDL dependencies. The windows binaries have filenames like this; "http://www3.telus.net/len_l/pygame-1.8.0release.win32-py2.5.msi". This would be the installer for pygame version 1.8.0, for Python version 2.5. You shouldn't have trouble finding the correct binary from the "Windows" section of the download page. http://www.pygame.org/download.shtml.

    You will also probably want to install the windows documentation and installation package. This will add easy links to the different documentation and games that come with pygame. The installer for this is found next to the other windows binary downloads. The filename looks like this; "pygame-docs-1.8.0.exe". And this would install the documentation and examples for pygame-1.8.0

    One other thing the windows binaries are missing is the Numeric or numpy Python packages. You can easily install this separately and it will allow you to use the pygame "surfarray" module. This module is optional, so there is no need to do this. A Numeric for Windows python 2.5 can be found on the download page: http://www.pygame.org/download.shtml. There are older binary installers from the Numeric download page. http://sourceforge.net/project/showfiles.php?group_id=1369.

    PixelArray, which is built into pygame 1.8+, and is usually quite a lot faster is the recommended array implementation to use. Numpy is newer than Numeric, however both are not entirely compatible.


    Unix Binary Packages

    For many unix systems, the easiest way to install pygame is from source. Still, there are binary packages available for different distributions.

    There are several binary RPM packages for linux machines. These are actually a little bit of work to install, since you will also need several RPM packages for the dependencies. There is a good chance your linux distribution came with the needed dependencies (like Python and SDL). There are binary RPMs available from the website for each dependency.

    For debian systems, pygame is actively maintained in the debian archives. Visit the debian pygame page for more information. http://packages.qa.debian.org/p/pygame.html

    FreeBSD also has an active pygame package. While techinicaly it isn't binary, it is automatically built and installed by the ports manager. See the FreeBSD package page for more information. http://www.freebsdports.info/ports/devel/py-game.html

    Gentoo has a builtin package for pygame. This is compiled for your system as it installs, similar to BSD, http://packages.gentoo.org/package/dev-python/pygame


    Mac OS X Binaries

    For Mac OS X 10.3 and above, binary packages are available from http://www.pygame.org/download.shtml

    This package includes almost of the dependencies required for pygame (SDL, SDL_image, etc.), but you need PyObjC 1.2 or later, and may also want to get Numeric, numpy and PyOpenGL. A PyObjC 1.4 installer is also made available on the download page.

    If you want to use the Apple system python, you will need to compile from source at this time - since most people prefer to leave the system python alone, and use the python downloaded from python.org. See http://pygame.org/wiki/MacCompile for current instructions for compiling from source on Mac OSX.

    pygame is also available from the fink, and macports distributions.

    To build self-contained pygame applications, you should use py2app. There is an example in: /Developer/Python/pygame/Examples/macosx/aliens_app_example




    Installing From Source

    Compiling and installing pygame is handled by Python's distutils. Pygame also comes with some scripts to automatically configure the flags needed to build pygame. Use the "setup.py" script to start the installation.

    The first time you run the setup script, it will call the "config.py" script. This will build a "Setup" file which stores all the information needed to compile. The "config.py" will do a good job of detecting what dependencies are available and where they are located. If it isn't perfect, it is easy to build your own, or edit the created "Setup" text file. This "Setup" file is a simple Makefile-like text file. It defines variables needed to use each dependency, and then enables all the pygame modules with found dependencies. If you have trouble compiling, you should be able to easily fix any problems inside the "Setup" file.

    Running the "setup.py" script will call distutils to build and install the pygame package. Distutils actually supports a wide variety of compile and install options. running "python setup.py help" will start to show you the different options available. You can change many things like install locations, compiler to use, and more. Calling the "setup.py" script with no arguments and it will just ask you if you want the default flags needed to compile and install.


    Windows Compiling Info

    You can compile pygame on windows with mingw (gcc for windows) and also with visual studio. Up to date details can be found here: http://pygame.org/wiki/CompileWindows


    Unix Compiling Info

    Compiling from linux shouldn't give you any problems. One thing you must keep in mind is that most linux RPM packages separate the actual library from the "dev" files needed to compile. To build you will need to make sure the packages like "SDL-dev" are installed.

    You can check to see if SDL is ready to be built from by running the command sdl-config and seeing if it is found. If the sdl-config script is not on the path (or you have more than one?) Set the environment variable SDL_CONFIG to its location.

    Sometimes you will have the SDL libraries installed in once location, and the other SDL libraries in another. This tricks the pygame config scripts, but you can help it out by setting the environment LOCALBASE to a path prefix where the other libraries are. The common case for this is SDL installed in /usr and other SDL libs installed in /usr/local. The command for this situation is "LOCALBASE=/usr/local python setup.py install".


    Mac OS X Compiling Info

    Up to date instructions for compiling on Mac OS X can be found here: http://pygame.org/wiki/MacCompile


    pygame-1.9.1release/dll.py0000644000175000017500000000444111202451362015367 0ustar vincentvincent# dll.py module """DLL specifics Configured for the Pygame 1.9.0 dependencies as built by msys_build_deps.py. """ # Some definitions: # Library name (name): An internal identifier, a string, for a library. # e.g. FONT # Library file root (root): The library root used in linker -l options. # e.g. SDL_mixer import re # Table of dependencies. # name, root, File regex, Dependency list of names libraries = [ ('MIXER', 'SDL_mixer', r'SDL_mixer\.dll$', ['SDL', 'VORBISFILE', 'SMPEG']), ('VORBISFILE', 'vorbisfile', r'libvorbisfile-3\.dll$', ['VORBIS']), ('VORBIS', 'vorbis', r'libvorbis-0\.dll$', ['OGG']), ('OGG', 'ogg', r'libogg-0\.dll$', []), ('SMPEG', 'smpeg', r'smpeg\.dll$', ['SDL']), ('IMAGE', 'SDL_image', r'SDL_image\.dll$', ['SDL', 'JPEG', 'PNG', 'TIFF']), ('TIFF', 'tiff', r'libtiff\.dll$', ['JPEG', 'Z']), ('JPEG', 'jpeg', r'jpeg\.dll$', []), ('PNG', 'png12', r'libpng12-0\.dll$', ['Z']), ('FONT', 'SDL_ttf', r'SDL_ttf\.dll$', ['SDL']), ('FREETYPE', 'freetype', r'libfreetype-6\.dll$', ['Z']), ('Z', 'z', r'zlib1\.dll$', []), ('SDL', 'SDL', r'SDL\.dll$', []), ('PORTMIDI', 'portmidi', r'portmidi\.dll', []), ('PORTTIME', 'portmidi', r'portmidi\.dll', []), ] # regexs: Maps name to DLL file name regex. # lib_dependencies: Maps name to list of dependencies. # file_root_names: Maps name to root. regexs = {} lib_dependencies = {} file_root_names = {} for name, root, ignore1, ignore2 in libraries: file_root_names[name] = root for name, root, regex, deps in libraries: regexs[name] = regex lib_dependencies[root] = [file_root_names[d] for d in deps] del name, root, regex, deps, ignore1, ignore2 def tester(name): """For a library name return a function which tests dll file names""" def test(file_name): """Return true if file name f is a valid DLL name""" return match(file_name) is not None match = re.compile(regexs[name], re.I).match test.library_name = name # Available for debugging. return test def name_to_root(name): """Return the library file root for the library name""" return file_root_names[name] def libraries(name): """Return the library file roots this library links too""" return lib_dependencies[name_to_root(name)] pygame-1.9.1release/distutils_mods.py0000644000175000017500000000340710227340532017665 0ustar vincentvincent#purpose: a few changes to distutils to build betterer. # - fixes up paths when using msys. # # import os import distutils.cygwinccompiler distutils.cygwinccompiler.oldMingw32CCompiler= distutils.cygwinccompiler.Mingw32CCompiler """ Should put the above imports at the top of your file. and after them put import distutils_mods distutils.cygwinccompiler.Mingw32 = distutils_mods.mingcomp """ from distutils.errors import DistutilsExecError class mingcomp(distutils.cygwinccompiler.oldMingw32CCompiler): def spawn(self, cmd): """ Because spawn uses a straight call to the systems underlying shell, bypassing the string handling goodness of mingw/msys something gets fubared. So this little hack method was put in its place. """ self.verbose = 1 if self.verbose: print "cmd :%s:" % cmd cmpl = " ".join(cmd) cmpl = cmpl.replace("\\", "/") cmpl = cmpl.replace("c:", "/c") cmpl = cmpl.replace("C:", "/c") cmpl = cmpl.replace("gcc", "gcc -g ") if self.verbose: print "cmpl is :%s:" % cmpl if not self.dry_run: import tempfile tmpfn = tempfile.mktemp(suffix='run_compiler') tmpf = open(tmpfn, "w+b") tmpf.write(cmpl) tmpf.close() r = os.system("sh %s" % tmpfn) os.remove(tmpfn) if r != 0: raise DistutilsExecError, \ "command '%s' failed with exit status :%d: command was :%s:. " % (cmd[0], r, cmpl) if self.verbose: print "return value of the compile command is :%s:" % r distutils.cygwinccompiler.Mingw32CCompiler= mingcomp pygame-1.9.1release/config_win.py0000644000175000017500000002221711207055754016751 0ustar vincentvincent"""Config on Windows""" # **** The search part is broken. For instance, the png Visual Studio project # places to dll in a directory not checked by this module. from setup_win_common import get_definitions import os, sys import re from glob import glob from distutils.sysconfig import get_python_inc try: raw_input except NameError: raw_input = input huntpaths = ['..', '..\\..', '..\\*', '..\\..\\*'] class Dependency(object): inc_hunt = ['include'] lib_hunt = ['VisualC\\SDL\\Release', 'VisualC\\Release', 'Release', 'lib'] def __init__(self, name, wildcards, libs=None, required = 0): if libs is None: libs = [] self.name = name self.wildcards = wildcards self.required = required self.paths = [] self.path = None self.inc_dir = None self.lib_dir = None self.libs = libs self.found = False self.cflags = '' def hunt(self): parent = os.path.abspath('..') for p in huntpaths: for w in self.wildcards: found = glob(os.path.join(p, w)) found.sort() or found.reverse() #reverse sort for f in found: if f[:5] == '..'+os.sep+'..' and \ os.path.abspath(f)[:len(parent)] == parent: continue if os.path.isdir(f): self.paths.append(f) def choosepath(self): if not self.paths: print ("Path for %s not found." % self.name) if self.required: print ('Too bad that is a requirement! Hand-fix the "Setup"') elif len(self.paths) == 1: self.path = self.paths[0] print ("Path for %s:' % self.name") else: print ("Select path for %s:" % self.name) for i in range(len(self.paths)): print (" %i=%s" % (i + 1, self.paths[i])) print (" %i = " % 0) choice = raw_input("Select 0-%i (1=default):" % len(self.paths)) if not choice: choice = 1 else: choice = int(choice) if(choice): self.path = self.paths[choice-1] def findhunt(self, base, paths): for h in paths: hh = os.path.join(base, h) if os.path.isdir(hh): return hh.replace('\\', '/') return base.replace('\\', '/') def configure(self): self.hunt() self.choosepath() if self.path: self.found = True self.inc_dir = self.findhunt(self.path, Dependency.inc_hunt) self.lib_dir = self.findhunt(self.path, Dependency.lib_hunt) class DependencyPython(object): def __init__(self, name, module, header): self.name = name self.lib_dir = '' self.inc_dir = '' self.libs = [] self.cflags = '' self.found = False self.ver = '0' self.module = module self.header = header def configure(self): self.found = True if self.module: try: self.ver = __import__(self.module).__version__ except ImportError: self.found = False if self.found and self.header: fullpath = os.path.join(get_python_inc(0), self.header) if not os.path.isfile(fullpath): found = 0 else: self.inc_dir = os.path.split(fullpath)[0] if self.found: print ("%-8.8s: found %s" % (self.name, self.ver)) else: print ("%-8.8s: not found" % self.name) class DependencyDLL(Dependency): def __init__(self, dll_regex, lib=None, wildcards=None, libs=None, link=None): if lib is None: lib = link.libs[0] Dependency.__init__(self, 'COPYLIB_' + lib, wildcards, libs) self.lib_name = lib self.test = re.compile(dll_regex, re.I).match self.lib_dir = '_' self.found = True self.link = link def configure(self): if self.link is None and self.wildcards: self.hunt() self.choosepath() else: self.path = self.link.path if self.path is not None: self.hunt_dll() def hunt_dll(self): for dir in self.lib_hunt: path = os.path.join(self.path, dir) try: entries = os.listdir(path) except: pass else: for e in entries: if self.test(e) and os.path.isfile(os.path.join(path, e)): # Found self.lib_dir = os.path.join(path, e).replace('\\', '/') print ("DLL for %s is %s" % (self.lib_name, self.lib_dir)) return print ("DLL for %s not found" % self.lib_name) class DependencyWin(object): def __init__(self, name, cflags): self.name = name self.inc_dir = None self.lib_dir = None self.libs = [] self.found = True self.cflags = cflags def configure(self): pass class DependencyGroup(object): def __init__(self): self.dependencies =[] self.dlls = [] def add(self, name, lib, wildcards, dll_regex, libs=None, required=0): if libs is None: libs = [] dep = Dependency(name, wildcards, [lib], required) self.dependencies.append(dep) self.dlls.append(DependencyDLL(dll_regex, link=dep, libs=libs)) def add_win(self, name, cflags): self.dependencies.append(DependencyWin(name, cflags)) def add_dll(self, dll_regex, lib=None, wildcards=None, libs=None, link_lib=None): link = None if link_lib is not None: name = 'COPYLIB_' + link_lib for d in self.dlls: if d.name == name: link = d break else: raise KeyError("Link lib %s not found" % link_lib) self.dlls.append(DependencyDLL(dll_regex, lib, wildcards, libs, link)) def configure(self): for d in self: d.configure() def __iter__(self): for d in self.dependencies: yield d for d in self.dlls: yield d DEPS = DependencyGroup() DEPS.add('SDL', 'SDL', ['SDL-[1-9].*'], r'(lib){0,1}SDL\.dll$', required=1) DEPS.add('FONT', 'SDL_ttf', ['SDL_ttf-[2-9].*'], r'(lib){0,1}SDL_ttf\.dll$', ['SDL', 'z']) DEPS.add('IMAGE', 'SDL_image', ['SDL_image-[1-9].*'], r'(lib){0,1}SDL_image\.dll$', ['SDL', 'jpeg', 'png', 'tiff'], 0), DEPS.add('MIXER', 'SDL_mixer', ['SDL_mixer-[1-9].*'], r'(lib){0,1}SDL_mixer\.dll$', ['SDL', 'vorbisfile', 'smpeg']) DEPS.add('SMPEG', 'smpeg', ['smpeg-[0-9].*', 'smpeg'], r'smpeg\.dll$', ['SDL']) DEPS.add('PNG', 'png', ['libpng-[1-9].*'], r'(png|libpng13)\.dll$', ['z']) DEPS.add('JPEG', 'jpeg', ['jpeg-[6-9]*'], r'(lib){0,1}jpeg\.dll$') DEPS.add('PORTMIDI', 'portmidi', ['portmidi'], r'portmidi\.dll$') #DEPS.add('PORTTIME', 'porttime', ['porttime'], r'porttime\.dll$') DEPS.add_dll(r'(lib){0,1}tiff\.dll$', 'tiff', ['tiff-[3-9].*'], ['jpeg', 'z']) DEPS.add_dll(r'(z|zlib1)\.dll$', 'z', ['zlib-[1-9].*']) DEPS.add_dll(r'(libvorbis-0|vorbis)\.dll$', 'vorbis', ['libvorbis-[1-9].*'], ['ogg']) DEPS.add_dll(r'(libvorbisfile-3|vorbisfile)\.dll$', 'vorbisfile', link_lib='vorbis', libs=['vorbis']) DEPS.add_dll(r'(libogg-0|ogg)\.dll$', 'ogg', ['libogg-[1-9].*']) for d in get_definitions(): DEPS.add_win(d.name, d.value) def setup_prebuilt(): setup = open('Setup', 'w') try: try: setup_win_in = open(os.path.join('prebuilt', 'Setup_Win.in')) except IOError: raise IOError("prebuilt missing required Setup_Win.in") # Copy Setup.in to Setup, replacing the BeginConfig/EndConfig # block with prebuilt\Setup_Win.in . setup_in = open('Setup.in') try: do_copy = True for line in setup_in: if line.startswith('#--StartConfig'): do_copy = False setup.write(setup_win_in.read()) try: setup_win_common_in = open('Setup_Win_Common.in') except: pass else: try: setup.write(setup_win_common_in.read()) finally: setup_win_common_in.close() elif line.startswith('#--EndConfig'): do_copy = True elif do_copy: setup.write(line) finally: setup_in.close() finally: setup.close() def main(): if os.path.isdir('prebuilt'): reply = raw_input('\nUse the SDL libraries in "prebuilt"? [Y/n]') if not reply or reply[0].lower() != 'n': setup_prebuilt() raise SystemExit() global DEPS DEPS.configure() return list(DEPS) if __name__ == '__main__': print ("""This is the configuration subscript for Windows. Please run "config.py" for full configuration.""") pygame-1.9.1release/config_unix.py0000644000175000017500000001503711207055754017141 0ustar vincentvincent"""Config on Unix""" import os, sys from glob import glob from distutils.sysconfig import get_python_inc # Python 2.x/3.x compatibility try: raw_input except NameError: raw_input = input configcommand = os.environ.get('SDL_CONFIG', 'sdl-config',) configcommand = configcommand + ' --version --cflags --libs' localbase = os.environ.get('LOCALBASE', '') #these get prefixes with '/usr' and '/usr/local' or the $LOCALBASE origincdirs = ['/include', '/include/SDL', '/include/SDL', '/include/smpeg' ] origlibdirs = ['/lib','/lib64','/X11R6/lib'] def confirm(message): "ask a yes/no question, return result" reply = raw_input('\n' + message + ' [Y/n]:') if reply and (reply[0].lower()) == 'n': return 0 return 1 class DependencyProg: def __init__(self, name, envname, exename, minver, defaultlibs): self.name = name command = os.environ.get(envname, exename) self.lib_dir = '' self.inc_dir = '' self.libs = [] self.cflags = '' try: config = os.popen(command + ' --version --cflags --libs').readlines() flags = ' '.join(config[1:]).split() # remove this GNU_SOURCE if there... since python has it already, # it causes a warning. if '-D_GNU_SOURCE=1' in flags: flags.remove('-D_GNU_SOURCE=1') self.ver = config[0].strip() if minver and self.ver < minver: err= 'WARNING: requires %s version %s (%s found)' % (self.name, self.ver, minver) raise ValueError(err) self.found = 1 self.cflags = '' for f in flags: if f[:2] in ('-l', '-D', '-I', '-L'): self.cflags += f + ' ' elif f[:3] == '-Wl': self.cflags += '-Xlinker ' + f + ' ' if self.name == 'SDL': inc = '-I' + '/usr/X11R6/include' self.cflags = inc + ' ' + self.cflags except: print ('WARNING: "%s" failed!' % command) self.found = 0 self.ver = '0' self.libs = defaultlibs def configure(self, incdirs, libdir): if self.found: print (self.name + ' '[len(self.name):] + ': found ' + self.ver) self.found = 1 else: print (self.name + ' '[len(self.name):] + ': not found') class Dependency: def __init__(self, name, checkhead, checklib, libs): self.name = name self.inc_dir = None self.lib_dir = None self.libs = libs self.found = 0 self.checklib = checklib self.checkhead = checkhead self.cflags = '' def configure(self, incdirs, libdirs): incname = self.checkhead libnames = self.checklib, self.name.lower() if incname: for dir in incdirs: path = os.path.join(dir, incname) if os.path.isfile(path): self.inc_dir = dir for dir in libdirs: for name in libnames: path = os.path.join(dir, name) if filter(os.path.isfile, glob(path+'*')): self.lib_dir = dir if (incname and self.lib_dir and self.inc_dir) or (not incname and self.lib_dir): print (self.name + ' '[len(self.name):] + ': found') self.found = 1 else: print (self.name + ' '[len(self.name):] + ': not found') class DependencyPython: def __init__(self, name, module, header): self.name = name self.lib_dir = '' self.inc_dir = '' self.libs = [] self.cflags = '' self.found = 0 self.ver = '0' self.module = module self.header = header def configure(self, incdirs, libdirs): self.found = 1 if self.module: try: self.ver = __import__(self.module).__version__ except ImportError: self.found = 0 if self.found and self.header: fullpath = os.path.join(get_python_inc(0), self.header) if not os.path.isfile(fullpath): self.found = 0 else: self.inc_dir = os.path.split(fullpath)[0] if self.found: print (self.name + ' '[len(self.name):] + ': found', self.ver) else: print (self.name + ' '[len(self.name):] + ': not found') sdl_lib_name = 'SDL' def main(): print ('\nHunting dependencies...') DEPS = [ DependencyProg('SDL', 'SDL_CONFIG', 'sdl-config', '1.2', ['sdl']), Dependency('FONT', 'SDL_ttf.h', 'libSDL_ttf.so', ['SDL_ttf']), Dependency('IMAGE', 'SDL_image.h', 'libSDL_image.so', ['SDL_image']), Dependency('MIXER', 'SDL_mixer.h', 'libSDL_mixer.so', ['SDL_mixer']), DependencyProg('SMPEG', 'SMPEG_CONFIG', 'smpeg-config', '0.4.3', ['smpeg']), Dependency('PNG', 'png.h', 'libpng', ['png']), Dependency('JPEG', 'jpeglib.h', 'libjpeg', ['jpeg']), Dependency('SCRAP', '', 'libX11', ['X11']), Dependency('PORTMIDI', 'portmidi.h', 'libportmidi.so', ['portmidi']), Dependency('PORTTIME', 'porttime.h', 'libporttime.so', ['porttime']), #Dependency('GFX', 'SDL_gfxPrimitives.h', 'libSDL_gfx.so', ['SDL_gfx']), ] if not DEPS[0].found: print ('Unable to run "sdl-config". Please make sure a development version of SDL is installed.') raise SystemExit if localbase: incdirs = [localbase+d for d in origincdirs] libdirs = [localbase+d for d in origlibdirs] else: incdirs = [] libdirs = [] incdirs += ["/usr"+d for d in origincdirs] libdirs += ["/usr"+d for d in origlibdirs] incdirs += ["/usr/local"+d for d in origincdirs] libdirs += ["/usr/local"+d for d in origlibdirs] for arg in DEPS[0].cflags.split(): if arg[:2] == '-I': incdirs.append(arg[2:]) elif arg[:2] == '-L': libdirs.append(arg[2:]) for d in DEPS: d.configure(incdirs, libdirs) for d in DEPS[1:]: if not d.found: if not confirm(""" Warning, some of the pygame dependencies were not found. Pygame can still compile and install, but games that depend on those missing dependencies will not run. Would you like to continue the configuration?"""): raise SystemExit break return DEPS if __name__ == '__main__': print ("""This is the configuration subscript for Unix. Please run "config.py" for full configuration.""") pygame-1.9.1release/config_msys.py0000644000175000017500000002307611201733045017141 0ustar vincentvincent# Requires Python 2.4 or better and win32api. """Config on Msys mingw This version expects the Pygame 1.9.0 dependencies as built by msys_build_deps.py """ import dll from setup_win_common import get_definitions import msys import os, sys, string from glob import glob from distutils.sysconfig import get_python_inc configcommand = os.environ.get('SDL_CONFIG', 'sdl-config',) configcommand = configcommand + ' --version --cflags --libs' localbase = os.environ.get('LOCALBASE', '') #these get prefixes with '/usr/local' and /mingw or the $LOCALBASE origincdirs = ['/include', '/include/SDL', '/include/SDL11', '/include/smpeg', '/include/libpng12', ] origlibdirs = ['/lib'] class ConfigError(Exception): pass def path_join(a, *p): return os.path.join(a, *p).replace(os.sep, '/') path_split = os.path.split def print_(*args, **kwds): return msys.msys_print(*args, **kwds) def confirm(message): "ask a yes/no question, return result" reply = msys.msys_raw_input("\n%s [Y/n]:" % message) if reply and string.lower(reply[0]) == 'n': return 0 return 1 class DependencyProg: needs_dll = True def __init__(self, name, envname, exename, minver, msys, defaultlibs=None): if defaultlibs is None: defaultlibs = [dll.name_to_root(name)] self.name = name try: command = os.environ[envname] except KeyError: command = exename else: drv, pth = os.path.splitdrive(command) if drv: command = '/' + drv[0] + pth self.lib_dir = '' self.inc_dir = '' self.libs = [] self.cflags = '' try: config = msys.run_shell_command([command, '--version', '--cflags', '--libs']) ver, flags = config.split('\n', 1) self.ver = ver.strip() flags = flags.split() if minver and self.ver < minver: err= 'WARNING: requires %s version %s (%s found)' % (self.name, self.ver, minver) raise ValueError, err self.found = 1 self.cflags = '' for f in flags: if f[:2] in ('-I', '-L'): self.cflags += f[:2] + msys.msys_to_windows(f[2:]) + ' ' elif f[:2] in ('-l', '-D'): self.cflags += f + ' ' elif f[:3] == '-Wl': self.cflags += '-Xlinker ' + f + ' ' except: print_('WARNING: "%s" failed!' % command) self.found = 0 self.ver = '0' self.libs = defaultlibs def configure(self, incdirs, libdir): if self.found: print_(self.name + ' '[len(self.name):] + ': found ' + self.ver) self.found = 1 else: print_(self.name + ' '[len(self.name):] + ': not found') class Dependency: needs_dll = True def __init__(self, name, checkhead, checklib, libs=None): if libs is None: libs = [dll.name_to_root(name)] self.name = name self.inc_dir = None self.lib_dir = None self.libs = libs self.found = 0 self.checklib = checklib self.checkhead = checkhead self.cflags = '' def configure(self, incdirs, libdirs): self.find_inc_dir(incdirs) self.find_lib_dir(libdirs) if self.lib_dir and self.inc_dir: print_(self.name + ' '[len(self.name):] + ': found') self.found = 1 else: print_(self.name + ' '[len(self.name):] + ': not found') def find_inc_dir(self, incdirs): incname = self.checkhead for dir in incdirs: path = path_join(dir, incname) if os.path.isfile(path): self.inc_dir = dir return def find_lib_dir(self, libdirs): libname = self.checklib for dir in libdirs: path = path_join(dir, libname) if filter(os.path.isfile, glob(path+'*')): self.lib_dir = dir return class DependencyPython: needs_dll = False def __init__(self, name, module, header): self.name = name self.lib_dir = '' self.inc_dir = '' self.libs = [] self.cflags = '' self.found = 0 self.ver = '0' self.module = module self.header = header def configure(self, incdirs, libdirs): self.found = 1 if self.module: try: self.ver = __import__(self.module).__version__ except ImportError: self.found = 0 if self.found and self.header: fullpath = path_join(get_python_inc(0), self.header) if not os.path.isfile(fullpath): self.found = 0 else: self.inc_dir = os.path.split(fullpath)[0] if self.found: print_(self.name + ' '[len(self.name):] + ': found', self.ver) else: print_(self.name + ' '[len(self.name):] + ': not found') class DependencyDLL: needs_dll = False def __init__(self, name, libs=None): if libs is None: libs = dll.libraries(name) self.name = 'COPYLIB_' + dll.name_to_root(name) self.inc_dir = None self.lib_dir = '_' self.libs = libs self.found = 1 # Alway found to make its COPYLIB work self.cflags = '' self.lib_name = name self.file_name_test = dll.tester(name) def configure(self, incdirs, libdirs, start=None): omit = [] if start is not None: if self.set_path(start): return omit.append(start) p, f = path_split(start) if f == 'lib' and self.set_path(path_join(p, 'bin')): return omit.append(start) # Search other directories for dir in libdirs: if dir not in omit: if self.set_path(dir): return p, f = path_split(dir) if f == 'lib' and self.set_path(path_join(p, 'bin')): # cond. and return def set_path(self, wdir): test = self.file_name_test try: files = os.listdir(wdir) except: pass else: for f in files: if test(f) and os.path.isfile(path_join(wdir, f)): # Found self.lib_dir = path_join(wdir, f) return True # Not found return False class DependencyWin: needs_dll = False def __init__(self, name, cflags): self.name = name self.inc_dir = None self.lib_dir = None self.libs = [] self.found = 1 self.cflags = cflags def configure(self, incdirs, libdirs): pass def main(): m = msys.Msys(require_mingw=False) print_('\nHunting dependencies...') DEPS = [ DependencyProg('SDL', 'SDL_CONFIG', 'sdl-config', '1.2.13', m), Dependency('FONT', 'SDL_ttf.h', 'libSDL_ttf.dll.a'), Dependency('IMAGE', 'SDL_image.h', 'libSDL_image.dll.a'), Dependency('MIXER', 'SDL_mixer.h', 'libSDL_mixer.dll.a'), DependencyProg('SMPEG', 'SMPEG_CONFIG', 'smpeg-config', '0.4.3', m), Dependency('PNG', 'png.h', 'libpng12.dll.a'), Dependency('JPEG', 'jpeglib.h', 'libjpeg.dll.a'), Dependency('PORTMIDI', 'portmidi.h', 'libportmidi.dll.a'), Dependency('PORTTIME', 'portmidi.h', 'libportmidi.dll.a'), DependencyDLL('TIFF'), DependencyDLL('VORBISFILE'), DependencyDLL('VORBIS'), DependencyDLL('OGG'), DependencyDLL('FREETYPE'), DependencyDLL('Z'), ] if not DEPS[0].found: print_('Unable to run "sdl-config". Please make sure a development version of SDL is installed.') sys.exit(1) if localbase: incdirs = [localbase+d for d in origincdirs] libdirs = [localbase+d for d in origlibdirs] else: incdirs = [] libdirs = [] incdirs += [m.msys_to_windows("/usr/local"+d) for d in origincdirs] libdirs += [m.msys_to_windows("/usr/local"+d) for d in origlibdirs] if m.mingw_root is not None: incdirs += [m.msys_to_windows("/mingw"+d) for d in origincdirs] libdirs += [m.msys_to_windows("/mingw"+d) for d in origlibdirs] for arg in string.split(DEPS[0].cflags): if arg[:2] == '-I': incdirs.append(arg[2:]) elif arg[:2] == '-L': libdirs.append(arg[2:]) dll_deps = [] for d in DEPS: d.configure(incdirs, libdirs) if d.needs_dll: dll_dep = DependencyDLL(d.name) dll_dep.configure(incdirs, libdirs, d.lib_dir) dll_deps.append(dll_dep) DEPS += dll_deps for d in get_definitions(): DEPS.append(DependencyWin(d.name, d.value)) for d in DEPS: if isinstance(d, DependencyDLL): if d.lib_dir == '': print_("DLL for %-12s: not found" % d.lib_name) else: print_("DLL for %-12s: %s" % (d.lib_name, d.lib_dir)) for d in DEPS[1:]: if not d.found: if not confirm(""" Warning, some of the pygame dependencies were not found. Pygame can still compile and install, but games that depend on those missing dependencies will not run. Would you like to continue the configuration?"""): raise SystemExit() break return DEPS if __name__ == '__main__': print_("""This is the configuration subscript for MSYS. Please run "config.py" for full configuration.""") pygame-1.9.1release/config_darwin.py0000644000175000017500000000777011225305200017427 0ustar vincentvincent"""Config on Darwin w/ frameworks""" import os, sys, string from glob import glob from distutils.sysconfig import get_python_inc class Dependency: libext = '.a' def __init__(self, name, checkhead, checklib, libs): self.name = name self.inc_dir = None self.lib_dir = None self.libs = libs self.found = 0 self.checklib = checklib + self.libext self.checkhead = checkhead self.cflags = '' def configure(self, incdirs, libdirs): incname = self.checkhead libnames = self.checklib, self.name.lower() for dir in incdirs: path = os.path.join(dir, incname) if os.path.isfile(path): self.inc_dir = dir break for dir in libdirs: for name in libnames: path = os.path.join(dir, name) if os.path.isfile(path): self.lib_dir = dir break if self.lib_dir and self.inc_dir: print (self.name + ' '[len(self.name):] + ': found') self.found = 1 else: print (self.name + ' '[len(self.name):] + ': not found') class FrameworkDependency(Dependency): def configure(self, incdirs, libdirs): BASE_DIRS = '/', os.path.expanduser('~/'), '/System/' for n in BASE_DIRS: n += 'Library/Frameworks/' fmwk = n + self.libs + '.framework/Versions/Current/' if os.path.isfile(fmwk + self.libs): print ('Framework ' + self.libs + ' found') self.found = 1 self.inc_dir = fmwk + 'Headers' self.cflags = ( '-Xlinker "-framework" -Xlinker "' + self.libs + '"' + ' -Xlinker "-F' + n + '"') self.origlib = self.libs self.libs = '' return print ('Framework ' + self.libs + ' not found') class DependencyPython: def __init__(self, name, module, header): self.name = name self.lib_dir = '' self.inc_dir = '' self.libs = [] self.cflags = '' self.found = 0 self.ver = '0' self.module = module self.header = header def configure(self, incdirs, libdirs): self.found = 1 if self.module: try: self.ver = __import__(self.module).__version__ except ImportError: self.found = 0 if self.found and self.header: fullpath = os.path.join(get_python_inc(0), self.header) if not os.path.isfile(fullpath): found = 0 else: self.inc_dir = os.path.split(fullpath)[0] if self.found: print (self.name + ' '[len(self.name):] + ': found', self.ver) else: print (self.name + ' '[len(self.name):] + ': not found') DEPS = [ FrameworkDependency('SDL', 'SDL.h', 'libSDL', 'SDL'), FrameworkDependency('FONT', 'SDL_ttf.h', 'libSDL_ttf', 'SDL_ttf'), FrameworkDependency('IMAGE', 'SDL_image.h', 'libSDL_image', 'SDL_image'), FrameworkDependency('MIXER', 'SDL_mixer.h', 'libSDL_mixer', 'SDL_mixer'), FrameworkDependency('SMPEG', 'smpeg.h', 'libsmpeg', 'smpeg'), Dependency('PNG', 'png.h', 'libpng', ['png']), Dependency('JPEG', 'jpeglib.h', 'libjpeg', ['jpeg']), Dependency('SCRAP', '','',[]), Dependency('PORTMIDI', 'portmidi.h', 'libportmidi', ['portmidi']), FrameworkDependency('PORTTIME', 'CoreMidi.h', 'CoreMidi', 'CoreMidi'), ] def main(): global DEPS print ('Hunting dependencies...') incdirs = ['/usr/local/include','/opt/local/include'] libdirs = ['/usr/local/lib','/opt/local/lib'] newconfig = [] for d in DEPS: d.configure(incdirs, libdirs) DEPS[0].cflags = '-Ddarwin '+ DEPS[0].cflags return DEPS if __name__ == '__main__': print ("""This is the configuration subscript for OSX Darwin. Please run "config.py" for full configuration.""") pygame-1.9.1release/config.py0000644000175000017500000001151111225305200016047 0ustar vincentvincent#!/usr/bin/env python # For MinGW build requires Python 2.4 or better and win32api. """Quick tool to help setup the needed paths and flags in your Setup file. This will call the appropriate sub-config scripts automatically. each platform config file only needs a "main" routine that returns a list of instances. the instances must contain the following variables. name: name of the dependency, as references in Setup (SDL, FONT, etc) inc_dir: path to include lib_dir: library directory lib: name of library to be linked to found: true if the dep is available cflags: extra compile flags """ import msysio import mingwcfg import sys, os, shutil def print_(*args, **kwds): """Simular to the Python 3.0 print function""" # This not only supports MSYS but is also a head start on the move to # Python 3.0. Also, this function can be overridden for testing. msysio.print_(*args, **kwds) def confirm(message): "ask a yes/no question, return result" reply = msysio.raw_input_("\n%s [Y/n]:" % message) if reply and reply[0].lower() == 'n': return False return True def is_msys_mingw(): """Return true if this in an MinGW/MSYS build The user may prompted for confirmation so only call this function once. """ if msysio.is_msys(): return 1 if ('MINGW_ROOT_DIRECTORY' in os.environ or os.path.isfile(mingwcfg.path)): return confirm("Is this an mingw/msys build") return 0 def prepdep(dep, basepath): "add some vars to a dep" if dep.libs: dep.line = dep.name + ' =' for lib in dep.libs: dep.line += ' -l' + lib else: dep.line = dep.name + ' = -I.' dep.varname = '$('+dep.name+')' if not dep.found: if dep.name == 'SDL': #fudge if this is unfound SDL dep.line = 'SDL = -I/NEED_INC_PATH_FIX -L/NEED_LIB_PATH_FIX -lSDL' dep.varname = '$('+dep.name+')' dep.found = 1 return inc = lid = lib = "" if basepath: if dep.inc_dir: inc = ' -I$(BASE)'+dep.inc_dir[len(basepath):] if dep.lib_dir: lid = ' -L$(BASE)'+dep.lib_dir[len(basepath):] else: if dep.inc_dir: inc = ' -I' + dep.inc_dir if dep.lib_dir: lid = ' -L' + dep.lib_dir libs = '' for lib in dep.libs: libs += ' -l' + lib if dep.name.startswith('COPYLIB_'): dep.line = dep.name + libs + lid else: dep.line = dep.name+' =' + inc + lid + ' ' + dep.cflags + libs def writesetupfile(deps, basepath, additional_lines): "create a modified copy of Setup.in" origsetup = open('Setup.in', 'r') newsetup = open('Setup', 'w') line = '' while line.find('#--StartConfig') == -1: newsetup.write(line) line = origsetup.readline() while line.find('#--EndConfig') == -1: line = origsetup.readline() if basepath: newsetup.write('BASE = ' + basepath + '\n') for d in deps: newsetup.write(d.line + '\n') lines = origsetup.readlines() lines.extend(additional_lines) for line in lines: useit = 1 if not line.startswith('COPYLIB'): for d in deps: if line.find(d.varname)!=-1 and not d.found: useit = 0 newsetup.write('#'+line) break if useit: newsetup.write(line) def main(): additional_platform_setup = [] if (sys.platform == 'win32' and # Note that msys builds supported for 2.6 and greater. Use prebuilt. (sys.version_info >= (2, 6) or not is_msys_mingw())): print_('Using WINDOWS configuration...\n') import config_win as CFG elif sys.platform == 'win32': print_('Using WINDOWS mingw/msys configuration...\n') import config_msys as CFG elif sys.platform == 'darwin': print_('Using Darwin configuration...\n') import config_darwin as CFG additional_platform_setup = open("Setup_Darwin.in", "r").readlines() else: print_('Using UNIX configuration...\n') import config_unix as CFG if os.path.isfile('Setup'): if "-auto" in sys.argv or confirm('Backup existing "Setup" file'): shutil.copyfile('Setup', 'Setup.bak') if not "-auto" in sys.argv and os.path.isdir('build'): if confirm('Remove old build directory (force recompile)'): shutil.rmtree('build', 0) deps = CFG.main() if deps: basepath = None for d in deps: prepdep(d, basepath) writesetupfile(deps, basepath, additional_platform_setup) print_("""\nIf you get compiler errors during install, doublecheck the compiler flags in the "Setup" file.\n""") else: print_("""\nThere was an error creating the Setup file, check for errors or make a copy of "Setup.in" and edit by hand.""") if __name__ == '__main__': main() pygame-1.9.1release/check_test.py0000644000175000017500000000206111131725456016735 0ustar vincentvincent# Program check_test.py # Requires Python 2.4 """A program for listing the modules accessed by a Pygame unit test module Usage: python check_test.py e.g. python check_test.py surface_test.py The returned list will show which Pygame modules were imported and accessed. Each module name is followed by a list of attributes accessed. """ import sys import os import trackmod trackmod.begin(pattern=['pygame', 'pygame.*'], continuous=True, submodule_accesses=False) skip = set(['pygame.locals', 'pygame.constants', 'pygame.base', 'pygame.threads']) os.chdir('test') test_file = sys.argv[1] del sys.argv[1] try: execfile(test_file) finally: trackmod.end() print "=== Pygame package submodule accesses ===" print accesses = [(n, a) for n, a in trackmod.get_accesses().iteritems() if n not in skip] accesses.sort(key=lambda t: t[0]) for name, attributes in accesses: print "%s (%s)" % (name, ', '.join(attributes)) pygame-1.9.1release/bundle_docs.py0000644000175000017500000000367310770024204017103 0ustar vincentvincent#! /usr/bin/env python """Tar-zip the Pygame documents and examples Run this script from the Pygame source root directory. """ import os import tarfile import re def add_files(bundle, root, alias, file_names): for file_name in file_names: file_alias = os.path.join(alias, file_name) print " ", file_name, "-->", file_alias bundle.add(os.path.join(root, file_name), file_alias) def add_directory(bundle, root, alias): reject_dirs = re.compile(r'(.svn)$') # Since it is the file extension that is of interest the reversed # file name is checked. reject_files_reversed = re.compile(r'((~.*)|(cyp\..*))') for sub_root, directories, files in os.walk(root): directories[:] = [d for d in directories if reject_dirs.match(d) is None] files[:] = [f for f in files if reject_files_reversed.match(f[-1::-1]) is None] sub_alias = os.path.join(alias, sub_root[len(root)+1:]) add_files(bundle, sub_root, sub_alias, files) def main(): bundle_name_elements = ['pygame', 'docs'] setup = open('setup.py', 'r') try: match = re.search(r'"version":[ \t]+"([0-9]+\.[0-9]+)\.[^"]+"', setup.read()) finally: setup.close() if match is None: print "*** Unable to find Pygame version in setup.py" version = '' else: version = '-%s' % match.group(1) bundle_name = 'pygame%s-docs-and-examples.tar.gz' % version print "Creating bundle", bundle_name bundle = tarfile.open(bundle_name, 'w:gz') try: root = os.path.abspath('.') alias = 'pygame' add_files(bundle, root, alias, ['LGPL', 'readme.html', 'install.html']) add_directory(bundle, os.path.join(root, 'docs'), os.path.join(alias, 'docs')) add_directory(bundle, os.path.join(root, 'examples'), os.path.join(alias, 'examples')) print "\nFinished", bundle_name finally: bundle.close() if __name__ == '__main__': main() pygame-1.9.1release/bdist_mpkg_support.py0000644000175000017500000000200711176715722020544 0ustar vincentvincent# only enable bdist_mpkg if it's installed already import pkg_resources try: pkg_resources.require('bdist_mpkg>=0.4.2') except pkg_resources.DistributionNotFound: raise ImportError try: unicode except NameError: def unicode(s): return s FRAMEWORKS = ['SDL', 'SDL_ttf', 'SDL_image', 'SDL_mixer', 'smpeg'] CUSTOM_SCHEMES = dict( examples=dict( description=unicode('(Optional) pygame example code'), prefix='/Developer/Python/pygame/Examples', source='examples', ), docs=dict( description=unicode('(Optional) pygame documentation'), prefix='/Developer/Python/pygame/Documentation', source='docs', ), ) for framework in FRAMEWORKS: CUSTOM_SCHEMES[framework] = dict( description=unicode('(Required) %s.framework') % (framework,), prefix='/Library/Frameworks/%s.framework' % (framework,), source='/Library/Frameworks/%s.framework' % (framework,), ) options = dict(bdist_mpkg=dict(custom_schemes=CUSTOM_SCHEMES)) pygame-1.9.1release/test/transform_test.py0000644000175000017500000006047611207055754020671 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import test_not_implemented, unittest else: from test import test_utils from test.test_utils import test_not_implemented, unittest import pygame import pygame.transform from pygame.locals import * import platform def show_image(s, images = []): #pygame.display.init() size = s.get_rect()[2:] screen = pygame.display.set_mode(size) screen.blit(s, (0,0)) pygame.display.flip() pygame.event.pump() going = True idx = 0 while going: events = pygame.event.get() for e in events: if e.type == QUIT: going = False if e.type == KEYDOWN: if e.key in [K_s, K_a]: if e.key == K_s: idx += 1 if e.key == K_a: idx -= 1 s = images[idx] screen.blit(s, (0,0)) pygame.display.flip() pygame.event.pump() else: going = False pygame.display.quit() pygame.display.init() def threshold(return_surf, surf, color, threshold = (0,0,0), diff_color = (0,0,0), change_return = True ): """ given the color it makes return_surf only have areas with the given colour. """ width, height =surf.get_width(), surf.get_height() if change_return: return_surf.fill(diff_color) try: r, g, b = color except ValueError: r, g, b, a = color try: tr, tg, tb = color except ValueError: tr, tg, tb, ta = color similar = 0 for y in xrange(height): for x in xrange(width): c1 = surf.get_at((x,y)) if ( (abs(c1[0] - r) < tr) & (abs(c1[1] - g) < tg) & (abs(c1[2] - b) < tb) ): # this pixel is within the threshold. if change_return: return_surf.set_at((x,y), c1) similar += 1 #else: # print c1, c2 return similar class TransformModuleTest( unittest.TestCase ): #class TransformModuleTest( object ): #def assertEqual(self, x,x2): # print x,x2 def test_scale__alpha( self ): """ see if set_alpha information is kept. """ s = pygame.Surface((32,32)) s.set_alpha(55) self.assertEqual(s.get_alpha(),55) s = pygame.Surface((32,32)) s.set_alpha(55) s2 = pygame.transform.scale(s, (64,64)) s3 = s.copy() self.assertEqual(s.get_alpha(),s3.get_alpha()) self.assertEqual(s.get_alpha(),s2.get_alpha()) def test_scale__destination( self ): """ see if the destination surface can be passed in to use. """ s = pygame.Surface((32,32)) s2 = pygame.transform.scale(s, (64,64)) s3 = s2.copy() s3 = pygame.transform.scale(s, (64,64), s3) pygame.transform.scale(s, (64,64), s2) # the wrong size surface is past in. Should raise an error. self.assertRaises(ValueError, pygame.transform.scale, s, (33,64), s3) if 1: s = pygame.Surface((32,32)) s2 = pygame.transform.smoothscale(s, (64,64)) s3 = s2.copy() s3 = pygame.transform.smoothscale(s, (64,64), s3) pygame.transform.smoothscale(s, (64,64), s2) # the wrong size surface is past in. Should raise an error. self.assertRaises(ValueError, pygame.transform.smoothscale, s, (33,64), s3) def test_threshold__honors_third_surface(self): # __doc__ for threshold as of Tue 07/15/2008 # pygame.transform.threshold(DestSurface, Surface, color, threshold = # (0,0,0,0), diff_color = (0,0,0,0), change_return = True, Surface = # None): return num_threshold_pixels # When given the optional third # surface, it would use the colors in that rather than the "color" # specified in the function to check against. # New in pygame 1.8 ################################################################ # Sizes (w, h) = size = (32, 32) # the original_color is within the threshold of the threshold_color threshold = (20, 20, 20, 20) original_color = (25,25,25,25) threshold_color = (10, 10, 10, 10) # Surfaces original_surface = pygame.Surface(size, pygame.SRCALPHA, 32) dest_surface = pygame.Surface(size, pygame.SRCALPHA, 32) # Third surface is used in lieu of 3rd position arg color third_surface = pygame.Surface(size, pygame.SRCALPHA, 32) # Color filling original_surface.fill(original_color) third_surface.fill(threshold_color) ################################################################ # All pixels for color should be within threshold # pixels_within_threshold = pygame.transform.threshold ( dest_surface, original_surface, threshold_color, threshold, 0, # diff_color 0 # change_return ) self.assertEqual(w*h, pixels_within_threshold) ################################################################ # This should respect third_surface colors in place of 3rd arg # color Should be the same as: surface.fill(threshold_color) # all within threshold pixels_within_threshold = pygame.transform.threshold ( dest_surface, original_surface, 0, # color (would fail if honored) threshold, 0, # diff_color 0, # change_return third_surface, ) self.assertEqual(w*h, pixels_within_threshold) ################################################################ # Change dest_surface on return (not expected) change_color = (255, 10, 10, 10) pixels_within_threshold = pygame.transform.threshold ( dest_surface, original_surface, 0, # color threshold, change_color, # diff_color 1, # change_return third_surface, ) # Return, of pixels within threshold is correct self.assertEqual(w*h, pixels_within_threshold) # Size of dest surface is correct dest_rect = dest_surface.get_rect() dest_size = dest_rect.size self.assertEqual(size, dest_size) # The color is not the change_color specified for every pixel As all # pixels are within threshold for pt in test_utils.rect_area_pts(dest_rect): self.assert_(dest_surface.get_at(pt) != change_color) ################################################################ # Lowering the threshold, expecting changed surface pixels_within_threshold = pygame.transform.threshold ( dest_surface, original_surface, 0, # color 0, # threshold change_color, # diff_color 1, # change_return third_surface, ) # Return, of pixels within threshold is correct self.assertEqual(0, pixels_within_threshold) # Size of dest surface is correct dest_rect = dest_surface.get_rect() dest_size = dest_rect.size self.assertEqual(size, dest_size) # The color is the change_color specified for every pixel As all # pixels are not within threshold for pt in test_utils.rect_area_pts(dest_rect): self.assertEqual(dest_surface.get_at(pt), change_color) #XXX def test_threshold_non_src_alpha(self): result = pygame.Surface((10,10)) s1 = pygame.Surface((10,10)) s2 = pygame.Surface((10,10)) s3 = pygame.Surface((10,10)) s4 = pygame.Surface((10,10)) result = pygame.Surface((10,10)) x = s1.fill((0,0,0)) x = s2.fill((0,20,0)) x = s3.fill((0,0,0)) x = s4.fill((0,0,0)) s1.set_at((0,0), (32, 20, 0 )) s2.set_at((0,0), (33, 21, 0 )) s2.set_at((3,0), (63, 61, 0 )) s3.set_at((0,0), (112, 31, 0 )) s4.set_at((0,0), (11, 31, 0 )) s4.set_at((1,1), (12, 31, 0 )) self.assertEqual( s1.get_at((0,0)), (32, 20, 0, 255) ) self.assertEqual( s2.get_at((0,0)), (33, 21, 0, 255) ) self.assertEqual( (0,0), (s1.get_flags(), s2.get_flags())) #All one hundred of the pixels should be within the threshold. #>>> object_tracking.diff_image(result, s1, s2, threshold = 20) #100 similar_color = (255, 255, 255,255) diff_color=(222,0,0,255) threshold_color = (20,20,20,255) rr = pygame.transform.threshold(result, s1, similar_color, threshold_color, diff_color, 1, s2) self.assertEqual(rr, 99) self.assertEqual( result.get_at((0,0)), (255,255,255, 255) ) rr = pygame.transform.threshold(result, s1, similar_color, threshold_color, diff_color, 2, s2) self.assertEqual(rr, 99) self.assertEqual( result.get_at((0,0)), (32, 20, 0, 255) ) # this is within the threshold, # so the color is copied from the s1 surface. self.assertEqual( result.get_at((1,0)), (0, 0, 0, 255) ) # this color was not in the threshold so it has been set to diff_color self.assertEqual( result.get_at((3,0)), (222, 0, 0, 255) ) def test_threshold__uneven_colors(self): (w,h) = size = (16, 16) original_surface = pygame.Surface(size, pygame.SRCALPHA, 32) dest_surface = pygame.Surface(size, pygame.SRCALPHA, 32) original_surface.fill(0) threshold_color_template = [5, 5, 5, 5] threshold_template = [6, 6, 6, 6] ################################################################ for pos in range(len('rgb')): threshold_color = threshold_color_template[:] threshold = threshold_template[:] threshold_color[pos] = 45 threshold[pos] = 50 pixels_within_threshold = pygame.transform.threshold ( dest_surface, original_surface, threshold_color, threshold, 0, # diff_color 0 # change_return ) self.assertEqual(w*h, pixels_within_threshold) ################################################################ def test_threshold__surface(self): """ """ #pygame.transform.threshold(DestSurface, Surface, color, threshold = (0,0,0,0), diff_color = (0,0,0,0), change_return = True): return num_threshold_pixels threshold = pygame.transform.threshold s1 = pygame.Surface((32,32), SRCALPHA, 32) s2 = pygame.Surface((32,32), SRCALPHA, 32) s3 = pygame.Surface((1,1), SRCALPHA, 32) s1.fill((40,40,40)) s2.fill((255,255,255)) dest_surface = s2 surface1 = s1 color = (30,30,30) the_threshold = (11,11,11) diff_color = (255,0,0) change_return = 2 # set the similar pixels in destination surface to the color # in the first surface. num_threshold_pixels = threshold(dest_surface, surface1, color, the_threshold, diff_color, change_return) #num_threshold_pixels = threshold(s2, s1, (30,30,30)) self.assertEqual(num_threshold_pixels, s1.get_height() * s1.get_width()) self.assertEqual(s2.get_at((0,0)), (40, 40, 40, 255)) if 1: # only one pixel should not be changed. s1.fill((40,40,40)) s2.fill((255,255,255)) s1.set_at( (0,0), (170, 170, 170) ) # set the similar pixels in destination surface to the color # in the first surface. num_threshold_pixels = threshold(s2, s1, (30,30,30), (11,11,11), (0,0,0), 2) #num_threshold_pixels = threshold(s2, s1, (30,30,30)) self.assertEqual(num_threshold_pixels, (s1.get_height() * s1.get_width()) -1) self.assertEqual(s2.get_at((0,0)), (0,0,0, 255)) self.assertEqual(s2.get_at((0,1)), (40, 40, 40, 255)) self.assertEqual(s2.get_at((17,1)), (40, 40, 40, 255)) # abs(40 - 255) < 100 #(abs(c1[0] - r) < tr) if 1: s1.fill((160,160,160)) s2.fill((255,255,255)) num_threshold_pixels = threshold(s2, s1, (255,255,255), (100,100,100), (0,0,0), True) self.assertEqual(num_threshold_pixels, (s1.get_height() * s1.get_width())) if 1: # only one pixel should not be changed. s1.fill((40,40,40)) s2.fill((255,255,255)) s1.set_at( (0,0), (170, 170, 170) ) num_threshold_pixels = threshold(s3, s1, (30,30,30), (11,11,11), (0,0,0), False) #num_threshold_pixels = threshold(s2, s1, (30,30,30)) self.assertEqual(num_threshold_pixels, (s1.get_height() * s1.get_width()) -1) if 1: # test end markers. 0, and 255 # the pixels are different by 1. s1.fill((254,254,254)) s2.fill((255,255,255)) s3.fill((255,255,255)) s1.set_at( (0,0), (170, 170, 170) ) num_threshold_pixels = threshold(s3, s1, (254,254,254), (1,1,1), (44,44,44,255), False) self.assertEqual(num_threshold_pixels, (s1.get_height() * s1.get_width()) -1) # compare the two surfaces. Should be all but one matching. num_threshold_pixels = threshold(s3, s1, 0, (1,1,1), (44,44,44,255), False, s2) self.assertEqual(num_threshold_pixels, (s1.get_height() * s1.get_width()) -1) # within (0,0,0) threshold? Should match no pixels. num_threshold_pixels = threshold(s3, s1, (253,253,253), (0,0,0), (44,44,44,255), False) self.assertEqual(num_threshold_pixels, 0) # other surface within (0,0,0) threshold? Should match no pixels. num_threshold_pixels = threshold(s3, s1, 0, (0,0,0), (44,44,44,255), False, s2) self.assertEqual(num_threshold_pixels, 0) def test_laplacian(self): """ """ SIZE = 32 s1 = pygame.Surface((SIZE, SIZE)) s2 = pygame.Surface((SIZE, SIZE)) s1.fill((10,10,70)) pygame.draw.line(s1, (255,0,0), (3,10), (20,20)) # a line at the last row of the image. pygame.draw.line(s1, (255,0,0), (0,31), (31,31)) pygame.transform.laplacian(s1,s2) #show_image(s1) #show_image(s2) self.assertEqual(s2.get_at((0,0)), (0, 0, 0, 255)) self.assertEqual(s2.get_at((3,10)), (255,0,0,255)) self.assertEqual(s2.get_at((0,31)), (255,0,0,255)) self.assertEqual(s2.get_at((31,31)), (255,0,0,255)) # here we create the return surface. s2 = pygame.transform.laplacian(s1) self.assertEqual(s2.get_at((0,0)), (0, 0, 0, 255)) self.assertEqual(s2.get_at((3,10)), (255,0,0,255)) self.assertEqual(s2.get_at((0,31)), (255,0,0,255)) self.assertEqual(s2.get_at((31,31)), (255,0,0,255)) def test_average_surfaces(self): """ """ SIZE = 32 s1 = pygame.Surface((SIZE, SIZE)) s2 = pygame.Surface((SIZE, SIZE)) s3 = pygame.Surface((SIZE, SIZE)) s1.fill((10,10,70)) s2.fill((10,20,70)) s3.fill((10,130,10)) surfaces = [s1, s2, s3] surfaces = [s1, s2] sr = pygame.transform.average_surfaces(surfaces) self.assertEqual(sr.get_at((0,0)), (10,15,70,255)) self.assertRaises(TypeError, pygame.transform.average_surfaces, 1) self.assertRaises(TypeError, pygame.transform.average_surfaces, []) self.assertRaises(TypeError, pygame.transform.average_surfaces, [1]) self.assertRaises(TypeError, pygame.transform.average_surfaces, [s1, 1]) self.assertRaises(TypeError, pygame.transform.average_surfaces, [1, s1]) self.assertRaises(TypeError, pygame.transform.average_surfaces, [s1, s2, 1]) self.assertRaises(TypeError, pygame.transform.average_surfaces, (s for s in [s1, s2,s3] )) def test_average_surfaces__24(self): SIZE = 32 depth = 24 s1 = pygame.Surface((SIZE, SIZE), 0, depth) s2 = pygame.Surface((SIZE, SIZE), 0, depth) s3 = pygame.Surface((SIZE, SIZE), 0, depth) s1.fill((10,10,70, 255)) s2.fill((10,20,70, 255)) s3.fill((10,130,10, 255)) surfaces = [s1, s2, s3] sr = pygame.transform.average_surfaces(surfaces) self.assertEqual( sr.get_masks(), s1.get_masks() ) self.assertEqual( sr.get_flags(), s1.get_flags() ) self.assertEqual( sr.get_losses(), s1.get_losses() ) if 0: print ( sr, s1 ) print ( sr.get_masks(), s1.get_masks() ) print ( sr.get_flags(), s1.get_flags() ) print ( sr.get_losses(), s1.get_losses() ) print ( sr.get_shifts(), s1.get_shifts() ) self.assertEqual(sr.get_at((0,0)), (10,53,50,255)) def test_average_color(self): """ """ a = [24, 32] for i in a: s = pygame.Surface((32,32), 0, i) s.fill((0,100,200)) s.fill((10,50,100), (0,0,16,32)) self.assertEqual(pygame.transform.average_color(s),(5,75,150,0)) self.assertEqual(pygame.transform.average_color(s, (16,0,16,32)), (0,100,200,0)) def todo_test_rotate(self): # __doc__ (as of 2008-06-25) for pygame.transform.rotate: # pygame.transform.rotate(Surface, angle): return Surface # rotate an image # color = (128, 128, 128, 255) # s = pygame.Surface((3, 3)) # s.set_at((2, 0), color) # self.assert_(s.get_at((0, 0)) != color) # s = pygame.transform.rotate(s, 90) # self.assert_(s.get_at((0, 0)) == color) self.fail() def test_rotate__lossless_at_90_degrees(self): w, h = 32, 32 s = pygame.Surface((w, h), pygame.SRCALPHA) gradient = list(test_utils.gradient(w, h)) for pt, color in gradient: s.set_at(pt, color) for rotation in (90, -90): s = pygame.transform.rotate(s,rotation) for pt, color in gradient: self.assert_(s.get_at(pt) == color) def test_scale2x(self): # __doc__ (as of 2008-06-25) for pygame.transform.scale2x: # pygame.transform.scale2x(Surface, DestSurface = None): Surface # specialized image doubler w, h = 32, 32 s = pygame.Surface((w, h), pygame.SRCALPHA, 32) # s.set_at((0,0), (20, 20, 20, 255)) s2 = pygame.transform.scale2x(s) self.assertEquals(s2.get_rect().size, (64, 64)) def test_get_smoothscale_backend(self): filter_type = pygame.transform.get_smoothscale_backend() self.failUnless(filter_type in ['GENERIC', 'MMX', 'SSE']) # It would be nice to test if a non-generic type corresponds to an x86 # processor. But there is no simple test for this. platform.machine() # returns process version specific information, like 'i686'. def test_set_smoothscale_backend(self): # All machines should allow 'GENERIC'. original_type = pygame.transform.get_smoothscale_backend() pygame.transform.set_smoothscale_backend('GENERIC') filter_type = pygame.transform.get_smoothscale_backend() self.failUnlessEqual(filter_type, 'GENERIC') # All machines should allow returning to original value. # Also check that keyword argument works. pygame.transform.set_smoothscale_backend(type=original_type) # Something invalid. def change(): pygame.transform.set_smoothscale_backend('mmx') self.failUnlessRaises(ValueError, change) # Invalid argument keyword. def change(): pygame.transform.set_smoothscale_backend(t='GENERIC') self.failUnlessRaises(TypeError, change) # Invalid argument type. def change(): pygame.transform.set_smoothscale_backend(1) self.failUnlessRaises(TypeError, change) # Unsupported type, if possible. if original_type != 'SSE': def change(): pygame.transform.set_smoothscale_backend('SSE') self.failUnlessRaises(ValueError, change) # Should be back where we started. filter_type = pygame.transform.get_smoothscale_backend() self.failUnlessEqual(filter_type, original_type) def todo_test_chop(self): # __doc__ (as of 2008-08-02) for pygame.transform.chop: # pygame.transform.chop(Surface, rect): return Surface # gets a copy of an image with an interior area removed # # Extracts a portion of an image. All vertical and horizontal pixels # surrounding the given rectangle area are removed. The corner areas # (diagonal to the rect) are then brought together. (The original # image is not altered by this operation.) # # NOTE: If you want a "crop" that returns the part of an image within # a rect, you can blit with a rect to a new surface or copy a # subsurface. self.fail() def todo_test_flip(self): # __doc__ (as of 2008-08-02) for pygame.transform.flip: # pygame.transform.flip(Surface, xbool, ybool): return Surface # flip vertically and horizontally # # This can flip a Surface either vertically, horizontally, or both. # Flipping a Surface is nondestructive and returns a new Surface with # the same dimensions. self.fail() def todo_test_rotozoom(self): # __doc__ (as of 2008-08-02) for pygame.transform.rotozoom: # pygame.transform.rotozoom(Surface, angle, scale): return Surface # filtered scale and rotation # # This is a combined scale and rotation transform. The resulting # Surface will be a filtered 32-bit Surface. The scale argument is a # floating point value that will be multiplied by the current # resolution. The angle argument is a floating point value that # represents the counterclockwise degrees to rotate. A negative # rotation angle will rotate clockwise. self.fail() def todo_test_smoothscale(self): # __doc__ (as of 2008-08-02) for pygame.transform.smoothscale: # pygame.transform.smoothscale(Surface, (width, height), DestSurface = # None): return Surface # # scale a surface to an arbitrary size smoothly # # Uses one of two different algorithms for scaling each dimension of # the input surface as required. For shrinkage, the output pixels are # area averages of the colors they cover. For expansion, a bilinear # filter is used. For the amd64 and i686 architectures, optimized MMX # routines are included and will run much faster than other machine # types. The size is a 2 number sequence for (width, height). This # function only works for 24-bit or 32-bit surfaces. An exception # will be thrown if the input surface bit depth is less than 24. # # New in pygame 1.8 self.fail() if __name__ == '__main__': #tt = TransformModuleTest() #tt.test_threshold_non_src_alpha() unittest.main() pygame-1.9.1release/test/time_test.py0000644000175000017500000001726411207055754017611 0ustar vincentvincent#################################### IMPORTS ################################### if __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest else: from test.test_utils import test_not_implemented, unittest import pygame import time Clock = pygame.time.Clock ################################################################################ class ClockTypeTest(unittest.TestCase): def test_construction(self): c = Clock() self.assert_(c, "Clock can be constructed") def todo_test_get_fps(self): # __doc__ (as of 2008-08-02) for pygame.time.Clock.get_fps: # Clock.get_fps(): return float # compute the clock framerate # # Compute your game's framerate (in frames per second). It is computed # by averaging the last few calls to Clock.tick(). # self.fail() # delay_per_frame = 1 / 100.0 # # c = Clock() # # for f in range(100): # c.tick() # time.sleep(delay_per_frame) # # self.assert_(99.0 < c.get_fps() < 101.0) def todo_test_get_rawtime(self): # __doc__ (as of 2008-08-02) for pygame.time.Clock.get_rawtime: # Clock.get_rawtime(): return milliseconds # actual time used in the previous tick # # Similar to Clock.get_time(), but this does not include any time used # while Clock.tick() was delaying to limit the framerate. # self.fail() def todo_test_get_time(self): # __doc__ (as of 2008-08-02) for pygame.time.Clock.get_time: # Clock.get_time(): return milliseconds # time used in the previous tick # # Returns the parameter passed to the last call to Clock.tick(). It is # the number of milliseconds passed between the previous two calls to # Pygame.tick(). # self.fail() # c = Clock() # c.tick() #between here # time.sleep(0.02) # #get_time() # c.tick() # here # # time.sleep(0.02) # # self.assert_(20 <= c.get_time() <= 30) def todo_test_tick(self): # __doc__ (as of 2008-08-02) for pygame.time.Clock.tick: # Clock.tick(framerate=0): return milliseconds # control timer events # update the clock # # This method should be called once per frame. It will compute how # many milliseconds have passed since the previous call. # # If you pass the optional framerate argument the function will delay # to keep the game running slower than the given ticks per second. # This can be used to help limit the runtime speed of a game. By # calling Clock.tick(40) once per frame, the program will never run at # more than 40 frames per second. # # Note that this function uses SDL_Delay function which is not # accurate on every platform, but does not use much cpu. Use # tick_busy_loop if you want an accurate timer, and don't mind chewing # cpu. # self.fail() # collection = [] # c = Clock() # # c.tick() # for i in range(100): # time.sleep(0.005) # collection.append(c.tick()) # # for outlier in [min(collection), max(collection)]: # if outlier != 5: collection.remove(outlier) # # self.assert_(sum(collection) / len(collection) == 5) def todo_test_tick_busy_loop(self): # __doc__ (as of 2008-08-02) for pygame.time.Clock.tick_busy_loop: # Clock.tick_busy_loop(framerate=0): return milliseconds # control timer events # update the clock # # This method should be called once per frame. It will compute how # many milliseconds have passed since the previous call. # # If you pass the optional framerate argument the function will delay # to keep the game running slower than the given ticks per second. # This can be used to help limit the runtime speed of a game. By # calling Clock.tick(40) once per frame, the program will never run at # more than 40 frames per second. # # Note that this function uses pygame.time.delay, which uses lots of # cpu in a busy loop to make sure that timing is more acurate. # # New in pygame 1.8.0. self.fail() class TimeModuleTest(unittest.TestCase): def todo_test_delay(self): # __doc__ (as of 2008-08-02) for pygame.time.delay: # pygame.time.delay(milliseconds): return time # pause the program for an amount of time # # Will pause for a given number of milliseconds. This function will # use the processor (rather than sleeping) in order to make the delay # more accurate than pygame.time.wait(). # # This returns the actual number of milliseconds used. self.fail() def todo_test_get_ticks(self): # __doc__ (as of 2008-08-02) for pygame.time.get_ticks: # pygame.time.get_ticks(): return milliseconds # get the time in milliseconds # # Return the number of millisconds since pygame.init() was called. # Before pygame is initialized this will always be 0. # self.fail() def todo_test_set_timer(self): # __doc__ (as of 2008-08-02) for pygame.time.set_timer: # pygame.time.set_timer(eventid, milliseconds): return None # repeatedly create an event on the event queue # # Set an event type to appear on the event queue every given number of # milliseconds. The first event will not appear until the amount of # time has passed. # # Every event type can have a separate timer attached to it. It is # best to use the value between pygame.USEREVENT and pygame.NUMEVENTS. # # To disable the timer for an event, set the milliseconds argument to 0. self.fail() def todo_test_wait(self): # __doc__ (as of 2008-08-02) for pygame.time.wait: # pygame.time.wait(milliseconds): return time # pause the program for an amount of time # # Will pause for a given number of milliseconds. This function sleeps # the process to share the processor with other programs. A program # that waits for even a few milliseconds will consume very little # processor time. It is slightly less accurate than the # pygame.time.delay() function. # # This returns the actual number of milliseconds used. self.fail() ################################################################################ if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/threads_test.py0000644000175000017500000001525611131725456020303 0ustar vincentvincent#################################### IMPORTS ################################### if __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest else: from test.test_utils import test_not_implemented, unittest from pygame.threads import FuncResult, tmap, WorkerQueue, Empty, STOP from pygame import threads import time ################################################################################ class WorkerQueueTypeTest(unittest.TestCase): def test_usage_with_different_functions(self): def f(x): return x+1 def f2(x): return x+2 wq = WorkerQueue() fr = FuncResult(f) fr2 = FuncResult(f2) wq.do(fr, 1) wq.do(fr2, 1) wq.wait() wq.stop() self.assert_(fr.result == 2) self.assert_(fr2.result == 3) def test_do(self): # __doc__ (as of 2008-06-28) for pygame.threads.WorkerQueue.do: # puts a function on a queue for running later. # return def test_stop(self): # __doc__ (as of 2008-06-28) for pygame.threads.WorkerQueue.stop: # Stops the WorkerQueue, waits for all of the threads to finish up. # wq = WorkerQueue() self.assert_(len(wq.pool) > 0) for t in wq.pool: self.assert_(t.isAlive()) for i in xrange(200): wq.do(lambda x: x+1, i) wq.stop() for t in wq.pool: self.assert_(not t.isAlive()) self.assert_(wq.queue.get() is STOP) def todo_test_threadloop(self): # __doc__ (as of 2008-06-28) for pygame.threads.WorkerQueue.threadloop: # Loops until all of the tasks are finished. self.fail() def test_wait(self): # __doc__ (as of 2008-06-28) for pygame.threads.WorkerQueue.wait: # waits until all tasks are complete. wq = WorkerQueue() for i in xrange(2000): wq.do(lambda x: x+1, i) wq.wait() self.assertRaises(Empty, wq.queue.get_nowait) wq.stop() class ThreadsModuleTest(unittest.TestCase): def todo_test_benchmark_workers(self): "tags:long_running" # __doc__ (as of 2008-06-28) for pygame.threads.benchmark_workers: # does a little test to see if workers are at all faster. # Returns the number of workers which works best. # Takes a little bit of time to run, so you should only really call # it once. # You can pass in benchmark data, and functions if you want. # a_bench_func - f(data) # the_data - data to work on. self.fail() def test_init(self): # __doc__ (as of 2008-06-28) for pygame.threads.init: # Does a little test to see if threading is worth it. # Sets up a global worker queue if it's worth it. # # Calling init() is not required, but is generally better to do. threads.init(8) self.assert_(isinstance(threads._wq, WorkerQueue)) threads.quit() def test_quit(self): # __doc__ (as of 2008-06-28) for pygame.threads.quit: # cleans up everything. # threads.init(8) threads.quit() self.assert_(threads._wq is None) def test_tmap(self): # __doc__ (as of 2008-06-28) for pygame.threads.tmap: # like map, but uses a thread pool to execute. # num_workers - the number of worker threads that will be used. If pool # is passed in, then the num_workers arg is ignored. # worker_queue - you can optionally pass in an existing WorkerQueue. # wait - True means that the results are returned when everything is finished. # False means that we return the [worker_queue, results] right away instead. # results, is returned as a list of FuncResult instances. # stop_on_error - func, data = lambda x:x+1, xrange(100) tmapped = tmap(func, data) mapped = map(func, data) self.assert_(tmapped == mapped) def test_tmap__None_func_and_multiple_sequences(self): return #TODO """ Using a None as func and multiple seqences """ res = tmap(None, [1,2,3,4]) res2 = tmap(None, [1,2,3,4], [22, 33, 44, 55]) res3 = tmap(None, [1,2,3,4], [22, 33, 44, 55, 66]) res4 = tmap(None, [1,2,3,4,5], [22, 33, 44, 55]) self.assertEqual([1, 2, 3, 4], res) self.assertEqual([(1, 22), (2, 33), (3, 44), (4, 55)], res2) self.assertEqual([(1, 22), (2, 33), (3, 44), (4, 55), (None, 66)], res3) self.assertEqual([(1, 22), (2, 33), (3, 44), (4, 55), (5,None)], res4) def test_tmap__wait(self): r = range(1000) wq, results = tmap(lambda x:x, r, num_workers = 5, wait=False) wq.wait() r2 = map(lambda x:x.result, results) self.assert_(r == r2) def test_FuncResult(self): # as of 2008-06-28 # FuncResult(f, callback = None, errback = None) # Used for wrapping up a function call so that the results are stored # inside the instances result attribute. # f - is the function we that we call # callback(result) - this is called when the function(f) returns # errback(exception) - this is called when the function(f) raises # an exception. # Results are stored in result attribute fr = FuncResult(lambda x:x+1) fr(2) self.assert_(fr.result == 3) # Exceptions are store in exception attribute self.assert_(fr.exception is None, "when no exception raised") exception = ValueError('rast') def x(sdf): raise exception fr = FuncResult(x) fr(None) self.assert_(fr.exception is exception) ################################################################################ if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/threads_tags.py0000644000175000017500000000016211207055754020251 0ustar vincentvincent__tags__ = [] import sys if sys.version_info >= (3, 0, 0): __tags__.extend(('ignore', 'subprocess_ignore')) pygame-1.9.1release/test/test_test_.py0000644000175000017500000000003311032334512017737 0ustar vincentvincentwhile True: pass pygame-1.9.1release/test/sysfont_test.py0000644000175000017500000000330411207055754020346 0ustar vincentvincent#################################### IMPORTS ################################### if __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest else: from test.test_utils import test_not_implemented, unittest ################################################################################ class SysfontModuleTest(unittest.TestCase): def todo_test_create_aliases(self): # __doc__ (as of 2008-08-02) for pygame.sysfont.create_aliases: # self.fail() def todo_test_initsysfonts(self): # __doc__ (as of 2008-08-02) for pygame.sysfont.initsysfonts: # self.fail() def todo_test_initsysfonts_darwin(self): # __doc__ (as of 2008-08-02) for pygame.sysfont.initsysfonts_darwin: # self.fail() def todo_test_initsysfonts_unix(self): # __doc__ (as of 2008-08-02) for pygame.sysfont.initsysfonts_unix: # self.fail() def todo_test_initsysfonts_win32(self): # __doc__ (as of 2008-08-02) for pygame.sysfont.initsysfonts_win32: # self.fail() ################################################################################ if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/surflock_test.py0000644000175000017500000001255311207055754020477 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest else: from test.test_utils import test_not_implemented, unittest import pygame import sys class SurfaceLockTest (unittest.TestCase): def test_lock (self): sf = pygame.Surface ((5, 5)) sf.lock () self.assertEquals (sf.get_locked (), True) self.assertEquals (sf.get_locks (), (sf,)) sf.lock () self.assertEquals (sf.get_locked (), True) self.assertEquals (sf.get_locks (), (sf, sf)) sf.unlock () self.assertEquals (sf.get_locked (), True) self.assertEquals (sf.get_locks (), (sf,)) sf.unlock () self.assertEquals (sf.get_locked (), False) self.assertEquals (sf.get_locks (), ()) def test_subsurface_lock (self): sf = pygame.Surface ((5, 5)) subsf = sf.subsurface ((1, 1, 2, 2)) sf2 = pygame.Surface ((5, 5)) # Simple blits, nothing should happen here. sf2.blit (subsf, (0, 0)) sf2.blit (sf, (0, 0)) # Test blitting on self: self.assertRaises (pygame.error, sf.blit, subsf, (0, 0)) #self.assertRaises (pygame.error, subsf.blit, sf, (0, 0)) # ^ Fails although it should not in my opinion. If I cannot # blit the subsurface to the surface, it should not be allowed # the other way around as well. # Test additional locks. sf.lock () sf2.blit (subsf, (0, 0)) self.assertRaises (pygame.error, sf2.blit, sf, (0, 0)) subsf.lock () self.assertRaises (pygame.error, sf2.blit, subsf, (0, 0)) self.assertRaises (pygame.error, sf2.blit, sf, (0, 0)) # sf and subsf are now explicitly locked. Unlock sf, so we can # (assume) to blit it. # It will fail though as the subsurface still has a lock around, # which is okay and correct behaviour. sf.unlock () self.assertRaises (pygame.error, sf2.blit, subsf, (0, 0)) self.assertRaises (pygame.error, sf2.blit, sf, (0, 0)) # Run a second unlock on the surface. This should ideally have # no effect as the subsurface is the locking reason! sf.unlock () self.assertRaises (pygame.error, sf2.blit, sf, (0, 0)) self.assertRaises (pygame.error, sf2.blit, subsf, (0, 0)) subsf.unlock () sf.lock () self.assertEquals (sf.get_locked (), True) self.assertEquals (sf.get_locks (), (sf,)) self.assertEquals (subsf.get_locked (), False) self.assertEquals (subsf.get_locks (), ()) subsf.lock () self.assertEquals (sf.get_locked (), True) self.assertEquals (sf.get_locks (), (sf, subsf)) self.assertEquals (subsf.get_locked (), True) self.assertEquals (subsf.get_locks (), (subsf,)) sf.unlock () self.assertEquals (sf.get_locked (), True) self.assertEquals (sf.get_locks (), (subsf,)) self.assertEquals (subsf.get_locked (), True) self.assertEquals (subsf.get_locks (), (subsf,)) subsf.unlock () self.assertEquals (sf.get_locked (), False) self.assertEquals (sf.get_locks (), ()) self.assertEquals (subsf.get_locked (), False) self.assertEquals (subsf.get_locks (), ()) subsf.lock () self.assertEquals (sf.get_locked (), True) self.assertEquals (sf.get_locks (), (subsf,)) self.assertEquals (subsf.get_locked (), True) self.assertEquals (subsf.get_locks (), (subsf,)) subsf.lock () self.assertEquals (sf.get_locked (), True) self.assertEquals (sf.get_locks (), (subsf, subsf)) self.assertEquals (subsf.get_locked (), True) self.assertEquals (subsf.get_locks (), (subsf, subsf)) def test_pxarray_ref (self): sf = pygame.Surface ((5, 5)) ar = pygame.PixelArray (sf) ar2 = pygame.PixelArray (sf) self.assertEquals (sf.get_locked (), True) self.assertEquals (sf.get_locks (), (ar, ar2)) del ar self.assertEquals (sf.get_locked (), True) self.assertEquals (sf.get_locks (), (ar2,)) ar = ar2[:] self.assertEquals (sf.get_locked (), True) self.assertEquals (sf.get_locks (), (ar2,)) del ar self.assertEquals (sf.get_locked (), True) self.assertEquals (len (sf.get_locks ()), 1) def test_buffer (self): sf = pygame.Surface ((5, 5)) buf = sf.get_buffer () self.assertEquals (sf.get_locked (), True) self.assertEquals (sf.get_locks (), (buf,)) sf.unlock () self.assertEquals (sf.get_locked (), True) self.assertEquals (sf.get_locks (), (buf,)) del buf self.assertEquals (sf.get_locked (), False) self.assertEquals (sf.get_locks (), ()) if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/surfarray_test.py0000644000175000017500000006531711201706427020665 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest else: from test.test_utils import test_not_implemented, unittest import pygame from pygame.locals import * arraytype = "" try: import pygame.surfarray except ImportError: pass else: arraytype = pygame.surfarray.get_arraytype() if arraytype == 'numpy': from numpy import \ uint8, uint16, uint32, uint64, zeros, float64, alltrue elif arraytype == 'numeric': from Numeric import \ UInt8 as uint8, UInt16 as uint16, UInt32 as uint32, zeros, \ Float64 as float64, alltrue else: print ("Unknown array type %s; tests skipped" % pygame.surfarray.get_arraytype()) arraytype = "" class SurfarrayModuleTest (unittest.TestCase): pixels2d = {8: True, 16: True, 24: False, 32: True} pixels3d = {8: False, 16: False, 24: True, 32: True} array2d = {8: True, 16: True, 24: True, 32: True} array3d = {8: False, 16: False, 24: True, 32: True} test_palette = [(0, 0, 0, 255), (10, 30, 60, 255), (25, 75, 100, 255), (100, 150, 200, 255), (0, 100, 200, 255)] surf_size = (10, 12) test_points = [((0, 0), 1), ((4, 5), 1), ((9, 0), 2), ((5, 5), 2), ((0, 11), 3), ((4, 6), 3), ((9, 11), 4), ((5, 6), 4)] def _make_surface(self, bitsize, srcalpha=False, palette=None): if palette is None: palette = self.test_palette flags = 0 if srcalpha: flags |= SRCALPHA surf = pygame.Surface(self.surf_size, flags, bitsize) if bitsize == 8: surf.set_palette([c[:3] for c in palette]) return surf def _fill_surface(self, surf, palette=None): if palette is None: palette = self.test_palette surf.fill(palette[1], (0, 0, 5, 6)) surf.fill(palette[2], (5, 0, 5, 6)) surf.fill(palette[3], (0, 6, 5, 6)) surf.fill(palette[4], (5, 6, 5, 6)) def _make_src_surface(self, bitsize, srcalpha=False, palette=None): surf = self._make_surface(bitsize, srcalpha, palette) self._fill_surface(surf, palette) return surf def _assert_surface(self, surf, palette=None, msg=""): if palette is None: palette = self.test_palette if surf.get_bitsize() == 16: palette = [surf.unmap_rgb(surf.map_rgb(c)) for c in palette] for posn, i in self.test_points: self.failUnlessEqual(surf.get_at(posn), palette[i], "%s != %s: flags: %i, bpp: %i, posn: %s%s" % (surf.get_at(posn), palette[i], surf.get_flags(), surf.get_bitsize(), posn, msg)) def _make_array3d(self, dtype): return zeros((self.surf_size[0], self.surf_size[1], 3), dtype) def _fill_array2d(self, arr, surf): palette = self.test_palette arr[:5,:6] = surf.map_rgb(palette[1]) arr[5:,:6] = surf.map_rgb(palette[2]) arr[:5,6:] = surf.map_rgb(palette[3]) arr[5:,6:] = surf.map_rgb(palette[4]) def _fill_array3d(self, arr): palette = self.test_palette arr[:5,:6] = palette[1][:3] arr[5:,:6] = palette[2][:3] arr[:5,6:] = palette[3][:3] arr[5:,6:] = palette[4][:3] def _make_src_array3d(self, dtype): arr = self._make_array3d(dtype) self._fill_array3d(arr) return arr def _make_array2d(self, dtype): return zeros(self.surf_size, dtype) def setUp(self): # Needed for 8 bits-per-pixel color palette surface tests. pygame.init() # Makes sure the same array package is used each time. if arraytype: pygame.surfarray.use_arraytype(arraytype) def tearDown(self): pygame.quit() def test_array2d(self): if not arraytype: self.fail("no array package installed") if arraytype == 'numeric': # This is known to fail with Numeric (incompatible # get_rgb and array element types). return sources = [self._make_src_surface(8), self._make_src_surface(16), self._make_src_surface(16, srcalpha=True), self._make_src_surface(24), self._make_src_surface(32), self._make_src_surface(32, srcalpha=True)] palette = self.test_palette alpha_color = (0, 0, 0, 128) for surf in sources: arr = pygame.surfarray.array2d(surf) map_rgb = surf.map_rgb for (x, y), i in self.test_points: self.failUnlessEqual(arr[x, y], map_rgb(palette[i]), "%s != %s: flags: %i, bpp: %i, posn: %s" % (arr[x, y], map_rgb(palette[i]), surf.get_flags(), surf.get_bitsize(), (x, y))) if surf.get_masks()[3]: surf.fill(alpha_color) arr = pygame.surfarray.array2d(surf) self.failUnlessEqual(arr[0, 0], map_rgb(alpha_color), "%s != %s: bpp: %i" % (arr[0, 0], map_rgb(alpha_color), surf.get_bitsize())) def test_array3d(self): if not arraytype: self.fail("no array package installed") if arraytype == 'numeric': # This is known to fail with Numeric (wrong color element # values for 16 bit surfaces). return sources = [self._make_src_surface(16), self._make_src_surface(16, srcalpha=True), self._make_src_surface(24), self._make_src_surface(32), self._make_src_surface(32, srcalpha=True)] palette = self.test_palette for surf in sources: arr = pygame.surfarray.array3d(surf) map_rgb = surf.map_rgb unmap_rgb = surf.unmap_rgb def same_color(ac, sc): sc = unmap_rgb(map_rgb(sc)) return (ac[0] == sc[0] and ac[1] == sc[1] and ac[2] == sc[2]) for (x, y), i in self.test_points: self.failUnless(same_color(arr[x, y], palette[i]), "%s != %s: flags: %i, bpp: %i, posn: %s" % (tuple(arr[x, y]), unmap_rgb(map_rgb(palette[i])), surf.get_flags(), surf.get_bitsize(), (x, y))) def test_array_alpha(self): if not arraytype: self.fail("no array package installed") if arraytype == 'numeric': # This is known to fail with Numeric (differing values for # get_rgb and array element for 16 bit surfaces). return palette = [(0, 0, 0, 0), (10, 50, 100, 255), (60, 120, 240, 130), (64, 128, 255, 0), (255, 128, 0, 65)] targets = [self._make_src_surface(8, palette=palette), self._make_src_surface(16, palette=palette), self._make_src_surface(16, palette=palette, srcalpha=True), self._make_src_surface(24, palette=palette), self._make_src_surface(32, palette=palette), self._make_src_surface(32, palette=palette, srcalpha=True)] for surf in targets: p = palette if surf.get_bitsize() == 16: p = [surf.unmap_rgb(surf.map_rgb(c)) for c in p] arr = pygame.surfarray.array_alpha(surf) if surf.get_masks()[3]: for (x, y), i in self.test_points: self.failUnlessEqual(arr[x, y], p[i][3], ("%i != %i, posn: (%i, %i), " "bitsize: %i" % (arr[x, y], p[i][3], x, y, surf.get_bitsize()))) else: self.failUnless(alltrue(arr == 255)) # No per-pixel alpha when blanket alpha is None. for surf in targets: blacket_alpha = surf.get_alpha() surf.set_alpha(None) arr = pygame.surfarray.array_alpha(surf) self.failUnless(alltrue(arr == 255), "bitsize: %i, flags: %i" % (surf.get_bitsize(), surf.get_flags())) surf.set_alpha(blacket_alpha) # Bug for per-pixel alpha surface when blanket alpha 0. for surf in targets: blanket_alpha = surf.get_alpha() surf.set_alpha(0) arr = pygame.surfarray.array_alpha(surf) if surf.get_masks()[3]: self.failIf(alltrue(arr == 255), "bitsize: %i, flags: %i" % (surf.get_bitsize(), surf.get_flags())) else: self.failUnless(alltrue(arr == 255), "bitsize: %i, flags: %i" % (surf.get_bitsize(), surf.get_flags())) surf.set_alpha(blanket_alpha) def test_array_colorkey(self): if not arraytype: self.fail("no array package installed") palette = [(0, 0, 0, 0), (10, 50, 100, 255), (60, 120, 240, 130), (64, 128, 255, 0), (255, 128, 0, 65)] targets = [self._make_src_surface(8, palette=palette), self._make_src_surface(16, palette=palette), self._make_src_surface(16, palette=palette, srcalpha=True), self._make_src_surface(24, palette=palette), self._make_src_surface(32, palette=palette), self._make_src_surface(32, palette=palette, srcalpha=True)] for surf in targets: p = palette if surf.get_bitsize() == 16: p = [surf.unmap_rgb(surf.map_rgb(c)) for c in p] surf.set_colorkey(None) arr = pygame.surfarray.array_colorkey(surf) self.failUnless(alltrue(arr == 255)) for i in range(1, len(palette)): surf.set_colorkey(p[i]) alphas = [255] * len(p) alphas[i] = 0 arr = pygame.surfarray.array_colorkey(surf) for (x, y), j in self.test_points: self.failUnlessEqual(arr[x, y], alphas[j], ("%i != %i, posn: (%i, %i), " "bitsize: %i" % (arr[x, y], alphas[j], x, y, surf.get_bitsize()))) def test_blit_array(self): if not arraytype: self.fail("no array package installed") # bug 24 at http://pygame.motherhamster.org/bugzilla/ if 'numpy' in pygame.surfarray.get_arraytypes(): prev = pygame.surfarray.get_arraytype() # This would raise exception: # File "[...]\pygame\_numpysurfarray.py", line 381, in blit_array # (array[:,:,1::3] >> losses[1] << shifts[1]) | \ # TypeError: unsupported operand type(s) for >>: 'float' and 'int' pygame.surfarray.use_arraytype('numpy') s = pygame.Surface((10,10), 0, 24) a = pygame.surfarray.array3d(s) pygame.surfarray.blit_array(s, a) prev = pygame.surfarray.use_arraytype(prev) # target surfaces targets = [self._make_surface(8), self._make_surface(16), self._make_surface(16, srcalpha=True), self._make_surface(24), self._make_surface(32), self._make_surface(32, srcalpha=True), ] # source arrays arrays3d = [] dtypes = [(8, uint8), (16, uint16), (32, uint32)] try: dtypes.append((64, uint64)) except NameError: pass arrays3d = [(self._make_src_array3d(dtype), None) for __, dtype in dtypes] for bitsize in [8, 16, 24, 32]: palette = None if bitsize == 16: s = pygame.Surface((1,1), 0, 16) palette = [s.unmap_rgb(s.map_rgb(c)) for c in self.test_palette] if self.pixels3d[bitsize]: surf = self._make_src_surface(bitsize) arr = pygame.surfarray.pixels3d(surf) arrays3d.append((arr, palette)) if self.array3d[bitsize]: surf = self._make_src_surface(bitsize) arr = pygame.surfarray.array3d(surf) arrays3d.append((arr, palette)) for sz, dtype in dtypes: arrays3d.append((arr.astype(dtype), palette)) # tests on arrays def do_blit(surf, arr): pygame.surfarray.blit_array(surf, arr) for surf in targets: bitsize = surf.get_bitsize() for arr, palette in arrays3d: surf.fill((0, 0, 0, 0)) if bitsize == 8: self.failUnlessRaises(ValueError, do_blit, surf, arr) else: pygame.surfarray.blit_array(surf, arr) self._assert_surface(surf, palette) if self.pixels2d[bitsize]: surf.fill((0, 0, 0, 0)) s = self._make_src_surface(bitsize, surf.get_flags() & SRCALPHA) arr = pygame.surfarray.pixels2d(s) pygame.surfarray.blit_array(surf, arr) self._assert_surface(surf) if self.array2d[bitsize]: s = self._make_src_surface(bitsize, surf.get_flags() & SRCALPHA) arr = pygame.surfarray.array2d(s) for sz, dtype in dtypes: surf.fill((0, 0, 0, 0)) if sz >= bitsize: pygame.surfarray.blit_array(surf, arr.astype(dtype)) self._assert_surface(surf) else: self.failUnlessRaises(ValueError, do_blit, surf, self._make_array2d(dtype)) # Check alpha for 2D arrays surf = self._make_surface(16, srcalpha=True) arr = zeros(surf.get_size(), uint16) arr[...] = surf.map_rgb((0, 128, 255, 64)) color = surf.unmap_rgb(arr[0, 0]) pygame.surfarray.blit_array(surf, arr) self.failUnlessEqual(surf.get_at((5, 5)), color) surf = self._make_surface(32, srcalpha=True) arr = zeros(surf.get_size(), uint32) color = (0, 111, 255, 63) arr[...] = surf.map_rgb(color) pygame.surfarray.blit_array(surf, arr) self.failUnlessEqual(surf.get_at((5, 5)), color) # Check shifts arr3d = self._make_src_array3d(uint8) shift_tests = [(16, [12, 0, 8, 4], [0xf000, 0xf, 0xf00, 0xf0]), (24, [16, 0, 8, 0], [0xff0000, 0xff, 0xff00, 0]), (32, [0, 16, 24, 8], [0xff, 0xff0000, 0xff000000, 0xff00])] for bitsize, shifts, masks in shift_tests: surf = self._make_surface(bitsize, srcalpha=(shifts[3] != 0)) palette = None if bitsize == 16: palette = [surf.unmap_rgb(surf.map_rgb(c)) for c in self.test_palette] surf.set_shifts(shifts) surf.set_masks(masks) pygame.surfarray.blit_array(surf, arr3d) self._assert_surface(surf, palette) # Invalid arrays surf = pygame.Surface((1,1), 0, 32) t = 'abcd' self.failUnlessRaises(ValueError, do_blit, surf, t) surf_size = self.surf_size surf = pygame.Surface(surf_size, 0, 32) arr = zeros([surf_size[0], surf_size[1] + 1, 3], uint32) self.failUnlessRaises(ValueError, do_blit, surf, arr) arr = zeros([surf_size[0] + 1, surf_size[1], 3], uint32) self.failUnlessRaises(ValueError, do_blit, surf, arr) surf = pygame.Surface((1, 4), 0, 32) arr = zeros((4,), uint32) self.failUnlessRaises(ValueError, do_blit, surf, arr) arr.shape = (1, 1, 1, 4) self.failUnlessRaises(ValueError, do_blit, surf, arr) arr = zeros((10, 10), float64) surf = pygame.Surface((10, 10), 0, 32) self.failUnlessRaises(ValueError, do_blit, surf, arr) def test_get_arraytype(self): if not arraytype: self.fail("no array package installed") self.failUnless((pygame.surfarray.get_arraytype() in ['numpy', 'numeric']), ("unknown array type %s" % pygame.surfarray.get_arraytype())) def test_get_arraytypes(self): if not arraytype: self.fail("no array package installed") arraytypes = pygame.surfarray.get_arraytypes() try: import numpy except ImportError: self.failIf('numpy' in arraytypes) else: self.failUnless('numpy' in arraytypes) try: import Numeric except ImportError: self.failIf('numeric' in arraytypes) else: self.failUnless('numeric' in arraytypes) for atype in arraytypes: self.failUnless(atype in ['numpy', 'numeric'], "unknown array type %s" % atype) def test_make_surface(self): if not arraytype: self.fail("no array package installed") # How does one properly test this with 2d arrays. It makes no sense # since the pixel format is not entirely dependent on element size. # Just make sure the surface pixel size is at least as large as the # array element size I guess. # for bitsize, dtype in [(8, uint8), (16, uint16), (24, uint32)]: ## Even this simple assertion fails for 2d arrays. Where's the problem? ## surf = pygame.surfarray.make_surface(self._make_array2d(dtype)) ## self.failUnless(surf.get_bitsize() >= bitsize, ## "not %i >= %i)" % (surf.get_bitsize(), bitsize)) ## surf = pygame.surfarray.make_surface(self._make_src_array3d(dtype)) self._assert_surface(surf) def test_map_array(self): if not arraytype: self.fail("no array package installed") if not arraytype == 'numpy': # This test would probably fail for Numeric # (incompatible get_rgb and array element types # and zero alpha for SRCALPHA surfaces). return arr3d = self._make_src_array3d(uint8) targets = [self._make_surface(16), self._make_surface(16, srcalpha=True), self._make_surface(24), self._make_surface(32), self._make_surface(32, srcalpha=True)] palette = self.test_palette for surf in targets: arr2d = pygame.surfarray.map_array(surf, arr3d) for (x, y), i in self.test_points: self.failUnlessEqual(arr2d[x, y], surf.map_rgb(palette[i]), "%i != %i, bitsize: %i, flags: %i" % (arr2d[x, y], surf.map_rgb(palette[i]), surf.get_bitsize(), surf.get_flags())) # Exception checks def do_map_array(surf, arr): pygame.surfarray.map_array(surf, arr) self.failUnlessRaises(ValueError, do_map_array, self._make_surface(32), self._make_array2d(uint8)) def test_pixels2d(self): if not arraytype: self.fail("no array package installed") if arraytype == 'numeric': # This is known to fail with Numeric # (incompatible get_rgb and array element types). return sources = [self._make_surface(8), self._make_surface(16, srcalpha=True), self._make_surface(32, srcalpha=True)] for surf in sources: self.failIf(surf.get_locked()) arr = pygame.surfarray.pixels2d(surf) self.failUnless(surf.get_locked()) # Numpy uses the surface's buffer. if arraytype == "numeric": self.failUnlessEqual(surf.get_locks(), (ar,)) self._fill_array2d(arr, surf) surf.unlock() self.failUnless(surf.get_locked()) del arr self.failIf(surf.get_locked()) self.failUnlessEqual(surf.get_locks(), ()) self._assert_surface(surf) # Error checks def do_pixels2d(surf): pygame.surfarray.pixels2d(surf) self.failUnlessRaises(ValueError, do_pixels2d, self._make_surface(24)) def test_pixels3d(self): if not arraytype: self.fail("no array package installed") sources = [self._make_surface(24), self._make_surface(32)] for surf in sources: self.failIf(surf.get_locked()) arr = pygame.surfarray.pixels3d(surf) self.failUnless(surf.get_locked()) # Numpy uses the surface's buffer. if arraytype == "numeric": self.failUnlessEqual(surf.get_locks(), (arr,)) self._fill_array3d(arr) surf.unlock() self.failUnless(surf.get_locked()) del arr self.failIf(surf.get_locked()) self.failUnlessEqual(surf.get_locks(), ()) self._assert_surface(surf) # Alpha check color = (1, 2, 3, 0) surf = self._make_surface(32, srcalpha=True) arr = pygame.surfarray.pixels3d(surf) arr[0,0] = color[:3] self.failUnlessEqual(surf.get_at((0, 0)), color) # Error checks def do_pixels3d(surf): pygame.surfarray.pixels3d(surf) self.failUnlessRaises(ValueError, do_pixels3d, self._make_surface(8)) self.failUnlessRaises(ValueError, do_pixels3d, self._make_surface(16)) def test_pixels_alpha(self): if not arraytype: self.fail("no array package installed") palette = [(0, 0, 0, 0), (127, 127, 127, 0), (127, 127, 127, 85), (127, 127, 127, 170), (127, 127, 127, 255)] alphas = [0, 45, 86, 99, 180] surf = self._make_src_surface(32, srcalpha=True, palette=palette) self.failIf(surf.get_locked()) arr = pygame.surfarray.pixels_alpha(surf) self.failUnless(surf.get_locked()) # Numpy uses the surface's buffer. if arraytype == 'numeric': self.failUnlessEqual(surf.get_locks(), (arr,)) surf.unlock() self.failUnless(surf.get_locked()) for (x, y), i in self.test_points: self.failUnlessEqual(arr[x, y], palette[i][3]) for (x, y), i in self.test_points: alpha = alphas[i] arr[x, y] = alpha color = (127, 127, 127, alpha) self.failUnlessEqual(surf.get_at((x, y)), color, "posn: (%i, %i)" % (x, y)) del arr self.failIf(surf.get_locked()) self.failUnlessEqual(surf.get_locks(), ()) # Check exceptions. def do_pixels_alpha(surf): pygame.surfarray.pixels_alpha(surf) targets = [(8, False), (16, False), (16, True), (24, False), (32, False)] for bitsize, srcalpha in targets: self.failUnlessRaises(ValueError, do_pixels_alpha, self._make_surface(bitsize, srcalpha)) def test_use_arraytype(self): if not arraytype: self.fail("no array package installed") def do_use_arraytype(atype): pygame.surfarray.use_arraytype(atype) try: import numpy except ImportError: self.failUnlessRaises(ValueError, do_use_arraytype, 'numpy') self.failIfEqual(pygame.surfarray.get_arraytype(), 'numpy') else: pygame.surfarray.use_arraytype('numpy') self.failUnlessEqual(pygame.surfarray.get_arraytype(), 'numpy') try: import Numeric except ImportError: self.failUnlessRaises(ValueError, do_use_arraytype, 'numeric') self.failIfEqual(pygame.surfarray.get_arraytype(), 'numeric') else: pygame.surfarray.use_arraytype('numeric') self.failUnlessEqual(pygame.surfarray.get_arraytype(), 'numeric') self.failUnlessRaises(ValueError, do_use_arraytype, 'not an option') def test_surf_lock (self): if not arraytype: self.fail("no array package installed") sf = pygame.Surface ((5, 5), 0, 32) for atype in pygame.surfarray.get_arraytypes (): pygame.surfarray.use_arraytype (atype) ar = pygame.surfarray.pixels2d (sf) self.assertEquals (sf.get_locked (), True) # Numpy uses the Surface's buffer. if atype == "numeric": self.assertEquals (sf.get_locks (), (ar,)) sf.unlock () self.assertEquals (sf.get_locked (), True) del ar self.assertEquals (sf.get_locked (), False) self.assertEquals (sf.get_locks (), ()) #print ("test_surf_lock - end") if __name__ == '__main__': if not arraytype: print ("No array package is installed. Cannot run unit tests.") else: unittest.main() pygame-1.9.1release/test/surfarray_tags.py0000644000175000017500000000062411207055754020640 0ustar vincentvincent__tags__ = ['array'] exclude = False try: import numpy except ImportError: try: import Numeric import pygame._numericsurfarray import pygame._arraysurfarray except ImportError: exclude = True else: try: import pygame._arraysurfarray except ImportError: exclude = True if exclude: __tags__.extend(('ignore', 'subprocess_ignore')) pygame-1.9.1release/test/surface_test.py0000644000175000017500000016557611224767753020325 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import test_not_implemented, unittest else: from test import test_utils from test.test_utils import test_not_implemented, unittest import pygame from pygame.locals import * from pygame.compat import xrange_ def intify(i): """If i is a long, cast to an int while preserving the bits""" if 0x80000000 & i: return int((0xFFFFFFFF & i)) return i def longify(i): """If i is an int, cast to a long while preserving the bits""" if i < 0: return 0xFFFFFFFF & i return long(i) class SurfaceTypeTest(unittest.TestCase): def test_set_clip( self ): """ see if surface.set_clip(None) works correctly. """ s = pygame.Surface((800, 600)) r = pygame.Rect(10, 10, 10, 10) s.set_clip(r) r.move_ip(10, 0) s.set_clip(None) res = s.get_clip() # this was garbled before. self.assertEqual(res[0], 0) self.assertEqual(res[2], 800) def test_print(self): surf = pygame.Surface((70,70), 0, 32) self.assertEqual(repr(surf), '') def test_keyword_arguments(self): surf = pygame.Surface((70,70), flags=SRCALPHA, depth=32) self.assertEqual(surf.get_flags() & SRCALPHA, SRCALPHA) self.assertEqual(surf.get_bitsize(), 32) # sanity check to make sure the check below is valid surf_16 = pygame.Surface((70,70), 0, 16) self.assertEqual(surf_16.get_bytesize(), 2) # try again with an argument list surf_16 = pygame.Surface((70,70), depth=16) self.assertEqual(surf_16.get_bytesize(), 2) def test_set_at(self): #24bit surfaces s = pygame.Surface( (100, 100), 0, 24) s.fill((0,0,0)) # set it with a tuple. s.set_at((0,0), (10,10,10, 255)) r = s.get_at((0,0)) self.failUnless(isinstance(r, pygame.Color)) self.assertEqual(r, (10,10,10, 255)) # try setting a color with a single integer. s.fill((0,0,0,255)) s.set_at ((10, 1), 0x0000FF) r = s.get_at((10,1)) self.assertEqual(r, (0,0,255, 255)) def test_SRCALPHA(self): # has the flag been passed in ok? surf = pygame.Surface((70,70), SRCALPHA, 32) self.assertEqual(surf.get_flags() & SRCALPHA, SRCALPHA) #24bit surfaces can not have SRCALPHA. self.assertRaises(ValueError, pygame.Surface, (100, 100), pygame.SRCALPHA, 24) # if we have a 32 bit surface, the SRCALPHA should have worked too. surf2 = pygame.Surface((70,70), SRCALPHA) if surf2.get_bitsize() == 32: self.assertEqual(surf2.get_flags() & SRCALPHA, SRCALPHA) def test_masks(self): def make_surf(bpp, flags, masks): pygame.Surface((10, 10), flags, bpp, masks) # With some masks SDL_CreateRGBSurface does not work properly. masks = (0xFF000000, 0xFF0000, 0xFF00, 0) self.assertEqual(make_surf(32, 0, masks), None) # For 24 and 32 bit surfaces Pygame assumes no losses. masks = (0x7F0000, 0xFF00, 0xFF, 0) self.failUnlessRaises(ValueError, make_surf, 24, 0, masks) self.failUnlessRaises(ValueError, make_surf, 32, 0, masks) # What contiguous bits in a mask. masks = (0x6F0000, 0xFF00, 0xFF, 0) self.failUnlessRaises(ValueError, make_surf, 32, 0, masks) def test_get_buffer (self): surf = pygame.Surface ((70, 70), 0, 32) buf = surf.get_buffer () # 70*70*4 bytes = 19600 self.assertEqual (repr (buf), "") def test_get_bounding_rect (self): surf = pygame.Surface ((70, 70), SRCALPHA, 32) surf.fill((0,0,0,0)) bound_rect = surf.get_bounding_rect() self.assertEqual(bound_rect.width, 0) self.assertEqual(bound_rect.height, 0) surf.set_at((30,30),(255,255,255,1)) bound_rect = surf.get_bounding_rect() self.assertEqual(bound_rect.left, 30) self.assertEqual(bound_rect.top, 30) self.assertEqual(bound_rect.width, 1) self.assertEqual(bound_rect.height, 1) surf.set_at((29,29),(255,255,255,1)) bound_rect = surf.get_bounding_rect() self.assertEqual(bound_rect.left, 29) self.assertEqual(bound_rect.top, 29) self.assertEqual(bound_rect.width, 2) self.assertEqual(bound_rect.height, 2) surf = pygame.Surface ((70, 70), 0, 24) surf.fill((0,0,0)) bound_rect = surf.get_bounding_rect() self.assertEqual(bound_rect.width, surf.get_width()) self.assertEqual(bound_rect.height, surf.get_height()) surf.set_colorkey((0,0,0)) bound_rect = surf.get_bounding_rect() self.assertEqual(bound_rect.width, 0) self.assertEqual(bound_rect.height, 0) surf.set_at((30,30),(255,255,255)) bound_rect = surf.get_bounding_rect() self.assertEqual(bound_rect.left, 30) self.assertEqual(bound_rect.top, 30) self.assertEqual(bound_rect.width, 1) self.assertEqual(bound_rect.height, 1) surf.set_at((60,60),(255,255,255)) bound_rect = surf.get_bounding_rect() self.assertEqual(bound_rect.left, 30) self.assertEqual(bound_rect.top, 30) self.assertEqual(bound_rect.width, 31) self.assertEqual(bound_rect.height, 31) def test_copy(self): # __doc__ (as of 2008-06-25) for pygame.surface.Surface.copy: # Surface.copy(): return Surface # create a new copy of a Surface color = (25, 25, 25, 25) s1 = pygame.Surface((32,32), pygame.SRCALPHA, 32) s1.fill(color) s2 = s1.copy() s1rect = s1.get_rect() s2rect = s2.get_rect() self.assert_(s1rect.size == s2rect.size) self.assert_(s2.get_at((10,10)) == color) def test_fill(self): # __doc__ (as of 2008-06-25) for pygame.surface.Surface.fill: # Surface.fill(color, rect=None, special_flags=0): return Rect # fill Surface with a solid color color = (25, 25, 25, 25) fill_rect = pygame.Rect(0, 0, 16, 16) s1 = pygame.Surface((32,32), pygame.SRCALPHA, 32) s1.fill(color, fill_rect) for pt in test_utils.rect_area_pts(fill_rect): self.assert_(s1.get_at(pt) == color ) for pt in test_utils.rect_outer_bounds(fill_rect): self.assert_(s1.get_at(pt) != color ) def test_fill_keyword_args(self): color = (1, 2, 3, 255) area = (1, 1, 2, 2) s1 = pygame.Surface((4, 4), 0, 32) s1.fill(special_flags=pygame.BLEND_ADD, color=color, rect=area) self.assert_(s1.get_at((0, 0)) == (0, 0, 0, 255)) self.assert_(s1.get_at((1, 1)) == color) ######################################################################## def test_get_alpha(self): # __doc__ (as of 2008-06-25) for pygame.surface.Surface.get_alpha: # Surface.get_alpha(): return int_value or None # get the current Surface transparency value s1 = pygame.Surface((32,32), pygame.SRCALPHA, 32) self.assert_(s1.get_alpha() == 255) for alpha in (0, 32, 127, 255): s1.set_alpha(alpha) for t in range(4): s1.set_alpha(s1.get_alpha()) self.assert_(s1.get_alpha() == alpha) ######################################################################## def test_get_bytesize(self): # __doc__ (as of 2008-06-25) for pygame.surface.Surface.get_bytesize: # Surface.get_bytesize(): return int # get the bytes used per Surface pixel s1 = pygame.Surface((32,32), pygame.SRCALPHA, 32) self.assert_(s1.get_bytesize() == 4) self.assert_(s1.get_bitsize() == 32) ######################################################################## def test_get_flags(self): # __doc__ (as of 2008-06-25) for pygame.surface.Surface.get_flags: # Surface.get_flags(): return int # get the additional flags used for the Surface s1 = pygame.Surface((32,32), pygame.SRCALPHA, 32) self.assert_(s1.get_flags() == pygame.SRCALPHA) ######################################################################## def test_get_parent(self): # __doc__ (as of 2008-06-25) for pygame.surface.Surface.get_parent: # Surface.get_parent(): return Surface # find the parent of a subsurface parent = pygame.Surface((16, 16)) child = parent.subsurface((0,0,5,5)) self.assert_(child.get_parent() is parent) ######################################################################## def test_get_rect(self): # __doc__ (as of 2008-06-25) for pygame.surface.Surface.get_rect: # Surface.get_rect(**kwargs): return Rect # get the rectangular area of the Surface surf = pygame.Surface((16, 16)) rect = surf.get_rect() self.assert_(rect.size == (16, 16)) ######################################################################## def test_get_width__size_and_height(self): # __doc__ (as of 2008-06-25) for pygame.surface.Surface.get_width: # Surface.get_width(): return width # get the width of the Surface for w in xrange_(0, 255, 32): for h in xrange_(0, 127, 15): s = pygame.Surface((w, h)) self.assertEquals(s.get_width(), w) self.assertEquals(s.get_height(), h) self.assertEquals(s.get_size(), (w, h)) def test_set_colorkey(self): # __doc__ (as of 2008-06-25) for pygame.surface.Surface.set_colorkey: # Surface.set_colorkey(Color, flags=0): return None # Surface.set_colorkey(None): return None # Set the transparent colorkey s = pygame.Surface((16,16), pygame.SRCALPHA, 32) colorkeys = ((20,189,20, 255),(128,50,50,255), (23, 21, 255,255)) for colorkey in colorkeys: s.set_colorkey(colorkey) for t in range(4): s.set_colorkey(s.get_colorkey()) self.assertEquals(s.get_colorkey(), colorkey) def test_set_masks(self): s = pygame.Surface((32,32)) r,g,b,a = s.get_masks() s.set_masks((b,g,r,a)) r2,g2,b2,a2 = s.get_masks() self.assertEqual((r,g,b,a), (b2,g2,r2,a2)) def test_set_shifts(self): s = pygame.Surface((32,32)) r,g,b,a = s.get_shifts() s.set_shifts((b,g,r,a)) r2,g2,b2,a2 = s.get_shifts() self.assertEqual((r,g,b,a), (b2,g2,r2,a2)) def test_blit_keyword_args(self): color = (1, 2, 3, 255) s1 = pygame.Surface((4, 4), 0, 32) s2 = pygame.Surface((2, 2), 0, 32) s2.fill((1, 2, 3)) s1.blit(special_flags=BLEND_ADD, source=s2, dest=(1, 1), area=s2.get_rect()) self.assertEqual(s1.get_at((0, 0)), (0, 0, 0, 255)) self.assertEqual(s1.get_at((1, 1)), color) def todo_test_blit(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.blit: # Surface.blit(source, dest, area=None, special_flags = 0): return Rect # draw one image onto another # # Draws a source Surface onto this Surface. The draw can be positioned # with the dest argument. Dest can either be pair of coordinates # representing the upper left corner of the source. A Rect can also be # passed as the destination and the topleft corner of the rectangle # will be used as the position for the blit. The size of the # destination rectangle does not effect the blit. # # An optional area rectangle can be passed as well. This represents a # smaller portion of the source Surface to draw. # # An optional special flags is for passing in new in 1.8.0: BLEND_ADD, # BLEND_SUB, BLEND_MULT, BLEND_MIN, BLEND_MAX new in 1.8.1: # BLEND_RGBA_ADD, BLEND_RGBA_SUB, BLEND_RGBA_MULT, BLEND_RGBA_MIN, # BLEND_RGBA_MAX BLEND_RGB_ADD, BLEND_RGB_SUB, BLEND_RGB_MULT, # BLEND_RGB_MIN, BLEND_RGB_MAX With other special blitting flags # perhaps added in the future. # # The return rectangle is the area of the affected pixels, excluding # any pixels outside the destination Surface, or outside the clipping # area. # # Pixel alphas will be ignored when blitting to an 8 bit Surface. # special_flags new in pygame 1.8. self.fail() def test_blit__SRCALPHA_opaque_source(self): src = pygame.Surface( (256,256), SRCALPHA ,32) dst = src.copy() for i, j in test_utils.rect_area_pts(src.get_rect()): dst.set_at( (i,j), (i,0,0,j) ) src.set_at( (i,j), (0,i,0,255) ) dst.blit(src, (0,0)) for pt in test_utils.rect_area_pts(src.get_rect()): self.assertEquals ( dst.get_at(pt)[1], src.get_at(pt)[1] ) def todo_test_blit__blit_to_self(self): #TODO src = pygame.Surface( (256,256), SRCALPHA, 32) rect = src.get_rect() for pt, color in test_utils.gradient(rect.width, rect.height): src.set_at(pt, color) src.blit(src, (0, 0)) def todo_test_blit__SRCALPHA_to_SRCALPHA_non_zero(self): #TODO # " There is no unit test for blitting a SRCALPHA source with non-zero # alpha to a SRCALPHA destination with non-zero alpha " LL w,h = size = 32,32 s = pygame.Surface(size, pygame.SRCALPHA, 32) s2 = s.copy() s.fill((32,32,32,111)) s2.fill((32,32,32,31)) s.blit(s2, (0,0)) # TODO: # what is the correct behaviour ?? should it blend? what algorithm? self.assertEquals(s.get_at((0,0)), (32,32,32,31)) def todo_test_convert(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.convert: # Surface.convert(Surface): return Surface # Surface.convert(depth, flags=0): return Surface # Surface.convert(masks, flags=0): return Surface # Surface.convert(): return Surface # change the pixel format of an image # # Creates a new copy of the Surface with the pixel format changed. The # new pixel format can be determined from another existing Surface. # Otherwise depth, flags, and masks arguments can be used, similar to # the pygame.Surface() call. # # If no arguments are passed the new Surface will have the same pixel # format as the display Surface. This is always the fastest format for # blitting. It is a good idea to convert all Surfaces before they are # blitted many times. # # The converted Surface will have no pixel alphas. They will be # stripped if the original had them. See Surface.convert_alpha() for # preserving or creating per-pixel alphas. # self.fail() def todo_test_convert_alpha(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.convert_alpha: # Surface.convert_alpha(Surface): return Surface # Surface.convert_alpha(): return Surface # change the pixel format of an image including per pixel alphas # # Creates a new copy of the surface with the desired pixel format. The # new surface will be in a format suited for quick blitting to the # given format with per pixel alpha. If no surface is given, the new # surface will be optimized for blitting to the current display. # # Unlike the Surface.convert() method, the pixel format for the new # image will not be exactly the same as the requested source, but it # will be optimized for fast alpha blitting to the destination. # self.fail() def todo_test_get_abs_offset(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_abs_offset: # Surface.get_abs_offset(): return (x, y) # find the absolute position of a child subsurface inside its top level parent # # Get the offset position of a child subsurface inside of its top # level parent Surface. If the Surface is not a subsurface this will # return (0, 0). # self.fail() def todo_test_get_abs_parent(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_abs_parent: # Surface.get_abs_parent(): return Surface # find the top level parent of a subsurface # # Returns the parent Surface of a subsurface. If this is not a # subsurface then this surface will be returned. # self.fail() def todo_test_get_at(self): surf = pygame.Surface((2, 2), 0, 24) c00 = pygame.Color((1, 2, 3)) c01 = pygame.Color((5, 10, 15)) c10 = pygame.Color((100, 50, 0)) c11 = pygame.Color((4, 5, 6)) surf.set_at((0, 0), c00) surf.set_at((0, 1), c01) surf.set_at((1, 0), c10) surf.set_at((1, 1), c11) c = surf.get_at((0, 0)) self.failUnless(isinstance(c, pygame.Color)) self.failUnlessEqual(c, c00) self.failUnlessEqual(surf.get_at((0, 1)), c01) self.failUnlessEqual(surf.get_at((1, 0)), c10) self.failUnlessEqual(surf.get_at((1, 1)), c11) for p in [(-1, 0), (0, -1), (2, 0), (0, 2)]: self.failUnlessRaises(IndexError, surf.get_at, p, "%s" % (p,)) def todo_test_get_bitsize(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_bitsize: # Surface.get_bitsize(): return int # get the bit depth of the Surface pixel format # # Returns the number of bits used to represent each pixel. This value # may not exactly fill the number of bytes used per pixel. For example # a 15 bit Surface still requires a full 2 bytes. # self.fail() def todo_test_get_clip(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_clip: # Surface.get_clip(): return Rect # get the current clipping area of the Surface # # Return a rectangle of the current clipping area. The Surface will # always return a valid rectangle that will never be outside the # bounds of the image. If the Surface has had None set for the # clipping area, the Surface will return a rectangle with the full # area of the Surface. # self.fail() def todo_test_get_colorkey(self): surf = pygame.surface((2, 2), 0, 24) self.failUnless(surf.get_colorykey() is None) colorkey = pygame.Color(20, 40, 60) surf.set_colorkey(colorkey) ck = surf.get_colorkey() self.failUnless(isinstance(ck, pygame.Color)) self.failUnlessEqual(ck, colorkey) def todo_test_get_height(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_height: # Surface.get_height(): return height # get the height of the Surface # # Return the height of the Surface in pixels. self.fail() def todo_test_get_locked(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_locked: # Surface.get_locked(): return bool # test if the Surface is current locked # # Returns True when the Surface is locked. It doesn't matter how many # times the Surface is locked. # self.fail() def todo_test_get_locks(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_locks: # Surface.get_locks(): return tuple # Gets the locks for the Surface # # Returns the currently existing locks for the Surface. self.fail() def todo_test_get_losses(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_losses: # Surface.get_losses(): return (R, G, B, A) # the significant bits used to convert between a color and a mapped integer # # Return the least significant number of bits stripped from each color # in a mapped integer. # # This value is not needed for normal Pygame usage. self.fail() def todo_test_get_masks(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_masks: # Surface.get_masks(): return (R, G, B, A) # the bitmasks needed to convert between a color and a mapped integer # # Returns the bitmasks used to isolate each color in a mapped integer. # This value is not needed for normal Pygame usage. self.fail() def todo_test_get_offset(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_offset: # Surface.get_offset(): return (x, y) # find the position of a child subsurface inside a parent # # Get the offset position of a child subsurface inside of a parent. If # the Surface is not a subsurface this will return (0, 0). # self.fail() def test_get_palette(self): pygame.init() try: palette = [Color(i, i, i) for i in range(256)] pygame.display.set_mode((100, 50)) surf = pygame.Surface((2, 2), 0, 8) surf.set_palette(palette) palette2 = surf.get_palette() r,g,b = palette2[0] self.failUnlessEqual(len(palette2), len(palette)) for c2, c in zip(palette2, palette): self.failUnlessEqual(c2, c) for c in palette2: self.failUnless(isinstance(c, pygame.Color)) finally: pygame.quit() def test_get_palette_at(self): # See also test_get_palette pygame.init() try: pygame.display.set_mode((100, 50)) surf = pygame.Surface((2, 2), 0, 8) color = pygame.Color(1, 2, 3, 255) surf.set_palette_at(0, color) color2 = surf.get_palette_at(0) self.failUnless(isinstance(color2, pygame.Color)) self.failUnlessEqual(color2, color) self.failUnlessRaises(IndexError, surf.get_palette_at, -1) self.failUnlessRaises(IndexError, surf.get_palette_at, 256) finally: pygame.quit() def todo_test_get_pitch(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_pitch: # Surface.get_pitch(): return int # get the number of bytes used per Surface row # # Return the number of bytes separating each row in the Surface. # Surfaces in video memory are not always linearly packed. Subsurfaces # will also have a larger pitch than their real width. # # This value is not needed for normal Pygame usage. self.fail() def todo_test_get_shifts(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_shifts: # Surface.get_shifts(): return (R, G, B, A) # the bit shifts needed to convert between a color and a mapped integer # # Returns the pixel shifts need to convert between each color and a # mapped integer. # # This value is not needed for normal Pygame usage. self.fail() def todo_test_get_size(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.get_size: # Surface.get_size(): return (width, height) # get the dimensions of the Surface # # Return the width and height of the Surface in pixels. self.fail() def todo_test_lock(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.lock: # Surface.lock(): return None # lock the Surface memory for pixel access # # Lock the pixel data of a Surface for access. On accelerated # Surfaces, the pixel data may be stored in volatile video memory or # nonlinear compressed forms. When a Surface is locked the pixel # memory becomes available to access by regular software. Code that # reads or writes pixel values will need the Surface to be locked. # # Surfaces should not remain locked for more than necessary. A locked # Surface can often not be displayed or managed by Pygame. # # Not all Surfaces require locking. The Surface.mustlock() method can # determine if it is actually required. There is no performance # penalty for locking and unlocking a Surface that does not need it. # # All pygame functions will automatically lock and unlock the Surface # data as needed. If a section of code is going to make calls that # will repeatedly lock and unlock the Surface many times, it can be # helpful to wrap the block inside a lock and unlock pair. # # It is safe to nest locking and unlocking calls. The surface will # only be unlocked after the final lock is released. # self.fail() def test_map_rgb(self): color = Color(0, 128, 255, 64) surf = pygame.Surface((5, 5), SRCALPHA, 32) c = surf.map_rgb(color) self.failUnlessEqual(surf.unmap_rgb(c), color) self.failUnlessEqual(surf.get_at((0, 0)), (0, 0, 0, 0)) surf.fill(c) self.failUnlessEqual(surf.get_at((0, 0)), color) surf.fill((0, 0, 0, 0)) self.failUnlessEqual(surf.get_at((0, 0)), (0, 0, 0, 0)) surf.set_at((0, 0), c) self.failUnlessEqual(surf.get_at((0, 0)), color) def todo_test_mustlock(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.mustlock: # Surface.mustlock(): return bool # test if the Surface requires locking # # Returns True if the Surface is required to be locked to access pixel # data. Usually pure software Surfaces do not require locking. This # method is rarely needed, since it is safe and quickest to just lock # all Surfaces as needed. # # All pygame functions will automatically lock and unlock the Surface # data as needed. If a section of code is going to make calls that # will repeatedly lock and unlock the Surface many times, it can be # helpful to wrap the block inside a lock and unlock pair. # self.fail() def todo_test_set_alpha(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.set_alpha: # Surface.set_alpha(value, flags=0): return None # Surface.set_alpha(None): return None # set the alpha value for the full Surface image # # Set the current alpha value fo r the Surface. When blitting this # Surface onto a destination, the pixels will be drawn slightly # transparent. The alpha value is an integer from 0 to 255, 0 is fully # transparent and 255 is fully opaque. If None is passed for the alpha # value, then the Surface alpha will be disabled. # # This value is different than the per pixel Surface alpha. If the # Surface format contains per pixel alphas, then this alpha value will # be ignored. If the Surface contains per pixel alphas, setting the # alpha value to None will disable the per pixel transparency. # # The optional flags argument can be set to pygame.RLEACCEL to provide # better performance on non accelerated displays. An RLEACCEL Surface # will be slower to modify, but quicker to blit as a source. # s = pygame.Surface((1,1), SRCALHPA, 32) s.fill((1, 2, 3, 4)) s.set_alpha(None) self.failUnlessEqual(s.get_at((0, 0)), (1, 2, 3, 255)) self.fail() def test_set_palette(self): palette = [pygame.Color(i, i, i) for i in range(256)] palette[10] = tuple(palette[10]) # 4 element tuple palette[11] = tuple(palette[11])[0:3] # 3 element tuple surf = pygame.Surface((2, 2), 0, 8) pygame.init() try: pygame.display.set_mode((100, 50)) surf.set_palette(palette) for i in range(256): self.failUnlessEqual(surf.map_rgb(palette[i]), i, "palette color %i" % (i,)) c = palette[i] surf.fill(c) self.failUnlessEqual(surf.get_at((0, 0)), c, "palette color %i" % (i,)) for i in range(10): palette[i] = pygame.Color(255 - i, 0, 0) surf.set_palette(palette[0:10]) for i in range(256): self.failUnlessEqual(surf.map_rgb(palette[i]), i, "palette color %i" % (i,)) c = palette[i] surf.fill(c) self.failUnlessEqual(surf.get_at((0, 0)), c, "palette color %i" % (i,)) self.failUnlessRaises(ValueError, surf.set_palette, [Color(1, 2, 3, 254)]) self.failUnlessRaises(ValueError, surf.set_palette, (1, 2, 3, 254)) finally: pygame.quit() def test_set_palette_at(self): pygame.init() try: pygame.display.set_mode((100, 50)) surf = pygame.Surface((2, 2), 0, 8) original = surf.get_palette_at(10) replacement = Color(1, 1, 1, 255) if replacement == original: replacement = Color(2, 2, 2, 255) surf.set_palette_at(10, replacement) self.failUnlessEqual(surf.get_palette_at(10), replacement) next = tuple(original) surf.set_palette_at(10, next) self.failUnlessEqual(surf.get_palette_at(10), next) next = tuple(original)[0:3] surf.set_palette_at(10, next) self.failUnlessEqual(surf.get_palette_at(10), next) self.failUnlessRaises(IndexError, surf.set_palette_at, 256, replacement) self.failUnlessRaises(IndexError, surf.set_palette_at, -1, replacement) finally: pygame.quit() def test_subsurface(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.subsurface: # Surface.subsurface(Rect): return Surface # create a new surface that references its parent # # Returns a new Surface that shares its pixels with its new parent. # The new Surface is considered a child of the original. Modifications # to either Surface pixels will effect each other. Surface information # like clipping area and color keys are unique to each Surface. # # The new Surface will inherit the palette, color key, and alpha # settings from its parent. # # It is possible to have any number of subsurfaces and subsubsurfaces # on the parent. It is also possible to subsurface the display Surface # if the display mode is not hardware accelerated. # # See the Surface.get_offset(), Surface.get_parent() to learn more # about the state of a subsurface. # surf = pygame.Surface((16, 16)) s = surf.subsurface(0,0,1,1) s = surf.subsurface((0,0,1,1)) #s = surf.subsurface((0,0,1,1), 1) # This form is not acceptable. #s = surf.subsurface(0,0,10,10, 1) self.assertRaises(ValueError, surf.subsurface, (0,0,1,1,666)) self.assertEquals(s.get_shifts(), surf.get_shifts()) self.assertEquals(s.get_masks(), surf.get_masks()) self.assertEquals(s.get_losses(), surf.get_losses()) def todo_test_unlock(self): # __doc__ (as of 2008-08-02) for pygame.surface.Surface.unlock: # Surface.unlock(): return None # unlock the Surface memory from pixel access # # Unlock the Surface pixel data after it has been locked. The unlocked # Surface can once again be drawn and managed by Pygame. See the # Surface.lock() documentation for more details. # # All pygame functions will automatically lock and unlock the Surface # data as needed. If a section of code is going to make calls that # will repeatedly lock and unlock the Surface many times, it can be # helpful to wrap the block inside a lock and unlock pair. # # It is safe to nest locking and unlocking calls. The surface will # only be unlocked after the final lock is released. # self.fail() def test_unmap_rgb(self): # Special case, 8 bit-per-pixel surface (has a palette). surf = pygame.Surface((2, 2), 0, 8) c = (1, 1, 1) # Unlikely to be in a default palette. i = 67 pygame.init() try: pygame.display.set_mode((100, 50)) surf.set_palette_at(i, c) unmapped_c = surf.unmap_rgb(i) self.failUnlessEqual(unmapped_c, c) # Confirm it is a Color instance self.failUnless(isinstance(unmapped_c, pygame.Color)) finally: pygame.quit() # Remaining, non-pallete, cases. c = (128, 64, 12, 255) formats = [(0, 16), (0, 24), (0, 32), (SRCALPHA, 16), (SRCALPHA, 32)] for flags, bitsize in formats: surf = pygame.Surface((2, 2), flags, bitsize) unmapped_c = surf.unmap_rgb(surf.map_rgb(c)) surf.fill(c) comparison_c = surf.get_at((0, 0)) self.failUnlessEqual(unmapped_c, comparison_c, "%s != %s, flags: %i, bitsize: %i" % (unmapped_c, comparison_c, flags, bitsize)) # Confirm it is a Color instance self.failUnless(isinstance(unmapped_c, pygame.Color)) def test_scroll(self): scrolls = [(8, 2, 3), (16, 2, 3), (24, 2, 3), (32, 2, 3), (32, -1, -3), (32, 0, 0), (32, 11, 0), (32, 0, 11), (32, -11, 0), (32, 0, -11), (32, -11, 2), (32, 2, -11)] for bitsize, dx, dy in scrolls: surf = pygame.Surface((10, 10), 0, bitsize) surf.fill((255, 0, 0)) surf.fill((0, 255, 0), (2, 2, 2, 2,)) comp = surf.copy() comp.blit(surf, (dx, dy)) surf.scroll(dx, dy) w, h = surf.get_size() for x in range(w): for y in range(h): self.failUnlessEqual(surf.get_at((x, y)), comp.get_at((x, y)), "%s != %s, bpp:, %i, x: %i, y: %i" % (surf.get_at((x, y)), comp.get_at((x, y)), bitsize, dx, dy)) # Confirm clip rect containment surf = pygame.Surface((20, 13), 0, 32) surf.fill((255, 0, 0)) surf.fill((0, 255, 0), (7, 1, 6, 6)) comp = surf.copy() clip = Rect(3, 1, 8, 14) surf.set_clip(clip) comp.set_clip(clip) comp.blit(surf, (clip.x + 2, clip.y + 3), surf.get_clip()) surf.scroll(2, 3) w, h = surf.get_size() for x in range(w): for y in range(h): self.failUnlessEqual(surf.get_at((x, y)), comp.get_at((x, y))) # Confirm keyword arguments and per-pixel alpha spot_color = (0, 255, 0, 128) surf = pygame.Surface((4, 4), pygame.SRCALPHA, 32) surf.fill((255, 0, 0, 255)) surf.set_at((1, 1), spot_color) surf.scroll(dx=1) self.failUnlessEqual(surf.get_at((2, 1)), spot_color) surf.scroll(dy=1) self.failUnlessEqual(surf.get_at((2, 2)), spot_color) surf.scroll(dy=1, dx=1) self.failUnlessEqual(surf.get_at((3, 3)), spot_color) surf.scroll(dx=-3, dy=-3) self.failUnlessEqual(surf.get_at((0, 0)), spot_color) class SurfaceBlendTest (unittest.TestCase): test_palette = [(0, 0, 0, 255), (10, 30, 60, 0), (25, 75, 100, 128), (200, 150, 100, 200), (0, 100, 200, 255)] surf_size = (10, 12) test_points = [((0, 0), 1), ((4, 5), 1), ((9, 0), 2), ((5, 5), 2), ((0, 11), 3), ((4, 6), 3), ((9, 11), 4), ((5, 6), 4)] def _make_surface(self, bitsize, srcalpha=False, palette=None): if palette is None: palette = self.test_palette flags = 0 if srcalpha: flags |= SRCALPHA surf = pygame.Surface(self.surf_size, flags, bitsize) if bitsize == 8: surf.set_palette([c[:3] for c in palette]) return surf def _fill_surface(self, surf, palette=None): if palette is None: palette = self.test_palette surf.fill(palette[1], (0, 0, 5, 6)) surf.fill(palette[2], (5, 0, 5, 6)) surf.fill(palette[3], (0, 6, 5, 6)) surf.fill(palette[4], (5, 6, 5, 6)) def _make_src_surface(self, bitsize, srcalpha=False, palette=None): surf = self._make_surface(bitsize, srcalpha, palette) self._fill_surface(surf, palette) return surf def _assert_surface(self, surf, palette=None, msg=""): if palette is None: palette = self.test_palette if surf.get_bitsize() == 16: palette = [surf.unmap_rgb(surf.map_rgb(c)) for c in palette] for posn, i in self.test_points: self.failUnlessEqual(surf.get_at(posn), palette[i], "%s != %s: flags: %i, bpp: %i, posn: %s%s" % (surf.get_at(posn), palette[i], surf.get_flags(), surf.get_bitsize(), posn, msg)) def setUp(self): # Needed for 8 bits-per-pixel color palette surface tests. pygame.init() def tearDown(self): pygame.quit() def test_blit_blend(self): sources = [self._make_src_surface(8), self._make_src_surface(16), self._make_src_surface(16, srcalpha=True), self._make_src_surface(24), self._make_src_surface(32), self._make_src_surface(32, srcalpha=True)] destinations = [self._make_surface(8), self._make_surface(16), self._make_surface(16, srcalpha=True), self._make_surface(24), self._make_surface(32), self._make_surface(32, srcalpha=True)] blend = [('BLEND_ADD', (0, 25, 100, 255), lambda a, b: min(a + b, 255)), ('BLEND_SUB', (100, 25, 0, 100), lambda a, b: max(a - b, 0)), ('BLEND_MULT', (100, 200, 0, 0), lambda a, b: (a * b) // 256), ('BLEND_MIN', (255, 0, 0, 255), min), ('BLEND_MAX', (0, 255, 0, 255), max)] for src in sources: src_palette = [src.unmap_rgb(src.map_rgb(c)) for c in self.test_palette] for dst in destinations: for blend_name, dst_color, op in blend: dc = dst.unmap_rgb(dst.map_rgb(dst_color)) p = [] for sc in src_palette: c = [op(dc[i], sc[i]) for i in range(3)] if dst.get_masks()[3]: c.append(dc[3]) else: c.append(255) c = dst.unmap_rgb(dst.map_rgb(c)) p.append(c) dst.fill(dst_color) dst.blit(src, (0, 0), special_flags=getattr(pygame, blend_name)) self._assert_surface(dst, p, (", op: %s, src bpp: %i" ", src flags: %i" % (blend_name, src.get_bitsize(), src.get_flags()))) src = self._make_src_surface(32) masks = src.get_masks() dst = pygame.Surface(src.get_size(), 0, 32, [masks[1], masks[2], masks[0], masks[3]]) for blend_name, dst_color, op in blend: p = [] for src_color in self.test_palette: c = [op(dst_color[i], src_color[i]) for i in range(3)] c.append(255) p.append(tuple(c)) dst.fill(dst_color) dst.blit(src, (0, 0), special_flags=getattr(pygame, blend_name)) self._assert_surface(dst, p, ", %s" % blend_name) # Blend blits are special cased for 32 to 32 bit surfaces. # # Confirm that it works when the rgb bytes are not the # least significant bytes. pat = self._make_src_surface(32) masks = pat.get_masks() if min(masks) == intify(0xFF000000): masks = [longify(m) >> 8 for m in masks] else: masks = [intify(m << 8) for m in masks] src = pygame.Surface(pat.get_size(), 0, 32, masks) self._fill_surface(src) dst = pygame.Surface(src.get_size(), 0, 32, masks) for blend_name, dst_color, op in blend: p = [] for src_color in self.test_palette: c = [op(dst_color[i], src_color[i]) for i in range(3)] c.append(255) p.append(tuple(c)) dst.fill(dst_color) dst.blit(src, (0, 0), special_flags=getattr(pygame, blend_name)) self._assert_surface(dst, p, ", %s" % blend_name) def test_blit_blend_rgba(self): sources = [self._make_src_surface(8), self._make_src_surface(16), self._make_src_surface(16, srcalpha=True), self._make_src_surface(24), self._make_src_surface(32), self._make_src_surface(32, srcalpha=True)] destinations = [self._make_surface(8), self._make_surface(16), self._make_surface(16, srcalpha=True), self._make_surface(24), self._make_surface(32), self._make_surface(32, srcalpha=True)] blend = [('BLEND_RGBA_ADD', (0, 25, 100, 255), lambda a, b: min(a + b, 255)), ('BLEND_RGBA_SUB', (0, 25, 100, 255), lambda a, b: max(a - b, 0)), ('BLEND_RGBA_MULT', (0, 7, 100, 255), lambda a, b: (a * b) // 256), ('BLEND_RGBA_MIN', (0, 255, 0, 255), min), ('BLEND_RGBA_MAX', (0, 255, 0, 255), max)] for src in sources: src_palette = [src.unmap_rgb(src.map_rgb(c)) for c in self.test_palette] for dst in destinations: for blend_name, dst_color, op in blend: dc = dst.unmap_rgb(dst.map_rgb(dst_color)) p = [] for sc in src_palette: c = [op(dc[i], sc[i]) for i in range(4)] if not dst.get_masks()[3]: c[3] = 255 c = dst.unmap_rgb(dst.map_rgb(c)) p.append(c) dst.fill(dst_color) dst.blit(src, (0, 0), special_flags=getattr(pygame, blend_name)) self._assert_surface(dst, p, (", op: %s, src bpp: %i" ", src flags: %i" % (blend_name, src.get_bitsize(), src.get_flags()))) # Blend blits are special cased for 32 to 32 bit surfaces # with per-pixel alpha. # # Confirm the general case is used instead when the formats differ. src = self._make_src_surface(32, srcalpha=True) masks = src.get_masks() dst = pygame.Surface(src.get_size(), SRCALPHA, 32, (masks[1], masks[2], masks[3], masks[0])) for blend_name, dst_color, op in blend: p = [tuple([op(dst_color[i], src_color[i]) for i in range(4)]) for src_color in self.test_palette] dst.fill(dst_color) dst.blit(src, (0, 0), special_flags=getattr(pygame, blend_name)) self._assert_surface(dst, p, ", %s" % blend_name) # Confirm this special case handles subsurfaces. src = pygame.Surface((8, 10), SRCALPHA, 32) dst = pygame.Surface((8, 10), SRCALPHA, 32) tst = pygame.Surface((8, 10), SRCALPHA, 32) src.fill((1, 2, 3, 4)) dst.fill((40, 30, 20, 10)) subsrc = src.subsurface((2, 3, 4, 4)) try: subdst = dst.subsurface((2, 3, 4, 4)) try: subdst.blit(subsrc, (0, 0), special_flags=BLEND_RGBA_ADD) finally: del subdst finally: del subsrc tst.fill((40, 30, 20, 10)) tst.fill((41, 32, 23, 14), (2, 3, 4, 4)) for x in range(8): for y in range(10): self.failUnlessEqual(dst.get_at((x, y)), tst.get_at((x, y)), "%s != %s at (%i, %i)" % (dst.get_at((x, y)), tst.get_at((x, y)), x, y)) def test_GET_PIXELVALS(self): # surface.h GET_PIXELVALS bug regarding whether of not # a surface has per-pixel alpha. Looking at the Amask # is not enough. The surface's SRCALPHA flag must also # be considered. Fix rev. 1923. src = self._make_surface(32, srcalpha=True) src.fill((0, 0, 0, 128)) src.set_alpha(None) # Clear SRCALPHA flag. dst = self._make_surface(32, srcalpha=True) dst.blit(src, (0, 0), special_flags=BLEND_RGBA_ADD) self.failUnlessEqual(dst.get_at((0, 0)), (0, 0, 0, 255)) def test_fill_blend(self): destinations = [self._make_surface(8), self._make_surface(16), self._make_surface(16, srcalpha=True), self._make_surface(24), self._make_surface(32), self._make_surface(32, srcalpha=True)] blend = [('BLEND_ADD', (0, 25, 100, 255), lambda a, b: min(a + b, 255)), ('BLEND_SUB', (0, 25, 100, 255), lambda a, b: max(a - b, 0)), ('BLEND_MULT', (0, 7, 100, 255), lambda a, b: (a * b) // 256), ('BLEND_MIN', (0, 255, 0, 255), min), ('BLEND_MAX', (0, 255, 0, 255), max)] for dst in destinations: dst_palette = [dst.unmap_rgb(dst.map_rgb(c)) for c in self.test_palette] for blend_name, fill_color, op in blend: fc = dst.unmap_rgb(dst.map_rgb(fill_color)) self._fill_surface(dst) p = [] for dc in dst_palette: c = [op(dc[i], fc[i]) for i in range(3)] if dst.get_masks()[3]: c.append(dc[3]) else: c.append(255) c = dst.unmap_rgb(dst.map_rgb(c)) p.append(c) dst.fill(fill_color, special_flags=getattr(pygame, blend_name)) self._assert_surface(dst, p, ", %s" % blend_name) def test_fill_blend_rgba(self): destinations = [self._make_surface(8), self._make_surface(16), self._make_surface(16, srcalpha=True), self._make_surface(24), self._make_surface(32), self._make_surface(32, srcalpha=True)] blend = [('BLEND_RGBA_ADD', (0, 25, 100, 255), lambda a, b: min(a + b, 255)), ('BLEND_RGBA_SUB', (0, 25, 100, 255), lambda a, b: max(a - b, 0)), ('BLEND_RGBA_MULT', (0, 7, 100, 255), lambda a, b: (a * b) // 256), ('BLEND_RGBA_MIN', (0, 255, 0, 255), min), ('BLEND_RGBA_MAX', (0, 255, 0, 255), max)] for dst in destinations: dst_palette = [dst.unmap_rgb(dst.map_rgb(c)) for c in self.test_palette] for blend_name, fill_color, op in blend: fc = dst.unmap_rgb(dst.map_rgb(fill_color)) self._fill_surface(dst) p = [] for dc in dst_palette: c = [op(dc[i], fc[i]) for i in range(4)] if not dst.get_masks()[3]: c[3] = 255 c = dst.unmap_rgb(dst.map_rgb(c)) p.append(c) dst.fill(fill_color, special_flags=getattr(pygame, blend_name)) self._assert_surface(dst, p, ", %s" % blend_name) class SurfaceSelfBlitTest(unittest.TestCase): """Blit to self tests. This test case is in response to MotherHamster Bugzilla Bug 19. """ test_palette = [(0, 0, 0, 255), (255, 0, 0, 0), (0, 255, 0, 255)] surf_size = (9, 6) def _fill_surface(self, surf, palette=None): if palette is None: palette = self.test_palette surf.fill(palette[1]) surf.fill(palette[2], (1, 2, 1, 2)) def _make_surface(self, bitsize, srcalpha=False, palette=None): if palette is None: palette = self.test_palette flags = 0 if srcalpha: flags |= SRCALPHA surf = pygame.Surface(self.surf_size, flags, bitsize) if bitsize == 8: surf.set_palette([c[:3] for c in palette]) self._fill_surface(surf, palette) return surf def _assert_same(self, a, b): w, h = a.get_size() for x in range(w): for y in range(h): self.failUnlessEqual(a.get_at((x, y)), b.get_at((x, y)), ("%s != %s, bpp: %i" % (a.get_at((x, y)), b.get_at((x, y)), a.get_bitsize()))) def setUp(self): # Needed for 8 bits-per-pixel color palette surface tests. pygame.init() def tearDown(self): pygame.quit() def test_overlap_check(self): # Ensure overlapping blits are properly detected. There are two # places where this is done, within SoftBlitPyGame() in alphablit.c # and PySurface_Blit() in surface.c. SoftBlitPyGame should catch the # per-pixel alpha surface, PySurface_Blit the colorkey and blanket # alpha surface. per-pixel alpha and blanket alpha self blits are # not properly handled by SDL 1.2.13, so Pygame does them. bgc = (0, 0, 0, 255) rectc_left = (128, 64, 32, 255) rectc_right = (255, 255, 255, 255) colors = [(255, 255, 255, 255), (128, 64, 32, 255)] overlaps = [(0, 0, 1, 0, (50, 0)), (0, 0, 49, 1, (98, 2)), (0, 0, 49, 49, (98, 98)), (49, 0, 0, 1, (0, 2)), (49, 0, 0, 49, (0, 98))] surfs = [pygame.Surface((100, 100), SRCALPHA, 32)] surf = pygame.Surface((100, 100), 0, 32) surf.set_alpha(255) surfs.append(surf) surf = pygame.Surface((100, 100), 0, 32) surf.set_colorkey((0, 1, 0)) surfs.append(surf) for surf in surfs: for s_x, s_y, d_x, d_y, test_posn in overlaps: surf.fill(bgc) surf.fill(rectc_right, (25, 0, 25, 50)) surf.fill(rectc_left, (0, 0, 25, 50)) surf.blit(surf, (d_x, d_y), (s_x, s_y, 50, 50)) self.failUnlessEqual(surf.get_at(test_posn), rectc_right) def test_colorkey(self): # Check a workaround for an SDL 1.2.13 surface self-blit problem # (MotherHamster Bugzilla bug 19). pygame.display.set_mode((100, 50)) # Needed for 8bit surface bitsizes = [8, 16, 24, 32] for bitsize in bitsizes: surf = self._make_surface(bitsize) surf.set_colorkey(self.test_palette[1]) surf.blit(surf, (3, 0)) p = [] for c in self.test_palette: c = surf.unmap_rgb(surf.map_rgb(c)) p.append(c) p[1] = (p[1][0], p[1][1], p[1][2], 0) tmp = self._make_surface(32, srcalpha=True, palette=p) tmp.blit(tmp, (3, 0)) tmp.set_alpha(None) comp = self._make_surface(bitsize) comp.blit(tmp, (0, 0)) self._assert_same(surf, comp) def test_blanket_alpha(self): # Check a workaround for an SDL 1.2.13 surface self-blit problem # (MotherHamster Bugzilla bug 19). pygame.display.set_mode((100, 50)) # Needed for 8bit surface bitsizes = [8, 16, 24, 32] for bitsize in bitsizes: surf = self._make_surface(bitsize) surf.set_alpha(128) surf.blit(surf, (3, 0)) p = [] for c in self.test_palette: c = surf.unmap_rgb(surf.map_rgb(c)) p.append((c[0], c[1], c[2], 128)) tmp = self._make_surface(32, srcalpha=True, palette=p) tmp.blit(tmp, (3, 0)) tmp.set_alpha(None) comp = self._make_surface(bitsize) comp.blit(tmp, (0, 0)) self._assert_same(surf, comp) def test_pixel_alpha(self): bitsizes = [16, 32] for bitsize in bitsizes: surf = self._make_surface(bitsize, srcalpha=True) comp = self._make_surface(bitsize, srcalpha=True) comp.blit(surf, (3, 0)) surf.blit(surf, (3, 0)) self._assert_same(surf, comp) def test_blend(self): bitsizes = [8, 16, 24, 32] blends = ['BLEND_ADD', 'BLEND_SUB', 'BLEND_MULT', 'BLEND_MIN', 'BLEND_MAX'] for bitsize in bitsizes: surf = self._make_surface(bitsize) comp = self._make_surface(bitsize) for blend in blends: self._fill_surface(surf) self._fill_surface(comp) comp.blit(surf, (3, 0), special_flags=getattr(pygame, blend)) surf.blit(surf, (3, 0), special_flags=getattr(pygame, blend)) self._assert_same(surf, comp) def test_blend_rgba(self): bitsizes = [16, 32] blends = ['BLEND_RGBA_ADD', 'BLEND_RGBA_SUB', 'BLEND_RGBA_MULT', 'BLEND_RGBA_MIN', 'BLEND_RGBA_MAX'] for bitsize in bitsizes: surf = self._make_surface(bitsize, srcalpha=True) comp = self._make_surface(bitsize, srcalpha=True) for blend in blends: self._fill_surface(surf) self._fill_surface(comp) comp.blit(surf, (3, 0), special_flags=getattr(pygame, blend)) surf.blit(surf, (3, 0), special_flags=getattr(pygame, blend)) self._assert_same(surf, comp) def test_subsurface(self): # Blitting a surface to its subsurface is allowed. surf = self._make_surface(32, srcalpha=True) comp = surf.copy() comp.blit(surf, (3, 0)) sub = surf.subsurface((3, 0, 6, 6)) sub.blit(surf, (0, 0)) del sub self._assert_same(surf, comp) # Blitting a subsurface to its owner is forbidden because of # lock conficts. This limitation allows the overlap check # in PySurface_Blit of alphablit.c to be simplified. def do_blit(d, s): d.blit(s, (0, 0)) sub = surf.subsurface((1, 1, 2, 2)) self.failUnlessRaises(pygame.error, do_blit, surf, sub) if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/sprite_test.py0000644000175000017500000007411211207055754020154 0ustar vincentvincent#################################### IMPORTS ################################### if __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils \ import test_not_implemented, unordered_equality, unittest else: from test.test_utils \ import test_not_implemented, unordered_equality, unittest import pygame from pygame import sprite ################################# MODULE LEVEL ################################# class SpriteModuleTest( unittest.TestCase ): pass ######################### SPRITECOLLIDE FUNCTIONS TEST ######################### class SpriteCollideTest( unittest.TestCase ): def setUp(self): self.ag = sprite.AbstractGroup() self.ag2 = sprite.AbstractGroup() self.s1 = sprite.Sprite(self.ag) self.s2 = sprite.Sprite(self.ag2) self.s3 = sprite.Sprite(self.ag2) self.s1.image = pygame.Surface((50,10), pygame.SRCALPHA, 32) self.s2.image = pygame.Surface((10,10), pygame.SRCALPHA, 32) self.s3.image = pygame.Surface((10,10), pygame.SRCALPHA, 32) self.s1.rect = self.s1.image.get_rect() self.s2.rect = self.s2.image.get_rect() self.s3.rect = self.s3.image.get_rect() self.s2.rect.move_ip(40, 0) self.s3.rect.move_ip(100, 100) def test_spritecollide__works_if_collided_cb_is_None(self): # Test that sprites collide without collided function. self.assertEqual ( sprite.spritecollide ( self.s1, self.ag2, dokill = False, collided = None ), [self.s2] ) def test_spritecollide__works_if_collided_cb_not_passed(self): # Should also work when collided function isn't passed at all. self.assertEqual(sprite.spritecollide ( self.s1, self.ag2, dokill = False), [self.s2] ) def test_spritecollide__collided_must_be_a_callable(self): # Need to pass a callable. self.assertRaises ( TypeError, sprite.spritecollide, self.s1, self.ag2, dokill = False, collided = 1 ) def test_spritecollide__collided_defaults_to_collide_rect(self): # collide_rect should behave the same as default. self.assertEqual ( sprite.spritecollide ( self.s1, self.ag2, dokill = False, collided = sprite.collide_rect ), [self.s2] ) def test_collide_rect_ratio__ratio_of_one_like_default(self): # collide_rect_ratio should behave the same as default at a 1.0 ratio. self.assertEqual ( sprite.spritecollide ( self.s1, self.ag2, dokill = False, collided = sprite.collide_rect_ratio(1.0) ), [self.s2] ) def test_collide_rect_ratio__collides_all_at_ratio_of_twenty(self): # collide_rect_ratio should collide all at a 20.0 ratio. self.assert_ ( unordered_equality ( sprite.spritecollide ( self.s1, self.ag2, dokill = False, collided = sprite.collide_rect_ratio(20.0) ), [self.s2, self.s3] ) ) def test_collide_circle__no_radius_set(self): # collide_circle with no radius set. self.assertEqual ( sprite.spritecollide ( self.s1, self.ag2, dokill = False, collided = sprite.collide_circle ), [self.s2] ) def test_collide_circle_ratio__no_radius_and_ratio_of_one(self): # collide_circle_ratio with no radius set, at a 1.0 ratio. self.assertEqual ( sprite.spritecollide ( self.s1, self.ag2, dokill = False, collided = sprite.collide_circle_ratio(1.0) ), [self.s2] ) def test_collide_circle_ratio__no_radius_and_ratio_of_twenty(self): # collide_circle_ratio with no radius set, at a 20.0 ratio. self.assert_ ( unordered_equality ( sprite.spritecollide ( self.s1, self.ag2, dokill = False, collided = sprite.collide_circle_ratio(20.0) ), [self.s2, self.s3] ) ) def test_collide_circle__with_radii_set(self): # collide_circle with a radius set. self.s1.radius = 50 self.s2.radius = 10 self.s3.radius = 400 self.assert_ ( unordered_equality ( sprite.spritecollide ( self.s1, self.ag2, dokill = False, collided = sprite.collide_circle ), [self.s2, self.s3] ) ) def test_collide_circle_ratio__with_radii_set(self): self.s1.radius = 50 self.s2.radius = 10 self.s3.radius = 400 # collide_circle_ratio with a radius set. self.assert_ ( unordered_equality ( sprite.spritecollide ( self.s1, self.ag2, dokill = False, collided = sprite.collide_circle_ratio(0.5) ), [self.s2, self.s3] ) ) def test_collide_mask(self): # make some fully opaque sprites that will collide with masks. self.s1.image.fill((255,255,255,255)) self.s2.image.fill((255,255,255,255)) self.s3.image.fill((255,255,255,255)) # masks should be autogenerated from image if they don't exist. self.assertEqual ( sprite.spritecollide ( self.s1, self.ag2, dokill = False, collided = sprite.collide_mask ), [self.s2] ) self.s1.mask = pygame.mask.from_surface(self.s1.image) self.s2.mask = pygame.mask.from_surface(self.s2.image) self.s3.mask = pygame.mask.from_surface(self.s3.image) # with set masks. self.assertEqual ( sprite.spritecollide ( self.s1, self.ag2, dokill = False, collided = sprite.collide_mask ), [self.s2] ) def test_collide_mask(self): # make some sprites that are fully transparent, so they won't collide. self.s1.image.fill((255,255,255,0)) self.s2.image.fill((255,255,255,0)) self.s3.image.fill((255,255,255,0)) self.s1.mask = pygame.mask.from_surface(self.s1.image, 255) self.s2.mask = pygame.mask.from_surface(self.s2.image, 255) self.s3.mask = pygame.mask.from_surface(self.s3.image, 255) self.assertFalse ( sprite.spritecollide ( self.s1, self.ag2, dokill = False, collided = sprite.collide_mask ) ) def todo_test_spritecollideany(self): # __doc__ (as of 2008-08-02) for pygame.sprite.spritecollideany: # pygame.sprite.spritecollideany(sprite, group) -> sprite # finds any sprites that collide # # given a sprite and a group of sprites, this will # return return any single sprite that collides with # with the given sprite. If there are no collisions # this returns None. # # if you don't need all the features of the # spritecollide function, this function will be a # bit quicker. # # collided is a callback function used to calculate if # two sprites are colliding. it should take two sprites # as values, and return a bool value indicating if # they are colliding. if collided is not passed, all # sprites must have a "rect" value, which is a # rectangle of the sprite area, which will be used # to calculate the collision. # # Test if the given Sprite intersects with any Sprites in a Group. # Intersection is determined by comparing of the Sprite.rect attribute # of each Sprite. # # This collision test can be faster than pygame.sprite.spritecollide() # since it has less work to do. self.fail() def todo_test_groupcollide(self): # __doc__ (as of 2008-08-02) for pygame.sprite.groupcollide: # pygame.sprite.groupcollide(groupa, groupb, dokilla, dokillb) -> dict # collision detection between group and group # # given two groups, this will find the intersections # between all sprites in each group. it returns a # dictionary of all sprites in the first group that # collide. the value for each item in the dictionary # is a list of the sprites in the second group it # collides with. the two dokill arguments control if # the sprites from either group will be automatically # removed from all groups. # collided is a callback function used to calculate if # two sprites are colliding. it should take two sprites # as values, and return a bool value indicating if # they are colliding. if collided is not passed, all # sprites must have a "rect" value, which is a # rectangle of the sprite area, which will be used # to calculate the collision. # # This will find intersections between all the Sprites in two groups. # Intersection is determined by comparing the Sprite.rect attribute of # each Sprite. # # Every Sprite inside group1 is added to the return dictionary. The # value for each item is the list of Sprites in group2 that intersect. # # If either dokill argument is True, the intersecting Sprites will be # removed from their respective Group. self.fail() def todo_test_collide_rect(self): # __doc__ (as of 2008-08-02) for pygame.sprite.collide_rect: # collision detection between two sprites, using rects. # pygame.sprite.collide_rect(left, right): return bool # # Tests for collision between two sprites. Uses the # pygame rect colliderect function to calculate the # collision. Intended to be passed as a collided # callback function to the *collide functions. # Sprites must have a "rect" attributes. # # New in pygame 1.8.0 # # Tests for collision between two sprites. Uses the pygame rect # colliderect function to calculate the collision. Intended to be # passed as a collided callback function to the *collide functions. # Sprites must have a "rect" attributes. # # New in pygame 1.8.0 self.fail() ################################################################################ class AbstractGroupTypeTest( unittest.TestCase ): def test_has( self ): " See if AbstractGroup.has() works as expected. " ag = sprite.AbstractGroup() ag2 = sprite.AbstractGroup() s1 = sprite.Sprite(ag) s2 = sprite.Sprite(ag) s3 = sprite.Sprite(ag2) s4 = sprite.Sprite(ag2) self.assertEqual(True, s1 in ag ) self.assertEqual(True, ag.has(s1) ) self.assertEqual(True, ag.has([s1, s2]) ) # see if one of them not being in there. self.assertNotEqual(True, ag.has([s1, s2, s3]) ) # see if a second AbstractGroup works. self.assertEqual(True, ag2.has(s3) ) def todo_test_add(self): # __doc__ (as of 2008-08-02) for pygame.sprite.AbstractGroup.add: # add(sprite, list, or group, ...) # add sprite to group # # Add a sprite or sequence of sprites to a group. self.fail() def todo_test_add_internal(self): # __doc__ (as of 2008-08-02) for pygame.sprite.AbstractGroup.add_internal: # self.fail() def todo_test_clear(self): # __doc__ (as of 2008-08-02) for pygame.sprite.AbstractGroup.clear: # clear(surface, bgd) # erase the previous position of all sprites # # Clears the area of all drawn sprites. the bgd # argument should be Surface which is the same # dimensions as the surface. The bgd can also be # a function which gets called with the passed # surface and the area to be cleared. self.fail() def todo_test_copy(self): # __doc__ (as of 2008-08-02) for pygame.sprite.AbstractGroup.copy: # copy() # copy a group with all the same sprites # # Returns a copy of the group that is the same class # type, and has the same sprites in it. self.fail() def todo_test_draw(self): # __doc__ (as of 2008-08-02) for pygame.sprite.AbstractGroup.draw: # draw(surface) # draw all sprites onto the surface # # Draws all the sprites onto the given surface. self.fail() def todo_test_empty(self): # __doc__ (as of 2008-08-02) for pygame.sprite.AbstractGroup.empty: # empty() # remove all sprites # # Removes all the sprites from the group. self.fail() def todo_test_has_internal(self): # __doc__ (as of 2008-08-02) for pygame.sprite.AbstractGroup.has_internal: # self.fail() def todo_test_remove(self): # __doc__ (as of 2008-08-02) for pygame.sprite.AbstractGroup.remove: # remove(sprite, list, or group, ...) # remove sprite from group # # Remove a sprite or sequence of sprites from a group. self.fail() def todo_test_remove_internal(self): # __doc__ (as of 2008-08-02) for pygame.sprite.AbstractGroup.remove_internal: self.fail() def todo_test_sprites(self): # __doc__ (as of 2008-08-02) for pygame.sprite.AbstractGroup.sprites: # sprites() # get a list of sprites in the group # # Returns an object that can be looped over with a 'for' loop. # (For now it is always a list, but newer version of Python # could return different iterators.) You can also iterate directly # over the sprite group. self.fail() def todo_test_update(self): # __doc__ (as of 2008-08-02) for pygame.sprite.AbstractGroup.update: # update(*args) # call update for all member sprites # # calls the update method for all sprites in the group. # Passes all arguments on to the Sprite update function. self.fail() ################################################################################ # A base class to share tests between similar classes class LayeredGroupBase: def test_get_layer_of_sprite(self): self.assert_(len(self.LG._spritelist)==0) spr = self.sprite() self.LG.add(spr, layer=666) self.assert_(len(self.LG._spritelist)==1) self.assert_(self.LG.get_layer_of_sprite(spr)==666) self.assert_(self.LG.get_layer_of_sprite(spr)==self.LG._spritelayers[spr]) def test_add(self): self.assert_(len(self.LG._spritelist)==0) spr = self.sprite() self.LG.add(spr) self.assert_(len(self.LG._spritelist)==1) self.assert_(self.LG.get_layer_of_sprite(spr)==self.LG._default_layer) def test_add__sprite_with_layer_attribute(self): #test_add_sprite_with_layer_attribute self.assert_(len(self.LG._spritelist)==0) spr = self.sprite() spr._layer = 100 self.LG.add(spr) self.assert_(len(self.LG._spritelist)==1) self.assert_(self.LG.get_layer_of_sprite(spr)==100) def test_add__passing_layer_keyword(self): # test_add_sprite_passing_layer self.assert_(len(self.LG._spritelist)==0) spr = self.sprite() self.LG.add(spr, layer=100) self.assert_(len(self.LG._spritelist)==1) self.assert_(self.LG.get_layer_of_sprite(spr)==100) def test_add__overriding_sprite_layer_attr(self): # test_add_sprite_overriding_layer_attr self.assert_(len(self.LG._spritelist)==0) spr = self.sprite() spr._layer = 100 self.LG.add(spr, layer=200) self.assert_(len(self.LG._spritelist)==1) self.assert_(self.LG.get_layer_of_sprite(spr)==200) def test_add__adding_sprite_on_init(self): # test_add_sprite_init spr = self.sprite() lrg2 = sprite.LayeredUpdates(spr) self.assert_(len(lrg2._spritelist)==1) self.assert_(lrg2._spritelayers[spr]==lrg2._default_layer) def test_add__sprite_init_layer_attr(self): # test_add_sprite_init_layer_attr spr = self.sprite() spr._layer = 20 lrg2 = sprite.LayeredUpdates(spr) self.assert_(len(lrg2._spritelist)==1) self.assert_(lrg2._spritelayers[spr]==20) def test_add__sprite_init_passing_layer(self): # test_add_sprite_init_passing_layer spr = self.sprite() lrg2 = sprite.LayeredUpdates(spr, layer=33) self.assert_(len(lrg2._spritelist)==1) self.assert_(lrg2._spritelayers[spr]==33) def test_add__sprite_init_overiding_layer(self): # test_add_sprite_init_overiding_layer spr = self.sprite() spr._layer = 55 lrg2 = sprite.LayeredUpdates(spr, layer=33) self.assert_(len(lrg2._spritelist)==1) self.assert_(lrg2._spritelayers[spr]==33) def test_add__spritelist(self): # test_add_spritelist self.assert_(len(self.LG._spritelist)==0) sprites = [] for i in range(10): sprites.append(self.sprite()) self.LG.add(sprites) self.assert_(len(self.LG._spritelist)==10) for i in range(10): self.assert_(self.LG.get_layer_of_sprite(sprites[i])==self.LG._default_layer) def test_add__spritelist_with_layer_attr(self): # test_add_spritelist_with_layer_attr self.assert_(len(self.LG._spritelist)==0) sprites = [] for i in range(10): sprites.append(self.sprite()) sprites[-1]._layer = i self.LG.add(sprites) self.assert_(len(self.LG._spritelist)==10) for i in range(10): self.assert_(self.LG.get_layer_of_sprite(sprites[i])==i) def test_add__spritelist_passing_layer(self): # test_add_spritelist_passing_layer self.assert_(len(self.LG._spritelist)==0) sprites = [] for i in range(10): sprites.append(self.sprite()) self.LG.add(sprites, layer=33) self.assert_(len(self.LG._spritelist)==10) for i in range(10): self.assert_(self.LG.get_layer_of_sprite(sprites[i])==33) def test_add__spritelist_overriding_layer(self): # test_add_spritelist_overriding_layer self.assert_(len(self.LG._spritelist)==0) sprites = [] for i in range(10): sprites.append(self.sprite()) sprites[-1].layer = i self.LG.add(sprites, layer=33) self.assert_(len(self.LG._spritelist)==10) for i in range(10): self.assert_(self.LG.get_layer_of_sprite(sprites[i])==33) def test_add__spritelist_init(self): # test_add_spritelist_init self.assert_(len(self.LG._spritelist)==0) sprites = [] for i in range(10): sprites.append(self.sprite()) lrg2 = sprite.LayeredUpdates(sprites) self.assert_(len(lrg2._spritelist)==10) for i in range(10): self.assert_(lrg2.get_layer_of_sprite(sprites[i])==self.LG._default_layer) def test_remove__sprite(self): # test_remove_sprite self.assert_(len(self.LG._spritelist)==0) sprites = [] for i in range(10): sprites.append(self.sprite()) sprites[-1].rect = 0 self.LG.add(sprites) self.assert_(len(self.LG._spritelist)==10) for i in range(10): self.LG.remove(sprites[i]) self.assert_(len(self.LG._spritelist)==0) def test_sprites(self): # test_sprites self.assert_(len(self.LG._spritelist)==0) sprites = [] for i in range(10): sprites.append(self.sprite()) sprites[-1]._layer = 10-i self.LG.add(sprites) self.assert_(len(self.LG._spritelist)==10) for idx,spr in enumerate(self.LG.sprites()): self.assert_(spr == sprites[9-idx]) def test_layers(self): # test_layers self.assert_(len(self.LG._spritelist)==0) sprites = [] for i in range(10): for j in range(5): sprites.append(self.sprite()) sprites[-1]._layer = i self.LG.add(sprites) lays = self.LG.layers() for i in range(10): self.assert_(lays[i] == i) def test_add__layers_are_correct(self): #TODO # test_layers2 self.assert_(len(self.LG)==0) layers = [1,4,6,8,3,6,2,6,4,5,6,1,0,9,7,6,54,8,2,43,6,1] for lay in layers: self.LG.add(self.sprite(), layer=lay) layers.sort() for idx, spr in enumerate(self.LG.sprites()): self.assert_(self.LG.get_layer_of_sprite(spr)==layers[idx]) def test_change_layer(self): # test_change_layer self.assert_(len(self.LG._spritelist)==0) spr = self.sprite() self.LG.add(spr, layer=99) self.assert_(self.LG._spritelayers[spr] == 99) self.LG.change_layer(spr, 44) self.assert_(self.LG._spritelayers[spr] == 44) spr2 = self.sprite() spr2.layer = 55 self.LG.add(spr2) self.LG.change_layer(spr2, 77) self.assert_(spr2.layer == 77) def test_get_top_layer(self): # test_get_top_layer layers = [1,5,2,8,4,5,3,88,23,0] for i in layers: self.LG.add(self.sprite(), layer=i) self.assert_(self.LG.get_top_layer()==max(layers)) self.assert_(self.LG.get_top_layer()==max(self.LG._spritelayers.values())) self.assert_(self.LG.get_top_layer()==self.LG._spritelayers[self.LG._spritelist[-1]]) def test_get_bottom_layer(self): # test_get_bottom_layer layers = [1,5,2,8,4,5,3,88,23,0] for i in layers: self.LG.add(self.sprite(), layer=i) self.assert_(self.LG.get_bottom_layer()==min(layers)) self.assert_(self.LG.get_bottom_layer()==min(self.LG._spritelayers.values())) self.assert_(self.LG.get_bottom_layer()==self.LG._spritelayers[self.LG._spritelist[0]]) def test_move_to_front(self): # test_move_to_front layers = [1,5,2,8,4,5,3,88,23,0] for i in layers: self.LG.add(self.sprite(), layer=i) spr = self.sprite() self.LG.add(spr, layer=3) self.assert_(spr != self.LG._spritelist[-1]) self.LG.move_to_front(spr) self.assert_(spr == self.LG._spritelist[-1]) def test_move_to_back(self): # test_move_to_back layers = [1,5,2,8,4,5,3,88,23,0] for i in layers: self.LG.add(self.sprite(), layer=i) spr = self.sprite() self.LG.add(spr, layer=55) self.assert_(spr != self.LG._spritelist[0]) self.LG.move_to_back(spr) self.assert_(spr == self.LG._spritelist[0]) def test_get_top_sprite(self): # test_get_top_sprite layers = [1,5,2,8,4,5,3,88,23,0] for i in layers: self.LG.add(self.sprite(), layer=i) self.assert_(self.LG.get_layer_of_sprite(self.LG.get_top_sprite())== self.LG.get_top_layer()) def test_get_sprites_from_layer(self): # test_get_sprites_from_layer self.assert_(len(self.LG)==0) sprites = {} layers = [1,4,5,6,3,7,8,2,1,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,0,1,6,5,4,3,2] for lay in layers: spr = self.sprite() spr._layer = lay self.LG.add(spr) if lay not in sprites: sprites[lay] = [] sprites[lay].append(spr) for lay in self.LG.layers(): for spr in self.LG.get_sprites_from_layer(lay): self.assert_(spr in sprites[lay]) sprites[lay].remove(spr) if len(sprites[lay]) == 0: del sprites[lay] self.assert_(len(sprites.values())==0) def test_switch_layer(self): # test_switch_layer self.assert_(len(self.LG)==0) sprites1 = [] sprites2 = [] layers = [3,2,3,2,3,3,2,2,3,2,3,2,3,2,3,2,3,3,2,2,3,2,3] for lay in layers: spr = self.sprite() spr._layer = lay self.LG.add(spr) if lay==2: sprites1.append(spr) else: sprites2.append(spr) for spr in sprites1: self.assert_(spr in self.LG.get_sprites_from_layer(2)) for spr in sprites2: self.assert_(spr in self.LG.get_sprites_from_layer(3)) self.assert_(len(self.LG)==len(sprites1)+len(sprites2)) self.LG.switch_layer(2,3) for spr in sprites1: self.assert_(spr in self.LG.get_sprites_from_layer(3)) for spr in sprites2: self.assert_(spr in self.LG.get_sprites_from_layer(2)) self.assert_(len(self.LG)==len(sprites1)+len(sprites2)) ########################## LAYERED RENDER GROUP TESTS ########################## class LayeredUpdatesTypeTest__SpriteTest(LayeredGroupBase, unittest.TestCase): sprite = sprite.Sprite def setUp(self): self.LG = sprite.LayeredUpdates() class LayeredUpdatesTypeTest__DirtySprite(LayeredGroupBase, unittest.TestCase): sprite = sprite.DirtySprite def setUp(self): self.LG = sprite.LayeredUpdates() class LayeredDirtyTypeTest__DirtySprite(LayeredGroupBase, unittest.TestCase): sprite = sprite.DirtySprite def setUp(self): self.LG = sprite.LayeredDirty() ############################### SPRITE BASE CLASS ############################## # # tests common between sprite classes class SpriteBase: def setUp(self): self.groups = [] for Group in self.Groups: self.groups.append(Group()) self.sprite = self.Sprite() def todo_test_add_internal(self): # __doc__ (as of 2008-08-02) for pygame.sprite.Sprite.add_internal: self.fail() def todo_test_remove_internal(self): # __doc__ (as of 2008-08-02) for pygame.sprite.Sprite.remove_internal: self.fail() def todo_test_update(self): # __doc__ (as of 2008-08-02) for pygame.sprite.Sprite.update: # method to control sprite behavior # Sprite.update(*args): # # The default implementation of this method does nothing; it's just a # convenient "hook" that you can override. This method is called by # Group.update() with whatever arguments you give it. # # There is no need to use this method if not using the convenience # method by the same name in the Group class. # # The default implementation of this method does nothing; it's just a # convenient "hook" that you can override. This method is called by # Group.update() with whatever arguments you give it. # # There is no need to use this method if not using the convenience # method by the same name in the Group class. self.fail() def test___init____added_to_groups_passed(self): self.sprite = self.Sprite(self.groups) self.assert_(unordered_equality( self.sprite.groups(), self.groups )) def test_add(self): self.sprite.add(self.groups) self.assert_(unordered_equality( self.sprite.groups(), self.groups )) def test_alive(self): self.assert_( not self.sprite.alive(), "Sprite should not be alive if in no groups" ) self.sprite.add(self.groups) self.assert_(self.sprite.alive()) def test_groups(self): for i, g in enumerate(self.groups): self.sprite.add(g) groups = self.sprite.groups() self.assert_( unordered_equality ( groups, self.groups[:i+1], )) def test_kill(self): self.sprite.add(self.groups) self.assert_(self.sprite.alive()) self.sprite.kill() self.assert_(not self.sprite.groups() and not self.sprite.alive() ) def test_remove(self): self.sprite.add(self.groups) self.sprite.remove(self.groups) self.assert_(not self.sprite.groups()) ############################## SPRITE CLASS TESTS ############################## class SpriteTypeTest(SpriteBase, unittest.TestCase): Sprite = sprite.Sprite Groups = [ sprite.Group, sprite.LayeredUpdates, sprite.RenderUpdates, sprite.OrderedUpdates, ] class DirtySpriteTypeTest(SpriteBase, unittest.TestCase): Sprite = sprite.DirtySprite Groups = [ sprite.Group, sprite.LayeredUpdates, sprite.RenderUpdates, sprite.OrderedUpdates, sprite.LayeredDirty, ] ################################################################################ if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/sndarray_test.py0000644000175000017500000002076111205604523020462 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest else: from test.test_utils import test_not_implemented, unittest import pygame arraytype = "" try: import pygame.sndarray except ImportError: pass else: arraytype = pygame.sndarray.get_arraytype() if arraytype == 'numpy': from numpy import \ int8, int16, uint8, uint16, array, alltrue elif arraytype == 'numeric': from Numeric import \ Int8 as int8, Int16 as int16, UInt8 as uint8, UInt16 as uint16, \ array, alltrue else: print ("Unknown array type %s; tests skipped" % (pygame.sndarray.get_arraytype(),)) arraytype = "" class SndarrayTest (unittest.TestCase): if arraytype: array_dtypes = {8: uint8, -8: int8, 16: uint16, -16: int16} def _assert_compatible(self, arr, size): dtype = self.array_dtypes[size] if arraytype == 'numpy': self.failUnlessEqual(arr.dtype, dtype) else: self.failUnlessEqual(arr.typecode(), dtype) def test_import(self): 'does it import' if not arraytype: self.fail("no array package installed") import pygame.sndarray def test_array(self): if not arraytype: self.fail("no array package installed") def check_array(size, channels, test_data): try: pygame.mixer.init(22050, size, channels) except pygame.error: # Not all sizes are supported on all systems. return try: __, sz, __ = pygame.mixer.get_init() if sz == size: srcarr = array(test_data, self.array_dtypes[size]) snd = pygame.sndarray.make_sound(srcarr) arr = pygame.sndarray.array(snd) self._assert_compatible(arr, size) self.failUnless(alltrue(arr == srcarr), "size: %i\n%s\n%s" % (size, arr, test_data)) finally: pygame.mixer.quit() check_array(8, 1, [0, 0x0f, 0xf0, 0xff]) check_array(8, 2, [[0, 0x80], [0x2D, 0x41], [0x64, 0xA1], [0xff, 0x40]]) check_array(16, 1, [0, 0x00ff, 0xff00, 0xffff]) check_array(16, 2, [[0, 0xffff], [0xffff, 0], [0x00ff, 0xff00], [0x0f0f, 0xf0f0]]) check_array(-8, 1, [0, -0x80, 0x7f, 0x64]) check_array(-8, 2, [[0, -0x80], [-0x64, 0x64], [0x25, -0x50], [0xff, 0]]) check_array(-16, 1, [0, 0x7fff, -0x7fff, -1]) check_array(-16, 2, [[0, -0x7fff], [-0x7fff, 0], [0x7fff, 0], [0, 0x7fff]]) def test_get_arraytype(self): if not arraytype: self.fail("no array package installed") self.failUnless((pygame.sndarray.get_arraytype() in ['numpy', 'numeric']), ("unknown array type %s" % pygame.sndarray.get_arraytype())) def test_get_arraytypes(self): if not arraytype: self.fail("no array package installed") arraytypes = pygame.sndarray.get_arraytypes() try: import numpy except ImportError: self.failIf('numpy' in arraytypes) else: self.failUnless('numpy' in arraytypes) try: import Numeric except ImportError: self.failIf('numeric' in arraytypes) else: self.failUnless('numeric' in arraytypes) for atype in arraytypes: self.failUnless(atype in ['numpy', 'numeric'], "unknown array type %s" % atype) def test_make_sound(self): if not arraytype: self.fail("no array package installed") def check_sound(size, channels, test_data): try: pygame.mixer.init(22050, size, channels) except pygame.error: # Not all sizes are supported on all systems. return try: __, sz, __ = pygame.mixer.get_init() if sz == size: srcarr = array(test_data, self.array_dtypes[size]) snd = pygame.sndarray.make_sound(srcarr) arr = pygame.sndarray.samples(snd) self.failUnless(alltrue(arr == srcarr), "size: %i\n%s\n%s" % (size, arr, test_data)) finally: pygame.mixer.quit() check_sound(8, 1, [0, 0x0f, 0xf0, 0xff]) check_sound(8, 2, [[0, 0x80], [0x2D, 0x41], [0x64, 0xA1], [0xff, 0x40]]) check_sound(16, 1, [0, 0x00ff, 0xff00, 0xffff]) check_sound(16, 2, [[0, 0xffff], [0xffff, 0], [0x00ff, 0xff00], [0x0f0f, 0xf0f0]]) check_sound(-8, 1, [0, -0x80, 0x7f, 0x64]) check_sound(-8, 2, [[0, -0x80], [-0x64, 0x64], [0x25, -0x50], [0xff, 0]]) check_sound(-16, 1, [0, 0x7fff, -0x7fff, -1]) check_sound(-16, 2, [[0, -0x7fff], [-0x7fff, 0], [0x7fff, 0], [0, 0x7fff]]) def test_samples(self): if not arraytype: self.fail("no array package installed") def check_sample(size, channels, test_data): try: pygame.mixer.init(22050, size, channels) except pygame.error: # Not all sizes are supported on all systems. return try: __, sz, __ = pygame.mixer.get_init() if sz == size: zeroed = '\0' * ((abs(size) // 8) * len(test_data) * channels) snd = pygame.mixer.Sound(buffer(zeroed)) samples = pygame.sndarray.samples(snd) self._assert_compatible(samples, size) print ('X %s' % (samples.shape,)) print ('Y %s' % (test_data,)) samples[...] = test_data arr = pygame.sndarray.array(snd) self.failUnless(alltrue(samples == arr), "size: %i\n%s\n%s" % (size, arr, test_data)) finally: pygame.mixer.quit() check_sample(8, 1, [0, 0x0f, 0xf0, 0xff]) check_sample(8, 2, [[0, 0x80], [0x2D, 0x41], [0x64, 0xA1], [0xff, 0x40]]) check_sample(16, 1, [0, 0x00ff, 0xff00, 0xffff]) check_sample(16, 2, [[0, 0xffff], [0xffff, 0], [0x00ff, 0xff00], [0x0f0f, 0xf0f0]]) check_sample(-8, 1, [0, -0x80, 0x7f, 0x64]) check_sample(-8, 2, [[0, -0x80], [-0x64, 0x64], [0x25, -0x50], [0xff, 0]]) check_sample(-16, 1, [0, 0x7fff, -0x7fff, -1]) check_sample(-16, 2, [[0, -0x7fff], [-0x7fff, 0], [0x7fff, 0], [0, 0x7fff]]) def test_use_arraytype(self): if not arraytype: self.fail("no array package installed") def do_use_arraytype(atype): pygame.sndarray.use_arraytype(atype) try: import numpy except ImportError: self.failUnlessRaises(ValueError, do_use_arraytype, 'numpy') self.failIfEqual(pygame.sndarray.get_arraytype(), 'numpy') else: pygame.sndarray.use_arraytype('numpy') self.failUnlessEqual(pygame.sndarray.get_arraytype(), 'numpy') try: import Numeric except ImportError: self.failUnlessRaises(ValueError, do_use_arraytype, 'numeric') self.failIfEqual(pygame.sndarray.get_arraytype(), 'numeric') else: pygame.sndarray.use_arraytype('numeric') self.failUnlessEqual(pygame.sndarray.get_arraytype(), 'numeric') self.failUnlessRaises(ValueError, do_use_arraytype, 'not an option') if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/sndarray_tags.py0000644000175000017500000000041111207055754020437 0ustar vincentvincent__tags__ = ['array'] exclude = False try: import numpy except ImportError: try: import Numeric import pygame._numericsndarray except ImportError: exclude = True if exclude: __tags__.extend(('ignore', 'subprocess_ignore')) pygame-1.9.1release/test/scrap_test.py0000644000175000017500000001205211201706427017743 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils \ import test_not_implemented, trunk_relative_path, unittest else: from test.test_utils \ import test_not_implemented, trunk_relative_path, unittest import pygame from pygame import scrap class ScrapModuleTest(unittest.TestCase): not_initialized = True def setUp(self): if self.not_initialized: pygame.init () pygame.display.set_mode ((1, 1)) scrap.init () self.not_initialized = False def todo_test_contains(self): # __doc__ (as of 2008-08-02) for pygame.scrap.contains: # scrap.contains (type) -> bool # Checks, whether a certain type is available in the clipboard. # # Returns True, if data for the passed type is available in the # clipboard, False otherwise. # # if pygame.scrap.contains (SCRAP_TEXT): # print "There is text in the clipboard." # if pygame.scrap.contains ("own_data_type"): # print "There is stuff in the clipboard." self.fail() def todo_test_get(self): # __doc__ (as of 2008-08-02) for pygame.scrap.get: # scrap.get (type) -> string # Gets the data for the specified type from the clipboard. # # Returns the data for the specified type from the clipboard. The data # is returned as string and might need further processing. If no data # for the passed type is available, None is returned. # # text = pygame.scrap.get (SCRAP_TEXT) # if text: # # Do stuff with it. # else: # print "There does not seem to be text in the clipboard." self.fail() def todo_test_get_types(self): # __doc__ (as of 2008-08-02) for pygame.scrap.get_types: # scrap.get_types () -> list # Gets a list of the available clipboard types. # # Gets a list of strings with the identifiers for the available # clipboard types. Each identifier can be used in the scrap.get() # method to get the clipboard content of the specific type. If there # is no data in the clipboard, an empty list is returned. # # types = pygame.scrap.get_types () # for t in types: # if "text" in t: # # There is some content with the word "text" in it. It's # # possibly text, so print it. # print pygame.scrap.get (t) self.fail() def todo_test_init(self): # __doc__ (as of 2008-08-02) for pygame.scrap.init: # scrap.init () -> None # Initializes the scrap module. # # Tries to initialize the scrap module and raises an exception, if it # fails. Note that this module requires a set display surface, so you # have to make sure, you acquired one earlier using # pygame.display.set_mode(). # self.fail() def todo_test_lost(self): # __doc__ (as of 2008-08-02) for pygame.scrap.lost: # scrap.lost() -> bool # Checks whether the clipboard is currently owned by the application. # # Returns True, if the clipboard is currently owned by the pygame # application, False otherwise. # # if pygame.scrap.lost (): # print "No content from me anymore. The clipboard is used by someone else." self.fail() def test_set_mode (self): scrap.set_mode (pygame.SCRAP_SELECTION) scrap.set_mode (pygame.SCRAP_CLIPBOARD) self.assertRaises (ValueError, scrap.set_mode, 1099) def test_scrap_put_text (self): scrap.put (pygame.SCRAP_TEXT, "Hello world") self.assertEquals (scrap.get (pygame.SCRAP_TEXT), "Hello world") scrap.put (pygame.SCRAP_TEXT, "Another String") self.assertEquals (scrap.get (pygame.SCRAP_TEXT), "Another String") def test_scrap_put_image (self): sf = pygame.image.load ( trunk_relative_path("examples/data/asprite.bmp") ) string = pygame.image.tostring (sf, "RGBA") scrap.put (pygame.SCRAP_BMP, string) self.assertEquals (scrap.get(pygame.SCRAP_BMP), string) def test_put (self): scrap.put ("arbitrary buffer", "buf") r = scrap.get ("arbitrary buffer") self.assertEquals (r, "buf") if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/scrap_tags.py0000644000175000017500000000057311207055754017735 0ustar vincentvincent__tags__ = [] import sys exclude = False if ((sys.platform == 'win32' or sys.platform == 'linux2') and sys.version_info < (3, 0, 0)): try: import pygame pygame.scrap._NOT_IMPLEMENTED_ except AttributeError: pass else: exclude = True else: exclude = True if exclude: __tags__.extend(['ignore', 'subprocess_ignore']) pygame-1.9.1release/test/rect_test.py0000644000175000017500000005640111207055754017604 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest else: from test.test_utils import test_not_implemented, unittest from pygame import Rect class RectTypeTest( unittest.TestCase ): def testConstructionXYWidthHeight( self ): r = Rect(1,2,3,4) self.assertEqual( 1, r.left ) self.assertEqual( 2, r.top ) self.assertEqual( 3, r.width ) self.assertEqual( 4, r.height ) def testConstructionTopLeftSize( self ): r = Rect( (1,2), (3,4) ) self.assertEqual( 1, r.left ) self.assertEqual( 2, r.top ) self.assertEqual( 3, r.width ) self.assertEqual( 4, r.height ) def testCalculatedAttributes( self ): r = Rect( 1, 2, 3, 4 ) self.assertEqual( r.left+r.width, r.right ) self.assertEqual( r.top+r.height, r.bottom ) self.assertEqual( (r.width,r.height), r.size ) self.assertEqual( (r.left,r.top), r.topleft ) self.assertEqual( (r.right,r.top), r.topright ) self.assertEqual( (r.left,r.bottom), r.bottomleft ) self.assertEqual( (r.right,r.bottom), r.bottomright ) midx = r.left + r.width // 2 midy = r.top + r.height // 2 self.assertEqual( midx, r.centerx ) self.assertEqual( midy, r.centery ) self.assertEqual( (r.centerx,r.centery), r.center ) self.assertEqual( (r.centerx,r.top), r.midtop ) self.assertEqual( (r.centerx,r.bottom), r.midbottom ) self.assertEqual( (r.left,r.centery), r.midleft ) self.assertEqual( (r.right,r.centery), r.midright ) def test_normalize( self ): r = Rect( 1, 2, -3, -6 ) r2 = Rect(r) r2.normalize() self.failUnless( r2.width >= 0 ) self.failUnless( r2.height >= 0 ) self.assertEqual( (abs(r.width),abs(r.height)), r2.size ) self.assertEqual( (-2,-4), r2.topleft ) def test_left( self ): """Changing the left attribute moves the rect and does not change the rect's width """ r = Rect( 1, 2, 3, 4 ) new_left = 10 r.left = new_left self.assertEqual( new_left, r.left ) self.assertEqual( Rect(new_left,2,3,4), r ) def test_right( self ): """Changing the right attribute moves the rect and does not change the rect's width """ r = Rect( 1, 2, 3, 4 ) new_right = r.right + 20 expected_left = r.left + 20 old_width = r.width r.right = new_right self.assertEqual( new_right, r.right ) self.assertEqual( expected_left, r.left ) self.assertEqual( old_width, r.width ) def test_top( self ): """Changing the top attribute moves the rect and does not change the rect's width """ r = Rect( 1, 2, 3, 4 ) new_top = 10 r.top = new_top self.assertEqual( Rect(1,new_top,3,4), r ) self.assertEqual( new_top, r.top ) def test_bottom( self ): """Changing the bottom attribute moves the rect and does not change the rect's height """ r = Rect( 1, 2, 3, 4 ) new_bottom = r.bottom + 20 expected_top = r.top + 20 old_height = r.height r.bottom = new_bottom self.assertEqual( new_bottom, r.bottom ) self.assertEqual( expected_top, r.top ) self.assertEqual( old_height, r.height ) def test_centerx( self ): """Changing the centerx attribute moves the rect and does not change the rect's width """ r = Rect( 1, 2, 3, 4 ) new_centerx = r.centerx + 20 expected_left = r.left + 20 old_width = r.width r.centerx = new_centerx self.assertEqual( new_centerx, r.centerx ) self.assertEqual( expected_left, r.left ) self.assertEqual( old_width, r.width ) def test_centery( self ): """Changing the centerx attribute moves the rect and does not change the rect's width """ r = Rect( 1, 2, 3, 4 ) new_centery = r.centery + 20 expected_top = r.top + 20 old_height = r.height r.centery = new_centery self.assertEqual( new_centery, r.centery ) self.assertEqual( expected_top, r.top ) self.assertEqual( old_height, r.height ) def test_topleft( self ): """Changing the topleft attribute moves the rect and does not change the rect's size """ r = Rect( 1, 2, 3, 4 ) new_topleft = (r.left+20,r.top+30) old_size = r.size r.topleft = new_topleft self.assertEqual( new_topleft, r.topleft ) self.assertEqual( old_size, r.size ) def test_bottomleft( self ): """Changing the bottomleft attribute moves the rect and does not change the rect's size """ r = Rect( 1, 2, 3, 4 ) new_bottomleft = (r.left+20,r.bottom+30) expected_topleft = (r.left+20,r.top+30) old_size = r.size r.bottomleft = new_bottomleft self.assertEqual( new_bottomleft, r.bottomleft ) self.assertEqual( expected_topleft, r.topleft ) self.assertEqual( old_size, r.size ) def test_topright( self ): """Changing the bottomleft attribute moves the rect and does not change the rect's size """ r = Rect( 1, 2, 3, 4 ) new_topright = (r.right+20,r.top+30) expected_topleft = (r.left+20,r.top+30) old_size = r.size r.topright = new_topright self.assertEqual( new_topright, r.topright ) self.assertEqual( expected_topleft, r.topleft ) self.assertEqual( old_size, r.size ) def test_bottomright( self ): """Changing the bottomright attribute moves the rect and does not change the rect's size """ r = Rect( 1, 2, 3, 4 ) new_bottomright = (r.right+20,r.bottom+30) expected_topleft = (r.left+20,r.top+30) old_size = r.size r.bottomright = new_bottomright self.assertEqual( new_bottomright, r.bottomright ) self.assertEqual( expected_topleft, r.topleft ) self.assertEqual( old_size, r.size ) def test_center( self ): """Changing the center attribute moves the rect and does not change the rect's size """ r = Rect( 1, 2, 3, 4 ) new_center = (r.centerx+20,r.centery+30) expected_topleft = (r.left+20,r.top+30) old_size = r.size r.center = new_center self.assertEqual( new_center, r.center ) self.assertEqual( expected_topleft, r.topleft ) self.assertEqual( old_size, r.size ) def test_midleft( self ): """Changing the midleft attribute moves the rect and does not change the rect's size """ r = Rect( 1, 2, 3, 4 ) new_midleft = (r.left+20,r.centery+30) expected_topleft = (r.left+20,r.top+30) old_size = r.size r.midleft = new_midleft self.assertEqual( new_midleft, r.midleft ) self.assertEqual( expected_topleft, r.topleft ) self.assertEqual( old_size, r.size ) def test_midright( self ): """Changing the midright attribute moves the rect and does not change the rect's size """ r = Rect( 1, 2, 3, 4 ) new_midright= (r.right+20,r.centery+30) expected_topleft = (r.left+20,r.top+30) old_size = r.size r.midright = new_midright self.assertEqual( new_midright, r.midright ) self.assertEqual( expected_topleft, r.topleft ) self.assertEqual( old_size, r.size ) def test_midtop( self ): """Changing the midtop attribute moves the rect and does not change the rect's size """ r = Rect( 1, 2, 3, 4 ) new_midtop= (r.centerx+20,r.top+30) expected_topleft = (r.left+20,r.top+30) old_size = r.size r.midtop = new_midtop self.assertEqual( new_midtop, r.midtop ) self.assertEqual( expected_topleft, r.topleft ) self.assertEqual( old_size, r.size ) def test_midbottom( self ): """Changing the midbottom attribute moves the rect and does not change the rect's size """ r = Rect( 1, 2, 3, 4 ) new_midbottom = (r.centerx+20,r.bottom+30) expected_topleft = (r.left+20,r.top+30) old_size = r.size r.midbottom = new_midbottom self.assertEqual( new_midbottom, r.midbottom ) self.assertEqual( expected_topleft, r.topleft ) self.assertEqual( old_size, r.size ) def test_width( self ): "Changing the width resizes the rect from the top-left corner" r = Rect( 1, 2, 3, 4 ) new_width = 10 old_topleft = r.topleft old_height = r.height r.width = new_width self.assertEqual( new_width, r.width ) self.assertEqual( old_height, r.height ) self.assertEqual( old_topleft, r.topleft ) def test_height( self ): "Changing the height resizes the rect from the top-left corner" r = Rect( 1, 2, 3, 4 ) new_height = 10 old_topleft = r.topleft old_width = r.width r.height = new_height self.assertEqual( new_height, r.height ) self.assertEqual( old_width, r.width ) self.assertEqual( old_topleft, r.topleft ) def test_size( self ): "Changing the size resizes the rect from the top-left corner" r = Rect( 1, 2, 3, 4 ) new_size = (10,20) old_topleft = r.topleft r.size = new_size self.assertEqual( new_size, r.size ) self.assertEqual( old_topleft, r.topleft ) def test_contains( self ): r = Rect( 1, 2, 3, 4 ) self.failUnless( r.contains( Rect( 2, 3, 1, 1 ) ), "r does not contain Rect(2,3,1,1)" ) self.failUnless( r.contains( Rect(r) ), "r does not contain the same rect as itself" ) self.failUnless( r.contains( Rect(2,3,0,0) ), "r does not contain an empty rect within its bounds" ) self.failIf( r.contains( Rect(0,0,1,2) ), "r contains Rect(0,0,1,2)" ) self.failIf( r.contains( Rect(4,6,1,1) ), "r contains Rect(4,6,1,1)" ) self.failIf( r.contains( Rect(4,6,0,0) ), "r contains Rect(4,6,0,0)" ) def test_collidepoint( self ): r = Rect( 1, 2, 3, 4 ) self.failUnless( r.collidepoint( r.left, r.top ), "r does not collide with point (left,top)" ) self.failIf( r.collidepoint( r.left-1, r.top ), "r collides with point (left-1,top)" ) self.failIf( r.collidepoint( r.left, r.top-1 ), "r collides with point (left,top-1)" ) self.failIf( r.collidepoint( r.left-1,r.top-1 ), "r collides with point (left-1,top-1)" ) self.failUnless( r.collidepoint( r.right-1, r.bottom-1 ), "r does not collide with point (right-1,bottom-1)") self.failIf( r.collidepoint( r.right, r.bottom ), "r collides with point (right,bottom)" ) self.failIf( r.collidepoint( r.right-1, r.bottom ), "r collides with point (right-1,bottom)" ) self.failIf( r.collidepoint( r.right, r.bottom-1 ), "r collides with point (right,bottom-1)" ) def test_inflate__larger( self ): "The inflate method inflates around the center of the rectangle" r = Rect( 2, 4, 6, 8 ) r2 = r.inflate( 4, 6 ) self.assertEqual( r.center, r2.center ) self.assertEqual( r.left-2, r2.left ) self.assertEqual( r.top-3, r2.top ) self.assertEqual( r.right+2, r2.right ) self.assertEqual( r.bottom+3, r2.bottom ) self.assertEqual( r.width+4, r2.width ) self.assertEqual( r.height+6, r2.height ) def test_inflate__smaller( self ): "The inflate method inflates around the center of the rectangle" r = Rect( 2, 4, 6, 8 ) r2 = r.inflate( -4, -6 ) self.assertEqual( r.center, r2.center ) self.assertEqual( r.left+2, r2.left ) self.assertEqual( r.top+3, r2.top ) self.assertEqual( r.right-2, r2.right ) self.assertEqual( r.bottom-3, r2.bottom ) self.assertEqual( r.width-4, r2.width ) self.assertEqual( r.height-6, r2.height ) def test_inflate_ip__larger( self ): "The inflate_ip method inflates around the center of the rectangle" r = Rect( 2, 4, 6, 8 ) r2 = Rect( r ) r2.inflate_ip( -4, -6 ) self.assertEqual( r.center, r2.center ) self.assertEqual( r.left+2, r2.left ) self.assertEqual( r.top+3, r2.top ) self.assertEqual( r.right-2, r2.right ) self.assertEqual( r.bottom-3, r2.bottom ) self.assertEqual( r.width-4, r2.width ) self.assertEqual( r.height-6, r2.height ) def test_inflate_ip__smaller( self ): "The inflate method inflates around the center of the rectangle" r = Rect( 2, 4, 6, 8 ) r2 = Rect( r ) r2.inflate_ip( -4, -6 ) self.assertEqual( r.center, r2.center ) self.assertEqual( r.left+2, r2.left ) self.assertEqual( r.top+3, r2.top ) self.assertEqual( r.right-2, r2.right ) self.assertEqual( r.bottom-3, r2.bottom ) self.assertEqual( r.width-4, r2.width ) self.assertEqual( r.height-6, r2.height ) def test_clamp( self ): r = Rect(10, 10, 10, 10) c = Rect(19, 12, 5, 5).clamp(r) self.assertEqual(c.right, r.right) self.assertEqual(c.top, 12) c = Rect(1, 2, 3, 4).clamp(r) self.assertEqual(c.topleft, r.topleft) c = Rect(5, 500, 22, 33).clamp(r) self.assertEqual(c.center, r.center) def test_clamp_ip( self ): r = Rect(10, 10, 10, 10) c = Rect(19, 12, 5, 5) c.clamp_ip(r) self.assertEqual(c.right, r.right) self.assertEqual(c.top, 12) c = Rect(1, 2, 3, 4) c.clamp_ip(r) self.assertEqual(c.topleft, r.topleft) c = Rect(5, 500, 22, 33) c.clamp_ip(r) self.assertEqual(c.center, r.center) def test_clip( self ): r1 = Rect( 1, 2, 3, 4 ) self.assertEqual( Rect( 1, 2, 2, 2 ), r1.clip( Rect(0,0,3,4) ) ) self.assertEqual( Rect( 2, 2, 2, 4 ), r1.clip( Rect(2,2,10,20) ) ) self.assertEqual( Rect(2,3,1,2), r1.clip( Rect(2,3,1,2) ) ) self.assertEqual( (0,0), r1.clip(20,30,5,6).size ) self.assertEqual( r1, r1.clip( Rect(r1) ), "r1 does not clip an identical rect to itself" ) def test_move( self ): r = Rect( 1, 2, 3, 4 ) move_x = 10 move_y = 20 r2 = r.move( move_x, move_y ) expected_r2 = Rect(r.left+move_x,r.top+move_y,r.width,r.height) self.assertEqual( expected_r2, r2 ) def test_move_ip( self ): r = Rect( 1, 2, 3, 4 ) r2 = Rect( r ) move_x = 10 move_y = 20 r2.move_ip( move_x, move_y ) expected_r2 = Rect(r.left+move_x,r.top+move_y,r.width,r.height) self.assertEqual( expected_r2, r2 ) def test_union( self ): r1 = Rect( 1, 1, 1, 2 ) r2 = Rect( -2, -2, 1, 2 ) self.assertEqual( Rect( -2, -2, 4, 5 ), r1.union(r2) ) def test_union__with_identical_Rect( self ): r1 = Rect( 1, 2, 3, 4 ) self.assertEqual( r1, r1.union( Rect(r1) ) ) def test_union_ip( self ): r1 = Rect( 1, 1, 1, 2 ) r2 = Rect( -2, -2, 1, 2 ) r1.union_ip(r2) self.assertEqual( Rect( -2, -2, 4, 5 ), r1 ) def test_unionall( self ): r1 = Rect( 0, 0, 1, 1 ) r2 = Rect( -2, -2, 1, 1 ) r3 = Rect( 2, 2, 1, 1 ) r4 = r1.unionall( [r2,r3] ) self.assertEqual( Rect(-2, -2, 5, 5), r4 ) def test_unionall_ip( self ): r1 = Rect( 0, 0, 1, 1 ) r2 = Rect( -2, -2, 1, 1 ) r3 = Rect( 2, 2, 1, 1 ) r1.unionall_ip( [r2,r3] ) self.assertEqual( Rect(-2, -2, 5, 5), r1 ) def test_colliderect( self ): r1 = Rect(1,2,3,4) self.failUnless( r1.colliderect( Rect(0,0,2,3) ), "r1 does not collide with Rect(0,0,2,3)" ) self.failIf( r1.colliderect( Rect(0,0,1,2) ), "r1 collides with Rect(0,0,1,2)" ) self.failIf( r1.colliderect( Rect(r1.right,r1.bottom,2,2) ), "r1 collides with Rect(r1.right,r1.bottom,2,2)" ) self.failUnless( r1.colliderect( Rect(r1.left+1,r1.top+1, r1.width-2,r1.height-2) ), "r1 does not collide with Rect(r1.left+1,r1.top+1,"+ "r1.width-2,r1.height-2)" ) self.failUnless( r1.colliderect( Rect(r1.left-1,r1.top-1, r1.width+2,r1.height+2) ), "r1 does not collide with Rect(r1.left-1,r1.top-1,"+ "r1.width+2,r1.height+2)" ) self.failUnless( r1.colliderect( Rect(r1) ), "r1 does not collide with an identical rect" ) self.failIf( r1.colliderect( Rect(r1.right,r1.bottom,0,0) ), "r1 collides with Rect(r1.right,r1.bottom,0,0)" ) self.failIf( r1.colliderect( Rect(r1.right,r1.bottom,1,1) ), "r1 collides with Rect(r1.right,r1.bottom,1,1)" ) def testEquals( self ): """ check to see how the rect uses __eq__ """ r1 = Rect(1,2,3,4) r2 = Rect(10,20,30,40) r3 = (10,20,30,40) r4 = Rect(10,20,30,40) class foo (Rect): def __eq__(self,other): return id(self) == id(other); class foo2 (Rect): pass r5 = foo(10,20,30,40) r6 = foo2(10,20,30,40) self.assertNotEqual(r5, r2) # because we define equality differently for this subclass. self.assertEqual(r6, r2) rect_list = [r1,r2,r3,r4,r6] # see if we can remove 4 of these. rect_list.remove(r2) rect_list.remove(r2) rect_list.remove(r2) rect_list.remove(r2) self.assertRaises(ValueError, rect_list.remove, r2) def test_collidedict(self): # __doc__ (as of 2008-08-02) for pygame.rect.Rect.collidedict: # Rect.collidedict(dict): return (key, value) # test if one rectangle in a dictionary intersects # # Returns the key and value of the first dictionary value that # collides with the Rect. If no collisions are found, None is # returned. # # Rect objects are not hashable and cannot be used as keys in a # dictionary, only as values. r = Rect(1, 1, 10, 10) r1 = Rect(1, 1, 10, 10) r2 = Rect(50, 50, 10, 10) r3 = Rect(70, 70, 10, 10) r4 = Rect(61, 61, 10, 10) d = {1: r1, 2: r2, 3: r3} rects_values = 1 val = r.collidedict(d, rects_values) self.assertTrue(val) self.assertEqual(len(val), 2) self.assertEqual(val[0], 1) self.assertEqual(val[1], r1) none_d = {2: r2, 3: r3} none_val = r.collidedict(none_d, rects_values) self.assertFalse(none_val) barely_d = {1: r1, 2: r2, 3: r3} k3, v3 = r4.collidedict(barely_d, rects_values) self.assertEqual(k3, 3) self.assertEqual(v3, r3) def test_collidedictall(self): # __doc__ (as of 2008-08-02) for pygame.rect.Rect.collidedictall: # Rect.collidedictall(dict): return [(key, value), ...] # test if all rectangles in a dictionary intersect # # Returns a list of all the key and value pairs that intersect with # the Rect. If no collisions are found an empty dictionary is # returned. # # Rect objects are not hashable and cannot be used as keys in a # dictionary, only as values. r = Rect(1, 1, 10, 10) r2 = Rect(1, 1, 10, 10) r3 = Rect(5, 5, 10, 10) r4 = Rect(10, 10, 10, 10) r5 = Rect(50, 50, 10, 10) rects_values = 1 d = {2: r2} l = r.collidedictall(d, rects_values) self.assertEqual(l, [(2, r2)]) d2 = {2: r2, 3: r3, 4: r4, 5: r5} l2 = r.collidedictall(d2, rects_values) self.assertEqual(l2, [(2, r2), (3, r3), (4, r4)]) def test_collidelist(self): # __doc__ (as of 2008-08-02) for pygame.rect.Rect.collidelist: # Rect.collidelist(list): return index # test if one rectangle in a list intersects # # Test whether the rectangle collides with any in a sequence of # rectangles. The index of the first collision found is returned. If # no collisions are found an index of -1 is returned. r = Rect(1, 1, 10, 10) l = [Rect(50, 50, 1, 1), Rect(5, 5, 10, 10), Rect(15, 15, 1, 1)] self.assertEqual(r.collidelist(l), 1) f = [Rect(50, 50, 1, 1), (100, 100, 4, 4)] self.assertEqual(r.collidelist(f), -1) def test_collidelistall(self): # __doc__ (as of 2008-08-02) for pygame.rect.Rect.collidelistall: # Rect.collidelistall(list): return indices # test if all rectangles in a list intersect # # Returns a list of all the indices that contain rectangles that # collide with the Rect. If no intersecting rectangles are found, an # empty list is returned. r = Rect(1, 1, 10, 10) l = [ Rect(1, 1, 10, 10), Rect(5, 5, 10, 10), Rect(15, 15, 1, 1), Rect(2, 2, 1, 1), ] self.assertEqual(r.collidelistall(l), [0, 1, 3]) f = [Rect(50, 50, 1, 1), Rect(20, 20, 5, 5)] self.assertFalse(r.collidelistall(f)) def test_fit(self): # __doc__ (as of 2008-08-02) for pygame.rect.Rect.fit: # Rect.fit(Rect): return Rect # resize and move a rectangle with aspect ratio # # Returns a new rectangle that is moved and resized to fit another. # The aspect ratio of the original Rect is preserved, so the new # rectangle may be smaller than the target in either width or height. r = Rect(10, 10, 30, 30) r2 = Rect(30, 30, 15, 10) f = r.fit(r2) self.assertTrue(r2.contains(f)) f2 = r2.fit(r) self.assertTrue(r.contains(f2)) def test_copy(self): r = Rect(1, 2, 10, 20) c = r.copy() self.failUnlessEqual(c, r) if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/README.TXT0000644000175000017500000001306011210740174016555 0ustar vincentvincent================================================================================ = README FOR PYGAME TESTS = =========================== ================================================================================ = run_tests.py = ================ The test runner for PyGame was developed for these purposes: * Per process isolation of test modules * Ability to tag tests for exclusion (interactive tests etc) * Record timings of tests It does this by altering the behaviour of unittest at run time. As much as possible each individual module was left to be fully compatible with the standard unittest. At one point it was discovered that the run time patching of unittest was incompatible with the 2.4 version so a copy of the 2.5 version now is included in the pygame test directory. The test directory was made a package. If an individual module is run, eg ``python test/color_test.py``, then it will run an unmodified version of unittest. ( unittest.main() ) ================================================================================ = Creating New Test Modules = ============================= *** NOTE *** Be sure to import test_utils first at the top of your file, this will set the sys.path required for test.unittest to run, otherwise run_tests.py will not work properly import test_utils import test.unittest as unittest ================================================================================ = Writing New Tests = ===================== See test/util/gen_stubs.py for automatic creation of test stubs Follow the naming convention ================================================================================ = gen_stubs.py = ================ trunk/test/util/gen_stubs.py The gen_stubs.py utility will inspect pygame, and compile stubs of each of the module's callables (funcs, methods, getter/setters). It will include in the test's comment the __doc__ and the documentation found in the relevant xxxx.doc files. There is a naming convention in place that maps test names to callables in a one to one manner. If there are no untested (or unstubbed) callables then gen_stubs.py will output nothing. gen_stubs.py --help gen_stubs.py module -d >> ../test_module_to_append_to.py You will need to manually merge the stubs into relevant TestCases. ================================================================================ = Test Naming Convention = ========================== This convention is in place so the stub generator can tell what has already been tested and for other introspection purposes. Each module in the pygame package has a corresponding test module in the trunk/test directory. pygame.color : color_test.py Each class has corresponding TestCase[s] in form of $Class + "Type" # TC[:TC.rindex('Type')] pygame.color.Color : color_test.ColorTypeTest pygame.color.Color : color_test.ColorTypeTestOtherAspect *** NOTE *** Use the names of the instantiator helper functions: eg pygame.cdrom.CD and not pygame.cdrom.CDType Each test should be named in the form, test_$funcname__$comment Surface.blit : test_blit__raises_exception_if_locked ================================================================================ = Tagging = =========== There are three levels of tagging available, module level, TestCase level and individual test level. For class and module level tagging assign a tag attribute __tags__ = [] Module Level Tags ----------------- Include the module level tags in: 'some_module_tags.py' Where the module name is 'some_module' which has its tests in some_module_test.py This allows some modules to be excluded without loading some code in the first place. # some_module_test.py __tags__ = ['display', 'interactive'] Tags are inherited by children, so all TestCases, and thus tests will inherit these module level tags. Class Level Tags ---------------- If you want to override a specifig tag then you can use negation. class SomeTest(unittest.TestCase): __tags__ = ['-interactive'] Test Level Tags --------------- The tags for individual tests are specified in the __doc__ for the test. format : |Tags:comma,separated,tags| def test_something__about_something(self): """ |Tags:interactive,some_other_tag| """ *** NOTE *** By default 'interactive' tags are not run run_tests.py --exclude display,slow for exclusion of tags However if you do python test/some_module_test.py all of the tests will run. See run_tests.py --help for more details. ================================================================================ = test_utils.py = ================= This contains utility routines for common testing needs as well as sets the sys.path required for test.unittest to work. some convenience functions: question(q) Will ask q and return True if they answered yes prompt(p) Will notify the user of p and then prompt them to "press enter to continue" trunk_relative_path(pth) Will return a normalized relative path, relative to the test_module eg trunk_relative_path('examples\\data\\alien.jpg') will work on linux This is so the test module can be run from anywhere with working paths eg ../test/color_test.py fixture_path(pth) Likewise but paths are relative to trunk\test\fixtures example_path(pth) Likewise but paths are relative to trunk\examples ================================================================================ pygame-1.9.1release/test/pixelarray_test.py0000644000175000017500000004701311207055754021026 0ustar vincentvincentimport sys if __name__ == '__main__': import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest else: from test.test_utils import test_not_implemented, unittest import pygame from pygame.compat import xrange_ PY3 = sys.version_info >= (3, 0, 0) class PixelArrayTypeTest (unittest.TestCase): def todo_test_compare(self): # __doc__ (as of 2008-06-25) for pygame.pixelarray.PixelArray.compare: # PixelArray.compare (array, distance=0, weights=(0.299, 0.587, 0.114)): Return PixelArray # Compares the PixelArray with another one. self.fail() def test_pixel_array (self): for bpp in (8, 16, 24, 32): sf = pygame.Surface ((10, 20), 0, bpp) sf.fill ((0, 0, 0)) ar = pygame.PixelArray (sf) if sf.mustlock(): self.assertTrue (sf.get_locked ()) self.assertEqual (len (ar), 10) del ar if sf.mustlock(): self.assertFalse (sf.get_locked ()) # Sequence interfaces def test_get_column (self): for bpp in (8, 16, 24, 32): sf = pygame.Surface ((6, 8), 0, bpp) sf.fill ((0, 0, 255)) val = sf.map_rgb ((0, 0, 255)) ar = pygame.PixelArray (sf) ar2 = ar.__getitem__ (1) self.assertEqual (len(ar2), 8) self.assertEqual (ar2.__getitem__ (0), val) self.assertEqual (ar2.__getitem__ (1), val) self.assertEqual (ar2.__getitem__ (2), val) ar2 = ar.__getitem__ (-1) self.assertEqual (len(ar2), 8) self.assertEqual (ar2.__getitem__ (0), val) self.assertEqual (ar2.__getitem__ (1), val) self.assertEqual (ar2.__getitem__ (2), val) def test_get_pixel (self): for bpp in (8, 16, 24, 32): sf = pygame.Surface ((10, 20), 0, bpp) sf.fill ((0, 0, 255)) for x in xrange_ (20): sf.set_at ((1, x), (0, 0, 11)) for x in xrange_ (10): sf.set_at ((x, 1), (0, 0, 11)) ar = pygame.PixelArray (sf) ar2 = ar.__getitem__ (0).__getitem__ (0) self.assertEqual (ar2, sf.map_rgb ((0, 0, 255))) ar2 = ar.__getitem__ (1).__getitem__ (0) self.assertEqual (ar2, sf.map_rgb ((0, 0, 11))) ar2 = ar.__getitem__ (-4).__getitem__ (1) self.assertEqual (ar2, sf.map_rgb ((0, 0, 11))) ar2 = ar.__getitem__ (-4).__getitem__ (5) self.assertEqual (ar2, sf.map_rgb ((0, 0, 255))) def test_set_pixel (self): for bpp in (8, 16, 24, 32): sf = pygame.Surface ((10, 20), 0, bpp) sf.fill ((0, 0, 0)) ar = pygame.PixelArray (sf) ar.__getitem__ (0).__setitem__ (0, (0, 255, 0)) self.assertEqual (ar[0][0], sf.map_rgb ((0, 255, 0))) ar.__getitem__ (1).__setitem__ (1, (128, 128, 128)) self.assertEqual (ar[1][1], sf.map_rgb ((128, 128, 128))) ar.__getitem__(-1).__setitem__ (-1, (128, 128, 128)) self.assertEqual (ar[9][19], sf.map_rgb ((128, 128, 128))) ar.__getitem__ (-2).__setitem__ (-2, (128, 128, 128)) self.assertEqual (ar[8][-2], sf.map_rgb ((128, 128, 128))) def test_set_column (self): for bpp in (8, 16, 24, 32): sf = pygame.Surface ((6, 8), 0, bpp) sf.fill ((0, 0, 0)) ar = pygame.PixelArray (sf) sf2 = pygame.Surface ((6, 8), 0, bpp) sf2.fill ((0, 255, 255)) ar2 = pygame.PixelArray (sf2) # Test single value assignment ar.__setitem__ (2, (128, 128, 128)) self.assertEqual (ar[2][0], sf.map_rgb ((128, 128, 128))) self.assertEqual (ar[2][1], sf.map_rgb ((128, 128, 128))) ar.__setitem__ (-1, (0, 255, 255)) self.assertEqual (ar[5][0], sf.map_rgb ((0, 255, 255))) self.assertEqual (ar[-1][1], sf.map_rgb ((0, 255, 255))) ar.__setitem__ (-2, (255, 255, 0)) self.assertEqual (ar[4][0], sf.map_rgb ((255, 255, 0))) self.assertEqual (ar[-2][1], sf.map_rgb ((255, 255, 0))) # Test list assignment. ar.__setitem__ (0, [(255, 255, 255)] * 8) self.assertEqual (ar[0][0], sf.map_rgb ((255, 255, 255))) self.assertEqual (ar[0][1], sf.map_rgb ((255, 255, 255))) # Test tuple assignment. ar.__setitem__ (1, ((204, 0, 204), (17, 17, 17), (204, 0, 204), (17, 17, 17), (204, 0, 204), (17, 17, 17), (204, 0, 204), (17, 17, 17))) self.assertEqual (ar[1][0], sf.map_rgb ((204, 0, 204))) self.assertEqual (ar[1][1], sf.map_rgb ((17, 17, 17))) self.assertEqual (ar[1][2], sf.map_rgb ((204, 0, 204))) # Test pixel array assignment. ar.__setitem__ (1, ar2.__getitem__ (3)) self.assertEqual (ar[1][0], sf.map_rgb ((0, 255, 255))) self.assertEqual (ar[1][1], sf.map_rgb ((0, 255, 255))) def test_get_slice (self): for bpp in (8, 16, 24, 32): sf = pygame.Surface ((10, 20), 0, bpp) sf.fill ((0, 0, 0)) ar = pygame.PixelArray (sf) if PY3: self.assertEqual (len (ar[0:2]), 2) self.assertEqual (len (ar[3:7][3]), 20) self.assertEqual (ar[0:0], None) self.assertEqual (ar[5:5], None) self.assertEqual (ar[9:9], None) else: self.assertEqual (len (ar.__getslice__ (0, 2)), 2) self.assertEqual (len (ar.__getslice__ (3, 7)[3]), 20) self.assertEqual (ar.__getslice__ (0, 0), None) self.assertEqual (ar.__getslice__ (5, 5), None) self.assertEqual (ar.__getslice__ (9, 9), None) # Has to resolve to ar[7:8] self.assertEqual (len (ar[-3:-2]), 20) # Try assignments. # 2D assignment. if PY3: ar[2:5] = (255, 255, 255) else: ar.__setslice__ (2, 5, (255, 255, 255)) self.assertEqual (ar[3][3], sf.map_rgb ((255, 255, 255))) # 1D assignment if PY3: ar[3][3:7] = (10, 10, 10) else: ar[3].__setslice__ (3, 7, (10, 10, 10)) self.assertEqual (ar[3][5], sf.map_rgb ((10, 10, 10))) self.assertEqual (ar[3][6], sf.map_rgb ((10, 10, 10))) def test_contains (self): for bpp in (8, 16, 24, 32): sf = pygame.Surface ((10, 20), 0, bpp) sf.fill ((0, 0, 0)) sf.set_at ((8, 8), (255, 255, 255)) ar = pygame.PixelArray (sf) self.assertTrue ((0, 0, 0) in ar) self.assertTrue ((255, 255, 255) in ar) self.assertFalse ((255, 255, 0) in ar) self.assertFalse (0x0000ff in ar) # Test sliced array self.assertTrue ((0, 0, 0) in ar[8]) self.assertTrue ((255, 255, 255) in ar[8]) self.assertFalse ((255, 255, 0) in ar[8]) self.assertFalse (0x0000ff in ar[8]) def test_get_surface (self): for bpp in (8, 16, 24, 32): sf = pygame.Surface ((10, 20), 0, bpp) sf.fill ((0, 0, 0)) ar = pygame.PixelArray (sf) self.assertEqual (sf, ar.surface) def test_set_slice (self): for bpp in (8, 16, 24, 32): sf = pygame.Surface ((6, 8), 0, bpp) sf.fill ((0, 0, 0)) ar = pygame.PixelArray (sf) # Test single value assignment val = sf.map_rgb ((128, 128, 128)) if PY3: ar[0:2] = val else: ar.__setslice__ (0, 2, val) self.assertEqual (ar[0][0], val) self.assertEqual (ar[0][1], val) self.assertEqual (ar[1][0], val) self.assertEqual (ar[1][1], val) val = sf.map_rgb ((0, 255, 255)) ar[-3:-1] = val self.assertEqual (ar[3][0], val) self.assertEqual (ar[-2][1], val) val = sf.map_rgb ((255, 255, 255)) ar[-3:] = (255, 255, 255) self.assertEqual (ar[4][0], val) self.assertEqual (ar[-1][1], val) # Test list assignment, this is a vertical assignment. val = sf.map_rgb ((0, 255, 0)) if PY3: ar[2:4] = [val] * 8 else: ar.__setslice__ (2, 4, [val] * 8) self.assertEqual (ar[2][0], val) self.assertEqual (ar[2][1], val) self.assertEqual (ar[2][4], val) self.assertEqual (ar[2][5], val) self.assertEqual (ar[3][0], val) self.assertEqual (ar[3][1], val) self.assertEqual (ar[3][4], val) self.assertEqual (ar[3][5], val) # And the horizontal assignment. val = sf.map_rgb ((255, 0, 0)) val2 = sf.map_rgb ((128, 0, 255)) if PY3: ar[0:2] = [val, val2] else: ar.__setslice__ (0, 2, [val, val2]) self.assertEqual (ar[0][0], val) self.assertEqual (ar[1][0], val2) self.assertEqual (ar[0][1], val) self.assertEqual (ar[1][1], val2) self.assertEqual (ar[0][4], val) self.assertEqual (ar[1][4], val2) self.assertEqual (ar[0][5], val) self.assertEqual (ar[1][5], val2) # Test pixelarray assignment. ar[:] = (0, 0, 0) sf2 = pygame.Surface ((6, 8), 0, bpp) sf2.fill ((255, 0, 255)) val = sf.map_rgb ((255, 0, 255)) ar2 = pygame.PixelArray (sf2) ar[:] = ar2[:] self.assertEqual (ar[0][0], val) self.assertEqual (ar[5][7], val) def test_subscript (self): # By default we do not need to work with any special __***__ # methods as map subscripts are the first looked up by the # object system. for bpp in (8, 16, 24, 32): sf = pygame.Surface ((6, 8), 0, bpp) sf.set_at ((1, 3), (0, 255, 0)) sf.set_at ((0, 0), (0, 255, 0)) sf.set_at ((4, 4), (0, 255, 0)) val = sf.map_rgb ((0, 255, 0)) ar = pygame.PixelArray (sf) # Test single value requests. self.assertEqual (ar[1,3], val) self.assertEqual (ar[0,0], val) self.assertEqual (ar[4,4], val) self.assertEqual (ar[1][3], val) self.assertEqual (ar[0][0], val) self.assertEqual (ar[4][4], val) # Test ellipse working. self.assertEqual (len (ar[...,...]), 6) self.assertEqual (len (ar[1,...]), 8) self.assertEqual (len (ar[...,3]), 6) # Test simple slicing self.assertEqual (len (ar[:,:]), 6) self.assertEqual (len (ar[:,]), 6) self.assertEqual (len (ar[1,:]), 8) self.assertEqual (len (ar[:,2]), 6) # Empty slices self.assertEqual (ar[4:4,], None) self.assertEqual (ar[4:4,...], None) self.assertEqual (ar[4:4,2:2], None) self.assertEqual (ar[4:4,1:4], None) self.assertEqual (ar[4:4:2,], None) self.assertEqual (ar[4:4:-2,], None) self.assertEqual (ar[4:4:1,...], None) self.assertEqual (ar[4:4:-1,...], None) self.assertEqual (ar[4:4:1,2:2], None) self.assertEqual (ar[4:4:-1,1:4], None) self.assertEqual (ar[...,4:4], None) self.assertEqual (ar[1:4,4:4], None) self.assertEqual (ar[...,4:4:1], None) self.assertEqual (ar[...,4:4:-1], None) self.assertEqual (ar[2:2,4:4:1], None) self.assertEqual (ar[1:4,4:4:-1], None) # Test advanced slicing ar[0] = 0 ar[1] = 1 ar[2] = 2 ar[3] = 3 ar[4] = 4 ar[5] = 5 # We should receive something like [0,2,4] self.assertEqual (ar[::2,1][0], 0) self.assertEqual (ar[::2,1][1], 2) self.assertEqual (ar[::2,1][2], 4) # We should receive something like [2,2,2] self.assertEqual (ar[2,::2][0], 2) self.assertEqual (ar[2,::2][1], 2) self.assertEqual (ar[2,::2][2], 2) # Should create a 3x3 array of [0,2,4] ar2 = ar[::2,::2] self.assertEqual (len (ar2), 3) self.assertEqual (ar2[0][0], 0) self.assertEqual (ar2[0][1], 0) self.assertEqual (ar2[0][2], 0) self.assertEqual (ar2[2][0], 4) self.assertEqual (ar2[2][1], 4) self.assertEqual (ar2[2][2], 4) self.assertEqual (ar2[1][0], 2) self.assertEqual (ar2[2][0], 4) self.assertEqual (ar2[1][1], 2) # Should create a reversed 3x8 array over X of [1,2,3] -> [3,2,1] ar2 = ar[3:0:-1] self.assertEqual (len (ar2), 3) self.assertEqual (ar2[0][0], 3) self.assertEqual (ar2[0][1], 3) self.assertEqual (ar2[0][2], 3) self.assertEqual (ar2[0][7], 3) self.assertEqual (ar2[2][0], 1) self.assertEqual (ar2[2][1], 1) self.assertEqual (ar2[2][2], 1) self.assertEqual (ar2[2][7], 1) self.assertEqual (ar2[1][0], 2) self.assertEqual (ar2[1][1], 2) # Should completely reverse the array over X -> [5,4,3,2,1,0] ar2 = ar[::-1] self.assertEqual (len (ar2), 6) self.assertEqual (ar2[0][0], 5) self.assertEqual (ar2[0][1], 5) self.assertEqual (ar2[0][3], 5) self.assertEqual (ar2[0][-1], 5) self.assertEqual (ar2[1][0], 4) self.assertEqual (ar2[1][1], 4) self.assertEqual (ar2[1][3], 4) self.assertEqual (ar2[1][-1], 4) self.assertEqual (ar2[-1][-1], 0) self.assertEqual (ar2[-2][-2], 1) self.assertEqual (ar2[-3][-1], 2) # Test advanced slicing ar[:] = 0 ar2 = ar[:,1] ar2[:] = [99] * len(ar2) self.assertEqual (ar2[0], 99) self.assertEqual (ar2[-1], 99) self.assertEqual (ar2[-2], 99) self.assertEqual (ar2[2], 99) self.assertEqual (ar[0,1], 99) self.assertEqual (ar[1,1], 99) self.assertEqual (ar[2,1], 99) self.assertEqual (ar[-1,1], 99) self.assertEqual (ar[-2,1], 99) def test_ass_subscript (self): for bpp in (8, 16, 24, 32): sf = pygame.Surface ((6, 8), 0, bpp) sf.fill ((255, 255, 255)) ar = pygame.PixelArray (sf) # Test ellipse working ar[...,...] = (0, 0, 0) self.assertEqual (ar[0,0], 0) self.assertEqual (ar[1,0], 0) self.assertEqual (ar[-1,-1], 0) ar[...,] = (0, 0, 255) self.assertEqual (ar[0,0], sf.map_rgb ((0, 0, 255))) self.assertEqual (ar[1,0], sf.map_rgb ((0, 0, 255))) self.assertEqual (ar[-1,-1], sf.map_rgb ((0, 0, 255))) ar[:,...] = (255, 0, 0) self.assertEqual (ar[0,0], sf.map_rgb ((255, 0, 0))) self.assertEqual (ar[1,0], sf.map_rgb ((255, 0, 0))) self.assertEqual (ar[-1,-1], sf.map_rgb ((255, 0, 0))) def test_make_surface (self): for bpp in (8, 16, 24, 32): sf = pygame.Surface ((10, 20), 0, bpp) sf.fill ((255, 255, 255)) ar = pygame.PixelArray (sf) newsf = ar[::2,::2].make_surface () rect = newsf.get_rect () self.assertEqual (rect.width, 5) self.assertEqual (rect.height, 10) def test_iter (self): for bpp in (8, 16, 24, 32): sf = pygame.Surface ((5, 10), 0, bpp) ar = pygame.PixelArray (sf) iterations = 0 for col in ar: self.assertEqual (len (col), 10) iterations += 1 self.assertEqual (iterations, 5) def test_replace (self): #print "replace start" for bpp in (8, 16, 24, 32): sf = pygame.Surface ((10, 10), 0, bpp) sf.fill ((255, 0, 0)) rval = sf.map_rgb ((0, 0, 255)) oval = sf.map_rgb ((255, 0, 0)) ar = pygame.PixelArray (sf) ar[::2].replace ((255, 0, 0), (0, 0, 255)) self.assertEqual (ar[0][0], rval) self.assertEqual (ar[1][0], oval) self.assertEqual (ar[2][3], rval) self.assertEqual (ar[3][6], oval) self.assertEqual (ar[8][9], rval) self.assertEqual (ar[9][9], oval) ar[::2].replace ((0, 0, 255), (255, 0, 0), weights=(10, 20, 50)) self.assertEqual (ar[0][0], oval) self.assertEqual (ar[2][3], oval) self.assertEqual (ar[3][6], oval) self.assertEqual (ar[8][9], oval) self.assertEqual (ar[9][9], oval) #print "replace end" def test_extract (self): #print "extract start" for bpp in (8, 16, 24, 32): sf = pygame.Surface ((10, 10), 0, bpp) sf.fill ((0, 0, 255)) sf.fill ((255, 0, 0), (2, 2, 6, 6)) white = sf.map_rgb ((255, 255, 255)) black = sf.map_rgb ((0, 0, 0)) ar = pygame.PixelArray (sf) newar = ar.extract ((255, 0, 0)) self.assertEqual (newar[0][0], black) self.assertEqual (newar[1][0], black) self.assertEqual (newar[2][3], white) self.assertEqual (newar[3][6], white) self.assertEqual (newar[8][9], black) self.assertEqual (newar[9][9], black) newar = ar.extract ((255, 0, 0), weights=(10, 0.1, 50)) self.assertEqual (newar[0][0], black) self.assertEqual (newar[1][0], black) self.assertEqual (newar[2][3], white) self.assertEqual (newar[3][6], white) self.assertEqual (newar[8][9], black) self.assertEqual (newar[9][9], black) #print "extract end" def todo_test_surface(self): # __doc__ (as of 2008-08-02) for pygame.pixelarray.PixelArray.surface: # PixelArray.surface: Return Surface # Gets the Surface the PixelArray uses. # # The Surface, the PixelArray was created for. self.fail() if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/overlay_test.py0000644000175000017500000000325211207055754020324 0ustar vincentvincent#################################### IMPORTS ################################### if __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest else: from test.test_utils import test_not_implemented, unittest ################################################################################ class OverlayTypeTest(unittest.TestCase): def todo_test_display(self): # __doc__ (as of 2008-08-02) for pygame.overlay.overlay.display: # Overlay.display((y, u, v)): return None # Overlay.display(): return None # set the overlay pixel data self.fail() def todo_test_get_hardware(self): # __doc__ (as of 2008-08-02) for pygame.overlay.overlay.get_hardware: # Overlay.get_hardware(rect): return int # test if the Overlay is hardware accelerated self.fail() def todo_test_set_location(self): # __doc__ (as of 2008-08-02) for pygame.overlay.overlay.set_location: # Overlay.set_location(rect): return None # control where the overlay is displayed self.fail() ################################################################################ if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/movie_test.py0000644000175000017500000002161311207055754017763 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import test_not_implemented, unittest else: from test import test_utils from test.test_utils import test_not_implemented, unittest import pygame import pygame.movie from pygame.locals import * import os import sys import time def within(a,b, error_range): return abs(a - b) < error_range def within_seq(a,b,error_range): for x,y in zip(a,b): #print x,y if not within(x,y,error_range): return 0 return 1 class MovieTypeTest( unittest.TestCase ): def test_render_frame__off_screen(self): # __doc__ (as of 2008-06-25) for pygame.movie.Movie: # pygame.movie.Movie(filename): return Movie # pygame.movie.Movie(object): return Movie # load an mpeg movie file # pygame accepts only MPEG program stream containers, # with MPEG1 video and MPEG2 audio. I found # that the command # mencoder -of mpeg -ovc lavc -oac lavc -lavcopts \ # acodec=mp2:vcodec=mpeg1video:vbitrate=1000 -o new.mpg old.avi # os.environ.update({"SDL_VIDEODRIVER":'windib'}) movie_file = test_utils.trunk_relative_path('examples/data/blue.mpg') # Need to init display before using it. self.assertRaises(Exception, (pygame.movie.Movie, movie_file)) pygame.display.init() # Needs to be init movie = pygame.movie.Movie(movie_file) movie_dimensions = movie.get_size() screen = pygame.display.set_mode(movie_dimensions) self.assertEqual(movie_dimensions, (320, 240)) off_screen = pygame.Surface(movie_dimensions).convert() movie.set_display(off_screen) frame_number = movie.render_frame(5) #self.assertEqual(off_screen.get_at((10,10)), (16, 16, 255, 255)) #self.assert_(off_screen.get_at((10,10)) in [(16, 16, 255, 255), (18, 13, 238, 255)]) self.assert_(within_seq( off_screen.get_at((10,10)), (16, 16, 255, 255), 20 )) pygame.display.quit() def dont_test_render_frame__on_screen(self): pygame.display.init() # Needs to be init or will segfault movie_file = test_utils.trunk_relative_path('examples/data/blue.mpg') movie = pygame.movie.Movie(movie_file) movie_dimensions = movie.get_size() self.assertEqual(movie_dimensions, (320, 240)) screen = pygame.display.set_mode(movie_dimensions) movie.set_display(screen) movie.render_frame(5) #self.assertEqual(screen.get_at((10,10)), (16, 16, 255, 255)) #self.assert_(screen.get_at((10,10)) in [(16, 16, 255, 255), (18, 13, 238, 255)]) self.assert_(within_seq( screen.get_at((10,10)), (16, 16, 255, 255), 20 )) pygame.display.quit() def todo_test_get_busy(self): # __doc__ (as of 2008-08-02) for pygame.movie.Movie.get_busy: # Movie.get_busy(): return bool # check if the movie is currently playing # # Returns true if the movie is currently being played. self.fail() def todo_test_get_frame(self): # __doc__ (as of 2008-08-02) for pygame.movie.Movie.get_frame: # Movie.get_frame(): return frame_number # get the current video frame # # Returns the integer frame number of the current video frame. self.fail() def todo_test_get_length(self): # __doc__ (as of 2008-08-02) for pygame.movie.Movie.get_length: # Movie.get_length(): return seconds # the total length of the movie in seconds # # Returns the length of the movie in seconds as a floating point value. self.fail() def todo_test_get_size(self): # __doc__ (as of 2008-08-02) for pygame.movie.Movie.get_size: # Movie.get_size(): return (width, height) # get the resolution of the video # # Gets the resolution of the movie video. The movie will be stretched # to the size of any Surface, but this will report the natural video # size. self.fail() def todo_test_get_time(self): # __doc__ (as of 2008-08-02) for pygame.movie.Movie.get_time: # Movie.get_time(): return seconds # get the current vide playback time # # Return the current playback time as a floating point value in # seconds. This method currently seems broken and always returns 0.0. self.fail() def todo_test_has_audio(self): # __doc__ (as of 2008-08-02) for pygame.movie.Movie.has_audio: # Movie.get_audio(): return bool # check if the movie file contains audio # # True when the opened movie file contains an audio stream. self.fail() def todo_test_has_video(self): # __doc__ (as of 2008-08-02) for pygame.movie.Movie.has_video: # Movie.get_video(): return bool # check if the movie file contains video # # True when the opened movie file contains a video stream. self.fail() def todo_test_pause(self): # __doc__ (as of 2008-08-02) for pygame.movie.Movie.pause: # Movie.pause(): return None # temporarily stop and resume playback # # This will temporarily stop or restart movie playback. self.fail() def todo_test_play(self): # __doc__ (as of 2008-08-02) for pygame.movie.Movie.play: # Movie.play(loops=0): return None # start playback of a movie # # Starts playback of the movie. Sound and video will begin playing if # they are not disabled. The optional loops argument controls how many # times the movie will be repeated. A loop value of -1 means the movie # will repeat forever. self.fail() def todo_test_rewind(self): # __doc__ (as of 2008-08-02) for pygame.movie.Movie.rewind: # Movie.rewind(): return None # restart the movie playback # # Sets the movie playback position to the start of the movie. The # movie will automatically begin playing even if it stopped. # # The can raise a ValueError if the movie cannot be rewound. If the # rewind fails the movie object is considered invalid. self.fail() def todo_test_set_display(self): # __doc__ (as of 2008-08-02) for pygame.movie.Movie.set_display: # Movie.set_display(Surface, rect=None): return None # set the video target Surface # # Set the output target Surface for the movie video. You may also pass # a rectangle argument for the position, which will move and stretch # the video into the given area. # # If None is passed as the target Surface, the video decoding will be disabled. self.fail() def todo_test_set_volume(self): # __doc__ (as of 2008-08-02) for pygame.movie.Movie.set_volume: # Movie.set_volume(value): return None # set the audio playback volume # # Set the playback volume for this movie. The argument is a value # between 0.0 and 1.0. If the volume is set to 0 the movie audio will # not be decoded. self.fail() def todo_test_skip(self): # __doc__ (as of 2008-08-02) for pygame.movie.Movie.skip: # Movie.skip(seconds): return None # advance the movie playback position # # Advance the movie playback time in seconds. This can be called # before the movie is played to set the starting playback time. This # can only skip the movie forward, not backwards. The argument is a # floating point number. self.fail() def todo_test_stop(self): # __doc__ (as of 2008-08-02) for pygame.movie.Movie.stop: # Movie.stop(): return None # stop movie playback # # Stops the playback of a movie. The video and audio playback will be # stopped at their current position. self.fail() if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/movie_tags.py0000644000175000017500000000024011207055754017733 0ustar vincentvincent__tags__ = [] import pygame try: pygame.movie._NOT_IMPLEMENTED_ except AttributeError: pass else: __tags__.extend(('ignore', 'subprocess_ignore')) pygame-1.9.1release/test/mouse_test.py0000644000175000017500000001456111207055754020000 0ustar vincentvincent#################################### IMPORTS ################################### if __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest else: from test.test_utils import test_not_implemented, unittest ################################################################################ class MouseModuleTest(unittest.TestCase): def todo_test_get_cursor(self): # __doc__ (as of 2008-08-02) for pygame.mouse.get_cursor: # pygame.mouse.get_cursor(): return (size, hotspot, xormasks, andmasks) # get the image for the system mouse cursor # # Get the information about the mouse system cursor. The return value # is the same data as the arguments passed into # pygame.mouse.set_cursor(). # self.fail() def todo_test_get_focused(self): # __doc__ (as of 2008-08-02) for pygame.mouse.get_focused: # pygame.mouse.get_focused(): return bool # check if the display is receiving mouse input # # Returns true when pygame is receiving mouse input events (or, in # windowing terminology, is "active" or has the "focus"). # # This method is most useful when working in a window. By contrast, in # full-screen mode, this method always returns true. # # Note: under MS Windows, the window that has the mouse focus also has # the keyboard focus. But under X-Windows, one window can receive # mouse events and another receive keyboard events. # pygame.mouse.get_focused() indicates whether the pygame window # receives mouse events. # self.fail() def todo_test_get_pos(self): # __doc__ (as of 2008-08-02) for pygame.mouse.get_pos: # pygame.mouse.get_pos(): return (x, y) # get the mouse cursor position # # Returns the X and Y position of the mouse cursor. The position is # relative the the top-left corner of the display. The cursor position # can be located outside of the display window, but is always # constrained to the screen. # self.fail() def todo_test_get_pressed(self): # __doc__ (as of 2008-08-02) for pygame.mouse.get_pressed: # pygame.moouse.get_pressed(): return (button1, button2, button3) # get the state of the mouse buttons # # Returns a sequence of booleans representing the state of all the # mouse buttons. A true value means the mouse is currently being # pressed at the time of the call. # # Note, to get all of the mouse events it is better to use either # pygame.event.wait() or pygame.event.get() and check all of those events # to see if they are MOUSEBUTTONDOWN, MOUSEBUTTONUP, or MOUSEMOTION. # Note, that on X11 some XServers use middle button emulation. When # you click both buttons 1 and 3 at the same time a 2 button event can # be emitted. # # Note, remember to call pygame.event.get() before this function. # Otherwise it will not work. # self.fail() def todo_test_get_rel(self): # __doc__ (as of 2008-08-02) for pygame.mouse.get_rel: # pygame.mouse.get_rel(): return (x, y) # get the amount of mouse movement # # Returns the amount of movement in X and Y since the previous call to # this function. The relative movement of the mouse cursor is # constrained to the edges of the screen, but see the virtual input # mouse mode for a way around this. Virtual input mode is described # at the top of the page. # self.fail() def todo_test_set_cursor(self): # __doc__ (as of 2008-08-02) for pygame.mouse.set_cursor: # pygame.mouse.set_cursor(size, hotspot, xormasks, andmasks): return None # set the image for the system mouse cursor # # When the mouse cursor is visible, it will be displayed as a black # and white bitmap using the given bitmask arrays. The size is a # sequence containing the cursor width and height. Hotspot is a # sequence containing the cursor hotspot position. xormasks is a # sequence of bytes containing the cursor xor data masks. Lastly is # andmasks, a sequence of bytes containting the cursor bitmask data. # # Width must be a multiple of 8, and the mask arrays must be the # correct size for the given width and height. Otherwise an exception # is raised. # # See the pygame.cursor module for help creating default and custom # masks for the system cursor. # self.fail() def todo_test_set_pos(self): # __doc__ (as of 2008-08-02) for pygame.mouse.set_pos: # pygame.mouse.set_pos([x, y]): return None # set the mouse cursor position # # Set the current mouse position to arguments given. If the mouse # cursor is visible it will jump to the new coordinates. Moving the # mouse will generate a new pygaqme.MOUSEMOTION event. # self.fail() def todo_test_set_visible(self): # __doc__ (as of 2008-08-02) for pygame.mouse.set_visible: # pygame.mouse.set_visible(bool): return bool # hide or show the mouse cursor # # If the bool argument is true, the mouse cursor will be visible. This # will return the previous visible state of the cursor. # self.fail() ################################################################################ if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/mixer_test.py0000644000175000017500000006143411207055754017775 0ustar vincentvincent#################################### IMPORTS ################################### if __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest else: from test.test_utils import test_not_implemented, unittest import pygame from pygame import mixer from pygame.compat import xrange_ import os ################################### CONSTANTS ################################## FREQUENCIES = [11025, 22050, 44100, 48000] SIZES = [-16, -8, 8, 16] CHANNELS = [1, 2] BUFFERS = [3024] ############################## MODULE LEVEL TESTS ############################## class MixerModuleTest(unittest.TestCase): def test_init__keyword_args(self): # Fails on a Mac; probably older SDL_mixer ## Probably don't need to be so exhaustive. Besides being slow the repeated ## init/quit calls may be causing problems on the Mac. ## configs = ( {'frequency' : f, 'size' : s, 'channels': c } ## for f in FREQUENCIES ## for s in SIZES ## for c in CHANNELS ) #### configs = [{'frequency' : 44100, 'size' : 16, 'channels' : 1}] configs = [{'frequency' : 22050, 'size' : -16, 'channels' : 2}] for kw_conf in configs: mixer.init(**kw_conf) mixer_conf = mixer.get_init() self.assertEquals( # Not all "sizes" are supported on all systems. (mixer_conf[0], abs(mixer_conf[1]), mixer_conf[2]), (kw_conf['frequency'], abs(kw_conf['size']), kw_conf['channels']) ) mixer.quit() def todo_test_pre_init__keyword_args(self): # Fails on Mac; probably older SDL_mixer ## Probably don't need to be so exhaustive. Besides being slow the repeated ## init/quit calls may be causing problems on the Mac. ## configs = ( {'frequency' : f, 'size' : s, 'channels': c } ## for f in FREQUENCIES ## for s in SIZES ## for c in CHANNELS ) configs = [{'frequency' : 44100, 'size' : 16, 'channels' : 1}] for kw_conf in configs: mixer.pre_init(**kw_conf) mixer.init() mixer_conf = mixer.get_init() self.assertEquals( # Not all "sizes" are supported on all systems. (mixer_conf[0], abs(mixer_conf[1]), mixer_conf[2]), (kw_conf['frequency'], abs(kw_conf['size']), kw_conf['channels']) ) mixer.quit() def todo_test_pre_init__zero_values(self): # Ensure that argument values of 0 are replaced with # default values. No way to check buffer size though. mixer.pre_init(44100, -8, 1) # Non default values mixer.pre_init(0, 0, 0) # Should reset to default values mixer.init() try: self.failUnlessEqual(mixer.get_init(), (22050, -16, 2)) finally: mixer.quit() def todo_test_init__zero_values(self): # Ensure that argument values of 0 are replaced with # preset values. No way to check buffer size though. mixer.pre_init(44100, 8, 1) # None default values mixer.init(0, 0, 0) try: self.failUnlessEqual(mixer.get_init(), (44100, 8, 1)) finally: mixer.quit() mixer.pre_init(0, 0, 0, 0) def test_get_init__returns_exact_values_used_for_init(self): return # fix in 1.9 - I think it's a SDL_mixer bug. # TODO: When this bug is fixed, testing through every combination # will be too slow so adjust as necessary, at the moment it # breaks the loop after first failure configs = [] for f in FREQUENCIES: for s in SIZES: for c in CHANNELS: configs.append ((f,s,c)) print (configs) for init_conf in configs: print (init_conf) f,s,c = init_conf if (f,s) == (22050,16):continue mixer.init(f,s,c) mixer_conf = mixer.get_init() import time time.sleep(0.1) mixer.quit() time.sleep(0.1) if init_conf != mixer_conf: continue self.assertEquals(init_conf, mixer_conf) def test_get_init__returns_None_if_mixer_not_initialized(self): self.assert_(mixer.get_init() is None) def test_get_num_channels__defaults_eight_after_init(self): mixer.init() num_channels = mixer.get_num_channels() self.assert_(num_channels == 8) mixer.quit() def test_set_num_channels(self): mixer.init() for i in xrange_(1, mixer.get_num_channels() + 1): mixer.set_num_channels(i) self.assert_(mixer.get_num_channels() == i) mixer.quit() def test_quit(self): """ get_num_channels() Should throw pygame.error if uninitialized after mixer.quit() """ mixer.init() mixer.quit() self.assertRaises ( pygame.error, mixer.get_num_channels, ) def todo_test_fadeout(self): # __doc__ (as of 2008-08-02) for pygame.mixer.fadeout: # pygame.mixer.fadeout(time): return None # fade out the volume on all sounds before stopping # # This will fade out the volume on all active channels over the time # argument in milliseconds. After the sound is muted the playback will # stop. # self.fail() def todo_test_find_channel(self): # __doc__ (as of 2008-08-02) for pygame.mixer.find_channel: # pygame.mixer.find_channel(force=False): return Channel # find an unused channel # # This will find and return an inactive Channel object. If there are # no inactive Channels this function will return None. If there are no # inactive channels and the force argument is True, this will find the # Channel with the longest running Sound and return it. # # If the mixer has reserved channels from pygame.mixer.set_reserved() # then those channels will not be returned here. # self.fail() def todo_test_get_busy(self): # __doc__ (as of 2008-08-02) for pygame.mixer.get_busy: # pygame.mixer.get_busy(): return bool # test if any sound is being mixed # # Returns True if the mixer is busy mixing any channels. If the mixer # is idle then this return False. # self.fail() def todo_test_init(self): # __doc__ (as of 2008-08-02) for pygame.mixer.init: # pygame.mixer.init(frequency=22050, size=-16, channels=2, # buffer=3072): return None # # initialize the mixer module # # Initialize the mixer module for Sound loading and playback. The # default arguments can be overridden to provide specific audio # mixing. The size argument represents how many bits are used for each # audio sample. If the value is negative then signed sample values # will be used. Positive values mean unsigned audio samples will be # used. # # The channels argument is used to specify whether to use mono or # stereo. 1 for mono and 2 for stereo. No other values are supported. # # The buffer argument controls the number of internal samples used in # the sound mixer. The default value should work for most cases. It # can be lowered to reduce latency, but sound dropout may occur. It # can be raised to larger values to ensure playback never skips, but # it will impose latency on sound playback. The buffer size must be a # power of two. # # Some platforms require the pygame.mixer module to be initialized # after the display modules have initialized. The top level # pygame.init() takes care of this automatically, but cannot pass any # arguments to the mixer init. To solve this, mixer has a function # pygame.mixer.pre_init() to set the proper defaults before the # toplevel init is used. # # It is safe to call this more than once, but after the mixer is # initialized you cannot change the playback arguments without first # calling pygame.mixer.quit(). # self.fail() def todo_test_pause(self): # __doc__ (as of 2008-08-02) for pygame.mixer.pause: # pygame.mixer.pause(): return None # temporarily stop playback of all sound channels # # This will temporarily stop all playback on the active mixer # channels. The playback can later be resumed with # pygame.mixer.unpause() # self.fail() def todo_test_pre_init(self): # __doc__ (as of 2008-08-02) for pygame.mixer.pre_init: # pygame.mixer.pre_init(frequency=0, size=0, channels=0, # buffersize=0): return None # # preset the mixer init arguments # # Any nonzero arguments change the default values used when the real # pygame.mixer.init() is called. The best way to set custom mixer # playback values is to call pygame.mixer.pre_init() before calling # the top level pygame.init(). # self.fail() def todo_test_set_reserved(self): # __doc__ (as of 2008-08-02) for pygame.mixer.set_reserved: # pygame.mixer.set_reserved(count): return None # reserve channels from being automatically used # # The mixer can reserve any number of channels that will not be # automatically selected for playback by Sounds. If sounds are # currently playing on the reserved channels they will not be stopped. # # This allows the application to reserve a specific number of channels # for important sounds that must not be dropped or have a guaranteed # channel to play on. # self.fail() def todo_test_stop(self): # __doc__ (as of 2008-08-02) for pygame.mixer.stop: # pygame.mixer.stop(): return None # stop playback of all sound channels # # This will stop all playback of all active mixer channels. self.fail() def todo_test_unpause(self): # __doc__ (as of 2008-08-02) for pygame.mixer.unpause: # pygame.mixer.unpause(): return None # resume paused playback of sound channels # # This will resume all active sound channels after they have been paused. self.fail() ############################## CHANNEL CLASS TESTS ############################# class ChannelTypeTest(unittest.TestCase): def todo_test_Channel(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Channel: # pygame.mixer.Channel(id): return Channel # Create a Channel object for controlling playback # # Return a Channel object for one of the current channels. The id must # be a value from 0 to the value of pygame.mixer.get_num_channels(). # # The Channel object can be used to get fine control over the playback # of Sounds. A channel can only playback a single Sound at time. Using # channels is entirely optional since pygame can manage them by # default. # self.fail() def todo_test_fadeout(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.fadeout: # Channel.fadeout(time): return None # stop playback after fading channel out # # Stop playback of a channel after fading out the sound over the given # time argument in milliseconds. # self.fail() def todo_test_get_busy(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.get_busy: # Channel.get_busy(): return bool # check if the channel is active # # Returns true if the channel is activily mixing sound. If the channel # is idle this returns False. # self.fail() def todo_test_get_endevent(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.get_endevent: # Channel.get_endevent(): return type # get the event a channel sends when playback stops # # Returns the event type to be sent every time the Channel finishes # playback of a Sound. If there is no endevent the function returns # pygame.NOEVENT. # self.fail() def todo_test_get_queue(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.get_queue: # Channel.get_queue(): return Sound # return any Sound that is queued # # If a Sound is already queued on this channel it will be returned. # Once the queued sound begins playback it will no longer be on the # queue. # self.fail() def todo_test_get_sound(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.get_sound: # Channel.get_sound(): return Sound # get the currently playing Sound # # Return the actual Sound object currently playing on this channel. If # the channel is idle None is returned. # self.fail() def todo_test_get_volume(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.get_volume: # Channel.get_volume(): return value # get the volume of the playing channel # # Return the volume of the channel for the current playing sound. This # does not take into account stereo separation used by # Channel.set_volume. The Sound object also has its own volume which # is mixed with the channel. # self.fail() def todo_test_pause(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.pause: # Channel.pause(): return None # temporarily stop playback of a channel # # Temporarily stop the playback of sound on a channel. It can be # resumed at a later time with Channel.unpause() # self.fail() def todo_test_play(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.play: # Channel.play(Sound, loops=0, maxtime=0, fade_ms=0): return None # play a Sound on a specific Channel # # This will begin playback of a Sound on a specific Channel. If the # Channel is currently playing any other Sound it will be stopped. # # The loops argument has the same meaning as in Sound.play(): it is # the number of times to repeat the sound after the first time. If it # is 3, the sound will be played 4 times (the first time, then three # more). If loops is -1 then the playback will repeat indefinitely. # # As in Sound.play(), the maxtime argument can be used to stop # playback of the Sound after a given number of milliseconds. # # As in Sound.play(), the fade_ms argument can be used fade in the sound. self.fail() def todo_test_queue(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.queue: # Channel.queue(Sound): return None # queue a Sound object to follow the current # # When a Sound is queued on a Channel, it will begin playing # immediately after the current Sound is finished. Each channel can # only have a single Sound queued at a time. The queued Sound will # only play if the current playback finished automatically. It is # cleared on any other call to Channel.stop() or Channel.play(). # # If there is no sound actively playing on the Channel then the Sound # will begin playing immediately. # self.fail() def todo_test_set_endevent(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.set_endevent: # Channel.set_endevent(): return None # Channel.set_endevent(type): return None # have the channel send an event when playback stops # # When an endevent is set for a channel, it will send an event to the # pygame queue every time a sound finishes playing on that channel # (not just the first time). Use pygame.event.get() to retrieve the # endevent once it's sent. # # Note that if you called Sound.play(n) or Channel.play(sound,n), the # end event is sent only once: after the sound has been played "n+1" # times (see the documentation of Sound.play). # # If Channel.stop() or Channel.play() is called while the sound was # still playing, the event will be posted immediately. # # The type argument will be the event id sent to the queue. This can # be any valid event type, but a good choice would be a value between # pygame.locals.USEREVENT and pygame.locals.NUMEVENTS. If no type # argument is given then the Channel will stop sending endevents. # self.fail() def todo_test_set_volume(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.set_volume: # Channel.set_volume(value): return None # Channel.set_volume(left, right): return None # set the volume of a playing channel # # Set the volume (loudness) of a playing sound. When a channel starts # to play its volume value is reset. This only affects the current # sound. The value argument is between 0.0 and 1.0. # # If one argument is passed, it will be the volume of both speakers. # If two arguments are passed and the mixer is in stereo mode, the # first argument will be the volume of the left speaker and the second # will be the volume of the right speaker. (If the second argument is # None, the first argument will be the volume of both speakers.) # # If the channel is playing a Sound on which set_volume() has also # been called, both calls are taken into account. For example: # # sound = pygame.mixer.Sound("s.wav") # channel = s.play() # Sound plays at full volume by default # sound.set_volume(0.9) # Now plays at 90% of full volume. # sound.set_volume(0.6) # Now plays at 60% (previous value replaced). # channel.set_volume(0.5) # Now plays at 30% (0.6 * 0.5). self.fail() def todo_test_stop(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.stop: # Channel.stop(): return None # stop playback on a Channel # # Stop sound playback on a channel. After playback is stopped the # channel becomes available for new Sounds to play on it. # self.fail() def todo_test_unpause(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Channel.unpause: # Channel.unpause(): return None # resume pause playback of a channel # # Resume the playback on a paused channel. self.fail() ############################### SOUND CLASS TESTS ############################## class SoundTypeTest(unittest.TestCase): def todo_test_fadeout(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Sound.fadeout: # Sound.fadeout(time): return None # stop sound playback after fading out # # This will stop playback of the sound after fading it out over the # time argument in milliseconds. The Sound will fade and stop on all # actively playing channels. # self.fail() def todo_test_get_buffer(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Sound.get_buffer: # Sound.get_buffer(): return BufferProxy # acquires a buffer object for the sameples of the Sound. # # Return a buffer object for the Sound samples. The buffer can be used # for direct access and manipulation. # # New in pygame 1.8. self.fail() def todo_test_get_length(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Sound.get_length: # Sound.get_length(): return seconds # get the length of the Sound # # Return the length of this Sound in seconds. self.fail() def todo_test_get_num_channels(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Sound.get_num_channels: # Sound.get_num_channels(): return count # count how many times this Sound is playing # # Return the number of active channels this sound is playing on. self.fail() def todo_test_get_volume(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Sound.get_volume: # Sound.get_volume(): return value # get the playback volume # # Return a value from 0.0 to 1.0 representing the volume for this Sound. self.fail() def todo_test_play(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Sound.play: # Sound.play(loops=0, maxtime=0, fade_ms=0): return Channel # begin sound playback # # Begin playback of the Sound (i.e., on the computer's speakers) on an # available Channel. This will forcibly select a Channel, so playback # may cut off a currently playing sound if necessary. # # The loops argument controls how many times the sample will be # repeated after being played the first time. A value of 5 means that # the sound will be played once, then repeated five times, and so is # played a total of six times. The default value (zero) means the # Sound is not repeated, and so is only played once. If loops is set # to -1 the Sound will loop indefinitely (though you can still call # stop() to stop it). # # The maxtime argument can be used to stop playback after a given # number of milliseconds. # # The fade_ms argument will make the sound start playing at 0 volume # and fade up to full volume over the time given. The sample may end # before the fade-in is complete. # # This returns the Channel object for the channel that was selected. self.fail() def todo_test_set_volume(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Sound.set_volume: # Sound.set_volume(value): return None # set the playback volume for this Sound # # This will set the playback volume (loudness) for this Sound. This # will immediately affect the Sound if it is playing. It will also # affect any future playback of this Sound. The argument is a value # from 0.0 to 1.0. # self.fail() def todo_test_stop(self): # __doc__ (as of 2008-08-02) for pygame.mixer.Sound.stop: # Sound.stop(): return None # stop sound playback # # This will stop the playback of this Sound on any active Channels. self.fail() ##################################### MAIN ##################################### if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/mixer_music_test.py0000644000175000017500000001576311207055754021201 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils \ import test_not_implemented, unittest, example_path else: from test.test_utils \ import test_not_implemented, unittest, example_path import pygame import os class MixerMusicModuleTest(unittest.TestCase): def test_load(self): # __doc__ (as of 2008-07-13) for pygame.mixer_music.load: # pygame.mixer.music.load(filename): return None # Load a music file for playback data_fname = example_path('data') pygame.mixer.init() # The mp3 test file can crash smpeg on some systems. ## formats = ['mp3', 'ogg', 'wav'] formats = ['ogg', 'wav'] for f in formats: musfn = os.path.join(data_fname, 'house_lo.%s' % f) pygame.mixer.music.load(musfn) #NOTE: TODO: loading from filelikes are disabled... # because as of writing it only works in SDL_mixer svn. #pygame.mixer.music.load(open(musfn)) #musf = open(musfn) #pygame.mixer.music.load(musf) pygame.mixer.quit() def todo_test_queue(self): # __doc__ (as of 2008-08-02) for pygame.mixer_music.queue: # This will load a music file and queue it. A queued music file will # begin as soon as the current music naturally ends. If the current # music is ever stopped or changed, the queued song will be lost. # # The following example will play music by Bach six times, then play # music by Mozart once: # # pygame.mixer.music.load('bach.ogg') # pygame.mixer.music.play(5) # Plays six times, not five! # pygame.mixer.music.queue('mozart.ogg') self.fail() def todo_test_stop(self): # __doc__ (as of 2008-08-02) for pygame.mixer_music.stop: # Stops the music playback if it is currently playing. self.fail() def todo_test_rewind(self): # __doc__ (as of 2008-08-02) for pygame.mixer_music.rewind: # Resets playback of the current music to the beginning. self.fail() def todo_test_get_pos(self): # __doc__ (as of 2008-08-02) for pygame.mixer_music.get_pos: # This gets the number of milliseconds that the music has been playing # for. The returned time only represents how long the music has been # playing; it does not take into account any starting position # offsets. # self.fail() def todo_test_fadeout(self): # __doc__ (as of 2008-08-02) for pygame.mixer_music.fadeout: # This will stop the music playback after it has been faded out over # the specified time (measured in milliseconds). # # Note, that this function blocks until the music has faded out. self.fail() def todo_test_play(self): # __doc__ (as of 2008-08-02) for pygame.mixer_music.play: # This will play the loaded music stream. If the music is already # playing it will be restarted. # # The loops argument controls the number of repeats a music will play. # play(5) will cause the music to played once, then repeated five # times, for a total of six. If the loops is -1 then the music will # repeat indefinitely. # # The starting position argument controls where in the music the song # starts playing. The starting position is dependent on the format of # music playing. MP3 and OGG use the position as time (in seconds). # MOD music it is the pattern order number. Passing a startpos will # raise a NotImplementedError if it cannot set the start position # self.fail() def todo_test_load(self): # __doc__ (as of 2008-08-02) for pygame.mixer_music.load: # This will load a music file and prepare it for playback. If a music # stream is already playing it will be stopped. This does not start # the music playing. # # Music can only be loaded from filenames, not python file objects # like the other pygame loading functions. # self.fail() def todo_test_get_volume(self): # __doc__ (as of 2008-08-02) for pygame.mixer_music.get_volume: # Returns the current volume for the mixer. The value will be between # 0.0 and 1.0. # self.fail() def todo_test_set_endevent(self): # __doc__ (as of 2008-08-02) for pygame.mixer_music.set_endevent: # This causes Pygame to signal (by means of the event queue) when the # music is done playing. The argument determines the type of event # that will be queued. # # The event will be queued every time the music finishes, not just the # first time. To stop the event from being queued, call this method # with no argument. # self.fail() def todo_test_pause(self): # __doc__ (as of 2008-08-02) for pygame.mixer_music.pause: # Temporarily stop playback of the music stream. It can be resumed # with the pygame.mixer.music.unpause() function. # self.fail() def todo_test_get_busy(self): # __doc__ (as of 2008-08-02) for pygame.mixer_music.get_busy: # Returns True when the music stream is actively playing. When the # music is idle this returns False. # self.fail() def todo_test_get_endevent(self): # __doc__ (as of 2008-08-02) for pygame.mixer_music.get_endevent: # Returns the event type to be sent every time the music finishes # playback. If there is no endevent the function returns # pygame.NOEVENT. # self.fail() def todo_test_unpause(self): # __doc__ (as of 2008-08-02) for pygame.mixer_music.unpause: # This will resume the playback of a music stream after it has been paused. self.fail() def todo_test_set_volume(self): # __doc__ (as of 2008-08-02) for pygame.mixer_music.set_volume: # Set the volume of the music playback. The value argument is between # 0.0 and 1.0. When new music is loaded the volume is reset. # self.fail() if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/midi_test.py0000644000175000017500000004123711226530200017553 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import test_not_implemented, unittest else: from test import test_utils from test.test_utils import test_not_implemented, unittest import pygame import pygame.midi import pygame.compat from pygame.locals import * import os import sys import time class MidiTest( unittest.TestCase ): def todo_test_poll(self): # __doc__ (as of 2009-05-19) for pygame.midi.Input.poll: # returns true if there's data, or false if not. # Input.poll(): return Bool # # raises a MidiException on error. self.fail() def todo_test_read(self): # __doc__ (as of 2009-05-19) for pygame.midi.Input.read: # reads num_events midi events from the buffer. # Input.read(num_events): return midi_event_list # # Reads from the Input buffer and gives back midi events. # [[[status,data1,data2,data3],timestamp], # [[status,data1,data2,data3],timestamp],...] self.fail() def test_MidiException(self): # __doc__ (as of 2009-05-19) for pygame.midi.MidiException.message: def raiseit(): raise pygame.midi.MidiException(0) self.assertRaises(pygame.midi.MidiException, raiseit) try: raise pygame.midi.MidiException(0) except pygame.midi.MidiException: e = pygame.compat.geterror() self.assertEqual(e.parameter, 0) def test_note_off(self): """|tags: interactive| """ # __doc__ (as of 2009-05-19) for pygame.midi.Output.note_off: # turns a midi note off. Note must be on. # Output.note_off(note, velocity=None, channel = 0) # # Turn a note off in the output stream. The note must already # be on for this to work correctly. i = pygame.midi.get_default_output_id() if i != -1: o = pygame.midi.Output(i) o.note_on(5, 30, 0) o.note_off(5, 30, 0) def test_note_on(self): """|tags: interactive| """ # __doc__ (as of 2009-05-19) for pygame.midi.Output.note_on: # turns a midi note on. Note must be off. # Output.note_on(note, velocity=None, channel = 0) # # Turn a note on in the output stream. The note must already # be off for this to work correctly. i = pygame.midi.get_default_output_id() if i != -1: o = pygame.midi.Output(i) o.note_on(5, 30, 0) def todo_test_set_instrument(self): # __doc__ (as of 2009-05-19) for pygame.midi.Output.set_instrument: # Select an instrument, with a value between 0 and 127. # Output.set_instrument(instrument_id, channel = 0) self.fail() def todo_test_write(self): # __doc__ (as of 2009-05-19) for pygame.midi.Output.write: # writes a list of midi data to the Output. # Output.write(data) # # writes series of MIDI information in the form of a list: # write([[[status <,data1><,data2><,data3>],timestamp], # [[status <,data1><,data2><,data3>],timestamp],...]) # fields are optional # example: choose program change 1 at time 20000 and # send note 65 with velocity 100 500 ms later. # write([[[0xc0,0,0],20000],[[0x90,60,100],20500]]) # notes: # 1. timestamps will be ignored if latency = 0. # 2. To get a note to play immediately, send MIDI info with # timestamp read from function Time. # 3. understanding optional data fields: # write([[[0xc0,0,0],20000]]) is equivalent to # write([[[0xc0],20000]]) # # Can send up to 1024 elements in your data list, otherwise an # IndexError exception is raised. self.fail() def test_write_short(self): """|tags: interactive| """ # __doc__ (as of 2009-05-19) for pygame.midi.Output.write_short: # write_short(status <, data1><, data2>) # Output.write_short(status) # Output.write_short(status, data1 = 0, data2 = 0) # # output MIDI information of 3 bytes or less. # data fields are optional # status byte could be: # 0xc0 = program change # 0x90 = note on # etc. # data bytes are optional and assumed 0 if omitted # example: note 65 on with velocity 100 # write_short(0x90,65,100) i = pygame.midi.get_default_output_id() if i != -1: o = pygame.midi.Output(i) # put a note on, then off. o.write_short(0x90,65,100) o.write_short(0x80,65,100) def test_Input(self): """|tags: interactive| """ i = pygame.midi.get_default_input_id() if i != -1: o = pygame.midi.Input(i) del o # try feeding it an input id. i = pygame.midi.get_default_output_id() # can handle some invalid input too. self.assertRaises(pygame.midi.MidiException, pygame.midi.Input, i) self.assertRaises(pygame.midi.MidiException, pygame.midi.Input, 9009) self.assertRaises(pygame.midi.MidiException, pygame.midi.Input, -1) self.assertRaises(TypeError, pygame.midi.Input,"1234") self.assertRaises(OverflowError, pygame.midi.Input, pow(2,99)) def test_Output(self): """|tags: interactive| """ i = pygame.midi.get_default_output_id() if i != -1: o = pygame.midi.Output(i) del o # try feeding it an input id. i = pygame.midi.get_default_input_id() # can handle some invalid input too. self.assertRaises(pygame.midi.MidiException, pygame.midi.Output, i) self.assertRaises(pygame.midi.MidiException, pygame.midi.Output, 9009) self.assertRaises(pygame.midi.MidiException, pygame.midi.Output, -1) self.assertRaises(TypeError, pygame.midi.Output,"1234") self.assertRaises(OverflowError, pygame.midi.Output, pow(2,99)) def todo_test_write_sys_ex(self): # __doc__ (as of 2009-05-19) for pygame.midi.Output.write_sys_ex: # writes a timestamped system-exclusive midi message. # Output.write_sys_ex(when, msg) # # write_sys_ex(,) # # msg - can be a *list* or a *string* # example: # (assuming o is an onput MIDI stream) # o.write_sys_ex(0,'\xF0\x7D\x10\x11\x12\x13\xF7') # is equivalent to # o.write_sys_ex(pygame.midi.Time, # [0xF0,0x7D,0x10,0x11,0x12,0x13,0xF7]) self.fail() def tearDown(self): pygame.midi.quit() def setUp(self): pygame.midi.init() def test_get_count(self): # __doc__ (as of 2009-05-19) for pygame.midi.get_count: # gets the number of devices. # pygame.midi.get_count(): return num_devices # # # Device ids range from 0 to get_count() -1 c = pygame.midi.get_count() self.assertEqual(type(c), type(1)) self.failUnless(c >= 0) def test_get_default_input_id(self): # __doc__ (as of 2009-05-19) for pygame.midi.get_default_input_device_id: # gets the device number of the default input device. # pygame.midi.get_default_input_device_id(): return default_id # # # Return the default device ID or -1 if there are no devices. # The result can be passed to the Input()/Ouput() class. # # On the PC, the user can specify a default device by # setting an environment variable. For example, to use device #1. # # set PM_RECOMMENDED_INPUT_DEVICE=1 # # The user should first determine the available device ID by using # the supplied application "testin" or "testout". # # In general, the registry is a better place for this kind of info, # and with USB devices that can come and go, using integers is not # very reliable for device identification. Under Windows, if # PM_RECOMMENDED_OUTPUT_DEVICE (or PM_RECOMMENDED_INPUT_DEVICE) is # *NOT* found in the environment, then the default device is obtained # by looking for a string in the registry under: # HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Input_Device # and HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Output_Device # for a string. The number of the first device with a substring that # matches the string exactly is returned. For example, if the string # in the registry is "USB", and device 1 is named # "In USB MidiSport 1x1", then that will be the default # input because it contains the string "USB". # # In addition to the name, get_device_info() returns "interf", which # is the interface name. (The "interface" is the underlying software # system or API used by PortMidi to access devices. Examples are # MMSystem, DirectX (not implemented), ALSA, OSS (not implemented), etc.) # At present, the only Win32 interface is "MMSystem", the only Linux # interface is "ALSA", and the only Max OS X interface is "CoreMIDI". # To specify both the interface and the device name in the registry, # separate the two with a comma and a space, e.g.: # MMSystem, In USB MidiSport 1x1 # In this case, the string before the comma must be a substring of # the "interf" string, and the string after the space must be a # substring of the "name" name string in order to match the device. # # Note: in the current release, the default is simply the first device # (the input or output device with the lowest PmDeviceID). c = pygame.midi.get_default_input_id() # if there is a not None return make sure it is an int. self.assertEqual(type(c), type(1)) self.failUnless(c >= 0 or c == -1) def test_get_default_output_id(self): # __doc__ (as of 2009-05-19) for pygame.midi.get_default_output_device_id: # get the device number of the default output device. # pygame.midi.get_default_output_device_id(): return default_id # # # Return the default device ID or -1 if there are no devices. # The result can be passed to the Input()/Ouput() class. # # On the PC, the user can specify a default device by # setting an environment variable. For example, to use device #1. # # set PM_RECOMMENDED_OUTPUT_DEVICE=1 # # The user should first determine the available device ID by using # the supplied application "testin" or "testout". # # In general, the registry is a better place for this kind of info, # and with USB devices that can come and go, using integers is not # very reliable for device identification. Under Windows, if # PM_RECOMMENDED_OUTPUT_DEVICE (or PM_RECOMMENDED_INPUT_DEVICE) is # *NOT* found in the environment, then the default device is obtained # by looking for a string in the registry under: # HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Input_Device # and HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Output_Device # for a string. The number of the first device with a substring that # matches the string exactly is returned. For example, if the string # in the registry is "USB", and device 1 is named # "In USB MidiSport 1x1", then that will be the default # input because it contains the string "USB". # # In addition to the name, get_device_info() returns "interf", which # is the interface name. (The "interface" is the underlying software # system or API used by PortMidi to access devices. Examples are # MMSystem, DirectX (not implemented), ALSA, OSS (not implemented), etc.) # At present, the only Win32 interface is "MMSystem", the only Linux # interface is "ALSA", and the only Max OS X interface is "CoreMIDI". # To specify both the interface and the device name in the registry, # separate the two with a comma and a space, e.g.: # MMSystem, In USB MidiSport 1x1 # In this case, the string before the comma must be a substring of # the "interf" string, and the string after the space must be a # substring of the "name" name string in order to match the device. # # Note: in the current release, the default is simply the first device # (the input or output device with the lowest PmDeviceID). c = pygame.midi.get_default_output_id() self.assertEqual(type(c), type(1)) self.failUnless(c >= 0 or c == -1) def test_get_device_info(self): # __doc__ (as of 2009-05-19) for pygame.midi.get_device_info: # returns (interf, name, input, output, opened) # pygame.midi.get_device_info(an_id): return (interf, name, input, # output, opened) # # # If the id is out of range, the function returns None. an_id = pygame.midi.get_default_output_id() if an_id != -1: interf, name, input, output, opened = pygame.midi.get_device_info(an_id) #print interf #print name #print input, output, opened self.assertEqual(output, 1) self.assertEqual(input, 0) self.assertEqual(opened, 0) an_in_id = pygame.midi.get_default_input_id() if an_in_id != -1: r = pygame.midi.get_device_info(an_in_id) # if r is None, it means that the id is out of range. try: interf, name, input, output, opened = r except TypeError: raise Exception(repr(r)) self.assertEqual(output, 0) self.assertEqual(input, 1) self.assertEqual(opened, 0) def test_init(self): # __doc__ (as of 2009-05-19) for pygame.midi.init: # initialize the midi module # pygame.midi.init(): return None # # Call the initialisation function before using the midi module. # # It is safe to call this more than once. pygame.midi.quit() self.assertRaises(RuntimeError, pygame.midi.get_count) # initialising many times should be fine. pygame.midi.init() pygame.midi.init() pygame.midi.init() pygame.midi.init() def todo_test_midis2events(self): # __doc__ (as of 2009-05-19) for pygame.midi.midis2events: # converts midi events to pygame events # pygame.midi.midis2events(midis, device_id): return [Event, ...] # # Takes a sequence of midi events and returns list of pygame events. self.fail() def test_quit(self): # __doc__ (as of 2009-05-19) for pygame.midi.quit: # uninitialize the midi module # pygame.midi.quit(): return None # # # Called automatically atexit if you don't call it. # # It is safe to call this function more than once. # It is safe to call this more than once. pygame.midi.quit() pygame.midi.init() pygame.midi.quit() pygame.midi.quit() pygame.midi.init() pygame.midi.init() pygame.midi.quit() def test_time(self): # __doc__ (as of 2009-05-19) for pygame.midi.time: # returns the current time in ms of the PortMidi timer # pygame.midi.time(): return time t = pygame.midi.time() self.assertEqual(type(t), type(1)) # should be close to 2-3... since the timer is just init'd. self.failUnless(t >= 0 and t < 100) if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/mask_test.py0000644000175000017500000003405011207055754017576 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest else: from test.test_utils import test_not_implemented, unittest import pygame import pygame.mask from pygame.locals import * import random def random_mask(size = (100,100)): """random_mask(size=(100,100)): return Mask Create a mask of the given size, with roughly half the bits set at random.""" m = pygame.Mask(size) for i in range(size[0] * size[1] // 2): x, y = random.randint(0,size[0] - 1), random.randint(0, size[1] - 1) m.set_at((x,y)) return m def maskFromSurface(surface, threshold = 127): mask = pygame.Mask(surface.get_size()) key = surface.get_colorkey() if key: for y in range(surface.get_height()): for x in range(surface.get_width()): if surface.get_at((x+0.1,y+0.1)) != key: mask.set_at((x,y),1) else: for y in range(surface.get_height()): for x in range (surface.get_width()): if surface.get_at((x,y))[3] > threshold: mask.set_at((x,y),1) return mask #pygame.init() #pygame.display.set_mode((10,10)) class MaskTypeTest( unittest.TestCase ): def assertMaskEquals(self, m1, m2): self.assertEquals(m1.get_size(), m2.get_size()) for i in range(m1.get_size()[0]): for j in range(m1.get_size()[1]): self.assertEquals(m1.get_at((i,j)), m2.get_at((i,j))) def todo_test_get_at(self): # __doc__ (as of 2008-08-02) for pygame.mask.Mask.get_at: # Mask.get_at((x,y)) -> int # Returns nonzero if the bit at (x,y) is set. # # Coordinates start at (0,0) is top left - just like Surfaces. self.fail() def todo_test_get_size(self): # __doc__ (as of 2008-08-02) for pygame.mask.Mask.get_size: # Mask.get_size() -> width,height # Returns the size of the mask. self.fail() def todo_test_overlap(self): # __doc__ (as of 2008-08-02) for pygame.mask.Mask.overlap: # Mask.overlap(othermask, offset) -> x,y # Returns the point of intersection if the masks overlap with the # given offset - or None if it does not overlap. # The overlap tests uses the following offsets (which may be negative): # +----+----------.. # |A | yoffset # | +-+----------.. # +--|B # |xoffset # | | # : : self.fail() def todo_test_overlap_area(self): # __doc__ (as of 2008-08-02) for pygame.mask.Mask.overlap_area: # Mask.overlap_area(othermask, offset) -> numpixels # Returns the number of overlapping 'pixels'. # # You can see how many pixels overlap with the other mask given. This # can be used to see in which direction things collide, or to see how # much the two masks collide. self.fail() def todo_test_set_at(self): # __doc__ (as of 2008-08-02) for pygame.mask.Mask.set_at: # Mask.set_at((x,y),value) # Sets the position in the mask given by x and y. self.fail() def test_mask_access( self ): """ do the set_at, and get_at parts work correctly? """ m = pygame.Mask((10,10)) m.set_at((0,0), 1) self.assertEqual(m.get_at((0,0)), 1) m.set_at((9,0), 1) self.assertEqual(m.get_at((9,0)), 1) #s = pygame.Surface((10,10)) #s.set_at((1,0), (0, 0, 1, 255)) #self.assertEqual(s.get_at((1,0)), (0, 0, 1, 255)) #s.set_at((-1,0), (0, 0, 1, 255)) # out of bounds, should get IndexError self.assertRaises(IndexError, lambda : m.get_at((-1,0)) ) self.assertRaises(IndexError, lambda : m.set_at((-1,0), 1) ) self.assertRaises(IndexError, lambda : m.set_at((10,0), 1) ) self.assertRaises(IndexError, lambda : m.set_at((0,10), 1) ) def test_drawing(self): """ Test fill, clear, invert, draw, erase """ m = pygame.Mask((100,100)) self.assertEqual(m.count(), 0) m.fill() self.assertEqual(m.count(), 10000) m2 = pygame.Mask((10,10)) m2.fill() m.erase(m2, (50,50)) self.assertEqual(m.count(), 9900) m.invert() self.assertEqual(m.count(), 100) m.draw(m2, (0,0)) self.assertEqual(m.count(), 200) m.clear() self.assertEqual(m.count(), 0) def test_outline(self): """ """ m = pygame.Mask((20,20)) self.assertEqual(m.outline(), []) m.set_at((10,10), 1) self.assertEqual(m.outline(), [(10,10)]) m.set_at((10,12), 1) self.assertEqual(m.outline(10), [(10,10)]) m.set_at((11,11), 1) self.assertEqual(m.outline(), [(10,10), (11,11), (10,12), (11,11), (10,10)]) self.assertEqual(m.outline(2), [(10,10), (10,12), (10,10)]) #TODO: Test more corner case outlines. def test_convolve__size(self): sizes = [(1,1), (31,31), (32,32), (100,100)] for s1 in sizes: m1 = pygame.Mask(s1) for s2 in sizes: m2 = pygame.Mask(s2) o = m1.convolve(m2) for i in (0,1): self.assertEquals(o.get_size()[i], m1.get_size()[i] + m2.get_size()[i] - 1) def test_convolve__point_identities(self): """Convolving with a single point is the identity, while convolving a point with something flips it.""" m = random_mask((100,100)) k = pygame.Mask((1,1)) k.set_at((0,0)) self.assertMaskEquals(m,m.convolve(k)) self.assertMaskEquals(m,k.convolve(k.convolve(m))) def test_convolve__with_output(self): """checks that convolution modifies only the correct portion of the output""" m = random_mask((10,10)) k = pygame.Mask((2,2)) k.set_at((0,0)) o = pygame.Mask((50,50)) test = pygame.Mask((50,50)) m.convolve(k,o) test.draw(m,(1,1)) self.assertMaskEquals(o, test) o.clear() test.clear() m.convolve(k,o, (10,10)) test.draw(m,(11,11)) self.assertMaskEquals(o, test) def test_convolve__out_of_range(self): full = pygame.Mask((2,2)) full.fill() self.assertEquals(full.convolve(full, None, ( 0, 3)).count(), 0) self.assertEquals(full.convolve(full, None, ( 0, 2)).count(), 3) self.assertEquals(full.convolve(full, None, (-2, -2)).count(), 1) self.assertEquals(full.convolve(full, None, (-3, -3)).count(), 0) def test_convolve(self): """Tests the definition of convolution""" m1 = random_mask((100,100)) m2 = random_mask((100,100)) conv = m1.convolve(m2) for i in range(conv.get_size()[0]): for j in range(conv.get_size()[1]): self.assertEquals(conv.get_at((i,j)) == 0, m1.overlap(m2, (i - 99, j - 99)) is None) def test_connected_components(self): """ """ m = pygame.Mask((10,10)) self.assertEquals(repr(m.connected_components()), "[]") comp = m.connected_component() self.assertEquals(m.count(), comp.count()) m.set_at((0,0), 1) m.set_at((1,1), 1) comp = m.connected_component() comps = m.connected_components() comps1 = m.connected_components(1) comps2 = m.connected_components(2) comps3 = m.connected_components(3) self.assertEquals(comp.count(), comps[0].count()) self.assertEquals(comps1[0].count(), 2) self.assertEquals(comps2[0].count(), 2) self.assertEquals(repr(comps3), "[]") m.set_at((9, 9), 1) comp = m.connected_component() comp1 = m.connected_component((1, 1)) comp2 = m.connected_component((2, 2)) comps = m.connected_components() comps1 = m.connected_components(1) comps2 = m.connected_components(2) comps3 = m.connected_components(3) self.assertEquals(comp.count(), 2) self.assertEquals(comp1.count(), 2) self.assertEquals(comp2.count(), 0) self.assertEquals(len(comps), 2) self.assertEquals(len(comps1), 2) self.assertEquals(len(comps2), 1) self.assertEquals(len(comps3), 0) def test_get_bounding_rects(self): """ """ m = pygame.Mask((10,10)) m.set_at((0,0), 1) m.set_at((1,0), 1) m.set_at((0,1), 1) m.set_at((0,3), 1) m.set_at((3,3), 1) r = m.get_bounding_rects() self.assertEquals(repr(r), "[, , ]") #1100 #1111 m = pygame.Mask((4,2)) m.set_at((0,0), 1) m.set_at((1,0), 1) m.set_at((2,0), 0) m.set_at((3,0), 0) m.set_at((0,1), 1) m.set_at((1,1), 1) m.set_at((2,1), 1) m.set_at((3,1), 1) r = m.get_bounding_rects() self.assertEquals(repr(r), "[]") #00100 #01110 #00100 m = pygame.Mask((5,3)) m.set_at((0,0), 0) m.set_at((1,0), 0) m.set_at((2,0), 1) m.set_at((3,0), 0) m.set_at((4,0), 0) m.set_at((0,1), 0) m.set_at((1,1), 1) m.set_at((2,1), 1) m.set_at((3,1), 1) m.set_at((4,1), 0) m.set_at((0,2), 0) m.set_at((1,2), 0) m.set_at((2,2), 1) m.set_at((3,2), 0) m.set_at((4,2), 0) r = m.get_bounding_rects() self.assertEquals(repr(r), "[]") #00010 #00100 #01000 m = pygame.Mask((5,3)) m.set_at((0,0), 0) m.set_at((1,0), 0) m.set_at((2,0), 0) m.set_at((3,0), 1) m.set_at((4,0), 0) m.set_at((0,1), 0) m.set_at((1,1), 0) m.set_at((2,1), 1) m.set_at((3,1), 0) m.set_at((4,1), 0) m.set_at((0,2), 0) m.set_at((1,2), 1) m.set_at((2,2), 0) m.set_at((3,2), 0) m.set_at((4,2), 0) r = m.get_bounding_rects() self.assertEquals(repr(r), "[]") #00011 #11111 m = pygame.Mask((5,2)) m.set_at((0,0), 0) m.set_at((1,0), 0) m.set_at((2,0), 0) m.set_at((3,0), 1) m.set_at((4,0), 1) m.set_at((0,1), 1) m.set_at((1,1), 1) m.set_at((2,1), 1) m.set_at((3,1), 1) m.set_at((3,1), 1) r = m.get_bounding_rects() #TODO: this should really make one bounding rect. #self.assertEquals(repr(r), "[]") class MaskModuleTest(unittest.TestCase): def test_from_surface(self): """ Does the mask.from_surface() work correctly? """ mask_from_surface = pygame.mask.from_surface surf = pygame.Surface((70,70), SRCALPHA, 32) surf.fill((255,255,255,255)) amask = pygame.mask.from_surface(surf) #amask = mask_from_surface(surf) self.assertEqual(amask.get_at((0,0)), 1) self.assertEqual(amask.get_at((66,1)), 1) self.assertEqual(amask.get_at((69,1)), 1) surf.set_at((0,0), (255,255,255,127)) surf.set_at((1,0), (255,255,255,128)) surf.set_at((2,0), (255,255,255,0)) surf.set_at((3,0), (255,255,255,255)) amask = mask_from_surface(surf) self.assertEqual(amask.get_at((0,0)), 0) self.assertEqual(amask.get_at((1,0)), 1) self.assertEqual(amask.get_at((2,0)), 0) self.assertEqual(amask.get_at((3,0)), 1) surf.fill((255,255,255,0)) amask = mask_from_surface(surf) self.assertEqual(amask.get_at((0,0)), 0) #TODO: test a color key surface. def test_from_threshold(self): """ Does mask.from_threshold() work correctly? """ a = [16, 24, 32] for i in a: surf = pygame.surface.Surface((70,70), 0, i) surf.fill((100,50,200),(20,20,20,20)) mask = pygame.mask.from_threshold(surf,(100,50,200,255),(10,10,10,255)) self.assertEqual(mask.count(), 400) self.assertEqual(mask.get_bounding_rects(), [pygame.Rect((20,20,20,20))]) for i in a: surf = pygame.surface.Surface((70,70), 0, i) surf2 = pygame.surface.Surface((70,70), 0, i) surf.fill((100,100,100)) surf2.fill((150,150,150)) surf2.fill((100,100,100), (40,40,10,10)) mask = pygame.mask.from_threshold(surf, (0,0,0,0), (10,10,10,255), surf2) self.assertEqual(mask.count(), 100) self.assertEqual(mask.get_bounding_rects(), [pygame.Rect((40,40,10,10))]) if __name__ == '__main__': if 1: unittest.main() else: mask_from_surface = maskFromSurface surf = pygame.Surface((70,70), SRCALPHA, 32) #surf = surf.convert_alpha() surf.set_at((0,0), (255,255,255,0)) print (surf.get_at((0,0))) print ("asdf") print (surf) pygame-1.9.1release/test/key_test.py0000644000175000017500000001160511207055754017434 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest else: from test.test_utils import test_not_implemented, unittest import pygame import os class KeyModuleTest(unittest.TestCase): def test_import(self): 'does it import' import pygame.key def todo_test_get_focused(self): # __doc__ (as of 2008-08-02) for pygame.key.get_focused: # pygame.key.get_focused(): return bool # true if the display is receiving keyboard input from the system # # This is true when the display window has keyboard focus from the # system. If the display needs to ensure it does not lose keyboard # focus, it can use pygame.event.set_grab() to grab all input. # self.fail() def todo_test_get_mods(self): # __doc__ (as of 2008-08-02) for pygame.key.get_mods: # pygame.key.get_mods(): return int # determine which modifier keys are being held # # Returns a single integer representing a bitmask of all the modifier # keys being held. Using bitwise operators you can test if specific # shift keys are pressed, the state of the capslock button, and more. # self.fail() def todo_test_get_pressed(self): # __doc__ (as of 2008-08-02) for pygame.key.get_pressed: # pygame.key.get_pressed(): return bools # get the state of all keyboard buttons # # Returns a sequence of boolean values representing the state of every # key on the keyboard. Use the key constant values to index the array. # A True value means the that button is pressed. # # Getting the list of pushed buttons with this function is not the # proper way to handle text entry from the user. You have no way to # know the order of keys pressed, and rapidly pushed keys can be # completely unnoticed between two calls to pygame.key.get_pressed(). # There is also no way to translate these pushed keys into a fully # translated character value. See the pygame.KEYDOWN events on the # event queue for this functionality. # self.fail() def todo_test_get_repeat(self): # __doc__ (as of 2008-08-02) for pygame.key.get_repeat: # pygame.key.get_repeat(): return (delay, interval) # see how held keys are repeated # # When the keyboard repeat is enabled, keys that are held down will # generate multiple pygame.KEYDOWN events. The delay is the number of # milliseconds before the first repeated pygame.KEYDOWN will be sent. # After that another pygame.KEYDOWN will be sent every interval # milliseconds. # # When pygame is initialized the key repeat is disabled. # New in pygame 1.8. self.fail() def todo_test_name(self): # __doc__ (as of 2008-08-02) for pygame.key.name: # pygame.key.name(key): return string # get the name of a key identifier # # Get the descriptive name of the button from a keyboard button id constant. self.fail() def todo_test_set_mods(self): # __doc__ (as of 2008-08-02) for pygame.key.set_mods: # pygame.key.set_mods(int): return None # temporarily set which modifier keys are pressed # # Create a bitmask of the modifier constants you want to impose on your program. self.fail() def todo_test_set_repeat(self): # __doc__ (as of 2008-08-02) for pygame.key.set_repeat: # pygame.key.set_repeat(): return None # pygame.key.set_repeat(delay, interval): return None # control how held keys are repeated # # When the keyboard repeat is enabled, keys that are held down will # generate multiple pygame.KEYDOWN events. The delay is the number of # milliseconds before the first repeated pygame.KEYDOWN will be sent. # After that another pygame.KEYDOWN will be sent every interval # milliseconds. If no arguments are passed the key repeat is disabled. # # When pygame is initialized the key repeat is disabled. self.fail() if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/joystick_test.py0000644000175000017500000001000511207055754020474 0ustar vincentvincent#################################### IMPORTS ################################### if __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest else: from test.test_utils import test_not_implemented, unittest ################################################################################ class JoystickTypeTest(unittest.TestCase): def todo_test_Joystick(self): # __doc__ (as of 2008-08-02) for pygame.joystick.Joystick: # pygame.joystick.Joystick(id): return Joystick # create a new Joystick object # # Create a new joystick to access a physical device. The id argument # must be a value from 0 to pygame.joystick.get_count()-1. # # To access most of the Joystick methods, you'll need to init() the # Joystick. This is separate from making sure the joystick module is # initialized. When multiple Joysticks objects are created for the # same physical joystick device (i.e., they have the same ID number), # the state and values for those Joystick objects will be shared. # # The Joystick object allows you to get information about the types of # controls on a joystick device. Once the device is initialized the # Pygame event queue will start receiving events about its input. # # You can call the Joystick.get_name() and Joystick.get_id() functions # without initializing the Joystick object. # self.fail() class JoytickModuleTest(unittest.TestCase): def todo_test_get_count(self): # __doc__ (as of 2008-08-02) for pygame.joystick.get_count: # pygame.joystick.get_count(): return count # number of joysticks on the system # # Return the number of joystick devices on the system. The count will # be 0 if there are no joysticks on the system. # # When you create Joystick objects using Joystick(id), you pass an # integer that must be lower than this count. # self.fail() def todo_test_get_init(self): # __doc__ (as of 2008-08-02) for pygame.joystick.get_init: # pygame.joystick.get_init(): return bool # true if the joystick module is initialized # # Test if the pygame.joystick.init() function has been called. self.fail() def todo_test_init(self): # __doc__ (as of 2008-08-02) for pygame.joystick.init: # pygame.joystick.init(): return None # initialize the joystick module # # This function is called automatically by pygame.init(). # It initializes the joystick module. This will scan the system for # all joystick devices. The module must be initialized before any # other functions will work. # # It is safe to call this function more than once. self.fail() def todo_test_quit(self): # __doc__ (as of 2008-08-02) for pygame.joystick.quit: # pygame.joystick.quit(): return None # uninitialize the joystick module # # Uninitialize the joystick module. After you call this any existing # joystick objects will no longer work. # # It is safe to call this function more than once. self.fail() ################################################################################ if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/image_test.py0000644000175000017500000002705611207055754017735 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils \ import test_not_implemented, example_path, unittest else: from test.test_utils \ import test_not_implemented, example_path, unittest import pygame, pygame.image, pygame.pkgdata from pygame.compat import xrange_, ord_ import os import array def test_magic(f, magic_hex): """ tests a given file to see if the magic hex matches. """ data = f.read(len(magic_hex)) if len(data) != len(magic_hex): return 0 for i in range(len(magic_hex)): if magic_hex[i] != ord_(data[i]): return 0 return 1 class ImageModuleTest( unittest.TestCase ): def testLoadIcon(self): """ see if we can load the pygame icon. """ f = pygame.pkgdata.getResource("pygame_icon.bmp") self.assertEqual(f.mode, "rb") surf = pygame.image.load_basic(f) self.assertEqual(surf.get_at((0,0)),(5, 4, 5, 255)) self.assertEqual(surf.get_height(),32) self.assertEqual(surf.get_width(),32) def testLoadPNG(self): """ see if we can load a png. """ f = example_path('data/alien1.png') # normalized # f = os.path.join("examples", "data", "alien1.png") surf = pygame.image.load(f) f = open(f, 'rb') # f = open(os.path.join("examples", "data", "alien1.png"), "rb") surf = pygame.image.load(f) def testLoadJPG(self): """ see if we can load a jpg. """ f = example_path('data/alien1.jpg') # normalized # f = os.path.join("examples", "data", "alien1.jpg") surf = pygame.image.load(f) f = open(f, "rb") # f = open(os.path.join("examples", "data", "alien1.jpg"), "rb") surf = pygame.image.load(f) # surf = pygame.image.load(open(os.path.join("examples", "data", "alien1.jpg"), "rb")) def test_save(self): s = pygame.Surface((10,10)) s.fill((23,23,23)) magic_hex = {} magic_hex['jpg'] = [0xff, 0xd8, 0xff, 0xe0] magic_hex['png'] = [0x89 ,0x50 ,0x4e ,0x47] magic_hex['tga'] = [0x0, 0x0, 0xa] magic_hex['bmp'] = [0x42, 0x4d] formats = ["jpg", "png", "tga", "bmp"] # uppercase too... JPG formats = formats + [x.upper() for x in formats] for fmt in formats: try: temp_filename = "%s.%s" % ("tmpimg", fmt) pygame.image.save(s, temp_filename) # test the magic numbers at the start of the file to ensure they are saved # as the correct file type. self.assertEqual((1, fmt), (test_magic(open(temp_filename, "rb"), magic_hex[fmt.lower()]), fmt)) # load the file to make sure it was saved correctly. # Note load can load a jpg saved with a .png file name. s2 = pygame.image.load(temp_filename) #compare contents, might only work reliably for png... # but because it's all one color it seems to work with jpg. self.assertEquals(s2.get_at((0,0)), s.get_at((0,0))) finally: #clean up the temp file, comment out to leave tmp file after run. os.remove(temp_filename) pass def assertPremultipliedAreEqual(self, string1, string2, source_string): self.assertEqual(len(string1), len(string2)) block_size = 20 if string1 != string2: for block_start in xrange_(0, len(string1), block_size): block_end = min(block_start + block_size, len(string1)) block1 = string1[block_start:block_end] block2 = string2[block_start:block_end] if block1 != block2: source_block = source_string[block_start:block_end] msg = "string difference in %d to %d of %d:\n%s\n%s\nsource:\n%s" % (block_start, block_end, len(string1), block1.encode("hex"), block2.encode("hex"), source_block.encode("hex")) self.fail(msg) def test_to_string__premultiplied(self): """ test to make sure we can export a surface to a premultiplied alpha string """ def convertRGBAtoPremultiplied(surface_to_modify): for x in xrange_(surface_to_modify.get_width()): for y in xrange_(surface_to_modify.get_height()): color = surface_to_modify.get_at((x, y)) premult_color = (color[0]*color[3]/255, color[1]*color[3]/255, color[2]*color[3]/255, color[3]) surface_to_modify.set_at((x, y), premult_color) test_surface = pygame.Surface((256, 256), pygame.SRCALPHA, 32) for x in xrange_(test_surface.get_width()): for y in xrange_(test_surface.get_height()): i = x + y*test_surface.get_width() test_surface.set_at((x,y), ((i*7) % 256, (i*13) % 256, (i*27) % 256, y)) premultiplied_copy = test_surface.copy() convertRGBAtoPremultiplied(premultiplied_copy) self.assertPremultipliedAreEqual(pygame.image.tostring(test_surface, "RGBA_PREMULT"), pygame.image.tostring(premultiplied_copy, "RGBA"), pygame.image.tostring(test_surface, "RGBA")) self.assertPremultipliedAreEqual(pygame.image.tostring(test_surface, "ARGB_PREMULT"), pygame.image.tostring(premultiplied_copy, "ARGB"), pygame.image.tostring(test_surface, "ARGB")) no_alpha_surface = pygame.Surface((256, 256), 0, 24) self.assertRaises(ValueError, pygame.image.tostring, no_alpha_surface, "RGBA_PREMULT") def test_fromstring__and_tostring(self): """ see if fromstring, and tostring methods are symmetric. """ def AreSurfacesIdentical(surf_a, surf_b): if surf_a.get_width() != surf_b.get_width() or surf_a.get_height() != surf_b.get_height(): return False for y in xrange_(surf_a.get_height()): for x in xrange_(surf_b.get_width()): if surf_a.get_at((x,y)) != surf_b.get_at((x,y)): return False return True #################################################################### def RotateRGBAtoARGB(str_buf): byte_buf = array.array("B", str_buf) num_quads = len(byte_buf)//4 for i in xrange_(num_quads): alpha = byte_buf[i*4 + 3] byte_buf[i*4 + 3] = byte_buf[i*4 + 2] byte_buf[i*4 + 2] = byte_buf[i*4 + 1] byte_buf[i*4 + 1] = byte_buf[i*4 + 0] byte_buf[i*4 + 0] = alpha return byte_buf.tostring() #################################################################### def RotateARGBtoRGBA(str_buf): byte_buf = array.array("B", str_buf) num_quads = len(byte_buf)//4 for i in xrange_(num_quads): alpha = byte_buf[i*4 + 0] byte_buf[i*4 + 0] = byte_buf[i*4 + 1] byte_buf[i*4 + 1] = byte_buf[i*4 + 2] byte_buf[i*4 + 2] = byte_buf[i*4 + 3] byte_buf[i*4 + 3] = alpha return byte_buf.tostring() #################################################################### test_surface = pygame.Surface((64, 256), flags=pygame.SRCALPHA, depth=32) for i in xrange_(256): for j in xrange_(16): intensity = j*16 + 15 test_surface.set_at((j + 0, i), (intensity, i, i, i)) test_surface.set_at((j + 16, i), (i, intensity, i, i)) test_surface.set_at((j + 32, i), (i, i, intensity, i)) test_surface.set_at((j + 32, i), (i, i, i, intensity)) self.assert_(AreSurfacesIdentical(test_surface, test_surface)) rgba_buf = pygame.image.tostring(test_surface, "RGBA") rgba_buf = RotateARGBtoRGBA(RotateRGBAtoARGB(rgba_buf)) test_rotate_functions = pygame.image.fromstring(rgba_buf, test_surface.get_size(), "RGBA") self.assert_(AreSurfacesIdentical(test_surface, test_rotate_functions)) rgba_buf = pygame.image.tostring(test_surface, "RGBA") argb_buf = RotateRGBAtoARGB(rgba_buf) test_from_argb_string = pygame.image.fromstring(argb_buf, test_surface.get_size(), "ARGB") self.assert_(AreSurfacesIdentical(test_surface, test_from_argb_string)) #"ERROR: image.fromstring with ARGB failed" argb_buf = pygame.image.tostring(test_surface, "ARGB") rgba_buf = RotateARGBtoRGBA(argb_buf) test_to_argb_string = pygame.image.fromstring(rgba_buf, test_surface.get_size(), "RGBA") self.assert_(AreSurfacesIdentical(test_surface, test_to_argb_string)) #"ERROR: image.tostring with ARGB failed" argb_buf = pygame.image.tostring(test_surface, "ARGB") test_to_from_argb_string = pygame.image.fromstring(argb_buf, test_surface.get_size(), "ARGB") self.assert_(AreSurfacesIdentical(test_surface, test_to_from_argb_string)) #"ERROR: image.fromstring and image.tostring with ARGB are not symmetric" def todo_test_frombuffer(self): # __doc__ (as of 2008-08-02) for pygame.image.frombuffer: # pygame.image.frombuffer(string, size, format): return Surface # create a new Surface that shares data inside a string buffer # # Create a new Surface that shares pixel data directly from the string # buffer. This method takes the same arguments as # pygame.image.fromstring(), but is unable to vertically flip the # source data. # # This will run much faster than pygame.image.fromstring, since no # pixel data must be allocated and copied. self.fail() def todo_test_get_extended(self): # __doc__ (as of 2008-08-02) for pygame.image.get_extended: # pygame.image.get_extended(): return bool # test if extended image formats can be loaded # # If pygame is built with extended image formats this function will # return True. It is still not possible to determine which formats # will be available, but generally you will be able to load them all. self.fail() def todo_test_load_basic(self): # __doc__ (as of 2008-08-02) for pygame.image.load_basic: # pygame.image.load(filename): return Surface # pygame.image.load(fileobj, namehint=): return Surface # load new image from a file self.fail() def todo_test_load_extended(self): # __doc__ (as of 2008-08-02) for pygame.image.load_extended: # pygame module for image transfer self.fail() def todo_test_save_extended(self): # __doc__ (as of 2008-08-02) for pygame.image.save_extended: # pygame module for image transfer self.fail() if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/image__save_gl_surface_test.py0000644000175000017500000000327411207055754023300 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest import pygame, os from pygame.locals import * class GL_ImageSave(unittest.TestCase): def test_image_save_works_with_opengl_surfaces(self): "|tags:display,slow|" pygame.display.init() screen = pygame.display.set_mode((640,480), OPENGL|DOUBLEBUF) pygame.display.flip() tmp_dir = test_utils.get_tmp_dir() # Try the imageext module. tmp_file = os.path.join(tmp_dir, "opengl_save_surface_test.png") pygame.image.save(screen, tmp_file) self.assert_(os.path.exists(tmp_file)) os.remove(tmp_file) # Only test the image module. tmp_file = os.path.join(tmp_dir, "opengl_save_surface_test.bmp") pygame.image.save(screen, tmp_file) self.assert_(os.path.exists(tmp_file)) os.remove(tmp_file) # stops tonnes of tmp dirs building up in trunk dir os.rmdir(tmp_dir) pygame.display.quit() if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/gfxdraw_test.py0000644000175000017500000007257611210364127020313 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import unittest else: from test.test_utils import unittest import pygame import pygame.gfxdraw from pygame.locals import * def intensity(c, i): """Return color c changed by intensity i For 0 <= i <= 127 the color is a shade, with 0 being black, 127 being the unaltered color. For 128 <= i <= 255 the color is a tint, with 255 being white, 128 the unaltered color. """ r, g, b = c[0:3] if 0 <= i <= 127: # Darken return ((r * i) // 127, (g * i) // 127, (b * i) // 127) # Lighten return (r + ((255 - r) * (255 - i)) // 127, g + ((255 - g) * (255 - i)) // 127, b + ((255 - b) * (255 - i)) // 127) class GfxdrawDefaultTest( unittest.TestCase ): is_started = False foreground_color = (128, 64, 8) background_color = (255, 255, 255) def make_palette(base_color): """Return color palette that is various intensities of base_color""" # Need this function for Python 3.x so the base_color # is within the scope of the list comprehension. return [intensity(base_color, i) for i in range(0, 256)] default_palette = make_palette(foreground_color) default_size = (100, 100) def check_at(self, surf, posn, color): sc = surf.get_at(posn) fail_msg = ("%s != %s at %s, bitsize: %i, flags: %i, masks: %s" % (sc, color, posn, surf.get_bitsize(), surf.get_flags(), surf.get_masks())) self.failUnlessEqual(sc, color, fail_msg) def check_not_at(self, surf, posn, color): sc = surf.get_at(posn) fail_msg = ("%s != %s at %s, bitsize: %i, flags: %i, masks: %s" % (sc, color, posn, surf.get_bitsize(), surf.get_flags(), surf.get_masks())) self.failIfEqual(sc, color, fail_msg) def setUp(self): Surface = pygame.Surface size = self.default_size palette = self.default_palette if not self.is_started: # Necessary for Surface.set_palette. pygame.init() pygame.display.set_mode((1, 1)) # Create test surfaces self.surfaces = [Surface(size, 0, 8), Surface(size, 0, 16), Surface(size, 0, 24), Surface(size, 0, 32), Surface(size, SRCALPHA, 16), Surface(size, SRCALPHA, 32)] self.surfaces[0].set_palette(palette) # Special pixel formats for i in range(1, 6): s = self.surfaces[i] flags = s.get_flags() bitsize = s.get_bitsize() masks = s.get_masks() if flags: masks = (masks[1], masks[2], masks[3], masks[0]) else: masks = (masks[1], masks[2], masks[0], masks[3]) self.surfaces.append(Surface(size, flags, bitsize, masks)) for surf in self.surfaces: surf.fill(self.background_color) def test_pixel(self): """pixel(surface, x, y, color): return None""" fg = self.foreground_color bg = self.background_color for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.pixel(surf, 2, 2, fg) for x in range(1, 4): for y in range(1, 4): if x == 2 and y == 2: self.check_at(surf, (x, y), fg_adjusted) else: self.check_at(surf, (x, y), bg_adjusted) def test_hline(self): """hline(surface, x1, x2, y, color): return None""" fg = self.foreground_color bg = self.background_color startx = 10 stopx = 80 y = 50 fg_test_points = [(startx, y), (stopx, y), ((stopx - startx) // 2, y)] bg_test_points = [(startx - 1, y), (stopx + 1, y), (startx, y - 1), (startx, y + 1), (stopx, y - 1), (stopx, y + 1)] for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.hline(surf, startx, stopx, y, fg) for posn in fg_test_points: self.check_at(surf, posn, fg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) def test_vline(self): """vline(surface, x, y1, y2, color): return None""" fg = self.foreground_color bg = self.background_color x = 50 starty = 10 stopy = 80 fg_test_points = [(x, starty), (x, stopy), (x, (stopy - starty) // 2)] bg_test_points = [(x, starty - 1), (x, stopy + 1), (x - 1, starty), (x + 1, starty), (x - 1, stopy), (x + 1, stopy)] for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.vline(surf, x, starty, stopy, fg) for posn in fg_test_points: self.check_at(surf, posn, fg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) def test_rectangle(self): """rectangle(surface, rect, color): return None""" fg = self.foreground_color bg = self.background_color rect = pygame.Rect(10, 15, 55, 62) rect_tuple = tuple(rect) fg_test_points = [rect.topleft, (rect.right - 1, rect.top), (rect.left, rect.bottom - 1), (rect.right - 1, rect.bottom - 1)] bg_test_points = [(rect.left - 1, rect.top - 1), (rect.left + 1, rect.top + 1), (rect.right, rect.top - 1), (rect.right - 2, rect.top + 1), (rect.left - 1, rect.bottom), (rect.left + 1, rect.bottom - 2), (rect.right, rect.bottom), (rect.right - 2, rect.bottom - 2)] for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.rectangle(surf, rect, fg) for posn in fg_test_points: self.check_at(surf, posn, fg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) surf.fill(bg) pygame.gfxdraw.rectangle(surf, rect_tuple, fg) for posn in fg_test_points: self.check_at(surf, posn, fg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) def test_box(self): """box(surface, rect, color): return None""" fg = self.foreground_color bg = self.background_color rect = pygame.Rect(10, 15, 55, 62) rect_tuple = tuple(rect) fg_test_points = [rect.topleft, (rect.left + 1, rect.top + 1), (rect.right - 1, rect.top), (rect.right - 2, rect.top + 1), (rect.left, rect.bottom - 1), (rect.left + 1, rect.bottom - 2), (rect.right - 1, rect.bottom - 1), (rect.right - 2, rect.bottom - 2)] bg_test_points = [(rect.left - 1, rect.top - 1), (rect.right, rect.top - 1), (rect.left - 1, rect.bottom), (rect.right, rect.bottom)] for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.box(surf, rect, fg) for posn in fg_test_points: self.check_at(surf, posn, fg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) surf.fill(bg) pygame.gfxdraw.box(surf, rect_tuple, fg) for posn in fg_test_points: self.check_at(surf, posn, fg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) def test_line(self): """line(surface, x1, y1, x2, y2, color): return None""" fg = self.foreground_color bg = self.background_color x1 = 10 y1 = 15 x2 = 92 y2 = 77 fg_test_points = [(x1, y1), (x2, y2)] bg_test_points = [(x1 - 1, y1), (x1, y1 - 1), (x1 - 1, y1 - 1), (x2 + 1, y2), (x2, y2 + 1), (x2 + 1, y2 + 1)] for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.line(surf, x1, y1, x2, y2, fg) for posn in fg_test_points: self.check_at(surf, posn, fg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) def test_circle(self): """circle(surface, x, y, r, color): return None""" fg = self.foreground_color bg = self.background_color x = 45 y = 40 r = 30 fg_test_points = [(x, y - r), (x, y + r), (x - r, y), (x + r, y)] bg_test_points = [(x, y), (x, y - r + 1), (x, y - r - 1), (x, y + r + 1), (x, y + r - 1), (x - r - 1, y), (x - r + 1, y), (x + r + 1, y), (x + r - 1, y)] for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.circle(surf, x, y, r, fg) for posn in fg_test_points: self.check_at(surf, posn, fg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) def test_arc(self): """arc(surface, x, y, r, start, end, color): return None""" fg = self.foreground_color bg = self.background_color x = 45 y = 40 r = 30 start = 0 # +x direction, but not (x + r, y) (?) end = 90 # -y direction, including (x, y + r) fg_test_points = [(x, y + r), (x + r, y + 1)] bg_test_points = [(x, y), (x, y - r), (x - r, y), (x, y + r + 1), (x, y + r - 1), (x - 1, y + r), (x + r + 1, y), (x + r - 1, y), (x + r, y)] for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.arc(surf, x, y, r, start, end, fg) for posn in fg_test_points: self.check_at(surf, posn, fg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) def test_aacircle(self): """aacircle(surface, x, y, r, color): return None""" fg = self.foreground_color bg = self.background_color x = 45 y = 40 r = 30 fg_test_points = [(x, y - r), (x, y + r), (x - r, y), (x + r, y)] bg_test_points = [(x, y), (x, y - r + 1), (x, y - r - 1), (x, y + r + 1), (x, y + r - 1), (x - r - 1, y), (x - r + 1, y), (x + r + 1, y), (x + r - 1, y)] for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.aacircle(surf, x, y, r, fg) for posn in fg_test_points: self.check_not_at(surf, posn, bg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) def test_filled_circle(self): """filled_circle(surface, x, y, r, color): return None""" fg = self.foreground_color bg = self.background_color x = 45 y = 40 r = 30 fg_test_points = [(x, y - r), (x, y - r + 1), (x, y + r), (x, y + r - 1), (x - r, y), (x - r + 1, y), (x + r, y), (x + r - 1, y), (x, y)] bg_test_points = [(x, y - r - 1), (x, y + r + 1), (x - r - 1, y), (x + r + 1, y)] for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.filled_circle(surf, x, y, r, fg) for posn in fg_test_points: self.check_at(surf, posn, fg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) def test_ellipse(self): """ellipse(surface, x, y, rx, ry, color): return None""" fg = self.foreground_color bg = self.background_color x = 45 y = 40 rx = 30 ry = 35 fg_test_points = [(x, y - ry), (x, y + ry), (x - rx, y), (x + rx, y)] bg_test_points = [(x, y), (x, y - ry + 1), (x, y - ry - 1), (x, y + ry + 1), (x, y + ry - 1), (x - rx - 1, y), (x - rx + 1, y), (x + rx + 1, y), (x + rx - 1, y)] for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.ellipse(surf, x, y, rx, ry, fg) for posn in fg_test_points: self.check_at(surf, posn, fg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) def test_aaellipse(self): """aaellipse(surface, x, y, rx, ry, color): return None""" fg = self.foreground_color bg = self.background_color x = 45 y = 40 rx = 30 ry = 35 fg_test_points = [(x, y - ry), (x, y + ry), (x - rx, y), (x + rx, y)] bg_test_points = [(x, y), (x, y - ry + 1), (x, y - ry - 1), (x, y + ry + 1), (x, y + ry - 1), (x - rx - 1, y), (x - rx + 1, y), (x + rx + 1, y), (x + rx - 1, y)] for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.aaellipse(surf, x, y, rx, ry, fg) for posn in fg_test_points: self.check_not_at(surf, posn, bg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) def test_filled_ellipse(self): """filled_ellipse(surface, x, y, rx, ry, color): return None""" fg = self.foreground_color bg = self.background_color x = 45 y = 40 rx = 30 ry = 35 fg_test_points = [(x, y - ry), (x, y - ry + 1), (x, y + ry), (x, y + ry - 1), (x - rx, y), (x - rx + 1, y), (x + rx, y), (x + rx - 1, y), (x, y)] bg_test_points = [(x, y - ry - 1), (x, y + ry + 1), (x - rx - 1, y), (x + rx + 1, y)] for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.filled_ellipse(surf, x, y, rx, ry, fg) for posn in fg_test_points: self.check_at(surf, posn, fg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) def test_pie(self): """pie(surface, x, y, r, start, end, color): return None""" fg = self.foreground_color bg = self.background_color x = 45 y = 40 r = 30 start = 0 # +x direction, including (x + r, y) end = 90 # -y direction, but not (x, y + r) (?) fg_test_points = [(x, y), (x + 1, y), (x, y + 1), (x + r, y)] bg_test_points = [(x - 1, y), (x, y - 1), (x - 1, y - 1), (x + 1, y + 1), (x + r + 1, y), (x + r, y - 1), (x, y + r)] for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.pie(surf, x, y, r, start, end, fg) for posn in fg_test_points: self.check_at(surf, posn, fg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) def test_trigon(self): """trigon(surface, x1, y1, x2, y2, x3, y3, color): return None""" fg = self.foreground_color bg = self.background_color x1 = 10 y1 = 15 x2 = 92 y2 = 77 x3 = 20 y3 = 60 fg_test_points = [(x1, y1), (x2, y2), (x3, y3)] bg_test_points = [(x1 - 1, y1 - 1), (x2 + 1, y2 + 1), (x3 - 1, y3 + 1), (x1 + 10, y1 + 30)] for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.trigon(surf, x1, y1, x2, y2, x3, y3, fg) for posn in fg_test_points: self.check_at(surf, posn, fg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) def test_aatrigon(self): """aatrigon(surface, x1, y1, x2, y2, x3, y3, color): return None""" fg = self.foreground_color bg = self.background_color x1 = 10 y1 = 15 x2 = 92 y2 = 77 x3 = 20 y3 = 60 fg_test_points = [(x1, y1), (x2, y2), (x3, y3)] bg_test_points = [(x1 - 1, y1 - 1), (x2 + 1, y2 + 1), (x3 - 1, y3 + 1), (x1 + 10, y1 + 30)] for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.aatrigon(surf, x1, y1, x2, y2, x3, y3, fg) for posn in fg_test_points: self.check_not_at(surf, posn, bg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) def test_filled_trigon(self): """filled_trigon(surface, x1, y1, x2, y2, x3, y3, color): return None""" fg = self.foreground_color bg = self.background_color x1 = 10 y1 = 15 x2 = 92 y2 = 77 x3 = 20 y3 = 60 fg_test_points = [(x1, y1), (x2, y2), (x3, y3), (x1 + 10, y1 + 30)] bg_test_points = [(x1 - 1, y1 - 1), (x2 + 1, y2 + 1), (x3 - 1, y3 + 1)] for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.filled_trigon(surf, x1, y1, x2, y2, x3, y3, fg) for posn in fg_test_points: self.check_at(surf, posn, fg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) def test_polygon(self): """polygon(surface, points, color): return None""" fg = self.foreground_color bg = self.background_color points = [(10, 80), (10, 15), (92, 25), (92, 80)] fg_test_points = (points + [(points[0][0], points[0][1] - 1), (points[0][0] + 1, points[0][1]), (points[3][0] - 1, points[3][1]), (points[3][0], points[3][1] - 1), (points[2][0], points[2][1] + 1)]) bg_test_points = [(points[0][0] - 1, points[0][1]), (points[0][0], points[0][1] + 1), (points[0][0] - 1, points[0][1] + 1), (points[0][0] + 1, points[0][1] - 1), (points[3][0] + 1, points[3][1]), (points[3][0], points[3][1] + 1), (points[3][0] + 1, points[3][1] + 1), (points[3][0] - 1, points[3][1] - 1), (points[2][0] + 1, points[2][1]), (points[2][0] - 1, points[2][1] + 1), (points[1][0] - 1, points[1][1]), (points[1][0], points[1][1] - 1), (points[1][0] - 1, points[1][1] - 1)] for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.polygon(surf, points, fg) for posn in fg_test_points: self.check_at(surf, posn, fg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) def test_aapolygon(self): """aapolygon(surface, points, color): return None""" fg = self.foreground_color bg = self.background_color points = [(10, 80), (10, 15), (92, 25), (92, 80)] fg_test_points = (points + [(points[0][0], points[0][1] - 1), (points[0][0] + 1, points[0][1]), (points[3][0] - 1, points[3][1]), (points[3][0], points[3][1] - 1), (points[2][0], points[2][1] + 1)]) bg_test_points = [(points[0][0] - 1, points[0][1]), (points[0][0], points[0][1] + 1), (points[0][0] - 1, points[0][1] + 1), (points[0][0] + 1, points[0][1] - 1), (points[3][0] + 1, points[3][1]), (points[3][0], points[3][1] + 1), (points[3][0] + 1, points[3][1] + 1), (points[3][0] - 1, points[3][1] - 1), (points[2][0] + 1, points[2][1]), (points[2][0] - 1, points[2][1] + 1), (points[1][0] - 1, points[1][1]), (points[1][0], points[1][1] - 1), (points[1][0] - 1, points[1][1] - 1)] for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.aapolygon(surf, points, fg) for posn in fg_test_points: self.check_not_at(surf, posn, bg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) def test_filled_polygon(self): """filled_polygon(surface, points, color): return None""" fg = self.foreground_color bg = self.background_color points = [(10, 80), (10, 15), (92, 25), (92, 80)] fg_test_points = (points + [(points[0][0], points[0][1] - 1), (points[0][0] + 1, points[0][1]), (points[0][0] + 1, points[0][1] - 1), (points[3][0] - 1, points[3][1]), (points[3][0], points[3][1] - 1), (points[3][0] - 1, points[3][1] - 1), (points[2][0], points[2][1] + 1), (points[2][0] - 1, points[2][1] + 1)]) bg_test_points = [(points[0][0] - 1, points[0][1]), (points[0][0], points[0][1] + 1), (points[0][0] - 1, points[0][1] + 1), (points[3][0] + 1, points[3][1]), (points[3][0], points[3][1] + 1), (points[3][0] + 1, points[3][1] + 1), (points[2][0] + 1, points[2][1]), (points[1][0] - 1, points[1][1]), (points[1][0], points[1][1] - 1), (points[1][0] - 1, points[1][1] - 1)] for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.filled_polygon(surf, points, fg) for posn in fg_test_points: self.check_at(surf, posn, fg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) def test_textured_polygon(self): """textured_polygon(surface, points, texture, tx, ty): return None""" w, h = self.default_size fg = self.foreground_color bg = self.background_color tx = 0 ty = 0 texture = pygame.Surface((w + tx, h + ty), 0, 24) texture.fill(fg, (0, 0, w, h)) points = [(10, 80), (10, 15), (92, 25), (92, 80)] # Don't know how to really check this as boarder points may # or may not be included in the textured polygon. fg_test_points = [(points[1][0] + 30, points[1][1] + 40)] bg_test_points = [(points[0][0] - 1, points[0][1]), (points[0][0], points[0][1] + 1), (points[0][0] - 1, points[0][1] + 1), (points[3][0] + 1, points[3][1]), (points[3][0], points[3][1] + 1), (points[3][0] + 1, points[3][1] + 1), (points[2][0] + 1, points[2][1]), (points[1][0] - 1, points[1][1]), (points[1][0], points[1][1] - 1), (points[1][0] - 1, points[1][1] - 1)] for surf in self.surfaces[1:]: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.textured_polygon(surf, points, texture, -tx, -ty) for posn in fg_test_points: self.check_at(surf, posn, fg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) # Alpha blit to 8 bits-per-pixel surface forbidden. texture = pygame.Surface(self.default_size, SRCALPHA, 32) self.failUnlessRaises(ValueError, pygame.gfxdraw.textured_polygon, self.surfaces[0], points, texture, 0, 0) def test_bezier(self): """bezier(surface, points, steps, color): return None""" fg = self.foreground_color bg = self.background_color points = [(10, 50), (25, 15), (60, 80), (92, 30)] fg_test_points = [points[0], points[3]] bg_test_points = [(points[0][0] - 1, points[0][1]), (points[3][0] + 1, points[3][1]), (points[1][0], points[1][1] + 3), (points[2][0], points[2][1] - 3)] for surf in self.surfaces: fg_adjusted = surf.unmap_rgb(surf.map_rgb(fg)) bg_adjusted = surf.unmap_rgb(surf.map_rgb(bg)) pygame.gfxdraw.bezier(surf, points, 30, fg) for posn in fg_test_points: self.check_at(surf, posn, fg_adjusted) for posn in bg_test_points: self.check_at(surf, posn, bg_adjusted) if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/font_test.py0000644000175000017500000003334511210734730017607 0ustar vincentvincentimport sys import os if __name__ == '__main__': pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest, \ geterror else: from test.test_utils import test_not_implemented, unittest, geterror import pygame class FontModuleTest( unittest.TestCase ): def setUp(self): pygame.font.init() def tearDown(self): pygame.font.quit() def test_SysFont(self): # Can only check that a font object is returned. fonts = pygame.font.get_fonts() o = pygame.font.SysFont(fonts[0], 20) self.failUnless(isinstance(o, pygame.font.FontType)) o = pygame.font.SysFont(fonts[0], 20, italic=True) self.failUnless(isinstance(o, pygame.font.FontType)) o = pygame.font.SysFont(fonts[0], 20, bold=True) self.failUnless(isinstance(o, pygame.font.FontType)) o = pygame.font.SysFont('thisisnotafont', 20) self.failUnless(isinstance(o, pygame.font.FontType)) def test_get_default_font(self): self.failUnlessEqual(pygame.font.get_default_font(), 'freesansbold.ttf') def test_get_fonts_returns_something(self): fnts = pygame.font.get_fonts() self.failUnless(fnts) def test_get_fonts(self): fnts = pygame.font.get_fonts() if not fnts: raise Exception(repr(fnts)) self.failUnless(fnts) # strange python 2.x bug... if you assign to unicode, # all sorts of weirdness happens. if sys.version_info <= (3, 0, 0): unicod = unicode else: unicod = str for name in fnts: # note, on ubuntu 2.6 they are all unicode strings. self.failUnless(isinstance(name, (str, unicod))) self.failUnless(name.islower(), name) self.failUnless(name.isalnum(), name) def test_get_init(self): self.failUnless(pygame.font.get_init()) pygame.font.quit() self.failIf(pygame.font.get_init()) def test_init(self): pygame.font.init() def test_match_font_all_exist(self): fonts = pygame.font.get_fonts() # Ensure all listed fonts are in fact available, and the returned file # name is a full path. for font in fonts: path = pygame.font.match_font(font) self.failIf(path is None) self.failUnless(os.path.isabs(path)) def test_match_font_bold(self): fonts = pygame.font.get_fonts() # Look for a bold font. for font in fonts: if pygame.font.match_font(font, bold=True) is not None: break else: self.fail() def test_match_font_italic(self): fonts = pygame.font.get_fonts() # Look for an italic font. for font in fonts: if pygame.font.match_font(font, italic=True) is not None: break else: self.fail() def test_match_font_comma_separated(self): fonts = pygame.font.get_fonts() # Check for not found. self.failUnless(pygame.font.match_font('thisisnotafont') is None) # Check comma separated list. names = ','.join(['thisisnotafont', fonts[-1], 'anothernonfont']) self.failIf(pygame.font.match_font(names) is None) names = ','.join(['thisisnotafont1', 'thisisnotafont2', 'thisisnotafont3']) self.failUnless(pygame.font.match_font(names) is None) def test_quit(self): pygame.font.quit() class FontTypeTest( unittest.TestCase ): def setUp(self): pygame.font.init() def tearDown(self): pygame.font.quit() def test_get_ascent(self): # Ckecking ascent would need a custom test font to do properly. f = pygame.font.Font(None, 20) ascent = f.get_ascent() self.failUnless(isinstance(ascent, int)) self.failUnless(ascent > 0) s = f.render("X", False, (255, 255, 255)) self.failUnless(s.get_size()[1] > ascent) def test_get_descent(self): # Ckecking descent would need a custom test font to do properly. f = pygame.font.Font(None, 20) descent = f.get_descent() self.failUnless(isinstance(descent, int)) self.failUnless(descent < 0) def test_get_height(self): # Ckecking height would need a custom test font to do properly. f = pygame.font.Font(None, 20) height = f.get_height() self.failUnless(isinstance(height, int)) self.failUnless(height > 0) s = f.render("X", False, (255, 255, 255)) self.failUnless(s.get_size()[1] == height) def test_get_linesize(self): # Ckecking linesize would need a custom test font to do properly. # Questions: How do linesize, height and descent relate? f = pygame.font.Font(None, 20) linesize = f.get_linesize() self.failUnless(isinstance(linesize, int)) self.failUnless(linesize > 0) def todo_test_metrics(self): # The documentation is useless here. How large a list? # How do list positions relate to character codes? # What about unicode characters? # __doc__ (as of 2008-08-02) for pygame.font.Font.metrics: # Font.metrics(text): return list # Gets the metrics for each character in the pased string. # # The list contains tuples for each character, which contain the # minimum X offset, the maximum X offset, the minimum Y offset, the # maximum Y offset and the advance offset (bearing plus width) of the # character. [(minx, maxx, miny, maxy, advance), (minx, maxx, miny, # maxy, advance), ...] self.fail() def test_render(self): """ """ f = pygame.font.Font(None, 20) s = f.render("foo", True, [0, 0, 0], [255, 255, 255]) s = f.render("xxx", True, [0, 0, 0], [255, 255, 255]) s = f.render("", True, [0, 0, 0], [255, 255, 255]) s = f.render("foo", False, [0, 0, 0], [255, 255, 255]) s = f.render("xxx", False, [0, 0, 0], [255, 255, 255]) s = f.render("xxx", False, [0, 0, 0]) s = f.render(" ", False, [0, 0, 0]) s = f.render(" ", False, [0, 0, 0], [255, 255, 255]) # null text should be 1 pixel wide. s = f.render("", False, [0, 0, 0], [255, 255, 255]) self.assertEqual(s.get_size()[0], 1) # is background transparent for antialiasing? s = f.render(".", True, [255, 255, 255]) self.failUnlessEqual(s.get_at((0, 0))[3], 0) # __doc__ (as of 2008-08-02) for pygame.font.Font.render: # Font.render(text, antialias, color, background=None): return Surface # draw text on a new Surface # # This creates a new Surface with the specified text rendered on it. # Pygame provides no way to directly draw text on an existing Surface: # instead you must use Font.render() to create an image (Surface) of # the text, then blit this image onto another Surface. # # The text can only be a single line: newline characters are not # rendered. The antialias argument is a boolean: if true the # characters will have smooth edges. The color argument is the color # of the text [e.g.: (0,0,255) for blue]. The optional background # argument is a color to use for the text background. If no background # is passed the area outside the text will be transparent. # # The Surface returned will be of the dimensions required to hold the # text. (the same as those returned by Font.size()). If an empty # string is passed for the text, a blank surface will be returned that # is one pixel wide and the height of the font. # # Depending on the type of background and antialiasing used, this # returns different types of Surfaces. For performance reasons, it is # good to know what type of image will be used. If antialiasing is not # used, the return image will always be an 8bit image with a two color # palette. If the background is transparent a colorkey will be set. # Antialiased images are rendered to 24-bit RGB images. If the # background is transparent a pixel alpha will be included. # # Optimization: if you know that the final destination for the text # (on the screen) will always have a solid background, and the text is # antialiased, you can improve performance by specifying the # background color. This will cause the resulting image to maintain # transparency information by colorkey rather than (much less # efficient) alpha values. # # If you render '\n' a unknown char will be rendered. Usually a # rectangle. Instead you need to handle new lines yourself. # # Font rendering is not thread safe: only a single thread can render # text any time. def test_set_bold(self): f = pygame.font.Font(None, 20) self.failIf(f.get_bold()) f.set_bold(True) self.failUnless(f.get_bold()) f.set_bold(False) self.failIf(f.get_bold()) def test_set_italic(self): f = pygame.font.Font(None, 20) self.failIf(f.get_italic()) f.set_italic(True) self.failUnless(f.get_italic()) f.set_italic(False) self.failIf(f.get_bold()) def test_set_underline(self): f = pygame.font.Font(None, 20) self.failIf(f.get_underline()) f.set_underline(True) self.failUnless(f.get_underline()) f.set_underline(False) self.failIf(f.get_underline()) def test_size(self): f = pygame.font.Font(None, 20) text = "Xg" size = f.size(text) w, h = size self.failUnless(isinstance(w, int) and isinstance(h, int)) s = f.render(text, False, (255, 255, 255)) self.failUnlessEqual(size, s.get_size()) def test_font_file_not_found(self): # A per BUG reported by Bo Jangeborg on pygame-user mailing list, # http://www.mail-archive.com/pygame-users@seul.org/msg11675.html pygame.font.init() def fetch(): font = pygame.font.Font('some-fictional-font.ttf', 20) self.failUnlessRaises(IOError, fetch) class VisualTests( unittest.TestCase ): __tags__ = ['interactive'] screen = None aborted = False def setUp(self): if self.screen is None: pygame.init() self.screen = pygame.display.set_mode((600, 200)) self.screen.fill((255, 255, 255)) pygame.display.flip() self.f = pygame.font.Font(None, 32) def abort(self): if self.screen is not None: pygame.quit() self.aborted = True def query(self, bold=False, italic=False, underline=False, antialiase=False): if self.aborted: return False spacing = 10 offset = 20 y = spacing f = self.f screen = self.screen screen.fill((255, 255, 255)) pygame.display.flip() if not (bold or italic or underline or antialiase): text = "normal" else: modes = [] if bold: modes.append("bold") if italic: modes.append("italic") if underline: modes.append("underlined") if antialiase: modes.append("antialiased") text = "%s (y/n):" % ('-'.join(modes),) f.set_bold(bold) f.set_italic(italic) f.set_underline(underline) s = f.render(text, antialiase, (0, 0, 0)) screen.blit(s, (offset, y)) y += s.get_size()[1] + spacing f.set_bold(False) f.set_italic(False) f.set_underline(False) s = f.render("(some comparison text)", False, (0, 0, 0)) screen.blit(s, (offset, y)) pygame.display.flip() while 1: for evt in pygame.event.get(): if evt.type == pygame.KEYDOWN: if evt.key == pygame.K_ESCAPE: self.abort() return False if evt.key == pygame.K_y: return True if evt.key == pygame.K_n: return False if evt.type == pygame.QUIT: self.abort() return False def test_bold(self): self.failUnless(self.query(bold=True)) def test_italic(self): self.failUnless(self.query(italic=True)) def test_underline(self): self.failUnless(self.query(underline=True)) def test_antialiase(self): self.failUnless(self.query(antialiase=True)) def test_bold_antialiase(self): self.failUnless(self.query(bold=True, antialiase=True)) def test_italic_underline(self): self.failUnless(self.query(italic=True, underline=True)) if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/fastevent_test.py0000644000175000017500000001314011207055754020637 0ustar vincentvincent#################################### IMPORTS ################################### if __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest from pygame.tests.event_test import race_condition_notification else: from test.test_utils import test_not_implemented, unittest from test.event_test import race_condition_notification import pygame from pygame import event, fastevent from pygame.compat import geterror ################################################################################ class FasteventModuleTest(unittest.TestCase): def setUp(self): pygame.display.init() fastevent.init() event.clear() self.assert_(not event.get()) def tearDown(self): pygame.display.quit() def test_get(self): # __doc__ (as of 2008-08-02) for pygame.fastevent.get: # pygame.fastevent.get() -> list of Events # get all events from the queue for _ in range(1, 11): event.post(event.Event(pygame.USEREVENT)) self.assertEquals ( [e.type for e in fastevent.get()], [pygame.USEREVENT] * 10, race_condition_notification ) def todo_test_init(self): # __doc__ (as of 2008-08-02) for pygame.fastevent.init: # pygame.fastevent.init() -> None # initialize pygame.fastevent. self.fail() def test_poll(self): # __doc__ (as of 2008-08-02) for pygame.fastevent.poll: # pygame.fastevent.poll() -> Event # get an available event # # Returns next event on queue. If there is no event waiting on the # queue, this will return an event with type NOEVENT. self.assertEquals ( fastevent.poll().type, pygame.NOEVENT, race_condition_notification ) def test_post(self): # __doc__ (as of 2008-08-02) for pygame.fastevent.post: # pygame.fastevent.post(Event) -> None # place an event on the queue # # This will post your own event objects onto the event queue. # You can past any event type you want, but some care must be # taken. For example, if you post a MOUSEBUTTONDOWN event to the # queue, it is likely any code receiving the event will expect # the standard MOUSEBUTTONDOWN attributes to be available, like # 'pos' and 'button'. # # Because pygame.fastevent.post() may have to wait for the queue # to empty, you can get into a dead lock if you try to append an # event on to a full queue from the thread that processes events. # For that reason I do not recommend using this function in the # main thread of an SDL program. for _ in range(1, 11): fastevent.post(event.Event(pygame.USEREVENT)) self.assertEquals ( [e.type for e in event.get()], [pygame.USEREVENT] * 10, race_condition_notification ) try: # Special case for post: METH_O. fastevent.post(1) except TypeError: e = geterror() msg = ("argument 1 must be %s, not %s" % (fastevent.Event.__name__, type(1).__name__)) self.failUnlessEqual(str(e), msg) else: self.fail() def todo_test_pump(self): # __doc__ (as of 2008-08-02) for pygame.fastevent.pump: # pygame.fastevent.pump() -> None # update the internal messages # # For each frame of your game, you will need to make some sort # of call to the event queue. This ensures your program can internally # interact with the rest of the operating system. If you are not using # other event functions in your game, you should call pump() to allow # pygame to handle internal actions. # # There are important things that must be dealt with internally in the # event queue. The main window may need to be repainted. Certain joysticks # must be polled for their values. If you fail to make a call to the event # queue for too long, the system may decide your program has locked up. self.fail() def test_wait(self): # __doc__ (as of 2008-08-02) for pygame.fastevent.wait: # pygame.fastevent.wait() -> Event # wait for an event # # Returns the current event on the queue. If there are no messages # waiting on the queue, this will not return until one is # available. Sometimes it is important to use this wait to get # events from the queue, it will allow your application to idle # when the user isn't doing anything with it. event.post(pygame.event.Event(1)) self.assertEquals(fastevent.wait().type, 1, race_condition_notification) ################################################################################ if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/event_test.py0000644000175000017500000002123511207055754017765 0ustar vincentvincent#################################### IMPORTS ################################### if __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest else: from test.test_utils import test_not_implemented, unittest import pygame ################################################################################ class EventTypeTest(unittest.TestCase): def test_Event(self): # __doc__ (as of 2008-08-02) for pygame.event.Event: # pygame.event.Event(type, dict): return Event # pygame.event.Event(type, **attributes): return Event # create a new event object # # Creates a new event with the given type. The event is created with # the given attributes and values. The attributes can come from a # dictionary argument, or as string keys from a dictionary. # # The given attributes will be readonly attributes on the new event # object itself. These are the only attributes on the Event object, # there are no methods attached to Event objects. e = pygame.event.Event(pygame.USEREVENT, some_attr=1, other_attr='1') self.assertEquals(e.some_attr, 1) self.assertEquals(e.other_attr, "1") race_condition_notification = """ This test is dependent on timing. The event queue is cleared in preparation for tests. There is a small window where outside events from the OS may have effected results. Try running the test again. """ class EventModuleTest(unittest.TestCase): def setUp(self): # flush events pygame.display.init() pygame.event.clear() self.assert_(not pygame.event.get()) def tearDown(self): pygame.display.quit() def test_set_blocked(self): # __doc__ (as of 2008-06-25) for pygame.event.set_blocked: # pygame.event.set_blocked(type): return None # pygame.event.set_blocked(typelist): return None # pygame.event.set_blocked(None): return None # control which events are allowed on the queue pygame.event.set_blocked(2) self.assert_(pygame.event.get_blocked(2)) pygame.event.post(pygame.event.Event(2)) events = pygame.event.get() should_be_blocked = [e for e in events if e.type == 2] self.assertEquals(should_be_blocked, []) def test_post__and_poll(self): # __doc__ (as of 2008-06-25) for pygame.event.post: # pygame.event.post(Event): return None # place a new event on the queue e1 = pygame.event.Event(pygame.USEREVENT, attr1='attr1') pygame.event.post(e1) posted_event = pygame.event.poll() self.assertEquals ( e1.attr1, posted_event.attr1, race_condition_notification ) # fuzzing event types for i in range(1, 11): pygame.event.post(pygame.event.Event(i)) self.assertEquals ( pygame.event.poll().type, i, race_condition_notification ) def test_get(self): # __doc__ (as of 2008-06-25) for pygame.event.get: # pygame.event.get(): return Eventlist # pygame.event.get(type): return Eventlist # pygame.event.get(typelist): return Eventlist # get events from the queue # Put 10 events on the queue for _ in range(1, 11): pygame.event.post(pygame.event.Event(pygame.USEREVENT)) self.assert_ ( len(pygame.event.get()) >= 10 ) def test_clear(self): # __doc__ (as of 2008-06-25) for pygame.event.clear: # pygame.event.clear(): return None # pygame.event.clear(type): return None # pygame.event.clear(typelist): return None # remove all events from the queue for _ in range(1, 11): pygame.event.post(pygame.event.Event(_)) self.assert_(pygame.event.poll()) # there are some events on queue pygame.event.clear() self.assert_(not pygame.event.poll(), race_condition_notification) def test_event_name(self): # __doc__ (as of 2008-06-25) for pygame.event.event_name: # pygame.event.event_name(type): return string # get the string name from and event id self.assertEquals(pygame.event.event_name(2), "KeyDown") self.assertEquals(pygame.event.event_name(24), "UserEvent") def test_wait(self): # __doc__ (as of 2008-06-25) for pygame.event.wait: # pygame.event.wait(): return Event # wait for a single event from the queue pygame.event.post ( pygame.event.Event(2) ) self.assert_(pygame.event.wait()) def test_peek(self): # __doc__ (as of 2008-06-25) for pygame.event.peek: # pygame.event.peek(type): return bool # pygame.event.peek(typelist): return bool # test if event types are waiting on the queue event_types = [2, 3, 4] for event_type in event_types: pygame.event.post ( pygame.event.Event(event_type) ) self.assert_(pygame.event.peek(event_type)) self.assert_(pygame.event.peek(event_types)) def test_set_allowed(self): # __doc__ (as of 2008-06-25) for pygame.event.set_allowed: # pygame.event.set_allowed(type): return None # pygame.event.set_allowed(typelist): return None # pygame.event.set_allowed(None): return None # control which events are allowed on the queue pygame.event.set_blocked(2) self.assert_(pygame.event.get_blocked(2)) pygame.event.set_allowed(2) self.assert_(not pygame.event.get_blocked(2)) def test_pump(self): # __doc__ (as of 2008-06-25) for pygame.event.pump: # pygame.event.pump(): return None # internally process pygame event handlers # see it doesn't cause an error pygame.event.pump() def test_set_grab__and_get_symmetric(self): # __doc__ (as of 2008-06-25) for pygame.event.set_grab: # pygame.event.set_grab(bool): return None # control the sharing of input devices with other applications pygame.event.set_grab(True) self.assert_(pygame.event.get_grab()) pygame.event.set_grab(False) self.assert_(not pygame.event.get_grab()) def test_event_equality(self): a = pygame.event.Event(1, a=1) b = pygame.event.Event(1, a=1) c = pygame.event.Event(2, a=1) d = pygame.event.Event(1, a=2) self.failUnless(a == a) self.failIf(a != a) self.failUnless(a == b) self.failIf(a != b) self.failUnless(a != c) self.failIf(a == c) self.failUnless(a != d) self.failIf(a == d) def todo_test_get_blocked(self): # __doc__ (as of 2008-08-02) for pygame.event.get_blocked: # pygame.event.get_blocked(type): return bool # test if a type of event is blocked from the queue # # Returns true if the given event type is blocked from the queue. self.fail() def todo_test_get_grab(self): # __doc__ (as of 2008-08-02) for pygame.event.get_grab: # pygame.event.get_grab(): return bool # test if the program is sharing input devices # # Returns true when the input events are grabbed for this application. # Use pygame.event.set_grab() to control this state. # self.fail() def todo_test_poll(self): # __doc__ (as of 2008-08-02) for pygame.event.poll: # pygame.event.poll(): return Event # get a single event from the queue # # Returns a single event from the queue. If the event queue is empty # an event of type pygame.NOEVENT will be returned immediately. The # returned event is removed from the queue. # self.fail() ################################################################################ if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/draw_test.py0000644000175000017500000001752711207055754017612 0ustar vincentvincent#################################### IMPORTS ################################### if __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils \ import test_not_implemented, unordered_equality, unittest else: from test import test_utils from test.test_utils \ import test_not_implemented, unordered_equality, unittest import pygame from pygame import draw ################################################################################ class DrawModuleTest(unittest.TestCase): def setUp(self): (self.surf_w, self.surf_h) = self.surf_size = (320, 200) self.surf = pygame.Surface(self.surf_size, pygame.SRCALPHA) self.color = (1, 13, 24, 205) def test_rect__fill(self): # __doc__ (as of 2008-06-25) for pygame.draw.rect: # pygame.draw.rect(Surface, color, Rect, width=0): return Rect # draw a rectangle shape rect = pygame.Rect(10, 10, 25, 20) drawn = draw.rect(self.surf, self.color, rect, 0) self.assert_(drawn == rect) #Should be colored where it's supposed to be for pt in test_utils.rect_area_pts(rect): color_at_pt = self.surf.get_at(pt) self.assert_(color_at_pt == self.color) #And not where it shouldn't for pt in test_utils.rect_outer_bounds(rect): color_at_pt = self.surf.get_at(pt) self.assert_(color_at_pt != self.color) def test_rect__one_pixel_lines(self): # __doc__ (as of 2008-06-25) for pygame.draw.rect: # pygame.draw.rect(Surface, color, Rect, width=0): return Rect # draw a rectangle shape rect = pygame.Rect(10, 10, 56, 20) drawn = draw.rect(self.surf, self.color, rect, 1) self.assert_(drawn == rect) #Should be colored where it's supposed to be for pt in test_utils.rect_perimeter_pts(drawn): color_at_pt = self.surf.get_at(pt) self.assert_(color_at_pt == self.color) #And not where it shouldn't for pt in test_utils.rect_outer_bounds(drawn): color_at_pt = self.surf.get_at(pt) self.assert_(color_at_pt != self.color) def test_line(self): # __doc__ (as of 2008-06-25) for pygame.draw.line: # pygame.draw.line(Surface, color, start_pos, end_pos, width=1): return Rect # draw a straight line segment drawn = draw.line(self.surf, self.color, (1, 0), (200, 0)) #(l, t), (l, t) self.assert_(drawn.right == 201, "end point arg should be (or at least was) inclusive" ) #Should be colored where it's supposed to be for pt in test_utils.rect_area_pts(drawn): self.assert_(self.surf.get_at(pt) == self.color) #And not where it shouldn't for pt in test_utils.rect_outer_bounds(drawn): self.assert_(self.surf.get_at(pt) != self.color) def todo_test_aaline(self): # __doc__ (as of 2008-08-02) for pygame.draw.aaline: # pygame.draw.aaline(Surface, color, startpos, endpos, blend=1): return Rect # draw fine antialiased lines # # Draws an anti-aliased line on a surface. This will respect the # clipping rectangle. A bounding box of the affected area is returned # returned as a rectangle. If blend is true, the shades will be be # blended with existing pixel shades instead of overwriting them. This # function accepts floating point values for the end points. # self.fail() def todo_test_aalines(self): # __doc__ (as of 2008-08-02) for pygame.draw.aalines: # pygame.draw.aalines(Surface, color, closed, pointlist, blend=1): return Rect # # Draws a sequence on a surface. You must pass at least two points in # the sequence of points. The closed argument is a simple boolean and # if true, a line will be draw between the first and last points. The # boolean blend argument set to true will blend the shades with # existing shades instead of overwriting them. This function accepts # floating point values for the end points. # self.fail() def todo_test_arc(self): # __doc__ (as of 2008-08-02) for pygame.draw.arc: # pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, # width=1): return Rect # # draw a partial section of an ellipse # # Draws an elliptical arc on the Surface. The rect argument is the # area that the ellipse will fill. The two angle arguments are the # initial and final angle in radians, with the zero on the right. The # width argument is the thickness to draw the outer edge. # self.fail() def todo_test_circle(self): # __doc__ (as of 2008-08-02) for pygame.draw.circle: # pygame.draw.circle(Surface, color, pos, radius, width=0): return Rect # draw a circle around a point # # Draws a circular shape on the Surface. The pos argument is the # center of the circle, and radius is the size. The width argument is # the thickness to draw the outer edge. If width is zero then the # circle will be filled. # self.fail() def todo_test_ellipse(self): # __doc__ (as of 2008-08-02) for pygame.draw.ellipse: # pygame.draw.ellipse(Surface, color, Rect, width=0): return Rect # draw a round shape inside a rectangle # # Draws an elliptical shape on the Surface. The given rectangle is the # area that the circle will fill. The width argument is the thickness # to draw the outer edge. If width is zero then the ellipse will be # filled. # self.fail() def todo_test_lines(self): # __doc__ (as of 2008-08-02) for pygame.draw.lines: # pygame.draw.lines(Surface, color, closed, pointlist, width=1): return Rect # draw multiple contiguous line segments # # Draw a sequence of lines on a Surface. The pointlist argument is a # series of points that are connected by a line. If the closed # argument is true an additional line segment is drawn between the # first and last points. # # This does not draw any endcaps or miter joints. Lines with sharp # corners and wide line widths can have improper looking corners. # self.fail() def todo_test_polygon(self): # __doc__ (as of 2008-08-02) for pygame.draw.polygon: # pygame.draw.polygon(Surface, color, pointlist, width=0): return Rect # draw a shape with any number of sides # # Draws a polygonal shape on the Surface. The pointlist argument is # the vertices of the polygon. The width argument is the thickness to # draw the outer edge. If width is zero then the polygon will be # filled. # # For aapolygon, use aalines with the 'closed' parameter. self.fail() ################################################################################ if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/display_test.py0000644000175000017500000005242211207055754020313 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest else: from test.test_utils import test_not_implemented, unittest import pygame, pygame.transform class DisplayModuleTest( unittest.TestCase ): def test_update( self ): """ see if pygame.display.update takes rects with negative values. "|Tags:display|" """ if 1: pygame.init() screen = pygame.display.set_mode((100,100)) screen.fill((55,55,55)) r1 = pygame.Rect(0,0,100,100) pygame.display.update(r1) r2 = pygame.Rect(-10,0,100,100) pygame.display.update(r2) r3 = pygame.Rect(-10,0,-100,-100) pygame.display.update(r3) # NOTE: if I don't call pygame.quit there is a segfault. hrmm. pygame.quit() # I think it's because unittest runs stuff in threads # here's a stack trace... # NOTE to author of above: # unittest doesn't run tests in threads # segfault was probably caused by another tests need # for a "clean slate" """ #0 0x08103b7c in PyFrame_New () #1 0x080bd666 in PyEval_EvalCodeEx () #2 0x08105202 in PyFunction_SetClosure () #3 0x080595ae in PyObject_Call () #4 0x080b649f in PyEval_CallObjectWithKeywords () #5 0x08059585 in PyObject_CallObject () #6 0xb7f7aa2d in initbase () from /usr/lib/python2.4/site-packages/pygame/base.so #7 0x080e09bd in Py_Finalize () #8 0x08055597 in Py_Main () #9 0xb7e04eb0 in __libc_start_main () from /lib/tls/libc.so.6 #10 0x08054e31 in _start () """ def todo_test_Info(self): # __doc__ (as of 2008-08-02) for pygame.display.Info: # pygame.display.Info(): return VideoInfo # Create a video display information object # # Creates a simple object containing several attributes to describe # the current graphics environment. If this is called before # pygame.display.set_mode() some platforms can provide information # about the default display mode. This can also be called after # setting the display mode to verify specific display options were # satisfied. The VidInfo object has several attributes: # # hw: True if the display is hardware accelerated # wm: True if windowed display modes can be used # video_mem: The megabytes of video memory on the display. This is 0 if unknown # bitsize: Number of bits used to store each pixel # bytesize: Number of bytes used to store each pixel # masks: Four values used to pack RGBA values into pixels # shifts: Four values used to pack RGBA values into pixels # losses: Four values used to pack RGBA values into pixels # blit_hw: True if hardware Surface blitting is accelerated # blit_hw_CC: True if hardware Surface colorkey blitting is accelerated # blit_hw_A: True if hardware Surface pixel alpha blitting is accelerated # blit_sw: True if software Surface blitting is accelerated # blit_sw_CC: True if software Surface colorkey blitting is accelerated # blit_sw_A: True if software Surface pixel alpha blitting is acclerated # current_h, current_h: Width and height of the current video mode, or of the # desktop mode if called before the display.set_mode is called. # (current_h, current_w are available since SDL 1.2.10, and pygame 1.8.0) # They are -1 on error, or if an old SDL is being used. self.fail() if 0: pygame.init() inf = pygame.display.Info() print ("before a display mode has been set") print (inf) self.assertNotEqual(inf.current_h, -1) self.assertNotEqual(inf.current_w, -1) #probably have an older SDL than 1.2.10 if -1. screen = pygame.display.set_mode((100,100)) inf = pygame.display.Info() print (inf) self.assertNotEqual(inf.current_h, -1) self.assertEqual(inf.current_h, 100) self.assertEqual(inf.current_w, 100) #pygame.quit() def todo_test_flip(self): # __doc__ (as of 2008-08-02) for pygame.display.flip: # pygame.display.flip(): return None # update the full display Surface to the screen # # This will update the contents of the entire display. If your display # mode is using the flags pygame.HWSURFACE and pygame.DOUBLEBUF, this # will wait for a vertical retrace and swap the surfaces. If you are # using a different type of display mode, it will simply update the # entire contents of the surface. # # When using an pygame.OPENGL display mode this will perform a gl buffer swap. self.fail() def todo_test_get_active(self): # __doc__ (as of 2008-08-02) for pygame.display.get_active: # pygame.display.get_active(): return bool # true when the display is active on the display # # After pygame.display.set_mode() is called the display Surface will # be visible on the screen. Most windowed displays can be hidden by # the user. If the display Surface is hidden or iconified this will # return False. # self.fail() def todo_test_get_caption(self): # __doc__ (as of 2008-08-02) for pygame.display.get_caption: # pygame.display.get_caption(): return (title, icontitle) # get the current window caption # # Returns the title and icontitle for the display Surface. These will # often be the same value. # self.fail() def todo_test_get_driver(self): # __doc__ (as of 2008-08-02) for pygame.display.get_driver: # pygame.display.get_driver(): return name # get the name of the pygame display backend # # Pygame chooses one of many available display backends when it is # initialized. This returns the internal name used for the display # backend. This can be used to provide limited information about what # display capabilities might be accelerated. See the SDL_VIDEODRIVER # flags in pygame.display.set_mode() to see some of the common # options. # self.fail() def todo_test_get_init(self): # __doc__ (as of 2008-08-02) for pygame.display.get_init: # pygame.display.get_init(): return bool # true if the display module is initialized # # Returns True if the pygame.display module is currently initialized. self.fail() def todo_test_get_surface(self): # __doc__ (as of 2008-08-02) for pygame.display.get_surface: # pygame.display.get_surface(): return Surface # get a reference to the currently set display surface # # Return a reference to the currently set display Surface. If no # display mode has been set this will return None. # self.fail() def todo_test_get_wm_info(self): # __doc__ (as of 2008-08-02) for pygame.display.get_wm_info: # pygame.display.get_wm_info(): return dict # Get information about the current windowing system # # Creates a dictionary filled with string keys. The strings and values # are arbitrarily created by the system. Some systems may have no # information and an empty dictionary will be returned. Most platforms # will return a "window" key with the value set to the system id for # the current display. # # New with pygame 1.7.1 self.fail() def todo_test_gl_get_attribute(self): # __doc__ (as of 2008-08-02) for pygame.display.gl_get_attribute: # pygame.display.gl_get_attribute(flag): return value # get the value for an opengl flag for the current display # # After calling pygame.display.set_mode() with the pygame.OPENGL flag, # it is a good idea to check the value of any requested OpenGL # attributes. See pygame.display.gl_set_attribute() for a list of # valid flags. # self.fail() def todo_test_gl_set_attribute(self): # __doc__ (as of 2008-08-02) for pygame.display.gl_set_attribute: # pygame.display.gl_set_attribute(flag, value): return None # request an opengl display attribute for the display mode # # When calling pygame.display.set_mode() with the pygame.OPENGL flag, # Pygame automatically handles setting the OpenGL attributes like # color and doublebuffering. OpenGL offers several other attributes # you may want control over. Pass one of these attributes as the flag, # and its appropriate value. This must be called before # pygame.display.set_mode() # # The OPENGL flags are; # GL_ALPHA_SIZE, GL_DEPTH_SIZE, GL_STENCIL_SIZE, GL_ACCUM_RED_SIZE, # GL_ACCUM_GREEN_SIZE, GL_ACCUM_BLUE_SIZE, GL_ACCUM_ALPHA_SIZE, # GL_MULTISAMPLEBUFFERS, GL_MULTISAMPLESAMPLES, GL_STEREO self.fail() def todo_test_iconify(self): # __doc__ (as of 2008-08-02) for pygame.display.iconify: # pygame.display.iconify(): return bool # iconify the display surface # # Request the window for the display surface be iconified or hidden. # Not all systems and displays support an iconified display. The # function will return True if successfull. # # When the display is iconified pygame.display.get_active() will # return False. The event queue should receive a ACTIVEEVENT event # when the window has been iconified. # self.fail() def todo_test_init(self): # __doc__ (as of 2008-08-02) for pygame.display.init: # pygame.display.init(): return None # initialize the display module # # Initializes the pygame display module. The display module cannot do # anything until it is initialized. This is usually handled for you # automatically when you call the higher level pygame.init(). # # Pygame will select from one of several internal display backends # when it is initialized. The display mode will be chosen depending on # the platform and permissions of current user. Before the display # module is initialized the environment variable SDL_VIDEODRIVER can # be set to control which backend is used. The systems with multiple # choices are listed here. # # Windows : windib, directx # Unix : x11, dga, fbcon, directfb, ggi, vgl, svgalib, aalib # On some platforms it is possible to embed the pygame display into an # already existing window. To do this, the environment variable # SDL_WINDOWID must be set to a string containing the window id or # handle. The environment variable is checked when the pygame display # is initialized. Be aware that there can be many strange side effects # when running in an embedded display. # # It is harmless to call this more than once, repeated calls have no effect. self.fail() def todo_test_list_modes(self): # __doc__ (as of 2008-08-02) for pygame.display.list_modes: # pygame.display.list_modes(depth=0, flags=pygame.FULLSCREEN): return list # get list of available fullscreen modes # # This function returns a list of possible dimensions for a specified # color depth. The return value will be an empty list if no display # modes are available with the given arguments. A return value of -1 # means that any requested resolution should work (this is likely the # case for windowed modes). Mode sizes are sorted from biggest to # smallest. # # If depth is 0, SDL will choose the current/best color depth for the # display. The flags defaults to pygame.FULLSCREEN, but you may need # to add additional flags for specific fullscreen modes. # self.fail() def todo_test_mode_ok(self): # __doc__ (as of 2008-08-02) for pygame.display.mode_ok: # pygame.display.mode_ok(size, flags=0, depth=0): return depth # pick the best color depth for a display mode # # This function uses the same arguments as pygame.display.set_mode(). # It is used to depermine if a requested display mode is available. It # will return 0 if the display mode cannot be set. Otherwise it will # return a pixel depth that best matches the display asked for. # # Usually the depth argument is not passed, but some platforms can # support multiple display depths. If passed it will hint to which # depth is a better match. # # The most useful flags to pass will be pygame.HWSURFACE, # pygame.DOUBLEBUF, and maybe pygame.FULLSCREEN. The function will # return 0 if these display flags cannot be set. # self.fail() def todo_test_quit(self): # __doc__ (as of 2008-08-02) for pygame.display.quit: # pygame.display.quit(): return None # uninitialize the display module # # This will shut down the entire display module. This means any active # displays will be closed. This will also be handled automatically # when the program exits. # # It is harmless to call this more than once, repeated calls have no effect. self.fail() def todo_test_set_caption(self): # __doc__ (as of 2008-08-02) for pygame.display.set_caption: # pygame.display.set_caption(title, icontitle=None): return None # set the current window caption # # If the display has a window title, this function will change the # name on the window. Some systems support an alternate shorter title # to be used for minimized displays. # self.fail() def todo_test_set_gamma(self): # __doc__ (as of 2008-08-02) for pygame.display.set_gamma: # pygame.display.set_gamma(red, green=None, blue=None): return bool # change the hardware gamma ramps # # Set the red, green, and blue gamma values on the display hardware. # If the green and blue arguments are not passed, they will both be # the same as red. Not all systems and hardware support gamma ramps, # if the function succeeds it will return True. # # A gamma value of 1.0 creates a linear color table. Lower values will # darken the display and higher values will brighten. # self.fail() def todo_test_set_gamma_ramp(self): # __doc__ (as of 2008-08-02) for pygame.display.set_gamma_ramp: # change the hardware gamma ramps with a custom lookup # pygame.display.set_gamma_ramp(red, green, blue): return bool # set_gamma_ramp(red, green, blue): return bool # # Set the red, green, and blue gamma ramps with an explicit lookup # table. Each argument should be sequence of 256 integers. The # integers should range between 0 and 0xffff. Not all systems and # hardware support gamma ramps, if the function succeeds it will # return True. # self.fail() def todo_test_set_icon(self): # __doc__ (as of 2008-08-02) for pygame.display.set_icon: # pygame.display.set_icon(Surface): return None # change the system image for the display window # # Sets the runtime icon the system will use to represent the display # window. All windows default to a simple pygame logo for the window # icon. # # You can pass any surface, but most systems want a smaller image # around 32x32. The image can have colorkey transparency which will be # passed to the system. # # Some systems do not allow the window icon to change after it has # been shown. This function can be called before # pygame.display.set_mode() to create the icon before the display mode # is set. # self.fail() def todo_test_set_mode(self): # __doc__ (as of 2008-08-02) for pygame.display.set_mode: # pygame.display.set_mode(resolution=(0,0), flags=0, depth=0): return Surface # initialize a window or screen for display # # This function will create a display Surface. The arguments passed in # are requests for a display type. The actual created display will be # the best possible match supported by the system. # # The resolution argument is a pair of numbers representing the width # and height. The flags argument is a collection of additional # options. The depth argument represents the number of bits to use # for color. # # The Surface that gets returned can be drawn to like a regular # Surface but changes will eventually be seen on the monitor. # # If no resolution is passed or is set to (0, 0) and pygame uses SDL # version 1.2.10 or above, the created Surface will have the same size # as the current screen resolution. If only the width or height are # set to 0, the Surface will have the same width or height as the # screen resolution. Using a SDL version prior to 1.2.10 will raise an # exception. # # It is usually best to not pass the depth argument. It will default # to the best and fastest color depth for the system. If your game # requires a specific color format you can control the depth with this # argument. Pygame will emulate an unavailable color depth which can # be slow. # # When requesting fullscreen display modes, sometimes an exact match # for the requested resolution cannot be made. In these situations # pygame will select the closest compatable match. The returned # surface will still always match the requested resolution. # # The flags argument controls which type of display you want. There # are several to choose from, and you can even combine multiple types # using the bitwise or operator, (the pipe "|" character). If you pass # 0 or no flags argument it will default to a software driven window. # Here are the display flags you will want to choose from: # # pygame.FULLSCREEN create a fullscreen display # pygame.DOUBLEBUF recommended for HWSURFACE or OPENGL # pygame.HWSURFACE hardware accelerated, only in FULLSCREEN # pygame.OPENGL create an opengl renderable display # pygame.RESIZABLE display window should be sizeable # pygame.NOFRAME display window will have no border or controls self.fail() def todo_test_set_palette(self): # __doc__ (as of 2008-08-02) for pygame.display.set_palette: # pygame.display.set_palette(palette=None): return None # set the display color palette for indexed displays # # This will change the video display color palette for 8bit displays. # This does not change the palette for the actual display Surface, # only the palette that is used to display the Surface. If no palette # argument is passed, the system default palette will be restored. The # palette is a sequence of RGB triplets. # self.fail() def todo_test_toggle_fullscreen(self): # __doc__ (as of 2008-08-02) for pygame.display.toggle_fullscreen: # pygame.display.toggle_fullscreen(): return bool # switch between fullscreen and windowed displays # # Switches the display window between windowed and fullscreen modes. # This function only works under the unix x11 video driver. For most # situations it is better to call pygame.display.set_mode() with new # display flags. # self.fail() if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/cursors_test.py0000644000175000017500000000603611207055754020346 0ustar vincentvincent#################################### IMPORTS ################################### if __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils \ import test_not_implemented, fixture_path, unittest else: from test.test_utils \ import test_not_implemented, fixture_path, unittest import pygame ################################################################################ class CursorsModuleTest(unittest.TestCase): def todo_test_compile(self): # __doc__ (as of 2008-06-25) for pygame.cursors.compile: # pygame.cursors.compile(strings, black, white,xor) -> data, mask # compile cursor strings into cursor data # # This takes a set of strings with equal length and computes # the binary data for that cursor. The string widths must be # divisible by 8. # # The black and white arguments are single letter strings that # tells which characters will represent black pixels, and which # characters represent white pixels. All other characters are # considered clear. # # This returns a tuple containing the cursor data and cursor mask # data. Both these arguments are used when setting a cursor with # pygame.mouse.set_cursor(). self.fail() def test_load_xbm(self): # __doc__ (as of 2008-06-25) for pygame.cursors.load_xbm: # pygame.cursors.load_xbm(cursorfile, maskfile) -> cursor_args # reads a pair of XBM files into set_cursor arguments # # Arguments can either be filenames or filelike objects # with the readlines method. Not largely tested, but # should work with typical XBM files. # Test that load_xbm will take filenames as arguments cursorfile = fixture_path(r"xbm_cursors/white_sizing.xbm") maskfile = fixture_path(r"xbm_cursors/white_sizing_mask.xbm") cursor = pygame.cursors.load_xbm(cursorfile, maskfile) # Test that load_xbm will take file objects as arguments cursorfile, maskfile = [open(pth) for pth in (cursorfile, maskfile)] cursor = pygame.cursors.load_xbm(cursorfile, maskfile) # Is it in a format that mouse.set_cursor won't blow up on? pygame.display.init() pygame.mouse.set_cursor(*cursor) pygame.display.quit() ################################################################################ if __name__ == '__main__': unittest.main() ################################################################################ pygame-1.9.1release/test/color_test.py0000644000175000017500000007040711225022142017750 0ustar vincentvincent#################################### IMPORTS ################################### from __future__ import generators if __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest else: from test.test_utils import test_not_implemented, unittest import pygame from pygame.compat import long_ import math ################################### CONSTANTS ################################## rgba_vals = [0, 1, 62, 63, 126, 127, 255] rgba_combinations = [ (r,g,b,a) for r in rgba_vals for g in rgba_vals for b in rgba_vals for a in rgba_vals ] ################################################################################ def rgba_combos_Color_generator (): for rgba in rgba_combinations: yield pygame.Color(*rgba) # Python gamma correct def gamma_correct (rgba_0_255, gamma): corrected = round(255.0 * math.pow(rgba_0_255/255.0, gamma)) return max(min( int(corrected), 255), 0) ################################################################################ # TODO: add tests for # correct_gamma() -- test against statically defined verified correct values # coerce () -- ?? def _assignr (x, y): x.r = y def _assigng (x, y): x.g = y def _assignb (x, y): x.b = y def _assigna (x, y): x.a = y def _assign_item (x, p, y): x[p] = y class ColorTypeTest (unittest.TestCase): def test_invalid_html_hex_codes(self): # This was a problem with the way 2 digit hex numbers were # calculated. The test_hex_digits test is related to the fix. Color = pygame.color.Color self.failUnlessRaises(ValueError, lambda: Color('# f000000')) self.failUnlessRaises(ValueError, lambda: Color('#f 000000')) self.failUnlessRaises(ValueError, lambda: Color('#-f000000')) def test_hex_digits(self): # This is an implementation specific test. # Two digit hex numbers are calculated using table lookups # for the upper and lower digits. Color = pygame.color.Color self.assertEqual(Color('#00000000').r, 0x00) self.assertEqual(Color('#10000000').r, 0x10) self.assertEqual(Color('#20000000').r, 0x20) self.assertEqual(Color('#30000000').r, 0x30) self.assertEqual(Color('#40000000').r, 0x40) self.assertEqual(Color('#50000000').r, 0x50) self.assertEqual(Color('#60000000').r, 0x60) self.assertEqual(Color('#70000000').r, 0x70) self.assertEqual(Color('#80000000').r, 0x80) self.assertEqual(Color('#90000000').r, 0x90) self.assertEqual(Color('#A0000000').r, 0xA0) self.assertEqual(Color('#B0000000').r, 0xB0) self.assertEqual(Color('#C0000000').r, 0xC0) self.assertEqual(Color('#D0000000').r, 0xD0) self.assertEqual(Color('#E0000000').r, 0xE0) self.assertEqual(Color('#F0000000').r, 0xF0) self.assertEqual(Color('#01000000').r, 0x01) self.assertEqual(Color('#02000000').r, 0x02) self.assertEqual(Color('#03000000').r, 0x03) self.assertEqual(Color('#04000000').r, 0x04) self.assertEqual(Color('#05000000').r, 0x05) self.assertEqual(Color('#06000000').r, 0x06) self.assertEqual(Color('#07000000').r, 0x07) self.assertEqual(Color('#08000000').r, 0x08) self.assertEqual(Color('#09000000').r, 0x09) self.assertEqual(Color('#0A000000').r, 0x0A) self.assertEqual(Color('#0B000000').r, 0x0B) self.assertEqual(Color('#0C000000').r, 0x0C) self.assertEqual(Color('#0D000000').r, 0x0D) self.assertEqual(Color('#0E000000').r, 0x0E) self.assertEqual(Color('#0F000000').r, 0x0F) def test_comparison(self): Color = pygame.color.Color # Check valid comparisons self.failUnless(Color(255, 0, 0, 0) == Color(255, 0, 0, 0)) self.failUnless(Color(0, 255, 0, 0) == Color(0, 255, 0, 0)) self.failUnless(Color(0, 0, 255, 0) == Color(0, 0, 255, 0)) self.failUnless(Color(0, 0, 0, 255) == Color(0, 0, 0, 255)) self.failIf(Color(0, 0, 0, 0) == Color(255, 0, 0, 0)) self.failIf(Color(0, 0, 0, 0) == Color(0, 255, 0, 0)) self.failIf(Color(0, 0, 0, 0) == Color(0, 0, 255, 0)) self.failIf(Color(0, 0, 0, 0) == Color(0, 0, 0, 255)) self.failUnless(Color(0, 0, 0, 0) != Color(255, 0, 0, 0)) self.failUnless(Color(0, 0, 0, 0) != Color(0, 255, 0, 0)) self.failUnless(Color(0, 0, 0, 0) != Color(0, 0, 255, 0)) self.failUnless(Color(0, 0, 0, 0) != Color(0, 0, 0, 255)) self.failIf(Color(255, 0, 0, 0) != Color(255, 0, 0, 0)) self.failIf(Color(0, 255, 0, 0) != Color(0, 255, 0, 0)) self.failIf(Color(0, 0, 255, 0) != Color(0, 0, 255, 0)) self.failIf(Color(0, 0, 0, 255) != Color(0, 0, 0, 255)) self.failUnless(Color(255, 0, 0, 0) == (255, 0, 0, 0)) self.failUnless(Color(0, 255, 0, 0) == (0, 255, 0, 0)) self.failUnless(Color(0, 0, 255, 0) == (0, 0, 255, 0)) self.failUnless(Color(0, 0, 0, 255) == (0, 0, 0, 255)) self.failIf(Color(0, 0, 0, 0) == (255, 0, 0, 0)) self.failIf(Color(0, 0, 0, 0) == (0, 255, 0, 0)) self.failIf(Color(0, 0, 0, 0) == (0, 0, 255, 0)) self.failIf(Color(0, 0, 0, 0) == (0, 0, 0, 255)) self.failUnless(Color(0, 0, 0, 0) != (255, 0, 0, 0)) self.failUnless(Color(0, 0, 0, 0) != (0, 255, 0, 0)) self.failUnless(Color(0, 0, 0, 0) != (0, 0, 255, 0)) self.failUnless(Color(0, 0, 0, 0) != (0, 0, 0, 255)) self.failIf(Color(255, 0, 0, 0) != (255, 0, 0, 0)) self.failIf(Color(0, 255, 0, 0) != (0, 255, 0, 0)) self.failIf(Color(0, 0, 255, 0) != (0, 0, 255, 0)) self.failIf(Color(0, 0, 0, 255) != (0, 0, 0, 255)) self.failUnless((255, 0, 0, 0) == Color(255, 0, 0, 0)) self.failUnless((0, 255, 0, 0) == Color(0, 255, 0, 0)) self.failUnless((0, 0, 255, 0) == Color(0, 0, 255, 0)) self.failUnless((0, 0, 0, 255) == Color(0, 0, 0, 255)) self.failIf((0, 0, 0, 0) == Color(255, 0, 0, 0)) self.failIf((0, 0, 0, 0) == Color(0, 255, 0, 0)) self.failIf((0, 0, 0, 0) == Color(0, 0, 255, 0)) self.failIf((0, 0, 0, 0) == Color(0, 0, 0, 255)) self.failUnless((0, 0, 0, 0) != Color(255, 0, 0, 0)) self.failUnless((0, 0, 0, 0) != Color(0, 255, 0, 0)) self.failUnless((0, 0, 0, 0) != Color(0, 0, 255, 0)) self.failUnless((0, 0, 0, 0) != Color(0, 0, 0, 255)) self.failIf((255, 0, 0, 0) != Color(255, 0, 0, 0)) self.failIf((0, 255, 0, 0) != Color(0, 255, 0, 0)) self.failIf((0, 0, 255, 0) != Color(0, 0, 255, 0)) self.failIf((0, 0, 0, 255) != Color(0, 0, 0, 255)) class TupleSubclass(tuple): pass self.failUnless(Color(255, 0, 0, 0) == TupleSubclass((255, 0, 0, 0))) self.failUnless(TupleSubclass((255, 0, 0, 0)) == Color(255, 0, 0, 0)) self.failIf(Color(255, 0, 0, 0) != TupleSubclass((255, 0, 0, 0))) self.failIf(TupleSubclass((255, 0, 0, 0)) != Color(255, 0, 0, 0)) # These are not supported so will be unequal. self.failIf(Color(255, 0, 0, 0) == "#ff000000") self.failUnless(Color(255, 0, 0, 0) != "#ff000000") self.failIf("#ff000000" == Color(255, 0, 0, 0)) self.failUnless("#ff000000" != Color(255, 0, 0, 0)) self.failIf(Color(255, 0, 0, 0) == 0xff000000) self.failUnless(Color(255, 0, 0, 0) != 0xff000000) self.failIf(0xff000000 == Color(255, 0, 0, 0)) self.failUnless(0xff000000 != Color(255, 0, 0, 0)) self.failIf(Color(255, 0, 0, 0) == [255, 0, 0, 0]) self.failUnless(Color(255, 0, 0, 0) != [255, 0, 0, 0]) self.failIf([255, 0, 0, 0] == Color(255, 0, 0 ,0)) self.failUnless([255, 0, 0, 0] != Color(255, 0, 0, 0)) # Comparison is not implemented for invalid color values. class Test(object): def __eq__(self, other): return -1 def __ne__(self, other): return -2 class TestTuple(tuple): def __eq__(self, other): return -1 def __ne__(self, other): return -2 t = Test() t_tuple = TestTuple(('a', 0, 0, 0)) black = Color('black') self.assertEqual(black == t, -1) self.assertEqual(t == black, -1) self.assertEqual(black != t, -2) self.assertEqual(t != black, -2) self.assertEqual(black == t_tuple, -1) self.assertEqual(black != t_tuple, -2) self.assertEqual(t_tuple == black, -1) self.assertEqual(t_tuple != black, -2) def test_ignore_whitespace(self): self.assertEquals(pygame.color.Color('red'), pygame.color.Color(' r e d ')) def test_slice(self): #"""|tags: python3_ignore|""" # slicing a color gives you back a tuple. # do all sorts of slice combinations. c = pygame.Color(1,2,3,4) self.assertEquals((1,2,3,4), c[:]) self.assertEquals((1,2,3), c[:-1]) self.assertEquals((), c[:-5]) self.assertEquals((1,2,3,4), c[:4]) self.assertEquals((1,2,3,4), c[:5]) self.assertEquals((1,2), c[:2]) self.assertEquals((1,), c[:1]) self.assertEquals((), c[:0]) self.assertEquals((2,), c[1:-2]) self.assertEquals((3, 4), c[-2:]) self.assertEquals((4,), c[-1:]) # NOTE: assigning to a slice is currently unsupported. def test_unpack(self): # should be able to unpack to r,g,b,a and r,g,b c = pygame.Color(1,2,3,4) r,g,b,a = c self.assertEquals((1,2,3,4), (r,g,b,a)) self.assertEquals(c, (r,g,b,a)) c.set_length(3) r,g,b = c self.assertEquals((1,2,3), (r,g,b)) def test_length(self): # should be able to unpack to r,g,b,a and r,g,b c = pygame.Color(1,2,3,4) self.assertEquals(len(c), 4) c.set_length(3) self.assertEquals(len(c), 3) # it keeps the old alpha anyway... self.assertEquals(c.a, 4) # however you can't get the alpha in this way: self.assertRaises (IndexError, lambda x:c[x], 4) c.set_length(4) self.assertEquals(len(c), 4) self.assertEquals(len(c), 4) self.assertRaises (ValueError, c.set_length, 5) self.assertRaises (ValueError, c.set_length, -1) self.assertRaises (ValueError, c.set_length, 0) self.assertRaises (ValueError, c.set_length, pow(2,long_(33))) def test_case_insensitivity_of_string_args(self): self.assertEquals(pygame.color.Color('red'), pygame.color.Color('Red')) def test_color (self): c = pygame.Color (10, 20, 30, 40) self.assertEquals (c.r, 10) self.assertEquals (c.g, 20) self.assertEquals (c.b, 30) self.assertEquals (c.a, 40) c = pygame.Color ("indianred3") self.assertEquals (c.r, 205) self.assertEquals (c.g, 85) self.assertEquals (c.b, 85) self.assertEquals (c.a, 255) c = pygame.Color (0xAABBCCDD) self.assertEquals (c.r, 0xAA) self.assertEquals (c.g, 0xBB) self.assertEquals (c.b, 0xCC) self.assertEquals (c.a, 0xDD) self.assertRaises (ValueError, pygame.Color, 257, 10, 105, 44) self.assertRaises (ValueError, pygame.Color, 10, 257, 105, 44) self.assertRaises (ValueError, pygame.Color, 10, 105, 257, 44) self.assertRaises (ValueError, pygame.Color, 10, 105, 44, 257) def test_rgba (self): c = pygame.Color (0) self.assertEquals (c.r, 0) self.assertEquals (c.g, 0) self.assertEquals (c.b, 0) self.assertEquals (c.a, 0) # Test simple assignments c.r = 123 self.assertEquals (c.r, 123) self.assertRaises (ValueError, _assignr, c, 537) self.assertEquals (c.r, 123) self.assertRaises (ValueError, _assignr, c, -3) self.assertEquals (c.r, 123) c.g = 55 self.assertEquals (c.g, 55) self.assertRaises (ValueError, _assigng, c, 348) self.assertEquals (c.g, 55) self.assertRaises (ValueError, _assigng, c, -44) self.assertEquals (c.g, 55) c.b = 77 self.assertEquals (c.b, 77) self.assertRaises (ValueError, _assignb, c, 256) self.assertEquals (c.b, 77) self.assertRaises (ValueError, _assignb, c, -12) self.assertEquals (c.b, 77) c.a = 255 self.assertEquals (c.a, 255) self.assertRaises (ValueError, _assigna, c, 312) self.assertEquals (c.a, 255) self.assertRaises (ValueError, _assigna, c, -10) self.assertEquals (c.a, 255) def test_repr (self): c = pygame.Color (68, 38, 26, 69) t = "(68, 38, 26, 69)" self.assertEquals (repr (c), t) def test_add (self): c1 = pygame.Color (0) self.assertEquals (c1.r, 0) self.assertEquals (c1.g, 0) self.assertEquals (c1.b, 0) self.assertEquals (c1.a, 0) c2 = pygame.Color (20, 33, 82, 193) self.assertEquals (c2.r, 20) self.assertEquals (c2.g, 33) self.assertEquals (c2.b, 82) self.assertEquals (c2.a, 193) c3 = c1 + c2 self.assertEquals (c3.r, 20) self.assertEquals (c3.g, 33) self.assertEquals (c3.b, 82) self.assertEquals (c3.a, 193) c3 = c3 + c2 self.assertEquals (c3.r, 40) self.assertEquals (c3.g, 66) self.assertEquals (c3.b, 164) self.assertEquals (c3.a, 255) def test_sub (self): c1 = pygame.Color (0xFFFFFFFF) self.assertEquals (c1.r, 255) self.assertEquals (c1.g, 255) self.assertEquals (c1.b, 255) self.assertEquals (c1.a, 255) c2 = pygame.Color (20, 33, 82, 193) self.assertEquals (c2.r, 20) self.assertEquals (c2.g, 33) self.assertEquals (c2.b, 82) self.assertEquals (c2.a, 193) c3 = c1 - c2 self.assertEquals (c3.r, 235) self.assertEquals (c3.g, 222) self.assertEquals (c3.b, 173) self.assertEquals (c3.a, 62) c3 = c3 - c2 self.assertEquals (c3.r, 215) self.assertEquals (c3.g, 189) self.assertEquals (c3.b, 91) self.assertEquals (c3.a, 0) def test_mul (self): c1 = pygame.Color (0x01010101) self.assertEquals (c1.r, 1) self.assertEquals (c1.g, 1) self.assertEquals (c1.b, 1) self.assertEquals (c1.a, 1) c2 = pygame.Color (2, 5, 3, 22) self.assertEquals (c2.r, 2) self.assertEquals (c2.g, 5) self.assertEquals (c2.b, 3) self.assertEquals (c2.a, 22) c3 = c1 * c2 self.assertEquals (c3.r, 2) self.assertEquals (c3.g, 5) self.assertEquals (c3.b, 3) self.assertEquals (c3.a, 22) c3 = c3 * c2 self.assertEquals (c3.r, 4) self.assertEquals (c3.g, 25) self.assertEquals (c3.b, 9) self.assertEquals (c3.a, 255) def test_div (self): c1 = pygame.Color (0x80808080) self.assertEquals (c1.r, 128) self.assertEquals (c1.g, 128) self.assertEquals (c1.b, 128) self.assertEquals (c1.a, 128) c2 = pygame.Color (2, 4, 8, 16) self.assertEquals (c2.r, 2) self.assertEquals (c2.g, 4) self.assertEquals (c2.b, 8) self.assertEquals (c2.a, 16) c3 = c1 // c2 self.assertEquals (c3.r, 64) self.assertEquals (c3.g, 32) self.assertEquals (c3.b, 16) self.assertEquals (c3.a, 8) c3 = c3 // c2 self.assertEquals (c3.r, 32) self.assertEquals (c3.g, 8) self.assertEquals (c3.b, 2) self.assertEquals (c3.a, 0) def test_mod (self): c1 = pygame.Color (0xFFFFFFFF) self.assertEquals (c1.r, 255) self.assertEquals (c1.g, 255) self.assertEquals (c1.b, 255) self.assertEquals (c1.a, 255) c2 = pygame.Color (2, 4, 8, 16) self.assertEquals (c2.r, 2) self.assertEquals (c2.g, 4) self.assertEquals (c2.b, 8) self.assertEquals (c2.a, 16) c3 = c1 % c2 self.assertEquals (c3.r, 1) self.assertEquals (c3.g, 3) self.assertEquals (c3.b, 7) self.assertEquals (c3.a, 15) def test_float (self): c = pygame.Color (0xCC00CC00) self.assertEquals (c.r, 204) self.assertEquals (c.g, 0) self.assertEquals (c.b, 204) self.assertEquals (c.a, 0) self.assertEquals (float (c), float (0xCC00CC00)) c = pygame.Color (0x33727592) self.assertEquals (c.r, 51) self.assertEquals (c.g, 114) self.assertEquals (c.b, 117) self.assertEquals (c.a, 146) self.assertEquals (float (c), float (0x33727592)) def test_oct (self): c = pygame.Color (0xCC00CC00) self.assertEquals (c.r, 204) self.assertEquals (c.g, 0) self.assertEquals (c.b, 204) self.assertEquals (c.a, 0) self.assertEquals (oct (c), oct (0xCC00CC00)) c = pygame.Color (0x33727592) self.assertEquals (c.r, 51) self.assertEquals (c.g, 114) self.assertEquals (c.b, 117) self.assertEquals (c.a, 146) self.assertEquals (oct (c), oct (0x33727592)) def test_hex (self): c = pygame.Color (0xCC00CC00) self.assertEquals (c.r, 204) self.assertEquals (c.g, 0) self.assertEquals (c.b, 204) self.assertEquals (c.a, 0) self.assertEquals (hex (c), hex (0xCC00CC00)) c = pygame.Color (0x33727592) self.assertEquals (c.r, 51) self.assertEquals (c.g, 114) self.assertEquals (c.b, 117) self.assertEquals (c.a, 146) self.assertEquals (hex (c), hex (0x33727592)) def test_webstyle(self): c = pygame.Color ("#CC00CC11") self.assertEquals (c.r, 204) self.assertEquals (c.g, 0) self.assertEquals (c.b, 204) self.assertEquals (c.a, 17) self.assertEquals (hex (c), hex (0xCC00CC11)) c = pygame.Color ("#CC00CC") self.assertEquals (c.r, 204) self.assertEquals (c.g, 0) self.assertEquals (c.b, 204) self.assertEquals (c.a, 255) self.assertEquals (hex (c), hex (0xCC00CCFF)) c = pygame.Color ("0xCC00CC11") self.assertEquals (c.r, 204) self.assertEquals (c.g, 0) self.assertEquals (c.b, 204) self.assertEquals (c.a, 17) self.assertEquals (hex (c), hex (0xCC00CC11)) c = pygame.Color ("0xCC00CC") self.assertEquals (c.r, 204) self.assertEquals (c.g, 0) self.assertEquals (c.b, 204) self.assertEquals (c.a, 255) self.assertEquals (hex (c), hex (0xCC00CCFF)) self.assertRaises (ValueError, pygame.Color, "#cc00qq") self.assertRaises (ValueError, pygame.Color, "0xcc00qq") self.assertRaises (ValueError, pygame.Color, "09abcdef") self.assertRaises (ValueError, pygame.Color, "09abcde") self.assertRaises (ValueError, pygame.Color, "quarky") def test_int (self): # This will be a long c = pygame.Color (0xCC00CC00) self.assertEquals (c.r, 204) self.assertEquals (c.g, 0) self.assertEquals (c.b, 204) self.assertEquals (c.a, 0) self.assertEquals (int (c), int (0xCC00CC00)) # This will be an int c = pygame.Color (0x33727592) self.assertEquals (c.r, 51) self.assertEquals (c.g, 114) self.assertEquals (c.b, 117) self.assertEquals (c.a, 146) self.assertEquals (int (c), int (0x33727592)) def test_long (self): # This will be a long c = pygame.Color (0xCC00CC00) self.assertEquals (c.r, 204) self.assertEquals (c.g, 0) self.assertEquals (c.b, 204) self.assertEquals (c.a, 0) self.assertEquals (long_ (c), long_ (0xCC00CC00)) # This will be an int c = pygame.Color (0x33727592) self.assertEquals (c.r, 51) self.assertEquals (c.g, 114) self.assertEquals (c.b, 117) self.assertEquals (c.a, 146) self.assertEquals (long_ (c), long_ (0x33727592)) def test_normalize (self): c = pygame.Color (204, 38, 194, 55) self.assertEquals (c.r, 204) self.assertEquals (c.g, 38) self.assertEquals (c.b, 194) self.assertEquals (c.a, 55) t = c.normalize () self.assertAlmostEquals (t[0], 0.800000, 5) self.assertAlmostEquals (t[1], 0.149016, 5) self.assertAlmostEquals (t[2], 0.760784, 5) self.assertAlmostEquals (t[3], 0.215686, 5) def test_len (self): c = pygame.Color (204, 38, 194, 55) self.assertEquals (len (c), 4) def test_get_item (self): c = pygame.Color (204, 38, 194, 55) self.assertEquals (c[0], 204) self.assertEquals (c[1], 38) self.assertEquals (c[2], 194) self.assertEquals (c[3], 55) def test_set_item (self): c = pygame.Color (204, 38, 194, 55) self.assertEquals (c[0], 204) self.assertEquals (c[1], 38) self.assertEquals (c[2], 194) self.assertEquals (c[3], 55) c[0] = 33 self.assertEquals (c[0], 33) c[1] = 48 self.assertEquals (c[1], 48) c[2] = 173 self.assertEquals (c[2], 173) c[3] = 213 self.assertEquals (c[3], 213) # Now try some 'invalid' ones self.assertRaises (ValueError, _assign_item, c, 0, 95.485) self.assertEquals (c[0], 33) self.assertRaises (ValueError, _assign_item, c, 1, -83) self.assertEquals (c[1], 48) self.assertRaises (ValueError, _assign_item, c, 2, "Hello") self.assertEquals (c[2], 173) def test_Color_type_works_for_Surface_get_and_set_colorkey(self): s = pygame.Surface((32, 32)) c = pygame.Color(33, 22, 11, 255) s.set_colorkey(c) get_r, get_g, get_b, get_a = s.get_colorkey() self.assert_(get_r == c.r) self.assert_(get_g == c.g) self.assert_(get_b == c.b) self.assert_(get_a == c.a) ########## HSLA, HSVA, CMY, I1I2I3 ALL ELEMENTS WITHIN SPECIFIED RANGE ######### def test_hsla__all_elements_within_limits (self): for c in rgba_combos_Color_generator(): h, s, l, a = c.hsla self.assert_(0 <= h <= 360) self.assert_(0 <= s <= 100) self.assert_(0 <= l <= 100) self.assert_(0 <= a <= 100) def test_hsva__all_elements_within_limits (self): for c in rgba_combos_Color_generator(): h, s, v, a = c.hsva self.assert_(0 <= h <= 360) self.assert_(0 <= s <= 100) self.assert_(0 <= v <= 100) self.assert_(0 <= a <= 100) def test_cmy__all_elements_within_limits (self): for c in rgba_combos_Color_generator(): c, m, y = c.cmy self.assert_(0 <= c <= 1) self.assert_(0 <= m <= 1) self.assert_(0 <= y <= 1) def test_i1i2i3__all_elements_within_limits (self): for c in rgba_combos_Color_generator(): i1, i2, i3 = c.i1i2i3 self.assert_( 0 <= i1 <= 1) self.assert_( -0.5 <= i2 <= 0.5) self.assert_( -0.5 <= i3 <= 0.5) ####################### COLORSPACE PROPERTY SANITY TESTS ####################### def colorspaces_converted_should_not_raise (self, prop): fails = 0 x = 0 for c in rgba_combos_Color_generator(): x += 1 other = pygame.Color(0) try: setattr(other, prop, getattr(c, prop)) #eg other.hsla = c.hsla except ValueError: fails += 1 self.assert_(x > 0, "x is combination counter, 0 means no tests!") self.assert_((fails, x) == (0, x)) def test_hsla__sanity_testing_converted_should_not_raise (self): self.colorspaces_converted_should_not_raise('hsla') def test_hsva__sanity_testing_converted_should_not_raise (self): self.colorspaces_converted_should_not_raise('hsva') def test_cmy__sanity_testing_converted_should_not_raise (self): self.colorspaces_converted_should_not_raise('cmy') def test_i1i2i3__sanity_testing_converted_should_not_raise (self): self.colorspaces_converted_should_not_raise('i1i2i3') ################################################################################ def colorspaces_converted_should_equate_bar_rounding (self, prop): for c in rgba_combos_Color_generator(): other = pygame.Color(0) try: setattr(other, prop, getattr(c, prop)) #eg other.hsla = c.hsla self.assert_(abs(other.r - c.r) <= 1) self.assert_(abs(other.b - c.b) <= 1) self.assert_(abs(other.g - c.g) <= 1) # CMY and I1I2I3 do not care about the alpha if not prop in ("cmy", "i1i2i3"): self.assert_(abs(other.a - c.a) <= 1) except ValueError: pass # other tests will notify, this tests equation def test_hsla__sanity_testing_converted_should_equate_bar_rounding(self): self.colorspaces_converted_should_equate_bar_rounding('hsla') def test_hsva__sanity_testing_converted_should_equate_bar_rounding(self): self.colorspaces_converted_should_equate_bar_rounding('hsva') def test_cmy__sanity_testing_converted_should_equate_bar_rounding(self): self.colorspaces_converted_should_equate_bar_rounding('cmy') def test_i1i2i3__sanity_testing_converted_should_equate_bar_rounding(self): self.colorspaces_converted_should_equate_bar_rounding('i1i2i3') ################################################################################ def test_correct_gamma__verified_against_python_implementation(self): "|tags:slow|" # gamma_correct defined at top of page gammas = [i / 10.0 for i in range(1, 31)] # [0.1 ... 3.0] gammas_len = len(gammas) for i, c in enumerate(rgba_combos_Color_generator()): gamma = gammas[i % gammas_len] corrected = pygame.Color(*[gamma_correct(x, gamma) for x in tuple(c)]) lib_corrected = c.correct_gamma(gamma) self.assert_(corrected.r == lib_corrected.r) self.assert_(corrected.g == lib_corrected.g) self.assert_(corrected.b == lib_corrected.b) self.assert_(corrected.a == lib_corrected.a) # TODO: test against statically defined verified _correct_ values # assert corrected.r == 125 etc. def test_pickle(self): import pickle c1 = pygame.Color(1,2,3,4) #c2 = pygame.Color(255,254,253,252) pickle_string = pickle.dumps(c1) c1_frompickle = pickle.loads(pickle_string) self.assertEqual(c1,c1_frompickle) ################################################################################ if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/cdrom_test.py0000644000175000017500000003002111207055754017741 0ustar vincentvincent#################################### IMPORTS ################################### if __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils \ import test_not_implemented, question, prompt, unittest else: from test.test_utils \ import test_not_implemented, question, prompt, unittest import pygame ################################################################################ class CdromModuleTest(unittest.TestCase): def todo_test_CD(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.CD: # pygame.cdrom.CD(id): return CD # class to manage a cdrom drive # # You can create a CD object for each cdrom on the system. Use # pygame.cdrom.get_count() to determine how many drives actually # exist. The id argument is an integer of the drive, starting at zero. # # The CD object is not initialized, you can only call CD.get_id() and # CD.get_name() on an uninitialized drive. # # It is safe to create multiple CD objects for the same drive, they # will all cooperate normally. # self.fail() def todo_test_get_count(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.get_count: # pygame.cdrom.get_count(): return count # number of cd drives on the system # # Return the number of cd drives on the system. When you create CD # objects you need to pass an integer id that must be lower than this # count. The count will be 0 if there are no drives on the system. # self.fail() def todo_test_get_init(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.get_init: # pygame.cdrom.get_init(): return bool # true if the cdrom module is initialized # # Test if the cdrom module is initialized or not. This is different # than the CD.init() since each drive must also be initialized # individually. # self.fail() def todo_test_init(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.init: # pygame.cdrom.init(): return None # initialize the cdrom module # # Initialize the cdrom module. This will scan the system for all CD # devices. The module must be initialized before any other functions # will work. This automatically happens when you call pygame.init(). # # It is safe to call this function more than once. self.fail() def todo_test_quit(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.quit: # pygame.cdrom.quit(): return None # uninitialize the cdrom module # # Uninitialize the cdrom module. After you call this any existing CD # objects will no longer work. # # It is safe to call this function more than once. self.fail() class CDTypeTest(unittest.TestCase): def setUp(self): pygame.cdrom.init() #TODO: try: self.cd = pygame.cdrom.CD(0) except pygame.error: self.cd = None def tearDown(self): pygame.cdrom.quit() def test_1_eject(self): # __doc__ (as of 2008-07-02) for pygame.cdrom.CD.eject: # CD.eject(): return None # eject or open the cdrom drive # should raise if cd object not initialized if self.cd: self.cd.init() self.cd.eject() self.assert_(question('Did the cd eject?')) prompt("Please close the cd drive") def test_2_get_name(self): # __doc__ (as of 2008-07-02) for pygame.cdrom.CD.get_name: # CD.get_name(): return name # the system name of the cdrom drive if self.cd: cd_name = self.cd.get_name() self.assert_ ( question('Is %s the correct name for the cd drive?' % cd_name) ) def todo_test_get_all(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.get_all: # CD.get_all(): return [(audio, start, end, lenth), ...] # get all track information # # Return a list with information for every track on the cdrom. The # information consists of a tuple with four values. The audio value is # True if the track contains audio data. The start, end, and length # values are floating point numbers in seconds. Start and end # represent absolute times on the entire disc. # self.fail() def todo_test_get_busy(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.get_busy: # CD.get_busy(): return bool # true if the drive is playing audio # # Returns True if the drive busy playing back audio. self.fail() def todo_test_get_current(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.get_current: # CD.get_current(): return track, seconds # the current audio playback position # # Returns both the current track and time of that track. This method # works when the drive is either playing or paused. # # Note, track 0 is the first track on the CD. Track numbers start at zero. self.fail() def todo_test_get_empty(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.get_empty: # CD.get_empty(): return bool # False if a cdrom is in the drive # # Return False if there is a cdrom currently in the drive. If the # drive is empty this will return True. # self.fail() def todo_test_get_id(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.get_id: # CD.get_init(): return bool # true if this cd device initialized # # Returns the integer id that was used to create the CD instance. This # method can work on an uninitialized CD. # self.fail() def todo_test_get_init(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.get_init: # CD.get_init(): return bool # true if this cd device initialized # # Test if this CDROM device is initialized. This is different than the # pygame.cdrom.init() since each drive must also be initialized # individually. # self.fail() def todo_test_get_numtracks(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.get_numtracks: # CD.get_numtracks(): return count # the number of tracks on the cdrom # # Return the number of tracks on the cdrom in the drive. This will # return zero of the drive is empty or has no tracks. # self.fail() def todo_test_get_paused(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.get_paused: # CD.get_paused(): return bool # true if the drive is paused # # Returns True if the drive is currently paused. self.fail() def todo_test_get_track_audio(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.get_track_audio: # CD.get_track_audio(track): return bool # true if the cdrom track has audio data # # Determine if a track on a cdrom contains audio data. You can also # call CD.num_tracks() and CD.get_all() to determine more information # about the cdrom. # # Note, track 0 is the first track on the CD. Track numbers start at zero. self.fail() def todo_test_get_track_length(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.get_track_length: # CD.get_track_length(track): return seconds # length of a cdrom track # # Return a floating point value in seconds of the length of the cdrom track. # Note, track 0 is the first track on the CD. Track numbers start at zero. self.fail() def todo_test_get_track_start(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.get_track_start: # CD.get_track_start(track): return seconds # start time of a cdrom track # # Return the absolute time in seconds where at start of the cdrom track. # Note, track 0 is the first track on the CD. Track numbers start at zero. self.fail() def todo_test_init(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.init: # CD.init(): return None # initialize a cdrom drive for use # # Initialize the cdrom drive for use. The drive must be initialized # for most CD methods to work. Even if the rest of pygame has been # initialized. # # There may be a brief pause while the drive is initialized. Avoid # CD.init() if the program should not stop for a second or two. # self.fail() def todo_test_pause(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.pause: # CD.pause(): return None # temporarily stop audio playback # # Temporarily stop audio playback on the CD. The playback can be # resumed at the same point with the CD.resume() method. If the CD is # not playing this method does nothing. # # Note, track 0 is the first track on the CD. Track numbers start at zero. self.fail() def todo_test_play(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.play: # CD.init(): return None # initialize a cdrom drive for use # # Playback audio from an audio cdrom in the drive. Besides the track # number argument, you can also pass a starting and ending time for # playback. The start and end time are in seconds, and can limit the # section of an audio track played. # # If you pass a start time but no end, the audio will play to the end # of the track. If you pass a start time and 'None' for the end time, # the audio will play to the end of the entire disc. # # See the CD.get_numtracks() and CD.get_track_audio() to find tracks to playback. # Note, track 0 is the first track on the CD. Track numbers start at zero. self.fail() def todo_test_quit(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.quit: # CD.quit(): return None # uninitialize a cdrom drive for use # # Uninitialize a drive for use. Call this when your program will not # be accessing the drive for awhile. # self.fail() def todo_test_resume(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.resume: # CD.resume(): return None # unpause audio playback # # Unpause a paused CD. If the CD is not paused or already playing, # this method does nothing. # self.fail() def todo_test_stop(self): # __doc__ (as of 2008-08-02) for pygame.cdrom.CD.stop: # CD.stop(): return None # stop audio playback # # Stops playback of audio from the cdrom. This will also lose the # current playback position. This method does nothing if the drive # isn't already playing audio. # self.fail() ################################################################################ if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/cdrom_tags.py0000644000175000017500000000003311207055754017720 0ustar vincentvincent__tags__ = ['interactive'] pygame-1.9.1release/test/bufferproxy_test.py0000644000175000017500000000374511207055754021225 0ustar vincentvincent#################################### IMPORTS ################################### if __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest else: from test.test_utils import test_not_implemented, unittest import pygame ################################################################################ class BufferProxyTypeTest(unittest.TestCase): def test_creation(self): self.assert_(pygame.bufferproxy.BufferProxy()) def todo_test_length(self): # __doc__ (as of 2008-08-02) for pygame.bufferproxy.BufferProxy.length: # The size of the buffer data in bytes. self.fail() def todo_test_raw(self): # __doc__ (as of 2008-08-02) for pygame.bufferproxy.BufferProxy.raw: # The raw buffer data as string. The string may contain NUL bytes. self.fail() def todo_test_write(self): # __doc__ (as of 2008-08-02) for pygame.bufferproxy.BufferProxy.write: # B.write (bufferproxy, buffer, offset) -> None # # Writes raw data to the bufferproxy. # # Writes the raw data from buffer to the BufferProxy object, starting # at the specified offset within the BufferProxy. # If the length of the passed buffer exceeds the length of the # BufferProxy (reduced by the offset), an IndexError will be raised. self.fail() ################################################################################ if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/blit_test.py0000644000175000017500000000522711207055754017601 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import unittest else: from test.test_utils import unittest import pygame from pygame.locals import * class BlitTest( unittest.TestCase ): def test_SRCALPHA( self ): """ SRCALPHA tests. """ #blend(s, 0, d) = d s = pygame.Surface((1,1), SRCALPHA, 32) s.fill((255, 255,255, 0)) d = pygame.Surface((1,1), SRCALPHA, 32) d.fill((0, 0,255, 255)) s.blit(d, (0,0)) self.assertEqual(s.get_at((0,0)), d.get_at((0,0)) ) #blend(s, 255, d) = s s = pygame.Surface((1,1), SRCALPHA, 32) s.fill((123, 0, 0, 255)) s1 = pygame.Surface((1,1), SRCALPHA, 32) s1.fill((123, 0, 0, 255)) d = pygame.Surface((1,1), SRCALPHA, 32) d.fill((10, 0,0, 0)) s.blit(d, (0,0)) self.assertEqual(s.get_at((0,0)), s1.get_at((0,0)) ) #TODO: these should be true too. #blend(0, sA, 0) = 0 #blend(255, sA, 255) = 255 #blend(s, sA, d) <= 255 def test_BLEND( self ): """ BLEND_ tests. """ #test that it doesn't overflow, and that it is saturated. s = pygame.Surface((1,1), SRCALPHA, 32) s.fill((255, 255,255, 0)) d = pygame.Surface((1,1), SRCALPHA, 32) d.fill((0, 0,255, 255)) s.blit(d, (0,0), None, BLEND_ADD) #print "d %s" % (d.get_at((0,0)),) #print s.get_at((0,0)) #self.assertEqual(s.get_at((0,0))[2], 255 ) #self.assertEqual(s.get_at((0,0))[3], 0 ) s.blit(d, (0,0), None, BLEND_RGBA_ADD) #print s.get_at((0,0)) self.assertEqual(s.get_at((0,0))[3], 255 ) # test adding works. s.fill((20, 255,255, 0)) d.fill((10, 0,255, 255)) s.blit(d, (0,0), None, BLEND_ADD) self.assertEqual(s.get_at((0,0))[2], 255 ) # test subbing works. s.fill((20, 255,255, 0)) d.fill((10, 0,255, 255)) s.blit(d, (0,0), None, BLEND_SUB) self.assertEqual(s.get_at((0,0))[0], 10 ) # no overflow in sub blend. s.fill((20, 255,255, 0)) d.fill((30, 0,255, 255)) s.blit(d, (0,0), None, BLEND_SUB) self.assertEqual(s.get_at((0,0))[0], 0 ) if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/base_test.py0000644000175000017500000001316211207055754017556 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import test_not_implemented, unittest else: from test.test_utils import test_not_implemented, unittest import pygame init_called = quit_called = 0 def __PYGAMEinit__(): #called automatically by pygame.init() global init_called init_called = init_called + 1 pygame.register_quit(pygame_quit) def pygame_quit(): global quit_called quit_called = quit_called + 1 quit_hook_ran = 0 def quit_hook(): global quit_hook_ran quit_hook_ran = 1 class BaseModuleTest(unittest.TestCase): def testAutoInit(self): pygame.init() pygame.quit() self.assertEqual(init_called, 1) self.assertEqual(quit_called, 1) def test_get_sdl_byteorder(self): # __doc__ (as of 2008-06-25) for pygame.base.get_sdl_byteorder: # pygame.get_sdl_byteorder(): return int # get the byte order of SDL self.assert_(pygame.get_sdl_byteorder() + 1) def test_get_sdl_version(self): # __doc__ (as of 2008-06-25) for pygame.base.get_sdl_version: # pygame.get_sdl_version(): return major, minor, patch # get the version number of SDL self.assert_( len(pygame.get_sdl_version()) == 3) def not_init_assertions(self): self.assert_(not pygame.display.get_init(), "display shouldn't be initialized" ) self.assert_(not pygame.mixer.get_init(), "mixer shouldn't be initialized" ) self.assert_(not pygame.font.get_init(), "init shouldn't be initialized" ) ## !!! TODO : Remove when scrap works for OS X import platform if platform.system().startswith('Darwin'): return try: self.assertRaises(pygame.error, pygame.scrap.get) except NotImplementedError: # Scrap is optional. pass # pygame.cdrom # pygame.joystick def init_assertions(self): self.assert_(pygame.display.get_init()) self.assert_(pygame.mixer.get_init()) self.assert_(pygame.font.get_init()) def test_quit__and_init(self): # __doc__ (as of 2008-06-25) for pygame.base.quit: # pygame.quit(): return None # uninitialize all pygame modules # Make sure everything is not init self.not_init_assertions() # Initiate it pygame.init() # Check self.init_assertions() # Quit pygame.quit() # All modules have quit self.not_init_assertions() def test_register_quit(self): # __doc__ (as of 2008-06-25) for pygame.base.register_quit: # register_quit(callable): return None # register a function to be called when pygame quits self.assert_(not quit_hook_ran) pygame.init() pygame.register_quit(quit_hook) pygame.quit() self.assert_(quit_hook_ran) def test_get_error(self): # __doc__ (as of 2008-08-02) for pygame.base.get_error: # pygame.get_error(): return errorstr # get the current error message # # SDL maintains an internal error message. This message will usually # be given to you when pygame.error is raised. You will rarely need to # call this function. # self.assertEqual(pygame.get_error(), "") pygame.set_error("hi") self.assertEqual(pygame.get_error(), "hi") pygame.set_error("") self.assertEqual(pygame.get_error(), "") def test_set_error(self): self.assertEqual(pygame.get_error(), "") pygame.set_error("hi") self.assertEqual(pygame.get_error(), "hi") pygame.set_error("") self.assertEqual(pygame.get_error(), "") def test_init(self): # __doc__ (as of 2008-08-02) for pygame.base.init: # pygame.init(): return (numpass, numfail) # initialize all imported pygame modules # # Initialize all imported Pygame modules. No exceptions will be raised # if a module fails, but the total number if successful and failed # inits will be returned as a tuple. You can always initialize # individual modules manually, but pygame.init is a convenient way to # get everything started. The init() functions for individual modules # will raise exceptions when they fail. # # You may want to initalise the different modules seperately to speed # up your program or to not use things your game does not. # # It is safe to call this init() more than once: repeated calls will # have no effect. This is true even if you have pygame.quit() all the # modules. # # Make sure everything is not init self.not_init_assertions() # Initiate it pygame.init() # Check self.init_assertions() # Quit pygame.quit() # All modules have quit self.not_init_assertions() def todo_test_segfault(self): # __doc__ (as of 2008-08-02) for pygame.base.segfault: # crash self.fail() if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/__main__.py0000644000175000017500000000746011210364057017322 0ustar vincentvincent"""Load and run the Pygame test suite python -c "import pygame.tests.go" [] or python test/go.py [] Command line option --help displays a command line usage message. run_tests.py in the main distribution directory is an alternative to test.go """ import sys if __name__ == '__main__': import os pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils.run_tests import run from pygame.tests.test_utils.test_runner import opt_parser else: from test.test_utils.run_tests import run from test.test_utils.test_runner import opt_parser if is_pygame_pkg: test_pkg_name = "pygame.tests" else: test_pkg_name = "test" program_name = sys.argv[0] if program_name == '-c': program_name = 'python -c "import %s.go"' % test_pkg_name ########################################################################### # Set additional command line options # # Defined in test_runner.py as it shares options, added to here opt_parser.set_usage(""" Runs all or some of the %(pkg)s.xxxx_test tests. $ %(exec)s sprite threads -sd Runs the sprite and threads module tests isolated in subprocesses, dumping all failing tests info in the form of a dict. """ % {'pkg': test_pkg_name, 'exec': program_name}) opt_parser.add_option ( "-d", "--dump", action = 'store_true', help = "dump failures/errors as dict ready to eval" ) opt_parser.add_option ( "-F", "--file", help = "dump failures/errors to a file" ) opt_parser.add_option ( "-a", "--all", action = 'store_true', help = "dump all results not just errors eg. -da" ) opt_parser.add_option ( "-m", "--multi_thread", metavar = 'THREADS', type = 'int', help = "run subprocessed tests in x THREADS" ) opt_parser.add_option ( "-t", "--time_out", metavar = 'SECONDS', type = 'int', help = "kill stalled subprocessed tests after SECONDS" ) opt_parser.add_option ( "-f", "--fake", metavar = "DIR", help = "run fake tests in run_tests__tests/$DIR" ) opt_parser.add_option ( "-p", "--python", metavar = "PYTHON", help = "path to python excutable to run subproccesed tests\n" "default (sys.executable): %s" % sys.executable) opt_parser.add_option ( "-I", "--interactive", action = 'store_true', help = "include tests requiring user input") ########################################################################### # Set run() keyword arguements according to command line arguemnts. # args will be the test module list, passed as positional argumemts. options, args = opt_parser.parse_args() kwds = {} if options.incomplete: kwds['incomplete'] = True if options.nosubprocess: kwds['nosubprocess'] = True if options.dump: kwds['dump'] = True if options.file: kwds['file'] = options.file kwds['timings'] = options.timings if options.exclude: kwds['exclude'] = options.exclude if options.show_output: kwds['show_output'] = True if options.all: kwds['all'] = True if options.randomize: kwds['randomize'] = True if options.seed is not None: kwds['seed'] = options.seed if options.multi_thread is not None: kwds['multi_thread'] = options.multi_thread if options.time_out is not None: kwds['time_out'] = options.time_out if options.fake: kwds['fake'] = options.fake if options.python: kwds['python'] = options.python if options.interactive: kwds['interactive'] = True ########################################################################### # Run the test suite. run(*args, **kwds) pygame-1.9.1release/test/__init__.py0000644000175000017500000000237111211102014017315 0ustar vincentvincent"""Pygame unit test suite package Exports function run() A quick way to run the test suite package from the command line is by importing the go submodule: python -m "import pygame.tests" [] Command line option --help displays a usage message. Available options correspond to the pygame.tests.run arguments. The xxxx_test submodules of the tests package are unit test suites for individual parts of Pygame. Each can also be run as a main program. This is useful if the test, such as cdrom_test, is interactive. For Pygame development the test suite can be run from a Pygame distribution root directory using run_tests.py. Alternately, test/__main__.py can be run directly. """ if __name__ == 'pygame.tests': from pygame.tests.test_utils.run_tests import run elif __name__ == '__main__': import os import sys pkg_dir = os.path.split(os.path.abspath(__file__))[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) if is_pygame_pkg: import pygame.tests.__main__ else: import test.__main__ else: from test.test_utils.run_tests import run pygame-1.9.1release/src/transform.doc0000644000175000017500000001730411206423535017542 0ustar vincentvincentpygame.transform pygame module to transform surfaces A Surface transform is an operation that moves or resizes the pixels. All these functions take a Surface to operate on and return a new Surface with the results. Some of the transforms are considered destructive. These means every time they are performed they lose pixel data. Common examples of this are resizing and rotating. For this reason, it is better to retransform the original surface than to keep transforming an image multiple times. (For example, suppose you are animating a bouncing spring which expands and contracts. If you applied the size changes incrementally to the previous images, you would lose detail. Instead, always begin with the original image and scale to the desired size.)
    flip flip vertically and horizontally pygame.transform.flip(Surface, xbool, ybool): return Surface This can flip a Surface either vertically, horizontally, or both. Flipping a Surface is nondestructive and returns a new Surface with the same dimensions. scale resize to new resolution pygame.transform.scale(Surface, (width, height), DestSurface = None): return Surface Resizes the Surface to a new resolution. This is a fast scale operation that does not sample the results. An optional destination surface can be used, rather than have it create a new one. This is quicker if you want to repeatedly scale something. However the destination must be the same size as the (width, height) passed in. Also the destination surface must be the same format. rotate rotate an image pygame.transform.rotate(Surface, angle): return Surface Unfiltered counterclockwise rotation. The angle argument represents degrees and can be any floating point value. Negative angle amounts will rotate clockwise. Unless rotating by 90 degree increments, the image will be padded larger to hold the new size. If the image has pixel alphas, the padded area will be transparent. Otherwise pygame will pick a color that matches the Surface colorkey or the topleft pixel value. rotozoom filtered scale and rotation pygame.transform.rotozoom(Surface, angle, scale): return Surface This is a combined scale and rotation transform. The resulting Surface will be a filtered 32-bit Surface. The scale argument is a floating point value that will be multiplied by the current resolution. The angle argument is a floating point value that represents the counterclockwise degrees to rotate. A negative rotation angle will rotate clockwise. scale2x specialized image doubler pygame.transform.scale2x(Surface, DestSurface = None): Surface This will return a new image that is double the size of the original. It uses the AdvanceMAME Scale2X algorithm which does a 'jaggie-less' scale of bitmap graphics. This really only has an effect on simple images with solid colors. On photographic and antialiased images it will look like a regular unfiltered scale. An optional destination surface can be used, rather than have it create a new one. This is quicker if you want to repeatedly scale something. However the destination must be twice the size of the source surface passed in. Also the destination surface must be the same format. smoothscale scale a surface to an arbitrary size smoothly pygame.transform.smoothscale(Surface, (width, height), DestSurface = None): return Surface Uses one of two different algorithms for scaling each dimension of the input surface as required. For shrinkage, the output pixels are area averages of the colors they cover. For expansion, a bilinear filter is used. For the amd64 and i686 architectures, optimized MMX routines are included and will run much faster than other machine types. The size is a 2 number sequence for (width, height). This function only works for 24-bit or 32-bit surfaces. An exception will be thrown if the input surface bit depth is less than 24. New in pygame 1.8 get_smoothscale_backend return smoothscale filter version in use: 'GENERIC', 'MMX', or 'SSE' pygame.transform.get_smoothscale_backend(): return String Shows whether or not smoothscale is using MMX or SSE acceleration. If no acceleration is available then "GENERIC" is returned. For a x86 processor the level of acceleration to use is determined at runtime. This function is provided for Pygame testing and debugging. set_smoothscale_backend set smoothscale filter version to one of: 'GENERIC', 'MMX', or 'SSE' pygame.transform.get_smoothscale_backend(type): return None Sets smoothscale acceleration. Takes a string argument. A value of 'GENERIC' turns off acceleration. 'MMX' uses MMX instructions only. 'SSE' allows SSE extensions as well. A value error is raised if type is not recognized or not supported by the current processor. This function is provided for Pygame testing and debugging. If smoothscale causes an invalid instruction error then it is a Pygame/SDL bug that should be reported. Use this function as a temporary fix only. chop gets a copy of an image with an interior area removed pygame.transform.chop(Surface, rect): return Surface Extracts a portion of an image. All vertical and horizontal pixels surrounding the given rectangle area are removed. The corner areas (diagonal to the rect) are then brought together. (The original image is not altered by this operation.) NOTE: If you want a "crop" that returns the part of an image within a rect, you can blit with a rect to a new surface or copy a subsurface. laplacian find edges in a surface pygame.transform.laplacian(Surface, DestSurface = None): return Surface Finds the edges in a surface using the laplacian algorithm. New in pygame 1.8 average_surfaces find the average surface from many surfaces. pygame.transform.average_surfaces(Surfaces, DestSurface = None, palette_colors = 1): return Surface Takes a sequence of surfaces and returns a surface with average colors from each of the surfaces. palette_colors - if true we average the colors in palette, otherwise we average the pixel values. This is useful if the surface is actually greyscale colors, and not palette colors. Note, this function currently does not handle palette using surfaces correctly. New in pygame 1.8 palette_colors argument new in pygame 1.9 average_color finds the average color of a surface pygame.transform.average_color(Surface, Rect = None): return Color Finds the average color of a Surface or a region of a surface specified by a Rect, and returns it as a Color. threshold finds which, and how many pixels in a surface are within a threshold of a color. pygame.transform.threshold(DestSurface, Surface, color, threshold = (0,0,0,0), diff_color = (0,0,0,0), change_return = 1, Surface = None, inverse = False): return num_threshold_pixels Finds which, and how many pixels in a surface are within a threshold of a color. It can set the destination surface where all of the pixels not within the threshold are changed to diff_color. If inverse is optionally set to True, the pixels that are within the threshold are instead changed to diff_color. If the optional second surface is given, it is used to threshold against rather than the specified color. That is, it will find each pixel in the first Surface that is within the threshold of the pixel at the same coordinates of the second Surface. If change_return is set to 0, it can be used to just count the number of pixels within the threshold if you set If change_return is set to 1, the pixels set in DestSurface will be those from the color. If change_return is set to 2, the pixels set in DestSurface will be those from the first Surface. You can use a threshold of (r,g,b,a) where the r,g,b can have different thresholds. So you could use an r threshold of 40 and a blue threshold of 2 if you like. New in pygame 1.8 pygame-1.9.1release/src/transform.c0000644000175000017500000025570011207055754017230 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners Copyright (C) 2007 Rene Dudfield, Richard Goedeken This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* * surface transformations for pygame */ #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" #include #include #include "scale.h" typedef void (* SMOOTHSCALE_FILTER_P)(Uint8 *, Uint8 *, int, int, int, int, int); struct _module_state { const char *filter_type; SMOOTHSCALE_FILTER_P filter_shrink_X; SMOOTHSCALE_FILTER_P filter_shrink_Y; SMOOTHSCALE_FILTER_P filter_expand_X; SMOOTHSCALE_FILTER_P filter_expand_Y; }; #if defined(SCALE_MMX_SUPPORT) #include #if PY3 #define GETSTATE(m) PY3_GETSTATE (_module_state, m) #else static struct _module_state _state = {0, 0, 0, 0, 0}; #define GETSTATE(m) PY2_GETSTATE (_state) #endif #else /* if defined(SCALE_MMX_SUPPORT) */ static void filter_shrink_X_ONLYC(Uint8 *, Uint8 *, int, int, int, int, int); static void filter_shrink_Y_ONLYC(Uint8 *, Uint8 *, int, int, int, int, int); static void filter_expand_X_ONLYC(Uint8 *, Uint8 *, int, int, int, int, int); static void filter_expand_Y_ONLYC(Uint8 *, Uint8 *, int, int, int, int, int); static struct _module_state _state = { "GENERIC", filter_shrink_X_ONLYC, filter_shrink_Y_ONLYC, filter_expand_X_ONLYC, filter_expand_Y_ONLYC}; #define GETSTATE(m) PY2_GETSTATE (_state) #define smoothscale_init(st) #endif /* if defined(SCALE_MMX_SUPPORT) */ void scale2x (SDL_Surface *src, SDL_Surface *dst); extern SDL_Surface* rotozoomSurface (SDL_Surface *src, double angle, double zoom, int smooth); static SDL_Surface* newsurf_fromsurf (SDL_Surface* surf, int width, int height) { SDL_Surface* newsurf; int result; if (surf->format->BytesPerPixel <= 0 || surf->format->BytesPerPixel > 4) return (SDL_Surface*) (RAISE (PyExc_ValueError, "unsupport Surface bit depth for transform")); newsurf = SDL_CreateRGBSurface (surf->flags, width, height, surf->format->BitsPerPixel, surf->format->Rmask, surf->format->Gmask, surf->format->Bmask, surf->format->Amask); if (!newsurf) return (SDL_Surface*) (RAISE (PyExc_SDLError, SDL_GetError ())); /* Copy palette, colorkey, etc info */ if (surf->format->BytesPerPixel==1 && surf->format->palette) SDL_SetColors (newsurf, surf->format->palette->colors, 0, surf->format->palette->ncolors); if (surf->flags & SDL_SRCCOLORKEY) SDL_SetColorKey (newsurf, (surf->flags&SDL_RLEACCEL) | SDL_SRCCOLORKEY, surf->format->colorkey); if (surf->flags&SDL_SRCALPHA) { result = SDL_SetAlpha (newsurf, surf->flags, surf->format->alpha); if (result == -1) return (SDL_Surface*) (RAISE (PyExc_SDLError, SDL_GetError ())); } return newsurf; } static SDL_Surface* rotate90 (SDL_Surface *src, int angle) { int numturns = (angle / 90) % 4; int dstwidth, dstheight; SDL_Surface* dst; char *srcpix, *dstpix, *srcrow, *dstrow; int srcstepx, srcstepy, dststepx, dststepy; int loopx, loopy; if (numturns < 0) numturns = 4 + numturns; if (!(numturns % 2)) { dstwidth = src->w; dstheight = src->h; } else { dstwidth = src->h; dstheight = src->w; } dst = newsurf_fromsurf (src, dstwidth, dstheight); if (!dst) return NULL; SDL_LockSurface (dst); srcrow = (char*) src->pixels; dstrow = (char*) dst->pixels; srcstepx = dststepx = src->format->BytesPerPixel; srcstepy = src->pitch; dststepy = dst->pitch; switch (numturns) { /*case 0: we don't need to change anything*/ case 1: srcrow += ((src->w - 1) * srcstepx); srcstepy = -srcstepx; srcstepx = src->pitch; break; case 2: srcrow += ((src->h - 1) * srcstepy) + ((src->w - 1) * srcstepx); srcstepx = -srcstepx; srcstepy = -srcstepy; break; case 3: srcrow += ((src->h - 1) * srcstepy); srcstepx = -srcstepy; srcstepy = src->format->BytesPerPixel; break; } switch (src->format->BytesPerPixel) { case 1: for (loopy = 0; loopy < dstheight; ++loopy) { dstpix = dstrow; srcpix = srcrow; for (loopx = 0; loopx < dstwidth; ++loopx) { *dstpix = *srcpix; srcpix += srcstepx; dstpix += dststepx; } dstrow += dststepy; srcrow += srcstepy; } break; case 2: for (loopy = 0; loopy < dstheight; ++loopy) { dstpix = dstrow; srcpix = srcrow; for (loopx = 0; loopx < dstwidth; ++loopx) { *(Uint16*)dstpix = *(Uint16*)srcpix; srcpix += srcstepx; dstpix += dststepx; } dstrow += dststepy; srcrow += srcstepy; } break; case 3: for (loopy = 0; loopy < dstheight; ++loopy) { dstpix = dstrow; srcpix = srcrow; for (loopx = 0; loopx < dstwidth; ++loopx) { dstpix[0] = srcpix[0]; dstpix[1] = srcpix[1]; dstpix[2] = srcpix[2]; srcpix += srcstepx; dstpix += dststepx; } dstrow += dststepy; srcrow += srcstepy; } break; case 4: for (loopy = 0; loopy < dstheight; ++loopy) { dstpix = dstrow; srcpix = srcrow; for (loopx = 0; loopx < dstwidth; ++loopx) { *(Uint32*)dstpix = *(Uint32*)srcpix; srcpix += srcstepx; dstpix += dststepx; } dstrow += dststepy; srcrow += srcstepy; } break; } SDL_UnlockSurface (dst); return dst; } static void rotate (SDL_Surface *src, SDL_Surface *dst, Uint32 bgcolor, double sangle, double cangle) { int x, y, dx, dy; Uint8 *srcpix = (Uint8*) src->pixels; Uint8 *dstrow = (Uint8*) dst->pixels; int srcpitch = src->pitch; int dstpitch = dst->pitch; int cy = dst->h / 2; int xd = ((src->w - dst->w) << 15); int yd = ((src->h - dst->h) << 15); int isin = (int)(sangle * 65536); int icos = (int)(cangle * 65536); int ax = ((dst->w) << 15) - (int)(cangle * ((dst->w - 1) << 15)); int ay = ((dst->h) << 15) - (int)(sangle * ((dst->w - 1) << 15)); int xmaxval = ((src->w) << 16) - 1; int ymaxval = ((src->h) << 16) - 1; switch (src->format->BytesPerPixel) { case 1: for (y = 0; y < dst->h; y++) { Uint8 *dstpos = (Uint8*)dstrow; dx = (ax + (isin * (cy - y))) + xd; dy = (ay - (icos * (cy - y))) + yd; for (x = 0; x < dst->w; x++) { if(dx < 0 || dy < 0 || dx > xmaxval || dy > ymaxval) *dstpos++ = bgcolor; else *dstpos++ = *(Uint8*) (srcpix + ((dy >> 16) * srcpitch) + (dx >> 16)); dx += icos; dy += isin; } dstrow += dstpitch; } break; case 2: for (y = 0; y < dst->h; y++) { Uint16 *dstpos = (Uint16*)dstrow; dx = (ax + (isin * (cy - y))) + xd; dy = (ay - (icos * (cy - y))) + yd; for (x = 0; x < dst->w; x++) { if (dx < 0 || dy < 0 || dx > xmaxval || dy > ymaxval) *dstpos++ = bgcolor; else *dstpos++ = *(Uint16*) (srcpix + ((dy >> 16) * srcpitch) + (dx >> 16 << 1)); dx += icos; dy += isin; } dstrow += dstpitch; } break; case 4: for (y = 0; y < dst->h; y++) { Uint32 *dstpos = (Uint32*)dstrow; dx = (ax + (isin * (cy - y))) + xd; dy = (ay - (icos * (cy - y))) + yd; for (x = 0; x < dst->w; x++) { if (dx < 0 || dy < 0 || dx > xmaxval || dy > ymaxval) *dstpos++ = bgcolor; else *dstpos++ = *(Uint32*) (srcpix + ((dy >> 16) * srcpitch) + (dx >> 16 << 2)); dx += icos; dy += isin; } dstrow += dstpitch; } break; default: /*case 3:*/ for (y = 0; y < dst->h; y++) { Uint8 *dstpos = (Uint8*)dstrow; dx = (ax + (isin * (cy - y))) + xd; dy = (ay - (icos * (cy - y))) + yd; for (x = 0; x < dst->w; x++) { if (dx < 0 || dy < 0 || dx > xmaxval || dy > ymaxval) { dstpos[0] = ((Uint8*) &bgcolor)[0]; dstpos[1] = ((Uint8*) &bgcolor)[1]; dstpos[2] = ((Uint8*) &bgcolor)[2]; dstpos += 3; } else { Uint8* srcpos = (Uint8*) (srcpix + ((dy >> 16) * srcpitch) + ((dx >> 16) * 3)); dstpos[0] = srcpos[0]; dstpos[1] = srcpos[1]; dstpos[2] = srcpos[2]; dstpos += 3; } dx += icos; dy += isin; } dstrow += dstpitch; } break; } } static void stretch (SDL_Surface *src, SDL_Surface *dst) { int looph, loopw; Uint8* srcrow = (Uint8*) src->pixels; Uint8* dstrow = (Uint8*) dst->pixels; int srcpitch = src->pitch; int dstpitch = dst->pitch; int dstwidth = dst->w; int dstheight = dst->h; int dstwidth2 = dst->w << 1; int dstheight2 = dst->h << 1; int srcwidth2 = src->w << 1; int srcheight2 = src->h << 1; int w_err, h_err = srcheight2 - dstheight2; switch (src->format->BytesPerPixel) { case 1: for (looph = 0; looph < dstheight; ++looph) { Uint8 *srcpix = (Uint8*)srcrow, *dstpix = (Uint8*)dstrow; w_err = srcwidth2 - dstwidth2; for (loopw = 0; loopw < dstwidth; ++ loopw) { *dstpix++ = *srcpix; while (w_err >= 0) { ++srcpix; w_err -= dstwidth2; } w_err += srcwidth2; } while (h_err >= 0) { srcrow += srcpitch; h_err -= dstheight2; } dstrow += dstpitch; h_err += srcheight2; } break; case 2: for (looph = 0; looph < dstheight; ++looph) { Uint16 *srcpix = (Uint16*)srcrow, *dstpix = (Uint16*)dstrow; w_err = srcwidth2 - dstwidth2; for (loopw = 0; loopw < dstwidth; ++ loopw) { *dstpix++ = *srcpix; while (w_err >= 0) { ++srcpix; w_err -= dstwidth2; } w_err += srcwidth2; } while (h_err >= 0) { srcrow += srcpitch; h_err -= dstheight2; } dstrow += dstpitch; h_err += srcheight2; } break; case 3: for (looph = 0; looph < dstheight; ++looph) { Uint8 *srcpix = (Uint8*)srcrow, *dstpix = (Uint8*)dstrow; w_err = srcwidth2 - dstwidth2; for (loopw = 0; loopw < dstwidth; ++ loopw) { dstpix[0] = srcpix[0]; dstpix[1] = srcpix[1]; dstpix[2] = srcpix[2]; dstpix += 3; while (w_err >= 0) { srcpix+=3; w_err -= dstwidth2; } w_err += srcwidth2; } while (h_err >= 0) { srcrow += srcpitch; h_err -= dstheight2; } dstrow += dstpitch; h_err += srcheight2; } break; default: /*case 4:*/ for (looph = 0; looph < dstheight; ++looph) { Uint32 *srcpix = (Uint32*)srcrow, *dstpix = (Uint32*)dstrow; w_err = srcwidth2 - dstwidth2; for (loopw = 0; loopw < dstwidth; ++ loopw) { *dstpix++ = *srcpix; while (w_err >= 0) { ++srcpix; w_err -= dstwidth2; } w_err += srcwidth2; } while (h_err >= 0) { srcrow += srcpitch; h_err -= dstheight2; } dstrow += dstpitch; h_err += srcheight2; } break; } } static PyObject* surf_scale (PyObject* self, PyObject* arg) { PyObject *surfobj, *surfobj2; SDL_Surface* surf, *newsurf; int width, height; surfobj2 = NULL; /*get all the arguments*/ if (!PyArg_ParseTuple (arg, "O!(ii)|O!", &PySurface_Type, &surfobj, &width, &height, &PySurface_Type, &surfobj2)) return NULL; if (width < 0 || height < 0) return RAISE (PyExc_ValueError, "Cannot scale to negative size"); surf = PySurface_AsSurface (surfobj); if (!surfobj2) { newsurf = newsurf_fromsurf (surf, width, height); if (!newsurf) return NULL; } else newsurf = PySurface_AsSurface (surfobj2); /* check to see if the size is twice as big. */ if (newsurf->w != width || newsurf->h != height) return RAISE (PyExc_ValueError, "Destination surface not the given width or height."); /* check to see if the format of the surface is the same. */ if (surf->format->BytesPerPixel != newsurf->format->BytesPerPixel) return RAISE (PyExc_ValueError, "Source and destination surfaces need the same format."); if (width && height) { SDL_LockSurface (newsurf); PySurface_Lock (surfobj); Py_BEGIN_ALLOW_THREADS; stretch (surf, newsurf); Py_END_ALLOW_THREADS; PySurface_Unlock (surfobj); SDL_UnlockSurface (newsurf); } if (surfobj2) { Py_INCREF (surfobj2); return surfobj2; } else return PySurface_New (newsurf); } static PyObject* surf_scale2x (PyObject* self, PyObject* arg) { PyObject *surfobj, *surfobj2; SDL_Surface *surf; SDL_Surface *newsurf; int width, height; surfobj2 = NULL; /*get all the arguments*/ if (!PyArg_ParseTuple (arg, "O!|O!", &PySurface_Type, &surfobj, &PySurface_Type, &surfobj2)) return NULL; surf = PySurface_AsSurface (surfobj); /* if the second surface is not there, then make a new one. */ if (!surfobj2) { width = surf->w * 2; height = surf->h * 2; newsurf = newsurf_fromsurf (surf, width, height); if (!newsurf) return NULL; } else newsurf = PySurface_AsSurface (surfobj2); /* check to see if the size is twice as big. */ if (newsurf->w != (surf->w * 2) || newsurf->h != (surf->h * 2)) return RAISE (PyExc_ValueError, "Destination surface not 2x bigger."); /* check to see if the format of the surface is the same. */ if (surf->format->BytesPerPixel != newsurf->format->BytesPerPixel) return RAISE (PyExc_ValueError, "Source and destination surfaces need the same format."); SDL_LockSurface (newsurf); SDL_LockSurface (surf); Py_BEGIN_ALLOW_THREADS; scale2x (surf, newsurf); Py_END_ALLOW_THREADS; SDL_UnlockSurface (surf); SDL_UnlockSurface (newsurf); if (surfobj2) { Py_INCREF (surfobj2); return surfobj2; } else return PySurface_New (newsurf); } static PyObject* surf_rotate (PyObject* self, PyObject* arg) { PyObject *surfobj; SDL_Surface* surf, *newsurf; float angle; double radangle, sangle, cangle; double x, y, cx, cy, sx, sy; int nxmax,nymax; Uint32 bgcolor; /*get all the arguments*/ if (!PyArg_ParseTuple (arg, "O!f", &PySurface_Type, &surfobj, &angle)) return NULL; surf = PySurface_AsSurface (surfobj); if (surf->format->BytesPerPixel <= 0 || surf->format->BytesPerPixel > 4) return RAISE (PyExc_ValueError, "unsupport Surface bit depth for transform"); if ( !( fmod((double)angle, (double)90.0f) ) ) { PySurface_Lock (surfobj); Py_BEGIN_ALLOW_THREADS; newsurf = rotate90 (surf, (int) angle); Py_END_ALLOW_THREADS; PySurface_Unlock (surfobj); if (!newsurf) return NULL; return PySurface_New (newsurf); } radangle = angle*.01745329251994329; sangle = sin (radangle); cangle = cos (radangle); x = surf->w; y = surf->h; cx = cangle*x; cy = cangle*y; sx = sangle*x; sy = sangle*y; nxmax = (int) (MAX (MAX (MAX (fabs (cx + sy), fabs (cx - sy)), fabs (-cx + sy)), fabs (-cx - sy))); nymax = (int) (MAX (MAX (MAX (fabs (sx + cy), fabs (sx - cy)), fabs (-sx + cy)), fabs (-sx - cy))); newsurf = newsurf_fromsurf (surf, nxmax, nymax); if (!newsurf) return NULL; /* get the background color */ if (surf->flags & SDL_SRCCOLORKEY) bgcolor = surf->format->colorkey; else { SDL_LockSurface (surf); switch (surf->format->BytesPerPixel) { case 1: bgcolor = *(Uint8*) surf->pixels; break; case 2: bgcolor = *(Uint16*) surf->pixels; break; case 4: bgcolor = *(Uint32*) surf->pixels; break; default: /*case 3:*/ #if SDL_BYTEORDER == SDL_LIL_ENDIAN bgcolor = (((Uint8*) surf->pixels)[0]) + (((Uint8*) surf->pixels)[1] << 8) + (((Uint8*) surf->pixels)[2] << 16); #else bgcolor = (((Uint8*) surf->pixels)[2]) + (((Uint8*) surf->pixels)[1] << 8) + (((Uint8*) surf->pixels)[0] << 16); #endif } SDL_UnlockSurface (surf); bgcolor &= ~surf->format->Amask; } SDL_LockSurface (newsurf); PySurface_Lock (surfobj); Py_BEGIN_ALLOW_THREADS; rotate (surf, newsurf, bgcolor, sangle, cangle); Py_END_ALLOW_THREADS; PySurface_Unlock (surfobj); SDL_UnlockSurface (newsurf); return PySurface_New (newsurf); } static PyObject* surf_flip (PyObject* self, PyObject* arg) { PyObject *surfobj; SDL_Surface* surf, *newsurf; int xaxis, yaxis; int loopx, loopy; int pixsize, srcpitch, dstpitch; Uint8 *srcpix, *dstpix; /*get all the arguments*/ if (!PyArg_ParseTuple (arg, "O!ii", &PySurface_Type, &surfobj, &xaxis, &yaxis)) return NULL; surf = PySurface_AsSurface (surfobj); newsurf = newsurf_fromsurf (surf, surf->w, surf->h); if (!newsurf) return NULL; pixsize = surf->format->BytesPerPixel; srcpitch = surf->pitch; dstpitch = newsurf->pitch; SDL_LockSurface (newsurf); PySurface_Lock (surfobj); srcpix = (Uint8*) surf->pixels; dstpix = (Uint8*) newsurf->pixels; Py_BEGIN_ALLOW_THREADS; if (!xaxis) { if (!yaxis) { for (loopy = 0; loopy < surf->h; ++loopy) memcpy (dstpix + loopy * dstpitch, srcpix + loopy * srcpitch, surf->w * surf->format->BytesPerPixel); } else { for (loopy = 0; loopy < surf->h; ++loopy) memcpy (dstpix + loopy * dstpitch, srcpix + (surf->h - 1 - loopy) * srcpitch, surf->w * surf->format->BytesPerPixel); } } else /*if (xaxis)*/ { if (yaxis) { switch (surf->format->BytesPerPixel) { case 1: for (loopy = 0; loopy < surf->h; ++loopy) { Uint8* dst = (Uint8*) (dstpix + loopy * dstpitch); Uint8* src = ((Uint8*) (srcpix + (surf->h - 1 - loopy) * srcpitch)) + surf->w - 1; for (loopx = 0; loopx < surf->w; ++loopx) *dst++ = *src--; } break; case 2: for (loopy = 0; loopy < surf->h; ++loopy) { Uint16* dst = (Uint16*) (dstpix + loopy * dstpitch); Uint16* src = ((Uint16*) (srcpix + (surf->h - 1 - loopy) * srcpitch)) + surf->w - 1; for (loopx = 0; loopx < surf->w; ++loopx) *dst++ = *src--; } break; case 4: for (loopy = 0; loopy < surf->h; ++loopy) { Uint32* dst = (Uint32*) (dstpix + loopy * dstpitch); Uint32* src = ((Uint32*) (srcpix + (surf->h - 1 - loopy) * srcpitch)) + surf->w - 1; for (loopx = 0; loopx < surf->w; ++loopx) *dst++ = *src--; } break; case 3: for (loopy = 0; loopy < surf->h; ++loopy) { Uint8* dst = (Uint8*) (dstpix + loopy * dstpitch); Uint8* src = ((Uint8*) (srcpix + (surf->h - 1 - loopy) * srcpitch)) + surf->w * 3 - 3; for (loopx = 0; loopx < surf->w; ++loopx) { dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2]; dst += 3; src -= 3; } } break; } } else { switch (surf->format->BytesPerPixel) { case 1: for (loopy = 0; loopy < surf->h; ++loopy) { Uint8* dst = (Uint8*) (dstpix + loopy * dstpitch); Uint8* src = ((Uint8*) (srcpix + loopy * srcpitch)) + surf->w - 1; for (loopx = 0; loopx < surf->w; ++loopx) *dst++ = *src--; } break; case 2: for (loopy = 0; loopy < surf->h; ++loopy) { Uint16* dst = (Uint16*) (dstpix + loopy * dstpitch); Uint16* src = ((Uint16*) (srcpix + loopy * srcpitch)) + surf->w - 1; for (loopx = 0; loopx < surf->w; ++loopx) *dst++ = *src--; } break; case 4: for (loopy = 0; loopy < surf->h; ++loopy) { Uint32* dst = (Uint32*) (dstpix + loopy * dstpitch); Uint32* src = ((Uint32*) (srcpix + loopy * srcpitch)) + surf->w - 1; for (loopx = 0; loopx < surf->w; ++loopx) *dst++ = *src--; } break; case 3: for (loopy = 0; loopy < surf->h; ++loopy) { Uint8* dst = (Uint8*) (dstpix + loopy * dstpitch); Uint8* src = ((Uint8*) (srcpix + loopy * srcpitch)) + surf->w * 3 - 3; for (loopx = 0; loopx < surf->w; ++loopx) { dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2]; dst += 3; src -= 3; } } break; } } } Py_END_ALLOW_THREADS; PySurface_Unlock (surfobj); SDL_UnlockSurface (newsurf); return PySurface_New (newsurf); } static PyObject* surf_rotozoom (PyObject* self, PyObject* arg) { PyObject *surfobj; SDL_Surface *surf, *newsurf, *surf32; float scale, angle; /*get all the arguments*/ if (!PyArg_ParseTuple (arg, "O!ff", &PySurface_Type, &surfobj, &angle, &scale)) return NULL; surf = PySurface_AsSurface (surfobj); if (scale == 0.0) { newsurf = newsurf_fromsurf (surf, surf->w, surf->h); return PySurface_New (newsurf); } if (surf->format->BitsPerPixel == 32) { surf32 = surf; PySurface_Lock (surfobj); } else { Py_BEGIN_ALLOW_THREADS; surf32 = SDL_CreateRGBSurface (SDL_SWSURFACE, surf->w, surf->h, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000); SDL_BlitSurface (surf, NULL, surf32, NULL); Py_END_ALLOW_THREADS; } Py_BEGIN_ALLOW_THREADS; newsurf = rotozoomSurface (surf32, angle, scale, 1); Py_END_ALLOW_THREADS; if (surf32 == surf) PySurface_Unlock (surfobj); else SDL_FreeSurface (surf32); return PySurface_New (newsurf); } static SDL_Surface* chop (SDL_Surface *src, int x, int y, int width, int height) { SDL_Surface* dst; int dstwidth,dstheight; char *srcpix, *dstpix, *srcrow, *dstrow; int srcstepx, srcstepy, dststepx, dststepy; int loopx,loopy; if ((x + width) > src->w) width = src->w - x; if ((y + height) > src->h) height=src->h - y; if (x < 0) { width -= (-x); x = 0; } if (y < 0) { height -= (-y); y = 0; } dstwidth = src->w-width; dstheight = src->h-height; dst = newsurf_fromsurf (src,dstwidth,dstheight); if (!dst) return NULL; SDL_LockSurface (dst); srcrow = (char*) src->pixels; dstrow = (char*) dst->pixels; srcstepx = dststepx = src->format->BytesPerPixel; srcstepy = src->pitch; dststepy = dst->pitch; for (loopy = 0; loopy < src->h; loopy++) { if ((loopy < y) || (loopy >= (y + height))) { dstpix = dstrow; srcpix = srcrow; for (loopx = 0; loopx < src->w; loopx++) { if ((loopx < x) || (loopx >= (x + width))) { switch (src->format->BytesPerPixel) { case 1: *dstpix = *srcpix; break; case 2: *(Uint16*) dstpix = *(Uint16*) srcpix; break; case 3: dstpix[0] = srcpix[0]; dstpix[1] = srcpix[1]; dstpix[2] = srcpix[2]; break; case 4: *(Uint32*) dstpix = *(Uint32*) srcpix; break; } dstpix += dststepx; } srcpix += srcstepx; } dstrow += dststepy; } srcrow += srcstepy; } SDL_UnlockSurface (dst); return dst; } static PyObject* surf_chop (PyObject* self, PyObject* arg) { PyObject *surfobj, *rectobj; SDL_Surface* surf, *newsurf; GAME_Rect* rect, temp; if (!PyArg_ParseTuple (arg, "O!O", &PySurface_Type, &surfobj, &rectobj)) return NULL; if (!(rect = GameRect_FromObject (rectobj, &temp))) return RAISE (PyExc_TypeError, "Rect argument is invalid"); surf=PySurface_AsSurface (surfobj); Py_BEGIN_ALLOW_THREADS; newsurf = chop (surf, rect->x, rect->y, rect->w, rect->h); Py_END_ALLOW_THREADS; return PySurface_New (newsurf); } /* * smooth scale functions. */ /* this function implements an area-averaging shrinking filter in the X-dimension */ static void filter_shrink_X_ONLYC(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, int dstpitch, int srcwidth, int dstwidth) { int srcdiff = srcpitch - (srcwidth * 4); int dstdiff = dstpitch - (dstwidth * 4); int x, y; int xspace = 0x10000 * srcwidth / dstwidth; /* must be > 1 */ int xrecip = (int) (0x100000000LL / xspace); for (y = 0; y < height; y++) { Uint16 accumulate[4] = {0,0,0,0}; int xcounter = xspace; for (x = 0; x < srcwidth; x++) { if (xcounter > 0x10000) { accumulate[0] += (Uint16) *srcpix++; accumulate[1] += (Uint16) *srcpix++; accumulate[2] += (Uint16) *srcpix++; accumulate[3] += (Uint16) *srcpix++; xcounter -= 0x10000; } else { int xfrac = 0x10000 - xcounter; /* write out a destination pixel */ *dstpix++ = (Uint8) (((accumulate[0] + ((srcpix[0] * xcounter) >> 16)) * xrecip) >> 16); *dstpix++ = (Uint8) (((accumulate[1] + ((srcpix[1] * xcounter) >> 16)) * xrecip) >> 16); *dstpix++ = (Uint8) (((accumulate[2] + ((srcpix[2] * xcounter) >> 16)) * xrecip) >> 16); *dstpix++ = (Uint8) (((accumulate[3] + ((srcpix[3] * xcounter) >> 16)) * xrecip) >> 16); /* reload the accumulator with the remainder of this pixel */ accumulate[0] = (Uint16) ((*srcpix++ * xfrac) >> 16); accumulate[1] = (Uint16) ((*srcpix++ * xfrac) >> 16); accumulate[2] = (Uint16) ((*srcpix++ * xfrac) >> 16); accumulate[3] = (Uint16) ((*srcpix++ * xfrac) >> 16); xcounter = xspace - xfrac; } } srcpix += srcdiff; dstpix += dstdiff; } } /* this function implements an area-averaging shrinking filter in the Y-dimension */ static void filter_shrink_Y_ONLYC(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, int dstpitch, int srcheight, int dstheight) { Uint16 *templine; int srcdiff = srcpitch - (width * 4); int dstdiff = dstpitch - (width * 4); int x, y; int yspace = 0x10000 * srcheight / dstheight; /* must be > 1 */ int yrecip = (int) (0x100000000LL / yspace); int ycounter = yspace; /* allocate and clear a memory area for storing the accumulator line */ templine = (Uint16 *) malloc(dstpitch * 2); if (templine == NULL) return; memset(templine, 0, dstpitch * 2); for (y = 0; y < srcheight; y++) { Uint16 *accumulate = templine; if (ycounter > 0x10000) { for (x = 0; x < width; x++) { *accumulate++ += (Uint16) *srcpix++; *accumulate++ += (Uint16) *srcpix++; *accumulate++ += (Uint16) *srcpix++; *accumulate++ += (Uint16) *srcpix++; } ycounter -= 0x10000; } else { int yfrac = 0x10000 - ycounter; /* write out a destination line */ for (x = 0; x < width; x++) { *dstpix++ = (Uint8) (((*accumulate++ + ((*srcpix++ * ycounter) >> 16)) * yrecip) >> 16); *dstpix++ = (Uint8) (((*accumulate++ + ((*srcpix++ * ycounter) >> 16)) * yrecip) >> 16); *dstpix++ = (Uint8) (((*accumulate++ + ((*srcpix++ * ycounter) >> 16)) * yrecip) >> 16); *dstpix++ = (Uint8) (((*accumulate++ + ((*srcpix++ * ycounter) >> 16)) * yrecip) >> 16); } dstpix += dstdiff; /* reload the accumulator with the remainder of this line */ accumulate = templine; srcpix -= 4 * width; for (x = 0; x < width; x++) { *accumulate++ = (Uint16) ((*srcpix++ * yfrac) >> 16); *accumulate++ = (Uint16) ((*srcpix++ * yfrac) >> 16); *accumulate++ = (Uint16) ((*srcpix++ * yfrac) >> 16); *accumulate++ = (Uint16) ((*srcpix++ * yfrac) >> 16); } ycounter = yspace - yfrac; } srcpix += srcdiff; } /* for (int y = 0; y < srcheight; y++) */ /* free the temporary memory */ free(templine); } /* this function implements a bilinear filter in the X-dimension */ static void filter_expand_X_ONLYC(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, int dstpitch, int srcwidth, int dstwidth) { int dstdiff = dstpitch - (dstwidth * 4); int *xidx0, *xmult0, *xmult1; int x, y; int factorwidth = 4; /* Allocate memory for factors */ xidx0 = malloc(dstwidth * 4); if (xidx0 == NULL) return; xmult0 = (int *) malloc(dstwidth * factorwidth); xmult1 = (int *) malloc(dstwidth * factorwidth); if (xmult0 == NULL || xmult1 == NULL) { free(xidx0); if (xmult0) free(xmult0); if (xmult1) free(xmult1); } /* Create multiplier factors and starting indices and put them in arrays */ for (x = 0; x < dstwidth; x++) { xidx0[x] = x * (srcwidth - 1) / dstwidth; xmult1[x] = 0x10000 * ((x * (srcwidth - 1)) % dstwidth) / dstwidth; xmult0[x] = 0x10000 - xmult1[x]; } /* Do the scaling in raster order so we don't trash the cache */ for (y = 0; y < height; y++) { Uint8 *srcrow0 = srcpix + y * srcpitch; for (x = 0; x < dstwidth; x++) { Uint8 *src = srcrow0 + xidx0[x] * 4; int xm0 = xmult0[x]; int xm1 = xmult1[x]; *dstpix++ = (Uint8) (((src[0] * xm0) + (src[4] * xm1)) >> 16); *dstpix++ = (Uint8) (((src[1] * xm0) + (src[5] * xm1)) >> 16); *dstpix++ = (Uint8) (((src[2] * xm0) + (src[6] * xm1)) >> 16); *dstpix++ = (Uint8) (((src[3] * xm0) + (src[7] * xm1)) >> 16); } dstpix += dstdiff; } /* free memory */ free(xidx0); free(xmult0); free(xmult1); } /* this function implements a bilinear filter in the Y-dimension */ static void filter_expand_Y_ONLYC(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, int dstpitch, int srcheight, int dstheight) { int x, y; for (y = 0; y < dstheight; y++) { int yidx0 = y * (srcheight - 1) / dstheight; Uint8 *srcrow0 = srcpix + yidx0 * srcpitch; Uint8 *srcrow1 = srcrow0 + srcpitch; int ymult1 = 0x10000 * ((y * (srcheight - 1)) % dstheight) / dstheight; int ymult0 = 0x10000 - ymult1; for (x = 0; x < width; x++) { *dstpix++ = (Uint8) (((*srcrow0++ * ymult0) + (*srcrow1++ * ymult1)) >> 16); *dstpix++ = (Uint8) (((*srcrow0++ * ymult0) + (*srcrow1++ * ymult1)) >> 16); *dstpix++ = (Uint8) (((*srcrow0++ * ymult0) + (*srcrow1++ * ymult1)) >> 16); *dstpix++ = (Uint8) (((*srcrow0++ * ymult0) + (*srcrow1++ * ymult1)) >> 16); } } } #if defined(SCALE_MMX_SUPPORT) static void smoothscale_init (struct _module_state *st) { if (st->filter_shrink_X == 0) { if (SDL_HasSSE ()) { st->filter_type = "SSE"; st->filter_shrink_X = filter_shrink_X_SSE; st->filter_shrink_Y = filter_shrink_Y_SSE; st->filter_expand_X = filter_expand_X_SSE; st->filter_expand_Y = filter_expand_Y_SSE; } else if (SDL_HasMMX ()) { st->filter_type = "MMX"; st->filter_shrink_X = filter_shrink_X_MMX; st->filter_shrink_Y = filter_shrink_Y_MMX; st->filter_expand_X = filter_expand_X_MMX; st->filter_expand_Y = filter_expand_Y_MMX; } else { st->filter_type = "GENERIC"; st->filter_shrink_X = filter_shrink_X_ONLYC; st->filter_shrink_Y = filter_shrink_Y_ONLYC; st->filter_expand_X = filter_expand_X_ONLYC; st->filter_expand_Y = filter_expand_Y_ONLYC; } } } #endif static void convert_24_32(Uint8 *srcpix, int srcpitch, Uint8 *dstpix, int dstpitch, int width, int height) { int srcdiff = srcpitch - (width * 3); int dstdiff = dstpitch - (width * 4); int x, y; for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { *dstpix++ = *srcpix++; *dstpix++ = *srcpix++; *dstpix++ = *srcpix++; *dstpix++ = 0xff; } srcpix += srcdiff; dstpix += dstdiff; } } static void convert_32_24(Uint8 *srcpix, int srcpitch, Uint8 *dstpix, int dstpitch, int width, int height) { int srcdiff = srcpitch - (width * 4); int dstdiff = dstpitch - (width * 3); int x, y; for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { *dstpix++ = *srcpix++; *dstpix++ = *srcpix++; *dstpix++ = *srcpix++; srcpix++; } srcpix += srcdiff; dstpix += dstdiff; } } static void scalesmooth(SDL_Surface *src, SDL_Surface *dst, struct _module_state *st) { Uint8* srcpix = (Uint8*)src->pixels; Uint8* dstpix = (Uint8*)dst->pixels; Uint8* dst32 = NULL; int srcpitch = src->pitch; int dstpitch = dst->pitch; int srcwidth = src->w; int srcheight = src->h; int dstwidth = dst->w; int dstheight = dst->h; int bpp = src->format->BytesPerPixel; Uint8 *temppix = NULL; int tempwidth=0, temppitch=0, tempheight=0; /* convert to 32-bit if necessary */ if (bpp == 3) { int newpitch = srcwidth * 4; Uint8 *newsrc = (Uint8 *) malloc(newpitch * srcheight); if (!newsrc) return; convert_24_32(srcpix, srcpitch, newsrc, newpitch, srcwidth, srcheight); srcpix = newsrc; srcpitch = newpitch; /* create a destination buffer for the 32-bit result */ dstpitch = dstwidth << 2; dst32 = (Uint8 *) malloc(dstpitch * dstheight); if (dst32 == NULL) { free(srcpix); return; } dstpix = dst32; } /* Create a temporary processing buffer if we will be scaling both X and Y */ if (srcwidth != dstwidth && srcheight != dstheight) { tempwidth = dstwidth; temppitch = tempwidth << 2; tempheight = srcheight; temppix = (Uint8 *) malloc(temppitch * tempheight); if (temppix == NULL) { if (bpp == 3) { free(srcpix); free(dstpix); } return; } } /* Start the filter by doing X-scaling */ if (dstwidth < srcwidth) /* shrink */ { if (srcheight != dstheight) st->filter_shrink_X(srcpix, temppix, srcheight, srcpitch, temppitch, srcwidth, dstwidth); else st->filter_shrink_X(srcpix, dstpix, srcheight, srcpitch, dstpitch, srcwidth, dstwidth); } else if (dstwidth > srcwidth) /* expand */ { if (srcheight != dstheight) st->filter_expand_X(srcpix, temppix, srcheight, srcpitch, temppitch, srcwidth, dstwidth); else st->filter_expand_X(srcpix, dstpix, srcheight, srcpitch, dstpitch, srcwidth, dstwidth); } /* Now do the Y scale */ if (dstheight < srcheight) /* shrink */ { if (srcwidth != dstwidth) st->filter_shrink_Y(temppix, dstpix, tempwidth, temppitch, dstpitch, srcheight, dstheight); else st->filter_shrink_Y(srcpix, dstpix, srcwidth, srcpitch, dstpitch, srcheight, dstheight); } else if (dstheight > srcheight) /* expand */ { if (srcwidth != dstwidth) st->filter_expand_Y(temppix, dstpix, tempwidth, temppitch, dstpitch, srcheight, dstheight); else st->filter_expand_Y(srcpix, dstpix, srcwidth, srcpitch, dstpitch, srcheight, dstheight); } /* Convert back to 24-bit if necessary */ if (bpp == 3) { convert_32_24(dst32, dstpitch, (Uint8*)dst->pixels, dst->pitch, dstwidth, dstheight); free(dst32); dst32 = NULL; free(srcpix); srcpix = NULL; } /* free temporary buffer if necessary */ if (temppix != NULL) free(temppix); } static PyObject* surf_scalesmooth(PyObject* self, PyObject* arg) { PyObject *surfobj, *surfobj2; SDL_Surface* surf, *newsurf; int width, height, bpp; surfobj2 = NULL; /*get all the arguments*/ if (!PyArg_ParseTuple (arg, "O!(ii)|O!", &PySurface_Type, &surfobj, &width, &height, &PySurface_Type, &surfobj2)) return NULL; if (width < 0 || height < 0) return RAISE (PyExc_ValueError, "Cannot scale to negative size"); surf = PySurface_AsSurface (surfobj); bpp = surf->format->BytesPerPixel; if(bpp < 3 || bpp > 4) return RAISE(PyExc_ValueError, "Only 24-bit or 32-bit surfaces can be smoothly scaled"); if (!surfobj2) { newsurf = newsurf_fromsurf (surf, width, height); if (!newsurf) return NULL; } else newsurf = PySurface_AsSurface (surfobj2); /* check to see if the size is twice as big. */ if (newsurf->w != width || newsurf->h != height) return RAISE (PyExc_ValueError, "Destination surface not the given width or height."); if(((width * bpp + 3) >> 2) > newsurf->pitch) return RAISE(PyExc_ValueError, "SDL Error: destination surface pitch not 4-byte aligned."); if(width && height) { SDL_LockSurface(newsurf); PySurface_Lock(surfobj); Py_BEGIN_ALLOW_THREADS; /* handle trivial case */ if (surf->w == width && surf->h == height) { int y; for (y = 0; y < height; y++) { memcpy((Uint8*)newsurf->pixels + y * newsurf->pitch, (Uint8*)surf->pixels + y * surf->pitch, width * bpp); } } else { scalesmooth(surf, newsurf, GETSTATE (self)); } Py_END_ALLOW_THREADS; PySurface_Unlock(surfobj); SDL_UnlockSurface(newsurf); } if (surfobj2) { Py_INCREF (surfobj2); return surfobj2; } else return PySurface_New (newsurf); } static PyObject * surf_get_smoothscale_backend (PyObject *self) { return Text_FromUTF8 (GETSTATE (self)->filter_type); } static PyObject * surf_set_smoothscale_backend (PyObject *self, PyObject *args, PyObject *kwds) { struct _module_state *st = GETSTATE (self); char *keywords[] = {"type", NULL}; const char *type; if (!PyArg_ParseTupleAndKeywords (args, kwds, "s:set_smoothscale_backend", keywords, &type)) { return NULL; } #if defined(SCALE_MMX_SUPPORT) if (strcmp (type, "GENERIC") == 0) { st->filter_type = "GENERIC"; st->filter_shrink_X = filter_shrink_X_ONLYC; st->filter_shrink_Y = filter_shrink_Y_ONLYC; st->filter_expand_X = filter_expand_X_ONLYC; st->filter_expand_Y = filter_expand_Y_ONLYC; } else if (strcmp (type, "MMX") == 0) { if (!SDL_HasMMX ()) { return RAISE (PyExc_ValueError, "MMX not supported on this machine"); } st->filter_type = "MMX"; st->filter_shrink_X = filter_shrink_X_MMX; st->filter_shrink_Y = filter_shrink_Y_MMX; st->filter_expand_X = filter_expand_X_MMX; st->filter_expand_Y = filter_expand_Y_MMX; } else if (strcmp (type, "SSE") == 0) { if (!SDL_HasSSE ()) { return RAISE (PyExc_ValueError, "SSE not supported on this machine"); } st->filter_type = "SSE"; st->filter_shrink_X = filter_shrink_X_SSE; st->filter_shrink_Y = filter_shrink_Y_SSE; st->filter_expand_X = filter_expand_X_SSE; st->filter_expand_Y = filter_expand_Y_SSE; } else { return PyErr_Format (PyExc_ValueError, "Unknown backend type %s", type); } Py_RETURN_NONE; #else /* Not an x86 processor */ if (strcmp (type, "GENERIC") != 0) { if (strcmp (st->filter_type, "MMX") == 0 || strcmp (st->filter_type, "SSE") == 0 ) { return PyErr_Format (PyExc_ValueError, "%s not supported on this machine", type); } return PyErr_Format (PyExc_ValueError, "Unknown backend type %s", type); } Py_RETURN_NONE; #endif /* defined(SCALE_MMX_SUPPORT) */ } static int get_threshold (SDL_Surface *destsurf, SDL_Surface *surf, SDL_Surface *surf2, Uint32 color, Uint32 threshold, Uint32 diff_color, int change_return, int inverse) { int x, y, result, similar, rshift, gshift, bshift, rshift2, gshift2, bshift2; int rloss, gloss, bloss, rloss2, gloss2, bloss2; Uint8 *pixels, *destpixels, *pixels2; SDL_Rect sdlrect; SDL_PixelFormat *format, *destformat, *format2; Uint32 the_color, the_color2, rmask, gmask, bmask, rmask2, gmask2, bmask2; Uint8 *pix, *byte_buf; Uint8 r, g, b, a; Uint8 dr, dg, db, da; Uint8 tr, tg, tb, ta; similar = 0; pixels = (Uint8 *) surf->pixels; format = surf->format; rmask = format->Rmask; gmask = format->Gmask; bmask = format->Bmask; rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; rloss = format->Rloss; gloss = format->Gloss; bloss = format->Bloss; if(change_return) { sdlrect.x = sdlrect.y = 0; sdlrect.w = destsurf->w; sdlrect.h = destsurf->h; destpixels = (Uint8 *) destsurf->pixels; destformat = destsurf->format; result = SDL_FillRect (destsurf, &sdlrect, diff_color); } else { /* make gcc stop complaining */ destpixels = NULL; destformat = NULL; } if(surf2) { format2 = surf2->format; rmask2 = format2->Rmask; gmask2 = format2->Gmask; bmask2 = format2->Bmask; rshift2 = format2->Rshift; gshift2 = format2->Gshift; bshift2 = format2->Bshift; rloss2 = format2->Rloss; gloss2 = format2->Gloss; bloss2 = format2->Bloss; pixels2 = (Uint8 *) surf2->pixels; } else { /* make gcc stop complaining */ rmask2 = gmask2 = bmask2 = 0; rshift2 = gshift2 = bshift2 = 0; rloss2 = gloss2 = bloss2 = 0; format2 = NULL; pixels2 = NULL; } SDL_GetRGBA (color, format, &r, &g, &b, &a); SDL_GetRGBA (threshold, format, &tr, &tg, &tb, &ta); SDL_GetRGBA (diff_color, format, &dr, &dg, &db, &da); for(y=0; y < surf->h; y++) { pixels = (Uint8 *) surf->pixels + y*surf->pitch; if (surf2) { pixels2 = (Uint8 *) surf2->pixels + y*surf2->pitch; } for(x=0; x < surf->w; x++) { /* the_color = surf->get_at(x,y) */ switch (format->BytesPerPixel) { case 1: the_color = (Uint32)*((Uint8 *) pixels); pixels++; break; case 2: the_color = (Uint32)*((Uint16 *) pixels); pixels += 2; break; case 3: pix = ((Uint8 *) pixels); pixels += 3; #if SDL_BYTEORDER == SDL_LIL_ENDIAN the_color = (pix[0]) + (pix[1] << 8) + (pix[2] << 16); #else the_color = (pix[2]) + (pix[1] << 8) + (pix[0] << 16); #endif break; default: /* case 4: */ the_color = *((Uint32 *) pixels); pixels += 4; break; } if (surf2) { switch (format2->BytesPerPixel) { case 1: the_color2 = (Uint32)*((Uint8 *) pixels2); pixels2++; break; case 2: the_color2 = (Uint32)*((Uint16 *) pixels2); pixels2 += 2; break; case 3: pix = ((Uint8 *) pixels2); pixels2 += 3; #if SDL_BYTEORDER == SDL_LIL_ENDIAN the_color2 = (pix[0]) + (pix[1] << 8) + (pix[2] << 16); #else the_color2 = (pix[2]) + (pix[1] << 8) + (pix[0] << 16); #endif break; default: /* case 4: */ the_color2 = *((Uint32 *) pixels2); pixels2 += 4; break; } if (((abs((((the_color2 & rmask2) >> rshift2) << rloss2) - (((the_color & rmask) >> rshift) << rloss)) <= tr) & (abs((((the_color2 & gmask2) >> gshift2) << gloss2) - (((the_color & gmask) >> gshift) << gloss)) <= tg) & (abs((((the_color2 & bmask2) >> bshift2) << bloss2) - (((the_color & bmask) >> bshift) << bloss)) <= tb)) ^ inverse) { /* this pixel is within the threshold of the pixel in the other surface. */ if (change_return == 2) { /* change the pixel to the color from the first surface. */ /* destsurf->set_at((x,y), the_color) */ switch (destformat->BytesPerPixel) { case 1: *((Uint8 *) destpixels + y * destsurf->pitch + x) = (Uint8) the_color; break; case 2: *((Uint16 *) (destpixels + y * destsurf->pitch) + x) = (Uint16) the_color; break; case 3: byte_buf = (Uint8 *) (destpixels + y * destsurf->pitch) + x * 3; #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *(byte_buf + (destformat->Rshift >> 3)) = (Uint8) (the_color >> 16); *(byte_buf + (destformat->Gshift >> 3)) = (Uint8) (the_color >> 8); *(byte_buf + (destformat->Bshift >> 3)) = (Uint8) the_color; #else *(byte_buf + 2 - (destformat->Rshift >> 3)) = (Uint8) (the_color >> 16); *(byte_buf + 2 - (destformat->Gshift >> 3)) = (Uint8) (the_color >> 8); *(byte_buf + 2 - (destformat->Bshift >> 3)) = (Uint8) the_color; #endif break; default: /* case 4: */ *((Uint32 *) (destpixels + y * destsurf->pitch) + x) = the_color; break; } } else if (change_return == 1) { /* change the pixel to color. */ /* destsurf->set_at((x,y), color) */ switch (destformat->BytesPerPixel) { case 1: *((Uint8 *) destpixels + y * destsurf->pitch + x) = (Uint8) color; break; case 2: *((Uint16 *) (destpixels + y * destsurf->pitch) + x) = (Uint16) color; break; case 3: byte_buf = (Uint8 *) (destpixels + y * destsurf->pitch) + x * 3; #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *(byte_buf + (destformat->Rshift >> 3)) = (Uint8) (color >> 16); *(byte_buf + (destformat->Gshift >> 3)) = (Uint8) (color >> 8); *(byte_buf + (destformat->Bshift >> 3)) = (Uint8) color; #else *(byte_buf + 2 - (destformat->Rshift >> 3)) = (Uint8) (color >> 16); *(byte_buf + 2 - (destformat->Gshift >> 3)) = (Uint8) (color >> 8); *(byte_buf + 2 - (destformat->Bshift >> 3)) = (Uint8) color; #endif break; default: /* case 4: */ *((Uint32 *) (destpixels + y * destsurf->pitch) + x) = color; break; } } similar++; } } else if (((abs((((the_color & rmask) >> rshift) << rloss) - r) <= tr) & (abs((((the_color & gmask) >> gshift) << gloss) - g) <= tg) & (abs((((the_color & bmask) >> bshift) << bloss) - b) <= tb)) ^ inverse) { /* Comparing the threshold against the color. */ /* this pixel is within the threshold. */ if (change_return == 2) { /* destsurf->set_at((x,y), the_color) */ switch (destformat->BytesPerPixel) { case 1: *((Uint8 *) destpixels + y * destsurf->pitch + x) = (Uint8) the_color; break; case 2: *((Uint16 *) (destpixels + y * destsurf->pitch) + x) = (Uint16) the_color; break; case 3: byte_buf = (Uint8 *) (destpixels + y * destsurf->pitch) + x * 3; #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *(byte_buf + (destformat->Rshift >> 3)) = (Uint8) (the_color >> 16); *(byte_buf + (destformat->Gshift >> 3)) = (Uint8) (the_color >> 8); *(byte_buf + (destformat->Bshift >> 3)) = (Uint8) the_color; #else *(byte_buf + 2 - (destformat->Rshift >> 3)) = (Uint8) (the_color >> 16); *(byte_buf + 2 - (destformat->Gshift >> 3)) = (Uint8) (the_color >> 8); *(byte_buf + 2 - (destformat->Bshift >> 3)) = (Uint8) the_color; #endif break; default: /* case 4: */ *((Uint32 *) (destpixels + y * destsurf->pitch) + x) = the_color; break; } } else if (change_return == 1) { /* change the pixel to color. */ /* destsurf->set_at((x,y), color) */ switch (destformat->BytesPerPixel) { case 1: *((Uint8 *) destpixels + y * destsurf->pitch + x) = (Uint8) color; break; case 2: *((Uint16 *) (destpixels + y * destsurf->pitch) + x) = (Uint16) color; break; case 3: byte_buf = (Uint8 *) (destpixels + y * destsurf->pitch) + x * 3; #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *(byte_buf + (destformat->Rshift >> 3)) = (Uint8) (color >> 16); *(byte_buf + (destformat->Gshift >> 3)) = (Uint8) (color >> 8); *(byte_buf + (destformat->Bshift >> 3)) = (Uint8) color; #else *(byte_buf + 2 - (destformat->Rshift >> 3)) = (Uint8) (color >> 16); *(byte_buf + 2 - (destformat->Gshift >> 3)) = (Uint8) (color >> 8); *(byte_buf + 2 - (destformat->Bshift >> 3)) = (Uint8) color; #endif break; default: /* case 4: */ *((Uint32 *) (destpixels + y * destsurf->pitch) + x) = color; break; } } similar++; } } } return similar; } static PyObject* surf_threshold(PyObject* self, PyObject* arg) { PyObject *surfobj, *surfobj2 = NULL, *surfobj3 = NULL; SDL_Surface* surf = NULL, *destsurf = NULL, *surf2 = NULL; int bpp, change_return = 1, inverse = 0; int num_threshold_pixels = 0; PyObject *rgba_obj_color; PyObject *rgba_obj_threshold = NULL; PyObject *rgba_obj_diff_color = NULL; Uint8 rgba_color[4]; Uint8 rgba_threshold[4] = {0, 0, 0, 255}; Uint8 rgba_diff_color[4] = {0, 0, 0, 255}; Uint32 color; Uint32 color_threshold; Uint32 color_diff_color; /*get all the arguments*/ if (!PyArg_ParseTuple (arg, "O!O!O|OOiO!i", &PySurface_Type, &surfobj, &PySurface_Type, &surfobj2, &rgba_obj_color, &rgba_obj_threshold, &rgba_obj_diff_color, &change_return, &PySurface_Type, &surfobj3, &inverse)) return NULL; destsurf = PySurface_AsSurface (surfobj); surf = PySurface_AsSurface (surfobj2); if(surfobj3) { surf2 = PySurface_AsSurface (surfobj3); } if (PyInt_Check (rgba_obj_color)) { color = (Uint32) PyInt_AsLong (rgba_obj_color); } else if (PyLong_Check (rgba_obj_color)) { color = (Uint32) PyLong_AsUnsignedLong (rgba_obj_color); } else if (RGBAFromColorObj (rgba_obj_color, rgba_color)) { color = SDL_MapRGBA (surf->format, rgba_color[0], rgba_color[1], rgba_color[2], rgba_color[3]); } else { return RAISE (PyExc_TypeError, "invalid color argument"); } if(rgba_obj_threshold) { if (PyInt_Check (rgba_obj_threshold)) color_threshold = (Uint32) PyInt_AsLong (rgba_obj_threshold); else if (PyLong_Check (rgba_obj_threshold)) color_threshold = (Uint32) PyLong_AsUnsignedLong (rgba_obj_threshold); else if (RGBAFromColorObj (rgba_obj_threshold, rgba_threshold)) color_threshold = SDL_MapRGBA (surf->format, rgba_threshold[0], rgba_threshold[1], rgba_threshold[2], rgba_threshold[3]); else return RAISE (PyExc_TypeError, "invalid threshold argument"); } else { color_threshold = SDL_MapRGBA (surf->format, rgba_threshold[0], rgba_threshold[1], rgba_threshold[2], rgba_threshold[3]); } if(rgba_obj_diff_color) { if (PyInt_Check (rgba_obj_diff_color)) color_diff_color = (Uint32) PyInt_AsLong (rgba_obj_diff_color); else if (PyLong_Check (rgba_obj_diff_color)) color_diff_color = (Uint32) PyLong_AsUnsignedLong (rgba_obj_diff_color); else if (RGBAFromColorObj (rgba_obj_diff_color, rgba_diff_color)) color_diff_color = SDL_MapRGBA (surf->format, rgba_diff_color[0], rgba_diff_color[1], rgba_diff_color[2], rgba_diff_color[3]); else return RAISE (PyExc_TypeError, "invalid diff_color argument"); } else { color_diff_color = SDL_MapRGBA (surf->format, rgba_diff_color[0], rgba_diff_color[1], rgba_diff_color[2], rgba_diff_color[3]); } bpp = surf->format->BytesPerPixel; PySurface_Lock(surfobj); PySurface_Lock(surfobj2); if(surfobj3) { PySurface_Lock(surfobj3); } Py_BEGIN_ALLOW_THREADS; num_threshold_pixels = get_threshold (destsurf, surf, surf2, color, color_threshold, color_diff_color, change_return, inverse); Py_END_ALLOW_THREADS; PySurface_Unlock(surfobj); PySurface_Unlock(surfobj2); if(surfobj3) { PySurface_Unlock(surfobj3); } return PyInt_FromLong (num_threshold_pixels); } /* TODO: add_4 sub_4 mul_4 clamp_4 */ #define SURF_GET_AT(p_color, p_surf, p_x, p_y, p_pixels, p_format, p_pix) \ switch (p_format->BytesPerPixel) \ { \ case 1: \ p_color = (Uint32)*((Uint8 *) (p_pixels) + (p_y) * p_surf->pitch + (p_x)); \ break; \ case 2: \ p_color = (Uint32)*((Uint16 *) ((p_pixels) + (p_y) * p_surf->pitch) + (p_x)); \ break; \ case 3: \ p_pix = ((Uint8 *) (p_pixels + (p_y) * p_surf->pitch) + (p_x) * 3); \ p_color = (SDL_BYTEORDER == SDL_LIL_ENDIAN) ? \ (p_pix[0]) + (p_pix[1] << 8) + (p_pix[2] << 16) : \ (p_pix[2]) + (p_pix[1] << 8) + (p_pix[0] << 16); \ break; \ default: /* case 4: */ \ p_color = *((Uint32 *) (p_pixels + (p_y) * p_surf->pitch) + (p_x)); \ break; \ } \ #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) #define SURF_SET_AT(p_color, p_surf, p_x, p_y, p_pixels, p_format, p_byte_buf) \ switch (p_format->BytesPerPixel) \ { \ case 1: \ *((Uint8 *) p_pixels + (p_y) * p_surf->pitch + (p_x)) = (Uint8) p_color; \ break; \ case 2: \ *((Uint16 *) (p_pixels + (p_y) * p_surf->pitch) + (p_x)) = (Uint16) p_color; \ break; \ case 3: \ p_byte_buf = (Uint8 *) (p_pixels + (p_y) * p_surf->pitch) + (p_x) * 3; \ *(p_byte_buf + (p_format->Rshift >> 3)) = (Uint8) (p_color >> 16); \ *(p_byte_buf + (p_format->Gshift >> 3)) = (Uint8) (p_color >> 8); \ *(p_byte_buf + (p_format->Bshift >> 3)) = (Uint8) p_color; \ break; \ default: \ *((Uint32 *) (p_pixels + (p_y) * p_surf->pitch) + (p_x)) = p_color; \ break; \ } \ #else #define SURF_SET_AT(p_color, p_surf, p_x, p_y, p_pixels, p_format, p_byte_buf) \ switch (p_format->BytesPerPixel) \ { \ case 1: \ *((Uint8 *) p_pixels + (p_y) * p_surf->pitch + (p_x)) = (Uint8) p_color; \ break; \ case 2: \ *((Uint16 *) (p_pixels + (p_y) * p_surf->pitch) + (p_x)) = (Uint16) p_color; \ break; \ case 3: \ p_byte_buf = (Uint8 *) (p_pixels + (p_y) * p_surf->pitch) + (p_x) * 3; \ *(p_byte_buf + 2 - (p_format->Rshift >> 3)) = (Uint8) (p_color >> 16); \ *(p_byte_buf + 2 - (p_format->Gshift >> 3)) = (Uint8) (p_color >> 8); \ *(p_byte_buf + 2 - (p_format->Bshift >> 3)) = (Uint8) p_color; \ break; \ default: \ *((Uint32 *) (p_pixels + (p_y) * p_surf->pitch) + (p_x)) = p_color; \ break; \ } \ #endif /* number to use for missing samples */ #define LAPLACIAN_NUM 0xFFFFFFFF void laplacian(SDL_Surface *surf, SDL_Surface *destsurf) { int ii; int x,y,height,width; Uint32 sample[9]; //Uint32 total[4]; int total[4]; Uint8 c1r, c1g, c1b, c1a; //Uint32 c1r, c1g, c1b, c1a; Uint8 acolor[4]; Uint32 the_color; int atmp0; int atmp1; int atmp2; int atmp3; SDL_PixelFormat *format, *destformat; Uint8 *pixels, *destpixels; Uint8 *pix; Uint8 *byte_buf; height = surf->h; width = surf->w; pixels = (Uint8 *) surf->pixels; format = surf->format; destpixels = (Uint8 *) destsurf->pixels; destformat = destsurf->format; /* -1 -1 -1 -1 8 -1 -1 -1 -1 col = (sample[4] * 8) - (sample[0] + sample[1] + sample[2] + sample[3] + sample[5] + sample[6] + sample[7] + sample[8]) [(-1,-1), (0,-1), (1,-1), (-1,0), (0,0), (1,0), (-1,1), (0,1), (1,1)] */ for(y=0;y 0) { if(x>0) { SURF_GET_AT(sample[0], surf, x+ -1, y+ -1, pixels, format, pix); } SURF_GET_AT(sample[1], surf, x+ 0, y+ -1, pixels, format, pix); if(x+10) { SURF_GET_AT(sample[3], surf, x+ -1, y+ 0, pixels, format, pix); } else { sample[3] = LAPLACIAN_NUM; } //SURF_GET_AT(sample[4], surf, x+0 , y+0); sample[4] = 0; if(x+10) { SURF_GET_AT(sample[6], surf, x+ -1, y+ 1, pixels, format, pix); } SURF_GET_AT(sample[7], surf, x+ 0, y+ 1, pixels, format, pix); if(x+1format, acolor[0], acolor[1], acolor[2], acolor[3]); // set_at(destsurf, color, x,y); switch (destformat->BytesPerPixel) { case 1: *((Uint8 *) destpixels + y * destsurf->pitch + x) = (Uint8) the_color; break; case 2: *((Uint16 *) (destpixels + y * destsurf->pitch) + x) = (Uint16) the_color; break; case 3: byte_buf = (Uint8 *) (destpixels + y * destsurf->pitch) + x * 3; #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *(byte_buf + (destformat->Rshift >> 3)) = (Uint8) (the_color >> 16); *(byte_buf + (destformat->Gshift >> 3)) = (Uint8) (the_color >> 8); *(byte_buf + (destformat->Bshift >> 3)) = (Uint8) the_color; #else *(byte_buf + 2 - (destformat->Rshift >> 3)) = (Uint8) (the_color >> 16); *(byte_buf + 2 - (destformat->Gshift >> 3)) = (Uint8) (the_color >> 8); *(byte_buf + 2 - (destformat->Bshift >> 3)) = (Uint8) the_color; #endif break; default: *((Uint32 *) (destpixels + y * destsurf->pitch) + x) = the_color; break; } } } } static PyObject* surf_laplacian (PyObject* self, PyObject* arg) { PyObject *surfobj, *surfobj2; SDL_Surface *surf; SDL_Surface *newsurf; int width, height; surfobj2 = NULL; /*get all the arguments*/ if (!PyArg_ParseTuple (arg, "O!|O!", &PySurface_Type, &surfobj, &PySurface_Type, &surfobj2)) return NULL; surf = PySurface_AsSurface (surfobj); /* if the second surface is not there, then make a new one. */ if (!surfobj2) { width = surf->w; height = surf->h; newsurf = newsurf_fromsurf (surf, width, height); if (!newsurf) return NULL; } else newsurf = PySurface_AsSurface (surfobj2); /* check to see if the size is the correct size. */ if (newsurf->w != (surf->w) || newsurf->h != (surf->h)) return RAISE (PyExc_ValueError, "Destination surface not the same size."); /* check to see if the format of the surface is the same. */ if (surf->format->BytesPerPixel != newsurf->format->BytesPerPixel) return RAISE (PyExc_ValueError, "Source and destination surfaces need the same format."); SDL_LockSurface (newsurf); SDL_LockSurface (surf); Py_BEGIN_ALLOW_THREADS; laplacian (surf, newsurf); Py_END_ALLOW_THREADS; SDL_UnlockSurface (surf); SDL_UnlockSurface (newsurf); if (surfobj2) { Py_INCREF (surfobj2); return surfobj2; } else return PySurface_New (newsurf); } int average_surfaces(SDL_Surface **surfaces, int num_surfaces, SDL_Surface *destsurf, int palette_colors) { /* returns the average surface from the ones given. All surfaces need to be the same size. palette_colors - if true we average the colors in palette, otherwise we average the pixel values. This is useful if the surface is actually greyscale colors, and not palette colors. */ Uint32 *accumulate; Uint32 *the_idx; Uint32 the_color; SDL_Surface *surf; int height, width, x, y, surf_idx; float div_inv; SDL_PixelFormat *format, *destformat; Uint8 *pixels, *destpixels; Uint8 *pix; Uint8 *byte_buf; Uint32 rmask, gmask, bmask; int rshift, gshift, bshift, rloss, gloss, bloss; int num_elements; if(!num_surfaces) { return 0; } height = surfaces[0]->h; width = surfaces[0]->w; destpixels = (Uint8 *) destsurf->pixels; destformat = destsurf->format; /* allocate an array to accumulate them all. If we're using 1 byte per pixel, then only need to average on that much. */ if((destformat->BytesPerPixel == 1) && (destformat->palette) && (!palette_colors)) { num_elements = 1; } else { num_elements = 3; } accumulate = (Uint32 *) calloc(1, sizeof(Uint32) * height * width * num_elements ); if(!accumulate) { return -1; } /* add up the r,g,b from all the surfaces. */ for(surf_idx=0;surf_idx < num_surfaces;surf_idx++) { surf = surfaces[surf_idx]; pixels = (Uint8 *) surf->pixels; format = surf->format; rmask = format->Rmask; gmask = format->Gmask; bmask = format->Bmask; rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; rloss = format->Rloss; gloss = format->Gloss; bloss = format->Bloss; the_idx = accumulate; /* If palette surface, we use a different code path... */ if((format->BytesPerPixel == 1 && destformat->BytesPerPixel == 1) && (format->palette) && (destformat->palette) && (!palette_colors) ) { /* This is useful if the surface is actually greyscale colors, and not palette colors. */ for(y=0;y> rshift) << rloss; *(the_idx + 1) += ((the_color & gmask) >> gshift) << gloss; *(the_idx + 2) += ((the_color & bmask) >> bshift) << bloss; the_idx += 3; } } } } /* blit the accumulated array back to the destination surface. */ div_inv = (float) (1.0L / (num_surfaces)); the_idx = accumulate; if(num_elements == 1 && (!palette_colors)) { /* this is where we are using the palette surface without using its colors from the palette. */ for(y=0;y> rshift) << rloss; *(the_idx + 1) += ((the_color & gmask) >> gshift) << gloss; *(the_idx + 2) += ((the_color & bmask) >> bshift) << bloss; */ SURF_SET_AT(the_color, destsurf, x, y, destpixels, destformat, byte_buf); the_idx += 3; } } } else { free(accumulate); return -4; } free(accumulate); return 1; } /* returns the average surface from the ones given. All surfaces need to be the same size. palette_colors - if true we average the colors in palette, otherwise we average the pixel values. This is useful if the surface is actually greyscale colors, and not palette colors. */ static PyObject* surf_average_surfaces (PyObject* self, PyObject* arg) { PyObject *surfobj2; SDL_Surface *surf; SDL_Surface *newsurf; SDL_Surface **surfaces; int width, height; int an_error; size_t size, loop, loop_up_to; int palette_colors = 1; PyObject* list, *obj; PyObject* ret = NULL; an_error = 0; surfobj2 = NULL; newsurf = NULL; if (!PyArg_ParseTuple (arg, "O|O!i", &list, &PySurface_Type, &surfobj2, &palette_colors )) return NULL; if (!PySequence_Check (list)) return RAISE (PyExc_TypeError, "Argument must be a sequence of surface objects."); size = PySequence_Length (list); /*warning, size could be -1 on error?*/ if(size < 1) return RAISE (PyExc_TypeError, "Needs to be given at least one surface."); /* Allocate an array of surface pointers. */ surfaces = (SDL_Surface **) calloc(1, sizeof(SDL_Surface *) * size); if(!surfaces) { return RAISE (PyExc_MemoryError, "Not enough memory to store surfaces.\n"); } /* Iterate over 'surfaces' passed in. */ /* need to get the first surface to see how big it is */ loop = 0; for (loop = 0; loop < size; ++loop) { obj = PySequence_GetItem (list, loop); if(!obj) { Py_XDECREF (obj); ret = RAISE (PyExc_TypeError, "Needs to be a surface object."); an_error = 1; break; } if (!PySurface_Check (obj)) { Py_XDECREF (obj); ret = RAISE (PyExc_TypeError, "Needs to be a surface object."); an_error = 1; break; } surf = PySurface_AsSurface (obj); if(!surf) { Py_XDECREF (obj); ret = RAISE (PyExc_TypeError, "Needs to be a surface object."); an_error = 1; break; } if(loop == 0) { /* if the second surface is not there, then make a new one. */ if (!surfobj2) { width = surf->w; height = surf->h; newsurf = newsurf_fromsurf (surf, width, height); if (!newsurf) { Py_XDECREF (obj); ret = RAISE (PyExc_ValueError, "Could not create new surface."); an_error = 1; break; } } else newsurf = PySurface_AsSurface (surfobj2); /* check to see if the size is the correct size. */ if (newsurf->w != (surf->w) || newsurf->h != (surf->h)) { Py_XDECREF (obj); ret = RAISE (PyExc_ValueError, "Destination surface not the same size."); an_error = 1; break; } /* check to see if the format of the surface is the same. */ if (surf->format->BytesPerPixel != newsurf->format->BytesPerPixel) { Py_XDECREF (obj); ret = RAISE (PyExc_ValueError, "Source and destination surfaces need the same format."); an_error = 1; break; } } /* Copy surface pointer, and also lock surface. */ SDL_LockSurface (surf); surfaces[loop] = surf; Py_DECREF (obj); } loop_up_to = loop; if(!an_error) { /* Process images, get average surface. */ SDL_LockSurface (newsurf); Py_BEGIN_ALLOW_THREADS; average_surfaces (surfaces, size, newsurf, palette_colors); Py_END_ALLOW_THREADS; SDL_UnlockSurface (newsurf); if (surfobj2) { Py_INCREF (surfobj2); ret = surfobj2; } else { ret = PySurface_New (newsurf); } } else { } /* cleanup */ /* unlock the surfaces we got up to. */ for (loop = 0; loop < loop_up_to; loop++) { if(surfaces[loop]) { SDL_UnlockSurface (surfaces[loop]); } } free(surfaces); return ret; } void average_color(SDL_Surface* surf, int x, int y, int width, int height, Uint8* r, Uint8* g, Uint8* b, Uint8* a) { Uint32 color, rmask, gmask, bmask, amask; Uint8 *pixels, *pix; unsigned int rtot, gtot, btot, atot, size, rshift, gshift, bshift, ashift; unsigned int rloss, gloss, bloss, aloss; int row, col; SDL_PixelFormat *format; format = surf->format; rmask = format->Rmask; gmask = format->Gmask; bmask = format->Bmask; amask = format->Amask; rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; ashift = format->Ashift; rloss = format->Rloss; gloss = format->Gloss; bloss = format->Bloss; aloss = format->Aloss; rtot = gtot = btot = atot = 0; /* make sure the area specified is within the Surface */ if ((x + width) > surf->w) width = surf->w - x; if ((y + height) > surf->h) height = surf->h - y; if (x < 0) { width -= (-x); x = 0; } if (y < 0) { height -= (-y); y = 0; } size = width*height; switch (format->BytesPerPixel) { case 1: for (row = y; row < y+height; row++) { pixels = (Uint8 *) surf->pixels + row*surf->pitch + x; for (col = x; col < x+width; col++) { color = (Uint32)*((Uint8 *) pixels); rtot += ((color & rmask) >> rshift) << rloss; gtot += ((color & gmask) >> gshift) << gloss; btot += ((color & bmask) >> bshift) << bloss; atot += ((color & amask) >> ashift) << aloss; pixels++; } } break; case 2: for (row = y; row < y+height; row++) { pixels = (Uint8 *) surf->pixels + row*surf->pitch + x*2; for (col = x; col < x+width; col++) { color = (Uint32)*((Uint16 *) pixels); rtot += ((color & rmask) >> rshift) << rloss; gtot += ((color & gmask) >> gshift) << gloss; btot += ((color & bmask) >> bshift) << bloss; atot += ((color & amask) >> ashift) << aloss; pixels += 2; } } break; case 3: for (row = y; row < y+height; row++) { pixels = (Uint8 *) surf->pixels + row*surf->pitch + x*3; for (col = x; col < x+width; col++) { pix = pixels; #if SDL_BYTEORDER == SDL_LIL_ENDIAN color = (pix[0]) + (pix[1] << 8) + (pix[2] << 16); #else color = (pix[2]) + (pix[1] << 8) + (pix[0] << 16); #endif rtot += ((color & rmask) >> rshift) << rloss; gtot += ((color & gmask) >> gshift) << gloss; btot += ((color & bmask) >> bshift) << bloss; atot += ((color & amask) >> ashift) << aloss; pixels += 3; } } break; default: /* case 4: */ for (row = y; row < y+height; row++) { pixels = (Uint8 *) surf->pixels + row*surf->pitch + x*4; for (col = x; col < x+width; col++) { color = *(Uint32 *)pixels; rtot += ((color & rmask) >> rshift) << rloss; gtot += ((color & gmask) >> gshift) << gloss; btot += ((color & bmask) >> bshift) << bloss; atot += ((color & amask) >> ashift) << aloss; pixels += 4; } } break; } *r = rtot/size; *g = gtot/size; *b = btot/size; *a = atot/size; } static PyObject* surf_average_color(PyObject* self, PyObject* arg) { PyObject *surfobj, *rectobj = NULL; SDL_Surface* surf; GAME_Rect* rect, temp; Uint8 r, g, b, a; int x, y, w, h; if (!PyArg_ParseTuple (arg, "O!|O", &PySurface_Type, &surfobj, &rectobj)) return NULL; surf = PySurface_AsSurface (surfobj); PySurface_Lock (surfobj); if (!rectobj) { x = 0; y = 0; w = surf->w; h = surf->h; } else { if (!(rect = GameRect_FromObject (rectobj, &temp))) return RAISE (PyExc_TypeError, "Rect argument is invalid"); x = rect->x; y = rect->y; w = rect->w; h = rect->h; } Py_BEGIN_ALLOW_THREADS; average_color(surf, x, y, w, h, &r, &g, &b, &a); Py_END_ALLOW_THREADS; PySurface_Unlock (surfobj); return Py_BuildValue ("(bbbb)", r, g, b, a); } static PyMethodDef _transform_methods[] = { { "scale", surf_scale, METH_VARARGS, DOC_PYGAMETRANSFORMSCALE }, { "rotate", surf_rotate, METH_VARARGS, DOC_PYGAMETRANSFORMROTATE }, { "flip", surf_flip, METH_VARARGS, DOC_PYGAMETRANSFORMFLIP }, { "rotozoom", surf_rotozoom, METH_VARARGS, DOC_PYGAMETRANSFORMROTOZOOM}, { "chop", surf_chop, METH_VARARGS, DOC_PYGAMETRANSFORMCHOP }, { "scale2x", surf_scale2x, METH_VARARGS, DOC_PYGAMETRANSFORMSCALE2X }, { "smoothscale", surf_scalesmooth, METH_VARARGS, DOC_PYGAMETRANSFORMSMOOTHSCALE }, { "get_smoothscale_backend", (PyCFunction) surf_get_smoothscale_backend, METH_NOARGS, DOC_PYGAMETRANSFORMGETSMOOTHSCALEBACKEND }, { "set_smoothscale_backend", (PyCFunction) surf_set_smoothscale_backend, METH_VARARGS | METH_KEYWORDS, DOC_PYGAMETRANSFORMSETSMOOTHSCALEBACKEND }, { "threshold", surf_threshold, METH_VARARGS, DOC_PYGAMETRANSFORMTHRESHOLD }, { "laplacian", surf_laplacian, METH_VARARGS, DOC_PYGAMETRANSFORMTHRESHOLD }, { "average_surfaces", surf_average_surfaces, METH_VARARGS, DOC_PYGAMETRANSFORMAVERAGESURFACES }, { "average_color", surf_average_color, METH_VARARGS, DOC_PYGAMETRANSFORMAVERAGECOLOR }, { NULL, NULL, 0, NULL } }; MODINIT_DEFINE (transform) { PyObject *module; struct _module_state *st; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "transform", DOC_PYGAMETRANSFORM, sizeof (struct _module_state), _transform_methods, NULL, NULL, NULL, NULL }; #endif /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_color (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_rect (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_surface (); if (PyErr_Occurred ()) { MODINIT_ERROR; } /* create the module */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "transform", _transform_methods, DOC_PYGAMETRANSFORM); #endif if (module == 0) { MODINIT_ERROR; } st = GETSTATE (module); if (st->filter_type == 0) { smoothscale_init (st); } MODINIT_RETURN (module); } pygame-1.9.1release/src/time.doc0000644000175000017500000000772211205141271016461 0ustar vincentvincentpygame.time pygame module for monitoring time Times in pygame are represented in milliseconds (1/1000 seconds). Most platforms have a limited time resolution of around 10 milliseconds. This resolution, in milliseconds, is given in the TIMER_RESOLUTION constant.
    get_ticks get the time in milliseconds pygame.time.get_ticks(): return milliseconds Return the number of millisconds since pygame.init() was called. Before pygame is initialized this will always be 0. wait pause the program for an amount of time pygame.time.wait(milliseconds): return time Will pause for a given number of milliseconds. This function sleeps the process to share the processor with other programs. A program that waits for even a few milliseconds will consume very little processor time. It is slightly less accurate than the pygame.time.delay() function. This returns the actual number of milliseconds used. delay pause the program for an amount of time pygame.time.delay(milliseconds): return time Will pause for a given number of milliseconds. This function will use the processor (rather than sleeping) in order to make the delay more accurate than pygame.time.wait(). This returns the actual number of milliseconds used. set_timer repeatedly create an event on the event queue pygame.time.set_timer(eventid, milliseconds): return None Set an event type to appear on the event queue every given number of milliseconds. The first event will not appear until the amount of time has passed. Every event type can have a separate timer attached to it. It is best to use the value between pygame.USEREVENT and pygame.NUMEVENTS. To disable the timer for an event, set the milliseconds argument to 0. Clock create an object to help track time pygame.time.Clock(): return Clock Creates a new Clock object that can be used to track an amount of time. The clock also provides several functions to help control a game's framerate.
    tick update the clock Clock.tick(framerate=0): return milliseconds control timer events This method should be called once per frame. It will compute how many milliseconds have passed since the previous call. If you pass the optional framerate argument the function will delay to keep the game running slower than the given ticks per second. This can be used to help limit the runtime speed of a game. By calling Clock.tick(40) once per frame, the program will never run at more than 40 frames per second. Note that this function uses SDL_Delay function which is not accurate on every platform, but does not use much cpu. Use tick_busy_loop if you want an accurate timer, and don't mind chewing cpu. tick_busy_loop update the clock Clock.tick_busy_loop(framerate=0): return milliseconds control timer events This method should be called once per frame. It will compute how many milliseconds have passed since the previous call. If you pass the optional framerate argument the function will delay to keep the game running slower than the given ticks per second. This can be used to help limit the runtime speed of a game. By calling Clock.tick(40) once per frame, the program will never run at more than 40 frames per second. Note that this function uses pygame.time.delay, which uses lots of cpu in a busy loop to make sure that timing is more acurate. New in pygame 1.8.0. get_time time used in the previous tick Clock.get_time(): return milliseconds Returns the parameter passed to the last call to Clock.tick(). It is the number of milliseconds passed between the previous two calls to Pygame.tick(). get_rawtime actual time used in the previous tick Clock.get_rawtime(): return milliseconds Similar to Clock.get_time(), but this does not include any time used while Clock.tick() was delaying to limit the framerate. get_fps compute the clock framerate Clock.get_fps(): return float Compute your game's framerate (in frames per second). It is computed by averaging the last few calls to Clock.tick(). pygame-1.9.1release/src/time.c0000644000175000017500000002746411207055754016157 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" #define WORST_CLOCK_ACCURACY 12 static SDL_TimerID event_timers[SDL_NUMEVENTS] = {NULL}; static Uint32 timer_callback (Uint32 interval, void* param) { if (SDL_WasInit (SDL_INIT_VIDEO)) { SDL_Event event; memset (&event, 0, sizeof (event)); event.type = (intptr_t) param; SDL_PushEvent (&event); } return interval; } static int accurate_delay (int ticks) { int funcstart, delay; if (ticks <= 0) return 0; if (!SDL_WasInit (SDL_INIT_TIMER)) { if (SDL_InitSubSystem (SDL_INIT_TIMER)) { RAISE (PyExc_SDLError, SDL_GetError ()); return -1; } } funcstart = SDL_GetTicks (); if (ticks >= WORST_CLOCK_ACCURACY) { delay = (ticks - 2) - (ticks % WORST_CLOCK_ACCURACY); if (delay >= WORST_CLOCK_ACCURACY) { Py_BEGIN_ALLOW_THREADS; SDL_Delay (delay); Py_END_ALLOW_THREADS; } } do { delay = ticks - (SDL_GetTicks () - funcstart); } while (delay > 0); return SDL_GetTicks () - funcstart; } static PyObject* time_get_ticks (PyObject* self) { if (!SDL_WasInit (SDL_INIT_TIMER)) return PyInt_FromLong (0); return PyInt_FromLong (SDL_GetTicks ()); } static PyObject* time_delay (PyObject* self, PyObject* arg) { int ticks; PyObject* arg0; /*for some reason PyArg_ParseTuple is puking on -1's! BLARG!*/ if (PyTuple_Size (arg) != 1) return RAISE (PyExc_ValueError, "delay requires one integer argument"); arg0 = PyTuple_GET_ITEM (arg, 0); if (!PyInt_Check (arg0)) return RAISE (PyExc_TypeError, "delay requires one integer argument"); ticks = PyInt_AsLong (arg0); if (ticks < 0) ticks = 0; ticks = accurate_delay (ticks); if (ticks == -1) return NULL; return PyInt_FromLong (ticks); } static PyObject* time_wait (PyObject* self, PyObject* arg) { int ticks, start; PyObject* arg0; /*for some reason PyArg_ParseTuple is puking on -1's! BLARG!*/ if (PyTuple_Size (arg) != 1) return RAISE (PyExc_ValueError, "delay requires one integer argument"); arg0 = PyTuple_GET_ITEM (arg, 0); if (!PyInt_Check (arg0)) return RAISE (PyExc_TypeError, "delay requires one integer argument"); if (!SDL_WasInit (SDL_INIT_TIMER)) { if (SDL_InitSubSystem (SDL_INIT_TIMER)) { RAISE (PyExc_SDLError, SDL_GetError ()); return NULL; } } ticks = PyInt_AsLong (arg0); if (ticks < 0) ticks = 0; start = SDL_GetTicks (); Py_BEGIN_ALLOW_THREADS; SDL_Delay (ticks); Py_END_ALLOW_THREADS; return PyInt_FromLong (SDL_GetTicks () - start); } static PyObject* time_set_timer (PyObject* self, PyObject* arg) { SDL_TimerID newtimer; int ticks = 0; intptr_t event = SDL_NOEVENT; if (!PyArg_ParseTuple (arg, "ii", &event, &ticks)) return NULL; if (event <= SDL_NOEVENT || event >= SDL_NUMEVENTS) return RAISE (PyExc_ValueError, "Event id must be between NOEVENT(0) and NUMEVENTS(32)"); /*stop original timer*/ if (event_timers[event]) { SDL_RemoveTimer (event_timers[event]); event_timers[event] = NULL; } if (ticks <= 0) Py_RETURN_NONE; /*just doublecheck that timer is initialized*/ if (!SDL_WasInit (SDL_INIT_TIMER)) { if (SDL_InitSubSystem (SDL_INIT_TIMER)) return RAISE (PyExc_SDLError, SDL_GetError ()); } newtimer = SDL_AddTimer (ticks, timer_callback, (void*) event); if (!newtimer) return RAISE (PyExc_SDLError, SDL_GetError ()); event_timers[event] = newtimer; Py_RETURN_NONE; } /*clock object interface*/ typedef struct { PyObject_HEAD int last_tick; int fps_count, fps_tick; float fps; int timepassed, rawpassed; PyObject* rendered; } PyClockObject; // to be called by the other tick functions. static PyObject* clock_tick_base(PyObject* self, PyObject* arg, int use_accurate_delay) { PyClockObject* _clock = (PyClockObject*) self; float framerate = 0.0f; int nowtime; if (!PyArg_ParseTuple (arg, "|f", &framerate)) return NULL; if (framerate) { int delay, endtime = (int) ((1.0f / framerate) * 1000.0f); _clock->rawpassed = SDL_GetTicks () - _clock->last_tick; delay = endtime - _clock->rawpassed; /*just doublecheck that timer is initialized*/ if (!SDL_WasInit (SDL_INIT_TIMER)) { if (SDL_InitSubSystem (SDL_INIT_TIMER)) { RAISE (PyExc_SDLError, SDL_GetError ()); return NULL; } } if (use_accurate_delay) delay = accurate_delay (delay); else { // this uses sdls delay, which can be inaccurate. if (delay < 0) delay = 0; Py_BEGIN_ALLOW_THREADS; SDL_Delay ((Uint32) delay); Py_END_ALLOW_THREADS; } if (delay == -1) return NULL; } nowtime = SDL_GetTicks (); _clock->timepassed = nowtime - _clock->last_tick; _clock->fps_count += 1; _clock->last_tick = nowtime; if (!framerate) _clock->rawpassed = _clock->timepassed; if (!_clock->fps_tick) { _clock->fps_count = 0; _clock->fps_tick = nowtime; } else if (_clock->fps_count >= 10) { _clock->fps = _clock->fps_count / ((nowtime - _clock->fps_tick) / 1000.0f); _clock->fps_count = 0; _clock->fps_tick = nowtime; Py_XDECREF (_clock->rendered); } return PyInt_FromLong (_clock->timepassed); } static PyObject* clock_tick (PyObject* self, PyObject* arg) { return clock_tick_base (self, arg, 0); } static PyObject* clock_tick_busy_loop (PyObject* self, PyObject* arg) { return clock_tick_base (self, arg, 1); } static PyObject* clock_get_fps (PyObject* self, PyObject* args) { PyClockObject* _clock = (PyClockObject*) self; return PyFloat_FromDouble (_clock->fps); } static PyObject* clock_get_time (PyObject* self) { PyClockObject* _clock = (PyClockObject*) self; return PyInt_FromLong (_clock->timepassed); } static PyObject* clock_get_rawtime (PyObject* self) { PyClockObject* _clock = (PyClockObject*) self; return PyInt_FromLong (_clock->rawpassed); } /* clock object internals */ static struct PyMethodDef clock_methods[] = { { "tick", clock_tick, METH_VARARGS, DOC_CLOCKTICK }, { "get_fps", (PyCFunction) clock_get_fps, METH_NOARGS, DOC_CLOCKGETFPS }, { "get_time", (PyCFunction) clock_get_time, METH_NOARGS, DOC_CLOCKGETTIME }, { "get_rawtime", (PyCFunction) clock_get_rawtime, METH_NOARGS, DOC_CLOCKGETRAWTIME }, { "tick_busy_loop", clock_tick_busy_loop, METH_VARARGS, DOC_CLOCKTICKBUSYLOOP }, { NULL, NULL, 0, NULL} }; static void clock_dealloc (PyObject* self) { PyClockObject* _clock = (PyClockObject*) self; Py_XDECREF (_clock->rendered); PyObject_DEL (self); } PyObject* clock_str (PyObject* self) { char str[1024]; PyClockObject* _clock = (PyClockObject*) self; sprintf (str, "", (float) _clock->fps); return Text_FromUTF8 (str); } static PyTypeObject PyClock_Type = { TYPE_HEAD (NULL, 0) "Clock", /* name */ sizeof(PyClockObject), /* basic size */ 0, /* itemsize */ clock_dealloc, /* dealloc */ 0, /* print */ 0, /* getattr */ 0, /* setattr */ 0, /* compare */ clock_str, /* repr */ 0, /* as_number */ 0, /* as_sequence */ 0, /* as_mapping */ (hashfunc)0, /* hash */ (ternaryfunc)0, /* call */ clock_str, /* str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* flags */ DOC_PYGAMETIMECLOCK, /* Documentation string */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ clock_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ }; PyObject* ClockInit (PyObject* self) { PyClockObject* _clock = PyObject_NEW (PyClockObject, &PyClock_Type); if (!_clock) { return NULL; } /*just doublecheck that timer is initialized*/ if (!SDL_WasInit (SDL_INIT_TIMER)) { if (SDL_InitSubSystem (SDL_INIT_TIMER)) return RAISE (PyExc_SDLError, SDL_GetError ()); } _clock->fps_tick = 0; _clock->last_tick = SDL_GetTicks (); _clock->fps = 0.0f; _clock->fps_count = 0; _clock->rendered = NULL; return (PyObject*) _clock; } static PyMethodDef _time_methods[] = { { "get_ticks", (PyCFunction) time_get_ticks, METH_NOARGS, DOC_PYGAMETIMEGETTICKS }, { "delay", time_delay, METH_VARARGS, DOC_PYGAMETIMEDELAY }, { "wait", time_wait, METH_VARARGS, DOC_PYGAMETIMEWAIT }, { "set_timer", time_set_timer, METH_VARARGS, DOC_PYGAMETIMESETTIMER }, { "Clock", (PyCFunction) ClockInit, METH_NOARGS, DOC_PYGAMETIMECLOCK }, { NULL, NULL, 0, NULL } }; #ifdef __SYMBIAN32__ PYGAME_EXPORT void initpygame_time (void) #else MODINIT_DEFINE (time) #endif { PyObject *module; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "time", DOC_PYGAMETIME, -1, _time_methods, NULL, NULL, NULL, NULL }; #endif /* need to import base module, just so SDL is happy. Do this first so if the module is there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } /* type preparation */ if (PyType_Ready (&PyClock_Type) < 0) { MODINIT_ERROR; } /* create the module */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "time", _time_methods, DOC_PYGAMETIME); #endif MODINIT_RETURN (module); } pygame-1.9.1release/src/surflock.c0000644000175000017500000002130311207055754017033 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners Copyright (C) 2008 Marcus von Appen This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* * internal surface locking support for python objects */ #define PYGAMEAPI_SURFLOCK_INTERNAL #include "pygame.h" #include "pgcompat.h" static int PySurface_Lock (PyObject* surfobj); static int PySurface_Unlock (PyObject* surfobj); static int PySurface_LockBy (PyObject* surfobj, PyObject* lockobj); static int PySurface_UnlockBy (PyObject* surfobj, PyObject* lockobj); static void _lifelock_dealloc (PyObject* self); static void PySurface_Prep (PyObject* surfobj) { struct SubSurface_Data* data = ((PySurfaceObject*) surfobj)->subsurface; if (data) { SDL_Surface* surf = PySurface_AsSurface (surfobj); SDL_Surface* owner = PySurface_AsSurface (data->owner); PySurface_LockBy (data->owner, surfobj); surf->pixels = ((char*) owner->pixels) + data->pixeloffset; } } static void PySurface_Unprep (PyObject* surfobj) { struct SubSurface_Data* data = ((PySurfaceObject*) surfobj)->subsurface; if (data) PySurface_UnlockBy (data->owner, surfobj); } static int PySurface_Lock (PyObject* surfobj) { return PySurface_LockBy (surfobj, surfobj); } static int PySurface_Unlock (PyObject* surfobj) { return PySurface_UnlockBy (surfobj, surfobj); } static int PySurface_LockBy (PyObject* surfobj, PyObject* lockobj) { PyObject *ref; PySurfaceObject* surf = (PySurfaceObject*) surfobj; if (!surf->locklist) { surf->locklist = PyList_New (0); if (!surf->locklist) return 0; } ref = PyWeakref_NewRef (lockobj, NULL); if (!ref) return 0; if (ref == Py_None) { Py_DECREF (ref); return 0; } PyList_Append (surf->locklist, ref); Py_DECREF (ref); if (surf->subsurface) PySurface_Prep (surfobj); if (SDL_LockSurface (surf->surf) == -1) { PyErr_SetString (PyExc_RuntimeError, "error locking surface"); return 0; } return 1; } static int PySurface_UnlockBy (PyObject* surfobj, PyObject* lockobj) { PySurfaceObject* surf = (PySurfaceObject*) surfobj; int found = 0; int noerror = 1; if (surf->locklist) { PyObject *item, *ref; Py_ssize_t len = PyList_Size (surf->locklist); while (--len >= 0 && !found) { item = PyList_GetItem (surf->locklist, len); ref = PyWeakref_GetObject (item); if (ref == lockobj) { if (PySequence_DelItem (surf->locklist, len) == -1) return 0; else found = 1; } } /* Clear dead references */ len = PyList_Size (surf->locklist); while (--len >= 0) { item = PyList_GetItem (surf->locklist, len); ref = PyWeakref_GetObject (item); if (ref == Py_None) { if (PySequence_DelItem (surf->locklist, len) == -1) noerror = 0; else found++; } } } if (!found) return noerror; /* Release all found locks. */ while (found > 0) { if (surf->surf != NULL) SDL_UnlockSurface (surf->surf); if (surf->subsurface) PySurface_Unprep (surfobj); found--; } return noerror; } static PyTypeObject PyLifetimeLock_Type = { TYPE_HEAD (NULL, 0) "SurfLifeLock", /*name*/ sizeof(PyLifetimeLock), /*basic size*/ 0, /* tp_itemsize */ _lifelock_dealloc, /* tp_dealloc*/ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_compare */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, 0, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ offsetof (PyLifetimeLock, weakrefs), /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ 0 /* tp_del */ }; /* lifetimelock object internals */ static void _lifelock_dealloc (PyObject* self) { PyLifetimeLock* lifelock = (PyLifetimeLock*) self; if (lifelock->weakrefs) PyObject_ClearWeakRefs (self); PySurface_UnlockBy (lifelock->surface, lifelock->lockobj); Py_DECREF (lifelock->surface); PyObject_DEL (self); } static PyObject* PySurface_LockLifetime (PyObject* surfobj, PyObject *lockobj) { PyLifetimeLock* life; if (!surfobj) return RAISE (PyExc_SDLError, SDL_GetError ()); life = PyObject_NEW (PyLifetimeLock, &PyLifetimeLock_Type); if (life) { life->surface = surfobj; life->lockobj = lockobj; life->weakrefs = NULL; Py_INCREF (surfobj); if (!PySurface_LockBy (surfobj, lockobj)) return NULL; } return (PyObject*) life; } static PyMethodDef _surflock_methods[] = { { NULL, NULL, 0, NULL } }; /*DOC*/ static char _surflock_doc[] = /*DOC*/ "Surface locking support"; MODINIT_DEFINE (surflock) { PyObject *module, *dict, *apiobj; int ecode; static void* c_api[PYGAMEAPI_SURFLOCK_NUMSLOTS]; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "surflock", _surflock_doc, -1, _surflock_methods, NULL, NULL, NULL, NULL }; #endif if (PyType_Ready (&PyLifetimeLock_Type) < 0) { MODINIT_ERROR; } /* Create the module and add the functions */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "surflock", _surflock_methods, _surflock_doc); #endif if (module == NULL) { MODINIT_ERROR; } dict = PyModule_GetDict (module); /* export the c api */ c_api[0] = &PyLifetimeLock_Type; c_api[1] = PySurface_Prep; c_api[2] = PySurface_Unprep; c_api[3] = PySurface_Lock; c_api[4] = PySurface_Unlock; c_api[5] = PySurface_LockBy; c_api[6] = PySurface_UnlockBy; c_api[7] = PySurface_LockLifetime; apiobj = PyCObject_FromVoidPtr (c_api, NULL); if (apiobj == NULL) { DECREF_MOD (module); MODINIT_ERROR; } ecode = PyDict_SetItemString (dict, PYGAMEAPI_LOCAL_ENTRY, apiobj); Py_DECREF (apiobj); if (ecode) { DECREF_MOD (module); MODINIT_ERROR; } MODINIT_RETURN (module); } pygame-1.9.1release/src/surface_fill.c0000644000175000017500000005602611207055754017653 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2007 Marcus von Appen This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "surface.h" static int surface_fill_blend_add (SDL_Surface *surface, SDL_Rect *rect, Uint32 color) { Uint8 *pixels; int width = rect->w; int height = rect->h; int skip; int bpp = surface->format->BytesPerPixel; int n; SDL_PixelFormat *fmt = surface->format; Uint8 sR, sG, sB, sA, cR, cG, cB, cA; Uint32 pixel; Uint32 tmp; int result = -1; int ppa = (surface->flags & SDL_SRCALPHA && fmt->Amask); pixels = (Uint8 *) surface->pixels + surface->offset + (Uint16) rect->y * surface->pitch + (Uint16) rect->x * bpp; skip = surface->pitch - width * bpp; switch (bpp) { case 1: { SDL_GetRGBA (color, fmt, &cR, &cG, &cB, &cA); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1 (sR, sG, sB, sA, pixels, fmt); BLEND_ADD (tmp, cR, cG, cB, cA, sR, sG, sB, sA); *pixels = SDL_MapRGBA (fmt, sR, sG, sB, sA); pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } case 3: { size_t offsetR, offsetG, offsetB; SET_OFFSETS_24 (offsetR, offsetG, offsetB, fmt); GET_PIXELVALS (cR, cG, cB, cA, color, fmt, ppa); while (height--) { LOOP_UNROLLED4( { GET_PIXEL (pixel, bpp, pixels); GET_PIXELVALS (sR, sG, sB, sA, pixel, fmt, ppa); BLEND_ADD (tmp, cR, cG, cB, cA, sR, sG, sB, sA); pixels[offsetR] = sR; pixels[offsetG] = sG; pixels[offsetB] = sB; pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } default: { GET_PIXELVALS (cR, cG, cB, cA, color, fmt, ppa); /* printf ("Color: %d, %d, %d, %d, BPP is: %d\n", cR, cG, cB, cA, bpp); */ while (height--) { LOOP_UNROLLED4( { GET_PIXEL (pixel, bpp, pixels); GET_PIXELVALS (sR, sG, sB, sA, pixel, fmt, ppa); BLEND_ADD (tmp, cR, cG, cB, cA, sR, sG, sB, sA); CREATE_PIXEL(pixels, sR, sG, sB, sA, bpp, fmt); pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } } return result; } static int surface_fill_blend_sub (SDL_Surface *surface, SDL_Rect *rect, Uint32 color) { Uint8 *pixels; int width = rect->w; int height = rect->h; int skip; int bpp = surface->format->BytesPerPixel; int n; SDL_PixelFormat *fmt = surface->format; Uint8 sR, sG, sB, sA, cR, cG, cB, cA; Uint32 pixel; Sint32 tmp2; int result = -1; int ppa = (surface->flags & SDL_SRCALPHA && fmt->Amask); pixels = (Uint8 *) surface->pixels + surface->offset + (Uint16) rect->y * surface->pitch + (Uint16) rect->x * bpp; skip = surface->pitch - width * bpp; switch (bpp) { case 1: { SDL_GetRGBA (color, fmt, &cR, &cG, &cB, &cA); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1 (sR, sG, sB, sA, pixels, fmt); BLEND_SUB (tmp2, cR, cG, cB, cA, sR, sG, sB, sA); *pixels = SDL_MapRGBA (fmt, sR, sG, sB, sA); pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } case 3: { size_t offsetR, offsetG, offsetB; SET_OFFSETS_24 (offsetR, offsetG, offsetB, fmt); GET_PIXELVALS (cR, cG, cB, cA, color, fmt, ppa); while (height--) { LOOP_UNROLLED4( { GET_PIXEL (pixel, bpp, pixels); GET_PIXELVALS (sR, sG, sB, sA, pixel, fmt, ppa); BLEND_SUB (tmp2, cR, cG, cB, cA, sR, sG, sB, sA); pixels[offsetR] = sR; pixels[offsetG] = sG; pixels[offsetB] = sB; pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } default: { GET_PIXELVALS (cR, cG, cB, cA, color, fmt, ppa); /* printf ("Color: %d, %d, %d, %d, BPP is: %d\n", cR, cG, cB, cA, bpp); */ while (height--) { LOOP_UNROLLED4( { GET_PIXEL (pixel, bpp, pixels); GET_PIXELVALS (sR, sG, sB, sA, pixel, fmt, ppa); BLEND_SUB (tmp2, cR, cG, cB, cA, sR, sG, sB, sA); CREATE_PIXEL(pixels, sR, sG, sB, sA, bpp, fmt); pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } } return result; } static int surface_fill_blend_mult (SDL_Surface *surface, SDL_Rect *rect, Uint32 color) { Uint8 *pixels; int width = rect->w; int height = rect->h; int skip; int bpp = surface->format->BytesPerPixel; int n; SDL_PixelFormat *fmt = surface->format; Uint8 sR, sG, sB, sA, cR, cG, cB, cA; Uint32 pixel; int result = -1; int ppa = (surface->flags & SDL_SRCALPHA && fmt->Amask); pixels = (Uint8 *) surface->pixels + surface->offset + (Uint16) rect->y * surface->pitch + (Uint16) rect->x * bpp; skip = surface->pitch - width * bpp; switch (bpp) { case 1: { SDL_GetRGBA (color, fmt, &cR, &cG, &cB, &cA); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1 (sR, sG, sB, sA, pixels, fmt); BLEND_MULT (cR, cG, cB, cA, sR, sG, sB, sA); *pixels = SDL_MapRGBA (fmt, sR, sG, sB, sA); pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } case 3: { size_t offsetR, offsetG, offsetB; SET_OFFSETS_24 (offsetR, offsetG, offsetB, fmt); GET_PIXELVALS (cR, cG, cB, cA, color, fmt, ppa); while (height--) { LOOP_UNROLLED4( { GET_PIXEL (pixel, bpp, pixels); GET_PIXELVALS (sR, sG, sB, sA, pixel, fmt, ppa); BLEND_MULT (cR, cG, cB, cA, sR, sG, sB, sA); pixels[offsetR] = sR; pixels[offsetG] = sG; pixels[offsetB] = sB; pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } default: { GET_PIXELVALS (cR, cG, cB, cA, color, fmt, ppa); /* printf ("Color: %d, %d, %d, %d, BPP is: %d\n", cR, cG, cB, cA, bpp); */ while (height--) { LOOP_UNROLLED4( { GET_PIXEL (pixel, bpp, pixels); GET_PIXELVALS (sR, sG, sB, sA, pixel, fmt, ppa); BLEND_MULT (cR, cG, cB, cA, sR, sG, sB, sA); CREATE_PIXEL(pixels, sR, sG, sB, sA, bpp, fmt); pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } } return result; } static int surface_fill_blend_min (SDL_Surface *surface, SDL_Rect *rect, Uint32 color) { Uint8 *pixels; int width = rect->w; int height = rect->h; int skip; int bpp = surface->format->BytesPerPixel; int n; SDL_PixelFormat *fmt = surface->format; Uint8 sR, sG, sB, sA, cR, cG, cB, cA; Uint32 pixel; int result = -1; int ppa = (surface->flags & SDL_SRCALPHA && fmt->Amask); pixels = (Uint8 *) surface->pixels + surface->offset + (Uint16) rect->y * surface->pitch + (Uint16) rect->x * bpp; skip = surface->pitch - width * bpp; switch (bpp) { case 1: { SDL_GetRGBA (color, fmt, &cR, &cG, &cB, &cA); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1 (sR, sG, sB, sA, pixels, fmt); BLEND_MIN (cR, cG, cB, cA, sR, sG, sB, sA); *pixels = SDL_MapRGBA (fmt, sR, sG, sB, sA); pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } case 3: { size_t offsetR, offsetG, offsetB; SET_OFFSETS_24 (offsetR, offsetG, offsetB, fmt); GET_PIXELVALS (cR, cG, cB, cA, color, fmt, ppa); while (height--) { LOOP_UNROLLED4( { GET_PIXEL (pixel, bpp, pixels); GET_PIXELVALS (sR, sG, sB, sA, pixel, fmt, ppa); BLEND_MIN (cR, cG, cB, cA, sR, sG, sB, sA); pixels[offsetR] = sR; pixels[offsetG] = sG; pixels[offsetB] = sB; pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } default: { GET_PIXELVALS (cR, cG, cB, cA, color, fmt, ppa); /* printf ("Color: %d, %d, %d, %d, BPP is: %d\n", cR, cG, cB, cA, bpp); */ while (height--) { LOOP_UNROLLED4( { GET_PIXEL (pixel, bpp, pixels); GET_PIXELVALS (sR, sG, sB, sA, pixel, fmt, ppa); BLEND_MIN (cR, cG, cB, cA, sR, sG, sB, sA); CREATE_PIXEL(pixels, sR, sG, sB, sA, bpp, fmt); pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } } return result; } static int surface_fill_blend_max (SDL_Surface *surface, SDL_Rect *rect, Uint32 color) { Uint8 *pixels; int width = rect->w; int height = rect->h; int skip; int bpp = surface->format->BytesPerPixel; int n; SDL_PixelFormat *fmt = surface->format; Uint8 sR, sG, sB, sA, cR, cG, cB, cA; Uint32 pixel; int result = -1; int ppa = (surface->flags & SDL_SRCALPHA && fmt->Amask); pixels = (Uint8 *) surface->pixels + surface->offset + (Uint16) rect->y * surface->pitch + (Uint16) rect->x * bpp; skip = surface->pitch - width * bpp; switch (bpp) { case 1: { SDL_GetRGBA (color, fmt, &cR, &cG, &cB, &cA); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1 (sR, sG, sB, sA, pixels, fmt); BLEND_MAX (cR, cG, cB, cA, sR, sG, sB, sA); *pixels = SDL_MapRGBA (fmt, sR, sG, sB, sA); pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } case 3: { size_t offsetR, offsetG, offsetB; SET_OFFSETS_24 (offsetR, offsetG, offsetB, fmt); GET_PIXELVALS (cR, cG, cB, cA, color, fmt, ppa); while (height--) { LOOP_UNROLLED4( { GET_PIXEL (pixel, bpp, pixels); GET_PIXELVALS (sR, sG, sB, sA, pixel, fmt, ppa); BLEND_MAX (cR, cG, cB, cA, sR, sG, sB, sA); pixels[offsetR] = sR; pixels[offsetG] = sG; pixels[offsetB] = sB; pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } default: { GET_PIXELVALS (cR, cG, cB, cA, color, fmt, ppa); /* printf ("Color: %d, %d, %d, %d, BPP is: %d\n", cR, cG, cB, cA, bpp); */ while (height--) { LOOP_UNROLLED4( { GET_PIXEL (pixel, bpp, pixels); GET_PIXELVALS (sR, sG, sB, sA, pixel, fmt, ppa); BLEND_MAX (cR, cG, cB, cA, sR, sG, sB, sA); CREATE_PIXEL(pixels, sR, sG, sB, sA, bpp, fmt); pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } } return result; } /* ------------------------- */ static int surface_fill_blend_rgba_add (SDL_Surface *surface, SDL_Rect *rect, Uint32 color) { Uint8 *pixels; int width = rect->w; int height = rect->h; int skip; int bpp = surface->format->BytesPerPixel; int n; SDL_PixelFormat *fmt = surface->format; Uint8 sR, sG, sB, sA, cR, cG, cB, cA; Uint32 pixel; Uint32 tmp; int result = -1; int ppa = (surface->flags & SDL_SRCALPHA && fmt->Amask); if (!ppa) { return surface_fill_blend_add (surface, rect, color); } pixels = (Uint8 *) surface->pixels + surface->offset + (Uint16) rect->y * surface->pitch + (Uint16) rect->x * bpp; skip = surface->pitch - width * bpp; switch (bpp) { case 1: { SDL_GetRGBA (color, fmt, &cR, &cG, &cB, &cA); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1 (sR, sG, sB, sA, pixels, fmt); BLEND_RGBA_ADD (tmp, cR, cG, cB, cA, sR, sG, sB, sA); *pixels = SDL_MapRGBA (fmt, sR, sG, sB, sA); pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } default: { GET_PIXELVALS (cR, cG, cB, cA, color, fmt, ppa); /* printf ("Color: %d, %d, %d, %d, BPP is: %d\n", cR, cG, cB, cA, bpp); */ while (height--) { LOOP_UNROLLED4( { GET_PIXEL (pixel, bpp, pixels); GET_PIXELVALS (sR, sG, sB, sA, pixel, fmt, ppa); BLEND_RGBA_ADD (tmp, cR, cG, cB, cA, sR, sG, sB, sA); CREATE_PIXEL(pixels, sR, sG, sB, sA, bpp, fmt); pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } } return result; } static int surface_fill_blend_rgba_sub (SDL_Surface *surface, SDL_Rect *rect, Uint32 color) { Uint8 *pixels; int width = rect->w; int height = rect->h; int skip; int bpp = surface->format->BytesPerPixel; int n; SDL_PixelFormat *fmt = surface->format; Uint8 sR, sG, sB, sA, cR, cG, cB, cA; Uint32 pixel; Sint32 tmp2; int result = -1; int ppa = (surface->flags & SDL_SRCALPHA && fmt->Amask); if (!ppa) { return surface_fill_blend_sub (surface, rect, color); } pixels = (Uint8 *) surface->pixels + surface->offset + (Uint16) rect->y * surface->pitch + (Uint16) rect->x * bpp; skip = surface->pitch - width * bpp; switch (bpp) { case 1: { SDL_GetRGBA (color, fmt, &cR, &cG, &cB, &cA); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1 (sR, sG, sB, sA, pixels, fmt); BLEND_RGBA_SUB (tmp2, cR, cG, cB, cA, sR, sG, sB, sA); *pixels = SDL_MapRGBA (fmt, sR, sG, sB, sA); pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } default: { GET_PIXELVALS (cR, cG, cB, cA, color, fmt, ppa); /* printf ("Color: %d, %d, %d, %d, BPP is: %d\n", cR, cG, cB, cA, bpp); */ while (height--) { LOOP_UNROLLED4( { GET_PIXEL (pixel, bpp, pixels); GET_PIXELVALS (sR, sG, sB, sA, pixel, fmt, ppa); BLEND_RGBA_SUB (tmp2, cR, cG, cB, cA, sR, sG, sB, sA); CREATE_PIXEL(pixels, sR, sG, sB, sA, bpp, fmt); pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } } return result; } static int surface_fill_blend_rgba_mult (SDL_Surface *surface, SDL_Rect *rect, Uint32 color) { Uint8 *pixels; int width = rect->w; int height = rect->h; int skip; int bpp = surface->format->BytesPerPixel; int n; SDL_PixelFormat *fmt = surface->format; Uint8 sR, sG, sB, sA, cR, cG, cB, cA; Uint32 pixel; int result = -1; int ppa = (surface->flags & SDL_SRCALPHA && fmt->Amask); if (!ppa) { return surface_fill_blend_mult (surface, rect, color); } pixels = (Uint8 *) surface->pixels + surface->offset + (Uint16) rect->y * surface->pitch + (Uint16) rect->x * bpp; skip = surface->pitch - width * bpp; switch (bpp) { case 1: { SDL_GetRGBA (color, fmt, &cR, &cG, &cB, &cA); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1 (sR, sG, sB, sA, pixels, fmt); BLEND_RGBA_MULT (cR, cG, cB, cA, sR, sG, sB, sA); *pixels = SDL_MapRGBA (fmt, sR, sG, sB, sA); pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } default: { GET_PIXELVALS (cR, cG, cB, cA, color, fmt, ppa); /* printf ("Color: %d, %d, %d, %d, BPP is: %d\n", cR, cG, cB, cA, bpp); */ while (height--) { LOOP_UNROLLED4( { GET_PIXEL (pixel, bpp, pixels); GET_PIXELVALS (sR, sG, sB, sA, pixel, fmt, ppa); BLEND_RGBA_MULT (cR, cG, cB, cA, sR, sG, sB, sA); CREATE_PIXEL(pixels, sR, sG, sB, sA, bpp, fmt); pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } } return result; } static int surface_fill_blend_rgba_min (SDL_Surface *surface, SDL_Rect *rect, Uint32 color) { Uint8 *pixels; int width = rect->w; int height = rect->h; int skip; int bpp = surface->format->BytesPerPixel; int n; SDL_PixelFormat *fmt = surface->format; Uint8 sR, sG, sB, sA, cR, cG, cB, cA; Uint32 pixel; int result = -1; int ppa = (surface->flags & SDL_SRCALPHA && fmt->Amask); if (!ppa) { return surface_fill_blend_min (surface, rect, color); } pixels = (Uint8 *) surface->pixels + surface->offset + (Uint16) rect->y * surface->pitch + (Uint16) rect->x * bpp; skip = surface->pitch - width * bpp; switch (bpp) { case 1: { SDL_GetRGBA (color, fmt, &cR, &cG, &cB, &cA); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1 (sR, sG, sB, sA, pixels, fmt); BLEND_RGBA_MIN (cR, cG, cB, cA, sR, sG, sB, sA); *pixels = SDL_MapRGBA (fmt, sR, sG, sB, sA); pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } default: { GET_PIXELVALS (cR, cG, cB, cA, color, fmt, ppa); /* printf ("Color: %d, %d, %d, %d, BPP is: %d\n", cR, cG, cB, cA, bpp); */ while (height--) { LOOP_UNROLLED4( { GET_PIXEL (pixel, bpp, pixels); GET_PIXELVALS (sR, sG, sB, sA, pixel, fmt, ppa); BLEND_RGBA_MIN (cR, cG, cB, cA, sR, sG, sB, sA); CREATE_PIXEL(pixels, sR, sG, sB, sA, bpp, fmt); pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } } return result; } static int surface_fill_blend_rgba_max (SDL_Surface *surface, SDL_Rect *rect, Uint32 color) { Uint8 *pixels; int width = rect->w; int height = rect->h; int skip; int bpp = surface->format->BytesPerPixel; int n; SDL_PixelFormat *fmt = surface->format; Uint8 sR, sG, sB, sA, cR, cG, cB, cA; Uint32 pixel; int result = -1; int ppa = (surface->flags & SDL_SRCALPHA && fmt->Amask); if (!ppa) { return surface_fill_blend_max (surface, rect, color); } pixels = (Uint8 *) surface->pixels + surface->offset + (Uint16) rect->y * surface->pitch + (Uint16) rect->x * bpp; skip = surface->pitch - width * bpp; switch (bpp) { case 1: { SDL_GetRGBA (color, fmt, &cR, &cG, &cB, &cA); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1 (sR, sG, sB, sA, pixels, fmt); BLEND_RGBA_MAX (cR, cG, cB, cA, sR, sG, sB, sA); *pixels = SDL_MapRGBA (fmt, sR, sG, sB, sA); pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } default: { GET_PIXELVALS (cR, cG, cB, cA, color, fmt, ppa); /* printf ("Color: %d, %d, %d, %d, BPP is: %d\n", cR, cG, cB, cA, bpp); */ while (height--) { LOOP_UNROLLED4( { GET_PIXEL (pixel, bpp, pixels); GET_PIXELVALS (sR, sG, sB, sA, pixel, fmt, ppa); BLEND_RGBA_MAX (cR, cG, cB, cA, sR, sG, sB, sA); CREATE_PIXEL(pixels, sR, sG, sB, sA, bpp, fmt); pixels += bpp; }, n, width); pixels += skip; } result = 0; break; } } return result; } int surface_fill_blend (SDL_Surface *surface, SDL_Rect *rect, Uint32 color, int blendargs) { int result = -1; int locked = 0; /* Lock the surface, if needed */ if (SDL_MUSTLOCK (surface)) { if (SDL_LockSurface (surface) < 0) return -1; locked = 1; } switch (blendargs) { case PYGAME_BLEND_ADD: { result = surface_fill_blend_add (surface, rect, color); break; } case PYGAME_BLEND_SUB: { result = surface_fill_blend_sub (surface, rect, color); break; } case PYGAME_BLEND_MULT: { result = surface_fill_blend_mult (surface, rect, color); break; } case PYGAME_BLEND_MIN: { result = surface_fill_blend_min (surface, rect, color); break; } case PYGAME_BLEND_MAX: { result = surface_fill_blend_max (surface, rect, color); break; } case PYGAME_BLEND_RGBA_ADD: { result = surface_fill_blend_rgba_add (surface, rect, color); break; } case PYGAME_BLEND_RGBA_SUB: { result = surface_fill_blend_rgba_sub (surface, rect, color); break; } case PYGAME_BLEND_RGBA_MULT: { result = surface_fill_blend_rgba_mult (surface, rect, color); break; } case PYGAME_BLEND_RGBA_MIN: { result = surface_fill_blend_rgba_min (surface, rect, color); break; } case PYGAME_BLEND_RGBA_MAX: { result = surface_fill_blend_rgba_max (surface, rect, color); break; } default: { result = -1; break; } } if (locked) { SDL_UnlockSurface (surface); } return result; } pygame-1.9.1release/src/surface.h0000644000175000017500000003102511147144371016637 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners Copyright (C) 2007 Marcus von Appen This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ #ifndef SURFACE_H #define SURFACE_H #include #include "pygame.h" #define PYGAME_BLEND_ADD 0x1 #define PYGAME_BLEND_SUB 0x2 #define PYGAME_BLEND_MULT 0x3 #define PYGAME_BLEND_MIN 0x4 #define PYGAME_BLEND_MAX 0x5 #define PYGAME_BLEND_RGB_ADD 0x1 #define PYGAME_BLEND_RGB_SUB 0x2 #define PYGAME_BLEND_RGB_MULT 0x3 #define PYGAME_BLEND_RGB_MIN 0x4 #define PYGAME_BLEND_RGB_MAX 0x5 #define PYGAME_BLEND_RGBA_ADD 0x6 #define PYGAME_BLEND_RGBA_SUB 0x7 #define PYGAME_BLEND_RGBA_MULT 0x8 #define PYGAME_BLEND_RGBA_MIN 0x9 #define PYGAME_BLEND_RGBA_MAX 0x10 #if SDL_BYTEORDER == SDL_LIL_ENDIAN #define GET_PIXEL_24(b) (b[0] + (b[1] << 8) + (b[2] << 16)) #else #define GET_PIXEL_24(b) (b[2] + (b[1] << 8) + (b[0] << 16)) #endif #define GET_PIXEL(pxl, bpp, source) \ switch (bpp) \ { \ case 2: \ pxl = *((Uint16 *) (source)); \ break; \ case 4: \ pxl = *((Uint32 *) (source)); \ break; \ default: \ { \ Uint8 *b = (Uint8 *) source; \ pxl = GET_PIXEL_24(b); \ } \ break; \ } #define GET_PIXELVALS(_sR, _sG, _sB, _sA, px, fmt, ppa) \ _sR = ((px & fmt->Rmask) >> fmt->Rshift); \ _sR = (_sR << fmt->Rloss) + (_sR >> (8 - (fmt->Rloss << 1))); \ _sG = ((px & fmt->Gmask) >> fmt->Gshift); \ _sG = (_sG << fmt->Gloss) + (_sG >> (8 - (fmt->Gloss << 1))); \ _sB = ((px & fmt->Bmask) >> fmt->Bshift); \ _sB = (_sB << fmt->Bloss) + (_sB >> (8 - (fmt->Bloss << 1))); \ if (ppa) \ { \ _sA = ((px & fmt->Amask) >> fmt->Ashift); \ _sA = (_sA << fmt->Aloss) + (_sA >> (8 - (fmt->Aloss << 1))); \ } \ else \ { \ _sA = 255; \ } #define GET_PIXELVALS_1(sr, sg, sb, sa, _src, _fmt) \ sr = _fmt->palette->colors[*((Uint8 *) (_src))].r; \ sg = _fmt->palette->colors[*((Uint8 *) (_src))].g; \ sb = _fmt->palette->colors[*((Uint8 *) (_src))].b; \ sa = 255; #if SDL_BYTEORDER == SDL_LIL_ENDIAN #define SET_OFFSETS_24(or, og, ob, fmt) \ { \ or = (fmt->Rshift == 0 ? 0 : \ fmt->Rshift == 8 ? 1 : \ 2 ); \ og = (fmt->Gshift == 0 ? 0 : \ fmt->Gshift == 8 ? 1 : \ 2 ); \ ob = (fmt->Bshift == 0 ? 0 : \ fmt->Bshift == 8 ? 1 : \ 2 ); \ } #define SET_OFFSETS_32(or, og, ob, fmt) \ { \ or = (fmt->Rshift == 0 ? 0 : \ fmt->Rshift == 8 ? 1 : \ fmt->Rshift == 16 ? 2 : \ 3 ); \ og = (fmt->Gshift == 0 ? 0 : \ fmt->Gshift == 8 ? 1 : \ fmt->Gshift == 16 ? 2 : \ 3 ); \ ob = (fmt->Bshift == 0 ? 0 : \ fmt->Bshift == 8 ? 1 : \ fmt->Bshift == 16 ? 2 : \ 3 ); \ } #else #define SET_OFFSETS_24(or, og, ob, fmt) \ { \ or = (fmt->Rshift == 0 ? 2 : \ fmt->Rshift == 8 ? 1 : \ 0 ); \ og = (fmt->Gshift == 0 ? 2 : \ fmt->Gshift == 8 ? 1 : \ 0 ); \ ob = (fmt->Bshift == 0 ? 2 : \ fmt->Bshift == 8 ? 1 : \ 0 ); \ } #define SET_OFFSETS_32(or, og, ob, fmt) \ { \ or = (fmt->Rshift == 0 ? 3 : \ fmt->Rshift == 8 ? 2 : \ fmt->Rshift == 16 ? 1 : \ 0 ); \ og = (fmt->Gshift == 0 ? 3 : \ fmt->Gshift == 8 ? 2 : \ fmt->Gshift == 16 ? 1 : \ 0 ); \ ob = (fmt->Bshift == 0 ? 3 : \ fmt->Bshift == 8 ? 2 : \ fmt->Bshift == 16 ? 1 : \ 0 ); \ } #endif #define CREATE_PIXEL(buf, r, g, b, a, bp, ft) \ switch (bp) \ { \ case 2: \ *((Uint16 *) (buf)) = \ ((r >> ft->Rloss) << ft->Rshift) | \ ((g >> ft->Gloss) << ft->Gshift) | \ ((b >> ft->Bloss) << ft->Bshift) | \ ((a >> ft->Aloss) << ft->Ashift); \ break; \ case 4: \ *((Uint32 *) (buf)) = \ ((r >> ft->Rloss) << ft->Rshift) | \ ((g >> ft->Gloss) << ft->Gshift) | \ ((b >> ft->Bloss) << ft->Bshift) | \ ((a >> ft->Aloss) << ft->Ashift); \ break; \ } /* Pretty good idea from Tom Duff :-). */ #define LOOP_UNROLLED4(code, n, width) \ n = (width + 3) / 4; \ switch (width & 3) \ { \ case 0: do { code; \ case 3: code; \ case 2: code; \ case 1: code; \ } while (--n > 0); \ } /* Used in the srcbpp == dstbpp == 1 blend functions */ #define REPEAT_3(code) \ code; \ code; \ code; #define REPEAT_4(code) \ code; \ code; \ code; \ code; #define BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA) \ tmp = dR + sR; dR = (tmp <= 255 ? tmp : 255); \ tmp = dG + sG; dG = (tmp <= 255 ? tmp : 255); \ tmp = dB + sB; dB = (tmp <= 255 ? tmp : 255); #define BLEND_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA) \ tmp = dR - sR; dR = (tmp >= 0 ? tmp : 0); \ tmp = dG - sG; dG = (tmp >= 0 ? tmp : 0); \ tmp = dB - sB; dB = (tmp >= 0 ? tmp : 0); #define BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA) \ dR = (dR && sR) ? (dR * sR) >> 8 : 0; \ dG = (dG && sG) ? (dG * sG) >> 8 : 0; \ dB = (dB && sB) ? (dB * sB) >> 8 : 0; #define BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA) \ if(sR < dR) { dR = sR; } \ if(sG < dG) { dG = sG; } \ if(sB < dB) { dB = sB; } #define BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA) \ if(sR > dR) { dR = sR; } \ if(sG > dG) { dG = sG; } \ if(sB > dB) { dB = sB; } #define BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA) \ tmp = dR + sR; dR = (tmp <= 255 ? tmp : 255); \ tmp = dG + sG; dG = (tmp <= 255 ? tmp : 255); \ tmp = dB + sB; dB = (tmp <= 255 ? tmp : 255); \ tmp = dA + sA; dA = (tmp <= 255 ? tmp : 255); #define BLEND_RGBA_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA) \ tmp = dR - sR; dR = (tmp >= 0 ? tmp : 0); \ tmp = dG - sG; dG = (tmp >= 0 ? tmp : 0); \ tmp = dB - sB; dB = (tmp >= 0 ? tmp : 0); \ tmp = dA - sA; dA = (tmp >= 0 ? tmp : 0); #define BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA) \ dR = (dR && sR) ? (dR * sR) >> 8 : 0; \ dG = (dG && sG) ? (dG * sG) >> 8 : 0; \ dB = (dB && sB) ? (dB * sB) >> 8 : 0; \ dA = (dA && sA) ? (dA * sA) >> 8 : 0; #define BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA) \ if(sR < dR) { dR = sR; } \ if(sG < dG) { dG = sG; } \ if(sB < dB) { dB = sB; } \ if(sA < dA) { dA = sA; } #define BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA) \ if(sR > dR) { dR = sR; } \ if(sG > dG) { dG = sG; } \ if(sB > dB) { dB = sB; } \ if(sA > dA) { dA = sA; } #if 1 /* Choose an alpha blend equation. If the sign is preserved on a right shift * then use a specialized, faster, equation. Otherwise a more general form, * where all additions are done before the shift, is needed. */ #if (-1 >> 1) < 0 #define ALPHA_BLEND_COMP(sC, dC, sA) ((((sC - dC) * sA + sC) >> 8) + dC) #else #define ALPHA_BLEND_COMP(sC, dC, sA) (((dC << 8) + (sC - dC) * sA + sC) >> 8) #endif #define ALPHA_BLEND(sR, sG, sB, sA, dR, dG, dB, dA) \ do { \ if (dA) \ { \ dR = ALPHA_BLEND_COMP(sR, dR, sA); \ dG = ALPHA_BLEND_COMP(sG, dG, sA); \ dB = ALPHA_BLEND_COMP(sB, dB, sA); \ dA = sA + dA - ((sA * dA) / 255); \ } \ else \ { \ dR = sR; \ dG = sG; \ dB = sB; \ dA = sA; \ } \ } while(0) #elif 0 #define ALPHA_BLEND(sR, sG, sB, sA, dR, dG, dB, dA) \ do { \ if(sA){ \ if(dA && sA < 255){ \ int dContrib = dA*(255 - sA)/255; \ dA = sA+dA - ((sA*dA)/255); \ dR = (dR*dContrib + sR*sA)/dA; \ dG = (dG*dContrib + sG*sA)/dA; \ dB = (dB*dContrib + sB*sA)/dA; \ }else{ \ dR = sR; \ dG = sG; \ dB = sB; \ dA = sA; \ } \ } \ } while(0) #endif int surface_fill_blend (SDL_Surface *surface, SDL_Rect *rect, Uint32 color, int blendargs); int pygame_AlphaBlit (SDL_Surface * src, SDL_Rect * srcrect, SDL_Surface * dst, SDL_Rect * dstrect, int the_args); int pygame_Blit (SDL_Surface * src, SDL_Rect * srcrect, SDL_Surface * dst, SDL_Rect * dstrect, int the_args); #endif /* SURFACE_H */ pygame-1.9.1release/src/surface.doc0000644000175000017500000005741711227457534017201 0ustar vincentvincentpygame.Surface pygame object for representing images pygame.Surface((width, height), flags=0, depth=0, masks=None): return Surface pygame.Surface((width, height), flags=0, Surface): return Surface A pygame Surface is used to represent any image. The Surface has a fixed resolution and pixel format. Surfaces with 8bit pixels use a color palette to map to 24bit color. Call pygame.Surface() to create a new image object. The Surface will be cleared to all black. The only required arguments are the sizes. With no additional arguments, the Surface will be created in a format that best matches the display Surface. The pixel format can be controlled by passing the bit depth or an existing Surface. The flags argument is a bitmask of additional features for the surface. You can pass any combination of these flags: HWSURFACE, creates the image in video memory SRCALPHA, the pixel format will include a per-pixel alpha Both flags are only a request, and may not be possible for all displays and formats. Advance users can combine a set of bitmasks with a depth value. The masks are a set of 4 integers representing which bits in a pixel will represent each color. Normal Surfaces should not require the masks argument. Surfaces can have many extra attributes like alpha planes, colorkeys, source rectangle clipping. These functions mainly effect how the Surface is blitted to other Surfaces. The blit routines will attempt to use hardware acceleration when possible, otherwise they will use highly optimized software blitting methods. There are three types of transparency supported in Pygame: colorkeys, surface alphas, and pixel alphas. Surface alphas can be mixed with colorkeys, but an image with per pixel alphas cannot use the other modes. Colorkey transparency makes a single color value transparent. Any pixels matching the colorkey will not be drawn. The surface alpha value is a single value that changes the transparency for the entire image. A surface alpha of 255 is opaque, and a value of 0 is completely transparent. Per pixel alphas are different because they store a transparency value for every pixel. This allows for the most precise transparency effects, but it also the slowest. Per pixel alphas cannot be mixed with surface alpha and colorkeys. There is support for pixel access for the Surfaces. Pixel access on hardware surfaces is slow and not recommended. Pixels can be accessed using the get_at() and set_at() functions. These methods are fine for simple access, but will be considerably slow when doing of pixel work with them. If you plan on doing a lot of pixel level work, it is recommended to use the pygame.surfarray module, which can treat the surfaces like large multidimensional arrays (and it's quite quick). Any functions that directly access a surface's pixel data will need that surface to be lock()'ed. These functions can lock() and unlock() the surfaces themselves without assistance. But, if a function will be called many times, there will be a lot of overhead for multiple locking and unlocking of the surface. It is best to lock the surface manually before making the function call many times, and then unlocking when you are finished. All functions that need a locked surface will say so in their docs. Remember to leave the Surface locked only while necessary. Surface pixels are stored internally as a single number that has all the colors encoded into it. Use the Surface.map_rgb() and Surface.unmap_rgb() to convert between individual red, green, and blue values into a packed integer for that Surface. Surfaces can also reference sections of other Surfaces. These are created with the Surface.subsurface() method. Any change to either Surface will effect the other. Each Surface contains a clipping area. By default the clip area covers the entire Surface. If it is changed, all drawing operations will only effect the smaller area.
    blit draw one image onto another Surface.blit(source, dest, area=None, special_flags = 0): return Rect Draws a source Surface onto this Surface. The draw can be positioned with the dest argument. Dest can either be pair of coordinates representing the upper left corner of the source. A Rect can also be passed as the destination and the topleft corner of the rectangle will be used as the position for the blit. The size of the destination rectangle does not effect the blit. An optional area rectangle can be passed as well. This represents a smaller portion of the source Surface to draw. An optional special flags is for passing in new in 1.8.0: BLEND_ADD, BLEND_SUB, BLEND_MULT, BLEND_MIN, BLEND_MAX new in 1.8.1: BLEND_RGBA_ADD, BLEND_RGBA_SUB, BLEND_RGBA_MULT, BLEND_RGBA_MIN, BLEND_RGBA_MAX BLEND_RGB_ADD, BLEND_RGB_SUB, BLEND_RGB_MULT, BLEND_RGB_MIN, BLEND_RGB_MAX With other special blitting flags perhaps added in the future. The return rectangle is the area of the affected pixels, excluding any pixels outside the destination Surface, or outside the clipping area. Pixel alphas will be ignored when blitting to an 8 bit Surface. special_flags new in pygame 1.8. For a surface with colorkey or blanket alpha, a blit to self may give slightly different colors than a non self-blit. convert change the pixel format of an image Surface.convert(Surface): return Surface Surface.convert(depth, flags=0): return Surface Surface.convert(masks, flags=0): return Surface Surface.convert(): return Surface Creates a new copy of the Surface with the pixel format changed. The new pixel format can be determined from another existing Surface. Otherwise depth, flags, and masks arguments can be used, similar to the pygame.Surface() call. If no arguments are passed the new Surface will have the same pixel format as the display Surface. This is always the fastest format for blitting. It is a good idea to convert all Surfaces before they are blitted many times. The converted Surface will have no pixel alphas. They will be stripped if the original had them. See Surface.convert_alpha() for preserving or creating per-pixel alphas. convert_alpha change the pixel format of an image including per pixel alphas Surface.convert_alpha(Surface): return Surface Surface.convert_alpha(): return Surface Creates a new copy of the surface with the desired pixel format. The new surface will be in a format suited for quick blitting to the given format with per pixel alpha. If no surface is given, the new surface will be optimized for blitting to the current display. Unlike the Surface.convert() method, the pixel format for the new image will not be exactly the same as the requested source, but it will be optimized for fast alpha blitting to the destination. copy create a new copy of a Surface Surface.copy(): return Surface Makes a duplicate copy of a Surface. The new Surface will have the same pixel formats, color palettes, and transparency settings as the original. fill fill Surface with a solid color Surface.fill(color, rect=None, special_flags=0): return Rect Fill the Surface with a solid color. If no rect argument is given the entire Surface will be filled. The rect argument will limit the fill to a specific area. The fill will also be contained by the Surface clip area. The color argument can be either a RGB sequence, a RGBA sequence or a mapped color index. If using RGBA, the Alpha (A part of RGBA) is ignored unless the surface uses per pixel alpha (Surface has the SRCALPHA flag). An optional special_flags is for passing in new in 1.8.0: BLEND_ADD, BLEND_SUB, BLEND_MULT, BLEND_MIN, BLEND_MAX new in 1.8.1: BLEND_RGBA_ADD, BLEND_RGBA_SUB, BLEND_RGBA_MULT, BLEND_RGBA_MIN, BLEND_RGBA_MAX BLEND_RGB_ADD, BLEND_RGB_SUB, BLEND_RGB_MULT, BLEND_RGB_MIN, BLEND_RGB_MAX With other special blitting flags perhaps added in the future. This will return the affected Surface area. scroll Shift the surface image in place Surface.scroll(dx=0, dy=0): return None Move the image by dx pixels right and dy pixels down. dx and dy may be negative for left and up scrolls respectively. Areas of the surface that are not overwritten retain their original pixel values. Scrolling is contained by the Surface clip area. It is safe to have dx and dy values that exceed the surface size. set_colorkey Set the transparent colorkey Surface.set_colorkey(Color, flags=0): return None Surface.set_colorkey(None): return None Set the current color key for the Surface. When blitting this Surface onto a destination, and pixels that have the same color as the colorkey will be transparent. The color can be an RGB color or a mapped color integer. If None is passed, the colorkey will be unset. The colorkey will be ignored if the Surface is formatted to use per pixel alpha values. The colorkey can be mixed with the full Surface alpha value. The optional flags argument can be set to pygame.RLEACCEL to provide better performance on non accelerated displays. An RLEACCEL Surface will be slower to modify, but quicker to blit as a source. get_colorkey Get the current transparent colorkey Surface.get_colorkey(): return RGB or None Return the current colorkey value for the Surface. If the colorkey is not set then None is returned. set_alpha set the alpha value for the full Surface image Surface.set_alpha(value, flags=0): return None Surface.set_alpha(None): return None Set the current alpha value fo r the Surface. When blitting this Surface onto a destination, the pixels will be drawn slightly transparent. The alpha value is an integer from 0 to 255, 0 is fully transparent and 255 is fully opaque. If None is passed for the alpha value, then the Surface alpha will be disabled. This value is different than the per pixel Surface alpha. If the Surface format contains per pixel alphas, then this alpha value will be ignored. If the Surface contains per pixel alphas, setting the alpha value to None will disable the per pixel transparency. The optional flags argument can be set to pygame.RLEACCEL to provide better performance on non accelerated displays. An RLEACCEL Surface will be slower to modify, but quicker to blit as a source. get_alpha get the current Surface transparency value Surface.get_alpha(): return int_value or None Return the current alpha value for the Surface. If the alpha value is not set then None is returned. lock lock the Surface memory for pixel access Surface.lock(): return None Lock the pixel data of a Surface for access. On accelerated Surfaces, the pixel data may be stored in volatile video memory or nonlinear compressed forms. When a Surface is locked the pixel memory becomes available to access by regular software. Code that reads or writes pixel values will need the Surface to be locked. Surfaces should not remain locked for more than necessary. A locked Surface can often not be displayed or managed by Pygame. Not all Surfaces require locking. The Surface.mustlock() method can determine if it is actually required. There is no performance penalty for locking and unlocking a Surface that does not need it. All pygame functions will automatically lock and unlock the Surface data as needed. If a section of code is going to make calls that will repeatedly lock and unlock the Surface many times, it can be helpful to wrap the block inside a lock and unlock pair. It is safe to nest locking and unlocking calls. The surface will only be unlocked after the final lock is released. unlock unlock the Surface memory from pixel access Surface.unlock(): return None Unlock the Surface pixel data after it has been locked. The unlocked Surface can once again be drawn and managed by Pygame. See the Surface.lock() documentation for more details. All pygame functions will automatically lock and unlock the Surface data as needed. If a section of code is going to make calls that will repeatedly lock and unlock the Surface many times, it can be helpful to wrap the block inside a lock and unlock pair. It is safe to nest locking and unlocking calls. The surface will only be unlocked after the final lock is released. mustlock test if the Surface requires locking Surface.mustlock(): return bool Returns True if the Surface is required to be locked to access pixel data. Usually pure software Surfaces do not require locking. This method is rarely needed, since it is safe and quickest to just lock all Surfaces as needed. All pygame functions will automatically lock and unlock the Surface data as needed. If a section of code is going to make calls that will repeatedly lock and unlock the Surface many times, it can be helpful to wrap the block inside a lock and unlock pair. get_locked test if the Surface is current locked Surface.get_locked(): return bool Returns True when the Surface is locked. It doesn't matter how many times the Surface is locked. get_locks Gets the locks for the Surface Surface.get_locks(): return tuple Returns the currently existing locks for the Surface. get_at get the color value at a single pixel Surface.get_at((x, y)): return Color Return a copy of the RGBA Color value at the given pixel. If the Surface has no per pixel alpha, then the alpha value will always be 255 (opaque). If the pixel position is outside the area of the Surface an IndexError exception will be raised. Getting and setting pixels one at a time is generally too slow to be used in a game or realtime situation. It is better to use methods which operate on many pixels at a time like with the blit, fill and draw methods - or by using surfarray/PixelArray. This function will temporarily lock and unlock the Surface as needed. Returning a Color instead of tuple, New in pygame 1.9.0. Use tuple(surf.get_at((x,y))) if you want a tuple, and not a Color. This should only matter if you want to use the color as a key in a dict. set_at set the color value for a single pixel Surface.set_at((x, y), Color): return None Set the RGBA or mapped integer color value for a single pixel. If the Surface does not have per pixel alphas, the alpha value is ignored. Settting pixels outside the Surface area or outside the Surface clipping will have no effect. Getting and setting pixels one at a time is generally too slow to be used in a game or realtime situation. This function will temporarily lock and unlock the Surface as needed. get_palette get the color index palette for an 8bit Surface Surface.get_palette(): return [RGB, RGB, RGB, ...] Return a list of up to 256 color elements that represent the indexed colors used in an 8bit Surface. The returned list is a copy of the palette, and changes will have no effect on the Surface. Returning a list of Color(with length 3) instances instead of tuples, New in pygame 1.9.0 get_palette_at get the color for a single entry in a palette Surface.get_palette_at(index): return RGB Returns the red, green, and blue color values for a single index in a Surface palette. The index should be a value from 0 to 255. Returning Color(with length 3) instance instead of a tuple, New in pygame 1.9.0 set_palette set the color palette for an 8bit Surface Surface.set_palette([RGB, RGB, RGB, ...]): return None Set the full palette for an 8bit Surface. This will replace the colors in the existing palette. A partial palette can be passed and only the first colors in the original palette will be changed. This function has no effect on a Surface with more than 8bits per pixel. set_palette_at set the color for a single index in an 8bit Surface palette Surface.set_at(index, RGB): return None Set the palette value for a single entry in a Surface palette. The index should be a value from 0 to 255. This function has no effect on a Surface with more than 8bits per pixel. map_rgb convert a color into a mapped color value Surface.map_rgb(Color): return mapped_int Convert an RGBA color into the mapped integer value for this Surface. The returned integer will contain no more bits than the bit depth of the Surface. Mapped color values are not often used inside Pygame, but can be passed to most functions that require a Surface and a color. See the Surface object documentation for more information about colors and pixel formats. unmap_rgb convert a mapped integer color value into a Color Surface.map_rgb(mapped_int): return Color Convert an mapped integer color into the RGB color components for this Surface. Mapped color values are not often used inside Pygame, but can be passed to most functions that require a Surface and a color. See the Surface object documentation for more information about colors and pixel formats. set_clip set the current clipping area of the Surface Surface.set_clip(rect): return None Surface.set_clip(None): return None Each Surface has an active clipping area. This is a rectangle that represents the only pixels on the Surface that can be modified. If None is passed for the rectangle the full Surface will be available for changes. The clipping area is always restricted to the area of the Surface itself. If the clip rectangle is too large it will be shrunk to fit inside the Surface. get_clip get the current clipping area of the Surface Surface.get_clip(): return Rect Return a rectangle of the current clipping area. The Surface will always return a valid rectangle that will never be outside the bounds of the image. If the Surface has had None set for the clipping area, the Surface will return a rectangle with the full area of the Surface. subsurface create a new surface that references its parent Surface.subsurface(Rect): return Surface Returns a new Surface that shares its pixels with its new parent. The new Surface is considered a child of the original. Modifications to either Surface pixels will effect each other. Surface information like clipping area and color keys are unique to each Surface. The new Surface will inherit the palette, color key, and alpha settings from its parent. It is possible to have any number of subsurfaces and subsubsurfaces on the parent. It is also possible to subsurface the display Surface if the display mode is not hardware accelerated. See the Surface.get_offset(), Surface.get_parent() to learn more about the state of a subsurface. get_parent find the parent of a subsurface Surface.get_parent(): return Surface Returns the parent Surface of a subsurface. If this is not a subsurface then None will be returned. get_abs_parent find the top level parent of a subsurface Surface.get_abs_parent(): return Surface Returns the parent Surface of a subsurface. If this is not a subsurface then this surface will be returned. get_offset find the position of a child subsurface inside a parent Surface.get_offset(): return (x, y) Get the offset position of a child subsurface inside of a parent. If the Surface is not a subsurface this will return (0, 0). get_abs_offset find the absolute position of a child subsurface inside its top level parent Surface.get_abs_offset(): return (x, y) Get the offset position of a child subsurface inside of its top level parent Surface. If the Surface is not a subsurface this will return (0, 0). get_size get the dimensions of the Surface Surface.get_size(): return (width, height) Return the width and height of the Surface in pixels. get_width get the width of the Surface Surface.get_width(): return width Return the width of the Surface in pixels. get_height get the height of the Surface Surface.get_height(): return height Return the height of the Surface in pixels. get_rect get the rectangular area of the Surface Surface.get_rect(**kwargs): return Rect Returns a new rectangle covering the entire surface. This rectangle will always start at 0, 0 with a width. and height the same size as the image. You can pass keyword argument values to this function. These named values will be applied to the attributes of the Rect before it is returned. An example would be 'mysurf.get_rect(center=(100,100))' to create a rectangle for the Surface centered at a given position. get_bitsize get the bit depth of the Surface pixel format Surface.get_bitsize(): return int Returns the number of bits used to represent each pixel. This value may not exactly fill the number of bytes used per pixel. For example a 15 bit Surface still requires a full 2 bytes. get_bytesize get the bytes used per Surface pixel Surface.get_bytesize(): return int Return the number of bytes used per pixel. get_flags get the additional flags used for the Surface Surface.get_flags(): return int Returns a set of current Surface features. Each feature is a bit in the flags bitmask. Typical flags are HWSURFACE, RLEACCEL, SRCALPHA, and SRCCOLORKEY. Here is a more complete list of flags. A full list can be found in SDL_video.h SWSURFACE 0x00000000 # Surface is in system memory HWSURFACE 0x00000001 # Surface is in video memory ASYNCBLIT 0x00000004 # Use asynchronous blits if possible Available for pygame.display.set_mode() ANYFORMAT 0x10000000 # Allow any video depth/pixel-format HWPALETTE 0x20000000 # Surface has exclusive palette DOUBLEBUF 0x40000000 # Set up double-buffered video mode FULLSCREEN 0x80000000 # Surface is a full screen display OPENGL 0x00000002 # Create an OpenGL rendering context OPENGLBLIT 0x0000000A # Create an OpenGL rendering context # and use it for blitting. Obsolete. RESIZABLE 0x00000010 # This video mode may be resized NOFRAME 0x00000020 # No window caption or edge frame Used internally (read-only) HWACCEL 0x00000100 # Blit uses hardware acceleration SRCCOLORKEY 0x00001000 # Blit uses a source color key RLEACCELOK 0x00002000 # Private flag RLEACCEL 0x00004000 # Surface is RLE encoded SRCALPHA 0x00010000 # Blit uses source alpha blending PREALLOC 0x01000000 # Surface uses preallocated memory get_pitch get the number of bytes used per Surface row Surface.get_pitch(): return int Return the number of bytes separating each row in the Surface. Surfaces in video memory are not always linearly packed. Subsurfaces will also have a larger pitch than their real width. This value is not needed for normal Pygame usage. get_masks the bitmasks needed to convert between a color and a mapped integer Surface.get_masks(): return (R, G, B, A) Returns the bitmasks used to isolate each color in a mapped integer. This value is not needed for normal Pygame usage. set_masks set the bitmasks needed to convert between a color and a mapped integer Surface.set_masks((r,g,b,a)): return None This is not needed for normal Pygame usage. New in pygame 1.8.1 get_shifts the bit shifts needed to convert between a color and a mapped integer Surface.get_shifts(): return (R, G, B, A) Returns the pixel shifts need to convert between each color and a mapped integer. This value is not needed for normal Pygame usage. set_shifts sets the bit shifts needed to convert between a color and a mapped integer Surface.get_shifts((r,g,b,a)): return None This is not needed for normal Pygame usage. New in pygame 1.8.1 get_losses the significant bits used to convert between a color and a mapped integer Surface.get_losses(): return (R, G, B, A) Return the least significant number of bits stripped from each color in a mapped integer. This value is not needed for normal Pygame usage. get_bounding_rect find the smallest rect containing data Surface.get_bounding_rect(min_alpha = 1): return Rect Returns the smallest rectangular region that contains all the pixels in the surface that have an alpha value greater than or equal to the minimum alpha value. This function will temporarily lock and unlock the Surface as needed. New in pygame 1.8. get_buffer acquires a buffer object for the pixels of the Surface. Surface.get_buffer(): return BufferProxy Return a buffer object for the pixels of the Surface. The buffer can be used for direct pixel access and manipulation. This method implicitly locks the Surface. The lock will be released, once the returned BufferProxy object is deleted. New in pygame 1.8. pygame-1.9.1release/src/surface.c0000644000175000017500000021025611224767753016652 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners Copyright (C) 2007 Marcus von Appen This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ #define PYGAMEAPI_SURFACE_INTERNAL #include "surface.h" #include "pygamedocs.h" #include "structmember.h" #include "pgcompat.h" int PySurface_Blit (PyObject * dstobj, PyObject * srcobj, SDL_Rect * dstrect, SDL_Rect * srcrect, int the_args); /* statics */ static PyObject *PySurface_New (SDL_Surface * info); static PyObject *surface_new (PyTypeObject *type, PyObject *args, PyObject *kwds); static intptr_t surface_init (PySurfaceObject *self, PyObject *args, PyObject *kwds); static PyObject* surface_str (PyObject *self); static void surface_dealloc (PyObject *self); static void surface_cleanup (PySurfaceObject * self); static void surface_move (Uint8 *src, Uint8 *dst, int h, int span, int srcpitch, int dstpitch); static PyObject *surf_get_at (PyObject *self, PyObject *args); static PyObject *surf_set_at (PyObject *self, PyObject *args); static PyObject *surf_map_rgb (PyObject *self, PyObject *args); static PyObject *surf_unmap_rgb (PyObject *self, PyObject *arg); static PyObject *surf_lock (PyObject *self); static PyObject *surf_unlock (PyObject *self); static PyObject *surf_mustlock (PyObject *self); static PyObject *surf_get_locked (PyObject *self); static PyObject *surf_get_locks (PyObject *self); static PyObject *surf_get_palette (PyObject *self); static PyObject *surf_get_palette_at (PyObject *self, PyObject *args); static PyObject *surf_set_palette (PyObject *self, PyObject *args); static PyObject *surf_set_palette_at (PyObject *self, PyObject *args); static PyObject *surf_set_colorkey (PyObject *self, PyObject *args); static PyObject *surf_get_colorkey (PyObject *self); static PyObject *surf_set_alpha (PyObject *self, PyObject *args); static PyObject *surf_get_alpha (PyObject *self); static PyObject *surf_copy (PyObject *self); static PyObject *surf_convert (PyObject *self, PyObject *args); static PyObject *surf_convert_alpha (PyObject *self, PyObject *args); static PyObject *surf_set_clip (PyObject *self, PyObject *args); static PyObject *surf_get_clip (PyObject *self); static PyObject *surf_blit (PyObject *self, PyObject *args, PyObject *keywds); static PyObject *surf_fill (PyObject *self, PyObject *args, PyObject *keywds); static PyObject *surf_scroll (PyObject *self, PyObject *args, PyObject *keywds); static PyObject *surf_get_abs_offset (PyObject *self); static PyObject *surf_get_abs_parent (PyObject *self); static PyObject *surf_get_bitsize (PyObject *self); static PyObject *surf_get_bytesize (PyObject *self); static PyObject *surf_get_flags (PyObject *self); static PyObject *surf_get_height (PyObject *self); static PyObject *surf_get_pitch (PyObject *self); static PyObject *surf_get_rect (PyObject *self, PyObject *args, PyObject *kwargs); static PyObject *surf_get_width (PyObject *self); static PyObject *surf_get_shifts (PyObject *self); static PyObject *surf_set_shifts (PyObject *self, PyObject *args); static PyObject *surf_get_size (PyObject *self); static PyObject *surf_get_losses (PyObject *self); static PyObject *surf_get_masks (PyObject *self); static PyObject *surf_set_masks (PyObject *self, PyObject *args); static PyObject *surf_get_offset (PyObject *self); static PyObject *surf_get_parent (PyObject *self); static PyObject *surf_subsurface (PyObject *self, PyObject *args); static PyObject *surf_get_buffer (PyObject *self); static PyObject *surf_get_bounding_rect (PyObject *self, PyObject *args, PyObject *kwargs); static struct PyMethodDef surface_methods[] = { { "get_at", surf_get_at, METH_VARARGS, DOC_SURFACEGETAT }, { "set_at", surf_set_at, METH_VARARGS, DOC_SURFACESETAT }, { "map_rgb", surf_map_rgb, METH_VARARGS, DOC_SURFACEMAPRGB }, { "unmap_rgb", surf_unmap_rgb, METH_O, DOC_SURFACEUNMAPRGB }, { "get_palette", (PyCFunction) surf_get_palette, METH_NOARGS, DOC_SURFACEGETPALETTE }, { "get_palette_at", surf_get_palette_at, METH_VARARGS, DOC_SURFACEGETPALETTEAT }, { "set_palette", surf_set_palette, METH_VARARGS, DOC_SURFACESETPALETTE }, { "set_palette_at", surf_set_palette_at, METH_VARARGS, DOC_SURFACESETPALETTEAT }, { "lock", (PyCFunction) surf_lock, METH_NOARGS, DOC_SURFACELOCK }, { "unlock", (PyCFunction) surf_unlock, METH_NOARGS, DOC_SURFACEUNLOCK }, { "mustlock", (PyCFunction) surf_mustlock, METH_NOARGS, DOC_SURFACEMUSTLOCK }, { "get_locked", (PyCFunction) surf_get_locked, METH_NOARGS, DOC_SURFACEGETLOCKED }, { "get_locks", (PyCFunction) surf_get_locks, METH_NOARGS, DOC_SURFACEGETLOCKS }, { "set_colorkey", surf_set_colorkey, METH_VARARGS, DOC_SURFACESETCOLORKEY }, { "get_colorkey", (PyCFunction) surf_get_colorkey, METH_NOARGS, DOC_SURFACEGETCOLORKEY }, { "set_alpha", surf_set_alpha, METH_VARARGS, DOC_SURFACESETALPHA }, { "get_alpha", (PyCFunction) surf_get_alpha, METH_NOARGS, DOC_SURFACEGETALPHA }, { "copy", (PyCFunction) surf_copy, METH_NOARGS, DOC_SURFACECOPY }, { "__copy__", (PyCFunction) surf_copy, METH_NOARGS, DOC_SURFACECOPY }, { "convert", surf_convert, METH_VARARGS, DOC_SURFACECONVERT }, { "convert_alpha", surf_convert_alpha, METH_VARARGS, DOC_SURFACECONVERTALPHA }, { "set_clip", surf_set_clip, METH_VARARGS, DOC_SURFACESETCLIP }, { "get_clip", (PyCFunction) surf_get_clip, METH_NOARGS, DOC_SURFACEGETCLIP }, { "fill", (PyCFunction) surf_fill, METH_VARARGS | METH_KEYWORDS, DOC_SURFACEFILL }, { "blit", (PyCFunction) surf_blit, METH_VARARGS | METH_KEYWORDS, DOC_SURFACEBLIT }, { "scroll", (PyCFunction) surf_scroll, METH_VARARGS | METH_KEYWORDS, DOC_SURFACESCROLL }, { "get_flags", (PyCFunction) surf_get_flags, METH_NOARGS, DOC_SURFACEGETFLAGS }, { "get_size", (PyCFunction) surf_get_size, METH_NOARGS, DOC_SURFACEGETSIZE }, { "get_width", (PyCFunction) surf_get_width, METH_NOARGS, DOC_SURFACEGETWIDTH }, { "get_height", (PyCFunction) surf_get_height, METH_NOARGS, DOC_SURFACEGETHEIGHT }, { "get_rect", (PyCFunction) surf_get_rect, METH_VARARGS | METH_KEYWORDS, DOC_SURFACEGETRECT }, { "get_pitch", (PyCFunction) surf_get_pitch, METH_NOARGS, DOC_SURFACEGETPITCH }, { "get_bitsize", (PyCFunction) surf_get_bitsize, METH_NOARGS, DOC_SURFACEGETBITSIZE }, { "get_bytesize", (PyCFunction) surf_get_bytesize, METH_NOARGS, DOC_SURFACEGETBYTESIZE }, { "get_masks", (PyCFunction) surf_get_masks, METH_NOARGS, DOC_SURFACEGETMASKS }, { "get_shifts", (PyCFunction) surf_get_shifts, METH_NOARGS, DOC_SURFACEGETSHIFTS }, { "set_masks", (PyCFunction) surf_set_masks, METH_VARARGS, DOC_SURFACESETMASKS }, { "set_shifts", (PyCFunction) surf_set_shifts, METH_VARARGS, DOC_SURFACESETSHIFTS }, { "get_losses", (PyCFunction) surf_get_losses, METH_NOARGS, DOC_SURFACEGETLOSSES }, { "subsurface", surf_subsurface, METH_VARARGS, DOC_SURFACESUBSURFACE }, { "get_offset", (PyCFunction) surf_get_offset, METH_NOARGS, DOC_SURFACEGETOFFSET }, { "get_abs_offset", (PyCFunction) surf_get_abs_offset, METH_NOARGS, DOC_SURFACEGETABSOFFSET }, { "get_parent", (PyCFunction) surf_get_parent, METH_NOARGS, DOC_SURFACEGETPARENT }, { "get_abs_parent", (PyCFunction) surf_get_abs_parent, METH_NOARGS, DOC_SURFACEGETABSPARENT }, { "get_bounding_rect", (PyCFunction) surf_get_bounding_rect, METH_VARARGS | METH_KEYWORDS, DOC_SURFACEGETBOUNDINGRECT}, { "get_buffer", (PyCFunction) surf_get_buffer, METH_NOARGS, DOC_SURFACEGETBUFFER}, { NULL, NULL, 0, NULL } }; static PyTypeObject PySurface_Type = { TYPE_HEAD (NULL, 0) "pygame.Surface", /* name */ sizeof (PySurfaceObject), /* basic size */ 0, /* itemsize */ surface_dealloc, /* dealloc */ 0, /* print */ NULL, /* getattr */ NULL, /* setattr */ NULL, /* compare */ surface_str, /* repr */ NULL, /* as_number */ NULL, /* as_sequence */ NULL, /* as_mapping */ (hashfunc) NULL, /* hash */ (ternaryfunc) NULL, /* call */ (reprfunc) NULL, /* str */ 0, 0L, 0L, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ DOC_PYGAMESURFACE, /* Documentation string */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ offsetof (PySurfaceObject, weakreflist), /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ surface_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ (initproc) surface_init, /* tp_init */ 0, /* tp_alloc */ surface_new, /* tp_new */ }; #define PySurface_Check(x) ((x)->ob_type == &PySurface_Type) static PyObject* PySurface_New (SDL_Surface *s) { PySurfaceObject *self; if (!s) return RAISE (PyExc_SDLError, SDL_GetError ()); self = (PySurfaceObject *) PySurface_Type.tp_new (&PySurface_Type, NULL, NULL); if (self) self->surf = s; return (PyObject *) self; } static PyObject* surface_new (PyTypeObject *type, PyObject *args, PyObject *kwds) { PySurfaceObject *self; self = (PySurfaceObject *) type->tp_alloc (type, 0); if (self) { self->surf = NULL; self->subsurface = NULL; self->weakreflist = NULL; self->dependency = NULL; self->locklist = NULL; } return (PyObject *) self; } /* surface object internals */ static void surface_cleanup (PySurfaceObject *self) { if (self->surf) { if (!(self->surf->flags & SDL_HWSURFACE) || SDL_WasInit (SDL_INIT_VIDEO)) { /* unsafe to free hardware surfaces without video init */ /* i question SDL's ability to free a locked hardware surface */ SDL_FreeSurface (self->surf); } self->surf = NULL; } if (self->subsurface) { Py_XDECREF (self->subsurface->owner); PyMem_Del (self->subsurface); self->subsurface = NULL; } if (self->dependency) { Py_DECREF (self->dependency); self->dependency = NULL; } if (self->locklist) { Py_DECREF (self->locklist); self->locklist = NULL; } } static void surface_dealloc (PyObject *self) { if (((PySurfaceObject *) self)->weakreflist) PyObject_ClearWeakRefs (self); surface_cleanup ((PySurfaceObject *) self); self->ob_type->tp_free (self); } static PyObject* surface_str (PyObject *self) { char str[1024]; SDL_Surface *surf = PySurface_AsSurface (self); const char *type; if (surf) { type = (surf->flags & SDL_HWSURFACE) ? "HW" : "SW"; sprintf (str, "", surf->w, surf->h, surf->format->BitsPerPixel, type); } else { strcpy (str, ""); } return Text_FromUTF8 (str); } static intptr_t surface_init (PySurfaceObject *self, PyObject *args, PyObject *kwds) { Uint32 flags = 0; int width, height; PyObject *depth = NULL, *masks = NULL, *size = NULL; int bpp; Uint32 Rmask, Gmask, Bmask, Amask; SDL_Surface *surface; SDL_PixelFormat default_format, *format; int length; char *kwids[] = { "size", "flags", "depth", "masks", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|iOO", kwids, &size, &flags, &depth, &masks)) return -1; if (PySequence_Check (size) && (length = PySequence_Length (size)) == 2) { if ( (!IntFromObjIndex (size, 0, &width)) || (!IntFromObjIndex (size, 1, &height)) ) { RAISE (PyExc_ValueError, "size needs to be (int width, int height)"); return -1; } } else { RAISE (PyExc_ValueError, "size needs to be (int width, int height)"); return -1; } if (width < 0 || height < 0) { RAISE (PyExc_SDLError, "Invalid resolution for Surface"); return -1; } surface_cleanup (self); if (depth && masks) /* all info supplied, most errorchecking * needed */ { if (PySurface_Check (depth)) { RAISE (PyExc_ValueError, "cannot pass surface for depth and color masks"); return -1; } if (!IntFromObj (depth, &bpp)) { RAISE (PyExc_ValueError, "invalid bits per pixel depth argument"); return -1; } if (!PySequence_Check (masks) || PySequence_Length (masks) != 4) { RAISE (PyExc_ValueError, "masks argument must be sequence of four numbers"); return -1; } if (!UintFromObjIndex (masks, 0, &Rmask) || !UintFromObjIndex (masks, 1, &Gmask) || !UintFromObjIndex (masks, 2, &Bmask) || !UintFromObjIndex (masks, 3, &Amask)) { RAISE (PyExc_ValueError, "invalid mask values in masks sequence"); return -1; } } else if (depth && PyNumber_Check (depth)) /* use default masks */ { if (!IntFromObj (depth, &bpp)) { RAISE (PyExc_ValueError, "invalid bits per pixel depth argument"); return -1; } if (flags & SDL_SRCALPHA) { switch (bpp) { case 16: Rmask = 0xF << 8; Gmask = 0xF << 4; Bmask = 0xF; Amask = 0xF << 12; break; case 32: Rmask = 0xFF << 16; Gmask = 0xFF << 8; Bmask = 0xFF; Amask = 0xFF << 24; break; default: RAISE (PyExc_ValueError, "no standard masks exist for given bitdepth with alpha"); return -1; } } else { Amask = 0; switch (bpp) { case 8: Rmask = 0xFF >> 6 << 5; Gmask = 0xFF >> 5 << 2; Bmask = 0xFF >> 6; break; case 12: Rmask = 0xFF >> 4 << 8; Gmask = 0xFF >> 4 << 4; Bmask = 0xFF >> 4; break; case 15: Rmask = 0xFF >> 3 << 10; Gmask = 0xFF >> 3 << 5; Bmask = 0xFF >> 3; break; case 16: Rmask = 0xFF >> 3 << 11; Gmask = 0xFF >> 2 << 5; Bmask = 0xFF >> 3; break; case 24: case 32: Rmask = 0xFF << 16; Gmask = 0xFF << 8; Bmask = 0xFF; break; default: RAISE (PyExc_ValueError, "nonstandard bit depth given"); return -1; } } } else /* no depth or surface */ { SDL_PixelFormat* pix; if (depth && PySurface_Check (depth)) pix = ((PySurfaceObject*) depth)->surf->format; else if (SDL_GetVideoSurface ()) pix = SDL_GetVideoSurface ()->format; else if (SDL_WasInit (SDL_INIT_VIDEO)) pix = SDL_GetVideoInfo ()->vfmt; else { pix = &default_format; pix->BitsPerPixel = 32; pix->Amask = 0; pix->Rmask = 0xFF0000; pix->Gmask = 0xFF00; pix->Bmask = 0xFF; } bpp = pix->BitsPerPixel; if (flags & SDL_SRCALPHA) { switch (bpp) { case 16: Rmask = 0xF << 8; Gmask = 0xF << 4; Bmask = 0xF; Amask = 0xF << 12; break; case 24: bpp = 32; // we automatically step up to 32 if video is 24, fall through to case below case 32: Rmask = 0xFF << 16; Gmask = 0xFF << 8; Bmask = 0xFF; Amask = 0xFF << 24; break; default: RAISE (PyExc_ValueError, "no standard masks exist for given bitdepth with alpha"); return -1; } } else { Rmask = pix->Rmask; Gmask = pix->Gmask; Bmask = pix->Bmask; Amask = pix->Amask; } } surface = SDL_CreateRGBSurface (flags, width, height, bpp, Rmask, Gmask, Bmask, Amask); if (!surface) { RAISE (PyExc_SDLError, SDL_GetError ()); return -1; } if (masks) { /* Confirm the surface was created correctly (masks were valid). Also ensure that 24 and 32 bit surfaces have 8 bit fields (no losses). */ format = surface->format; Rmask = (0xFF >> format->Rloss) << format->Rshift; Gmask = (0xFF >> format->Gloss) << format->Gshift; Bmask = (0xFF >> format->Bloss) << format->Bshift; Amask = (0xFF >> format->Aloss) << format->Ashift; if (format->Rmask != Rmask || format->Gmask != Gmask || format->Bmask != Bmask || format->Amask != Amask || (format->BytesPerPixel >= 3 && (format->Rloss || format->Gloss || format->Bloss || (surface->flags & SDL_SRCALPHA ? format->Aloss : format->Aloss != 8)))) { SDL_FreeSurface (surface); RAISE (PyExc_ValueError, "Invalid mask values"); return -1; } } if (surface) { self->surf = surface; self->subsurface = NULL; } return 0; } /* surface object methods */ static PyObject* surf_get_at (PyObject *self, PyObject *args) { SDL_Surface *surf = PySurface_AsSurface (self); SDL_PixelFormat *format = surf->format; Uint8 *pixels = (Uint8 *) surf->pixels; int x, y; Uint32 color; Uint8 *pix; Uint8 rgba[4]; if (!PyArg_ParseTuple (args, "(ii)", &x, &y)) return NULL; if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); if (surf->flags & SDL_OPENGL) return RAISE (PyExc_SDLError, "Cannot call on OPENGL Surfaces"); if (x < 0 || x >= surf->w || y < 0 || y >= surf->h) return RAISE (PyExc_IndexError, "pixel index out of range"); if (format->BytesPerPixel < 1 || format->BytesPerPixel > 4) return RAISE (PyExc_RuntimeError, "invalid color depth for surface"); if (!PySurface_Lock (self)) return NULL; pixels = (Uint8 *) surf->pixels; switch (format->BytesPerPixel) { case 1: color = (Uint32)*((Uint8 *) pixels + y * surf->pitch + x); break; case 2: color = (Uint32)*((Uint16 *) (pixels + y * surf->pitch) + x); break; case 3: pix = ((Uint8 *) (pixels + y * surf->pitch) + x * 3); #if SDL_BYTEORDER == SDL_LIL_ENDIAN color = (pix[0]) + (pix[1] << 8) + (pix[2] << 16); #else color = (pix[2]) + (pix[1] << 8) + (pix[0] << 16); #endif break; default: /* case 4: */ color = *((Uint32 *) (pixels + y * surf->pitch) + x); break; } if (!PySurface_Unlock (self)) return NULL; SDL_GetRGBA (color, format, rgba, rgba+1, rgba+2, rgba+3); return PyColor_New (rgba); } static PyObject* surf_set_at (PyObject *self, PyObject *args) { SDL_Surface *surf = PySurface_AsSurface (self); SDL_PixelFormat *format = surf->format; Uint8 *pixels; int x, y; Uint32 color; Uint8 rgba[4] = {0, 0, 0, 0 }; PyObject *rgba_obj; Uint8 *byte_buf; if (!PyArg_ParseTuple (args, "(ii)O", &x, &y, &rgba_obj)) return NULL; if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); if (surf->flags & SDL_OPENGL) return RAISE (PyExc_SDLError, "Cannot call on OPENGL Surfaces"); if (format->BytesPerPixel < 1 || format->BytesPerPixel > 4) return RAISE (PyExc_RuntimeError, "invalid color depth for surface"); if (x < surf->clip_rect.x || x >= surf->clip_rect.x + surf->clip_rect.w || y < surf->clip_rect.y || y >= surf->clip_rect.y + surf->clip_rect.h) { /* out of clip area */ Py_RETURN_NONE; } if (PyInt_Check (rgba_obj)) { color = (Uint32) PyInt_AsLong (rgba_obj); if (PyErr_Occurred () && (Sint32) color == -1) return RAISE (PyExc_TypeError, "invalid color argument"); } else if (PyLong_Check (rgba_obj)) { color = (Uint32) PyLong_AsUnsignedLong (rgba_obj); if (PyErr_Occurred () && (Sint32) color == -1) return RAISE (PyExc_TypeError, "invalid color argument"); } else if (RGBAFromColorObj (rgba_obj, rgba)) color = SDL_MapRGBA (surf->format, rgba[0], rgba[1], rgba[2], rgba[3]); else return RAISE (PyExc_TypeError, "invalid color argument"); if (!PySurface_Lock (self)) return NULL; pixels = (Uint8 *) surf->pixels; switch (format->BytesPerPixel) { case 1: *((Uint8 *) pixels + y * surf->pitch + x) = (Uint8) color; break; case 2: *((Uint16 *) (pixels + y * surf->pitch) + x) = (Uint16) color; break; case 3: byte_buf = (Uint8 *) (pixels + y * surf->pitch) + x * 3; #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *(byte_buf + (format->Rshift >> 3)) = (Uint8) (color >> 16); *(byte_buf + (format->Gshift >> 3)) = (Uint8) (color >> 8); *(byte_buf + (format->Bshift >> 3)) = (Uint8) color; #else *(byte_buf + 2 - (format->Rshift >> 3)) = (Uint8) (color >> 16); *(byte_buf + 2 - (format->Gshift >> 3)) = (Uint8) (color >> 8); *(byte_buf + 2 - (format->Bshift >> 3)) = (Uint8) color; #endif break; default: /* case 4: */ *((Uint32 *) (pixels + y * surf->pitch) + x) = color; break; } if (!PySurface_Unlock (self)) return NULL; Py_RETURN_NONE; } static PyObject* surf_map_rgb (PyObject *self, PyObject *args) { SDL_Surface *surf = PySurface_AsSurface (self); Uint8 rgba[4]; int color; if (!RGBAFromColorObj (args, rgba)) return RAISE (PyExc_TypeError, "Invalid RGBA argument"); if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); color = SDL_MapRGBA (surf->format, rgba[0], rgba[1], rgba[2], rgba[3]); return PyInt_FromLong (color); } static PyObject* surf_unmap_rgb (PyObject *self, PyObject *arg) { SDL_Surface *surf = PySurface_AsSurface (self); Uint32 col; Uint8 rgba[4]; col = (Uint32)PyInt_AsLong (arg); if (col == (Uint32) -1 && PyErr_Occurred()) { PyErr_Clear(); return RAISE (PyExc_TypeError, "unmap_rgb expects 1 number argument"); } if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); SDL_GetRGBA (col, surf->format, rgba, rgba+1, rgba+2, rgba+3); return PyColor_New (rgba); } static PyObject* surf_lock (PyObject *self) { if (!PySurface_Lock (self)) return NULL; Py_RETURN_NONE; } static PyObject* surf_unlock (PyObject *self) { PySurface_Unlock (self); Py_RETURN_NONE; } static PyObject* surf_mustlock (PyObject *self) { SDL_Surface *surf = PySurface_AsSurface (self); return PyInt_FromLong (SDL_MUSTLOCK (surf) || ((PySurfaceObject *) self)->subsurface); } static PyObject* surf_get_locked (PyObject *self) { PySurfaceObject *surf = (PySurfaceObject *) self; if (surf->locklist && PyList_Size (surf->locklist) > 0) Py_RETURN_TRUE; Py_RETURN_FALSE; } static PyObject* surf_get_locks (PyObject *self) { PySurfaceObject *surf = (PySurfaceObject *) self; Py_ssize_t len, i = 0; PyObject *tuple, *tmp; if (!surf->locklist) return PyTuple_New (0); len = PyList_Size (surf->locklist); tuple = PyTuple_New (len); if (!tuple) return NULL; for (i = 0; i < len; i++) { tmp = PyWeakref_GetObject (PyList_GetItem (surf->locklist, i)); Py_INCREF (tmp); PyTuple_SetItem (tuple, i, tmp); } return tuple; } static PyObject* surf_get_palette (PyObject *self) { SDL_Surface *surf = PySurface_AsSurface (self); SDL_Palette *pal = surf->format->palette; PyObject *list; int i; PyObject *color; SDL_Color *c; Uint8 rgba[4] = {0, 0, 0, 255}; if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); if (!pal) return RAISE (PyExc_SDLError, "Surface has no palette to get\n"); list = PyTuple_New (pal->ncolors); if (!list) return NULL; for (i = 0; i < pal->ncolors; i++) { c = &pal->colors[i]; rgba[0] = c->r; rgba[1] = c->g; rgba[2] = c->b; color = PyColor_NewLength (rgba, 3); if (!color) { Py_DECREF (list); return NULL; } PyTuple_SET_ITEM (list, i, color); } return list; } static PyObject* surf_get_palette_at (PyObject * self, PyObject * args) { SDL_Surface *surf = PySurface_AsSurface (self); SDL_Palette *pal = surf->format->palette; SDL_Color *c; int _index; Uint8 rgba[4]; if (!PyArg_ParseTuple (args, "i", &_index)) return NULL; if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); if (!pal) return RAISE (PyExc_SDLError, "Surface has no palette to set\n"); if (_index >= pal->ncolors || _index < 0) return RAISE (PyExc_IndexError, "index out of bounds"); c = &pal->colors[_index]; rgba[0] = c->r; rgba[1] = c->g; rgba[2] = c->b; rgba[3] = 255; return PyColor_NewLength (rgba, 3); } static PyObject* surf_set_palette (PyObject *self, PyObject *args) { SDL_Surface *surf = PySurface_AsSurface (self); SDL_Palette *pal = surf->format->palette; SDL_Color *colors; PyObject *list, *item; int i, len; Uint8 rgba[4]; int ecode; if (!PyArg_ParseTuple (args, "O", &list)) return NULL; if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); if (!PySequence_Check (list)) return RAISE (PyExc_ValueError, "Argument must be a sequence type"); if (!pal) return RAISE (PyExc_SDLError, "Surface has no palette\n"); if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot set palette without pygame.display initialized"); len = MIN (pal->ncolors, PySequence_Length (list)); colors = (SDL_Color *) malloc (len * sizeof (SDL_Color)); if (!colors) return NULL; for (i = 0; i < len; i++) { item = PySequence_GetItem (list, i); ecode = RGBAFromObj (item, rgba); Py_DECREF (item); if (!ecode) { free (colors); return RAISE (PyExc_ValueError, "takes a sequence of integers of RGB"); } if (rgba[3] != 255) { free (colors); return RAISE (PyExc_ValueError, "takes an alpha value of 255"); } colors[i].r = (unsigned char) rgba[0]; colors[i].g = (unsigned char) rgba[1]; colors[i].b = (unsigned char) rgba[2]; } SDL_SetColors (surf, colors, 0, len); free (colors); Py_RETURN_NONE; } static PyObject* surf_set_palette_at (PyObject *self, PyObject *args) { SDL_Surface *surf = PySurface_AsSurface (self); SDL_Palette *pal = surf->format->palette; SDL_Color color; int _index; PyObject *color_obj; Uint8 rgba[4]; if (!PyArg_ParseTuple (args, "iO", &_index, &color_obj)) return NULL; if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); if (!RGBAFromObj (color_obj, rgba)) { return RAISE (PyExc_ValueError, "takes a sequence of integers of RGB for argument 2"); } if (!pal) { PyErr_SetString (PyExc_SDLError, "Surface is not palettized\n"); return NULL; } if (_index >= pal->ncolors || _index < 0) { PyErr_SetString (PyExc_IndexError, "index out of bounds"); return NULL; } if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot set palette without pygame.display initialized"); color.r = rgba[0]; color.g = rgba[1]; color.b = rgba[2]; SDL_SetColors (surf, &color, _index, 1); Py_RETURN_NONE; } static PyObject* surf_set_colorkey (PyObject *self, PyObject *args) { SDL_Surface *surf = PySurface_AsSurface (self); Uint32 flags = 0, color = 0; PyObject *rgba_obj = NULL; Uint8 rgba[4]; int result, hascolor = 0; if (!PyArg_ParseTuple (args, "|Oi", &rgba_obj, &flags)) return NULL; if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); if (surf->flags & SDL_OPENGL) return RAISE (PyExc_SDLError, "Cannot call on OPENGL Surfaces"); if (rgba_obj && rgba_obj != Py_None) { if (PyInt_Check (rgba_obj)) { color = (Uint32) PyInt_AsLong (rgba_obj); if (PyErr_Occurred () && (Sint32) color == -1) return RAISE (PyExc_TypeError, "invalid color argument"); } else if (PyLong_Check (rgba_obj)) { color = (Uint32) PyLong_AsUnsignedLong (rgba_obj); if (PyErr_Occurred () && (Sint32) color == -1) return RAISE (PyExc_TypeError, "invalid color argument"); } else if (RGBAFromColorObj (rgba_obj, rgba)) { color = SDL_MapRGBA (surf->format, rgba[0], rgba[1], rgba[2], rgba[3]); } else return RAISE (PyExc_TypeError, "invalid color argument"); hascolor = 1; } if (hascolor) flags |= SDL_SRCCOLORKEY; PySurface_Prep (self); result = SDL_SetColorKey (surf, flags, color); PySurface_Unprep (self); if (result == -1) return RAISE (PyExc_SDLError, SDL_GetError ()); Py_RETURN_NONE; } static PyObject* surf_get_colorkey (PyObject *self) { SDL_Surface *surf = PySurface_AsSurface (self); Uint8 r, g, b, a; if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); if (surf->flags & SDL_OPENGL) return RAISE (PyExc_SDLError, "Cannot call on OPENGL Surfaces"); if (!(surf->flags & SDL_SRCCOLORKEY)) Py_RETURN_NONE; SDL_GetRGBA (surf->format->colorkey, surf->format, &r, &g, &b, &a); return Py_BuildValue ("(bbbb)", r, g, b, a); } static PyObject* surf_set_alpha (PyObject *self, PyObject *args) { SDL_Surface *surf = PySurface_AsSurface (self); Uint32 flags = 0; PyObject *alpha_obj = NULL, *intobj = NULL; Uint8 alpha; int result, alphaval = 255, hasalpha = 0; if (!PyArg_ParseTuple (args, "|Oi", &alpha_obj, &flags)) return NULL; if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); if (surf->flags & SDL_OPENGL) return RAISE (PyExc_SDLError, "Cannot call on OPENGL Surfaces"); if (alpha_obj && alpha_obj != Py_None) { if (PyNumber_Check (alpha_obj) && (intobj = PyNumber_Int (alpha_obj))) { if (PyInt_Check (intobj)) { alphaval = (int) PyInt_AsLong (intobj); Py_DECREF (intobj); } else return RAISE (PyExc_TypeError, "invalid alpha argument"); } else return RAISE (PyExc_TypeError, "invalid alpha argument"); hasalpha = 1; } if (hasalpha) flags |= SDL_SRCALPHA; if (alphaval > 255) alpha = 255; else if (alphaval < 0) alpha = 0; else alpha = (Uint8) alphaval; PySurface_Prep (self); result = SDL_SetAlpha (surf, flags, alpha); PySurface_Unprep (self); if (result == -1) return RAISE (PyExc_SDLError, SDL_GetError ()); Py_RETURN_NONE; } static PyObject* surf_get_alpha (PyObject *self) { SDL_Surface *surf = PySurface_AsSurface (self); if (surf->flags & SDL_OPENGL) return RAISE (PyExc_SDLError, "Cannot call on OPENGL Surfaces"); if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); if (surf->flags & SDL_SRCALPHA) return PyInt_FromLong (surf->format->alpha); Py_RETURN_NONE; } static PyObject* surf_copy (PyObject *self) { SDL_Surface *surf = PySurface_AsSurface (self); PyObject *final; SDL_Surface *newsurf; if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); if (surf->flags & SDL_OPENGL) return RAISE (PyExc_SDLError, "Cannot copy opengl display"); PySurface_Prep (self); newsurf = SDL_ConvertSurface (surf, surf->format, surf->flags); PySurface_Unprep (self); final = PySurface_New (newsurf); if (!final) SDL_FreeSurface (newsurf); return final; } static PyObject* surf_convert (PyObject *self, PyObject *args) { SDL_Surface *surf = PySurface_AsSurface (self); PyObject *final; PyObject *argobject = NULL; SDL_Surface *src; SDL_Surface *newsurf; Uint32 flags = -1; if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot convert without pygame.display initialized"); if (!PyArg_ParseTuple (args, "|Oi", &argobject, &flags)) return NULL; if (surf->flags & SDL_OPENGL) return RAISE (PyExc_SDLError, "Cannot convert opengl display"); PySurface_Prep (self); if (argobject) { if (PySurface_Check (argobject)) { src = PySurface_AsSurface (argobject); flags = src->flags | (surf->flags & (SDL_SRCCOLORKEY | SDL_SRCALPHA)); newsurf = SDL_ConvertSurface (surf, src->format, flags); } else { int bpp; SDL_PixelFormat format; memcpy (&format, surf->format, sizeof (format)); if (IntFromObj (argobject, &bpp)) { Uint32 Rmask, Gmask, Bmask, Amask; if (flags != -1 && flags & SDL_SRCALPHA) { switch (bpp) { case 16: Rmask = 0xF << 8; Gmask = 0xF << 4; Bmask = 0xF; Amask = 0xF << 12; break; case 32: Rmask = 0xFF << 16; Gmask = 0xFF << 8; Bmask = 0xFF; Amask = 0xFF << 24; break; default: return RAISE (PyExc_ValueError, "no standard masks exist for given " "bitdepth with alpha"); } } else { Amask = 0; switch (bpp) { case 8: Rmask = 0xFF >> 6 << 5; Gmask = 0xFF >> 5 << 2; Bmask = 0xFF >> 6; break; case 12: Rmask = 0xFF >> 4 << 8; Gmask = 0xFF >> 4 << 4; Bmask = 0xFF >> 4; break; case 15: Rmask = 0xFF >> 3 << 10; Gmask = 0xFF >> 3 << 5; Bmask = 0xFF >> 3; break; case 16: Rmask = 0xFF >> 3 << 11; Gmask = 0xFF >> 2 << 5; Bmask = 0xFF >> 3; break; case 24: case 32: Rmask = 0xFF << 16; Gmask = 0xFF << 8; Bmask = 0xFF; break; default: return RAISE (PyExc_ValueError, "nonstandard bit depth given"); } } format.Rmask = Rmask; format.Gmask = Gmask; format.Bmask = Bmask; format.Amask = Amask; } else if (PySequence_Check (argobject) && PySequence_Size (argobject) == 4) { Uint32 mask; if (!UintFromObjIndex (argobject, 0, &format.Rmask) || !UintFromObjIndex (argobject, 1, &format.Gmask) || !UintFromObjIndex (argobject, 2, &format.Bmask) || !UintFromObjIndex (argobject, 3, &format.Amask)) { PySurface_Unprep (self); return RAISE (PyExc_ValueError, "invalid color masks given"); } mask = format.Rmask | format.Gmask | format.Bmask | format.Amask; for (bpp = 0; bpp < 32; ++bpp) if (!(mask >> bpp)) break; } else { PySurface_Unprep (self); return RAISE (PyExc_ValueError, "invalid argument specifying new format to convert to"); } format.BitsPerPixel = (Uint8) bpp; format.BytesPerPixel = (bpp + 7) / 8; if (flags == -1) flags = surf->flags; if (format.Amask) flags |= SDL_SRCALPHA; newsurf = SDL_ConvertSurface (surf, &format, flags); } } else { if (SDL_WasInit (SDL_INIT_VIDEO)) newsurf = SDL_DisplayFormat (surf); else newsurf = SDL_ConvertSurface (surf, surf->format, surf->flags); } PySurface_Unprep (self); final = PySurface_New (newsurf); if (!final) SDL_FreeSurface (newsurf); return final; } static PyObject* surf_convert_alpha (PyObject *self, PyObject *args) { SDL_Surface *surf = PySurface_AsSurface (self); PyObject *final; PySurfaceObject *srcsurf = NULL; SDL_Surface *newsurf, *src; if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot convert without pygame.display initialized"); if (!PyArg_ParseTuple (args, "|O!", &PySurface_Type, &srcsurf)) return NULL; PySurface_Prep (self); if (srcsurf) { /* * hmm, we have to figure this out, not all depths have good * support for alpha */ src = PySurface_AsSurface (srcsurf); newsurf = SDL_DisplayFormatAlpha (surf); } else newsurf = SDL_DisplayFormatAlpha (surf); PySurface_Unprep (self); final = PySurface_New (newsurf); if (!final) SDL_FreeSurface (newsurf); return final; } static PyObject* surf_set_clip (PyObject *self, PyObject *args) { SDL_Surface *surf = PySurface_AsSurface (self); PyObject *item; GAME_Rect *rect = NULL, temp; SDL_Rect sdlrect; int result; if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); if (PyTuple_Size (args)) { item = PyTuple_GET_ITEM (args, 0); if (item == Py_None && PyTuple_Size (args) == 1) { result = SDL_SetClipRect (surf, NULL); } else { rect = GameRect_FromObject (args, &temp); if (!rect) return RAISE (PyExc_ValueError, "invalid rectstyle object"); sdlrect.x = rect->x; sdlrect.y = rect->y; sdlrect.h = rect->h; sdlrect.w = rect->w; result = SDL_SetClipRect (surf, &sdlrect); } } else { result = SDL_SetClipRect (surf, NULL); } if (result == -1) { return RAISE (PyExc_SDLError, SDL_GetError ()); } Py_RETURN_NONE; } static PyObject* surf_get_clip (PyObject *self) { SDL_Surface *surf = PySurface_AsSurface (self); if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); return PyRect_New (&surf->clip_rect); } static PyObject* surf_fill (PyObject *self, PyObject *args, PyObject *keywds) { SDL_Surface *surf = PySurface_AsSurface (self); GAME_Rect *rect, temp; PyObject *r = NULL; Uint32 color; int result; PyObject *rgba_obj; Uint8 rgba[4]; SDL_Rect sdlrect; int blendargs = 0; static char *kwids[] = {"color", "rect", "special_flags", NULL}; if (!PyArg_ParseTupleAndKeywords (args, keywds, "O|Oi", kwids, &rgba_obj, &r, &blendargs)) return NULL; if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); if (surf->flags & SDL_OPENGL) return RAISE (PyExc_SDLError, "Cannot call on OPENGL Surfaces"); if (PyInt_Check (rgba_obj)) color = (Uint32) PyInt_AsLong (rgba_obj); else if (PyLong_Check (rgba_obj)) color = (Uint32) PyLong_AsUnsignedLong (rgba_obj); else if (RGBAFromColorObj (rgba_obj, rgba)) color = SDL_MapRGBA (surf->format, rgba[0], rgba[1], rgba[2], rgba[3]); else return RAISE (PyExc_TypeError, "invalid color argument"); if (!r || r == Py_None) { rect = &temp; temp.x = temp.y = 0; temp.w = surf->w; temp.h = surf->h; } else if (!(rect = GameRect_FromObject (r, &temp))) return RAISE (PyExc_ValueError, "invalid rectstyle object"); /* we need a fresh copy so our Rect values don't get munged */ if (rect != &temp) { memcpy (&temp, rect, sizeof (temp)); rect = &temp; } if (rect->w < 0 || rect->h < 0) { sdlrect.x = sdlrect.y = 0; sdlrect.w = sdlrect.h = 0; } else { sdlrect.x = rect->x; sdlrect.y = rect->y; sdlrect.w = rect->w; sdlrect.h = rect->h; if (blendargs != 0) { /* printf ("Using blendargs: %d\n", blendargs); */ result = surface_fill_blend (surf, &sdlrect, color, blendargs); } else { PySurface_Prep (self); result = SDL_FillRect (surf, &sdlrect, color); PySurface_Unprep (self); } if (result == -1) return RAISE (PyExc_SDLError, SDL_GetError ()); } return PyRect_New (&sdlrect); } static PyObject* surf_blit (PyObject *self, PyObject *args, PyObject *keywds) { SDL_Surface *src, *dest = PySurface_AsSurface (self); GAME_Rect *src_rect, temp; PyObject *srcobject, *argpos, *argrect = NULL; int dx, dy, result; SDL_Rect dest_rect, sdlsrc_rect; int sx, sy; int the_args = 0; static char *kwids[] = {"source", "dest", "area", "special_flags", NULL}; if (!PyArg_ParseTupleAndKeywords (args, keywds, "O!O|Oi", kwids, &PySurface_Type, &srcobject, &argpos, &argrect, &the_args)) return NULL; src = PySurface_AsSurface (srcobject); if (!dest || !src) return RAISE (PyExc_SDLError, "display Surface quit"); if (dest->flags & SDL_OPENGL && !(dest->flags & (SDL_OPENGLBLIT & ~SDL_OPENGL))) return RAISE (PyExc_SDLError, "Cannot blit to OPENGL Surfaces (OPENGLBLIT is ok)"); if ((src_rect = GameRect_FromObject (argpos, &temp))) { dx = src_rect->x; dy = src_rect->y; } else if (TwoIntsFromObj (argpos, &sx, &sy)) { dx = sx; dy = sy; } else return RAISE (PyExc_TypeError, "invalid destination position for blit"); if (argrect && argrect != Py_None) { if (!(src_rect = GameRect_FromObject (argrect, &temp))) return RAISE (PyExc_TypeError, "Invalid rectstyle argument"); } else { temp.x = temp.y = 0; temp.w = src->w; temp.h = src->h; src_rect = &temp; } dest_rect.x = (short) dx; dest_rect.y = (short) dy; dest_rect.w = (unsigned short) src_rect->w; dest_rect.h = (unsigned short) src_rect->h; sdlsrc_rect.x = (short) src_rect->x; sdlsrc_rect.y = (short) src_rect->y; sdlsrc_rect.w = (unsigned short) src_rect->w; sdlsrc_rect.h = (unsigned short) src_rect->h; if (!the_args) the_args = 0; result = PySurface_Blit (self, srcobject, &dest_rect, &sdlsrc_rect, the_args); if (result != 0) return NULL; return PyRect_New (&dest_rect); } static PyObject* surf_scroll (PyObject *self, PyObject *args, PyObject *keywds) { int dx = 0, dy = 0; SDL_Surface *surf; int bpp; int pitch; SDL_Rect *clip_rect; int w, h; Uint8 *src, *dst; static char *kwids[] = {"dx", "dy", NULL}; if (!PyArg_ParseTupleAndKeywords (args, keywds, "|ii", kwids, &dx, &dy)) { return NULL; } surf = PySurface_AsSurface (self); if (!surf) { return RAISE (PyExc_SDLError, "display Surface quit"); } if (surf->flags & SDL_OPENGL && !(surf->flags & (SDL_OPENGLBLIT & ~SDL_OPENGL))) { return RAISE (PyExc_SDLError, "Cannot scroll an OPENGL Surfaces (OPENGLBLIT is ok)"); } if (dx == 0 && dy == 0) { Py_RETURN_NONE; } clip_rect = &surf->clip_rect; w = clip_rect->w; h = clip_rect->h; if (dx >= w || dx <= -w || dy >= h || dy <= -h) { Py_RETURN_NONE; } if (!PySurface_Lock (self)) { return NULL; } bpp = surf->format->BytesPerPixel; pitch = surf->pitch; src = dst = (Uint8 *) surf->pixels + clip_rect->y * pitch + clip_rect->x * bpp; if (dx >= 0) { w -= dx; if (dy > 0) { h -= dy; dst += dy * pitch + dx * bpp; } else { h += dy; src -= dy * pitch; dst += dx * bpp; } } else { w += dx; if (dy > 0) { h -= dy; src -= dx * bpp; dst += dy * pitch; } else { h += dy; src -= dy * pitch + dx * bpp; } } surface_move (src, dst, h, w * bpp, pitch, pitch); if (!PySurface_Unlock (self)) { return NULL; } Py_RETURN_NONE; } static PyObject* surf_get_flags (PyObject *self) { SDL_Surface *surf = PySurface_AsSurface (self); if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); return PyInt_FromLong ((long)surf->flags); } static PyObject* surf_get_pitch (PyObject *self) { SDL_Surface *surf = PySurface_AsSurface (self); if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); return PyInt_FromLong (surf->pitch); } static PyObject* surf_get_size (PyObject *self) { SDL_Surface *surf = PySurface_AsSurface (self); if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); return Py_BuildValue ("(ii)", surf->w, surf->h); } static PyObject* surf_get_width (PyObject *self) { SDL_Surface *surf = PySurface_AsSurface (self); if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); return PyInt_FromLong (surf->w); } static PyObject* surf_get_height (PyObject *self) { SDL_Surface *surf = PySurface_AsSurface (self); if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); return PyInt_FromLong (surf->h); } static PyObject* surf_get_rect (PyObject *self, PyObject *args, PyObject *kwargs) { PyObject *rect; SDL_Surface *surf = PySurface_AsSurface (self); if (PyTuple_GET_SIZE (args) > 0) { return RAISE (PyExc_TypeError, "get_rect only accepts keyword arguments"); } if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); rect = PyRect_New4 (0, 0, surf->w, surf->h); if (rect && kwargs) { PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next (kwargs, &pos, &key, &value)) { if ((PyObject_SetAttr (rect, key, value) == -1)) { Py_DECREF (rect); return NULL; } } } return rect; } static PyObject* surf_get_bitsize (PyObject *self) { SDL_Surface *surf = PySurface_AsSurface (self); if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); return PyInt_FromLong (surf->format->BitsPerPixel); } static PyObject* surf_get_bytesize (PyObject *self) { SDL_Surface *surf = PySurface_AsSurface (self); if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); return PyInt_FromLong (surf->format->BytesPerPixel); } static PyObject* surf_get_masks (PyObject *self) { SDL_Surface *surf = PySurface_AsSurface (self); if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); return Py_BuildValue ("(IIII)", surf->format->Rmask, surf->format->Gmask, surf->format->Bmask, surf->format->Amask); } static PyObject* surf_set_masks (PyObject *self, PyObject *args) { SDL_Surface *surf = PySurface_AsSurface (self); /* Need to use 64bit vars so this works on 64 bit pythons. */ Uint64 r, g, b, a; if (!PyArg_ParseTuple (args, "(kkkk)", &r, &g, &b, &a)) return NULL; if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); /* printf("passed in: %d, %d, %d, %d\n", r,g,b,a ); printf("what are: %d, %d, %d, %d\n", surf->format->Rmask, surf->format->Gmask, surf->format->Bmask, surf->format->Amask); */ surf->format->Rmask = (Uint32)r; surf->format->Gmask = (Uint32)g; surf->format->Bmask = (Uint32)b; surf->format->Amask = (Uint32)a; Py_RETURN_NONE; } static PyObject* surf_get_shifts (PyObject *self) { SDL_Surface *surf = PySurface_AsSurface (self); if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); return Py_BuildValue ("(iiii)", surf->format->Rshift, surf->format->Gshift, surf->format->Bshift, surf->format->Ashift); } static PyObject* surf_set_shifts (PyObject *self, PyObject *args) { SDL_Surface *surf = PySurface_AsSurface (self); Uint64 r, g, b, a; if (!PyArg_ParseTuple (args, "(kkkk)", &r, &g, &b, &a)) return NULL; if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); surf->format->Rshift = (Uint8)r; surf->format->Gshift = (Uint8)g; surf->format->Bshift = (Uint8)b; surf->format->Ashift = (Uint8)a; Py_RETURN_NONE; } static PyObject* surf_get_losses (PyObject *self) { SDL_Surface *surf = PySurface_AsSurface (self); if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); return Py_BuildValue ("(iiii)", surf->format->Rloss, surf->format->Gloss, surf->format->Bloss, surf->format->Aloss); } static PyObject* surf_subsurface (PyObject *self, PyObject *args) { SDL_Surface *surf = PySurface_AsSurface (self); SDL_PixelFormat *format = surf->format; GAME_Rect *rect, temp; SDL_Surface *sub; PyObject *subobj; int pixeloffset; char *startpixel; struct SubSurface_Data *data; if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); if (surf->flags & SDL_OPENGL) return RAISE (PyExc_SDLError, "Cannot call on OPENGL Surfaces"); if (!(rect = GameRect_FromObject (args, &temp))) return RAISE (PyExc_ValueError, "invalid rectstyle argument"); if (rect->x < 0 || rect->y < 0 || rect->x + rect->w > surf->w || rect->y + rect->h > surf->h) return RAISE (PyExc_ValueError, "subsurface rectangle outside surface area"); PySurface_Lock (self); pixeloffset = rect->x * format->BytesPerPixel + rect->y * surf->pitch; startpixel = ((char *) surf->pixels) + pixeloffset; sub = SDL_CreateRGBSurfaceFrom (startpixel, rect->w, rect->h, format->BitsPerPixel, surf->pitch, format->Rmask, format->Gmask, format->Bmask, format->Amask); PySurface_Unlock (self); if (!sub) return RAISE (PyExc_SDLError, SDL_GetError ()); /* copy the colormap if we need it */ if (surf->format->BytesPerPixel == 1 && surf->format->palette) SDL_SetPalette (sub, SDL_LOGPAL, surf->format->palette->colors, 0, surf->format->palette->ncolors); if (surf->flags & SDL_SRCALPHA) SDL_SetAlpha (sub, surf->flags & SDL_SRCALPHA, format->alpha); if (surf->flags & SDL_SRCCOLORKEY) SDL_SetColorKey (sub, surf->flags & (SDL_SRCCOLORKEY | SDL_RLEACCEL), format->colorkey); data = PyMem_New (struct SubSurface_Data, 1); if (!data) return NULL; subobj = PySurface_New (sub); if (!subobj) { PyMem_Del (data); return NULL; } Py_INCREF (self); data->owner = self; data->pixeloffset = pixeloffset; data->offsetx = rect->x; data->offsety = rect->y; ((PySurfaceObject *) subobj)->subsurface = data; return subobj; } static PyObject* surf_get_offset (PyObject *self) { struct SubSurface_Data *subdata; subdata = ((PySurfaceObject *) self)->subsurface; if (!subdata) return Py_BuildValue ("(ii)", 0, 0); return Py_BuildValue ("(ii)", subdata->offsetx, subdata->offsety); } static PyObject* surf_get_abs_offset (PyObject *self) { struct SubSurface_Data *subdata; PyObject *owner; int offsetx, offsety; subdata = ((PySurfaceObject *) self)->subsurface; if (!subdata) return Py_BuildValue ("(ii)", 0, 0); subdata = ((PySurfaceObject *) self)->subsurface; owner = subdata->owner; offsetx = subdata->offsetx; offsety = subdata->offsety; while (((PySurfaceObject *) owner)->subsurface) { subdata = ((PySurfaceObject *) owner)->subsurface; owner = subdata->owner; offsetx += subdata->offsetx; offsety += subdata->offsety; } return Py_BuildValue ("(ii)", offsetx, offsety); } static PyObject* surf_get_parent (PyObject *self) { struct SubSurface_Data *subdata; subdata = ((PySurfaceObject *) self)->subsurface; if (!subdata) Py_RETURN_NONE; Py_INCREF (subdata->owner); return subdata->owner; } static PyObject* surf_get_abs_parent (PyObject *self) { struct SubSurface_Data *subdata; PyObject *owner; subdata = ((PySurfaceObject *) self)->subsurface; if (!subdata) { Py_INCREF (self); return self; } subdata = ((PySurfaceObject *) self)->subsurface; owner = subdata->owner; while (((PySurfaceObject *) owner)->subsurface) { subdata = ((PySurfaceObject *) owner)->subsurface; owner = subdata->owner; } Py_INCREF (owner); return owner; } static PyObject * surf_get_bounding_rect (PyObject *self, PyObject *args, PyObject *kwargs) { PyObject *rect; SDL_Surface *surf = PySurface_AsSurface (self); SDL_PixelFormat *format = surf->format; Uint8 *pixels = (Uint8 *) surf->pixels; Uint8 *pixel; int x, y; int min_x, min_y, max_x, max_y; int min_alpha = 1; int found_alpha = 0; Uint8 r, g, b, a; int has_colorkey = 0; Uint8 keyr, keyg, keyb; char *kwids[] = { "min_alpha", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i", kwids, &min_alpha)) return RAISE (PyExc_ValueError, "get_bounding_rect only accepts a single optional min_alpha argument"); if (!surf) return RAISE (PyExc_SDLError, "display Surface quit"); if (!PySurface_Lock (self)) return RAISE (PyExc_SDLError, "could not lock surface"); if (surf->flags & SDL_SRCCOLORKEY) { has_colorkey = 1; SDL_GetRGBA (surf->format->colorkey, surf->format, &keyr, &keyg, &keyb, &a); } pixels = (Uint8 *) surf->pixels; min_y = 0; min_x = 0; max_x = surf->w; max_y = surf->h; found_alpha = 0; for (y = max_y - 1; y >= min_y; --y) { for (x = min_x; x < max_x; ++x) { pixel = (pixels + y * surf->pitch) + x*format->BytesPerPixel; SDL_GetRGBA (*((Uint32*)pixel), surf->format, &r, &g, &b, &a); if ((a >= min_alpha && has_colorkey == 0) || (has_colorkey != 0 && (r != keyr || g != keyg || b != keyb))) { found_alpha = 1; break; } } if (found_alpha == 1) { break; } max_y = y; } found_alpha = 0; for (x = max_x - 1; x >= min_x; --x) { for (y = min_y; y < max_y; ++y) { pixel = (pixels + y * surf->pitch) + x*format->BytesPerPixel; SDL_GetRGBA (*((Uint32*)pixel), surf->format, &r, &g, &b, &a); if ((a >= min_alpha && has_colorkey == 0) || (has_colorkey != 0 && (r != keyr || g != keyg || b != keyb))) { found_alpha = 1; break; } } if (found_alpha == 1) { break; } max_x = x; } found_alpha = 0; for (y = min_y; y < max_y; ++y) { min_y = y; for (x = min_x; x < max_x; ++x) { pixel = (pixels + y * surf->pitch) + x*format->BytesPerPixel; SDL_GetRGBA (*((Uint32*)pixel), surf->format, &r, &g, &b, &a); if ((a >= min_alpha && has_colorkey == 0) || (has_colorkey != 0 && (r != keyr || g != keyg || b != keyb))) { found_alpha = 1; break; } } if (found_alpha == 1) { break; } } found_alpha = 0; for (x = min_x; x < max_x; ++x) { min_x = x; for (y = min_y; y < max_y; ++y) { pixel = (pixels + y * surf->pitch) + x*format->BytesPerPixel; SDL_GetRGBA (*((Uint32*)pixel), surf->format, &r, &g, &b, &a); if ((a >= min_alpha && has_colorkey == 0) || (has_colorkey != 0 && (r != keyr || g != keyg || b != keyb))) { found_alpha = 1; break; } } if (found_alpha == 1) { break; } } if (!PySurface_Unlock (self)) return RAISE (PyExc_SDLError, "could not unlock surface"); rect = PyRect_New4 (min_x, min_y, max_x - min_x, max_y - min_y); return rect; } static PyObject *surf_get_buffer (PyObject *self) { PyObject *buffer; PyObject *lock; SDL_Surface *surface = PySurface_AsSurface (self); Py_ssize_t length; length = (Py_ssize_t) surface->pitch * surface->h; buffer = PyBufferProxy_New (self, NULL, length, NULL); if (!buffer) { return RAISE (PyExc_SDLError, "could not acquire a buffer for the surface"); } lock = PySurface_LockLifetime (self, buffer); if (!lock) { Py_DECREF (buffer); return RAISE (PyExc_SDLError, "could not lock surface"); } ((PyBufferProxy *) buffer)->buffer = surface->pixels; ((PyBufferProxy *) buffer)->lock = lock; return buffer; } static void surface_move (Uint8 *src, Uint8 *dst, int h, int span, int srcpitch, int dstpitch) { if (src < dst) { src += (h - 1) * srcpitch; dst += (h - 1) * dstpitch; srcpitch = -srcpitch; dstpitch = -dstpitch; } while (h--) { memmove(dst, src, span); src += srcpitch; dst += dstpitch; } } static int surface_do_overlap (SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect) { Uint8 *srcpixels; Uint8 *dstpixels; int srcx = srcrect->x, srcy = srcrect->y; int dstx = dstrect->x, dsty = dstrect->y; int x, y; int w = srcrect-> w, h= srcrect->h; int maxw, maxh; SDL_Rect *clip = &dst->clip_rect; int span; int dstoffset; /* clip the source rectangle to the source surface */ if (srcx < 0) { w += srcx; dstx -= srcx; srcx = 0; } maxw = src->w - srcx; if (maxw < w) { w = maxw; } srcy = srcrect->y; if (srcy < 0) { h += srcy; dsty -= srcy; srcy = 0; } maxh = src->h - srcy; if (maxh < h) { h = maxh; } /* clip the destination rectangle against the clip rectangle */ x = clip->x - dstx; if (x > 0) { w -= x; dstx += x; srcx += x; } x = dstx + w - clip->x - clip->w; if (x > 0) { w -= x; } y = clip->y - dsty; if (y > 0) { h -= y; dsty += y; srcy += y; } y = dsty + h - clip->y - clip->h; if (y > 0) { h -= y; } if (w <= 0 || h <= 0) { return 0; } srcpixels = ((Uint8 *) src->pixels + src->offset + srcy * src->pitch + srcx * src->format->BytesPerPixel); dstpixels = ((Uint8 *) dst->pixels + src->offset + dsty * dst->pitch + dstx * dst->format->BytesPerPixel); if (dstpixels <= srcpixels) { return 0; } span = w * src->format->BytesPerPixel; if (dstpixels >= srcpixels + (h - 1) * src->pitch + span) { return 0; } dstoffset = (dstpixels - srcpixels) % src->pitch; return dstoffset < span || dstoffset > src->pitch - span; } /*this internal blit function is accessable through the C api*/ int PySurface_Blit (PyObject * dstobj, PyObject * srcobj, SDL_Rect * dstrect, SDL_Rect * srcrect, int the_args) { SDL_Surface *src = PySurface_AsSurface (srcobj); SDL_Surface *dst = PySurface_AsSurface (dstobj); SDL_Surface *subsurface = NULL; int result, suboffsetx = 0, suboffsety = 0; SDL_Rect orig_clip, sub_clip; /* passthrough blits to the real surface */ if (((PySurfaceObject *) dstobj)->subsurface) { PyObject *owner; struct SubSurface_Data *subdata; subdata = ((PySurfaceObject *) dstobj)->subsurface; owner = subdata->owner; subsurface = PySurface_AsSurface (owner); suboffsetx = subdata->offsetx; suboffsety = subdata->offsety; while (((PySurfaceObject *) owner)->subsurface) { subdata = ((PySurfaceObject *) owner)->subsurface; owner = subdata->owner; subsurface = PySurface_AsSurface (owner); suboffsetx += subdata->offsetx; suboffsety += subdata->offsety; } SDL_GetClipRect (subsurface, &orig_clip); SDL_GetClipRect (dst, &sub_clip); sub_clip.x += suboffsetx; sub_clip.y += suboffsety; SDL_SetClipRect (subsurface, &sub_clip); dstrect->x += suboffsetx; dstrect->y += suboffsety; dst = subsurface; } else { PySurface_Prep (dstobj); subsurface = NULL; } PySurface_Prep (srcobj); /* see if we should handle alpha ourselves */ if (dst->format->Amask && (dst->flags & SDL_SRCALPHA) && !(src->format->Amask && !(src->flags & SDL_SRCALPHA)) && /* special case, SDL works */ (dst->format->BytesPerPixel == 2 || dst->format->BytesPerPixel == 4)) { /* Py_BEGIN_ALLOW_THREADS */ result = pygame_AlphaBlit (src, srcrect, dst, dstrect, the_args); /* Py_END_ALLOW_THREADS */ } else if (the_args != 0 || (src->flags & (SDL_SRCALPHA | SDL_SRCCOLORKEY) && /* This simplification is possible because a source subsurface is converted to its owner with a clip rect and a dst subsurface cannot be blitted to its owner because the owner is locked. */ dst->pixels == src->pixels && surface_do_overlap (src, srcrect, dst, dstrect))) { /* Py_BEGIN_ALLOW_THREADS */ result = pygame_Blit (src, srcrect, dst, dstrect, the_args); /* Py_END_ALLOW_THREADS */ } /* can't blit alpha to 8bit, crashes SDL */ else if (dst->format->BytesPerPixel == 1 && (src->format->Amask || src->flags & SDL_SRCALPHA)) { /* Py_BEGIN_ALLOW_THREADS */ if (src->format->BytesPerPixel == 1) { result = pygame_Blit (src, srcrect, dst, dstrect, 0); } else { src = SDL_DisplayFormat (src); if (src) { result = SDL_BlitSurface (src, srcrect, dst, dstrect); SDL_FreeSurface (src); } else { result = -1; } } /* Py_END_ALLOW_THREADS */ } else { /* Py_BEGIN_ALLOW_THREADS */ result = SDL_BlitSurface (src, srcrect, dst, dstrect); /* Py_END_ALLOW_THREADS */ } if (subsurface) { SDL_SetClipRect (subsurface, &orig_clip); dstrect->x -= suboffsetx; dstrect->y -= suboffsety; } else PySurface_Unprep (dstobj); PySurface_Unprep (srcobj); if (result == -1) RAISE (PyExc_SDLError, SDL_GetError ()); if (result == -2) RAISE (PyExc_SDLError, "Surface was lost"); return result != 0; } static PyMethodDef _surface_methods[] = { { NULL, NULL, 0, NULL } }; MODINIT_DEFINE (surface) { PyObject *module, *dict, *apiobj, *lockmodule; int ecode; static void* c_api[PYGAMEAPI_SURFACE_NUMSLOTS]; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "surface", DOC_PYGAMESURFACE, -1, _surface_methods, NULL, NULL, NULL, NULL }; #endif /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_color (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_rect (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_bufferproxy(); if (PyErr_Occurred ()) { MODINIT_ERROR; } /* import the surflock module manually */ lockmodule = PyImport_ImportModule (IMPPREFIX "surflock"); if (lockmodule != NULL) { PyObject *_dict = PyModule_GetDict (lockmodule); PyObject *_c_api = PyDict_GetItemString (_dict, PYGAMEAPI_LOCAL_ENTRY); if (PyCObject_Check (_c_api)) { int i; void **localptr = (void *)PyCObject_AsVoidPtr (_c_api); for (i = 0; i < PYGAMEAPI_SURFLOCK_NUMSLOTS; ++i) PyGAME_C_API[i + PYGAMEAPI_SURFLOCK_FIRSTSLOT] = localptr[i]; } Py_DECREF (lockmodule); } else { MODINIT_ERROR; } /* type preparation */ if (PyType_Ready(&PySurface_Type) < 0) { MODINIT_ERROR; } /* create the module */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "surface", _surface_methods, DOC_PYGAMESURFACE); #endif if (module == NULL) { MODINIT_ERROR; } dict = PyModule_GetDict (module); if (PyDict_SetItemString (dict, "SurfaceType", (PyObject *) &PySurface_Type)) { DECREF_MOD (module); MODINIT_ERROR; } if (PyDict_SetItemString (dict, "Surface", (PyObject *) &PySurface_Type)) { DECREF_MOD (module); MODINIT_ERROR; } /* export the c api */ c_api[0] = &PySurface_Type; c_api[1] = PySurface_New; c_api[2] = PySurface_Blit; apiobj = PyCObject_FromVoidPtr (c_api, NULL); if (apiobj == NULL) { DECREF_MOD (module); MODINIT_ERROR; } ecode = PyDict_SetItemString (dict, PYGAMEAPI_LOCAL_ENTRY, apiobj); Py_DECREF (apiobj); if (ecode) { DECREF_MOD (module); MODINIT_ERROR; } /* Py_INCREF (PySurface_Type.tp_dict); INCREF's done in SetItemString */ if (PyDict_SetItemString (dict, "_dict", PySurface_Type.tp_dict)) { DECREF_MOD (module); MODINIT_ERROR; } MODINIT_RETURN (module); } pygame-1.9.1release/src/sdlmain_osx.m0000644000175000017500000001727611225305337017546 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2009 Brian Fisher This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* Mac OS X functions to accommodate the fact SDLMain.m is not included */ #include "pygame.h" #include #include #include #include #include #include #include #include #include "pgcompat.h" struct CPSProcessSerNum { UInt32 lo; UInt32 hi; }; typedef struct CPSProcessSerNum CPSProcessSerNum; extern OSErr CPSGetCurrentProcess( CPSProcessSerNum *psn); extern OSErr CPSEnableForegroundOperation( CPSProcessSerNum *psn, UInt32 _arg2, UInt32 _arg3, UInt32 _arg4, UInt32 _arg5); extern OSErr CPSSetFrontProcess( CPSProcessSerNum *psn); extern OSErr CPSSetProcessName ( CPSProcessSerNum *psn, const char *processname ); static bool HasInstalledApplication = 0; static NSString *getApplicationName(void) { const NSDictionary *dict; NSString *appName = 0; /* Determine the application name */ dict = (const NSDictionary *)CFBundleGetInfoDictionary(CFBundleGetMainBundle()); if (dict) appName = [dict objectForKey: @"CFBundleName"]; if (![appName length]) appName = [[NSProcessInfo processInfo] processName]; return appName; } static PyObject* _WMEnable(PyObject* self) { CPSProcessSerNum psn; OSErr err; const char* nameString; NSString* nameNSString; err = CPSGetCurrentProcess(&psn); if (err == 0) { nameNSString = getApplicationName(); nameString = [nameNSString UTF8String]; CPSSetProcessName(&psn, nameString); err = CPSEnableForegroundOperation(&psn,0x03,0x3C,0x2C,0x1103); if (err == 0) { err = CPSSetFrontProcess(&psn); if (err != 0) { return RAISE (PyExc_SDLError, "CPSSetFrontProcess failed"); } } else { return RAISE (PyExc_SDLError, "CPSEnableForegroundOperation failed"); } } else { return RAISE (PyExc_SDLError, "CPSGetCurrentProcess failed"); } Py_RETURN_TRUE; } static PyObject* _RunningFromBundleWithNSApplication(PyObject* self) { if (HasInstalledApplication) { Py_RETURN_TRUE; } CFBundleRef MainBundle = CFBundleGetMainBundle(); if (MainBundle != NULL) { if (CFBundleGetDataPointerForName(MainBundle, CFSTR("NSApp")) != NULL) { Py_RETURN_TRUE; } } Py_RETURN_FALSE; } //############################################################################# // Defining the NSApplication class we will use //############################################################################# @interface SDLApplication : NSApplication @end /* For some reaon, Apple removed setAppleMenu from the headers in 10.4, but the method still is there and works. To avoid warnings, we declare it ourselves here. */ @interface NSApplication(SDL_Missing_Methods) - (void)setAppleMenu:(NSMenu *)menu; @end @implementation SDLApplication /* Invoked from the Quit menu item */ - (void)terminate:(id)sender { SDL_Event event; event.type = SDL_QUIT; SDL_PushEvent(&event); } @end static void setApplicationMenu(void) { NSMenu *appleMenu; NSMenuItem *menuItem; NSString *title; NSString *appName; appName = getApplicationName(); appleMenu = [[NSMenu alloc] initWithTitle:@""]; title = [@"About " stringByAppendingString:appName]; [appleMenu addItemWithTitle:title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; [appleMenu addItem:[NSMenuItem separatorItem]]; title = [@"Hide " stringByAppendingString:appName]; [appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@"h"]; menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"]; [menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)]; [appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""]; [appleMenu addItem:[NSMenuItem separatorItem]]; title = [@"Quit " stringByAppendingString:appName]; [appleMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"]; menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; [menuItem setSubmenu:appleMenu]; [[NSApp mainMenu] addItem:menuItem]; [NSApp setAppleMenu:appleMenu]; [appleMenu release]; [menuItem release]; } static void setupWindowMenu(void) { NSMenu *windowMenu; NSMenuItem *windowMenuItem; NSMenuItem *menuItem; windowMenu = [[NSMenu alloc] initWithTitle:@"Window"]; menuItem = [[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"]; [windowMenu addItem:menuItem]; [menuItem release]; windowMenuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""]; [windowMenuItem setSubmenu:windowMenu]; [[NSApp mainMenu] addItem:windowMenuItem]; [NSApp setWindowsMenu:windowMenu]; [windowMenu release]; [windowMenuItem release]; } static PyObject* _InstallNSApplication(PyObject* self, PyObject* arg) { char* icon_data = NULL; int data_len = 0; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; [SDLApplication sharedApplication]; if (PyArg_ParseTuple (arg, "|z#", &icon_data, &data_len)) { NSData *image_data = [NSData dataWithBytes:icon_data length:data_len]; NSImage *icon_img = [[NSImage alloc] initWithData:image_data]; if (icon_img != NULL) { [NSApp setApplicationIconImage:icon_img]; } } [NSApp setMainMenu:[[NSMenu alloc] init]]; setApplicationMenu(); setupWindowMenu(); [NSApp finishLaunching]; [NSApp updateWindows]; [NSApp activateIgnoringOtherApps:true]; HasInstalledApplication = 1; Py_RETURN_TRUE; } static PyMethodDef macosx_builtins[] = { { "WMEnable", (PyCFunction) _WMEnable, METH_NOARGS, "Enables Foreground Operation when Window Manager is not available" }, { "RunningFromBundleWithNSApplication", (PyCFunction) _RunningFromBundleWithNSApplication, METH_NOARGS, "Returns true if we are running from an AppBundle with a variable named NSApp" }, { "InstallNSApplication", _InstallNSApplication, METH_VARARGS, "Creates an NSApplication with the right behaviors for SDL" }, { NULL, NULL, 0, NULL} }; MODINIT_DEFINE (sdlmain_osx) { PyObject *module; /* create the module */ #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, MODPREFIX "sdlmain_osx", NULL, -1, macosx_builtins, NULL, NULL, NULL, NULL }; #endif #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "sdlmain_osx", macosx_builtins, NULL); #endif /*imported needed apis*/ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } MODINIT_RETURN (module); } pygame-1.9.1release/src/scrap_x11.c0000644000175000017500000006077110777222010017010 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2006, 2007 Rene Dudfield, Marcus von Appen Originally written and put in the public domain by Sam Lantinga. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include static Display *SDL_Display; static Window SDL_Window; static void (*Lock_Display)(void); static void (*Unlock_Display)(void); /* Atoms used. */ static Atom _atom_UTF8; static Atom _atom_TEXT; static Atom _atom_COMPOUND; static Atom _atom_MIME_PLAIN; static Atom _atom_MIME_UTF8; static Atom _atom_TARGETS; static Atom _atom_TIMESTAMP; static Atom _atom_SDL; static Atom _atom_BMP; static Atom _atom_CLIPBOARD; /* Timestamps for the requests. */ static Time _cliptime = CurrentTime; static Time _selectiontime = CurrentTime; /* Maximum size to send or receive per request. */ #define MAX_CHUNK_SIZE(display) \ MIN(262144, /* 65536 * 4 */ \ (XExtendedMaxRequestSize (display)) == 0 \ ? XMaxRequestSize (display) - 100 \ : XExtendedMaxRequestSize (display) - 100) #define GET_CLIPATOM(x) ((x == SCRAP_SELECTION) ? XA_PRIMARY : _atom_CLIPBOARD) static Atom _convert_format (char *type); static void _init_atom_types (void); static char* _atom_to_string (Atom a); static void _add_clip_data (Atom type, char *data, int srclen); static int _clipboard_filter (const SDL_Event *event); static void _set_targets (PyObject *data, Display *display, Window window, Atom property); static int _set_data (PyObject *dict, Display *display, Window window, Atom property, Atom target); static Window _get_scrap_owner (Atom *selection); static char* _get_data_as (Atom source, Atom format, unsigned long *length); /** * \brief Converts the passed type into a system specific type to use * for the clipboard. * * \param type The type to convert. * \return A system specific type. */ static Atom _convert_format (char *type) { if (strcmp (type, PYGAME_SCRAP_PPM) == 0) return XA_PIXMAP; if (strcmp (type, PYGAME_SCRAP_PBM) == 0) return XA_BITMAP; return XInternAtom (SDL_Display, type, False); } /** * \brief Initializes the used atom types. */ static void _init_atom_types (void) { _atom_UTF8 = XInternAtom (SDL_Display, "UTF8_STRING", False); _atom_TEXT = XInternAtom (SDL_Display, "TEXT", False); _atom_COMPOUND = XInternAtom (SDL_Display, "COMPOUND_TEXT", False); _atom_MIME_PLAIN = XInternAtom (SDL_Display, "text/plain", False); _atom_MIME_UTF8 = XInternAtom (SDL_Display, "text/plain;charset=utf-8", False); _atom_TARGETS = XInternAtom (SDL_Display, "TARGETS", False); _atom_TIMESTAMP = XInternAtom (SDL_Display, "TIMESTAMP", False); _atom_SDL = XInternAtom (SDL_Display, "SDL_SELECTION", False); _atom_BMP = XInternAtom (SDL_Display, PYGAME_SCRAP_BMP, False); _atom_CLIPBOARD = XInternAtom (SDL_Display, "CLIPBOARD", False); } /** * \brief Returns the name of the passed Atom. The result has to be * freed by the caller using free(). * * \param a The Atom to get the name for. * \return The name of the Atom. */ static char* _atom_to_string (Atom a) { char *name; char *retval; if (!a) return NULL; name = XGetAtomName (SDL_Display, a); retval = strdup (name); XFree (name); return retval; } /** * Adds additional data to the currently selected clipboard and Window * if it does not already exist. * * \param cliptype The Atom to set the data for. * \param data The data to set. * \param srclen The length of the data. */ static void _add_clip_data (Atom cliptype, char *data, int srclen) { Atom clip = GET_CLIPATOM(_currentmode); PyObject* dict = (_currentmode == SCRAP_CLIPBOARD) ? _clipdata : _selectiondata; PyObject *tmp; char *key = _atom_to_string (cliptype); tmp = PyString_FromStringAndSize (data, srclen); PyDict_SetItemString (dict, key, tmp); Py_DECREF (tmp); XChangeProperty (SDL_Display, SDL_Window, clip, cliptype, 8, PropModeReplace, (unsigned char *) data, srclen); free (key); } /** * \brief System message filter function -- handles X11 clipboard messages. * * \param event The SDL_Event to check. * \return Always 1. */ static int _clipboard_filter (const SDL_Event *event) { PyObject *dict = NULL; Time timestamp = CurrentTime; /* Post all non-window manager specific events */ if (event->type != SDL_SYSWMEVENT) return 1; XEvent xevent = event->syswm.msg->event.xevent; /* Handle window-manager specific clipboard events */ switch (xevent.type) { case PropertyNotify: { /* Handled in pygame_scrap_put(). */ break; } case SelectionClear: { XSelectionClearEvent *clear = &xevent.xselectionclear; /* Looks like another window takes control over the clipboard. * Release the internally saved buffer, if any. */ if (clear->selection == XA_PRIMARY) timestamp = _selectiontime; else if(clear->selection == _atom_CLIPBOARD) timestamp = _cliptime; else break; /* Do not do anything, if the times do not match. */ if (timestamp != CurrentTime && xevent.xselectionclear.time < timestamp) break; /* Clean the dictionaries. */ if (clear->selection == XA_PRIMARY) PyDict_Clear (_selectiondata); else if (clear->selection != _atom_CLIPBOARD) PyDict_Clear (_clipdata); break; } case SelectionNotify: /* This one will be handled directly in the pygame_scrap_get () * function. */ break; case SelectionRequest: { XSelectionRequestEvent *req = &xevent.xselectionrequest; XEvent ev; /* Prepare answer. */ ev.xselection.type = SelectionNotify; ev.xselection.display = req->display; ev.xselection.requestor = req->requestor; ev.xselection.selection = req->selection; ev.xselection.target = req->target; ev.xselection.property = None; ev.xselection.time = req->time; /* Which clipboard type was requested? */ if (req->selection == XA_PRIMARY) { dict = _selectiondata; timestamp = _selectiontime; } else if (req->selection == _atom_CLIPBOARD) { dict = _clipdata; timestamp = _cliptime; } else /* Anything else's not supported. */ { XSendEvent (req->display, req->requestor, False, NoEventMask, &ev); return 1; } /* No data? */ if (PyDict_Size (dict) == 0) { XSendEvent (req->display, req->requestor, False, NoEventMask, &ev); return 1; } /* We do not own the selection anymore. */ if (timestamp == CurrentTime || (req->time != CurrentTime && timestamp > req->time)) { XSendEvent (req->display, req->requestor, False, NoEventMask, &ev); return 1; } /* * TODO: We have to make it ICCCM compatible at some point by * implementing the MULTIPLE atom request. */ /* Old client? */ if (req->property == None) ev.xselection.property = req->target; if (req->target == _atom_TARGETS) { /* The requestor wants to know, what we've got. */ _set_targets (dict, req->display, req->requestor, req->property); } else { _set_data (dict, req->display, req->requestor, req->property, req->target); } ev.xselection.property = req->property; /* Post the event for X11 clipboard reading above */ XSendEvent (req->display, req->requestor, False, 0, &ev); break; } } return 1; } /** * Sets the list of target atoms available in the clipboard. * * \param data The clipboard dictionary. * \param display The requesting Display. * \param window The requesting Window. * \param property The request property to place the list into. */ static void _set_targets (PyObject *data, Display *display, Window window, Atom property) { int i; char *format; PyObject *list = PyDict_Keys (data); int amount = PyList_Size (list); /* All types plus the TARGETS and a TIMESTAMP atom. */ Atom *targets = malloc ((amount + 2) * sizeof (Atom)); if (targets == NULL) return; memset (targets, 0, (amount + 2) * sizeof (Atom)); targets[0] = _atom_TARGETS; targets[1] = _atom_TIMESTAMP; for (i = 0; i < amount; i++) { format = PyString_AsString (PyList_GetItem(list, i)); targets[i + 2] = _convert_format (format); } XChangeProperty (display, window, property, XA_ATOM, 32, PropModeReplace, (unsigned char*) targets, amount + 2); } /** * Places the requested Atom data into a Window. * * \param data The clipboard dictionary. * \param display The requesting Display. * \param window The requesting Window. * \param property The request property to place the list into. * \param target The target porperty to place the list into. * \return 0 if no data for the target is available, 1 on success. */ static int _set_data (PyObject *data, Display *display, Window window, Atom property, Atom target) { char *name = _atom_to_string (target); PyObject *val = PyDict_GetItemString (data, name); char *value = NULL; int size; if (!val) { XFree (name); return 0; } size = PyString_Size (val); value = PyString_AsString (val); /* Send data. */ XChangeProperty (display, window, property, target, 8, PropModeReplace, (unsigned char *) value, size); XFree (name); return 1; } /** * \brief Tries to determine the X window with a valid selection. * Default is to check * - passed parameter * - CLIPBOARD * - XA_PRIMARY * - XA_SECONDARY * - XA_CUT_BUFFER0 - 7 * * in this order. * * \param selection The Atom type, that should be tried before any of the * fixed XA_* buffers. * \return The Window handle, that owns the selection or None if none was * found. */ static Window _get_scrap_owner (Atom *selection) { int i = 0; static Atom buffers[] = { XA_PRIMARY, XA_SECONDARY, XA_CUT_BUFFER0, XA_CUT_BUFFER1, XA_CUT_BUFFER2, XA_CUT_BUFFER3, XA_CUT_BUFFER4, XA_CUT_BUFFER5, XA_CUT_BUFFER6, XA_CUT_BUFFER7 }; Window owner = XGetSelectionOwner (SDL_Display, *selection); if (owner != None) return owner; owner = XGetSelectionOwner (SDL_Display, _atom_CLIPBOARD); if (owner != None) return owner; while (i < 10) { owner = XGetSelectionOwner (SDL_Display, buffers[i]); if (owner != None) { *selection = buffers[i]; return owner; } i++; } return None; } /** * Retrieves the data from a certain source Atom using a specific * format. * * \param source The currently active clipboard Atom to get the data from. * \param format The format of the data to get. * \param length Out parameter that contains the length of the returned * buffer. * \return The requested content or NULL in case no content exists or an * error occured. */ static char* _get_data_as (Atom source, Atom format, unsigned long *length) { char *retval = NULL; Window owner; time_t start; Atom sel_type; int sel_format; unsigned long nbytes; unsigned long overflow; *length = 0; unsigned char *src; unsigned long offset = 0; unsigned long chunk = 0; int step = 1; XEvent ev; Time timestamp; /* If we are the owner, simply return the clip buffer, if it matches * the request type. */ if (!pygame_scrap_lost ()) { char *fmt; char *data; fmt = _atom_to_string (format); if (_currentmode == SCRAP_SELECTION) data = PyString_AsString (PyDict_GetItemString (_selectiondata, fmt)); else data = PyString_AsString (PyDict_GetItemString (_clipdata, fmt)); free (fmt); return data; } Lock_Display (); /* Find a selection owner. */ owner = _get_scrap_owner (&source); if (owner == None) { Unlock_Display (); return NULL; } timestamp = (source == XA_PRIMARY) ? _selectiontime : _cliptime; /* Copy and convert the selection into our SDL_SELECTION atom of the * window. * Flush afterwards, so we have an immediate effect and do not receive * the old buffer anymore. */ XConvertSelection (SDL_Display, source, format, _atom_SDL, SDL_Window, timestamp); XSync (SDL_Display, False); /* Let's wait for the SelectionNotify event from the callee and * react upon it as soon as it is received. */ for (start = time (0);;) { if (XCheckTypedWindowEvent (SDL_Display, SDL_Window, SelectionNotify, &ev)) break; if (time (0) - start >= 5) { /* Timeout, damn. */ Unlock_Display (); return NULL; } } /* Get any property type and check the sel_type afterwards to decide * what to do. */ if (XGetWindowProperty (SDL_Display, ev.xselection.requestor, _atom_SDL, 0, 0, True, AnyPropertyType, &sel_type, &sel_format, &nbytes, &overflow, &src) != Success) { XFree (src); Unlock_Display (); return NULL; } /* In case we requested a SCRAP_TEXT, any property type of * XA_STRING, XA_COMPOUND_TEXT, UTF8_STRING and TEXT is valid. */ if (format == _atom_MIME_PLAIN && (sel_type != _atom_UTF8 && sel_type != _atom_TEXT && sel_type != _atom_COMPOUND && sel_type != XA_STRING)) { /* No matching text type found. Return nothing then. */ XFree (src); Unlock_Display (); return NULL; } /* Anything is fine, so copy the buffer and return it. */ switch (sel_format) { case 16: step = sizeof (short) / 2; break; case 32: step = sizeof (long) / 4; break; case 8: default: step = sizeof (char); *length = overflow; /* 8 bit size is already correctly set in nbytes.*/ break; } /* X11 guarantees NULL termination, add an extra byte. */ *length = step * overflow; retval = malloc (*length + 1); if (retval) { unsigned long boffset = 0; chunk = MAX_CHUNK_SIZE(SDL_Display); memset (retval, 0, (size_t) (*length + 1)); /* Read as long as there is data. */ while (overflow) { if (XGetWindowProperty (SDL_Display, ev.xselection.requestor, _atom_SDL, offset, chunk, True, AnyPropertyType, &sel_type, &sel_format, &nbytes, &overflow, &src) != Success) { break; } offset += nbytes / (32 / sel_format); nbytes *= step * sel_format / 8; memcpy (retval + boffset, src, nbytes); boffset += nbytes; XFree (src); } } else { /* ENOMEM */ return NULL; } /* In case we've got a COMPOUND_TEXT, convert it to the current * multibyte locale. */ if (sel_type == _atom_COMPOUND && sel_format == 8) { char **list = NULL; int count; int status = 0; XTextProperty p; p.encoding = sel_type; p.format = sel_format; p.nitems = nbytes; p.value = retval; status = XmbTextPropertyToTextList (SDL_Display, &p, &list, &count); if (status == XLocaleNotSupported || status == XConverterNotFound) { free (retval); PyErr_SetString (PyExc_SDLError, "current locale is not supported for conversion."); return NULL; } else if (status == XNoMemory) { free (retval); return NULL; } else if (status == Success) { if (count && list) { int i = 0; int ioffset = 0; char *tmp; free (retval); retval = NULL; for (i = 0; i < count; i++) { *length = strlen (list[i]); tmp = retval; retval = realloc (retval, (*length) + 1); if (!retval) { free (tmp); return NULL; } ioffset += *length; memcpy (retval, list[i], *length); memset (retval + ioffset, '\n', 1); } memset (retval + ioffset, 0, 1); } } if (list) XFreeStringList (list); } Unlock_Display (); return retval; } int pygame_scrap_init (void) { SDL_SysWMinfo info; int retval = 0; /* Grab the window manager specific information */ SDL_SetError ("SDL is not running on known window manager"); SDL_VERSION (&info.version); if (SDL_GetWMInfo (&info)) { /* Save the information for later use */ if (info.subsystem == SDL_SYSWM_X11) { XWindowAttributes setattrs; XSetWindowAttributes newattrs; newattrs.event_mask = PropertyChangeMask; SDL_Display = info.info.x11.display; SDL_Window = info.info.x11.window; Lock_Display = info.info.x11.lock_func; Unlock_Display = info.info.x11.unlock_func; Lock_Display (); /* We need the PropertyNotify event for the timestap, so * modify the event attributes. */ XGetWindowAttributes (SDL_Display, SDL_Window, &setattrs); newattrs.event_mask |= setattrs.all_event_masks; XChangeWindowAttributes (SDL_Display, SDL_Window, CWEventMask, &newattrs); Unlock_Display (); /* Enable the special window hook events */ SDL_EventState (SDL_SYSWMEVENT, SDL_ENABLE); SDL_SetEventFilter (_clipboard_filter); /* Create the atom types we need. */ _init_atom_types (); retval = 1; } else SDL_SetError ("SDL is not running on X11"); } if (retval) _scrapinitialized = 1; return retval; } int pygame_scrap_lost (void) { int retval; if (!pygame_scrap_initialized ()) { PyErr_SetString (PyExc_SDLError, "scrap system not initialized."); return 0; } Lock_Display (); retval = (XGetSelectionOwner (SDL_Display, GET_CLIPATOM (_currentmode)) != SDL_Window); Unlock_Display (); return retval; } int pygame_scrap_put (char *type, int srclen, char *src) { Atom clip; Atom cliptype; Time timestamp = CurrentTime; time_t start; XEvent ev; if (!pygame_scrap_initialized ()) { PyErr_SetString (PyExc_SDLError, "scrap system not initialized."); return 0; } Lock_Display (); clip = GET_CLIPATOM (_currentmode); cliptype = _convert_format (type); /* We've some types which should not be set by the user. */ if (cliptype == _atom_TARGETS || cliptype == _atom_SDL || cliptype == _atom_TIMESTAMP) { PyErr_SetString (PyExc_ValueError, "the requested type is reserved."); Unlock_Display (); return 0; } /* Update the clipboard property with the buffer. */ XChangeProperty (SDL_Display, SDL_Window, clip, cliptype, 8, PropModeReplace, (unsigned char *) src, srclen); if (cliptype == _atom_MIME_PLAIN) { /* Set PYGAME_SCRAP_TEXT. Also set XA_STRING, TEXT and * UTF8_STRING if they are not set in the dictionary. */ _add_clip_data (XA_STRING, src, srclen); _add_clip_data (_atom_UTF8, src, srclen); _add_clip_data (_atom_TEXT, src, srclen); } XSync (SDL_Display, False); /* Update the timestamp */ for (start = time (0);;) { if (XCheckTypedWindowEvent (SDL_Display, SDL_Window, PropertyNotify, &ev)) break; if (time (0) - start >= 5) { /* Timeout, damn. */ Unlock_Display (); goto SETSELECTIONOWNER; } } if (ev.xproperty.atom == clip) { timestamp = ev.xproperty.time; if (cliptype == XA_PRIMARY) _selectiontime = timestamp; else _cliptime = timestamp; } else timestamp = (cliptype == XA_PRIMARY) ? _selectiontime : _cliptime; SETSELECTIONOWNER: /* Set the selection owner to the own window. */ XSetSelectionOwner (SDL_Display, clip, SDL_Window, timestamp); if (XGetSelectionOwner (SDL_Display, clip) != SDL_Window) { /* Ouch, we could not toggle the selection owner. Raise an * error, as it's not guaranteed, that the clipboard * contains valid data. */ Unlock_Display (); return 0; } Unlock_Display (); return 1; } char* pygame_scrap_get (char *type, unsigned long *count) { if (!pygame_scrap_initialized ()) { PyErr_SetString (PyExc_SDLError, "scrap system not initialized."); return NULL; } return _get_data_as (GET_CLIPATOM (_currentmode), _convert_format (type), count); } int pygame_scrap_contains (char *type) { int i = 0; char **types = pygame_scrap_get_types (); while (types[i]) { if (strcmp (type, types[i]) == 0) return 1; i++; } return 0; } char** pygame_scrap_get_types (void) { char **types; Atom *targetdata; unsigned long length; if (!pygame_scrap_lost ()) { PyObject *key; int pos = 0; int i = 0; PyObject *dict = (_currentmode == SCRAP_SELECTION) ? _selectiondata : _clipdata; types = malloc (sizeof (char*) * (PyDict_Size (dict) + 1)); if (!types) return NULL; memset (types, 0, (size_t) (PyDict_Size (dict) + 1)); while (PyDict_Next (dict, &pos, &key, NULL)) { types[i] = strdup (PyString_AsString (key)); if (!types[i]) { /* Could not allocate memory, free anything. */ int j = 0; while (types[j]) { free (types[j]); j++; } free (types); return NULL; } i++; } types[i] = NULL; return types; } targetdata = (Atom *) _get_data_as (GET_CLIPATOM (_currentmode), _atom_TARGETS, &length); if (length > 0 && targetdata != NULL) { Atom *data = targetdata; int count = length / sizeof (Atom); int i; char **targets = malloc (sizeof (char *) * (count + 1)); if (targets == NULL) { free (targetdata); return NULL; } memset (targets, 0, sizeof (char *) * (count + 1)); for (i = 0; i < count; i++) targets[i] = _atom_to_string (data[i]); free (targetdata); return targets; } return NULL; } pygame-1.9.1release/src/scrap_win.c0000644000175000017500000002476611115660462017204 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2006, 2007 Rene Dudfield, Marcus von Appen Originally written and put in the public domain by Sam Lantinga. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #if !defined(CF_DIBV5) /* Missing from the MinGW win32api-3.11 winuser.h header */ #define CF_DIBV5 17 #endif static HWND SDL_Window; #define MAX_CHUNK_SIZE INT_MAX static UINT _format_MIME_PLAIN; /** * \brief Converts the passed type into a system specific clipboard type * to use for the clipboard. * * \param type The type to convert. * \return A system specific type. */ static UINT _convert_format (char *type) { return RegisterClipboardFormat (type); } /** * \brief Gets a system specific clipboard format type for a certain type. * * \param type The name of the format to get the mapped format type for. * \return The format type or -1 if no such type was found. */ static UINT _convert_internal_type (char *type) { if (strcmp (type, PYGAME_SCRAP_TEXT) == 0) return CF_TEXT; if (strcmp (type, "text/plain;charset=utf-8") == 0) return CF_UNICODETEXT; if (strcmp (type, "image/tiff") == 0) return CF_TIFF; if (strcmp (type, PYGAME_SCRAP_BMP) == 0) return CF_DIB; if (strcmp (type, "audio/wav") == 0) return CF_WAVE; return -1; } /** * \brief Looks up the name for the specific clipboard format type. * * \param format The format to get the name for. * \param buf The buffer to copy the name into. * \param size The size of the buffer. * \return The length of the format name. */ static int _lookup_clipboard_format (UINT format, char *buf, int size) { int len; char *cpy; memset (buf, 0, size); switch (format) { case CF_TEXT: len = strlen (PYGAME_SCRAP_TEXT); cpy = PYGAME_SCRAP_TEXT; break; case CF_UNICODETEXT: len = 24; cpy = "text/plain;charset=utf-8"; break; case CF_TIFF: len = 10; cpy = "image/tiff"; break; case CF_DIB: len = strlen (PYGAME_SCRAP_BMP); cpy = PYGAME_SCRAP_BMP; break; case CF_WAVE: len = 9; cpy = "audio/wav"; break; default: len = GetClipboardFormatName (format, buf, size); return len; } if (len != 0) memcpy (buf, cpy, len); return len; } /** * \brief Creates a BMP character buffer with all headers from a DIB * HANDLE. The caller has to free the returned buffer. * \param data The DIB handle data. * \param count The size of the DIB handle. * \return The character buffer containing the BMP information. */ static char* _create_dib_buffer (char* data, unsigned long *count) { BITMAPFILEHEADER hdr; LPBITMAPINFOHEADER bihdr; char *buf; if (!data) return NULL; bihdr = (LPBITMAPINFOHEADER) data; /* Create the BMP header. */ hdr.bfType = 'M' << 8 | 'B'; /* Specs say, it is always BM */ hdr.bfReserved1 = 0; hdr.bfReserved2 = 0; hdr.bfSize = (DWORD) (sizeof (BITMAPFILEHEADER) + bihdr->biSize + bihdr->biClrUsed * sizeof (RGBQUAD) + bihdr->biSizeImage); hdr.bfOffBits = (DWORD) (sizeof (BITMAPFILEHEADER) + bihdr->biSize + bihdr->biClrUsed * sizeof (RGBQUAD)); /* Copy both to the buffer. */ buf = malloc (sizeof (hdr) + (*count)); if (!buf) return NULL; memcpy (buf, &hdr, sizeof (hdr)); memcpy (buf + sizeof (BITMAPFILEHEADER), data, *count); /* Increase count for the correct size. */ *count += sizeof (hdr); return buf; } int pygame_scrap_init (void) { SDL_SysWMinfo info; int retval = 0; /* Grab the window manager specific information */ SDL_SetError ("SDL is not running on known window manager"); SDL_VERSION (&info.version); if (SDL_GetWMInfo (&info)) { /* Save the information for later use */ SDL_Window = info.window; retval = 1; } if (retval) _scrapinitialized = 1; _format_MIME_PLAIN = RegisterClipboardFormat (PYGAME_SCRAP_TEXT); return retval; } int pygame_scrap_lost (void) { if (!pygame_scrap_initialized ()) { PyErr_SetString (PyExc_SDLError, "scrap system not initialized."); return 0; } return (GetClipboardOwner () != SDL_Window); } int pygame_scrap_put (char *type, int srclen, char *src) { UINT format; int nulledlen = srclen + 1; HANDLE hMem; if (!pygame_scrap_initialized ()) { PyErr_SetString (PyExc_SDLError, "scrap system not initialized."); return 0; } format = _convert_internal_type (type); if (format == -1) format = _convert_format (type); if (!OpenClipboard (SDL_Window)) return 0; /* Could not open the clipboard. */ if (format == CF_DIB || format == CF_DIBV5) nulledlen -= sizeof (BITMAPFILEHEADER); /* We won't copy the header */ hMem = GlobalAlloc ((GMEM_MOVEABLE | GMEM_DDESHARE), nulledlen); if (hMem) { char *dst = GlobalLock (hMem); memset (dst, 0, nulledlen); if (format == CF_DIB || format == CF_DIBV5) memcpy (dst, src + sizeof (BITMAPFILEHEADER), nulledlen - 1); else memcpy (dst, src, srclen); GlobalUnlock (hMem); EmptyClipboard (); SetClipboardData (format, hMem); if (format == _format_MIME_PLAIN) { /* Setting SCRAP_TEXT, also set CF_TEXT. */ SetClipboardData (CF_TEXT, hMem); } } else { /* Could not access the clipboard, raise an error. */ CloseClipboard (); return 0; } CloseClipboard (); return 1; } char* pygame_scrap_get (char *type, unsigned long *count) { UINT format = _convert_format (type); char *retval = NULL; if (!pygame_scrap_initialized ()) { PyErr_SetString (PyExc_SDLError, "scrap system not initialized."); return NULL; } if (!pygame_scrap_lost ()) return PyString_AsString (PyDict_GetItemString (_clipdata, type)); if (!OpenClipboard (SDL_Window)) return NULL; if (!IsClipboardFormatAvailable (format)) { /* The format was not found - was it a mapped type? */ format = _convert_internal_type (type); if (format == -1) { CloseClipboard (); return NULL; } } if (IsClipboardFormatAvailable (format)) { HANDLE hMem; char *src; src = NULL; hMem = GetClipboardData (format); if (hMem) { *count = 0; /* CF_BITMAP is not a global, so do not lock it. */ if (format != CF_BITMAP) { src = GlobalLock (hMem); if (!src) { CloseClipboard (); return NULL; } *count = GlobalSize (hMem); } if (format == CF_DIB || format == CF_DIBV5) { /* Count will be increased accordingly in * _create_dib_buffer. */ src = _create_dib_buffer (src, count); GlobalUnlock (hMem); CloseClipboard (); return src; } else if (*count != 0) { /* weird error, shouldn't get here. */ if(!src) { return NULL; } retval = malloc (*count); if (retval) { memset (retval, 0, *count); memcpy (retval, src, *count); } } GlobalUnlock (hMem); } } CloseClipboard (); return retval; } char** pygame_scrap_get_types (void) { UINT format = 0; char **types = NULL; char **tmptypes; int i = 0; int count = -1; int len; char tmp[100] = { '\0' }; int size = 0; if (!OpenClipboard (SDL_Window)) return NULL; size = CountClipboardFormats (); if (size == 0) { CloseClipboard (); return NULL; /* No clipboard data. */ } for (i = 0; i < size; i++) { format = EnumClipboardFormats (format); if (format == 0) { /* Something wicked happened. */ while (i > 0) free (types[i]); free (types); CloseClipboard (); return NULL; } /* No predefined name, get the (truncated) name. */ len = _lookup_clipboard_format (format, tmp, 100); if (len == 0) continue; count++; tmptypes = realloc (types, sizeof (char *) * (count + 1)); if (!tmptypes) { while (count > 0) { free (types[count]); count--; } free (types); CloseClipboard (); return NULL; } types = tmptypes; types[count] = malloc (sizeof (char) * (len + 1)); if (!types[count]) { while (count > 0) { free (types[count]); count--; } free (types); CloseClipboard (); return NULL; } memset (types[count], 0, len + 1); memcpy (types[count], tmp, len); } tmptypes = realloc (types, sizeof (char *) * (count + 1)); if (!tmptypes) { while (count > 0) { free (types[count]); count--; } free (types); CloseClipboard (); return NULL; } types = tmptypes; types[count] = NULL; CloseClipboard (); return types; } int pygame_scrap_contains (char *type) { return IsClipboardFormatAvailable (_convert_format(type)); } pygame-1.9.1release/src/scrap_qnx.c0000644000175000017500000001440510613762403017202 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2006, 2007 Rene Dudfield, Marcus von Appen Originally written and put in the public domain by Sam Lantinga. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ static unsigned short InputGroup; #define MAX_CHUNK_SIZE INT_MAX /** * \brief Converts the passed type into a system specific type to use * for the clipboard. * * \param type The type to convert. * \return A system specific type. */ static uint32_t _convert_format (char *type) { switch (type) { case PYGAME_SCRAP_TEXT: return Ph_CL_TEXT; default: /* PYGAME_SCRAP_BMP et al. */ { /* TODO */ return 0; } } } int pygame_scrap_init (void) { SDL_SysWMinfo info; int retval = 0; /* Grab the window manager specific information */ SDL_SetError ("SDL is not running on known window manager"); SDL_VERSION (&info.version); if (SDL_GetWMInfo (&info)) { /* Save the information for later use */ InputGroup = PhInputGroup (NULL); retval = 1; } if (retval) _scrapinitialized = 1; return retval; } int pygame_scrap_lost (void) { if (!pygame_scrap_initialized ()) { PyErr_SetString (PyExc_SDLError, "scrap system not initialized."); return 0; } return (PhInputGroup (NULL) != InputGroup); } int pygame_scrap_put (char *type, int srclen, char *src) { uint32_t format; int nulledlen = srclen + 1; if (!pygame_scrap_initialized ()) { PyErr_SetString (PyExc_SDLError, "scrap system not initialized."); return 0; } format = _convert_format (type); /* Clear old buffer and copy the new content. */ if (_clipbuffer) free (_clipbuffer); _clipbuffer = malloc (nulledlen); if (!_clipbuffer) return 0; /* Allocation failed. */ memset (_clipbuffer, 0, nulledlen); memcpy (_clipbuffer, src, srclen); _clipsize = srclen; _cliptype = format; #if (_NTO_VERSION < 620) /* Before 6.2.0 releases. */ { PhClipHeader clheader = { Ph_CLIPBOARD_TYPE_TEXT, 0, NULL }; int* cldata; int status; cldata = (int *) _clipbuffer; *cldata = type; clheader.data = _clipbuffer; if (dstlen > 65535) clheader.length = 65535; /* Maximum photon clipboard size. :( */ else clheader.length = nulledlen; status = PhClipboardCopy (InputGroup, 1, &clheader); if (status == -1) { /* Could not access the clipboard, raise an error. */ CLEAN_CLIP_BUFFER (); return 0; } } #else /* 6.2.0 and 6.2.1 and future releases. */ { PhClipboardHdr clheader = { Ph_CLIPBOARD_TYPE_TEXT, 0, NULL }; int* cldata; int status; cldata = (int *) _clipbuffer; *cldata = type; clheader.data = _clipbuffer; clheader.length = nulledlen; status = PhClipboardWrite (InputGroup, 1, &clheader); if (status == -1) { /* Could not access the clipboard, raise an error. */ CLEAN_CLIP_BUFFER (); return 0; } } #endif return 1; } char* pygame_get_scrap (char *type) { uint32_t format = _convert_format (type); char *retval = NULL; if (!pygame_scrap_initialized ()) { PyErr_SetString (PyExc_SDLError, "scrap system not initialized."); return 0; } /* If we are the owner, simply return the clip buffer, if it matches * the request type. */ if (!pygame_scrap_lost ()) { if (format != _cliptype) return NULL; if (_clipbuffer) { retval = malloc (_clipsize + 1); if (!retval) return NULL; memset (retval, 0, _clipsize + 1); memcpy (retval, _clipbuffer, _clipsize + 1); return retval; } return NULL; } #if (_NTO_VERSION < 620) /* before 6.2.0 releases */ { void *clhandle; PhClipHeader *clheader; int *cldata; clhandle = PhClipboardPasteStart (InputGroup); if (clhandle) { clheader = PhClipboardPasteType (clhandle, Ph_CLIPBOARD_TYPE_TEXT); if (clheader) { cldata = clheader->data; if (*cldata == type) retval = malloc (clheader->length + 1); if (retval) { memset (retval, 0, clheader->length + 1); memcpy (retval, cldata, clheader->length + 1); } } PhClipboardPasteFinish (clhandle); } } #else /* 6.2.0 and 6.2.1 and future releases */ { void* clhandle; PhClipboardHdr* clheader; int* cldata; clheader = PhClipboardRead (InputGroup, Ph_CLIPBOARD_TYPE_TEXT); if (clheader) { cldata = clheader->data; if (*cldata == type) retval = malloc (clheader->length + 1); if (retval) { memset (retval, 0, clheader->length + 1); memcpy (retval, cldata, clheader->length + 1); } /* According to the QNX 6.x docs, the clheader pointer is a * newly created one that must be freed manually. */ free (clheader->data); free (clheader); } } #endif return retval; } char** pygame_scrap_get_types (void) { return NULL; } int pygame_scrap_contains (char *type) { return 0; } pygame-1.9.1release/src/scrap_mac.c0000644000175000017500000000424110615735766017147 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2006, 2007 Rene Dudfield, Marcus von Appen Originally written and put in the public domain by Sam Lantinga. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ static PyObject* mac_scrap_call (char *name, PyObject *args) { static PyObject *mac_scrap_module = NULL; PyObject *method; PyObject *result; if (!mac_scrap_module) mac_scrap_module = PyImport_ImportModule ("pygame.mac_scrap"); if (!mac_scrap_module) return NULL; method = PyObject_GetAttrString (mac_scrap_module, name); if (!method) return NULL; result = PyObject_CallObject (method, args); Py_DECREF (method); return result; } static PyObject* _scrap_init (PyObject *self, PyObject *args) { return mac_scrap_call ("init", args); } static PyObject* _scrap_get_scrap (PyObject *self, PyObject *args) { return mac_scrap_call ("get", args); } static PyObject* _scrap_put_scrap (PyObject *self, PyObject *args) { return mac_scrap_call ("put", args); } static PyObject* _scrap_lost_scrap (PyObject *self, PyObject *args) { return mac_scrap_call ("lost", args); } static PyObject* _scrap_get_types (PyObject *self, PyObject *args) { return mac_scrap_call ("get_types", args); } static PyObject* _scrap_contains (PyObject *self, PyObject *args) { return mac_scrap_call ("contains", args); } static PyObject* _scrap_set_mode (PyObject *self, PyObject *args) { return mac_scrap_call ("set_mode", args); } pygame-1.9.1release/src/scrap.h0000644000175000017500000001060610740376474016332 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2006, 2007 Rene Dudfield, Marcus von Appen Originally put in the public domain by Sam Lantinga. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include /* Handle clipboard text and data in arbitrary formats */ /** * Predefined supported pygame scrap types. */ #define PYGAME_SCRAP_TEXT "text/plain" #define PYGAME_SCRAP_BMP "image/bmp" #define PYGAME_SCRAP_PPM "image/ppm" #define PYGAME_SCRAP_PBM "image/pbm" /** * The supported scrap clipboard types. * * This is only relevant in a X11 environment, which supports mouse * selections as well. For Win32 and MacOS environments the default * clipboard is used, no matter what value is passed. */ typedef enum { SCRAP_CLIPBOARD, SCRAP_SELECTION /* only supported in X11 environments. */ } ScrapClipType; /** * Macro for initialization checks. */ #define PYGAME_SCRAP_INIT_CHECK() \ if(!pygame_scrap_initialized()) \ return (PyErr_SetString (PyExc_SDLError, \ "scrap system not initialized."), NULL) /** * \brief Checks, whether the pygame scrap module was initialized. * * \return 1 if the modules was initialized, 0 otherwise. */ extern int pygame_scrap_initialized (void); /** * \brief Initializes the pygame scrap module internals. Call this before any * other method. * * \return 1 on successful initialization, 0 otherwise. */ extern int pygame_scrap_init (void); /** * \brief Checks, whether the pygame window lost the clipboard focus or not. * * \return 1 if the window lost the focus, 0 otherwise. */ extern int pygame_scrap_lost (void); /** * \brief Places content of a specific type into the clipboard. * * \note For X11 the following notes are important: The following types * are reserved for internal usage and thus will throw an error on * setting them: "TIMESTAMP", "TARGETS", "SDL_SELECTION". * Setting PYGAME_SCRAP_TEXT ("text/plain") will also automatically * set the X11 types "STRING" (XA_STRING), "TEXT" and "UTF8_STRING". * * For Win32 the following notes are important: Setting * PYGAME_SCRAP_TEXT ("text/plain") will also automatically set * the Win32 type "TEXT" (CF_TEXT). * * For QNX the following notes are important: Setting * PYGAME_SCRAP_TEXT ("text/plain") will also automatically set * the QNX type "TEXT" (Ph_CL_TEXT). * * \param type The type of the content. * \param srclen The length of the content. * \param src The NULL terminated content. * \return 1, if the content could be successfully pasted into the clipboard, * 0 otherwise. */ extern int pygame_scrap_put (char *type, int srclen, char *src); /** * \brief Gets the current content from the clipboard. * * \note The received content does not need to be the content previously * placed in the clipboard using pygame_put_scrap(). See the * pygame_put_scrap() notes for more details. * * \param type The type of the content to receive. * \param count The size of the returned content. * \return The content or NULL in case of an error or if no content of the * specified type was available. */ extern char* pygame_scrap_get (char *type, unsigned long *count); /** * \brief Gets the currently available content types from the clipboard. * * \return The different available content types or NULL in case of an * error or if no content type is available. */ extern char** pygame_scrap_get_types (void); /** * \brief Checks whether content for the specified scrap type is currently * available in the clipboard. * * \param type The type to check for. * \return 1, if there is content and 0 otherwise. */ extern int pygame_scrap_contains (char *type); pygame-1.9.1release/src/scrap.doc0000644000175000017500000001254711204402244016633 0ustar vincentvincentpygame.scrap pygame module for clipboard support. EXPERIMENTAL!: meaning this api may change, or dissapear in later pygame releases. If you use this, your code will break with the next pygame release. The scrap module is for getting and putting stuff from the clipboard. So you can copy and paste things between pygame, and other application types. It defines some basic own data types SCRAP_PPM SCRAP_PBM SCRAP_BMP SCRAP_TEXT to be placed into the clipboard and allows to use define own clipboard types. SCRAP_PPM, SCRAP_PBM and SCRAP_BMP are suitable for surface buffers to be shared with other applications, while SCRAP_TEXT is an alias for the plain text clipboard type. The SCRAP_* types refer to the following MIME types and register those as well as the default operating system type for this type of data: SCRAP_TEXT text/plain for plain text SCRAP_PBM image/pbm for PBM encoded image data SCRAP_PPM image/ppm for PPM encoded image data SCRAP_BMP image/bmp for BMP encoded image data Depending on the platform additional types are automatically registered when data is placed into the clipboard to guarantee a consistent sharing behaviour with other applications. The following listed types can be used as string to be passed to the respective pygame.scrap module functions. For Windows platforms, the additional types are supported automatically and resolve to their internal definitions: text/plain;charset=utf-8 for UTF-8 encoded text audio/wav for WAV encoded audio image/tiff for TIFF encoded image data For X11 platforms, the additional types are supported automatically and resolve to their internal definitions: UTF8_STRING for UTF-8 encoded text text/plain;charset=utf-8 for UTF-8 encoded text COMPOUND_TEXT for COMPOUND text As stated before you can define own types for the clipboard, those however might not be usable by other applications. Thus data pasted into the clipboard using pygame.scrap.put ("own_data", data) can only be used by applications, which query the clipboard for the "own_data" type. New in pygame 1.8. Only works for Windows, X11 and Mac OS X so far. On Mac OSX only text works at the moment - other types will be supported in the next release.
    init Initializes the scrap module. scrap.init () -> None Tries to initialize the scrap module and raises an exception, if it fails. Note that this module requires a set display surface, so you have to make sure, you acquired one earlier using pygame.display.set_mode(). get Gets the data for the specified type from the clipboard. scrap.get (type) -> string Returns the data for the specified type from the clipboard. The data is returned as string and might need further processing. If no data for the passed type is available, None is returned. text = pygame.scrap.get (SCRAP_TEXT) if text: # Do stuff with it. else: print "There does not seem to be text in the clipboard." get_types Gets a list of the available clipboard types. scrap.get_types () -> list Gets a list of strings with the identifiers for the available clipboard types. Each identifier can be used in the scrap.get() method to get the clipboard content of the specific type. If there is no data in the clipboard, an empty list is returned. types = pygame.scrap.get_types () for t in types: if "text" in t: # There is some content with the word "text" in it. It's # possibly text, so print it. print pygame.scrap.get (t) put Places data into the clipboard. scrap.put(type, data) -> None Places data for a specific clipboard type into the clipboard. The data must be a string buffer. The type is a string identifying the type of data placed into the clipboard. This can be one of the native SCRAP_PBM, SCRAP_PPM, SCRAP_BMP or SCRAP_TEXT values or an own string identifier. The method raises an exception, if the content could not be placed into the clipboard. fp = open ("example.bmp", "rb") pygame.scrap.put (SCRAP_BMP, fp.read ()) fp.close () # Now you can acquire the image data from the clipboard in other # applications. pygame.scrap.put (SCRAP_TEXT, "A text to copy") pygame.scrap.put ("Plain text", "A text to copy") contains Checks, whether a certain type is available in the clipboard. scrap.contains (type) -> bool Returns True, if data for the passed type is available in the clipboard, False otherwise. if pygame.scrap.contains (SCRAP_TEXT): print "There is text in the clipboard." if pygame.scrap.contains ("own_data_type"): print "There is stuff in the clipboard." lost Checks whether the clipboard is currently owned by the application. scrap.lost() -> bool Returns True, if the clipboard is currently owned by the pygame application, False otherwise. if pygame.scrap.lost (): print "No content from me anymore. The clipboard is used by someone else." set_mode Sets the clipboard access mode. scrap.set_mode(mode) -> None Sets the access mode for the clipboard. This is only of interest for X11 environments, where clipboard modes for mouse selections (SRAP_SELECTION) and the clipboard (SCRAP_CLIPBOARD) are available. Setting the mode to SCRAP_SELECTION in other environments will not cause any difference. If a value different from SCRAP_CLIPBOARD or SCRAP_SELECTION is passed, a ValueError will be raised. pygame-1.9.1release/src/scrap.c0000644000175000017500000002063511226552737016326 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2006, 2007 Rene Dudfield, Marcus von Appen Originally written and put in the public domain by Sam Lantinga. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* Handle clipboard text and data in arbitrary formats */ #include #include #include "SDL.h" #include "SDL_syswm.h" #include "scrap.h" #include "pygame.h" #include "pygamedocs.h" /** * Indicates, whether pygame.scrap was initialized or not. */ static int _scrapinitialized = 0; /** * Currently active Clipboard object. */ static ScrapClipType _currentmode; static PyObject* _selectiondata; static PyObject* _clipdata; /* Forward declarations. */ static PyObject* _scrap_get_types (PyObject *self, PyObject *args); static PyObject* _scrap_contains (PyObject *self, PyObject *args); static PyObject* _scrap_get_scrap (PyObject* self, PyObject* args); static PyObject* _scrap_put_scrap (PyObject* self, PyObject* args); static PyObject* _scrap_lost_scrap (PyObject* self, PyObject* args); static PyObject* _scrap_set_mode (PyObject* self, PyObject* args); /* Determine what type of clipboard we are using */ #if defined(__unix__) && defined(SDL_VIDEO_DRIVER_X11) /*!defined(__QNXNTO__) &&*/ #define X11_SCRAP #include /* Needed for clipboard timeouts. */ #include "scrap_x11.c" #elif defined(__WIN32__) #define WIN_SCRAP #include "scrap_win.c" /* #elif defined(__QNXNTO__) #define QNX_SCRAP static uint32_t _cliptype = 0; #include "scrap_qnx.c" */ #elif defined(__APPLE__) #define MAC_SCRAP #include "scrap_mac.c" #else #error Unknown window manager for clipboard handling #endif /* scrap type */ /** * \brief Indicates whether the scrap module is already initialized. * * \return 0 if the module is not initialized, 1, if it is. */ int pygame_scrap_initialized (void) { return _scrapinitialized; } #if !defined(MAC_SCRAP) /* * Initializes the pygame scrap module. */ static PyObject* _scrap_init (PyObject *self, PyObject *args) { VIDEO_INIT_CHECK (); _clipdata = PyDict_New (); _selectiondata = PyDict_New (); /* In case we've got not video surface, we won't initialize * anything. */ if (!SDL_GetVideoSurface()) return RAISE (PyExc_SDLError, "No display mode is set"); if (!pygame_scrap_init ()) return RAISE (PyExc_SDLError, SDL_GetError ()); Py_RETURN_NONE; } #endif #if !defined(MAC_SCRAP) /* * Gets the currently available types from the active clipboard. */ static PyObject* _scrap_get_types (PyObject *self, PyObject *args) { int i = 0; char **types; PyObject *list; PyObject *tmp; PYGAME_SCRAP_INIT_CHECK (); if (!pygame_scrap_lost ()) { switch (_currentmode) { case SCRAP_SELECTION: return PyDict_Keys (_selectiondata); case SCRAP_CLIPBOARD: default: return PyDict_Keys (_clipdata); } } list = PyList_New (0); types = pygame_scrap_get_types (); if (!types) return list; while (types[i] != NULL) { tmp = PyString_FromString (types[i]); PyList_Append (list, tmp); Py_DECREF (tmp); i++; } return list; } #endif #if !defined(MAC_SCRAP) /* * Checks whether the active clipboard contains a certain type. */ static PyObject* _scrap_contains (PyObject *self, PyObject *args) { char *type = NULL; if (!PyArg_ParseTuple (args, "s", &type)) return NULL; if (pygame_scrap_contains (type)) Py_RETURN_TRUE; Py_RETURN_FALSE; } #endif #if !defined(MAC_SCRAP) /* * Gets the content for a certain type from the active clipboard. */ static PyObject* _scrap_get_scrap (PyObject* self, PyObject* args) { char *scrap = NULL; PyObject *retval; char *scrap_type; PyObject *val; unsigned long count; PYGAME_SCRAP_INIT_CHECK (); if(!PyArg_ParseTuple (args, "s", &scrap_type)) return NULL; if (!pygame_scrap_lost ()) { /* We are still the active one. */ switch (_currentmode) { case SCRAP_SELECTION: val = PyDict_GetItemString (_selectiondata, scrap_type); break; case SCRAP_CLIPBOARD: default: val = PyDict_GetItemString (_clipdata, scrap_type); break; } Py_XINCREF (val); return val; } /* pygame_get_scrap() only returns NULL or !NULL, but won't set any * errors. */ scrap = pygame_scrap_get (scrap_type, &count); if (!scrap) Py_RETURN_NONE; retval = PyString_FromStringAndSize (scrap, count); return retval; } #endif #if !defined(MAC_SCRAP) /* * This will put a python string into the clipboard. */ static PyObject* _scrap_put_scrap (PyObject* self, PyObject* args) { int scraplen; char *scrap = NULL; char *scrap_type; PyObject *tmp; PYGAME_SCRAP_INIT_CHECK (); if (!PyArg_ParseTuple (args, "st#", &scrap_type, &scrap, &scraplen)) return NULL; /* Set it in the clipboard. */ if (!pygame_scrap_put (scrap_type, scraplen, scrap)) return RAISE (PyExc_SDLError, "content could not be placed in clipboard."); /* Add or replace the set value. */ switch (_currentmode) { case SCRAP_SELECTION: { tmp = PyString_FromStringAndSize (scrap, scraplen); PyDict_SetItemString (_selectiondata, scrap_type, tmp); Py_DECREF (tmp); break; } case SCRAP_CLIPBOARD: default: { tmp = PyString_FromStringAndSize (scrap, scraplen); PyDict_SetItemString (_clipdata, scrap_type, tmp); Py_DECREF (tmp); break; } } Py_RETURN_NONE; } #endif #if !defined(MAC_SCRAP) /* * Checks whether the pygame window has lost the clipboard. */ static PyObject* _scrap_lost_scrap (PyObject* self, PyObject* args) { PYGAME_SCRAP_INIT_CHECK (); if (pygame_scrap_lost ()) Py_RETURN_TRUE; Py_RETURN_FALSE; } #endif #if !defined(MAC_SCRAP) /* * Sets the clipboard mode. This only works for the X11 environment, which * diverses between mouse selections and the clipboard. */ static PyObject* _scrap_set_mode (PyObject* self, PyObject* args) { PYGAME_SCRAP_INIT_CHECK (); if (!PyArg_ParseTuple (args, "i", &_currentmode)) return NULL; if (_currentmode != SCRAP_CLIPBOARD && _currentmode != SCRAP_SELECTION) return RAISE (PyExc_ValueError, "invalid clipboard mode"); #ifndef X11_SCRAP /* Force the clipboard, if not in a X11 environment. */ _currentmode = SCRAP_CLIPBOARD; #endif Py_RETURN_NONE; } #endif /* !defined(MAC_SCRAP) */ static PyMethodDef scrap_builtins[] = { /* * Only initialise these functions for ones we know about. * * Note, the macosx stuff is done in pygame/__init__.py * by importing pygame.mac_scrap */ #if (defined(X11_SCRAP) || defined(WIN_SCRAP) || defined(QNX_SCRAP) \ || defined(MAC_SCRAP)) { "init", _scrap_init, 1, DOC_PYGAMESCRAPINIT }, { "contains", _scrap_contains, METH_VARARGS, DOC_PYGAMESCRAPCONTAINS }, { "get", _scrap_get_scrap, METH_VARARGS, DOC_PYGAMESCRAPGET }, { "get_types", _scrap_get_types, METH_NOARGS, DOC_PYGAMESCRAPGETTYPES}, { "put", _scrap_put_scrap, METH_VARARGS, DOC_PYGAMESCRAPPUT }, { "lost", _scrap_lost_scrap, METH_NOARGS, DOC_PYGAMESCRAPLOST }, { "set_mode", _scrap_set_mode, METH_VARARGS, DOC_PYGAMESCRAPSETMODE }, #endif { NULL, NULL, 0, NULL} }; PYGAME_EXPORT void initscrap (void) { PyObject *mod; /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { return; } /* create the module */ mod = Py_InitModule3 (MODPREFIX "scrap", scrap_builtins, NULL); } pygame-1.9.1release/src/scale_mmx64.c0000644000175000017500000007662711077711443017347 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners Copyright (C) 2007 Rene Dudfield, Richard Goedeken This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* Pentium 64 bit SSE/MMX smoothscale routines * These are written for compilation with GCC only. * * This file should not depend on anything but the C standard library. */ #if !defined(__GNUC__) || !defined(__x86_64__) #error "Pygame build bug: should not be compiling this file!" #endif #include typedef uint8_t Uint8; /* SDL convension */ typedef uint16_t Uint16; /* SDL convension */ #include #include #include "scale.h" /* These functions implement an area-averaging shrinking filter in the X-dimension. */ void filter_shrink_X_MMX(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, int dstpitch, int srcwidth, int dstwidth) { int srcdiff = srcpitch - (srcwidth * 4); int dstdiff = dstpitch - (dstwidth * 4); int xspace = 0x04000 * srcwidth / dstwidth; /* must be > 1 */ int xrecip = 0x40000000 / xspace; long long One64 = 0x4000400040004000ULL; long long srcdiff64 = srcdiff; long long dstdiff64 = dstdiff; asm __volatile__(" /* MMX code for X-shrink area average filter */ " " pxor %%mm0, %%mm0; " " movd %6, %%mm7; " /* mm7 == xrecipmmx */ " punpcklwd %%mm7, %%mm7; " " punpckldq %%mm7, %%mm7; " "1: " /* outer Y-loop */ " movl %5, %%ecx; " /* ecx == xcounter */ " pxor %%mm1, %%mm1; " /* mm1 == accumulator */ " movl %4, %%edx; " /* edx == width */ "2: " /* inner X-loop */ " cmpl $0x4000, %%ecx; " " jbe 3f; " " movd (%0), %%mm2; " /* mm2 = srcpix */ " add $4, %0; " " punpcklbw %%mm0, %%mm2; " " paddw %%mm2, %%mm1; " /* accumulator += srcpix */ " subl $0x4000, %%ecx; " " jmp 4f; " "3: " /* prepare to output a pixel */ " movd %%ecx, %%mm2; " " movq %2, %%mm3; " /* mm3 = 2^14 */ " punpcklwd %%mm2, %%mm2; " " punpckldq %%mm2, %%mm2; " " movd (%0), %%mm4; " /* mm4 = srcpix */ " add $4, %0; " " punpcklbw %%mm0, %%mm4; " " psubw %%mm2, %%mm3; " /* mm3 = xfrac */ " psllw $2, %%mm4; " " movq %%mm4, %%mm5; " /* mm2 = (srcpix * xcounter >> 16) */ " psraw $15, %%mm5; " " pand %%mm2, %%mm5; " " movq %%mm2, %%mm6; " " psraw $15, %%mm6; " " pand %%mm4, %%mm6; " " pmulhw %%mm4, %%mm2; " " paddw %%mm5, %%mm2; " " paddw %%mm6, %%mm2; " " movq %%mm4, %%mm5; " /* mm3 = (srcpix * xfrac) >> 16) */ " psraw $15, %%mm5; " " pand %%mm3, %%mm5; " " movq %%mm3, %%mm6; " " psraw $15, %%mm6; " " pand %%mm4, %%mm6; " " pmulhw %%mm4, %%mm3; " " paddw %%mm5, %%mm3; " " paddw %%mm6, %%mm3; " " paddw %%mm1, %%mm2; " " movq %%mm3, %%mm1; " /* accumulator = (srcpix * xfrac) >> 16 */ " movq %%mm7, %%mm5; " " psraw $15, %%mm5; " " pand %%mm2, %%mm5; " " movq %%mm2, %%mm6; " " psraw $15, %%mm6; " " pand %%mm7, %%mm6; " " pmulhw %%mm7, %%mm2; " " paddw %%mm5, %%mm2; " " paddw %%mm6, %%mm2; " " packuswb %%mm0, %%mm2; " " movd %%mm2, (%1); " " add %5, %%ecx; " " add $4, %1; " " subl $0x4000, %%ecx; " "4: " /* tail of inner X-loop */ " decl %%edx; " " jne 2b; " " add %7, %0; " /* srcpix += srcdiff */ " add %8, %1; " /* dstpix += dstdiff */ " decl %3; " " jne 1b; " " emms; " : "+r"(srcpix), "+r"(dstpix) /* outputs */ : "m"(One64), "m"(height), "m"(srcwidth), "m"(xspace), "m"(xrecip), "m"(srcdiff64), "m"(dstdiff64) /* inputs */ : "%ecx","%edx" /* clobbered */ ); } void filter_shrink_X_SSE(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, int dstpitch, int srcwidth, int dstwidth) { int srcdiff = srcpitch - (srcwidth * 4); int dstdiff = dstpitch - (dstwidth * 4); int xspace = 0x04000 * srcwidth / dstwidth; /* must be > 1 */ int xrecip = 0x40000000 / xspace; long long One64 = 0x4000400040004000ULL; long long srcdiff64 = srcdiff; long long dstdiff64 = dstdiff; asm __volatile__(" /* MMX code for X-shrink area average filter */ " " pxor %%mm0, %%mm0; " " movd %6, %%mm7; " /* mm7 == xrecipmmx */ " movq %2, %%mm6; " /* mm6 = 2^14 */ " pshufw $0, %%mm7, %%mm7; " "1: " /* outer Y-loop */ " movl %5, %%ecx; " /* ecx == xcounter */ " pxor %%mm1, %%mm1; " /* mm1 == accumulator */ " movl %4, %%edx; " /* edx == width */ "2: " /* inner X-loop */ " cmpl $0x4000, %%ecx; " " jbe 3f; " " movd (%0), %%mm2; " /* mm2 = srcpix */ " add $4, %0; " " punpcklbw %%mm0, %%mm2; " " paddw %%mm2, %%mm1; " /* accumulator += srcpix */ " subl $0x4000, %%ecx; " " jmp 4f; " "3: " /* prepare to output a pixel */ " movd %%ecx, %%mm2; " " movq %%mm6, %%mm3; " /* mm3 = 2^14 */ " pshufw $0, %%mm2, %%mm2; " " movd (%0), %%mm4; " /* mm4 = srcpix */ " add $4, %0; " " punpcklbw %%mm0, %%mm4; " " psubw %%mm2, %%mm3; " /* mm3 = xfrac */ " psllw $2, %%mm4; " " pmulhuw %%mm4, %%mm2; " /* mm2 = (srcpix * xcounter >> 16) */ " pmulhuw %%mm4, %%mm3; " /* mm3 = (srcpix * xfrac) >> 16 */ " paddw %%mm1, %%mm2; " " movq %%mm3, %%mm1; " /* accumulator = (srcpix * xfrac) >> 16 */ " pmulhuw %%mm7, %%mm2; " " packuswb %%mm0, %%mm2; " " movd %%mm2, (%1); " " add %5, %%ecx; " " add $4, %1; " " subl $0x4000, %%ecx; " "4: " /* tail of inner X-loop */ " decl %%edx; " " jne 2b; " " add %7, %0; " /* srcpix += srcdiff */ " add %8, %1; " /* dstpix += dstdiff */ " decl %3; " " jne 1b; " " emms; " : "+r"(srcpix), "+r"(dstpix) /* outputs */ : "m"(One64), "m"(height), "m"(srcwidth), "m"(xspace), "m"(xrecip), "m"(srcdiff64), "m"(dstdiff64) /* inputs */ : "%ecx","%edx" /* clobbered */ ); } /* These functions implement an area-averaging shrinking filter in the Y-dimension. */ void filter_shrink_Y_MMX(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, int dstpitch, int srcheight, int dstheight) { Uint16 *templine; int srcdiff = srcpitch - (width * 4); int dstdiff = dstpitch - (width * 4); int yspace = 0x4000 * srcheight / dstheight; /* must be > 1 */ int yrecip = 0x40000000 / yspace; long long One64 = 0x4000400040004000ULL; /* allocate and clear a memory area for storing the accumulator line */ templine = (Uint16 *) malloc(dstpitch * 2); if (templine == 0) return; memset(templine, 0, dstpitch * 2); long long srcdiff64 = srcdiff; long long dstdiff64 = dstdiff; asm __volatile__(" /* MMX code for Y-shrink area average filter */ " " movl %5, %%ecx; " /* ecx == ycounter */ " pxor %%mm0, %%mm0; " " movd %6, %%mm7; " /* mm7 == yrecipmmx */ " punpcklwd %%mm7, %%mm7; " " punpckldq %%mm7, %%mm7; " "1: " /* outer Y-loop */ " mov %2, %%rax; " /* rax == accumulate */ " cmpl $0x4000, %%ecx; " " jbe 3f; " " movl %4, %%edx; " /* edx == width */ "2: " " movd (%0), %%mm1; " " add $4, %0; " " movq (%%rax), %%mm2; " " punpcklbw %%mm0, %%mm1; " " paddw %%mm1, %%mm2; " " movq %%mm2, (%%rax); " " add $8, %%rax; " " decl %%edx; " " jne 2b; " " subl $0x4000, %%ecx; " " jmp 6f; " "3: " /* prepare to output a line */ " movd %%ecx, %%mm1; " " movl %4, %%edx; " /* edx = width */ " movq %9, %%mm6; " /* mm6 = 2^14 */ " punpcklwd %%mm1, %%mm1; " " punpckldq %%mm1, %%mm1; " " psubw %%mm1, %%mm6; " /* mm6 = yfrac */ "4: " " movd (%0), %%mm4; " /* mm4 = srcpix */ " add $4, %0; " " punpcklbw %%mm0, %%mm4; " " movq (%%rax), %%mm5; " /* mm5 = accumulate */ " movq %%mm6, %%mm3; " " psllw $2, %%mm4; " " movq %%mm4, %%mm0; " /* mm3 = (srcpix * yfrac) >> 16) */ " psraw $15, %%mm0; " " pand %%mm3, %%mm0; " " movq %%mm3, %%mm2; " " psraw $15, %%mm2; " " pand %%mm4, %%mm2; " " pmulhw %%mm4, %%mm3; " " paddw %%mm0, %%mm3; " " paddw %%mm2, %%mm3; " " movq %%mm1, %%mm0; " /* mm4 = (srcpix * ycounter >> 16) */ " psraw $15, %%mm0; " " pand %%mm4, %%mm0; " " movq %%mm4, %%mm2; " " psraw $15, %%mm2; " " pand %%mm1, %%mm2; " " pmulhw %%mm1, %%mm4; " " paddw %%mm0, %%mm4; " " paddw %%mm2, %%mm4; " " movq %%mm3, (%%rax); " " paddw %%mm5, %%mm4; " " add $8, %%rax; " " movq %%mm7, %%mm0; " " psraw $15, %%mm0; " " pand %%mm4, %%mm0; " " movq %%mm4, %%mm2; " " psraw $15, %%mm2; " " pand %%mm7, %%mm2; " " pmulhw %%mm7, %%mm4; " " paddw %%mm0, %%mm4; " " paddw %%mm2, %%mm4; " " pxor %%mm0, %%mm0; " " packuswb %%mm0, %%mm4; " " movd %%mm4, (%1); " " add $4, %1; " " decl %%edx; " " jne 4b; " " add %8, %1; " /* dstpix += dstdiff */ " addl %5, %%ecx; " " subl $0x4000, %%ecx; " "6: " /* tail of outer Y-loop */ " add %7, %0; " /* srcpix += srcdiff */ " decl %3; " " jne 1b; " " emms; " : "+r"(srcpix), "+r"(dstpix) /* outputs */ : "m"(templine),"m"(srcheight), "m"(width), "m"(yspace), "m"(yrecip), "m"(srcdiff64), "m"(dstdiff64), "m"(One64) /* input */ : "%ecx","%edx","%rax" /* clobbered */ ); /* free the temporary memory */ free(templine); } void filter_shrink_Y_SSE(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, int dstpitch, int srcheight, int dstheight) { Uint16 *templine; int srcdiff = srcpitch - (width * 4); int dstdiff = dstpitch - (width * 4); int yspace = 0x4000 * srcheight / dstheight; /* must be > 1 */ int yrecip = 0x40000000 / yspace; long long One64 = 0x4000400040004000ULL; /* allocate and clear a memory area for storing the accumulator line */ templine = (Uint16 *) malloc(dstpitch * 2); if (templine == 0) return; memset(templine, 0, dstpitch * 2); long long srcdiff64 = srcdiff; long long dstdiff64 = dstdiff; asm __volatile__(" /* MMX code for Y-shrink area average filter */ " " movl %5, %%ecx; " /* ecx == ycounter */ " pxor %%mm0, %%mm0; " " movd %6, %%mm7; " /* mm7 == yrecipmmx */ " pshufw $0, %%mm7, %%mm7; " "1: " /* outer Y-loop */ " mov %2, %%rax; " /* rax == accumulate */ " cmpl $0x4000, %%ecx; " " jbe 3f; " " movl %4, %%edx; " /* edx == width */ "2: " " movd (%0), %%mm1; " " add $4, %0; " " movq (%%rax), %%mm2; " " punpcklbw %%mm0, %%mm1; " " paddw %%mm1, %%mm2; " " movq %%mm2, (%%rax); " " add $8, %%rax; " " decl %%edx; " " jne 2b; " " subl $0x4000, %%ecx; " " jmp 6f; " "3: " /* prepare to output a line */ " movd %%ecx, %%mm1; " " movl %4, %%edx; " /* edx = width */ " movq %9, %%mm6; " /* mm6 = 2^14 */ " pshufw $0, %%mm1, %%mm1; " " psubw %%mm1, %%mm6; " /* mm6 = yfrac */ "4: " " movd (%0), %%mm4; " /* mm4 = srcpix */ " add $4, %0; " " punpcklbw %%mm0, %%mm4; " " movq (%%rax), %%mm5; " /* mm5 = accumulate */ " movq %%mm6, %%mm3; " " psllw $2, %%mm4; " " pmulhuw %%mm4, %%mm3; " /* mm3 = (srcpix * yfrac) >> 16 */ " pmulhuw %%mm1, %%mm4; " /* mm4 = (srcpix * ycounter >> 16) */ " movq %%mm3, (%%rax); " " paddw %%mm5, %%mm4; " " add $8, %%rax; " " pmulhuw %%mm7, %%mm4; " " packuswb %%mm0, %%mm4; " " movd %%mm4, (%1); " " add $4, %1; " " decl %%edx; " " jne 4b; " " add %8, %1; " /* dstpix += dstdiff */ " addl %5, %%ecx; " " subl $0x4000, %%ecx; " "6: " /* tail of outer Y-loop */ " add %7, %0; " /* srcpix += srcdiff */ " decl %3; " " jne 1b; " " emms; " : "+r"(srcpix), "+r"(dstpix) /* outputs */ : "m"(templine),"m"(srcheight), "m"(width), "m"(yspace), "m"(yrecip), "m"(srcdiff64), "m"(dstdiff64), "m"(One64) /* input */ : "%ecx","%edx","%rax" /* clobbered */ ); /* free the temporary memory */ free(templine); } /* These functions implement a bilinear filter in the X-dimension. */ void filter_expand_X_MMX(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, int dstpitch, int srcwidth, int dstwidth) { int *xidx0, *xmult0, *xmult1; int x, y; int factorwidth = 8; /* Allocate memory for factors */ xidx0 = malloc(dstwidth * 4); if (xidx0 == 0) return; xmult0 = (int *) malloc(dstwidth * factorwidth); xmult1 = (int *) malloc(dstwidth * factorwidth); if (xmult0 == 0 || xmult1 == 0) { free(xidx0); if (xmult0) free(xmult0); if (xmult1) free(xmult1); } /* Create multiplier factors and starting indices and put them in arrays */ for (x = 0; x < dstwidth; x++) { int xm1 = 0x100 * ((x * (srcwidth - 1)) % dstwidth) / dstwidth; int xm0 = 0x100 - xm1; xidx0[x] = x * (srcwidth - 1) / dstwidth; xmult1[x*2] = xm1 | (xm1 << 16); xmult1[x*2+1] = xm1 | (xm1 << 16); xmult0[x*2] = xm0 | (xm0 << 16); xmult0[x*2+1] = xm0 | (xm0 << 16); } /* Do the scaling in raster order so we don't trash the cache */ for (y = 0; y < height; y++) { Uint8 *srcrow0 = srcpix + y * srcpitch; Uint8 *dstrow = dstpix + y * dstpitch; int *xm0 = xmult0; int *xm1 = xmult1; int *x0 = xidx0; asm __volatile__( " /* MMX code for inner loop of X bilinear filter */ " " movl %5, %%ecx; " " pxor %%mm0, %%mm0; " "1: " " movsxl (%3), %%rax; " /* get xidx0[x] */ " add $4, %3; " " movq (%0), %%mm1; " /* load mult0 */ " add $8, %0; " " movq (%1), %%mm2; " /* load mult1 */ " add $8, %1; " " movd (%4,%%rax,4), %%mm4; " " movd 4(%4,%%rax,4), %%mm5; " " punpcklbw %%mm0, %%mm4; " " punpcklbw %%mm0, %%mm5; " " pmullw %%mm1, %%mm4; " " pmullw %%mm2, %%mm5; " " paddw %%mm4, %%mm5; " " psrlw $8, %%mm5; " " packuswb %%mm0, %%mm5; " " movd %%mm5, (%2); " " add $4, %2; " " decl %%ecx; " " jne 1b; " " emms; " : "+r"(xm0), "+r"(xm1), "+r"(dstrow), "+r"(x0) /* outputs */ : "r"(srcrow0),"m"(dstwidth) /* input */ : "%ecx","%rax" /* clobbered */ ); } /* free memory */ free(xidx0); free(xmult0); free(xmult1); } void filter_expand_X_SSE(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, int dstpitch, int srcwidth, int dstwidth) { int *xidx0, *xmult0, *xmult1; int x, y; int factorwidth = 8; /* Allocate memory for factors */ xidx0 = malloc(dstwidth * 4); if (xidx0 == 0) return; xmult0 = (int *) malloc(dstwidth * factorwidth); xmult1 = (int *) malloc(dstwidth * factorwidth); if (xmult0 == 0 || xmult1 == 0) { free(xidx0); if (xmult0) free(xmult0); if (xmult1) free(xmult1); } /* Create multiplier factors and starting indices and put them in arrays */ for (x = 0; x < dstwidth; x++) { int xm1 = 0x100 * ((x * (srcwidth - 1)) % dstwidth) / dstwidth; int xm0 = 0x100 - xm1; xidx0[x] = x * (srcwidth - 1) / dstwidth; xmult1[x*2] = xm1 | (xm1 << 16); xmult1[x*2+1] = xm1 | (xm1 << 16); xmult0[x*2] = xm0 | (xm0 << 16); xmult0[x*2+1] = xm0 | (xm0 << 16); } /* Do the scaling in raster order so we don't trash the cache */ for (y = 0; y < height; y++) { Uint8 *srcrow0 = srcpix + y * srcpitch; Uint8 *dstrow = dstpix + y * dstpitch; int *xm0 = xmult0; int *xm1 = xmult1; int *x0 = xidx0; asm __volatile__( " /* MMX code for inner loop of X bilinear filter */ " " movl %5, %%ecx; " " pxor %%mm0, %%mm0; " "1: " " movsxl (%3), %%rax; " /* get xidx0[x] */ " add $4, %3; " " movq (%0), %%mm1; " /* load mult0 */ " add $8, %0; " " movq (%1), %%mm2; " /* load mult1 */ " add $8, %1; " " movd (%4,%%rax,4), %%mm4; " " movd 4(%4,%%rax,4), %%mm5; " " punpcklbw %%mm0, %%mm4; " " punpcklbw %%mm0, %%mm5; " " pmullw %%mm1, %%mm4; " " pmullw %%mm2, %%mm5; " " paddw %%mm4, %%mm5; " " psrlw $8, %%mm5; " " packuswb %%mm0, %%mm5; " " movd %%mm5, (%2); " " add $4, %2; " " decl %%ecx; " " jne 1b; " " emms; " : "+r"(xm0), "+r"(xm1), "+r"(dstrow), "+r"(x0) /* outputs */ : "r"(srcrow0),"m"(dstwidth) /* input */ : "%ecx","%rax" /* clobbered */ ); } /* free memory */ free(xidx0); free(xmult0); free(xmult1); } /* These functions implement a bilinear filter in the Y-dimension */ void filter_expand_Y_MMX(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, int dstpitch, int srcheight, int dstheight) { int y; for (y = 0; y < dstheight; y++) { int yidx0 = y * (srcheight - 1) / dstheight; Uint8 *srcrow0 = srcpix + yidx0 * srcpitch; Uint8 *srcrow1 = srcrow0 + srcpitch; int ymult1 = 0x0100 * ((y * (srcheight - 1)) % dstheight) / dstheight; int ymult0 = 0x0100 - ymult1; Uint8 *dstrow = dstpix + y * dstpitch; asm __volatile__( " /* MMX code for inner loop of Y bilinear filter */ " " movl %5, %%ecx; " " movd %3, %%mm1; " " movd %4, %%mm2; " " pxor %%mm0, %%mm0; " " punpcklwd %%mm1, %%mm1; " " punpckldq %%mm1, %%mm1; " " punpcklwd %%mm2, %%mm2; " " punpckldq %%mm2, %%mm2; " "1: " " movd (%0), %%mm4; " " add $4, %0; " " movd (%1), %%mm5; " " add $4, %1; " " punpcklbw %%mm0, %%mm4; " " punpcklbw %%mm0, %%mm5; " " pmullw %%mm1, %%mm4; " " pmullw %%mm2, %%mm5; " " paddw %%mm4, %%mm5; " " psrlw $8, %%mm5; " " packuswb %%mm0, %%mm5; " " movd %%mm5, (%2); " " add $4, %2; " " decl %%ecx; " " jne 1b; " " emms; " : "+r"(srcrow0), "+r"(srcrow1), "+r"(dstrow) /* outputs */ : "m"(ymult0), "m"(ymult1), "m"(width) /* input */ : "%ecx" /* clobbered */ ); } } void filter_expand_Y_SSE(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, int dstpitch, int srcheight, int dstheight) { int y; for (y = 0; y < dstheight; y++) { int yidx0 = y * (srcheight - 1) / dstheight; Uint8 *srcrow0 = srcpix + yidx0 * srcpitch; Uint8 *srcrow1 = srcrow0 + srcpitch; int ymult1 = 0x0100 * ((y * (srcheight - 1)) % dstheight) / dstheight; int ymult0 = 0x0100 - ymult1; Uint8 *dstrow = dstpix + y * dstpitch; asm __volatile__( " /* MMX code for inner loop of Y bilinear filter */ " " movl %5, %%ecx; " " movd %3, %%mm1; " " movd %4, %%mm2; " " pxor %%mm0, %%mm0; " " pshufw $0, %%mm1, %%mm1; " " pshufw $0, %%mm2, %%mm2; " "1: " " movd (%0), %%mm4; " " add $4, %0; " " movd (%1), %%mm5; " " add $4, %1; " " punpcklbw %%mm0, %%mm4; " " punpcklbw %%mm0, %%mm5; " " pmullw %%mm1, %%mm4; " " pmullw %%mm2, %%mm5; " " paddw %%mm4, %%mm5; " " psrlw $8, %%mm5; " " packuswb %%mm0, %%mm5; " " movd %%mm5, (%2); " " add $4, %2; " " decl %%ecx; " " jne 1b; " " emms; " : "+r"(srcrow0), "+r"(srcrow1), "+r"(dstrow) /* outputs */ : "m"(ymult0), "m"(ymult1), "m"(width) /* input */ : "%ecx" /* clobbered */ ); } } pygame-1.9.1release/src/scale_mmx32.c0000644000175000017500000007635011207055754017334 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners Copyright (C) 2007 Rene Dudfield, Richard Goedeken This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* Pentium 32 bit SSE/MMX smoothscale filter routines * These are written for compilation with GCC only. * * This file should not depend on anything but the C standard library. */ #if !defined(__GNUC__) || !defined(__i386__) || defined(__x86_64__) #error "Pygame build bug: should not be compiling this file!" #endif #include typedef uint8_t Uint8; /* SDL convension */ typedef uint16_t Uint16; /* SDL convension */ #include #include #include "scale.h" /* These functions implement an area-averaging shrinking filter in the X-dimension. */ void filter_shrink_X_MMX(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, int dstpitch, int srcwidth, int dstwidth) { int srcdiff = srcpitch - (srcwidth * 4); int dstdiff = dstpitch - (dstwidth * 4); int xspace = 0x04000 * srcwidth / dstwidth; /* must be > 1 */ int xrecip = 0x40000000 / xspace; long long One64 = 0x4000400040004000ULL; asm __volatile__(" /* MMX code for X-shrink area average filter */ " " pxor %%mm0, %%mm0; " " movd %6, %%mm7; " /* mm7 == xrecipmmx */ " punpcklwd %%mm7, %%mm7; " " punpckldq %%mm7, %%mm7; " "1: " /* outer Y-loop */ " movl %5, %%ecx; " /* ecx == xcounter */ " pxor %%mm1, %%mm1; " /* mm1 == accumulator */ " movl %4, %%edx; " /* edx == width */ "2: " /* inner X-loop */ " cmpl $0x4000, %%ecx; " " jbe 3f; " " movd (%0), %%mm2; " /* mm2 = srcpix */ " add $4, %0; " " punpcklbw %%mm0, %%mm2; " " paddw %%mm2, %%mm1; " /* accumulator += srcpix */ " subl $0x4000, %%ecx; " " jmp 4f; " "3: " /* prepare to output a pixel */ " movd %%ecx, %%mm2; " " movq %2, %%mm3; " /* mm3 = 2^14 */ " punpcklwd %%mm2, %%mm2; " " punpckldq %%mm2, %%mm2; " " movd (%0), %%mm4; " /* mm4 = srcpix */ " add $4, %0; " " punpcklbw %%mm0, %%mm4; " " psubw %%mm2, %%mm3; " /* mm3 = xfrac */ " psllw $2, %%mm4; " " movq %%mm4, %%mm5; " /* mm2 = (srcpix * xcounter >> 16) */ " psraw $15, %%mm5; " " pand %%mm2, %%mm5; " " movq %%mm2, %%mm6; " " psraw $15, %%mm6; " " pand %%mm4, %%mm6; " " pmulhw %%mm4, %%mm2; " " paddw %%mm5, %%mm2; " " paddw %%mm6, %%mm2; " " movq %%mm4, %%mm5; " /* mm3 = (srcpix * xfrac) >> 16) */ " psraw $15, %%mm5; " " pand %%mm3, %%mm5; " " movq %%mm3, %%mm6; " " psraw $15, %%mm6; " " pand %%mm4, %%mm6; " " pmulhw %%mm4, %%mm3; " " paddw %%mm5, %%mm3; " " paddw %%mm6, %%mm3; " " paddw %%mm1, %%mm2; " " movq %%mm3, %%mm1; " /* accumulator = (srcpix * xfrac) >> 16 */ " movq %%mm7, %%mm5; " " psraw $15, %%mm5; " " pand %%mm2, %%mm5; " " movq %%mm2, %%mm6; " " psraw $15, %%mm6; " " pand %%mm7, %%mm6; " " pmulhw %%mm7, %%mm2; " " paddw %%mm5, %%mm2; " " paddw %%mm6, %%mm2; " " packuswb %%mm0, %%mm2; " " movd %%mm2, (%1); " " add %5, %%ecx; " " add $4, %1; " " subl $0x4000, %%ecx; " "4: " /* tail of inner X-loop */ " decl %%edx; " " jne 2b; " " add %7, %0; " /* srcpix += srcdiff */ " add %8, %1; " /* dstpix += dstdiff */ " decl %3; " " jne 1b; " " emms; " : "+r"(srcpix), "+r"(dstpix) /* outputs */ : "m"(One64), "m"(height), "m"(srcwidth), "m"(xspace), "m"(xrecip), "m"(srcdiff), "m"(dstdiff) /* input */ : "%ecx","%edx" /* clobbered */ ); } void filter_shrink_X_SSE(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, int dstpitch, int srcwidth, int dstwidth) { int srcdiff = srcpitch - (srcwidth * 4); int dstdiff = dstpitch - (dstwidth * 4); int xspace = 0x04000 * srcwidth / dstwidth; /* must be > 1 */ int xrecip = 0x40000000 / xspace; long long One64 = 0x4000400040004000ULL; asm __volatile__(" /* MMX code for X-shrink area average filter */ " " pxor %%mm0, %%mm0; " " movd %6, %%mm7; " /* mm7 == xrecipmmx */ " movq %2, %%mm6; " /* mm6 = 2^14 */ " pshufw $0, %%mm7, %%mm7; " "1: " /* outer Y-loop */ " movl %5, %%ecx; " /* ecx == xcounter */ " pxor %%mm1, %%mm1; " /* mm1 == accumulator */ " movl %4, %%edx; " /* edx == width */ "2: " /* inner X-loop */ " cmpl $0x4000, %%ecx; " " jbe 3f; " " movd (%0), %%mm2; " /* mm2 = srcpix */ " add $4, %0; " " punpcklbw %%mm0, %%mm2; " " paddw %%mm2, %%mm1; " /* accumulator += srcpix */ " subl $0x4000, %%ecx; " " jmp 4f; " "3: " /* prepare to output a pixel */ " movd %%ecx, %%mm2; " " movq %%mm6, %%mm3; " /* mm3 = 2^14 */ " pshufw $0, %%mm2, %%mm2; " " movd (%0), %%mm4; " /* mm4 = srcpix */ " add $4, %0; " " punpcklbw %%mm0, %%mm4; " " psubw %%mm2, %%mm3; " /* mm3 = xfrac */ " psllw $2, %%mm4; " " pmulhuw %%mm4, %%mm2; " /* mm2 = (srcpix * xcounter >> 16) */ " pmulhuw %%mm4, %%mm3; " /* mm3 = (srcpix * xfrac) >> 16 */ " paddw %%mm1, %%mm2; " " movq %%mm3, %%mm1; " /* accumulator = (srcpix * xfrac) >> 16 */ " pmulhuw %%mm7, %%mm2; " " packuswb %%mm0, %%mm2; " " movd %%mm2, (%1); " " add %5, %%ecx; " " add $4, %1; " " subl $0x4000, %%ecx; " "4: " /* tail of inner X-loop */ " decl %%edx; " " jne 2b; " " add %7, %0; " /* srcpix += srcdiff */ " add %8, %1; " /* dstpix += dstdiff */ " decl %3; " " jne 1b; " " emms; " : "+r"(srcpix), "+r"(dstpix) /* outputs */ : "m"(One64), "m"(height), "m"(srcwidth), "m"(xspace), "m"(xrecip), "m"(srcdiff), "m"(dstdiff) /* input */ : "%ecx","%edx" /* clobbered */ ); } /* These functions implement an area-averaging shrinking filter in the Y-dimension. */ void filter_shrink_Y_MMX(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, int dstpitch, int srcheight, int dstheight) { Uint16 *templine; int srcdiff = srcpitch - (width * 4); int dstdiff = dstpitch - (width * 4); int yspace = 0x4000 * srcheight / dstheight; /* must be > 1 */ int yrecip = 0x40000000 / yspace; long long One64 = 0x4000400040004000ULL; /* allocate and clear a memory area for storing the accumulator line */ templine = (Uint16 *) malloc(dstpitch * 2); if (templine == 0) return; memset(templine, 0, dstpitch * 2); asm __volatile__(" /* MMX code for Y-shrink area average filter */ " " movl %5, %%ecx; " /* ecx == ycounter */ " pxor %%mm0, %%mm0; " " movd %6, %%mm7; " /* mm7 == yrecipmmx */ " punpcklwd %%mm7, %%mm7; " " punpckldq %%mm7, %%mm7; " "1: " /* outer Y-loop */ " movl %2, %%eax; " /* rax == accumulate */ " cmpl $0x4000, %%ecx; " " jbe 3f; " " movl %4, %%edx; " /* edx == width */ "2: " " movd (%0), %%mm1; " " add $4, %0; " " movq (%%eax), %%mm2; " " punpcklbw %%mm0, %%mm1; " " paddw %%mm1, %%mm2; " " movq %%mm2, (%%eax); " " add $8, %%eax; " " decl %%edx; " " jne 2b; " " subl $0x4000, %%ecx; " " jmp 6f; " "3: " /* prepare to output a line */ " movd %%ecx, %%mm1; " " movl %4, %%edx; " /* edx = width */ " movq %9, %%mm6; " /* mm6 = 2^14 */ " punpcklwd %%mm1, %%mm1; " " punpckldq %%mm1, %%mm1; " " psubw %%mm1, %%mm6; " /* mm6 = yfrac */ "4: " " movd (%0), %%mm4; " /* mm4 = srcpix */ " add $4, %0; " " punpcklbw %%mm0, %%mm4; " " movq (%%eax), %%mm5; " /* mm5 = accumulate */ " movq %%mm6, %%mm3; " " psllw $2, %%mm4; " " movq %%mm4, %%mm0; " /* mm3 = (srcpix * yfrac) >> 16) */ " psraw $15, %%mm0; " " pand %%mm3, %%mm0; " " movq %%mm3, %%mm2; " " psraw $15, %%mm2; " " pand %%mm4, %%mm2; " " pmulhw %%mm4, %%mm3; " " paddw %%mm0, %%mm3; " " paddw %%mm2, %%mm3; " " movq %%mm1, %%mm0; " /* mm4 = (srcpix * ycounter >> 16) */ " psraw $15, %%mm0; " " pand %%mm4, %%mm0; " " movq %%mm4, %%mm2; " " psraw $15, %%mm2; " " pand %%mm1, %%mm2; " " pmulhw %%mm1, %%mm4; " " paddw %%mm0, %%mm4; " " paddw %%mm2, %%mm4; " " movq %%mm3, (%%eax); " " paddw %%mm5, %%mm4; " " add $8, %%eax; " " movq %%mm7, %%mm0; " " psraw $15, %%mm0; " " pand %%mm4, %%mm0; " " movq %%mm4, %%mm2; " " psraw $15, %%mm2; " " pand %%mm7, %%mm2; " " pmulhw %%mm7, %%mm4; " " paddw %%mm0, %%mm4; " " paddw %%mm2, %%mm4; " " pxor %%mm0, %%mm0; " " packuswb %%mm0, %%mm4; " " movd %%mm4, (%1); " " add $4, %1; " " decl %%edx; " " jne 4b; " " add %8, %1; " /* dstpix += dstdiff */ " addl %5, %%ecx; " " subl $0x4000, %%ecx; " "6: " /* tail of outer Y-loop */ " add %7, %0; " /* srcpix += srcdiff */ " decl %3; " " jne 1b; " " emms; " : "+r"(srcpix), "+r"(dstpix) /* outputs */ : "m"(templine), "m"(srcheight), "m"(width), "m"(yspace), "m"(yrecip), "m"(srcdiff), "m"(dstdiff),"m"(One64) /* input */ : "%ecx","%edx","%eax" /* clobbered */ ); /* free the temporary memory */ free(templine); } void filter_shrink_Y_SSE(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, int dstpitch, int srcheight, int dstheight) { Uint16 *templine; int srcdiff = srcpitch - (width * 4); int dstdiff = dstpitch - (width * 4); int yspace = 0x4000 * srcheight / dstheight; /* must be > 1 */ int yrecip = 0x40000000 / yspace; long long One64 = 0x4000400040004000ULL; /* allocate and clear a memory area for storing the accumulator line */ templine = (Uint16 *) malloc(dstpitch * 2); if (templine == 0) return; memset(templine, 0, dstpitch * 2); asm __volatile__(" /* MMX code for Y-shrink area average filter */ " " movl %5, %%ecx; " /* ecx == ycounter */ " pxor %%mm0, %%mm0; " " movd %6, %%mm7; " /* mm7 == yrecipmmx */ " pshufw $0, %%mm7, %%mm7; " "1: " /* outer Y-loop */ " movl %2, %%eax; " /* rax == accumulate */ " cmpl $0x4000, %%ecx; " " jbe 3f; " " movl %4, %%edx; " /* edx == width */ "2: " " movd (%0), %%mm1; " " add $4, %0; " " movq (%%eax), %%mm2; " " punpcklbw %%mm0, %%mm1; " " paddw %%mm1, %%mm2; " " movq %%mm2, (%%eax); " " add $8, %%eax; " " decl %%edx; " " jne 2b; " " subl $0x4000, %%ecx; " " jmp 6f; " "3: " /* prepare to output a line */ " movd %%ecx, %%mm1; " " movl %4, %%edx; " /* edx = width */ " movq %9, %%mm6; " /* mm6 = 2^14 */ " pshufw $0, %%mm1, %%mm1; " " psubw %%mm1, %%mm6; " /* mm6 = yfrac */ "4: " " movd (%0), %%mm4; " /* mm4 = srcpix */ " add $4, %0; " " punpcklbw %%mm0, %%mm4; " " movq (%%eax), %%mm5; " /* mm5 = accumulate */ " movq %%mm6, %%mm3; " " psllw $2, %%mm4; " " pmulhuw %%mm4, %%mm3; " /* mm3 = (srcpix * yfrac) >> 16 */ " pmulhuw %%mm1, %%mm4; " /* mm4 = (srcpix * ycounter >> 16) */ " movq %%mm3, (%%eax); " " paddw %%mm5, %%mm4; " " add $8, %%eax; " " pmulhuw %%mm7, %%mm4; " " packuswb %%mm0, %%mm4; " " movd %%mm4, (%1); " " add $4, %1; " " decl %%edx; " " jne 4b; " " add %8, %1; " /* dstpix += dstdiff */ " addl %5, %%ecx; " " subl $0x4000, %%ecx; " "6: " /* tail of outer Y-loop */ " add %7, %0; " /* srcpix += srcdiff */ " decl %3; " " jne 1b; " " emms; " : "+r"(srcpix), "+r"(dstpix) /* outputs */ : "m"(templine), "m"(srcheight), "m"(width), "m"(yspace), "m"(yrecip), "m"(srcdiff), "m"(dstdiff),"m"(One64) /* input */ : "%ecx","%edx","%eax" /* clobbered */ ); /* free the temporary memory */ free(templine); } /* These functions implement a bilinear filter in the X-dimension. */ void filter_expand_X_MMX(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, int dstpitch, int srcwidth, int dstwidth) { int *xidx0, *xmult0, *xmult1; int x, y; int factorwidth = 8; long long One64 = 0x0100010001000100ULL; /* Allocate memory for factors */ xidx0 = malloc(dstwidth * 4); if (xidx0 == 0) return; xmult0 = (int *) malloc(dstwidth * factorwidth); xmult1 = (int *) malloc(dstwidth * factorwidth); if (xmult0 == 0 || xmult1 == 0) { free(xidx0); if (xmult0) free(xmult0); if (xmult1) free(xmult1); } /* Create multiplier factors and starting indices and put them in arrays */ for (x = 0; x < dstwidth; x++) { int xm1 = 0x100 * ((x * (srcwidth - 1)) % dstwidth) / dstwidth; int xm0 = 0x100 - xm1; xidx0[x] = x * (srcwidth - 1) / dstwidth; xmult1[x*2] = xm1 | (xm1 << 16); xmult1[x*2+1] = xm1 | (xm1 << 16); xmult0[x*2] = xm0 | (xm0 << 16); xmult0[x*2+1] = xm0 | (xm0 << 16); } /* Do the scaling in raster order so we don't trash the cache */ for (y = 0; y < height; y++) { Uint8 *srcrow0 = srcpix + y * srcpitch; Uint8 *dstrow = dstpix + y * dstpitch; int *xm0 = xmult0; int *x0 = xidx0; int width = dstwidth; asm __volatile__( " /* MMX code for inner loop of X bilinear filter */ " " pxor %%mm0, %%mm0; " " movq %5, %%mm7; " "1: " " movl (%2), %%eax; " /* get xidx0[x] */ " add $4, %2; " " movq %%mm7, %%mm2; " " movq (%0), %%mm1; " /* load mult0 */ " add $8, %0; " " psubw %%mm1, %%mm2; " /* load mult1 */ " movd (%4,%%eax,4), %%mm4; " " movd 4(%4,%%eax,4), %%mm5; " " punpcklbw %%mm0, %%mm4; " " punpcklbw %%mm0, %%mm5; " " pmullw %%mm1, %%mm4; " " pmullw %%mm2, %%mm5; " " paddw %%mm4, %%mm5; " " psrlw $8, %%mm5; " " packuswb %%mm0, %%mm5; " " movd %%mm5, (%1); " " add $4, %1; " " decl %3; " " jne 1b; " " emms; " : "+r"(xm0), "+r"(dstrow), "+r"(x0), "+m"(width) /* outputs */ : "S"(srcrow0), "m"(One64) /* input */ : "%eax" /* clobbered */ ); } /* free memory */ free(xidx0); free(xmult0); free(xmult1); } void filter_expand_X_SSE(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, int dstpitch, int srcwidth, int dstwidth) { int *xidx0, *xmult0, *xmult1; int x, y; int factorwidth = 8; long long One64 = 0x0100010001000100ULL; /* Allocate memory for factors */ xidx0 = malloc(dstwidth * 4); if (xidx0 == 0) return; xmult0 = (int *) malloc(dstwidth * factorwidth); xmult1 = (int *) malloc(dstwidth * factorwidth); if (xmult0 == 0 || xmult1 == 0) { free(xidx0); if (xmult0) free(xmult0); if (xmult1) free(xmult1); } /* Create multiplier factors and starting indices and put them in arrays */ for (x = 0; x < dstwidth; x++) { int xm1 = 0x100 * ((x * (srcwidth - 1)) % dstwidth) / dstwidth; int xm0 = 0x100 - xm1; xidx0[x] = x * (srcwidth - 1) / dstwidth; xmult1[x*2] = xm1 | (xm1 << 16); xmult1[x*2+1] = xm1 | (xm1 << 16); xmult0[x*2] = xm0 | (xm0 << 16); xmult0[x*2+1] = xm0 | (xm0 << 16); } /* Do the scaling in raster order so we don't trash the cache */ for (y = 0; y < height; y++) { Uint8 *srcrow0 = srcpix + y * srcpitch; Uint8 *dstrow = dstpix + y * dstpitch; int *xm0 = xmult0; int *x0 = xidx0; int width = dstwidth; asm __volatile__( " /* MMX code for inner loop of X bilinear filter */ " " pxor %%mm0, %%mm0; " " movq %5, %%mm7; " "1: " " movl (%2), %%eax; " /* get xidx0[x] */ " add $4, %2; " " movq %%mm7, %%mm2; " " movq (%0), %%mm1; " /* load mult0 */ " add $8, %0; " " psubw %%mm1, %%mm2; " /* load mult1 */ " movd (%4,%%eax,4), %%mm4; " " movd 4(%4,%%eax,4), %%mm5; " " punpcklbw %%mm0, %%mm4; " " punpcklbw %%mm0, %%mm5; " " pmullw %%mm1, %%mm4; " " pmullw %%mm2, %%mm5; " " paddw %%mm4, %%mm5; " " psrlw $8, %%mm5; " " packuswb %%mm0, %%mm5; " " movd %%mm5, (%1); " " add $4, %1; " " decl %3; " " jne 1b; " " emms; " : "+r"(xm0), "+r"(dstrow), "+r"(x0), "+m"(width) /* outputs */ : "S"(srcrow0), "m"(One64) /* input */ : "%eax" /* clobbered */ ); } /* free memory */ free(xidx0); free(xmult0); free(xmult1); } /* These functions implement a bilinear filter in the Y-dimension. */ void filter_expand_Y_MMX(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, int dstpitch, int srcheight, int dstheight) { int y; for (y = 0; y < dstheight; y++) { int yidx0 = y * (srcheight - 1) / dstheight; Uint8 *srcrow0 = srcpix + yidx0 * srcpitch; Uint8 *srcrow1 = srcrow0 + srcpitch; int ymult1 = 0x0100 * ((y * (srcheight - 1)) % dstheight) / dstheight; int ymult0 = 0x0100 - ymult1; Uint8 *dstrow = dstpix + y * dstpitch; asm __volatile__( " /* MMX code for inner loop of Y bilinear filter */ " " movl %5, %%eax; " " movd %3, %%mm1; " " movd %4, %%mm2; " " pxor %%mm0, %%mm0; " " punpcklwd %%mm1, %%mm1; " " punpckldq %%mm1, %%mm1; " " punpcklwd %%mm2, %%mm2; " " punpckldq %%mm2, %%mm2; " "1: " " movd (%0), %%mm4; " " add $4, %0; " " movd (%1), %%mm5; " " add $4, %1; " " punpcklbw %%mm0, %%mm4; " " punpcklbw %%mm0, %%mm5; " " pmullw %%mm1, %%mm4; " " pmullw %%mm2, %%mm5; " " paddw %%mm4, %%mm5; " " psrlw $8, %%mm5; " " packuswb %%mm0, %%mm5; " " movd %%mm5, (%2); " " add $4, %2; " " decl %%eax; " " jne 1b; " " emms; " : "+r"(srcrow0), "+r"(srcrow1),"+r"(dstrow) /* no outputs */ : "m"(ymult0), "m"(ymult1), "m"(width) /* input */ : "%eax" /* clobbered */ ); } } void filter_expand_Y_SSE(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, int dstpitch, int srcheight, int dstheight) { int y; for (y = 0; y < dstheight; y++) { int yidx0 = y * (srcheight - 1) / dstheight; Uint8 *srcrow0 = srcpix + yidx0 * srcpitch; Uint8 *srcrow1 = srcrow0 + srcpitch; int ymult1 = 0x0100 * ((y * (srcheight - 1)) % dstheight) / dstheight; int ymult0 = 0x0100 - ymult1; Uint8 *dstrow = dstpix + y * dstpitch; asm __volatile__( " /* MMX code for inner loop of Y bilinear filter */ " " movl %5, %%eax; " " movd %3, %%mm1; " " movd %4, %%mm2; " " pxor %%mm0, %%mm0; " " pshufw $0, %%mm1, %%mm1; " " pshufw $0, %%mm2, %%mm2; " "1: " " movd (%0), %%mm4; " " add $4, %0; " " movd (%1), %%mm5; " " add $4, %1; " " punpcklbw %%mm0, %%mm4; " " punpcklbw %%mm0, %%mm5; " " pmullw %%mm1, %%mm4; " " pmullw %%mm2, %%mm5; " " paddw %%mm4, %%mm5; " " psrlw $8, %%mm5; " " packuswb %%mm0, %%mm5; " " movd %%mm5, (%2); " " add $4, %2; " " decl %%eax; " " jne 1b; " " emms; " : "+r"(srcrow0), "+r"(srcrow1),"+r"(dstrow) /* no outputs */ : "m"(ymult0), "m"(ymult1), "m"(width) /* input */ : "%eax" /* clobbered */ ); } } pygame-1.9.1release/src/scale_mmx.c0000644000175000017500000000247611207055754017165 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners Copyright (C) 2007 Rene Dudfield, Richard Goedeken This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* Pentium MMX/SSE smoothscale routines * These are only compiled with GCC. */ #if defined(__GNUC__) /* Choose between the 32 bit and 64 bit versions. * Including source code like this may be frowned upon by some, * but the alternative is ungainly conditionally compiled code. */ # if defined(__x86_64__) # include "scale_mmx64.c" # elif defined(__i386__) # include "scale_mmx32.c" # endif #endif pygame-1.9.1release/src/scale2x.c0000644000175000017500000001347411207055754016556 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* This implements the AdvanceMAME Scale2x feature found on this page, http://advancemame.sourceforge.net/scale2x.html It is an incredibly simple and powerful image doubling routine that does an astonishing job of doubling game graphic data while interpolating out the jaggies. Congrats to the AdvanceMAME team, I'm very impressed and surprised with this code! */ #include #define MAX(a,b) (((a) > (b)) ? (a) : (b)) #define MIN(a,b) (((a) < (b)) ? (a) : (b)) #define READINT24(x) ((x)[0]<<16 | (x)[1]<<8 | (x)[2]) #define WRITEINT24(x, i) {(x)[0]=i>>16; (x)[1]=(i>>8)&0xff; x[2]=i&0xff; } /* this requires a destination surface already setup to be twice as large as the source. oh, and formats must match too. this will just blindly assume you didn't flounder. */ void scale2x(SDL_Surface *src, SDL_Surface *dst) { int looph, loopw; Uint8* srcpix = (Uint8*)src->pixels; Uint8* dstpix = (Uint8*)dst->pixels; const int srcpitch = src->pitch; const int dstpitch = dst->pitch; const int width = src->w; const int height = src->h; switch(src->format->BytesPerPixel) { case 1: { Uint8 E0, E1, E2, E3, B, D, E, F, H; for(looph = 0; looph < height; ++looph) { for(loopw = 0; loopw < width; ++ loopw) { B = *(Uint8*)(srcpix + (MAX(0,looph-1)*srcpitch) + (1*loopw)); D = *(Uint8*)(srcpix + (looph*srcpitch) + (1*MAX(0,loopw-1))); E = *(Uint8*)(srcpix + (looph*srcpitch) + (1*loopw)); F = *(Uint8*)(srcpix + (looph*srcpitch) + (1*MIN(width-1,loopw+1))); H = *(Uint8*)(srcpix + (MIN(height-1,looph+1)*srcpitch) + (1*loopw)); E0 = D == B && B != F && D != H ? D : E; E1 = B == F && B != D && F != H ? F : E; E2 = D == H && D != B && H != F ? D : E; E3 = H == F && D != H && B != F ? F : E; *(Uint8*)(dstpix + looph*2*dstpitch + loopw*2*1) = E0; *(Uint8*)(dstpix + looph*2*dstpitch + (loopw*2+1)*1) = E1; *(Uint8*)(dstpix + (looph*2+1)*dstpitch + loopw*2*1) = E2; *(Uint8*)(dstpix + (looph*2+1)*dstpitch + (loopw*2+1)*1) = E3; } }break;} case 2: { Uint16 E0, E1, E2, E3, B, D, E, F, H; for(looph = 0; looph < height; ++looph) { for(loopw = 0; loopw < width; ++ loopw) { B = *(Uint16*)(srcpix + (MAX(0,looph-1)*srcpitch) + (2*loopw)); D = *(Uint16*)(srcpix + (looph*srcpitch) + (2*MAX(0,loopw-1))); E = *(Uint16*)(srcpix + (looph*srcpitch) + (2*loopw)); F = *(Uint16*)(srcpix + (looph*srcpitch) + (2*MIN(width-1,loopw+1))); H = *(Uint16*)(srcpix + (MIN(height-1,looph+1)*srcpitch) + (2*loopw)); E0 = D == B && B != F && D != H ? D : E; E1 = B == F && B != D && F != H ? F : E; E2 = D == H && D != B && H != F ? D : E; E3 = H == F && D != H && B != F ? F : E; *(Uint16*)(dstpix + looph*2*dstpitch + loopw*2*2) = E0; *(Uint16*)(dstpix + looph*2*dstpitch + (loopw*2+1)*2) = E1; *(Uint16*)(dstpix + (looph*2+1)*dstpitch + loopw*2*2) = E2; *(Uint16*)(dstpix + (looph*2+1)*dstpitch + (loopw*2+1)*2) = E3; } }break;} case 3: { int E0, E1, E2, E3, B, D, E, F, H; for(looph = 0; looph < height; ++looph) { for(loopw = 0; loopw < width; ++ loopw) { B = READINT24(srcpix + (MAX(0,looph-1)*srcpitch) + (3*loopw)); D = READINT24(srcpix + (looph*srcpitch) + (3*MAX(0,loopw-1))); E = READINT24(srcpix + (looph*srcpitch) + (3*loopw)); F = READINT24(srcpix + (looph*srcpitch) + (3*MIN(width-1,loopw+1))); H = READINT24(srcpix + (MIN(height-1,looph+1)*srcpitch) + (3*loopw)); E0 = D == B && B != F && D != H ? D : E; E1 = B == F && B != D && F != H ? F : E; E2 = D == H && D != B && H != F ? D : E; E3 = H == F && D != H && B != F ? F : E; WRITEINT24((dstpix + looph*2*dstpitch + loopw*2*3), E0); WRITEINT24((dstpix + looph*2*dstpitch + (loopw*2+1)*3), E1); WRITEINT24((dstpix + (looph*2+1)*dstpitch + loopw*2*3), E2); WRITEINT24((dstpix + (looph*2+1)*dstpitch + (loopw*2+1)*3), E3); } }break;} default: { /*case 4:*/ Uint32 E0, E1, E2, E3, B, D, E, F, H; for(looph = 0; looph < height; ++looph) { for(loopw = 0; loopw < width; ++ loopw) { B = *(Uint32*)(srcpix + (MAX(0,looph-1)*srcpitch) + (4*loopw)); D = *(Uint32*)(srcpix + (looph*srcpitch) + (4*MAX(0,loopw-1))); E = *(Uint32*)(srcpix + (looph*srcpitch) + (4*loopw)); F = *(Uint32*)(srcpix + (looph*srcpitch) + (4*MIN(width-1,loopw+1))); H = *(Uint32*)(srcpix + (MIN(height-1,looph+1)*srcpitch) + (4*loopw)); E0 = D == B && B != F && D != H ? D : E; E1 = B == F && B != D && F != H ? F : E; E2 = D == H && D != B && H != F ? D : E; E3 = H == F && D != H && B != F ? F : E; *(Uint32*)(dstpix + looph*2*dstpitch + loopw*2*4) = E0; *(Uint32*)(dstpix + looph*2*dstpitch + (loopw*2+1)*4) = E1; *(Uint32*)(dstpix + (looph*2+1)*dstpitch + loopw*2*4) = E2; *(Uint32*)(dstpix + (looph*2+1)*dstpitch + (loopw*2+1)*4) = E3; } }break;} } } pygame-1.9.1release/src/scale.h0000644000175000017500000000523511223035224016271 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners Copyright (C) 2007 Rene Dudfield, Richard Goedeken This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* Pentium MMX/SSE smoothscale routines * Available on Win32 or GCC on a Pentium. * Sorry, no Win64 support yet for Visual C builds, but it can be added. */ #if !defined(SCALE_HEADER) #define SCALE_HEADER #if (defined(__GNUC__) && ((defined(__x86_64__) && !defined(_NO_MMX_FOR_X86_64)) || defined(__i386__))) || defined(MS_WIN32) #define SCALE_MMX_SUPPORT /* These functions implement an area-averaging shrinking filter in the X-dimension. */ void filter_shrink_X_MMX(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, int dstpitch, int srcwidth, int dstwidth); void filter_shrink_X_SSE(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, int dstpitch, int srcwidth, int dstwidth); /* These functions implement an area-averaging shrinking filter in the Y-dimension. */ void filter_shrink_Y_MMX(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, int dstpitch, int srcheight, int dstheight); void filter_shrink_Y_SSE(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, int dstpitch, int srcheight, int dstheight); /* These functions implement a bilinear filter in the X-dimension. */ void filter_expand_X_MMX(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, int dstpitch, int srcwidth, int dstwidth); void filter_expand_X_SSE(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, int dstpitch, int srcwidth, int dstwidth); /* These functions implement a bilinear filter in the Y-dimension. */ void filter_expand_Y_MMX(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, int dstpitch, int srcheight, int dstheight); void filter_expand_Y_SSE(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, int dstpitch, int srcheight, int dstheight); #endif /* #if (defined(__GNUC__) && .....) */ #endif /* #if !defined(SCALE_HEADER) */ pygame-1.9.1release/src/rwobject.c0000644000175000017500000003153311207055754017030 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* * SDL_RWops support for python objects */ #define NO_PYGAME_C_API #define PYGAMEAPI_RWOBJECT_INTERNAL #include "pygame.h" #include "pgcompat.h" typedef struct { PyObject* read; PyObject* write; PyObject* seek; PyObject* tell; PyObject* close; #ifdef WITH_THREAD PyThreadState* thread; #endif } RWHelper; static int rw_seek (SDL_RWops* context, int offset, int whence); static int rw_read (SDL_RWops* context, void* ptr, int size, int maxnum); static int rw_write (SDL_RWops* context, const void* ptr, int size, int maxnum); static int rw_close (SDL_RWops* context); #ifdef WITH_THREAD static int rw_seek_th (SDL_RWops* context, int offset, int whence); static int rw_read_th (SDL_RWops* context, void* ptr, int size, int maxnum); static int rw_write_th (SDL_RWops* context, const void* ptr, int size, int maxnum); static int rw_close_th (SDL_RWops* context); #endif static SDL_RWops* get_standard_rwop (PyObject* obj) { #if PY3 if (PyUnicode_Check (obj)) { int result; char* name; PyObject* tuple = PyTuple_New (1); if (!tuple) { return NULL; } Py_INCREF (obj); PyTuple_SET_ITEM (tuple, 0, obj); result = PyArg_ParseTuple (tuple, "s", &name); Py_DECREF (tuple); if (!result) return NULL; return SDL_RWFromFile (name, "rb"); } else if (PyBytes_Check (obj)) { int result; char* name; PyObject* tuple = PyTuple_New (1); if (!tuple) return NULL; Py_INCREF (obj); PyTuple_SET_ITEM (tuple, 0, obj); result = PyArg_ParseTuple (tuple, "y", &name); Py_DECREF (tuple); if (!result) return NULL; return SDL_RWFromFile (name, "rb"); } #else if (PyString_Check (obj) || PyUnicode_Check (obj)) { int result; char* name; PyObject* tuple = PyTuple_New (1); if (!tuple) return NULL; Py_INCREF (obj); PyTuple_SET_ITEM (tuple, 0, obj); result = PyArg_ParseTuple (tuple, "s", &name); Py_DECREF (tuple); if (!result) return NULL; return SDL_RWFromFile (name, "rb"); } else if (PyFile_Check(obj)) return SDL_RWFromFP (PyFile_AsFile (obj), 0); #endif return NULL; } static void fetch_object_methods (RWHelper* helper, PyObject* obj) { helper->read = helper->write = helper->seek = helper->tell = helper->close = NULL; if (PyObject_HasAttrString (obj, "read")) { helper->read = PyObject_GetAttrString (obj, "read"); if(helper->read && !PyCallable_Check (helper->read)) { Py_DECREF (helper->read); helper->read = NULL; } } if (PyObject_HasAttrString (obj, "write")) { helper->write = PyObject_GetAttrString (obj, "write"); if (helper->write && !PyCallable_Check (helper->write)) { Py_DECREF (helper->write); helper->write = NULL; } } if (PyObject_HasAttrString (obj, "seek")) { helper->seek = PyObject_GetAttrString (obj, "seek"); if (helper->seek && !PyCallable_Check (helper->seek)) { Py_DECREF (helper->seek); helper->seek = NULL; } } if (PyObject_HasAttrString (obj, "tell")) { helper->tell = PyObject_GetAttrString (obj, "tell"); if (helper->tell && !PyCallable_Check (helper->tell)) { Py_DECREF (helper->tell); helper->tell = NULL; } } if(PyObject_HasAttrString(obj, "close")) { helper->close = PyObject_GetAttrString (obj, "close"); if (helper->close && !PyCallable_Check (helper->close)) { Py_DECREF (helper->close); helper->close = NULL; } } } static SDL_RWops* RWopsFromPython (PyObject* obj) { SDL_RWops* rw; RWHelper* helper; if (!obj) return (SDL_RWops*) RAISE (PyExc_TypeError, "Invalid filetype object"); rw = get_standard_rwop (obj); if (rw) return rw; helper = PyMem_New (RWHelper, 1); fetch_object_methods (helper, obj); rw = SDL_AllocRW (); rw->hidden.unknown.data1 = (void*) helper; rw->seek = rw_seek; rw->read = rw_read; rw->write = rw_write; rw->close = rw_close; return rw; } static int RWopsCheckPython (SDL_RWops* rw) { return rw->close == rw_close; } static int rw_seek (SDL_RWops* context, int offset, int whence) { RWHelper* helper = (RWHelper*) context->hidden.unknown.data1; PyObject* result; int retval; if (!helper->seek || !helper->tell) return -1; if (!(offset == 0 && whence == SEEK_CUR)) /*being called only for 'tell'*/ { result = PyObject_CallFunction (helper->seek, "ii", offset, whence); if (!result) return -1; Py_DECREF (result); } result = PyObject_CallFunction (helper->tell, NULL); if (!result) return -1; retval = PyInt_AsLong (result); Py_DECREF (result); return retval; } static int rw_read (SDL_RWops* context, void* ptr, int size, int maxnum) { RWHelper* helper = (RWHelper*) context->hidden.unknown.data1; PyObject* result; int retval; if (!helper->read) return -1; result = PyObject_CallFunction (helper->read, "i", size * maxnum); if (!result) return -1; if (!Bytes_Check (result)) { Py_DECREF (result); return -1; } retval = Bytes_GET_SIZE (result); memcpy (ptr, Bytes_AsString (result), retval); retval /= size; Py_DECREF (result); return retval; } static int rw_write (SDL_RWops* context, const void* ptr, int size, int num) { RWHelper* helper = (RWHelper*) context->hidden.unknown.data1; PyObject* result; if (!helper->write) return -1; result = PyObject_CallFunction (helper->write, "s#", ptr, size * num); if(!result) return -1; Py_DECREF (result); return num; } static int rw_close (SDL_RWops* context) { RWHelper* helper = (RWHelper*) context->hidden.unknown.data1; PyObject* result; int retval = 0; if (helper->close) { result = PyObject_CallFunction (helper->close, NULL); if (result) retval = -1; Py_XDECREF (result); } Py_XDECREF (helper->seek); Py_XDECREF (helper->tell); Py_XDECREF (helper->write); Py_XDECREF (helper->read); Py_XDECREF (helper->close); PyMem_Del (helper); SDL_FreeRW (context); return retval; } static SDL_RWops* RWopsFromPythonThreaded (PyObject* obj) { SDL_RWops* rw; RWHelper* helper; PyInterpreterState* interp; PyThreadState* thread; if (!obj) return (SDL_RWops*) RAISE (PyExc_TypeError, "Invalid filetype object"); #ifndef WITH_THREAD return (SDL_RWops*) RAISE (PyExc_NotImplementedError, "Python built without thread support"); #else helper = PyMem_New (RWHelper, 1); fetch_object_methods (helper, obj); rw = SDL_AllocRW (); rw->hidden.unknown.data1 = (void*) helper; rw->seek = rw_seek_th; rw->read = rw_read_th; rw->write = rw_write_th; rw->close = rw_close_th; PyEval_InitThreads (); thread = PyThreadState_Get (); interp = thread->interp; helper->thread = PyThreadState_New (interp); return rw; #endif } static int RWopsCheckPythonThreaded (SDL_RWops* rw) { #ifdef WITH_THREAD return rw->close == rw_close_th; #else return 0; #endif } #ifdef WITH_THREAD static int rw_seek_th (SDL_RWops* context, int offset, int whence) { RWHelper* helper = (RWHelper*) context->hidden.unknown.data1; PyObject* result; int retval; PyThreadState* oldstate; if (!helper->seek || !helper->tell) return -1; PyEval_AcquireLock (); oldstate = PyThreadState_Swap (helper->thread); if (!(offset == 0 && whence == SEEK_CUR)) /* being seek'd, not just tell'd */ { result = PyObject_CallFunction (helper->seek, "ii", offset, whence); if(!result) { PyErr_Print(); retval = -1; goto end; } Py_DECREF (result); } result = PyObject_CallFunction (helper->tell, NULL); if (!result) { PyErr_Print(); retval = -1; goto end; } retval = PyInt_AsLong (result); Py_DECREF (result); end: PyThreadState_Swap (oldstate); PyEval_ReleaseLock (); return retval; } static int rw_read_th (SDL_RWops* context, void* ptr, int size, int maxnum) { RWHelper* helper = (RWHelper*) context->hidden.unknown.data1; PyObject* result; int retval; PyThreadState* oldstate; if (!helper->read) return -1; PyEval_AcquireLock (); oldstate = PyThreadState_Swap (helper->thread); result = PyObject_CallFunction (helper->read, "i", size * maxnum); if (!result) { PyErr_Print(); retval = -1; goto end; } if (!Bytes_Check (result)) { Py_DECREF (result); PyErr_Print(); retval = -1; goto end; } retval = Bytes_GET_SIZE (result); memcpy (ptr, Bytes_AsString (result), retval); retval /= size; Py_DECREF (result); end: PyThreadState_Swap (oldstate); PyEval_ReleaseLock (); return retval; } static int rw_write_th (SDL_RWops* context, const void* ptr, int size, int num) { RWHelper* helper = (RWHelper*) context->hidden.unknown.data1; PyObject* result; int retval; PyThreadState* oldstate; if (!helper->write) return -1; PyEval_AcquireLock (); oldstate = PyThreadState_Swap (helper->thread); result = PyObject_CallFunction (helper->write, "s#", ptr, size * num); if (!result) { PyErr_Print(); retval = -1; goto end; } Py_DECREF (result); retval = num; end: PyThreadState_Swap (oldstate); PyEval_ReleaseLock (); return retval; } static int rw_close_th (SDL_RWops* context) { RWHelper* helper = (RWHelper*) context->hidden.unknown.data1; PyObject* result; int retval = 0; PyThreadState* oldstate; PyEval_AcquireLock (); oldstate = PyThreadState_Swap (helper->thread); if (helper->close) { result = PyObject_CallFunction (helper->close, NULL); if (!result) { PyErr_Print(); retval = -1; } Py_XDECREF (result); } Py_XDECREF (helper->seek); Py_XDECREF (helper->tell); Py_XDECREF (helper->write); Py_XDECREF (helper->read); Py_XDECREF (helper->close); PyThreadState_Swap (oldstate); PyThreadState_Clear (helper->thread); PyThreadState_Delete (helper->thread); PyMem_Del (helper); PyEval_ReleaseLock (); SDL_FreeRW (context); return retval; } #endif static PyMethodDef _rwobject_methods[] = { { NULL, NULL } }; /*DOC*/ static char _rwobject_doc[] = /*DOC*/ "SDL_RWops support"; MODINIT_DEFINE (rwobject) { PyObject *module, *dict, *apiobj; int ecode; static void* c_api[PYGAMEAPI_RWOBJECT_NUMSLOTS]; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "rwobject", _rwobject_doc, -1, _rwobject_methods, NULL, NULL, NULL, NULL }; #endif /* Create the module and add the functions */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "rwobject", _rwobject_methods, _rwobject_doc); #endif if (module == NULL) { MODINIT_ERROR; } dict = PyModule_GetDict (module); /* export the c api */ c_api[0] = RWopsFromPython; c_api[1] = RWopsCheckPython; c_api[2] = RWopsFromPythonThreaded; c_api[3] = RWopsCheckPythonThreaded; apiobj = PyCObject_FromVoidPtr (c_api, NULL); if (apiobj == NULL) { DECREF_MOD (module); MODINIT_ERROR; } ecode = PyDict_SetItemString (dict, PYGAMEAPI_LOCAL_ENTRY, apiobj); Py_DECREF (apiobj); if (ecode == -1) { DECREF_MOD (module); MODINIT_ERROR; } MODINIT_RETURN (module); } pygame-1.9.1release/src/rotozoom.c0000644000175000017500000003567211207055754017111 0ustar vincentvincent/* SDL_rotozoom.c - rotozoomer for 32bit or 8bit surfaces LGPL (c) A. Schiffler This is a trimmed down version of SDL_rotozoom, from the SDL_gfx library. This source is from version 2.0.3. What's left is only what's needed for the rotozoom function. */ #define NO_PYGAME_C_API #include "pygame.h" #include "math.h" typedef struct tColorRGBA { Uint8 r; Uint8 g; Uint8 b; Uint8 a; } tColorRGBA; #define VALUE_LIMIT 0.001 #ifndef MAX #define MAX(a,b) (((a) > (b)) ? (a) : (b)) #endif #ifndef M_PI #define M_PI 3.141592654 #endif /* 32bit Zoomer with optional anti-aliasing by bilinear interpolation. Zoomes 32bit RGBA/ABGR 'src' surface to 'dst' surface. */ int zoomSurfaceRGBA(SDL_Surface * src, SDL_Surface * dst, int smooth) { int x, y, sx, sy, *sax, *say, *csax, *csay, csx, csy, ex, ey, t1, t2, sstep; tColorRGBA *c00, *c01, *c10, *c11; tColorRGBA *sp, *csp, *dp; int sgap, dgap; /* * Variable setup */ if (smooth) { /* * For interpolation: assume source dimension is one pixel */ /* * smaller to avoid overflow on right and bottom edge. */ sx = (int) (65536.0 * (float) (src->w - 1) / (float) dst->w); sy = (int) (65536.0 * (float) (src->h - 1) / (float) dst->h); } else { sx = (int) (65536.0 * (float) src->w / (float) dst->w); sy = (int) (65536.0 * (float) src->h / (float) dst->h); } /* * Allocate memory for row increments */ if ((sax = (int *) malloc((dst->w + 1) * sizeof(Uint32))) == NULL) { return (-1); } if ((say = (int *) malloc((dst->h + 1) * sizeof(Uint32))) == NULL) { free(sax); return (-1); } /* * Precalculate row increments */ csx = 0; csax = sax; for (x = 0; x <= dst->w; x++) { *csax = csx; csax++; csx &= 0xffff; csx += sx; } csy = 0; csay = say; for (y = 0; y <= dst->h; y++) { *csay = csy; csay++; csy &= 0xffff; csy += sy; } /* * Pointer setup */ sp = csp = (tColorRGBA *) src->pixels; dp = (tColorRGBA *) dst->pixels; sgap = src->pitch - src->w * 4; dgap = dst->pitch - dst->w * 4; /* * Switch between interpolating and non-interpolating code */ if (smooth) { /* * Interpolating Zoom */ /* * Scan destination */ csay = say; for (y = 0; y < dst->h; y++) { /* * Setup color source pointers */ c00 = csp; c01 = csp; c01++; c10 = (tColorRGBA *) ((Uint8 *) csp + src->pitch); c11 = c10; c11++; csax = sax; for (x = 0; x < dst->w; x++) { /* * Interpolate colors */ ex = (*csax & 0xffff); ey = (*csay & 0xffff); t1 = ((((c01->r - c00->r) * ex) >> 16) + c00->r) & 0xff; t2 = ((((c11->r - c10->r) * ex) >> 16) + c10->r) & 0xff; dp->r = (((t2 - t1) * ey) >> 16) + t1; t1 = ((((c01->g - c00->g) * ex) >> 16) + c00->g) & 0xff; t2 = ((((c11->g - c10->g) * ex) >> 16) + c10->g) & 0xff; dp->g = (((t2 - t1) * ey) >> 16) + t1; t1 = ((((c01->b - c00->b) * ex) >> 16) + c00->b) & 0xff; t2 = ((((c11->b - c10->b) * ex) >> 16) + c10->b) & 0xff; dp->b = (((t2 - t1) * ey) >> 16) + t1; t1 = ((((c01->a - c00->a) * ex) >> 16) + c00->a) & 0xff; t2 = ((((c11->a - c10->a) * ex) >> 16) + c10->a) & 0xff; dp->a = (((t2 - t1) * ey) >> 16) + t1; /* * Advance source pointers */ csax++; sstep = (*csax >> 16); c00 += sstep; c01 += sstep; c10 += sstep; c11 += sstep; /* * Advance destination pointer */ dp++; } /* * Advance source pointer */ csay++; csp = (tColorRGBA *) ((Uint8 *) csp + (*csay >> 16) * src->pitch); /* * Advance destination pointers */ dp = (tColorRGBA *) ((Uint8 *) dp + dgap); } } else { /* * Non-Interpolating Zoom */ csay = say; for (y = 0; y < dst->h; y++) { sp = csp; csax = sax; for (x = 0; x < dst->w; x++) { /* * Draw */ *dp = *sp; /* * Advance source pointers */ csax++; sp += (*csax >> 16); /* * Advance destination pointer */ dp++; } /* * Advance source pointer */ csay++; csp = (tColorRGBA *) ((Uint8 *) csp + (*csay >> 16) * src->pitch); /* * Advance destination pointers */ dp = (tColorRGBA *) ((Uint8 *) dp + dgap); } } /* * Remove temp arrays */ free(sax); free(say); return (0); } /* 32bit Rotozoomer with optional anti-aliasing by bilinear interpolation. Rotates and zoomes 32bit RGBA/ABGR 'src' surface to 'dst' surface. */ void transformSurfaceRGBA(SDL_Surface * src, SDL_Surface * dst, int cx, int cy, int isin, int icos, int smooth) { int x, y, t1, t2, dx, dy, xd, yd, sdx, sdy, ax, ay, ex, ey, sw, sh; tColorRGBA c00, c01, c10, c11; tColorRGBA *pc, *sp; int gap; /* * Variable setup */ xd = ((src->w - dst->w) << 15); yd = ((src->h - dst->h) << 15); ax = (cx << 16) - (icos * cx); ay = (cy << 16) - (isin * cx); sw = src->w - 1; sh = src->h - 1; pc = dst->pixels; gap = dst->pitch - dst->w * 4; /* * Switch between interpolating and non-interpolating code */ if (smooth) { for (y = 0; y < dst->h; y++) { dy = cy - y; sdx = (ax + (isin * dy)) + xd; sdy = (ay - (icos * dy)) + yd; for (x = 0; x < dst->w; x++) { dx = (sdx >> 16); dy = (sdy >> 16); if ((dx >= -1) && (dy >= -1) && (dx < src->w) && (dy < src->h)) { if ((dx >= 0) && (dy >= 0) && (dx < sw) && (dy < sh)) { sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy); sp += dx; c00 = *sp; sp += 1; c01 = *sp; sp = (tColorRGBA *) ((Uint8 *) sp + src->pitch); sp -= 1; c10 = *sp; sp += 1; c11 = *sp; } else if ((dx == sw) && (dy == sh)) { sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy); sp += dx; c00 = *sp; c01 = *sp; c10 = *sp; c11 = *sp; } else if ((dx == -1) && (dy == -1)) { sp = (tColorRGBA *) (src->pixels); c00 = *sp; c01 = *sp; c10 = *sp; c11 = *sp; } else if ((dx == -1) && (dy == sh)) { sp = (tColorRGBA *) (src->pixels); sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy); c00 = *sp; c01 = *sp; c10 = *sp; c11 = *sp; } else if ((dx == sw) && (dy == -1)) { sp = (tColorRGBA *) (src->pixels); sp += dx; c00 = *sp; c01 = *sp; c10 = *sp; c11 = *sp; } else if (dx == -1) { sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy); c00 = *sp; c01 = *sp; c10 = *sp; sp = (tColorRGBA *) ((Uint8 *) sp + src->pitch); c11 = *sp; } else if (dy == -1) { sp = (tColorRGBA *) (src->pixels); sp += dx; c00 = *sp; c01 = *sp; c10 = *sp; sp += 1; c11 = *sp; } else if (dx == sw) { sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy); sp += dx; c00 = *sp; c01 = *sp; sp = (tColorRGBA *) ((Uint8 *) sp + src->pitch); c10 = *sp; c11 = *sp; } else if (dy == sh) { sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy); sp += dx; c00 = *sp; sp += 1; c01 = *sp; c10 = *sp; c11 = *sp; } else { // NOTE: a catchall to appease gcc4 warnings... // Probably should not get here. we'll see. // old behaviour would be to use the previous pixel, from the previous loop. sp = (tColorRGBA *) (src->pixels); c00 = *sp; c01 = *sp; c10 = *sp; c11 = *sp; } /* * Interpolate colors */ ex = (sdx & 0xffff); ey = (sdy & 0xffff); t1 = ((((c01.r - c00.r) * ex) >> 16) + c00.r) & 0xff; t2 = ((((c11.r - c10.r) * ex) >> 16) + c10.r) & 0xff; pc->r = (((t2 - t1) * ey) >> 16) + t1; t1 = ((((c01.g - c00.g) * ex) >> 16) + c00.g) & 0xff; t2 = ((((c11.g - c10.g) * ex) >> 16) + c10.g) & 0xff; pc->g = (((t2 - t1) * ey) >> 16) + t1; t1 = ((((c01.b - c00.b) * ex) >> 16) + c00.b) & 0xff; t2 = ((((c11.b - c10.b) * ex) >> 16) + c10.b) & 0xff; pc->b = (((t2 - t1) * ey) >> 16) + t1; t1 = ((((c01.a - c00.a) * ex) >> 16) + c00.a) & 0xff; t2 = ((((c11.a - c10.a) * ex) >> 16) + c10.a) & 0xff; pc->a = (((t2 - t1) * ey) >> 16) + t1; } sdx += icos; sdy += isin; pc++; } pc = (tColorRGBA *) ((Uint8 *) pc + gap); } } else { for (y = 0; y < dst->h; y++) { dy = cy - y; sdx = (ax + (isin * dy)) + xd; sdy = (ay - (icos * dy)) + yd; for (x = 0; x < dst->w; x++) { dx = (short) (sdx >> 16); dy = (short) (sdy >> 16); if ((dx >= 0) && (dy >= 0) && (dx < src->w) && (dy < src->h)) { sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy); sp += dx; *pc = *sp; } sdx += icos; sdy += isin; pc++; } pc = (tColorRGBA *) ((Uint8 *) pc + gap); } } } /* rotozoomSurface() Rotates and zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface. 'angle' is the rotation in degrees. 'zoom' a scaling factor. If 'smooth' is 1 then the destination 32bit surface is anti-aliased. If the surface is not 8bit or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly. */ #define VALUE_LIMIT 0.001 /* Local rotozoom-size function with trig result return */ void rotozoomSurfaceSizeTrig(int width, int height, double angle, double zoom, int *dstwidth, int *dstheight, double *canglezoom, double *sanglezoom) { double x, y, cx, cy, sx, sy; double radangle; int dstwidthhalf, dstheighthalf; /* * Determine destination width and height by rotating a centered source box */ radangle = angle * (M_PI / 180.0); *sanglezoom = sin(radangle); *canglezoom = cos(radangle); *sanglezoom *= zoom; *canglezoom *= zoom; x = width / 2; y = height / 2; cx = *canglezoom * x; cy = *canglezoom * y; sx = *sanglezoom * x; sy = *sanglezoom * y; dstwidthhalf = MAX((int) ceil(MAX(MAX(MAX(fabs(cx + sy), fabs(cx - sy)), fabs(-cx + sy)), fabs(-cx - sy))), 1); dstheighthalf = MAX((int) ceil(MAX(MAX(MAX(fabs(sx + cy), fabs(sx - cy)), fabs(-sx + cy)), fabs(-sx - cy))), 1); *dstwidth = 2 * dstwidthhalf; *dstheight = 2 * dstheighthalf; } /* Publically available rotozoom-size function */ void rotozoomSurfaceSize(int width, int height, double angle, double zoom, int *dstwidth, int *dstheight) { double dummy_sanglezoom, dummy_canglezoom; rotozoomSurfaceSizeTrig(width, height, angle, zoom, dstwidth, dstheight, &dummy_sanglezoom, &dummy_canglezoom); } /* zoomSurface() Zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface. 'zoomx' and 'zoomy' are scaling factors for width and height. If 'smooth' is 1 then the destination 32bit surface is anti-aliased. If the surface is not 8bit or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly. */ void zoomSurfaceSize(int width, int height, double zoomx, double zoomy, int *dstwidth, int *dstheight) { /* * Sanity check zoom factors */ if (zoomx < VALUE_LIMIT) { zoomx = VALUE_LIMIT; } if (zoomy < VALUE_LIMIT) { zoomy = VALUE_LIMIT; } /* * Calculate target size */ *dstwidth = (int) ((double) width * zoomx); *dstheight = (int) ((double) height * zoomy); if (*dstwidth < 1) { *dstwidth = 1; } if (*dstheight < 1) { *dstheight = 1; } } /* Publically available rotozoom function */ SDL_Surface *rotozoomSurface(SDL_Surface * src, double angle, double zoom, int smooth) { SDL_Surface *rz_src; SDL_Surface *rz_dst; double zoominv; double sanglezoom, canglezoom, sanglezoominv, canglezoominv; int dstwidthhalf, dstwidth, dstheighthalf, dstheight; int is32bit; int src_converted; /* * Sanity check */ if (src == NULL) return (NULL); /* * Determine if source surface is 32bit or 8bit */ is32bit = (src->format->BitsPerPixel == 32); if ((is32bit) || (src->format->BitsPerPixel == 8)) { /* * Use source surface 'as is' */ rz_src = src; src_converted = 0; } else { /* * New source surface is 32bit with a defined RGBA ordering */ rz_src = SDL_CreateRGBSurface(SDL_SWSURFACE, src->w, src->h, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000); SDL_BlitSurface(src, NULL, rz_src, NULL); src_converted = 1; is32bit = 1; } /* * Sanity check zoom factor */ if (zoom < VALUE_LIMIT) { zoom = VALUE_LIMIT; } zoominv = 65536.0 / (zoom * zoom); /* * Check if we have a rotozoom or just a zoom */ if (fabs(angle) > VALUE_LIMIT) { /* * Angle!=0: full rotozoom */ /* * ----------------------- */ /* Determine target size */ rotozoomSurfaceSizeTrig(rz_src->w, rz_src->h, angle, zoom, &dstwidth, &dstheight, &canglezoom, &sanglezoom); /* * Calculate target factors from sin/cos and zoom */ sanglezoominv = sanglezoom; canglezoominv = canglezoom; sanglezoominv *= zoominv; canglezoominv *= zoominv; /* Calculate half size */ dstwidthhalf = dstwidth / 2; dstheighthalf = dstheight / 2; /* * Alloc space to completely contain the rotated surface */ rz_dst = NULL; /* * Target surface is 32bit with source RGBA/ABGR ordering */ rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight, 32, rz_src->format->Rmask, rz_src->format->Gmask, rz_src->format->Bmask, rz_src->format->Amask); /* * Lock source surface */ SDL_LockSurface(rz_src); /* * Check which kind of surface we have */ /* * Call the 32bit transformation routine to do the rotation (using alpha) */ transformSurfaceRGBA(rz_src, rz_dst, dstwidthhalf, dstheighthalf, (int) (sanglezoominv), (int) (canglezoominv), smooth); /* * Turn on source-alpha support */ SDL_SetAlpha(rz_dst, SDL_SRCALPHA, 255); /* * Unlock source surface */ SDL_UnlockSurface(rz_src); } else { /* * Angle=0: Just a zoom */ /* * -------------------- */ /* * Calculate target size */ zoomSurfaceSize(rz_src->w, rz_src->h, zoom, zoom, &dstwidth, &dstheight); /* * Alloc space to completely contain the zoomed surface */ rz_dst = NULL; /* * Target surface is 32bit with source RGBA/ABGR ordering */ rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight, 32, rz_src->format->Rmask, rz_src->format->Gmask, rz_src->format->Bmask, rz_src->format->Amask); /* * Lock source surface */ SDL_LockSurface(rz_src); /* * Check which kind of surface we have */ /* * Call the 32bit transformation routine to do the zooming (using alpha) */ zoomSurfaceRGBA(rz_src, rz_dst, smooth); /* * Turn on source-alpha support */ SDL_SetAlpha(rz_dst, SDL_SRCALPHA, 255); /* * Unlock source surface */ SDL_UnlockSurface(rz_src); } /* * Cleanup temp surface */ if (src_converted) { SDL_FreeSurface(rz_src); } /* * Return destination surface */ return (rz_dst); } pygame-1.9.1release/src/rect.doc0000644000175000017500000001607111210363734016463 0ustar vincentvincentpygame.Rect pygame object for storing rectangular coordinates pygame.Rect(left, top, width, height): return Rect pygame.Rect((left, top), (width, height)): return Rect pygame.Rect(object): return Rect Pygame uses Rect objects to store and manipulate rectangular areas. A Rect can be created from a combination of left, top, width, and height values. Rects can also be created from python objects that are already a Rect or have an attribute named "rect". Any Pygame function that requires a Rect argument also accepts any of these values to construct a Rect. This makes it easier to create Rects on the fly as arguments to functions. The Rect functions that change the position or size of a Rect return a new copy of the Rect with the affected changes. The original Rect is not modified. Some methods have an alternate "in-place" version that returns None but effects the original Rect. These "in-place" methods are denoted with the "ip" suffix. The Rect object has several virtual attributes which can be used to move and align the Rect: top, left, bottom, right topleft, bottomleft, topright, bottomright midtop, midleft, midbottom, midright center, centerx, centery size, width, height w,h All of these attributes can be assigned to: rect1.right = 10 rect2.center = (20,30) Assigning to size, width or height changes the dimensions of the rectangle; all other assignments move the rectangle without resizing it. Notice that some attributes are integers and others are pairs of integers. If a Rect has a nonzero width or height, it will return True for a nonzero test. Some methods return a Rect with 0 size to represent an invalid rectangle. The coordinates for Rect objects are all integers. The size values can be programmed to have negative values, but these are considered illegal Rects for most operations. There are several collision tests between other rectangles. Most python containers can be searched for collisions against a single Rect. The area covered by a Rect does not include the right- and bottom-most edge of pixels. If one Rect's bottom border is another Rect's top border (i.e., rect1.bottom=rect2.top), the two meet exactly on the screen but do not overlap, and rect1.colliderect(rect2) returns false. Though Rect can be subclassed, methods that return new rectangles are not subclass aware. That is, move or copy return a new pygame.Rect instance, not an instance of the subclass. This may change. To make subclass awareness work though, subclasses may have to maintain the same constructor signature as Rect.
    copy copy the rectangle Rect.copy(): return Rect Returns a new rectangle having the same position and size as the orginal. move moves the rectangle Rect.move(x, y): return Rect Returns a new rectangle that is moved by the given offset. The x and y arguments can be any integer value, positive or negative. move_ip moves the rectangle, in place Rect.move_ip(x, y): return None Same as the Rect.move() method, but operates in place. inflate grow or shrink the rectangle size Rect.inflate(x, y): return Rect Returns a new rectangle with the size changed by the given offset. The rectangle remains centered around its current center. Negative values will shrink the rectangle. inflate_ip grow or shrink the rectangle size, in place Rect.inflate_ip(x, y): return None Same as the Rect.inflate() method, but operates in place. clamp moves the rectangle inside another Rect.clamp(Rect): return Rect Returns a new rectangle that is moved to be completely inside the argument Rect. If the rectangle is too large to fit inside, it is centered inside the argument Rect, but its size is not changed. clamp_ip moves the rectangle inside another, in place Rect.clamp_ip(Rect): return None Same as the Rect.clamp() method, but operates in place. clip crops a rectangle inside another Rect.clip(Rect): return Rect Returns a new rectangle that is cropped to be completely inside the argument Rect. If the two rectangles do not overlap to begin with, a Rect with 0 size is returned. union joins two rectangles into one Rect.union(Rect): return Rect Returns a new rectangle that completely covers the area of the two provided rectangles. There may be area inside the new Rect that is not covered by the originals. union_ip joins two rectangles into one, in place Rect.union_ip(Rect): return None Same as the Rect.union() method, but operates in place. unionall the union of many rectangles Rect.unionall(Rect_sequence): return Rect Returns the union of one rectangle with a sequence of many rectangles. unionall_ip the union of many rectangles, in place Rect.unionall_ip(Rect_sequence): return None The same as the Rect.unionall() method, but operates in place. fit resize and move a rectangle with aspect ratio Rect.fit(Rect): return Rect Returns a new rectangle that is moved and resized to fit another. The aspect ratio of the original Rect is preserved, so the new rectangle may be smaller than the target in either width or height. normalize correct negative sizes Rect.normalize(): return None This will flip the width or height of a rectangle if it has a negative size. The rectangle will remain in the same place, with only the sides swapped. contains test if one rectangle is inside another Rect.contains(Rect): return bool Returns true when the argument is completely inside the Rect. collidepoint test if a point is inside a rectangle Rect.collidepoint(x, y): return bool Rect.collidepoint((x,y)): return bool Returns true if the given point is inside the rectangle. A point along the right or bottom edge is not considered to be inside the rectangle. colliderect test if two rectangles overlap Rect.colliderect(Rect): return bool Returns true if any portion of either rectangle overlap (except the top+bottom or left+right edges). collidelist test if one rectangle in a list intersects Rect.collidelist(list): return index Test whether the rectangle collides with any in a sequence of rectangles. The index of the first collision found is returned. If no collisions are found an index of -1 is returned. collidelistall test if all rectangles in a list intersect Rect.collidelistall(list): return indices Returns a list of all the indices that contain rectangles that collide with the Rect. If no intersecting rectangles are found, an empty list is returned. collidedict test if one rectangle in a dictionary intersects Rect.collidedict(dict): return (key, value) Returns the key and value of the first dictionary value that collides with the Rect. If no collisions are found, None is returned. Rect objects are not hashable and cannot be used as keys in a dictionary, only as values. collidedictall test if all rectangles in a dictionary intersect Rect.collidedictall(dict): return [(key, value), ...] Returns a list of all the key and value pairs that intersect with the Rect. If no collisions are found an empty dictionary is returned. Rect objects are not hashable and cannot be used as keys in a dictionary, only as values. pygame-1.9.1release/src/rect.c0000644000175000017500000012371511207055754016152 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* * Python Rect Object -- useful 2d rectangle class */ #define PYGAMEAPI_RECT_INTERNAL #include "pygame.h" #include "pygamedocs.h" #include "structmember.h" #include "pgcompat.h" static PyTypeObject PyRect_Type; #define PyRect_Check(x) ((x)->ob_type == &PyRect_Type) static PyObject* rect_new (PyTypeObject *type, PyObject *args, PyObject *kwds); static int rect_init (PyRectObject *self, PyObject *args, PyObject *kwds); GAME_Rect* GameRect_FromObject (PyObject* obj, GAME_Rect* temp) { int val; int length; if (PyRect_Check (obj)) return &((PyRectObject*) obj)->r; if (PySequence_Check (obj) && (length = PySequence_Length (obj)) > 0) { if (length == 4) { if (!IntFromObjIndex (obj, 0, &val)) return NULL; temp->x = val; if (!IntFromObjIndex (obj, 1, &val)) return NULL; temp->y = val; if (!IntFromObjIndex (obj, 2, &val)) return NULL; temp->w = val; if (!IntFromObjIndex (obj, 3, &val)) return NULL; temp->h = val; return temp; } if (length == 2) { PyObject* sub = PySequence_GetItem (obj, 0); if (!sub || !PySequence_Check (sub) || PySequence_Length (sub) != 2) { Py_XDECREF (sub); return NULL; } if (!IntFromObjIndex (sub, 0, &val)) { Py_DECREF (sub); return NULL; } temp->x = val; if (!IntFromObjIndex (sub, 1, &val)) { Py_DECREF (sub); return NULL; } temp->y = val; Py_DECREF (sub); sub = PySequence_GetItem (obj, 1); if (!sub || !PySequence_Check (sub) || PySequence_Length (sub) != 2) { Py_XDECREF (sub); return NULL; } if (!IntFromObjIndex (sub, 0, &val)) { Py_DECREF (sub); return NULL; } temp->w = val; if (!IntFromObjIndex (sub, 1, &val)) { Py_DECREF (sub); return NULL; } temp->h = val; Py_DECREF (sub); return temp; } if (PyTuple_Check (obj) && length == 1) /*looks like an arg?*/ { PyObject* sub = PyTuple_GET_ITEM (obj, 0); if (sub) return GameRect_FromObject (sub, temp); } } if (PyObject_HasAttrString (obj, "rect")) { PyObject *rectattr; GAME_Rect *returnrect; rectattr = PyObject_GetAttrString (obj, "rect"); if (PyCallable_Check (rectattr)) /*call if it's a method*/ { PyObject *rectresult = PyObject_CallObject (rectattr, NULL); Py_DECREF (rectattr); if (!rectresult) return NULL; rectattr = rectresult; } returnrect = GameRect_FromObject (rectattr, temp); Py_DECREF (rectattr); return returnrect; } return NULL; } PyObject* PyRect_New (SDL_Rect* r) { PyRectObject* rect; rect = (PyRectObject *) PyRect_Type.tp_new (&PyRect_Type, NULL, NULL); if (rect) { rect->r.x = r->x; rect->r.y = r->y; rect->r.w = r->w; rect->r.h = r->h; } return (PyObject*)rect; } PyObject* PyRect_New4 (int x, int y, int w, int h) { PyRectObject* rect; rect = (PyRectObject *) PyRect_Type.tp_new (&PyRect_Type, NULL, NULL); if (rect) { rect->r.x = x; rect->r.y = y; rect->r.w = w; rect->r.h = h; } return (PyObject*)rect; } static int DoRectsIntersect (GAME_Rect *A, GAME_Rect *B) { return ((A->x >= B->x && A->x < B->x + B->w) || (B->x >= A->x && B->x < A->x + A->w)) && ((A->y >= B->y && A->y < B->y + B->h) || (B->y >= A->y && B->y < A->y + A->h)); } static PyObject* rect_normalize (PyObject* oself) { PyRectObject* self = (PyRectObject*)oself; if (self->r.w < 0) { self->r.x += self->r.w; self->r.w = -self->r.w; } if (self->r.h < 0) { self->r.y += self->r.h; self->r.h = -self->r.h; } Py_RETURN_NONE; } static PyObject* rect_move (PyObject* oself, PyObject* args) { PyRectObject* self = (PyRectObject*)oself; int x, y; if (!TwoIntsFromObj (args, &x, &y)) return RAISE (PyExc_TypeError, "argument must contain two numbers"); return PyRect_New4 (self->r.x + x, self->r.y + y, self->r.w, self->r.h); } static PyObject* rect_move_ip (PyObject* oself, PyObject* args) { PyRectObject* self = (PyRectObject*)oself; int x, y; if (!TwoIntsFromObj (args, &x, &y)) return RAISE (PyExc_TypeError, "argument must contain two numbers"); self->r.x += x; self->r.y += y; Py_RETURN_NONE; } static PyObject* rect_inflate (PyObject* oself, PyObject* args) { PyRectObject* self = (PyRectObject*)oself; int x, y; if (!TwoIntsFromObj (args, &x, &y)) return RAISE (PyExc_TypeError, "argument must contain two numbers"); return PyRect_New4 (self->r.x - x / 2, self->r.y - y / 2, self->r.w + x, self->r.h + y); } static PyObject* rect_inflate_ip (PyObject* oself, PyObject* args) { PyRectObject* self = (PyRectObject*)oself; int x, y; if (!TwoIntsFromObj (args, &x, &y)) return RAISE (PyExc_TypeError, "argument must contain two numbers"); self->r.x -= x / 2; self->r.y -= y / 2; self->r.w += x; self->r.h += y; Py_RETURN_NONE; } static PyObject* rect_union (PyObject* oself, PyObject* args) { PyRectObject* self = (PyRectObject*)oself; GAME_Rect *argrect, temp; int x, y, w, h; if (!(argrect = GameRect_FromObject (args, &temp))) return RAISE (PyExc_TypeError, "Argument must be rect style object"); x = MIN (self->r.x, argrect->x); y = MIN (self->r.y, argrect->y); w = MAX (self->r.x + self->r.w, argrect->x + argrect->w) - x; h = MAX (self->r.y + self->r.h, argrect->y + argrect->h) - y; return PyRect_New4 (x, y, w, h); } static PyObject* rect_union_ip (PyObject* oself, PyObject* args) { PyRectObject* self = (PyRectObject*)oself; GAME_Rect *argrect, temp; int x, y, w, h; if (!(argrect = GameRect_FromObject (args, &temp))) return RAISE (PyExc_TypeError, "Argument must be rect style object"); x = MIN (self->r.x, argrect->x); y = MIN (self->r.y, argrect->y); w = MAX (self->r.x + self->r.w, argrect->x + argrect->w) - x; h = MAX (self->r.y + self->r.h, argrect->y + argrect->h) - y; self->r.x = x; self->r.y = y; self->r.w = w; self->r.h = h; Py_RETURN_NONE; } static PyObject* rect_unionall (PyObject* oself, PyObject* args) { PyRectObject* self = (PyRectObject*)oself; GAME_Rect *argrect, temp; int loop, size; PyObject* list, *obj; int t, l, b, r; if (!PyArg_ParseTuple (args, "O", &list)) return NULL; if (!PySequence_Check (list)) return RAISE (PyExc_TypeError, "Argument must be a sequence of rectstyle objects."); l = self->r.x; t = self->r.y; r = self->r.x + self->r.w; b = self->r.y + self->r.h; size = PySequence_Length (list); /*warning, size could be -1 on error?*/ if (size < 1) return PyRect_New4 (l, t, r-l, b-t); for (loop = 0; loop < size; ++loop) { obj = PySequence_GetItem (list, loop); if(!obj || !(argrect = GameRect_FromObject (obj, &temp))) { RAISE (PyExc_TypeError, "Argument must be a sequence of rectstyle objects."); Py_XDECREF (obj); break; } l = MIN (l, argrect->x); t = MIN (t, argrect->y); r = MAX (r, argrect->x + argrect->w); b = MAX (b, argrect->y + argrect->h); Py_DECREF (obj); } return PyRect_New4 (l, t, r-l, b-t); } static PyObject* rect_unionall_ip (PyObject* oself, PyObject* args) { PyRectObject* self = (PyRectObject*)oself; GAME_Rect *argrect, temp; int loop, size; PyObject* list, *obj; int t, l, b, r; if (!PyArg_ParseTuple (args, "O", &list)) return NULL; if (!PySequence_Check (list)) return RAISE (PyExc_TypeError, "Argument must be a sequence of rectstyle objects."); l = self->r.x; t = self->r.y; r = self->r.x + self->r.w; b = self->r.y + self->r.h; size = PySequence_Length (list); /*warning, size could be -1 on error?*/ if (size < 1) return PyRect_New4 (l, t, r-l, b-t); for (loop = 0; loop < size; ++loop) { obj = PySequence_GetItem (list, loop); if (!obj || !(argrect = GameRect_FromObject (obj, &temp))) { RAISE (PyExc_TypeError, "Argument must be a sequence of rectstyle objects."); Py_XDECREF (obj); break; } l = MIN (l, argrect->x); t = MIN (t, argrect->y); r = MAX (r, argrect->x + argrect->w); b = MAX (b, argrect->y + argrect->h); Py_DECREF (obj); } self->r.x = l; self->r.y = t; self->r.w = r - l; self->r.h = b - t; Py_RETURN_NONE; } static PyObject* rect_collidepoint (PyObject* oself, PyObject* args) { PyRectObject* self = (PyRectObject*)oself; int x, y; int inside; if (!TwoIntsFromObj (args, &x, &y)) return RAISE (PyExc_TypeError, "argument must contain two numbers"); inside = x >= self->r.x && x < self->r.x + self->r.w && y >= self->r.y && y < self->r.y + self->r.h; return PyInt_FromLong (inside); } static PyObject* rect_colliderect (PyObject* oself, PyObject* args) { PyRectObject* self = (PyRectObject*)oself; GAME_Rect *argrect, temp; if (!(argrect = GameRect_FromObject (args, &temp))) return RAISE (PyExc_TypeError, "Argument must be rect style object"); return PyInt_FromLong (DoRectsIntersect (&self->r, argrect)); } static PyObject* rect_collidelist (PyObject* oself, PyObject* args) { PyRectObject* self = (PyRectObject*)oself; GAME_Rect *argrect, temp; int loop, size; PyObject* list, *obj; PyObject* ret = NULL; if (!PyArg_ParseTuple (args, "O", &list)) return NULL; if (!PySequence_Check (list)) return RAISE (PyExc_TypeError, "Argument must be a sequence of rectstyle objects."); size = PySequence_Length (list); /*warning, size could be -1 on error?*/ for (loop = 0; loop < size; ++loop) { obj = PySequence_GetItem (list, loop); if (!obj || !(argrect = GameRect_FromObject (obj, &temp))) { RAISE (PyExc_TypeError, "Argument must be a sequence of rectstyle objects."); Py_XDECREF (obj); break; } if (DoRectsIntersect (&self->r, argrect)) { ret = PyInt_FromLong (loop); Py_DECREF (obj); break; } Py_DECREF (obj); } if (loop == size) ret = PyInt_FromLong (-1); return ret; } static PyObject* rect_collidelistall (PyObject* oself, PyObject* args) { PyRectObject* self = (PyRectObject*)oself; GAME_Rect *argrect, temp; int loop, size; PyObject* list, *obj; PyObject* ret = NULL; if (!PyArg_ParseTuple (args, "O", &list)) return NULL; if (!PySequence_Check (list)) return RAISE (PyExc_TypeError, "Argument must be a sequence of rectstyle objects."); ret = PyList_New (0); if (!ret) return NULL; size = PySequence_Length (list); /*warning, size could be -1?*/ for (loop = 0; loop < size; ++loop) { obj = PySequence_GetItem (list, loop); if(!obj || !(argrect = GameRect_FromObject (obj, &temp))) { Py_XDECREF (obj); Py_DECREF (ret); return RAISE (PyExc_TypeError, "Argument must be a sequence of rectstyle objects."); } if (DoRectsIntersect (&self->r, argrect)) { PyObject* num = PyInt_FromLong (loop); if (!num) { Py_DECREF (obj); return NULL; } PyList_Append (ret, num); Py_DECREF (num); } Py_DECREF (obj); } return ret; } static PyObject* rect_collidedict (PyObject* oself, PyObject* args) { PyRectObject* self = (PyRectObject*)oself; GAME_Rect *argrect, temp; Py_ssize_t loop=0; Py_ssize_t values=0; PyObject* dict, *key, *val; PyObject* ret = NULL; if (!PyArg_ParseTuple (args, "O|i", &dict, &values)) return NULL; if (!PyDict_Check (dict)) return RAISE (PyExc_TypeError, "Argument must be a dict with rectstyle keys."); while (PyDict_Next (dict, &loop, &key, &val)) { if(values) { if (!(argrect = GameRect_FromObject (val, &temp))) { RAISE (PyExc_TypeError, "Argument must be a dict with rectstyle values."); break; } } else { if (!(argrect = GameRect_FromObject (key, &temp))) { RAISE (PyExc_TypeError, "Argument must be a dict with rectstyle keys."); break; } } if (DoRectsIntersect (&self->r, argrect)) { ret = Py_BuildValue ("(OO)", key, val); break; } } if (!ret) Py_RETURN_NONE; return ret; } static PyObject* rect_collidedictall (PyObject* oself, PyObject* args) { PyRectObject* self = (PyRectObject*)oself; GAME_Rect *argrect, temp; Py_ssize_t loop=0; /* should we use values or keys? */ Py_ssize_t values=0; PyObject* dict, *key, *val; PyObject* ret = NULL; if (!PyArg_ParseTuple (args, "O|i", &dict, &values)) return NULL; if (!PyDict_Check (dict)) return RAISE (PyExc_TypeError, "Argument must be a dict with rectstyle keys."); ret = PyList_New (0); if(!ret) return NULL; while (PyDict_Next (dict, &loop, &key, &val)) { if (values) { if (!(argrect = GameRect_FromObject (val, &temp))) { Py_DECREF (ret); return RAISE (PyExc_TypeError, "Argument must be a dict with rectstyle values."); } } else { if (!(argrect = GameRect_FromObject (key, &temp))) { Py_DECREF (ret); return RAISE (PyExc_TypeError, "Argument must be a dict with rectstyle keys."); } } if (DoRectsIntersect (&self->r, argrect)) { PyObject* num = Py_BuildValue ("(OO)", key, val); if(!num) return NULL; PyList_Append (ret, num); Py_DECREF (num); } } return ret; } static PyObject* rect_clip (PyObject* self, PyObject* args) { GAME_Rect *A, *B, temp; int x, y, w, h; A = &((PyRectObject*) self)->r; if (!(B = GameRect_FromObject (args, &temp))) return RAISE (PyExc_TypeError, "Argument must be rect style object"); /* Left */ if ((A->x >= B->x) && (A->x < (B->x + B->w))) x = A->x; else if ((B->x >= A->x) && (B->x < (A->x + A->w))) x = B->x; else goto nointersect; /* Right */ if (((A->x + A->w) > B->x) && ((A->x + A->w) <= (B->x + B->w))) w = (A->x + A->w) - x; else if (((B->x + B->w) > A->x) && ((B->x + B->w) <= (A->x + A->w))) w = (B->x + B->w) - x; else goto nointersect; /* Top */ if ((A->y >= B->y) && (A->y < (B->y + B->h))) y = A->y; else if ((B->y >= A->y) && (B->y < (A->y + A->h))) y = B->y; else goto nointersect; /* Bottom */ if (((A->y + A->h) > B->y) && ((A->y + A->h) <= (B->y + B->h))) h = (A->y + A->h) - y; else if (((B->y + B->h) > A->y) && ((B->y + B->h) <= (A->y + A->h))) h = (B->y + B->h) - y; else goto nointersect; return PyRect_New4 (x, y, w, h); nointersect: return PyRect_New4 (A->x, A->y, 0, 0); } static PyObject* rect_contains (PyObject* oself, PyObject* args) { int contained; PyRectObject* self = (PyRectObject*)oself; GAME_Rect *argrect, temp; if (!(argrect = GameRect_FromObject (args, &temp))) return RAISE (PyExc_TypeError, "Argument must be rect style object"); contained = (self->r.x <= argrect->x) && (self->r.y <= argrect->y) && (self->r.x + self->r.w >= argrect->x + argrect->w) && (self->r.y + self->r.h >= argrect->y + argrect->h) && (self->r.x + self->r.w > argrect->x) && (self->r.y + self->r.h > argrect->y); return PyInt_FromLong (contained); } static PyObject* rect_clamp (PyObject* oself, PyObject* args) { PyRectObject* self = (PyRectObject*)oself; GAME_Rect *argrect, temp; int x, y; if (!(argrect = GameRect_FromObject (args, &temp))) return RAISE (PyExc_TypeError, "Argument must be rect style object"); if (self->r.w >= argrect->w) x = argrect->x + argrect->w / 2 - self->r.w / 2; else if (self->r.x < argrect->x) x = argrect->x; else if (self->r.x + self->r.w > argrect->x + argrect->w) x = argrect->x + argrect->w - self->r.w; else x = self->r.x; if (self->r.h >= argrect->h) y = argrect->y + argrect->h / 2 - self->r.h / 2; else if (self->r.y < argrect->y) y = argrect->y; else if (self->r.y + self->r.h > argrect->y + argrect->h) y = argrect->y + argrect->h - self->r.h; else y = self->r.y; return PyRect_New4 (x, y, self->r.w, self->r.h); } static PyObject* rect_fit (PyObject* oself, PyObject* args) { PyRectObject* self = (PyRectObject*)oself; GAME_Rect *argrect, temp; int w, h, x, y; float xratio, yratio, maxratio; if (!(argrect = GameRect_FromObject (args, &temp))) return RAISE (PyExc_TypeError, "Argument must be rect style object"); xratio = (float) self->r.w / (float) argrect->w; yratio = (float) self->r.h / (float) argrect->h; maxratio = (xratio > yratio) ? xratio : yratio; w = (int) (self->r.w / maxratio); h = (int) (self->r.h / maxratio); x = argrect->x + (argrect->w - w)/2; y = argrect->y + (argrect->h - h)/2; return PyRect_New4 (x, y, w, h); } static PyObject* rect_clamp_ip (PyObject* oself, PyObject* args) { PyRectObject* self = (PyRectObject*)oself; GAME_Rect *argrect, temp; int x, y; if (!(argrect = GameRect_FromObject (args, &temp))) return RAISE (PyExc_TypeError, "Argument must be rect style object"); if (self->r.w >= argrect->w) x = argrect->x + argrect->w / 2 - self->r.w / 2; else if (self->r.x < argrect->x) x = argrect->x; else if (self->r.x + self->r.w > argrect->x + argrect->w) x = argrect->x + argrect->w - self->r.w; else x = self->r.x; if (self->r.h >= argrect->h) y = argrect->y + argrect->h / 2 - self->r.h / 2; else if (self->r.y < argrect->y) y = argrect->y; else if (self->r.y + self->r.h > argrect->y + argrect->h) y = argrect->y + argrect->h - self->r.h; else y = self->r.y; self->r.x = x; self->r.y = y; Py_RETURN_NONE; } /* for pickling */ static PyObject* rect_reduce (PyObject* oself) { PyRectObject* self = (PyRectObject*)oself; return Py_BuildValue ("(O(iiii))", oself->ob_type, (int)self->r.x, (int)self->r.y, (int)self->r.w, (int)self->r.h); } /* for copy module */ static PyObject* rect_copy (PyObject* oself) { PyRectObject* self = (PyRectObject*)oself; return PyRect_New4 (self->r.x, self->r.y, self->r.w, self->r.h); } static struct PyMethodDef rect_methods[] = { { "normalize", (PyCFunction) rect_normalize, METH_NOARGS, DOC_RECTNORMALIZE }, { "clip", rect_clip, METH_VARARGS, DOC_RECTCLIP}, { "clamp", rect_clamp, METH_VARARGS, DOC_RECTCLAMP}, { "clamp_ip", rect_clamp_ip, METH_VARARGS, DOC_RECTCLAMPIP}, { "copy", (PyCFunction) rect_copy, METH_NOARGS, DOC_RECTCOPY}, { "fit", rect_fit, METH_VARARGS, DOC_RECTFIT}, { "move", rect_move, METH_VARARGS, DOC_RECTMOVE}, { "inflate", rect_inflate, METH_VARARGS, DOC_RECTINFLATE}, { "union", rect_union, METH_VARARGS, DOC_RECTUNION}, { "unionall", rect_unionall, METH_VARARGS, DOC_RECTUNIONALL}, { "move_ip", rect_move_ip, METH_VARARGS, DOC_RECTMOVEIP}, { "inflate_ip", rect_inflate_ip, METH_VARARGS, DOC_RECTINFLATEIP}, { "union_ip", rect_union_ip, METH_VARARGS, DOC_RECTUNIONIP}, { "unionall_ip", rect_unionall_ip, METH_VARARGS, DOC_RECTUNIONALLIP}, { "collidepoint", rect_collidepoint, METH_VARARGS, DOC_RECTCOLLIDEPOINT}, { "colliderect", rect_colliderect, METH_VARARGS, DOC_RECTCOLLIDERECT}, { "collidelist", rect_collidelist, METH_VARARGS, DOC_RECTCOLLIDELIST}, { "collidelistall", rect_collidelistall, METH_VARARGS, DOC_RECTCOLLIDELISTALL}, { "collidedict", rect_collidedict, METH_VARARGS, DOC_RECTCOLLIDEDICT}, { "collidedictall", rect_collidedictall, METH_VARARGS, DOC_RECTCOLLIDEDICTALL}, { "contains", rect_contains, METH_VARARGS, DOC_RECTCONTAINS}, { "__reduce__", (PyCFunction) rect_reduce, METH_NOARGS, NULL}, { "__copy__", (PyCFunction) rect_copy, METH_NOARGS, NULL}, { NULL, NULL, 0, NULL } }; /* sequence functions */ static Py_ssize_t rect_length (PyObject *_self) { return 4; } static PyObject* rect_item (PyObject *_self, Py_ssize_t i) { PyRectObject *self = (PyRectObject *) _self; int* data = (int*)&self->r; if (i < 0 || i > 3) return RAISE (PyExc_IndexError, "Invalid rect Index"); return PyInt_FromLong (data[i]); } static int rect_ass_item (PyObject *_self, Py_ssize_t i, PyObject *v) { PyRectObject *self = (PyRectObject *) _self; int val; int* data = (int*)&self->r; if (i < 0 || i > 3) { RAISE (PyExc_IndexError, "Invalid rect Index"); return -1; } if (!IntFromObj (v, &val)) { RAISE (PyExc_TypeError, "Must assign numeric values"); return -1; } data[i] = val; return 0; } static PyObject* rect_slice (PyObject *_self, Py_ssize_t ilow, Py_ssize_t ihigh) { PyRectObject *self = (PyRectObject *) _self; PyObject *list; int* data = (int*)&self->r; int numitems, loop, l = 4; if (ihigh < 0) ihigh += l; if (ilow < 0) ilow += l; if (ilow < 0) ilow = 0; else if (ilow > l) ilow = l; if (ihigh < 0) ihigh = 0; else if (ihigh > l) ihigh = l; if (ihigh < ilow) ihigh = ilow; numitems = ihigh - ilow; list = PyList_New (numitems); for (loop = 0; loop < numitems; ++loop) PyList_SET_ITEM (list, loop, PyInt_FromLong (data[loop + ilow])); return list; } static int rect_ass_slice(PyObject *_self, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v) { PyRectObject *self = (PyRectObject *) _self; int* data = (int*)&self->r; int numitems, loop, l = 4; int val; if (!PySequence_Check (v)) { RAISE (PyExc_TypeError, "Assigned slice must be a sequence"); return -1; } if (ihigh < 0) ihigh += l; if (ilow < 0) ilow += l; if (ilow < 0) ilow = 0; else if (ilow > l) ilow = l; if (ihigh < 0) ihigh = 0; else if (ihigh > l) ihigh = l; if (ihigh < ilow) ihigh = ilow; numitems = ihigh - ilow; if (numitems != PySequence_Length (v)) { RAISE (PyExc_ValueError, "Assigned slice must be same length"); return -1; } for (loop = 0; loop < numitems; ++loop) { if (!IntFromObjIndex (v, loop, &val)) return -1; data[loop + ilow] = val; } return 0; } static PySequenceMethods rect_as_sequence = { rect_length, /*length*/ NULL, /*concat*/ NULL, /*repeat*/ rect_item, /*item*/ rect_slice, /*slice*/ rect_ass_item, /*ass_item*/ rect_ass_slice, /*ass_slice*/ }; /* numeric functions */ static int rect_nonzero (PyRectObject *self) { return self->r.w != 0 && self->r.h != 0; } #if !PY3 static int rect_coerce (PyObject** o1, PyObject** o2) { PyObject* new1; PyObject* new2; GAME_Rect* r, temp; if (PyRect_Check (*o1)) { new1 = *o1; Py_INCREF (new1); } else if ((r = GameRect_FromObject (*o1, &temp))) new1 = PyRect_New4 (r->x, r->y, r->w, r->h); else return 1; if (PyRect_Check (*o2)) { new2 = *o2; Py_INCREF (new2); } else if ((r = GameRect_FromObject (*o2, &temp))) new2 = PyRect_New4 (r->x, r->y, r->w, r->h); else { Py_DECREF (new1); return 1; } *o1 = new1; *o2 = new2; return 0; } #endif static PyNumberMethods rect_as_number = { (binaryfunc)NULL, /*add*/ (binaryfunc)NULL, /*subtract*/ (binaryfunc)NULL, /*multiply*/ #if !PY3 (binaryfunc)NULL, /*divide*/ #endif (binaryfunc)NULL, /*remainder*/ (binaryfunc)NULL, /*divmod*/ (ternaryfunc)NULL, /*power*/ (unaryfunc)NULL, /*negative*/ (unaryfunc)NULL, /*pos*/ (unaryfunc)NULL, /*abs*/ (inquiry)rect_nonzero, /*nonzero / bool*/ (unaryfunc)NULL, /*invert*/ (binaryfunc)NULL, /*lshift*/ (binaryfunc)NULL, /*rshift*/ (binaryfunc)NULL, /*and*/ (binaryfunc)NULL, /*xor*/ (binaryfunc)NULL, /*or*/ #if !PY3 (coercion)rect_coerce, /*coerce*/ #endif (unaryfunc)NULL, /*int*/ #if !PY3 (unaryfunc)NULL, /*long*/ #endif (unaryfunc)NULL, /*float*/ }; /* object type functions */ static void rect_dealloc (PyRectObject *self) { if (self->weakreflist) PyObject_ClearWeakRefs ((PyObject*)self); Py_TYPE(self)->tp_free ((PyObject*)self); } static PyObject* rect_repr (PyRectObject *self) { char string[256]; sprintf (string, "", self->r.x, self->r.y, self->r.w, self->r.h); return Text_FromUTF8 (string); } static PyObject* rect_str (PyRectObject *self) { return rect_repr (self); } static PyObject* rect_richcompare(PyObject *o1, PyObject *o2, int opid) { GAME_Rect *o1rect, *o2rect, temp1, temp2; int cmp; o1rect = GameRect_FromObject (o1, &temp1); if (!o1rect) { goto Unimplemented; } o2rect = GameRect_FromObject (o2, &temp2); if (!o2rect) { goto Unimplemented; } if (o1rect->x != o2rect->x) { cmp = o1rect->x < o2rect->x ? -1 : 1; } else if (o1rect->y != o2rect->y) { cmp = o1rect->y < o2rect->y ? -1 : 1; } else if (o1rect->w != o2rect->w) { cmp = o1rect->w < o2rect->w ? -1 : 1; } else if (o1rect->h != o2rect->h) { cmp = o1rect->h < o2rect->h ? -1 : 1; } else { cmp = 0; } switch (opid) { case Py_LT: return PyBool_FromLong (cmp < 0); case Py_LE: return PyBool_FromLong (cmp <= 0); case Py_EQ: return PyBool_FromLong (cmp == 0); case Py_NE: return PyBool_FromLong (cmp != 0); case Py_GT: return PyBool_FromLong (cmp > 0); case Py_GE: return PyBool_FromLong (cmp >= 0); default: break; } Unimplemented: Py_INCREF (Py_NotImplemented); return Py_NotImplemented; } /*width*/ static PyObject* rect_getwidth (PyRectObject *self, void *closure) { return PyInt_FromLong (self->r.w); } static int rect_setwidth (PyRectObject *self, PyObject* value, void *closure) { int val1; if (!IntFromObj (value, &val1)) return -1; self->r.w = val1; return 0; } /*height*/ static PyObject* rect_getheight (PyRectObject *self, void *closure) { return PyInt_FromLong (self->r.h); } static int rect_setheight (PyRectObject *self, PyObject* value, void *closure) { int val1; if (!IntFromObj (value, &val1)) { RAISE (PyExc_TypeError, "invalid rect assignment"); return -1; } self->r.h = val1; return 0; } /*top*/ static PyObject* rect_gettop (PyRectObject *self, void *closure) { return PyInt_FromLong (self->r.y); } static int rect_settop (PyRectObject *self, PyObject* value, void *closure) { int val1; if (!IntFromObj (value, &val1)) { RAISE (PyExc_TypeError, "invalid rect assignment"); return -1; } self->r.y = val1; return 0; } /*left*/ static PyObject* rect_getleft (PyRectObject *self, void *closure) { return PyInt_FromLong (self->r.x); } static int rect_setleft (PyRectObject *self, PyObject* value, void *closure) { int val1; if (!IntFromObj (value, &val1)) { RAISE (PyExc_TypeError, "invalid rect assignment"); return -1; } self->r.x = val1; return 0; } /*right*/ static PyObject* rect_getright (PyRectObject *self, void *closure) { return PyInt_FromLong (self->r.x + self->r.w); } static int rect_setright (PyRectObject *self, PyObject* value, void *closure) { int val1; if (!IntFromObj (value, &val1)) { RAISE (PyExc_TypeError, "invalid rect assignment"); return -1; } self->r.x = val1-self->r.w; return 0; } /*bottom*/ static PyObject* rect_getbottom (PyRectObject *self, void *closure) { return PyInt_FromLong (self->r.y + self->r.h); } static int rect_setbottom (PyRectObject *self, PyObject* value, void *closure) { int val1; if (!IntFromObj (value, &val1)) { RAISE (PyExc_TypeError, "invalid rect assignment"); return -1; } self->r.y = val1-self->r.h; return 0; } /*centerx*/ static PyObject* rect_getcenterx (PyRectObject *self, void *closure) { return PyInt_FromLong (self->r.x + (self->r.w >> 1)); } static int rect_setcenterx (PyRectObject *self, PyObject* value, void *closure) { int val1; if (!IntFromObj (value, &val1)) { RAISE (PyExc_TypeError, "invalid rect assignment"); return -1; } self->r.x = val1 - (self->r.w >> 1); return 0; } /*centery*/ static PyObject* rect_getcentery (PyRectObject *self, void *closure) { return PyInt_FromLong (self->r.y + (self->r.h >> 1)); } static int rect_setcentery (PyRectObject *self, PyObject* value, void *closure) { int val1; if (!IntFromObj (value, &val1)) { RAISE (PyExc_TypeError, "invalid rect assignment"); return -1; } self->r.y = val1 - (self->r.h >> 1); return 0; } /*topleft*/ static PyObject* rect_gettopleft (PyRectObject *self, void *closure) { return Py_BuildValue ("(ii)", self->r.x, self->r.y); } static int rect_settopleft (PyRectObject *self, PyObject* value, void *closure) { int val1, val2; if (!TwoIntsFromObj (value, &val1, &val2)) { RAISE (PyExc_TypeError, "invalid rect assignment"); return -1; } self->r.x = val1; self->r.y = val2; return 0; } /*topright*/ static PyObject* rect_gettopright (PyRectObject *self, void *closure) { return Py_BuildValue ("(ii)", self->r.x+self->r.w, self->r.y); } static int rect_settopright (PyRectObject *self, PyObject* value, void *closure) { int val1, val2; if (!TwoIntsFromObj (value, &val1, &val2)) { RAISE (PyExc_TypeError, "invalid rect assignment"); return -1; } self->r.x = val1-self->r.w; self->r.y = val2; return 0; } /*bottomleft*/ static PyObject* rect_getbottomleft (PyRectObject *self, void *closure) { return Py_BuildValue ("(ii)", self->r.x, self->r.y+self->r.h); } static int rect_setbottomleft (PyRectObject *self, PyObject* value, void *closure) { int val1, val2; if (!TwoIntsFromObj (value, &val1, &val2)) { RAISE (PyExc_TypeError, "invalid rect assignment"); return -1; } self->r.x = val1; self->r.y = val2-self->r.h; return 0; } /*bottomright*/ static PyObject* rect_getbottomright (PyRectObject *self, void *closure) { return Py_BuildValue ("(ii)", self->r.x+self->r.w, self->r.y+self->r.h); } static int rect_setbottomright (PyRectObject *self, PyObject* value, void *closure) { int val1, val2; if (!TwoIntsFromObj (value, &val1, &val2)) { RAISE (PyExc_TypeError, "invalid rect assignment"); return -1; } self->r.x = val1-self->r.w; self->r.y = val2-self->r.h; return 0; } /*midtop*/ static PyObject* rect_getmidtop (PyRectObject *self, void *closure) { return Py_BuildValue ("(ii)", self->r.x + (self->r.w >> 1), self->r.y); } static int rect_setmidtop (PyRectObject *self, PyObject* value, void *closure) { int val1, val2; if (!TwoIntsFromObj (value, &val1, &val2)) { RAISE (PyExc_TypeError, "invalid rect assignment"); return -1; } self->r.x += val1 - (self->r.x + (self->r.w >> 1)); self->r.y = val2; return 0; } /*midleft*/ static PyObject* rect_getmidleft (PyRectObject *self, void *closure) { return Py_BuildValue ("(ii)", self->r.x, self->r.y+(self->r.h>>1)); } static int rect_setmidleft (PyRectObject *self, PyObject* value, void *closure) { int val1, val2; if (!TwoIntsFromObj (value, &val1, &val2)) { RAISE (PyExc_TypeError, "invalid rect assignment"); return -1; } self->r.x = val1; self->r.y += val2 - (self->r.y + (self->r.h >> 1)); return 0; } /*midbottom*/ static PyObject* rect_getmidbottom (PyRectObject *self, void *closure) { return Py_BuildValue ("(ii)", self->r.x + (self->r.w >> 1), self->r.y + self->r.h); } static int rect_setmidbottom (PyRectObject *self, PyObject* value, void *closure) { int val1, val2; if (!TwoIntsFromObj (value, &val1, &val2)) { RAISE (PyExc_TypeError, "invalid rect assignment"); return -1; } self->r.x += val1 - (self->r.x + (self->r.w >> 1)); self->r.y = val2 - self->r.h; return 0; } /*midright*/ static PyObject* rect_getmidright (PyRectObject *self, void *closure) { return Py_BuildValue ("(ii)", self->r.x + self->r.w, self->r.y + (self->r.h >> 1)); } static int rect_setmidright (PyRectObject *self, PyObject* value, void *closure) { int val1, val2; if (!TwoIntsFromObj (value, &val1, &val2)) { RAISE (PyExc_TypeError, "invalid rect assignment"); return -1; } self->r.x = val1 - self->r.w; self->r.y += val2 -(self->r.y + (self->r.h >> 1)); return 0; } /*center*/ static PyObject* rect_getcenter (PyRectObject *self, void *closure) { return Py_BuildValue ("(ii)", self->r.x + (self->r.w >> 1), self->r.y + (self->r.h >> 1)); } static int rect_setcenter (PyRectObject *self, PyObject* value, void *closure) { int val1, val2; if (!TwoIntsFromObj (value, &val1, &val2)) { RAISE (PyExc_TypeError, "invalid rect assignment"); return -1; } self->r.x += val1 - (self->r.x + (self->r.w >> 1)); self->r.y += val2 - (self->r.y + (self->r.h >> 1)); return 0; } /*size*/ static PyObject* rect_getsize (PyRectObject *self, void *closure) { return Py_BuildValue ("(ii)", self->r.w, self->r.h); } static int rect_setsize (PyRectObject *self, PyObject* value, void *closure) { int val1, val2; if (!TwoIntsFromObj (value, &val1, &val2)) { RAISE (PyExc_TypeError, "invalid rect assignment"); return -1; } self->r.w = val1; self->r.h = val2; return 0; } static PyObject* rect_getsafepickle (PyRectObject *self, void *closure) { Py_RETURN_TRUE; } static PyGetSetDef rect_getsets[] = { { "x", (getter)rect_getleft, (setter)rect_setleft, NULL, NULL }, { "y", (getter)rect_gettop, (setter)rect_settop, NULL, NULL }, { "w", (getter)rect_getwidth, (setter)rect_setwidth, NULL, NULL }, { "h", (getter)rect_getheight, (setter)rect_setheight, NULL, NULL }, { "width", (getter)rect_getwidth, (setter)rect_setwidth, NULL, NULL }, { "height", (getter)rect_getheight, (setter)rect_setheight, NULL, NULL }, { "top", (getter)rect_gettop, (setter)rect_settop, NULL, NULL }, { "left", (getter)rect_getleft, (setter)rect_setleft, NULL, NULL }, { "bottom", (getter)rect_getbottom, (setter)rect_setbottom, NULL, NULL }, { "right", (getter)rect_getright, (setter)rect_setright, NULL, NULL }, { "centerx", (getter)rect_getcenterx, (setter)rect_setcenterx, NULL, NULL }, { "centery", (getter)rect_getcentery, (setter)rect_setcentery, NULL, NULL }, { "topleft", (getter)rect_gettopleft, (setter)rect_settopleft, NULL, NULL }, { "topright", (getter)rect_gettopright, (setter)rect_settopright, NULL, NULL }, { "bottomleft", (getter)rect_getbottomleft, (setter)rect_setbottomleft, NULL, NULL }, { "bottomright", (getter)rect_getbottomright, (setter)rect_setbottomright, NULL, NULL }, { "midtop", (getter)rect_getmidtop, (setter)rect_setmidtop, NULL, NULL }, { "midleft", (getter)rect_getmidleft, (setter)rect_setmidleft, NULL, NULL }, { "midbottom", (getter)rect_getmidbottom, (setter)rect_setmidbottom, NULL, NULL }, { "midright", (getter)rect_getmidright, (setter)rect_setmidright, NULL, NULL }, { "size", (getter)rect_getsize, (setter)rect_setsize, NULL, NULL }, { "center", (getter)rect_getcenter, (setter)rect_setcenter, NULL, NULL }, { "__safe_for_unpickling__", (getter)rect_getsafepickle, NULL, NULL, NULL }, { NULL, 0, NULL, NULL, NULL } /* Sentinel */ }; static PyTypeObject PyRect_Type = { TYPE_HEAD (NULL, 0) "pygame.Rect", /*name*/ sizeof(PyRectObject), /*basicsize*/ 0, /*itemsize*/ /* methods */ (destructor)rect_dealloc, /*dealloc*/ (printfunc)NULL, /*print*/ NULL, /*getattr*/ NULL, /*setattr*/ NULL, /*compare/reserved*/ (reprfunc)rect_repr, /*repr*/ &rect_as_number, /*as_number*/ &rect_as_sequence, /*as_sequence*/ NULL, /*as_mapping*/ (hashfunc)NULL, /*hash*/ (ternaryfunc)NULL, /*call*/ (reprfunc)rect_str, /*str*/ /* Space for future expansion */ 0L,0L,0L, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ DOC_PYGAMERECT, /* Documentation string */ 0, /* tp_traverse */ 0, /* tp_clear */ (richcmpfunc)rect_richcompare, /* tp_richcompare */ offsetof(PyRectObject, weakreflist), /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ rect_methods, /* tp_methods */ 0, /* tp_members */ rect_getsets, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ (initproc)rect_init, /* tp_init */ 0, /* tp_alloc */ rect_new, /* tp_new */ }; static PyObject* rect_new (PyTypeObject *type, PyObject *args, PyObject *kwds) { PyRectObject *self; self = (PyRectObject *)type->tp_alloc (type, 0); if (self) { self->r.x = self->r.y = 0; self->r.w = self->r.h = 0; self->weakreflist = NULL; } return (PyObject*)self; } static int rect_init (PyRectObject *self, PyObject *args, PyObject *kwds) { GAME_Rect *argrect, temp; if (!(argrect = GameRect_FromObject (args, &temp))) { RAISE (PyExc_TypeError, "Argument must be rect style object"); return -1; } self->r.x = argrect->x; self->r.y = argrect->y; self->r.w = argrect->w; self->r.h = argrect->h; return 0; } static PyMethodDef _rect_methods[] = { {NULL, NULL, 0, NULL} }; /*DOC*/ static char _rectangle_doc[] = /*DOC*/ "Module for the rectangle object\n"; MODINIT_DEFINE (rect) { PyObject *module, *dict, *apiobj; int ecode; static void* c_api[PYGAMEAPI_RECT_NUMSLOTS]; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "rect", _rectangle_doc, -1, _rect_methods, NULL, NULL, NULL, NULL }; #endif /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } /* Create the module and add the functions */ if (PyType_Ready (&PyRect_Type) < 0) { MODINIT_ERROR; } #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "rect", _rect_methods, _rectangle_doc); #endif if (module == NULL) { MODINIT_ERROR; } dict = PyModule_GetDict (module); if (PyDict_SetItemString (dict, "RectType", (PyObject *)&PyRect_Type)) { DECREF_MOD (module); MODINIT_ERROR; } if (PyDict_SetItemString (dict, "Rect", (PyObject *)&PyRect_Type)) { DECREF_MOD (module); MODINIT_ERROR; } /* export the c api */ c_api[0] = &PyRect_Type; c_api[1] = PyRect_New; c_api[2] = PyRect_New4; c_api[3] = GameRect_FromObject; apiobj = PyCObject_FromVoidPtr (c_api, NULL); if (apiobj == NULL) { DECREF_MOD (module); MODINIT_ERROR; } ecode = PyDict_SetItemString (dict, PYGAMEAPI_LOCAL_ENTRY, apiobj); Py_DECREF (apiobj); if (ecode) { DECREF_MOD (module); MODINIT_ERROR; } MODINIT_RETURN (module); } pygame-1.9.1release/src/pypm.pyx0000644000175000017500000004173011210671750016566 0ustar vincentvincent# pyPortMidi # Python bindings for PortMidi # John Harrison # http://sound.media.mit.edu/~harrison # harrison@media.mit.edu # written in Pyrex __version__="0.05" import array # CHANGES: # 0.0.5: (June 1st, 2009) # Output no longer calls abort when it deallocates. # Added abort and close methods. # Need to call Abort() explicityly if you want that to happen. # # 0.0.3: (March 15, 2005) # changed everything from tuples to lists # return 4 values for PmRead instead of 3 (for SysEx) # minor fixes for flexibility and error checking # flushed out DistUtils package and added Mac and Linux compile support # Markus Pfaff: added ability for WriteSysEx to accept lists as well # as strings # 0.0.2: # fixed pointer to function calls to avoid necessity of pyport library # 0.0.1: # initial release cdef extern from "portmidi.h": ctypedef enum PmError: pmNoError = 0, pmHostError = -10000, pmInvalidDeviceId, #/* out of range or output device when input is requested or vice versa */ pmInsufficientMemory, pmBufferTooSmall, pmBufferOverflow, pmBadPtr, pmBadData, #/* illegal midi data, e.g. missing EOX */ pmInternalError, pmBufferMaxSize, #/* buffer is already as large as it can be */ PmError Pm_Initialize() PmError Pm_Terminate() ctypedef void PortMidiStream ctypedef PortMidiStream PmStream # CHECK THIS! ctypedef int PmDeviceID int Pm_HasHostError( PortMidiStream * stream ) char *Pm_GetErrorText( PmError errnum ) Pm_GetHostErrorText(char * msg, unsigned int len) ctypedef struct PmDeviceInfo: int structVersion char *interf #/* underlying MIDI API, e.g. MMSystem or DirectX */ char *name #/* device name, e.g. USB MidiSport 1x1 */ int input #/* true iff input is available */ int output #/* true iff output is available */ int opened #/* used by generic PortMidi code to do error checking on arguments */ int Pm_CountDevices() PmDeviceID Pm_GetDefaultInputDeviceID() PmDeviceID Pm_GetDefaultOutputDeviceID() ctypedef long PmTimestamp ctypedef PmTimestamp (*PmTimeProcPtr)(void *time_info) #PmBefore is not defined... PmDeviceInfo* Pm_GetDeviceInfo( PmDeviceID id ) PmError Pm_OpenInput( PortMidiStream** stream, PmDeviceID inputDevice, void *inputDriverInfo, long bufferSize, long (*PmPtr) (), # long = PtTimestamp void *time_info ) PmError Pm_OpenOutput( PortMidiStream** stream, PmDeviceID outputDevice, void *outputDriverInfo, long bufferSize, #long (*PmPtr) (), # long = PtTimestamp PmTimeProcPtr time_proc, # long = PtTimestamp void *time_info, long latency ) PmError Pm_SetFilter( PortMidiStream* stream, long filters ) PmError Pm_Abort( PortMidiStream* stream ) PmError Pm_Close( PortMidiStream* stream ) ctypedef long PmMessage ctypedef struct PmEvent: PmMessage message PmTimestamp timestamp PmError Pm_Read( PortMidiStream *stream, PmEvent *buffer, long length ) PmError Pm_Poll( PortMidiStream *stream) int Pm_Channel(int channel) PmError Pm_SetChannelMask(PortMidiStream *stream, int mask) PmError Pm_Write( PortMidiStream *stream, PmEvent *buffer, long length ) PmError Pm_WriteSysEx( PortMidiStream *stream, PmTimestamp when, unsigned char *msg) cdef extern from "porttime.h": ctypedef enum PtError: ptNoError = 0, ptHostError = -10000, ptAlreadyStarted, ptAlreadyStopped, ptInsufficientMemory ctypedef long PtTimestamp ctypedef void (* PtCallback)( PtTimestamp timestamp, void *userData ) PtError Pt_Start(int resolution, PtCallback *callback, void *userData) PtTimestamp Pt_Time() FILT_ACTIVE=0x1 FILT_SYSEX=0x2 FILT_CLOCK=0x4 FILT_PLAY=0x8 FILT_F9=0x10 FILT_TICK=0x10 FILT_FD=0x20 FILT_UNDEFINED=0x30 FILT_RESET=0x40 FILT_REALTIME=0x7F FILT_NOTE=0x80 FILT_CHANNEL_AFTERTOUCH=0x100 FILT_POLY_AFTERTOUCH=0x200 FILT_AFTERTOUCH=0x300 FILT_PROGRAM=0x400 FILT_CONTROL=0x800 FILT_PITCHBEND=0x1000 FILT_MTC=0x2000 FILT_SONG_POSITION=0x4000 FILT_SONG_SELECT=0x8000 FILT_TUNE=0x10000 FALSE=0 TRUE=1 def Initialize(): """ Initialize: call this first """ Pm_Initialize() Pt_Start(1, NULL, NULL) # /* equiv to TIME_START: start timer w/ ms accuracy */ def Terminate(): """ Terminate: call this to clean up Midi streams when done. If you do not call this on Windows machines when you are done with MIDI, your system may crash. """ Pm_Terminate() def GetDefaultInputDeviceID(): return Pm_GetDefaultInputDeviceID() def GetDefaultOutputDeviceID(): return Pm_GetDefaultOutputDeviceID() def CountDevices(): return Pm_CountDevices() def GetDeviceInfo(i): """ GetDeviceInfo(): returns 5 parameters - underlying MIDI API - device name - TRUE iff input is available - TRUE iff output is available - TRUE iff device stream is already open """ cdef PmDeviceInfo *info # disregarding the constness from Pm_GetDeviceInfo, since pyrex doesn't do const. info = Pm_GetDeviceInfo(i) if info <> NULL: return info.interf, info.name, info.input, info.output, info.opened else: return def Time(): """ Time() returns the current time in ms of the PortMidi timer """ return Pt_Time() def GetErrorText(err): """ GetErrorText() returns human-readable error messages translated from error numbers """ return Pm_GetErrorText(err) def Channel(chan): """ Channel() is used with ChannelMask on input MIDI streams. Example: to receive input on channels 1 and 10 on a MIDI stream called MidiIn: MidiIn.SetChannelMask(pypm.Channel(1) | pypm.Channel(10)) note: PyPortMidi Channel function has been altered from the original PortMidi c call to correct for what seems to be a bug --- i.e. channel filters were all numbered from 0 to 15 instead of 1 to 16. """ return Pm_Channel(chan-1) cdef class Output: """ class Output: define an output MIDI stream. Takes the form: x = pypm.Output(MidiOutputDevice, latency) latency is in ms. If latency = 0 then timestamps for output are ignored. """ cdef int i cdef PmStream *midi cdef int debug cdef int _aborted def __init__(self, OutputDevice, latency=0): cdef PmError err #cdef PtTimestamp (*PmPtr) () cdef PmTimeProcPtr PmPtr self.i = OutputDevice self.debug = 0 self._aborted = 0 if latency == 0: PmPtr = NULL else: PmPtr = &Pt_Time if self.debug: print "Opening Midi Output" # Why is bufferSize 0 here? err = Pm_OpenOutput(&(self.midi), self.i, NULL, 0, PmPtr, NULL, latency) if err < 0: s = Pm_GetErrorText(err) # Something's amiss here - if we try to throw an Exception # here, we crash. if not err == -10000: raise Exception,s else: print "Unable to open Midi OutputDevice=",OutputDevice," err=",s def __dealloc__(self): if self.debug: print "Closing MIDI output stream and destroying instance" #err = Pm_Abort(self.midi) #if err < 0: raise Exception, Pm_GetErrorText(err) err = Pm_Close(self.midi) if err < 0: raise Exception, Pm_GetErrorText(err) def _check_open(self): """ checks to see if the midi is open, and if not, raises an error. """ if self.midi == NULL: raise Exception, "midi Output not open." if self._aborted: raise Exception, "midi Output aborted. Need to call Close after Abort." def Close(self): """ Close() closes a midi stream, flushing any pending buffers. (PortMidi attempts to close open streams when the application exits -- this is particularly difficult under Windows.) """ #if not self.midi: # return err = Pm_Close(self.midi) if err < 0: raise Exception, Pm_GetErrorText(err) #self.midi = NULL def Abort(self): """ Abort() terminates outgoing messages immediately The caller should immediately close the output port; this call may result in transmission of a partial midi message. There is no abort for Midi input because the user can simply ignore messages in the buffer and close an input device at any time. """ #if not self.midi: # return err = Pm_Abort(self.midi) if err < 0: raise Exception, Pm_GetErrorText(err) self._aborted = 1 def Write(self, data): """ Write(data) output a series of MIDI information in the form of a list: Write([[[status <,data1><,data2><,data3>],timestamp], [[status <,data1><,data2><,data3>],timestamp],...]) fields are optional example: choose program change 1 at time 20000 and send note 65 with velocity 100 500 ms later. Write([[[0xc0,0,0],20000],[[0x90,60,100],20500]]) notes: 1. timestamps will be ignored if latency = 0. 2. To get a note to play immediately, send MIDI info with timestamp read from function Time. 3. understanding optional data fields: Write([[[0xc0,0,0],20000]]) is equivalent to Write([[[0xc0],20000]]) """ cdef PmEvent buffer[1024] cdef PmError err cdef int i self._check_open() if len(data) > 1024: raise IndexError, 'maximum list length is 1024' else: for loop1 in range(len(data)): if ((len(data[loop1][0]) > 4) | (len(data[loop1][0]) < 1)): raise IndexError, str(len(data[loop1][0]))+' arguments in event list' buffer[loop1].message = 0 for i in range(len(data[loop1][0])): buffer[loop1].message = buffer[loop1].message + ((data[loop1][0][i]&0xFF) << (8*i)) buffer[loop1].timestamp = data[loop1][1] if self.debug: print loop1," : ",buffer[loop1].message," : ",buffer[loop1].timestamp if self.debug: print "writing to midi buffer" err= Pm_Write(self.midi, buffer, len(data)) if err < 0: raise Exception, Pm_GetErrorText(err) def WriteShort(self, status, data1 = 0, data2 = 0): """ WriteShort(status <, data1><, data2>) output MIDI information of 3 bytes or less. data fields are optional status byte could be: 0xc0 = program change 0x90 = note on etc. data bytes are optional and assumed 0 if omitted example: note 65 on with velocity 100 WriteShort(0x90,65,100) """ cdef PmEvent buffer[1] cdef PmError err self._check_open() buffer[0].timestamp = Pt_Time() buffer[0].message = ((((data2) << 16) & 0xFF0000) | (((data1) << 8) & 0xFF00) | ((status) & 0xFF)) if self.debug: print "Writing to MIDI buffer" err = Pm_Write(self.midi, buffer, 1) # stream, buffer, length if err < 0 : raise Exception, Pm_GetErrorText(err) def WriteSysEx(self, when, msg): """ WriteSysEx(,) writes a timestamped system-exclusive midi message. can be a *list* or a *string* example: (assuming y is an input MIDI stream) y.WriteSysEx(0,'\\xF0\\x7D\\x10\\x11\\x12\\x13\\xF7') is equivalent to y.WriteSysEx(pypm.Time, [0xF0, 0x7D, 0x10, 0x11, 0x12, 0x13, 0xF7]) """ cdef PmError err cdef char *cmsg cdef PtTimestamp CurTime self._check_open() if type(msg) is list: msg = array.array('B',msg).tostring() # Markus Pfaff contribution cmsg = msg CurTime = Pt_Time() err = Pm_WriteSysEx(self.midi, when, cmsg) if err < 0 : raise Exception, Pm_GetErrorText(err) while Pt_Time() == CurTime: # wait for SysEx to go thru or...my pass # win32 machine crashes w/ multiple SysEx cdef class Input: """ class Input: define an input MIDI stream. Takes the form: x = pypm.Input(MidiInputDevice) """ cdef PmStream *midi cdef int debug cdef int i def __init__(self, InputDevice, buffersize=4096): cdef PmError err self.i = InputDevice self.debug = 0 err= Pm_OpenInput(&(self.midi),self.i,NULL,buffersize,&Pt_Time,NULL) if err < 0: raise Exception, Pm_GetErrorText(err) if self.debug: print "MIDI input opened." def __dealloc__(self): cdef PmError err if self.debug: print "Closing MIDI input stream and destroying instance" err = Pm_Close(self.midi) if err < 0: raise Exception, Pm_GetErrorText(err) def _check_open(self): """ checks to see if the midi is open, and if not, raises an error. """ if self.midi == NULL: raise Exception, "midi Input not open." def Close(self): """ Close() closes a midi stream, flushing any pending buffers. (PortMidi attempts to close open streams when the application exits -- this is particularly difficult under Windows.) """ #if not self.midi: # return err = Pm_Close(self.midi) if err < 0: raise Exception, Pm_GetErrorText(err) #self.midi = NULL def SetFilter(self, filters): """ SetFilter() sets filters on an open input stream to drop selected input types. By default, only active sensing messages are filtered. To prohibit, say, active sensing and sysex messages, call SetFilter(stream, FILT_ACTIVE | FILT_SYSEX); Filtering is useful when midi routing or midi thru functionality is being provided by the user application. For example, you may want to exclude timing messages (clock, MTC, start/stop/continue), while allowing note-related messages to pass. Or you may be using a sequencer or drum-machine for MIDI clock information but want to exclude any notes it may play. Note: SetFilter empties the buffer after setting the filter, just in case anything got through. """ cdef PmEvent buffer[1] cdef PmError err self._check_open() err = Pm_SetFilter(self.midi, filters) if err < 0: raise Exception, Pm_GetErrorText(err) while(Pm_Poll(self.midi) != pmNoError): err = Pm_Read(self.midi,buffer,1) if err < 0: raise Exception, Pm_GetErrorText(err) def SetChannelMask(self, mask): """ SetChannelMask() filters incoming messages based on channel. The mask is a 16-bit bitfield corresponding to appropriate channels Channel() can assist in calling this function. i.e. to set receive only input on channel 1, call with SetChannelMask(Channel(1)) Multiple channels should be OR'd together, like SetChannelMask(Channel(10) | Channel(11)) note: PyPortMidi Channel function has been altered from the original PortMidi c call to correct for what seems to be a bug --- i.e. channel filters were all numbered from 0 to 15 instead of 1 to 16. """ cdef PmError err self._check_open() err = Pm_SetChannelMask(self.midi,mask) if err < 0: raise Exception, Pm_GetErrorText(err) def Poll(self): """ Poll tests whether input is available, returning TRUE, FALSE, or an error value. """ cdef PmError err self._check_open() err = Pm_Poll(self.midi) if err < 0: raise Exception, Pm_GetErrorText(err) return err def Read(self,length): """ Read(length): returns up to midi events stored in the buffer and returns them as a list: [[[status,data1,data2,data3],timestamp], [[status,data1,data2,data3],timestamp],...] example: Read(50) returns all the events in the buffer, up to 50 events. """ cdef PmEvent buffer[1024] self._check_open() x = [] if length > 1024: raise IndexError, 'maximum buffer length is 1024' if length < 1: raise IndexError, 'minimum buffer length is 1' NumEvents = Pm_Read(self.midi,buffer,length) if NumEvents < 0: raise Exception, Pm_GetErrorText(NumEvents) x=[] if NumEvents >= 1: for loop in range(NumEvents): x.append([[buffer[loop].message & 0xff, (buffer[loop].message >> 8) & 0xFF, (buffer[loop].message >> 16) & 0xFF, (buffer[loop].message >> 24) & 0xFF], buffer[loop].timestamp]) return x pygame-1.9.1release/src/pypm.c0000644000175000017500000063040411210671750016172 0ustar vincentvincent/* Generated by Cython 0.11.2 on Mon Jun 1 16:21:31 2009 */ #define PY_SSIZE_T_CLEAN #include "Python.h" #include "structmember.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #if PY_VERSION_HEX < 0x02040000 #define METH_COEXIST 0 #define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type) #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) PyInt_AsLong(o) #define PyNumber_Index(o) PyNumber_Int(o) #define PyIndex_Check(o) PyNumber_Check(o) #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__" #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #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_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyString_Type PyBytes_Type #define PyString_CheckExact PyBytes_CheckExact #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 #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define PyBytes_Type PyString_Type #endif #if PY_MAJOR_VERSION >= 3 #define PyMethod_New(func, self, klass) PyInstanceMethod_New(func) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #else #define _USE_MATH_DEFINES #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 #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #include #define __PYX_HAVE_API__pypm #include "portmidi.h" #include "porttime.h" #define __PYX_USE_C99_COMPLEX defined(_Complex_I) #ifdef __GNUC__ #define INLINE __inline__ #elif _WIN32 #define INLINE __inline #else #define INLINE #endif typedef struct {PyObject **p; char *s; long n; char is_unicode; char intern; char is_identifier;} __Pyx_StringTabEntry; /*proto*/ static int __pyx_skip_dispatch = 0; /* Type Conversion Predeclarations */ #if PY_MAJOR_VERSION < 3 #define __Pyx_PyBytes_FromString PyString_FromString #define __Pyx_PyBytes_FromStringAndSize PyString_FromStringAndSize #define __Pyx_PyBytes_AsString PyString_AsString #else #define __Pyx_PyBytes_FromString PyBytes_FromString #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize #define __Pyx_PyBytes_AsString PyBytes_AsString #endif #define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False)) static INLINE int __Pyx_PyObject_IsTrue(PyObject*); static INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x); #if !defined(T_PYSSIZET) #if PY_VERSION_HEX < 0x02050000 #define T_PYSSIZET T_INT #elif !defined(T_LONGLONG) #define T_PYSSIZET \ ((sizeof(Py_ssize_t) == sizeof(int)) ? T_INT : \ ((sizeof(Py_ssize_t) == sizeof(long)) ? T_LONG : -1)) #else #define T_PYSSIZET \ ((sizeof(Py_ssize_t) == sizeof(int)) ? T_INT : \ ((sizeof(Py_ssize_t) == sizeof(long)) ? T_LONG : \ ((sizeof(Py_ssize_t) == sizeof(PY_LONG_LONG)) ? T_LONGLONG : -1))) #endif #endif #if !defined(T_SIZET) #if !defined(T_ULONGLONG) #define T_SIZET \ ((sizeof(size_t) == sizeof(unsigned int)) ? T_UINT : \ ((sizeof(size_t) == sizeof(unsigned long)) ? T_ULONG : -1)) #else #define T_SIZET \ ((sizeof(size_t) == sizeof(unsigned int)) ? T_UINT : \ ((sizeof(size_t) == sizeof(unsigned long)) ? T_ULONG : \ ((sizeof(size_t) == sizeof(unsigned PY_LONG_LONG)) ? T_ULONGLONG : -1))) #endif #endif static INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); static 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 int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; static const char **__pyx_f; #ifdef 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* (*NewContext)(const char*, int, const char*); void (*FinishContext)(void**); } __Pyx_RefnannyAPIStruct; static __Pyx_RefnannyAPIStruct *__Pyx_Refnanny = NULL; #define __Pyx_ImportRefcountAPI(name) (__Pyx_RefnannyAPIStruct *) PyCObject_Import((char *)name, (char *)"RefnannyAPI") #define __Pyx_INCREF(r) __Pyx_Refnanny->INCREF(__pyx_refchk, (PyObject *)(r), __LINE__) #define __Pyx_DECREF(r) __Pyx_Refnanny->DECREF(__pyx_refchk, (PyObject *)(r), __LINE__) #define __Pyx_GOTREF(r) __Pyx_Refnanny->GOTREF(__pyx_refchk, (PyObject *)(r), __LINE__) #define __Pyx_GIVEREF(r) __Pyx_Refnanny->GIVEREF(__pyx_refchk, (PyObject *)(r), __LINE__) #define __Pyx_XDECREF(r) if((r) == NULL) ; else __Pyx_DECREF(r) #define __Pyx_SetupRefcountContext(name) void* __pyx_refchk = __Pyx_Refnanny->NewContext((name), __LINE__, __FILE__) #define __Pyx_FinishRefcountContext() __Pyx_Refnanny->FinishContext(&__pyx_refchk) #else #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_SetupRefcountContext(name) #define __Pyx_FinishRefcountContext() #endif /* CYTHON_REFNANNY */ #define __Pyx_XGIVEREF(r) if((r) == NULL) ; else __Pyx_GIVEREF(r) #define __Pyx_XGOTREF(r) if((r) == NULL) ; else __Pyx_GOTREF(r) static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_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_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name); /*proto*/ static 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, size <= sizeof(long)) : \ __Pyx_GetItemInt_Generic(o, to_py_func(i))) static INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, int fits_long) { if (likely(o != Py_None)) { 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, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i)); } #define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \ __Pyx_GetItemInt_Tuple_Fast(o, i, size <= sizeof(long)) : \ __Pyx_GetItemInt_Generic(o, to_py_func(i))) static INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, int fits_long) { if (likely(o != Py_None)) { 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, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i)); } #define __Pyx_GetItemInt(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \ __Pyx_GetItemInt_Fast(o, i, size <= sizeof(long)) : \ __Pyx_GetItemInt_Generic(o, to_py_func(i))) static INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int fits_long) { PyObject *r; if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) { r = PyList_GET_ITEM(o, i); Py_INCREF(r); } else if (PyTuple_CheckExact(o) && ((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { r = PyTuple_GET_ITEM(o, i); Py_INCREF(r); } else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0))) { r = PySequence_GetItem(o, i); } else { r = __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i)); } return r; } static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/ static int __Pyx_Print(PyObject *, int); /*proto*/ #if PY_MAJOR_VERSION >= 3 static PyObject* __pyx_print = 0; static PyObject* __pyx_print_kwargs = 0; #endif static int __Pyx_PrintOne(PyObject *o); /*proto*/ static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ static INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ static INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/ static INLINE PyObject* __Pyx_PyObject_Append(PyObject* L, PyObject* x) { if (likely(PyList_CheckExact(L))) { if (PyList_Append(L, x) < 0) return NULL; Py_INCREF(Py_None); return Py_None; /* this is just to have an accurate signature */ } else { PyObject *r, *m; m = __Pyx_GetAttrString(L, "append"); if (!m) return NULL; r = PyObject_CallFunctionObjArgs(m, x, NULL); Py_DECREF(m); return r; } } static INLINE int __Pyx_StrEq(const char *, const char *); /*proto*/ static INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *); static INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *); static INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *); static INLINE char __Pyx_PyInt_AsChar(PyObject *); static INLINE short __Pyx_PyInt_AsShort(PyObject *); static INLINE int __Pyx_PyInt_AsInt(PyObject *); static INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *); static INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *); static INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *); static INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *); static INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *); static INLINE long __Pyx_PyInt_AsLong(PyObject *); static INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *); static INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *); static INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *); static void __Pyx_AddTraceback(const char *funcname); /*proto*/ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/ /* Type declarations */ /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":201 * return Pm_Channel(chan-1) * * cdef class Output: # <<<<<<<<<<<<<< * """ * class Output: */ struct __pyx_obj_4pypm_Output { PyObject_HEAD int i; PmStream *midi; int debug; int _aborted; }; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":394 * * * cdef class Input: # <<<<<<<<<<<<<< * """ * class Input: */ struct __pyx_obj_4pypm_Input { PyObject_HEAD PmStream *midi; int debug; int i; }; /* Module declarations from pypm */ static PyTypeObject *__pyx_ptype_4pypm_Output = 0; static PyTypeObject *__pyx_ptype_4pypm_Input = 0; #define __Pyx_MODULE_NAME "pypm" int __pyx_module_is_main_pypm = 0; /* Implementation of pypm */ static char __pyx_k_3[] = "0.05"; static PyObject *__pyx_int_0x1; static PyObject *__pyx_int_0x2; static PyObject *__pyx_int_0x4; static PyObject *__pyx_int_0x8; static PyObject *__pyx_int_0x10; static PyObject *__pyx_int_0x20; static PyObject *__pyx_int_0x30; static PyObject *__pyx_int_0x40; static PyObject *__pyx_int_0x7F; static PyObject *__pyx_int_0x80; static PyObject *__pyx_int_0x100; static PyObject *__pyx_int_0x200; static PyObject *__pyx_int_0x300; static PyObject *__pyx_int_0x400; static PyObject *__pyx_int_0x800; static PyObject *__pyx_int_0x1000; static PyObject *__pyx_int_0x2000; static PyObject *__pyx_int_0x4000; static PyObject *__pyx_int_0x8000; static PyObject *__pyx_int_0x10000; static PyObject *__pyx_int_0; static PyObject *__pyx_int_1; static PyObject *__pyx_int_4096; static PyObject *__pyx_int_0xFF; static PyObject *__pyx_int_16; static PyObject *__pyx_int_0xFF0000; static PyObject *__pyx_int_8; static PyObject *__pyx_int_0xFF00; static PyObject *__pyx_int_1024; static char __pyx_k___main__[] = "__main__"; static PyObject *__pyx_kp___main__; static char __pyx_k___init__[] = "__init__"; static PyObject *__pyx_kp___init__; static char __pyx_k___dealloc__[] = "__dealloc__"; static PyObject *__pyx_kp___dealloc__; static char __pyx_k__check_open[] = "_check_open"; static PyObject *__pyx_kp__check_open; static char __pyx_k_Close[] = "Close"; static PyObject *__pyx_kp_Close; static char __pyx_k_Abort[] = "Abort"; static PyObject *__pyx_kp_Abort; static char __pyx_k_Write[] = "Write"; static PyObject *__pyx_kp_Write; static char __pyx_k_WriteShort[] = "WriteShort"; static PyObject *__pyx_kp_WriteShort; static char __pyx_k_WriteSysEx[] = "WriteSysEx"; static PyObject *__pyx_kp_WriteSysEx; static char __pyx_k_SetFilter[] = "SetFilter"; static PyObject *__pyx_kp_SetFilter; static char __pyx_k_SetChannelMask[] = "SetChannelMask"; static PyObject *__pyx_kp_SetChannelMask; static char __pyx_k_Poll[] = "Poll"; static PyObject *__pyx_kp_Poll; static char __pyx_k_Read[] = "Read"; static PyObject *__pyx_kp_Read; static char __pyx_k_i[] = "i"; static PyObject *__pyx_kp_i; static char __pyx_k_err[] = "err"; static PyObject *__pyx_kp_err; static char __pyx_k_chan[] = "chan"; static PyObject *__pyx_kp_chan; static char __pyx_k_OutputDevice[] = "OutputDevice"; static PyObject *__pyx_kp_OutputDevice; static char __pyx_k_latency[] = "latency"; static PyObject *__pyx_kp_latency; static char __pyx_k_data[] = "data"; static PyObject *__pyx_kp_data; static char __pyx_k_status[] = "status"; static PyObject *__pyx_kp_status; static char __pyx_k_1[] = "data1"; static PyObject *__pyx_kp_1; static char __pyx_k_2[] = "data2"; static PyObject *__pyx_kp_2; static char __pyx_k_when[] = "when"; static PyObject *__pyx_kp_when; static char __pyx_k_msg[] = "msg"; static PyObject *__pyx_kp_msg; static char __pyx_k_InputDevice[] = "InputDevice"; static PyObject *__pyx_kp_InputDevice; static char __pyx_k_buffersize[] = "buffersize"; static PyObject *__pyx_kp_buffersize; static char __pyx_k_filters[] = "filters"; static PyObject *__pyx_kp_filters; static char __pyx_k_mask[] = "mask"; static PyObject *__pyx_kp_mask; static char __pyx_k_length[] = "length"; static PyObject *__pyx_kp_length; static char __pyx_k___version__[] = "__version__"; static PyObject *__pyx_kp___version__; static char __pyx_k_array[] = "array"; static PyObject *__pyx_kp_array; static char __pyx_k_FILT_ACTIVE[] = "FILT_ACTIVE"; static PyObject *__pyx_kp_FILT_ACTIVE; static char __pyx_k_FILT_SYSEX[] = "FILT_SYSEX"; static PyObject *__pyx_kp_FILT_SYSEX; static char __pyx_k_FILT_CLOCK[] = "FILT_CLOCK"; static PyObject *__pyx_kp_FILT_CLOCK; static char __pyx_k_FILT_PLAY[] = "FILT_PLAY"; static PyObject *__pyx_kp_FILT_PLAY; static char __pyx_k_4[] = "FILT_F9"; static PyObject *__pyx_kp_4; static char __pyx_k_FILT_TICK[] = "FILT_TICK"; static PyObject *__pyx_kp_FILT_TICK; static char __pyx_k_FILT_FD[] = "FILT_FD"; static PyObject *__pyx_kp_FILT_FD; static char __pyx_k_FILT_UNDEFINED[] = "FILT_UNDEFINED"; static PyObject *__pyx_kp_FILT_UNDEFINED; static char __pyx_k_FILT_RESET[] = "FILT_RESET"; static PyObject *__pyx_kp_FILT_RESET; static char __pyx_k_FILT_REALTIME[] = "FILT_REALTIME"; static PyObject *__pyx_kp_FILT_REALTIME; static char __pyx_k_FILT_NOTE[] = "FILT_NOTE"; static PyObject *__pyx_kp_FILT_NOTE; static char __pyx_k_5[] = "FILT_CHANNEL_AFTERTOUCH"; static PyObject *__pyx_kp_5; static char __pyx_k_6[] = "FILT_POLY_AFTERTOUCH"; static PyObject *__pyx_kp_6; static char __pyx_k_FILT_AFTERTOUCH[] = "FILT_AFTERTOUCH"; static PyObject *__pyx_kp_FILT_AFTERTOUCH; static char __pyx_k_FILT_PROGRAM[] = "FILT_PROGRAM"; static PyObject *__pyx_kp_FILT_PROGRAM; static char __pyx_k_FILT_CONTROL[] = "FILT_CONTROL"; static PyObject *__pyx_kp_FILT_CONTROL; static char __pyx_k_FILT_PITCHBEND[] = "FILT_PITCHBEND"; static PyObject *__pyx_kp_FILT_PITCHBEND; static char __pyx_k_FILT_MTC[] = "FILT_MTC"; static PyObject *__pyx_kp_FILT_MTC; static char __pyx_k_FILT_SONG_POSITION[] = "FILT_SONG_POSITION"; static PyObject *__pyx_kp_FILT_SONG_POSITION; static char __pyx_k_FILT_SONG_SELECT[] = "FILT_SONG_SELECT"; static PyObject *__pyx_kp_FILT_SONG_SELECT; static char __pyx_k_FILT_TUNE[] = "FILT_TUNE"; static PyObject *__pyx_kp_FILT_TUNE; static char __pyx_k_FALSE[] = "FALSE"; static PyObject *__pyx_kp_FALSE; static char __pyx_k_TRUE[] = "TRUE"; static PyObject *__pyx_kp_TRUE; static char __pyx_k_Exception[] = "Exception"; static PyObject *__pyx_kp_Exception; static char __pyx_k_IndexError[] = "IndexError"; static PyObject *__pyx_kp_IndexError; static char __pyx_k_range[] = "range"; static PyObject *__pyx_kp_range; static char __pyx_k_19[] = "B"; static PyObject *__pyx_kp_19; static char __pyx_k_tostring[] = "tostring"; static PyObject *__pyx_kp_tostring; static char __pyx_k_append[] = "append"; static PyObject *__pyx_kp_append; static PyObject *__pyx_kp_3; static PyObject *__pyx_builtin_Exception; static PyObject *__pyx_builtin_IndexError; static PyObject *__pyx_builtin_range; static PyObject *__pyx_kp_7; static PyObject *__pyx_kp_8; static PyObject *__pyx_kp_9; static char __pyx_k_7[] = "Opening Midi Output"; static char __pyx_k_8[] = "Unable to open Midi OutputDevice="; static char __pyx_k_9[] = " err="; static PyObject *__pyx_kp_10; static char __pyx_k_10[] = "Closing MIDI output stream and destroying instance"; static PyObject *__pyx_kp_11; static PyObject *__pyx_kp_12; static char __pyx_k_11[] = "midi Output not open."; static char __pyx_k_12[] = "midi Output aborted. Need to call Close after Abort."; static PyObject *__pyx_kp_13; static PyObject *__pyx_kp_14; static PyObject *__pyx_kp_15; static PyObject *__pyx_kp_16; static PyObject *__pyx_kp_17; static char __pyx_k_13[] = "maximum list length is 1024"; static char __pyx_k_14[] = " arguments in event list"; static char __pyx_k_15[] = " : "; static char __pyx_k_16[] = " : "; static char __pyx_k_17[] = "writing to midi buffer"; static PyObject *__pyx_kp_18; static char __pyx_k_18[] = "Writing to MIDI buffer"; static PyObject *__pyx_kp_20; static char __pyx_k_20[] = "MIDI input opened."; static PyObject *__pyx_kp_21; static char __pyx_k_21[] = "Closing MIDI input stream and destroying instance"; static PyObject *__pyx_kp_22; static char __pyx_k_22[] = "midi Input not open."; static PyObject *__pyx_kp_23; static PyObject *__pyx_kp_24; static char __pyx_k_23[] = "maximum buffer length is 1024"; static char __pyx_k_24[] = "minimum buffer length is 1"; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":132 * TRUE=1 * * def Initialize(): # <<<<<<<<<<<<<< * """ * Initialize: call this first */ static PyObject *__pyx_pf_4pypm_Initialize(PyObject *__pyx_self, PyObject *unused); /*proto*/ static char __pyx_doc_4pypm_Initialize[] = "\nInitialize: call this first\n "; static PyObject *__pyx_pf_4pypm_Initialize(PyObject *__pyx_self, PyObject *unused) { PyObject *__pyx_r = NULL; __Pyx_SetupRefcountContext("Initialize"); __pyx_self = __pyx_self; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":136 * Initialize: call this first * """ * Pm_Initialize() # <<<<<<<<<<<<<< * Pt_Start(1, NULL, NULL) # /[inserted by cython to avoid comment start]* equiv to TIME_START: start timer w/ ms accuracy *[inserted by cython to avoid comment closer]/ * */ Pm_Initialize(); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":137 * """ * Pm_Initialize() * Pt_Start(1, NULL, NULL) # /[inserted by cython to avoid comment start]* equiv to TIME_START: start timer w/ ms accuracy *[inserted by cython to avoid comment closer]/ # <<<<<<<<<<<<<< * * def Terminate(): */ Pt_Start(1, NULL, NULL); __pyx_r = Py_None; __Pyx_INCREF(Py_None); __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":139 * Pt_Start(1, NULL, NULL) # /[inserted by cython to avoid comment start]* equiv to TIME_START: start timer w/ ms accuracy *[inserted by cython to avoid comment closer]/ * * def Terminate(): # <<<<<<<<<<<<<< * """ * Terminate: call this to clean up Midi streams when done. */ static PyObject *__pyx_pf_4pypm_Terminate(PyObject *__pyx_self, PyObject *unused); /*proto*/ static char __pyx_doc_4pypm_Terminate[] = "\nTerminate: call this to clean up Midi streams when done.\nIf you do not call this on Windows machines when you are\ndone with MIDI, your system may crash.\n "; static PyObject *__pyx_pf_4pypm_Terminate(PyObject *__pyx_self, PyObject *unused) { PyObject *__pyx_r = NULL; __Pyx_SetupRefcountContext("Terminate"); __pyx_self = __pyx_self; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":145 * done with MIDI, your system may crash. * """ * Pm_Terminate() # <<<<<<<<<<<<<< * * def GetDefaultInputDeviceID(): */ Pm_Terminate(); __pyx_r = Py_None; __Pyx_INCREF(Py_None); __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":147 * Pm_Terminate() * * def GetDefaultInputDeviceID(): # <<<<<<<<<<<<<< * return Pm_GetDefaultInputDeviceID() * */ static PyObject *__pyx_pf_4pypm_GetDefaultInputDeviceID(PyObject *__pyx_self, PyObject *unused); /*proto*/ static PyObject *__pyx_pf_4pypm_GetDefaultInputDeviceID(PyObject *__pyx_self, PyObject *unused) { PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; __Pyx_SetupRefcountContext("GetDefaultInputDeviceID"); __pyx_self = __pyx_self; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":148 * * def GetDefaultInputDeviceID(): * return Pm_GetDefaultInputDeviceID() # <<<<<<<<<<<<<< * * def GetDefaultOutputDeviceID(): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyInt_FromLong(Pm_GetDefaultInputDeviceID()); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __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("pypm.GetDefaultInputDeviceID"); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":150 * return Pm_GetDefaultInputDeviceID() * * def GetDefaultOutputDeviceID(): # <<<<<<<<<<<<<< * return Pm_GetDefaultOutputDeviceID() * */ static PyObject *__pyx_pf_4pypm_GetDefaultOutputDeviceID(PyObject *__pyx_self, PyObject *unused); /*proto*/ static PyObject *__pyx_pf_4pypm_GetDefaultOutputDeviceID(PyObject *__pyx_self, PyObject *unused) { PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; __Pyx_SetupRefcountContext("GetDefaultOutputDeviceID"); __pyx_self = __pyx_self; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":151 * * def GetDefaultOutputDeviceID(): * return Pm_GetDefaultOutputDeviceID() # <<<<<<<<<<<<<< * * def CountDevices(): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyInt_FromLong(Pm_GetDefaultOutputDeviceID()); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __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("pypm.GetDefaultOutputDeviceID"); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":153 * return Pm_GetDefaultOutputDeviceID() * * def CountDevices(): # <<<<<<<<<<<<<< * return Pm_CountDevices() * */ static PyObject *__pyx_pf_4pypm_CountDevices(PyObject *__pyx_self, PyObject *unused); /*proto*/ static PyObject *__pyx_pf_4pypm_CountDevices(PyObject *__pyx_self, PyObject *unused) { PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; __Pyx_SetupRefcountContext("CountDevices"); __pyx_self = __pyx_self; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":154 * * def CountDevices(): * return Pm_CountDevices() # <<<<<<<<<<<<<< * * def GetDeviceInfo(i): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyInt_FromLong(Pm_CountDevices()); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __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("pypm.CountDevices"); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":156 * return Pm_CountDevices() * * def GetDeviceInfo(i): # <<<<<<<<<<<<<< * """ * GetDeviceInfo(): returns 5 parameters */ static PyObject *__pyx_pf_4pypm_GetDeviceInfo(PyObject *__pyx_self, PyObject *__pyx_v_i); /*proto*/ static char __pyx_doc_4pypm_GetDeviceInfo[] = "\nGetDeviceInfo(): returns 5 parameters\n - underlying MIDI API\n - device name\n - TRUE iff input is available\n - TRUE iff output is available\n - TRUE iff device stream is already open\n "; static PyObject *__pyx_pf_4pypm_GetDeviceInfo(PyObject *__pyx_self, PyObject *__pyx_v_i) { PmDeviceInfo *__pyx_v_info; PyObject *__pyx_r = NULL; PmDeviceID __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; __Pyx_SetupRefcountContext("GetDeviceInfo"); __pyx_self = __pyx_self; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":168 * * # disregarding the constness from Pm_GetDeviceInfo, since pyrex doesn't do const. * info = Pm_GetDeviceInfo(i) # <<<<<<<<<<<<<< * * if info <> NULL: return info.interf, info.name, info.input, info.output, info.opened */ __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_info = ((PmDeviceInfo *)Pm_GetDeviceInfo(__pyx_t_1)); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":170 * info = Pm_GetDeviceInfo(i) * * if info <> NULL: return info.interf, info.name, info.input, info.output, info.opened # <<<<<<<<<<<<<< * else: return * */ __pyx_t_2 = (__pyx_v_info != NULL); if (__pyx_t_2) { __Pyx_XDECREF(__pyx_r); __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_info->interf); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_info->name); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = PyInt_FromLong(__pyx_v_info->input); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = PyInt_FromLong(__pyx_v_info->output); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __pyx_t_7 = PyInt_FromLong(__pyx_v_info->opened); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __pyx_t_8 = PyTuple_New(5); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_8)); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_8, 4, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); __pyx_t_3 = 0; __pyx_t_4 = 0; __pyx_t_5 = 0; __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_r = ((PyObject *)__pyx_t_8); __pyx_t_8 = 0; goto __pyx_L0; goto __pyx_L5; } /*else*/ { /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":171 * * if info <> NULL: return info.interf, info.name, info.input, info.output, info.opened * else: return # <<<<<<<<<<<<<< * * def Time(): */ __Pyx_XDECREF(__pyx_r); __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; } __pyx_L5:; __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_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_AddTraceback("pypm.GetDeviceInfo"); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":173 * else: return * * def Time(): # <<<<<<<<<<<<<< * """ * Time() returns the current time in ms */ static PyObject *__pyx_pf_4pypm_Time(PyObject *__pyx_self, PyObject *unused); /*proto*/ static char __pyx_doc_4pypm_Time[] = "\nTime() returns the current time in ms\nof the PortMidi timer\n "; static PyObject *__pyx_pf_4pypm_Time(PyObject *__pyx_self, PyObject *unused) { PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; __Pyx_SetupRefcountContext("Time"); __pyx_self = __pyx_self; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":178 * of the PortMidi timer * """ * return Pt_Time() # <<<<<<<<<<<<<< * * def GetErrorText(err): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyInt_FromLong(Pt_Time()); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __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("pypm.Time"); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":180 * return Pt_Time() * * def GetErrorText(err): # <<<<<<<<<<<<<< * """ * GetErrorText() returns human-readable error */ static PyObject *__pyx_pf_4pypm_GetErrorText(PyObject *__pyx_self, PyObject *__pyx_v_err); /*proto*/ static char __pyx_doc_4pypm_GetErrorText[] = "\nGetErrorText() returns human-readable error\nmessages translated from error numbers\n "; static PyObject *__pyx_pf_4pypm_GetErrorText(PyObject *__pyx_self, PyObject *__pyx_v_err) { PyObject *__pyx_r = NULL; PmError __pyx_t_1; PyObject *__pyx_t_2 = NULL; __Pyx_SetupRefcountContext("GetErrorText"); __pyx_self = __pyx_self; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":185 * messages translated from error numbers * """ * return Pm_GetErrorText(err) # <<<<<<<<<<<<<< * * def Channel(chan): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = ((PmError)PyInt_AsLong(__pyx_v_err)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("pypm.GetErrorText"); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":187 * return Pm_GetErrorText(err) * * def Channel(chan): # <<<<<<<<<<<<<< * """ * Channel() is used with ChannelMask on input MIDI streams. */ static PyObject *__pyx_pf_4pypm_Channel(PyObject *__pyx_self, PyObject *__pyx_v_chan); /*proto*/ static char __pyx_doc_4pypm_Channel[] = "\nChannel() is used with ChannelMask on input MIDI streams.\nExample: to receive input on channels 1 and 10 on a MIDI\n stream called MidiIn:\nMidiIn.SetChannelMask(pypm.Channel(1) | pypm.Channel(10))\n\nnote: PyPortMidi Channel function has been altered from\n the original PortMidi c call to correct for what\n seems to be a bug --- i.e. channel filters were\n all numbered from 0 to 15 instead of 1 to 16.\n "; static PyObject *__pyx_pf_4pypm_Channel(PyObject *__pyx_self, PyObject *__pyx_v_chan) { PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; int __pyx_t_2; __Pyx_SetupRefcountContext("Channel"); __pyx_self = __pyx_self; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":199 * all numbered from 0 to 15 instead of 1 to 16. * """ * return Pm_Channel(chan-1) # <<<<<<<<<<<<<< * * cdef class Output: */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyNumber_Subtract(__pyx_v_chan, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyInt_FromLong(Pm_Channel(__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __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("pypm.Channel"); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":214 * cdef int _aborted * * def __init__(self, OutputDevice, latency=0): # <<<<<<<<<<<<<< * * cdef PmError err */ static int __pyx_pf_4pypm_6Output___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pf_4pypm_6Output___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_OutputDevice = 0; PyObject *__pyx_v_latency = 0; PmError __pyx_v_err; PmTimeProcPtr __pyx_v_PmPtr; PyObject *__pyx_v_s; int __pyx_r; int __pyx_t_1; PyObject *__pyx_t_2 = NULL; int __pyx_t_3; long __pyx_t_4; static PyObject **__pyx_pyargnames[] = {&__pyx_kp_OutputDevice,&__pyx_kp_latency,0}; __Pyx_SetupRefcountContext("__init__"); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args = PyDict_Size(__pyx_kwds); PyObject* values[2] = {0,0}; values[1] = __pyx_int_0; 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); case 0: break; default: goto __pyx_L5_argtuple_error; } switch (PyTuple_GET_SIZE(__pyx_args)) { case 0: values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_OutputDevice); if (likely(values[0])) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (kw_args > 1) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_latency); if (unlikely(value)) { values[1] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } __pyx_v_OutputDevice = values[0]; __pyx_v_latency = values[1]; } else { __pyx_v_latency = __pyx_int_0; switch (PyTuple_GET_SIZE(__pyx_args)) { case 2: __pyx_v_latency = PyTuple_GET_ITEM(__pyx_args, 1); case 1: __pyx_v_OutputDevice = PyTuple_GET_ITEM(__pyx_args, 0); break; default: goto __pyx_L5_argtuple_error; } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("pypm.Output.__init__"); return -1; __pyx_L4_argument_unpacking_done:; __pyx_v_s = Py_None; __Pyx_INCREF(Py_None); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":220 * cdef PmTimeProcPtr PmPtr * * self.i = OutputDevice # <<<<<<<<<<<<<< * self.debug = 0 * self._aborted = 0 */ __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_OutputDevice); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;} ((struct __pyx_obj_4pypm_Output *)__pyx_v_self)->i = __pyx_t_1; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":221 * * self.i = OutputDevice * self.debug = 0 # <<<<<<<<<<<<<< * self._aborted = 0 * */ ((struct __pyx_obj_4pypm_Output *)__pyx_v_self)->debug = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":222 * self.i = OutputDevice * self.debug = 0 * self._aborted = 0 # <<<<<<<<<<<<<< * * if latency == 0: */ ((struct __pyx_obj_4pypm_Output *)__pyx_v_self)->_aborted = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":224 * self._aborted = 0 * * if latency == 0: # <<<<<<<<<<<<<< * PmPtr = NULL * else: */ __pyx_t_2 = PyObject_RichCompare(__pyx_v_latency, __pyx_int_0, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (__pyx_t_3) { /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":225 * * if latency == 0: * PmPtr = NULL # <<<<<<<<<<<<<< * else: * PmPtr = &Pt_Time */ __pyx_v_PmPtr = NULL; goto __pyx_L6; } /*else*/ { /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":227 * PmPtr = NULL * else: * PmPtr = &Pt_Time # <<<<<<<<<<<<<< * if self.debug: print "Opening Midi Output" * # Why is bufferSize 0 here? */ __pyx_v_PmPtr = ((PmTimestamp (*)(void *))(&Pt_Time)); } __pyx_L6:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":228 * else: * PmPtr = &Pt_Time * if self.debug: print "Opening Midi Output" # <<<<<<<<<<<<<< * # Why is bufferSize 0 here? * err = Pm_OpenOutput(&(self.midi), self.i, NULL, 0, PmPtr, NULL, latency) */ __pyx_t_1 = ((struct __pyx_obj_4pypm_Output *)__pyx_v_self)->debug; if (__pyx_t_1) { if (__Pyx_PrintOne(__pyx_kp_7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L7; } __pyx_L7:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":230 * if self.debug: print "Opening Midi Output" * # Why is bufferSize 0 here? * err = Pm_OpenOutput(&(self.midi), self.i, NULL, 0, PmPtr, NULL, latency) # <<<<<<<<<<<<<< * if err < 0: * s = Pm_GetErrorText(err) */ __pyx_t_4 = __Pyx_PyInt_AsLong(__pyx_v_latency); if (unlikely((__pyx_t_4 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_err = Pm_OpenOutput((&((struct __pyx_obj_4pypm_Output *)__pyx_v_self)->midi), ((struct __pyx_obj_4pypm_Output *)__pyx_v_self)->i, NULL, 0, __pyx_v_PmPtr, NULL, __pyx_t_4); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":231 * # Why is bufferSize 0 here? * err = Pm_OpenOutput(&(self.midi), self.i, NULL, 0, PmPtr, NULL, latency) * if err < 0: # <<<<<<<<<<<<<< * s = Pm_GetErrorText(err) * # Something's amiss here - if we try to throw an Exception */ __pyx_t_3 = (__pyx_v_err < 0); if (__pyx_t_3) { /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":232 * err = Pm_OpenOutput(&(self.midi), self.i, NULL, 0, PmPtr, NULL, latency) * if err < 0: * s = Pm_GetErrorText(err) # <<<<<<<<<<<<<< * # Something's amiss here - if we try to throw an Exception * # here, we crash. */ __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_v_s); __pyx_v_s = __pyx_t_2; __pyx_t_2 = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":235 * # Something's amiss here - if we try to throw an Exception * # here, we crash. * if not err == -10000: # <<<<<<<<<<<<<< * raise Exception,s * else: */ __pyx_t_3 = (!(__pyx_v_err == -10000)); if (__pyx_t_3) { /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":236 * # here, we crash. * if not err == -10000: * raise Exception,s # <<<<<<<<<<<<<< * else: * print "Unable to open Midi OutputDevice=",OutputDevice," err=",s */ __Pyx_Raise(__pyx_builtin_Exception, __pyx_v_s, 0); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L9; } /*else*/ { /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":238 * raise Exception,s * else: * print "Unable to open Midi OutputDevice=",OutputDevice," err=",s # <<<<<<<<<<<<<< * * def __dealloc__(self): */ __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_2)); __Pyx_INCREF(__pyx_kp_8); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_kp_8); __Pyx_GIVEREF(__pyx_kp_8); __Pyx_INCREF(__pyx_v_OutputDevice); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_OutputDevice); __Pyx_GIVEREF(__pyx_v_OutputDevice); __Pyx_INCREF(__pyx_kp_9); PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_kp_9); __Pyx_GIVEREF(__pyx_kp_9); __Pyx_INCREF(__pyx_v_s); PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_s); __Pyx_GIVEREF(__pyx_v_s); if (__Pyx_Print(((PyObject *)__pyx_t_2), 1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; } __pyx_L9:; goto __pyx_L8; } __pyx_L8:; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("pypm.Output.__init__"); __pyx_r = -1; __pyx_L0:; __Pyx_DECREF(__pyx_v_s); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":240 * print "Unable to open Midi OutputDevice=",OutputDevice," err=",s * * def __dealloc__(self): # <<<<<<<<<<<<<< * if self.debug: print "Closing MIDI output stream and destroying instance" * #err = Pm_Abort(self.midi) */ static void __pyx_pf_4pypm_6Output___dealloc__(PyObject *__pyx_v_self); /*proto*/ static void __pyx_pf_4pypm_6Output___dealloc__(PyObject *__pyx_v_self) { PyObject *__pyx_v_err; int __pyx_t_1; PyObject *__pyx_t_2 = NULL; int __pyx_t_3; PmError __pyx_t_4; __Pyx_SetupRefcountContext("__dealloc__"); __pyx_v_err = Py_None; __Pyx_INCREF(Py_None); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":241 * * def __dealloc__(self): * if self.debug: print "Closing MIDI output stream and destroying instance" # <<<<<<<<<<<<<< * #err = Pm_Abort(self.midi) * #if err < 0: raise Exception, Pm_GetErrorText(err) */ __pyx_t_1 = ((struct __pyx_obj_4pypm_Output *)__pyx_v_self)->debug; if (__pyx_t_1) { if (__Pyx_PrintOne(__pyx_kp_10) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L5; } __pyx_L5:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":244 * #err = Pm_Abort(self.midi) * #if err < 0: raise Exception, Pm_GetErrorText(err) * err = Pm_Close(self.midi) # <<<<<<<<<<<<<< * if err < 0: raise Exception, Pm_GetErrorText(err) * */ __pyx_t_2 = PyInt_FromLong(Pm_Close(((struct __pyx_obj_4pypm_Output *)__pyx_v_self)->midi)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 244; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_v_err); __pyx_v_err = __pyx_t_2; __pyx_t_2 = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":245 * #if err < 0: raise Exception, Pm_GetErrorText(err) * err = Pm_Close(self.midi) * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< * * */ __pyx_t_2 = PyObject_RichCompare(__pyx_v_err, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (__pyx_t_3) { __pyx_t_4 = ((PmError)PyInt_AsLong(__pyx_v_err)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_builtin_Exception, __pyx_t_2, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L6; } __pyx_L6:; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("pypm.Output.__dealloc__"); __pyx_L0:; __Pyx_DECREF(__pyx_v_err); __Pyx_FinishRefcountContext(); } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":248 * * * def _check_open(self): # <<<<<<<<<<<<<< * """ checks to see if the midi is open, and if not, raises an error. * """ */ static PyObject *__pyx_pf_4pypm_6Output__check_open(PyObject *__pyx_v_self, PyObject *unused); /*proto*/ static char __pyx_doc_4pypm_6Output__check_open[] = " checks to see if the midi is open, and if not, raises an error.\n "; static PyObject *__pyx_pf_4pypm_6Output__check_open(PyObject *__pyx_v_self, PyObject *unused) { PyObject *__pyx_r = NULL; int __pyx_t_1; int __pyx_t_2; __Pyx_SetupRefcountContext("_check_open"); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":252 * """ * * if self.midi == NULL: # <<<<<<<<<<<<<< * raise Exception, "midi Output not open." * */ __pyx_t_1 = (((struct __pyx_obj_4pypm_Output *)__pyx_v_self)->midi == NULL); if (__pyx_t_1) { /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":253 * * if self.midi == NULL: * raise Exception, "midi Output not open." # <<<<<<<<<<<<<< * * if self._aborted: */ __Pyx_Raise(__pyx_builtin_Exception, __pyx_kp_11, 0); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L5; } __pyx_L5:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":255 * raise Exception, "midi Output not open." * * if self._aborted: # <<<<<<<<<<<<<< * raise Exception, "midi Output aborted. Need to call Close after Abort." * */ __pyx_t_2 = ((struct __pyx_obj_4pypm_Output *)__pyx_v_self)->_aborted; if (__pyx_t_2) { /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":256 * * if self._aborted: * raise Exception, "midi Output aborted. Need to call Close after Abort." # <<<<<<<<<<<<<< * * def Close(self): */ __Pyx_Raise(__pyx_builtin_Exception, __pyx_kp_12, 0); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L6; } __pyx_L6:; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("pypm.Output._check_open"); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":258 * raise Exception, "midi Output aborted. Need to call Close after Abort." * * def Close(self): # <<<<<<<<<<<<<< * """ * Close() */ static PyObject *__pyx_pf_4pypm_6Output_Close(PyObject *__pyx_v_self, PyObject *unused); /*proto*/ static char __pyx_doc_4pypm_6Output_Close[] = "\nClose()\n closes a midi stream, flushing any pending buffers.\n (PortMidi attempts to close open streams when the application\n exits -- this is particularly difficult under Windows.)\n "; static PyObject *__pyx_pf_4pypm_6Output_Close(PyObject *__pyx_v_self, PyObject *unused) { PyObject *__pyx_v_err; PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; int __pyx_t_2; PmError __pyx_t_3; __Pyx_SetupRefcountContext("Close"); __pyx_v_err = Py_None; __Pyx_INCREF(Py_None); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":268 * # return * * err = Pm_Close(self.midi) # <<<<<<<<<<<<<< * if err < 0: * raise Exception, Pm_GetErrorText(err) */ __pyx_t_1 = PyInt_FromLong(Pm_Close(((struct __pyx_obj_4pypm_Output *)__pyx_v_self)->midi)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_v_err); __pyx_v_err = __pyx_t_1; __pyx_t_1 = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":269 * * err = Pm_Close(self.midi) * if err < 0: # <<<<<<<<<<<<<< * raise Exception, Pm_GetErrorText(err) * #self.midi = NULL */ __pyx_t_1 = PyObject_RichCompare(__pyx_v_err, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":270 * err = Pm_Close(self.midi) * if err < 0: * raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< * #self.midi = NULL * */ __pyx_t_3 = ((PmError)PyInt_AsLong(__pyx_v_err)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_1 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_builtin_Exception, __pyx_t_1, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L5; } __pyx_L5:; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("pypm.Output.Close"); __pyx_r = NULL; __pyx_L0:; __Pyx_DECREF(__pyx_v_err); __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":274 * * * def Abort(self): # <<<<<<<<<<<<<< * """ * Abort() terminates outgoing messages immediately */ static PyObject *__pyx_pf_4pypm_6Output_Abort(PyObject *__pyx_v_self, PyObject *unused); /*proto*/ static char __pyx_doc_4pypm_6Output_Abort[] = "\nAbort() terminates outgoing messages immediately\n The caller should immediately close the output port;\n this call may result in transmission of a partial midi message.\n There is no abort for Midi input because the user can simply\n ignore messages in the buffer and close an input device at\n any time.\n "; static PyObject *__pyx_pf_4pypm_6Output_Abort(PyObject *__pyx_v_self, PyObject *unused) { PyObject *__pyx_v_err; PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; int __pyx_t_2; PmError __pyx_t_3; __Pyx_SetupRefcountContext("Abort"); __pyx_v_err = Py_None; __Pyx_INCREF(Py_None); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":286 * # return * * err = Pm_Abort(self.midi) # <<<<<<<<<<<<<< * if err < 0: * raise Exception, Pm_GetErrorText(err) */ __pyx_t_1 = PyInt_FromLong(Pm_Abort(((struct __pyx_obj_4pypm_Output *)__pyx_v_self)->midi)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_v_err); __pyx_v_err = __pyx_t_1; __pyx_t_1 = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":287 * * err = Pm_Abort(self.midi) * if err < 0: # <<<<<<<<<<<<<< * raise Exception, Pm_GetErrorText(err) * */ __pyx_t_1 = PyObject_RichCompare(__pyx_v_err, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":288 * err = Pm_Abort(self.midi) * if err < 0: * raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< * * self._aborted = 1 */ __pyx_t_3 = ((PmError)PyInt_AsLong(__pyx_v_err)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_1 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_builtin_Exception, __pyx_t_1, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L5; } __pyx_L5:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":290 * raise Exception, Pm_GetErrorText(err) * * self._aborted = 1 # <<<<<<<<<<<<<< * * */ ((struct __pyx_obj_4pypm_Output *)__pyx_v_self)->_aborted = 1; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("pypm.Output.Abort"); __pyx_r = NULL; __pyx_L0:; __Pyx_DECREF(__pyx_v_err); __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":293 * * * def Write(self, data): # <<<<<<<<<<<<<< * """ * Write(data) */ static PyObject *__pyx_pf_4pypm_6Output_Write(PyObject *__pyx_v_self, PyObject *__pyx_v_data); /*proto*/ static char __pyx_doc_4pypm_6Output_Write[] = "\nWrite(data)\n output a series of MIDI information in the form of a list:\n Write([[[status <,data1><,data2><,data3>],timestamp],\n [[status <,data1><,data2><,data3>],timestamp],...])\n fields are optional\n example: choose program change 1 at time 20000 and\n send note 65 with velocity 100 500 ms later.\n Write([[[0xc0,0,0],20000],[[0x90,60,100],20500]])\n notes:\n 1. timestamps will be ignored if latency = 0.\n 2. To get a note to play immediately, send MIDI info with\n timestamp read from function Time.\n 3. understanding optional data fields:\n Write([[[0xc0,0,0],20000]]) is equivalent to\n Write([[[0xc0],20000]])\n "; static PyObject *__pyx_pf_4pypm_6Output_Write(PyObject *__pyx_v_self, PyObject *__pyx_v_data) { PmEvent __pyx_v_buffer[1024]; PmError __pyx_v_err; int __pyx_v_i; PyObject *__pyx_v_loop1; PyObject *__pyx_r = NULL; PyObject *__pyx_1 = 0; PyObject *__pyx_2 = 0; PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; Py_ssize_t __pyx_t_3; int __pyx_t_4; Py_ssize_t __pyx_t_5; Py_ssize_t __pyx_t_6; PyObject *__pyx_t_7 = NULL; int __pyx_t_8; PyObject *__pyx_t_9 = NULL; PyObject *__pyx_t_10 = NULL; PmMessage __pyx_t_11; PmTimestamp __pyx_t_12; __Pyx_SetupRefcountContext("Write"); __pyx_v_loop1 = Py_None; __Pyx_INCREF(Py_None); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":315 * cdef int i * * self._check_open() # <<<<<<<<<<<<<< * * */ __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_kp__check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":318 * * * if len(data) > 1024: raise IndexError, 'maximum list length is 1024' # <<<<<<<<<<<<<< * else: * for loop1 in range(len(data)): */ __pyx_t_3 = PyObject_Length(__pyx_v_data); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_4 = (__pyx_t_3 > 1024); if (__pyx_t_4) { __Pyx_Raise(__pyx_builtin_IndexError, __pyx_kp_13, 0); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L5; } /*else*/ { /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":320 * if len(data) > 1024: raise IndexError, 'maximum list length is 1024' * else: * for loop1 in range(len(data)): # <<<<<<<<<<<<<< * if ((len(data[loop1][0]) > 4) | * (len(data[loop1][0]) < 1)): */ __pyx_t_5 = PyObject_Length(__pyx_v_data); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_1)); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; if (PyList_CheckExact(__pyx_t_2) || PyTuple_CheckExact(__pyx_t_2)) { __pyx_t_3 = 0; __pyx_t_1 = __pyx_t_2; __Pyx_INCREF(__pyx_t_1); } else { __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; for (;;) { if (likely(PyList_CheckExact(__pyx_t_1))) { if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break; __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; } else if (likely(PyTuple_CheckExact(__pyx_t_1))) { if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break; __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; } else { __pyx_t_2 = PyIter_Next(__pyx_t_1); if (!__pyx_t_2) { if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;} break; } __Pyx_GOTREF(__pyx_t_2); } __Pyx_DECREF(__pyx_v_loop1); __pyx_v_loop1 = __pyx_t_2; __pyx_t_2 = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":321 * else: * for loop1 in range(len(data)): * if ((len(data[loop1][0]) > 4) | # <<<<<<<<<<<<<< * (len(data[loop1][0]) < 1)): * raise IndexError, str(len(data[loop1][0]))+' arguments in event list' */ __pyx_1 = PyObject_GetItem(__pyx_v_data, __pyx_v_loop1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 321; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_1); __pyx_2 = __Pyx_GetItemInt(__pyx_1, 0, sizeof(long), PyInt_FromLong); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 321; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_2); __Pyx_DECREF(__pyx_1); __pyx_1 = 0; __pyx_t_5 = PyObject_Length(__pyx_2); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 321; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_2); __pyx_2 = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":322 * for loop1 in range(len(data)): * if ((len(data[loop1][0]) > 4) | * (len(data[loop1][0]) < 1)): # <<<<<<<<<<<<<< * raise IndexError, str(len(data[loop1][0]))+' arguments in event list' * buffer[loop1].message = 0 */ __pyx_1 = PyObject_GetItem(__pyx_v_data, __pyx_v_loop1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_1); __pyx_2 = __Pyx_GetItemInt(__pyx_1, 0, sizeof(long), PyInt_FromLong); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_2); __Pyx_DECREF(__pyx_1); __pyx_1 = 0; __pyx_t_6 = PyObject_Length(__pyx_2); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_2); __pyx_2 = 0; __pyx_t_4 = ((__pyx_t_5 > 4) | (__pyx_t_6 < 1)); if (__pyx_t_4) { /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":323 * if ((len(data[loop1][0]) > 4) | * (len(data[loop1][0]) < 1)): * raise IndexError, str(len(data[loop1][0]))+' arguments in event list' # <<<<<<<<<<<<<< * buffer[loop1].message = 0 * for i in range(len(data[loop1][0])): */ __pyx_1 = PyObject_GetItem(__pyx_v_data, __pyx_v_loop1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_1); __pyx_2 = __Pyx_GetItemInt(__pyx_1, 0, sizeof(long), PyInt_FromLong); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_2); __Pyx_DECREF(__pyx_1); __pyx_1 = 0; __pyx_t_6 = PyObject_Length(__pyx_2); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_2); __pyx_2 = 0; __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_7)); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)&PyString_Type)), ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0; __pyx_t_7 = PyNumber_Add(__pyx_t_2, __pyx_kp_14); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_Raise(__pyx_builtin_IndexError, __pyx_t_7, 0); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L8; } __pyx_L8:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":324 * (len(data[loop1][0]) < 1)): * raise IndexError, str(len(data[loop1][0]))+' arguments in event list' * buffer[loop1].message = 0 # <<<<<<<<<<<<<< * for i in range(len(data[loop1][0])): * buffer[loop1].message = buffer[loop1].message + ((data[loop1][0][i]&0xFF) << (8*i)) */ __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop1); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;} (__pyx_v_buffer[__pyx_t_6]).message = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":325 * raise IndexError, str(len(data[loop1][0]))+' arguments in event list' * buffer[loop1].message = 0 * for i in range(len(data[loop1][0])): # <<<<<<<<<<<<<< * buffer[loop1].message = buffer[loop1].message + ((data[loop1][0][i]&0xFF) << (8*i)) * buffer[loop1].timestamp = data[loop1][1] */ __pyx_1 = PyObject_GetItem(__pyx_v_data, __pyx_v_loop1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_1); __pyx_2 = __Pyx_GetItemInt(__pyx_1, 0, sizeof(long), PyInt_FromLong); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_2); __Pyx_DECREF(__pyx_1); __pyx_1 = 0; __pyx_t_6 = PyObject_Length(__pyx_2); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_2); __pyx_2 = 0; for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_6; __pyx_t_8+=1) { __pyx_v_i = __pyx_t_8; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":326 * buffer[loop1].message = 0 * for i in range(len(data[loop1][0])): * buffer[loop1].message = buffer[loop1].message + ((data[loop1][0][i]&0xFF) << (8*i)) # <<<<<<<<<<<<<< * buffer[loop1].timestamp = data[loop1][1] * if self.debug: print loop1," : ",buffer[loop1].message," : ",buffer[loop1].timestamp */ __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_7 = PyInt_FromLong((__pyx_v_buffer[__pyx_t_5]).message); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __pyx_1 = PyObject_GetItem(__pyx_v_data, __pyx_v_loop1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_1); __pyx_2 = __Pyx_GetItemInt(__pyx_1, 0, sizeof(long), PyInt_FromLong); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_2); __Pyx_DECREF(__pyx_1); __pyx_1 = 0; __pyx_1 = __Pyx_GetItemInt(__pyx_2, __pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_1); __Pyx_DECREF(__pyx_2); __pyx_2 = 0; __pyx_t_2 = PyNumber_And(__pyx_1, __pyx_int_0xFF); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_1); __pyx_1 = 0; __pyx_t_9 = PyInt_FromLong((8 * __pyx_v_i)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_t_10 = PyNumber_Lshift(__pyx_t_2, __pyx_t_9); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __pyx_t_9 = PyNumber_Add(__pyx_t_7, __pyx_t_10); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __pyx_t_11 = __Pyx_PyInt_AsLong(__pyx_t_9); if (unlikely((__pyx_t_11 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} (__pyx_v_buffer[__pyx_t_5]).message = __pyx_t_11; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":327 * for i in range(len(data[loop1][0])): * buffer[loop1].message = buffer[loop1].message + ((data[loop1][0][i]&0xFF) << (8*i)) * buffer[loop1].timestamp = data[loop1][1] # <<<<<<<<<<<<<< * if self.debug: print loop1," : ",buffer[loop1].message," : ",buffer[loop1].timestamp * if self.debug: print "writing to midi buffer" */ __pyx_2 = PyObject_GetItem(__pyx_v_data, __pyx_v_loop1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_2); __pyx_1 = __Pyx_GetItemInt(__pyx_2, 1, sizeof(long), PyInt_FromLong); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_1); __Pyx_DECREF(__pyx_2); __pyx_2 = 0; __pyx_t_12 = __Pyx_PyInt_AsLong(__pyx_1); if (unlikely((__pyx_t_12 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_1); __pyx_1 = 0; __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop1); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;} (__pyx_v_buffer[__pyx_t_6]).timestamp = __pyx_t_12; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":328 * buffer[loop1].message = buffer[loop1].message + ((data[loop1][0][i]&0xFF) << (8*i)) * buffer[loop1].timestamp = data[loop1][1] * if self.debug: print loop1," : ",buffer[loop1].message," : ",buffer[loop1].timestamp # <<<<<<<<<<<<<< * if self.debug: print "writing to midi buffer" * err= Pm_Write(self.midi, buffer, len(data)) */ __pyx_t_8 = ((struct __pyx_obj_4pypm_Output *)__pyx_v_self)->debug; if (__pyx_t_8) { __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop1); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_9 = PyInt_FromLong((__pyx_v_buffer[__pyx_t_6]).message); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop1); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_10 = PyInt_FromLong((__pyx_v_buffer[__pyx_t_6]).timestamp); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __pyx_t_7 = PyTuple_New(5); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_7)); __Pyx_INCREF(__pyx_v_loop1); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_loop1); __Pyx_GIVEREF(__pyx_v_loop1); __Pyx_INCREF(__pyx_kp_15); PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_kp_15); __Pyx_GIVEREF(__pyx_kp_15); PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_9); __Pyx_GIVEREF(__pyx_t_9); __Pyx_INCREF(__pyx_kp_16); PyTuple_SET_ITEM(__pyx_t_7, 3, __pyx_kp_16); __Pyx_GIVEREF(__pyx_kp_16); PyTuple_SET_ITEM(__pyx_t_7, 4, __pyx_t_10); __Pyx_GIVEREF(__pyx_t_10); __pyx_t_9 = 0; __pyx_t_10 = 0; if (__Pyx_Print(((PyObject *)__pyx_t_7), 1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0; goto __pyx_L11; } __pyx_L11:; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } __pyx_L5:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":329 * buffer[loop1].timestamp = data[loop1][1] * if self.debug: print loop1," : ",buffer[loop1].message," : ",buffer[loop1].timestamp * if self.debug: print "writing to midi buffer" # <<<<<<<<<<<<<< * err= Pm_Write(self.midi, buffer, len(data)) * if err < 0: raise Exception, Pm_GetErrorText(err) */ __pyx_t_8 = ((struct __pyx_obj_4pypm_Output *)__pyx_v_self)->debug; if (__pyx_t_8) { if (__Pyx_PrintOne(__pyx_kp_17) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L12; } __pyx_L12:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":330 * if self.debug: print loop1," : ",buffer[loop1].message," : ",buffer[loop1].timestamp * if self.debug: print "writing to midi buffer" * err= Pm_Write(self.midi, buffer, len(data)) # <<<<<<<<<<<<<< * if err < 0: raise Exception, Pm_GetErrorText(err) * */ __pyx_t_3 = PyObject_Length(__pyx_v_data); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_err = Pm_Write(((struct __pyx_obj_4pypm_Output *)__pyx_v_self)->midi, __pyx_v_buffer, __pyx_t_3); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":331 * if self.debug: print "writing to midi buffer" * err= Pm_Write(self.midi, buffer, len(data)) * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< * * def WriteShort(self, status, data1 = 0, data2 = 0): */ __pyx_t_4 = (__pyx_v_err < 0); if (__pyx_t_4) { __pyx_t_1 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_builtin_Exception, __pyx_t_1, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L13; } __pyx_L13:; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_1); __Pyx_XDECREF(__pyx_2); __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_9); __Pyx_XDECREF(__pyx_t_10); __Pyx_AddTraceback("pypm.Output.Write"); __pyx_r = NULL; __pyx_L0:; __Pyx_DECREF(__pyx_v_loop1); __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":333 * if err < 0: raise Exception, Pm_GetErrorText(err) * * def WriteShort(self, status, data1 = 0, data2 = 0): # <<<<<<<<<<<<<< * """ * WriteShort(status <, data1><, data2>) */ static PyObject *__pyx_pf_4pypm_6Output_WriteShort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_4pypm_6Output_WriteShort[] = "\nWriteShort(status <, data1><, data2>)\n output MIDI information of 3 bytes or less.\n data fields are optional\n status byte could be:\n 0xc0 = program change\n 0x90 = note on\n etc.\n data bytes are optional and assumed 0 if omitted\n example: note 65 on with velocity 100\n WriteShort(0x90,65,100)\n "; static PyObject *__pyx_pf_4pypm_6Output_WriteShort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_status = 0; PyObject *__pyx_v_data1 = 0; PyObject *__pyx_v_data2 = 0; PmEvent __pyx_v_buffer[1]; PmError __pyx_v_err; PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PmMessage __pyx_t_4; int __pyx_t_5; int __pyx_t_6; static PyObject **__pyx_pyargnames[] = {&__pyx_kp_status,&__pyx_kp_1,&__pyx_kp_2,0}; __Pyx_SetupRefcountContext("WriteShort"); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args = PyDict_Size(__pyx_kwds); PyObject* values[3] = {0,0,0}; values[1] = __pyx_int_0; values[2] = __pyx_int_0; switch (PyTuple_GET_SIZE(__pyx_args)) { 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; } switch (PyTuple_GET_SIZE(__pyx_args)) { case 0: values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_status); if (likely(values[0])) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (kw_args > 1) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_1); if (unlikely(value)) { values[1] = value; kw_args--; } } case 2: if (kw_args > 1) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_2); if (unlikely(value)) { values[2] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "WriteShort") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 333; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } __pyx_v_status = values[0]; __pyx_v_data1 = values[1]; __pyx_v_data2 = values[2]; } else { __pyx_v_data1 = __pyx_int_0; __pyx_v_data2 = __pyx_int_0; switch (PyTuple_GET_SIZE(__pyx_args)) { case 3: __pyx_v_data2 = PyTuple_GET_ITEM(__pyx_args, 2); case 2: __pyx_v_data1 = PyTuple_GET_ITEM(__pyx_args, 1); case 1: __pyx_v_status = PyTuple_GET_ITEM(__pyx_args, 0); break; default: goto __pyx_L5_argtuple_error; } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("WriteShort", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 333; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("pypm.Output.WriteShort"); return NULL; __pyx_L4_argument_unpacking_done:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":348 * cdef PmEvent buffer[1] * cdef PmError err * self._check_open() # <<<<<<<<<<<<<< * * buffer[0].timestamp = Pt_Time() */ __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_kp__check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":350 * self._check_open() * * buffer[0].timestamp = Pt_Time() # <<<<<<<<<<<<<< * buffer[0].message = ((((data2) << 16) & 0xFF0000) | (((data1) << 8) & 0xFF00) | ((status) & 0xFF)) * if self.debug: print "Writing to MIDI buffer" */ (__pyx_v_buffer[0]).timestamp = Pt_Time(); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":351 * * buffer[0].timestamp = Pt_Time() * buffer[0].message = ((((data2) << 16) & 0xFF0000) | (((data1) << 8) & 0xFF00) | ((status) & 0xFF)) # <<<<<<<<<<<<<< * if self.debug: print "Writing to MIDI buffer" * err = Pm_Write(self.midi, buffer, 1) # stream, buffer, length */ __pyx_t_2 = PyNumber_Lshift(__pyx_v_data2, __pyx_int_16); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = PyNumber_And(__pyx_t_2, __pyx_int_0xFF0000); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyNumber_Lshift(__pyx_v_data1, __pyx_int_8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyNumber_And(__pyx_t_2, __pyx_int_0xFF00); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyNumber_Or(__pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyNumber_And(__pyx_v_status, __pyx_int_0xFF); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = PyNumber_Or(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_4 = __Pyx_PyInt_AsLong(__pyx_t_1); if (unlikely((__pyx_t_4 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; (__pyx_v_buffer[0]).message = __pyx_t_4; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":352 * buffer[0].timestamp = Pt_Time() * buffer[0].message = ((((data2) << 16) & 0xFF0000) | (((data1) << 8) & 0xFF00) | ((status) & 0xFF)) * if self.debug: print "Writing to MIDI buffer" # <<<<<<<<<<<<<< * err = Pm_Write(self.midi, buffer, 1) # stream, buffer, length * if err < 0 : raise Exception, Pm_GetErrorText(err) */ __pyx_t_5 = ((struct __pyx_obj_4pypm_Output *)__pyx_v_self)->debug; if (__pyx_t_5) { if (__Pyx_PrintOne(__pyx_kp_18) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L6; } __pyx_L6:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":353 * buffer[0].message = ((((data2) << 16) & 0xFF0000) | (((data1) << 8) & 0xFF00) | ((status) & 0xFF)) * if self.debug: print "Writing to MIDI buffer" * err = Pm_Write(self.midi, buffer, 1) # stream, buffer, length # <<<<<<<<<<<<<< * if err < 0 : raise Exception, Pm_GetErrorText(err) * */ __pyx_v_err = Pm_Write(((struct __pyx_obj_4pypm_Output *)__pyx_v_self)->midi, __pyx_v_buffer, 1); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":354 * if self.debug: print "Writing to MIDI buffer" * err = Pm_Write(self.midi, buffer, 1) # stream, buffer, length * if err < 0 : raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< * * def WriteSysEx(self, when, msg): */ __pyx_t_6 = (__pyx_v_err < 0); if (__pyx_t_6) { __pyx_t_1 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_builtin_Exception, __pyx_t_1, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L7; } __pyx_L7:; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("pypm.Output.WriteShort"); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":356 * if err < 0 : raise Exception, Pm_GetErrorText(err) * * def WriteSysEx(self, when, msg): # <<<<<<<<<<<<<< * """ * WriteSysEx(,) */ static PyObject *__pyx_pf_4pypm_6Output_WriteSysEx(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_4pypm_6Output_WriteSysEx[] = "\n WriteSysEx(,)\n writes a timestamped system-exclusive midi message.\n can be a *list* or a *string*\n example:\n (assuming y is an input MIDI stream)\n y.WriteSysEx(0,'\\xF0\\x7D\\x10\\x11\\x12\\x13\\xF7')\n is equivalent to\n y.WriteSysEx(pypm.Time,\n [0xF0, 0x7D, 0x10, 0x11, 0x12, 0x13, 0xF7])\n "; static PyObject *__pyx_pf_4pypm_6Output_WriteSysEx(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_when = 0; PyObject *__pyx_v_msg = 0; PmError __pyx_v_err; char *__pyx_v_cmsg; PtTimestamp __pyx_v_CurTime; PyObject *__pyx_r = NULL; PyObject *__pyx_1 = 0; PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; char *__pyx_t_5; PmTimestamp __pyx_t_6; static PyObject **__pyx_pyargnames[] = {&__pyx_kp_when,&__pyx_kp_msg,0}; __Pyx_SetupRefcountContext("WriteSysEx"); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args = PyDict_Size(__pyx_kwds); PyObject* values[2] = {0,0}; 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); case 0: break; default: goto __pyx_L5_argtuple_error; } switch (PyTuple_GET_SIZE(__pyx_args)) { case 0: values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_when); if (likely(values[0])) kw_args--; else goto __pyx_L5_argtuple_error; case 1: values[1] = PyDict_GetItem(__pyx_kwds, __pyx_kp_msg); if (likely(values[1])) kw_args--; else { __Pyx_RaiseArgtupleInvalid("WriteSysEx", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "WriteSysEx") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } __pyx_v_when = values[0]; __pyx_v_msg = values[1]; } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { __pyx_v_when = PyTuple_GET_ITEM(__pyx_args, 0); __pyx_v_msg = PyTuple_GET_ITEM(__pyx_args, 1); } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("WriteSysEx", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("pypm.Output.WriteSysEx"); return NULL; __pyx_L4_argument_unpacking_done:; __Pyx_INCREF(__pyx_v_msg); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":372 * cdef PtTimestamp CurTime * * self._check_open() # <<<<<<<<<<<<<< * * if type(msg) is list: */ __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_kp__check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 372; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 372; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":374 * self._check_open() * * if type(msg) is list: # <<<<<<<<<<<<<< * msg = array.array('B',msg).tostring() # Markus Pfaff contribution * cmsg = msg */ __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_2)); __Pyx_INCREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_msg); __Pyx_GIVEREF(__pyx_v_msg); __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)&PyType_Type)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __pyx_t_3 = (__pyx_t_1 == ((PyObject *)((PyObject*)&PyList_Type))); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_3) { /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":375 * * if type(msg) is list: * msg = array.array('B',msg).tostring() # Markus Pfaff contribution # <<<<<<<<<<<<<< * cmsg = msg * */ __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_array); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_1); __pyx_t_1 = PyObject_GetAttr(__pyx_1, __pyx_kp_array); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_1); __pyx_1 = 0; __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_2)); __Pyx_INCREF(__pyx_kp_19); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_kp_19); __Pyx_GIVEREF(__pyx_kp_19); __Pyx_INCREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_msg); __Pyx_GIVEREF(__pyx_v_msg); __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __pyx_t_2 = PyObject_GetAttr(__pyx_t_4, __pyx_kp_tostring); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_v_msg); __pyx_v_msg = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L6; } __pyx_L6:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":376 * if type(msg) is list: * msg = array.array('B',msg).tostring() # Markus Pfaff contribution * cmsg = msg # <<<<<<<<<<<<<< * * CurTime = Pt_Time() */ __pyx_t_5 = __Pyx_PyBytes_AsString(__pyx_v_msg); if (unlikely((!__pyx_t_5) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_cmsg = __pyx_t_5; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":378 * cmsg = msg * * CurTime = Pt_Time() # <<<<<<<<<<<<<< * err = Pm_WriteSysEx(self.midi, when, cmsg) * if err < 0 : raise Exception, Pm_GetErrorText(err) */ __pyx_v_CurTime = Pt_Time(); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":379 * * CurTime = Pt_Time() * err = Pm_WriteSysEx(self.midi, when, cmsg) # <<<<<<<<<<<<<< * if err < 0 : raise Exception, Pm_GetErrorText(err) * while Pt_Time() == CurTime: # wait for SysEx to go thru or...my */ __pyx_t_6 = __Pyx_PyInt_AsLong(__pyx_v_when); if (unlikely((__pyx_t_6 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_err = Pm_WriteSysEx(((struct __pyx_obj_4pypm_Output *)__pyx_v_self)->midi, __pyx_t_6, ((unsigned char *)__pyx_v_cmsg)); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":380 * CurTime = Pt_Time() * err = Pm_WriteSysEx(self.midi, when, cmsg) * if err < 0 : raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< * while Pt_Time() == CurTime: # wait for SysEx to go thru or...my * pass # win32 machine crashes w/ multiple SysEx */ __pyx_t_3 = (__pyx_v_err < 0); if (__pyx_t_3) { __pyx_t_4 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_Raise(__pyx_builtin_Exception, __pyx_t_4, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L7; } __pyx_L7:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":381 * err = Pm_WriteSysEx(self.midi, when, cmsg) * if err < 0 : raise Exception, Pm_GetErrorText(err) * while Pt_Time() == CurTime: # wait for SysEx to go thru or...my # <<<<<<<<<<<<<< * pass # win32 machine crashes w/ multiple SysEx * */ while (1) { __pyx_t_3 = (Pt_Time() == __pyx_v_CurTime); if (!__pyx_t_3) break; } __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_1); __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("pypm.Output.WriteSysEx"); __pyx_r = NULL; __pyx_L0:; __Pyx_DECREF(__pyx_v_msg); __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":404 * cdef int i * * def __init__(self, InputDevice, buffersize=4096): # <<<<<<<<<<<<<< * cdef PmError err * self.i = InputDevice */ static int __pyx_pf_4pypm_5Input___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pf_4pypm_5Input___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_InputDevice = 0; PyObject *__pyx_v_buffersize = 0; PmError __pyx_v_err; int __pyx_r; int __pyx_t_1; long __pyx_t_2; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; static PyObject **__pyx_pyargnames[] = {&__pyx_kp_InputDevice,&__pyx_kp_buffersize,0}; __Pyx_SetupRefcountContext("__init__"); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args = PyDict_Size(__pyx_kwds); PyObject* values[2] = {0,0}; values[1] = __pyx_int_4096; 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); case 0: break; default: goto __pyx_L5_argtuple_error; } switch (PyTuple_GET_SIZE(__pyx_args)) { case 0: values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_InputDevice); if (likely(values[0])) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (kw_args > 1) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_kp_buffersize); if (unlikely(value)) { values[1] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } __pyx_v_InputDevice = values[0]; __pyx_v_buffersize = values[1]; } else { __pyx_v_buffersize = __pyx_int_4096; switch (PyTuple_GET_SIZE(__pyx_args)) { case 2: __pyx_v_buffersize = PyTuple_GET_ITEM(__pyx_args, 1); case 1: __pyx_v_InputDevice = PyTuple_GET_ITEM(__pyx_args, 0); break; default: goto __pyx_L5_argtuple_error; } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("pypm.Input.__init__"); return -1; __pyx_L4_argument_unpacking_done:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":406 * def __init__(self, InputDevice, buffersize=4096): * cdef PmError err * self.i = InputDevice # <<<<<<<<<<<<<< * self.debug = 0 * err= Pm_OpenInput(&(self.midi),self.i,NULL,buffersize,&Pt_Time,NULL) */ __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_InputDevice); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;} ((struct __pyx_obj_4pypm_Input *)__pyx_v_self)->i = __pyx_t_1; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":407 * cdef PmError err * self.i = InputDevice * self.debug = 0 # <<<<<<<<<<<<<< * err= Pm_OpenInput(&(self.midi),self.i,NULL,buffersize,&Pt_Time,NULL) * if err < 0: raise Exception, Pm_GetErrorText(err) */ ((struct __pyx_obj_4pypm_Input *)__pyx_v_self)->debug = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":408 * self.i = InputDevice * self.debug = 0 * err= Pm_OpenInput(&(self.midi),self.i,NULL,buffersize,&Pt_Time,NULL) # <<<<<<<<<<<<<< * if err < 0: raise Exception, Pm_GetErrorText(err) * if self.debug: print "MIDI input opened." */ __pyx_t_2 = __Pyx_PyInt_AsLong(__pyx_v_buffersize); if (unlikely((__pyx_t_2 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_err = Pm_OpenInput((&((struct __pyx_obj_4pypm_Input *)__pyx_v_self)->midi), ((struct __pyx_obj_4pypm_Input *)__pyx_v_self)->i, NULL, __pyx_t_2, (&Pt_Time), NULL); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":409 * self.debug = 0 * err= Pm_OpenInput(&(self.midi),self.i,NULL,buffersize,&Pt_Time,NULL) * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< * if self.debug: print "MIDI input opened." * */ __pyx_t_3 = (__pyx_v_err < 0); if (__pyx_t_3) { __pyx_t_4 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_Raise(__pyx_builtin_Exception, __pyx_t_4, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L6; } __pyx_L6:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":410 * err= Pm_OpenInput(&(self.midi),self.i,NULL,buffersize,&Pt_Time,NULL) * if err < 0: raise Exception, Pm_GetErrorText(err) * if self.debug: print "MIDI input opened." # <<<<<<<<<<<<<< * * def __dealloc__(self): */ __pyx_t_1 = ((struct __pyx_obj_4pypm_Input *)__pyx_v_self)->debug; if (__pyx_t_1) { if (__Pyx_PrintOne(__pyx_kp_20) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L7; } __pyx_L7:; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("pypm.Input.__init__"); __pyx_r = -1; __pyx_L0:; __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":412 * if self.debug: print "MIDI input opened." * * def __dealloc__(self): # <<<<<<<<<<<<<< * cdef PmError err * if self.debug: print "Closing MIDI input stream and destroying instance" */ static void __pyx_pf_4pypm_5Input___dealloc__(PyObject *__pyx_v_self); /*proto*/ static void __pyx_pf_4pypm_5Input___dealloc__(PyObject *__pyx_v_self) { PmError __pyx_v_err; int __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; __Pyx_SetupRefcountContext("__dealloc__"); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":414 * def __dealloc__(self): * cdef PmError err * if self.debug: print "Closing MIDI input stream and destroying instance" # <<<<<<<<<<<<<< * * err = Pm_Close(self.midi) */ __pyx_t_1 = ((struct __pyx_obj_4pypm_Input *)__pyx_v_self)->debug; if (__pyx_t_1) { if (__Pyx_PrintOne(__pyx_kp_21) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L5; } __pyx_L5:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":416 * if self.debug: print "Closing MIDI input stream and destroying instance" * * err = Pm_Close(self.midi) # <<<<<<<<<<<<<< * if err < 0: * raise Exception, Pm_GetErrorText(err) */ __pyx_v_err = Pm_Close(((struct __pyx_obj_4pypm_Input *)__pyx_v_self)->midi); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":417 * * err = Pm_Close(self.midi) * if err < 0: # <<<<<<<<<<<<<< * raise Exception, Pm_GetErrorText(err) * */ __pyx_t_2 = (__pyx_v_err < 0); if (__pyx_t_2) { /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":418 * err = Pm_Close(self.midi) * if err < 0: * raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< * * */ __pyx_t_3 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_builtin_Exception, __pyx_t_3, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L6; } __pyx_L6:; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("pypm.Input.__dealloc__"); __pyx_L0:; __Pyx_FinishRefcountContext(); } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":422 * * * def _check_open(self): # <<<<<<<<<<<<<< * """ checks to see if the midi is open, and if not, raises an error. * """ */ static PyObject *__pyx_pf_4pypm_5Input__check_open(PyObject *__pyx_v_self, PyObject *unused); /*proto*/ static char __pyx_doc_4pypm_5Input__check_open[] = " checks to see if the midi is open, and if not, raises an error.\n "; static PyObject *__pyx_pf_4pypm_5Input__check_open(PyObject *__pyx_v_self, PyObject *unused) { PyObject *__pyx_r = NULL; int __pyx_t_1; __Pyx_SetupRefcountContext("_check_open"); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":426 * """ * * if self.midi == NULL: # <<<<<<<<<<<<<< * raise Exception, "midi Input not open." * */ __pyx_t_1 = (((struct __pyx_obj_4pypm_Input *)__pyx_v_self)->midi == NULL); if (__pyx_t_1) { /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":427 * * if self.midi == NULL: * raise Exception, "midi Input not open." # <<<<<<<<<<<<<< * * */ __Pyx_Raise(__pyx_builtin_Exception, __pyx_kp_22, 0); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 427; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L5; } __pyx_L5:; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("pypm.Input._check_open"); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":430 * * * def Close(self): # <<<<<<<<<<<<<< * """ * Close() */ static PyObject *__pyx_pf_4pypm_5Input_Close(PyObject *__pyx_v_self, PyObject *unused); /*proto*/ static char __pyx_doc_4pypm_5Input_Close[] = "\nClose()\n closes a midi stream, flushing any pending buffers.\n (PortMidi attempts to close open streams when the application\n exits -- this is particularly difficult under Windows.)\n "; static PyObject *__pyx_pf_4pypm_5Input_Close(PyObject *__pyx_v_self, PyObject *unused) { PyObject *__pyx_v_err; PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; int __pyx_t_2; PmError __pyx_t_3; __Pyx_SetupRefcountContext("Close"); __pyx_v_err = Py_None; __Pyx_INCREF(Py_None); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":440 * # return * * err = Pm_Close(self.midi) # <<<<<<<<<<<<<< * if err < 0: * raise Exception, Pm_GetErrorText(err) */ __pyx_t_1 = PyInt_FromLong(Pm_Close(((struct __pyx_obj_4pypm_Input *)__pyx_v_self)->midi)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_v_err); __pyx_v_err = __pyx_t_1; __pyx_t_1 = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":441 * * err = Pm_Close(self.midi) * if err < 0: # <<<<<<<<<<<<<< * raise Exception, Pm_GetErrorText(err) * #self.midi = NULL */ __pyx_t_1 = PyObject_RichCompare(__pyx_v_err, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":442 * err = Pm_Close(self.midi) * if err < 0: * raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< * #self.midi = NULL * */ __pyx_t_3 = ((PmError)PyInt_AsLong(__pyx_v_err)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_1 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_builtin_Exception, __pyx_t_1, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L5; } __pyx_L5:; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("pypm.Input.Close"); __pyx_r = NULL; __pyx_L0:; __Pyx_DECREF(__pyx_v_err); __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":447 * * * def SetFilter(self, filters): # <<<<<<<<<<<<<< * """ * SetFilter() sets filters on an open input stream */ static PyObject *__pyx_pf_4pypm_5Input_SetFilter(PyObject *__pyx_v_self, PyObject *__pyx_v_filters); /*proto*/ static char __pyx_doc_4pypm_5Input_SetFilter[] = "\n SetFilter() sets filters on an open input stream\n to drop selected input types. By default, only active sensing\n messages are filtered. To prohibit, say, active sensing and\n sysex messages, call\n SetFilter(stream, FILT_ACTIVE | FILT_SYSEX);\n\n Filtering is useful when midi routing or midi thru functionality\n is being provided by the user application.\n For example, you may want to exclude timing messages\n (clock, MTC, start/stop/continue), while allowing note-related\n messages to pass. Or you may be using a sequencer or drum-machine\n for MIDI clock information but want to exclude any notes\n it may play.\n\n Note: SetFilter empties the buffer after setting the filter,\n just in case anything got through.\n "; static PyObject *__pyx_pf_4pypm_5Input_SetFilter(PyObject *__pyx_v_self, PyObject *__pyx_v_filters) { PmEvent __pyx_v_buffer[1]; PmError __pyx_v_err; PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; long __pyx_t_3; int __pyx_t_4; __Pyx_SetupRefcountContext("SetFilter"); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":469 * cdef PmError err * * self._check_open() # <<<<<<<<<<<<<< * * */ __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_kp__check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":472 * * * err = Pm_SetFilter(self.midi, filters) # <<<<<<<<<<<<<< * * if err < 0: raise Exception, Pm_GetErrorText(err) */ __pyx_t_3 = __Pyx_PyInt_AsLong(__pyx_v_filters); if (unlikely((__pyx_t_3 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_err = Pm_SetFilter(((struct __pyx_obj_4pypm_Input *)__pyx_v_self)->midi, __pyx_t_3); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":474 * err = Pm_SetFilter(self.midi, filters) * * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< * * while(Pm_Poll(self.midi) != pmNoError): */ __pyx_t_4 = (__pyx_v_err < 0); if (__pyx_t_4) { __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_builtin_Exception, __pyx_t_2, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L5; } __pyx_L5:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":476 * if err < 0: raise Exception, Pm_GetErrorText(err) * * while(Pm_Poll(self.midi) != pmNoError): # <<<<<<<<<<<<<< * * err = Pm_Read(self.midi,buffer,1) */ while (1) { __pyx_t_4 = (Pm_Poll(((struct __pyx_obj_4pypm_Input *)__pyx_v_self)->midi) != pmNoError); if (!__pyx_t_4) break; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":478 * while(Pm_Poll(self.midi) != pmNoError): * * err = Pm_Read(self.midi,buffer,1) # <<<<<<<<<<<<<< * if err < 0: raise Exception, Pm_GetErrorText(err) * */ __pyx_v_err = Pm_Read(((struct __pyx_obj_4pypm_Input *)__pyx_v_self)->midi, __pyx_v_buffer, 1); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":479 * * err = Pm_Read(self.midi,buffer,1) * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< * * def SetChannelMask(self, mask): */ __pyx_t_4 = (__pyx_v_err < 0); if (__pyx_t_4) { __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_builtin_Exception, __pyx_t_2, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L8; } __pyx_L8:; } __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("pypm.Input.SetFilter"); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":481 * if err < 0: raise Exception, Pm_GetErrorText(err) * * def SetChannelMask(self, mask): # <<<<<<<<<<<<<< * """ * SetChannelMask() filters incoming messages based on channel. */ static PyObject *__pyx_pf_4pypm_5Input_SetChannelMask(PyObject *__pyx_v_self, PyObject *__pyx_v_mask); /*proto*/ static char __pyx_doc_4pypm_5Input_SetChannelMask[] = "\n SetChannelMask() filters incoming messages based on channel.\n The mask is a 16-bit bitfield corresponding to appropriate channels\n Channel() can assist in calling this function.\n i.e. to set receive only input on channel 1, call with\n SetChannelMask(Channel(1))\n Multiple channels should be OR'd together, like\n SetChannelMask(Channel(10) | Channel(11))\n note: PyPortMidi Channel function has been altered from\n the original PortMidi c call to correct for what\n seems to be a bug --- i.e. channel filters were\n all numbered from 0 to 15 instead of 1 to 16.\n "; static PyObject *__pyx_pf_4pypm_5Input_SetChannelMask(PyObject *__pyx_v_self, PyObject *__pyx_v_mask) { PmError __pyx_v_err; PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_t_3; int __pyx_t_4; __Pyx_SetupRefcountContext("SetChannelMask"); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":497 * cdef PmError err * * self._check_open() # <<<<<<<<<<<<<< * * err = Pm_SetChannelMask(self.midi,mask) */ __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_kp__check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":499 * self._check_open() * * err = Pm_SetChannelMask(self.midi,mask) # <<<<<<<<<<<<<< * if err < 0: raise Exception, Pm_GetErrorText(err) * */ __pyx_t_3 = __Pyx_PyInt_AsInt(__pyx_v_mask); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_err = Pm_SetChannelMask(((struct __pyx_obj_4pypm_Input *)__pyx_v_self)->midi, __pyx_t_3); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":500 * * err = Pm_SetChannelMask(self.midi,mask) * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< * * def Poll(self): */ __pyx_t_4 = (__pyx_v_err < 0); if (__pyx_t_4) { __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_builtin_Exception, __pyx_t_2, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L5; } __pyx_L5:; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("pypm.Input.SetChannelMask"); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":502 * if err < 0: raise Exception, Pm_GetErrorText(err) * * def Poll(self): # <<<<<<<<<<<<<< * """ * Poll tests whether input is available, */ static PyObject *__pyx_pf_4pypm_5Input_Poll(PyObject *__pyx_v_self, PyObject *unused); /*proto*/ static char __pyx_doc_4pypm_5Input_Poll[] = "\n Poll tests whether input is available,\n returning TRUE, FALSE, or an error value.\n "; static PyObject *__pyx_pf_4pypm_5Input_Poll(PyObject *__pyx_v_self, PyObject *unused) { PmError __pyx_v_err; PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_t_3; __Pyx_SetupRefcountContext("Poll"); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":508 * """ * cdef PmError err * self._check_open() # <<<<<<<<<<<<<< * * err = Pm_Poll(self.midi) */ __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_kp__check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":510 * self._check_open() * * err = Pm_Poll(self.midi) # <<<<<<<<<<<<<< * if err < 0: raise Exception, Pm_GetErrorText(err) * return err */ __pyx_v_err = Pm_Poll(((struct __pyx_obj_4pypm_Input *)__pyx_v_self)->midi); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":511 * * err = Pm_Poll(self.midi) * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< * return err * */ __pyx_t_3 = (__pyx_v_err < 0); if (__pyx_t_3) { __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_builtin_Exception, __pyx_t_2, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L5; } __pyx_L5:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":512 * err = Pm_Poll(self.midi) * if err < 0: raise Exception, Pm_GetErrorText(err) * return err # <<<<<<<<<<<<<< * * def Read(self,length): */ __Pyx_XDECREF(__pyx_r); __pyx_t_2 = PyInt_FromLong(__pyx_v_err); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; 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_2); __Pyx_AddTraceback("pypm.Input.Poll"); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":514 * return err * * def Read(self,length): # <<<<<<<<<<<<<< * """ * Read(length): returns up to midi events stored in */ static PyObject *__pyx_pf_4pypm_5Input_Read(PyObject *__pyx_v_self, PyObject *__pyx_v_length); /*proto*/ static char __pyx_doc_4pypm_5Input_Read[] = "\nRead(length): returns up to midi events stored in\nthe buffer and returns them as a list:\n[[[status,data1,data2,data3],timestamp],\n [[status,data1,data2,data3],timestamp],...]\nexample: Read(50) returns all the events in the buffer,\n up to 50 events.\n "; static PyObject *__pyx_pf_4pypm_5Input_Read(PyObject *__pyx_v_self, PyObject *__pyx_v_length) { PmEvent __pyx_v_buffer[1024]; PyObject *__pyx_v_x; PyObject *__pyx_v_NumEvents; PyObject *__pyx_v_loop; PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_t_3; long __pyx_t_4; PmError __pyx_t_5; Py_ssize_t __pyx_t_6; Py_ssize_t __pyx_t_7; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; PyObject *__pyx_t_10 = NULL; PyObject *__pyx_t_11 = NULL; __Pyx_SetupRefcountContext("Read"); __pyx_v_x = Py_None; __Pyx_INCREF(Py_None); __pyx_v_NumEvents = Py_None; __Pyx_INCREF(Py_None); __pyx_v_loop = Py_None; __Pyx_INCREF(Py_None); /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":525 * cdef PmEvent buffer[1024] * * self._check_open() # <<<<<<<<<<<<<< * * x = [] */ __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_kp__check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":527 * self._check_open() * * x = [] # <<<<<<<<<<<<<< * * if length > 1024: raise IndexError, 'maximum buffer length is 1024' */ __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 527; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_2)); __Pyx_DECREF(__pyx_v_x); __pyx_v_x = ((PyObject *)__pyx_t_2); __pyx_t_2 = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":529 * x = [] * * if length > 1024: raise IndexError, 'maximum buffer length is 1024' # <<<<<<<<<<<<<< * if length < 1: raise IndexError, 'minimum buffer length is 1' * NumEvents = Pm_Read(self.midi,buffer,length) */ __pyx_t_2 = PyObject_RichCompare(__pyx_v_length, __pyx_int_1024, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (__pyx_t_3) { __Pyx_Raise(__pyx_builtin_IndexError, __pyx_kp_23, 0); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L5; } __pyx_L5:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":530 * * if length > 1024: raise IndexError, 'maximum buffer length is 1024' * if length < 1: raise IndexError, 'minimum buffer length is 1' # <<<<<<<<<<<<<< * NumEvents = Pm_Read(self.midi,buffer,length) * if NumEvents < 0: raise Exception, Pm_GetErrorText(NumEvents) */ __pyx_t_2 = PyObject_RichCompare(__pyx_v_length, __pyx_int_1, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (__pyx_t_3) { __Pyx_Raise(__pyx_builtin_IndexError, __pyx_kp_24, 0); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L6; } __pyx_L6:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":531 * if length > 1024: raise IndexError, 'maximum buffer length is 1024' * if length < 1: raise IndexError, 'minimum buffer length is 1' * NumEvents = Pm_Read(self.midi,buffer,length) # <<<<<<<<<<<<<< * if NumEvents < 0: raise Exception, Pm_GetErrorText(NumEvents) * x=[] */ __pyx_t_4 = __Pyx_PyInt_AsLong(__pyx_v_length); if (unlikely((__pyx_t_4 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_2 = PyInt_FromLong(Pm_Read(((struct __pyx_obj_4pypm_Input *)__pyx_v_self)->midi, __pyx_v_buffer, __pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_v_NumEvents); __pyx_v_NumEvents = __pyx_t_2; __pyx_t_2 = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":532 * if length < 1: raise IndexError, 'minimum buffer length is 1' * NumEvents = Pm_Read(self.midi,buffer,length) * if NumEvents < 0: raise Exception, Pm_GetErrorText(NumEvents) # <<<<<<<<<<<<<< * x=[] * if NumEvents >= 1: */ __pyx_t_2 = PyObject_RichCompare(__pyx_v_NumEvents, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (__pyx_t_3) { __pyx_t_5 = ((PmError)PyInt_AsLong(__pyx_v_NumEvents)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_t_5)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_builtin_Exception, __pyx_t_2, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L7; } __pyx_L7:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":533 * NumEvents = Pm_Read(self.midi,buffer,length) * if NumEvents < 0: raise Exception, Pm_GetErrorText(NumEvents) * x=[] # <<<<<<<<<<<<<< * if NumEvents >= 1: * for loop in range(NumEvents): */ __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_2)); __Pyx_DECREF(__pyx_v_x); __pyx_v_x = ((PyObject *)__pyx_t_2); __pyx_t_2 = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":534 * if NumEvents < 0: raise Exception, Pm_GetErrorText(NumEvents) * x=[] * if NumEvents >= 1: # <<<<<<<<<<<<<< * for loop in range(NumEvents): * x.append([[buffer[loop].message & 0xff, (buffer[loop].message >> 8) & 0xFF, (buffer[loop].message >> 16) & 0xFF, (buffer[loop].message >> 24) & 0xFF], buffer[loop].timestamp]) */ __pyx_t_2 = PyObject_RichCompare(__pyx_v_NumEvents, __pyx_int_1, Py_GE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 534; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 534; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (__pyx_t_3) { /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":535 * x=[] * if NumEvents >= 1: * for loop in range(NumEvents): # <<<<<<<<<<<<<< * x.append([[buffer[loop].message & 0xff, (buffer[loop].message >> 8) & 0xFF, (buffer[loop].message >> 16) & 0xFF, (buffer[loop].message >> 24) & 0xFF], buffer[loop].timestamp]) * return x */ __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_2)); __Pyx_INCREF(__pyx_v_NumEvents); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_NumEvents); __Pyx_GIVEREF(__pyx_v_NumEvents); __pyx_t_1 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; if (PyList_CheckExact(__pyx_t_1) || PyTuple_CheckExact(__pyx_t_1)) { __pyx_t_6 = 0; __pyx_t_2 = __pyx_t_1; __Pyx_INCREF(__pyx_t_2); } else { __pyx_t_6 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; for (;;) { if (likely(PyList_CheckExact(__pyx_t_2))) { if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_2)) break; __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_1); __pyx_t_6++; } else if (likely(PyTuple_CheckExact(__pyx_t_2))) { if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_2)) break; __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_1); __pyx_t_6++; } else { __pyx_t_1 = PyIter_Next(__pyx_t_2); if (!__pyx_t_1) { if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; __pyx_clineno = __LINE__; goto __pyx_L1_error;} break; } __Pyx_GOTREF(__pyx_t_1); } __Pyx_DECREF(__pyx_v_loop); __pyx_v_loop = __pyx_t_1; __pyx_t_1 = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":536 * if NumEvents >= 1: * for loop in range(NumEvents): * x.append([[buffer[loop].message & 0xff, (buffer[loop].message >> 8) & 0xFF, (buffer[loop].message >> 16) & 0xFF, (buffer[loop].message >> 24) & 0xFF], buffer[loop].timestamp]) # <<<<<<<<<<<<<< * return x */ __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_1 = PyInt_FromLong(((__pyx_v_buffer[__pyx_t_7]).message & 0xff)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_8 = PyInt_FromLong((((__pyx_v_buffer[__pyx_t_7]).message >> 8) & 0xFF)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_9 = PyInt_FromLong((((__pyx_v_buffer[__pyx_t_7]).message >> 16) & 0xFF)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_10 = PyInt_FromLong((((__pyx_v_buffer[__pyx_t_7]).message >> 24) & 0xFF)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __pyx_t_11 = PyList_New(4); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_11)); PyList_SET_ITEM(__pyx_t_11, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); PyList_SET_ITEM(__pyx_t_11, 1, __pyx_t_8); __Pyx_GIVEREF(__pyx_t_8); PyList_SET_ITEM(__pyx_t_11, 2, __pyx_t_9); __Pyx_GIVEREF(__pyx_t_9); PyList_SET_ITEM(__pyx_t_11, 3, __pyx_t_10); __Pyx_GIVEREF(__pyx_t_10); __pyx_t_1 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_10 = PyInt_FromLong((__pyx_v_buffer[__pyx_t_7]).timestamp); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __pyx_t_9 = PyList_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_9)); PyList_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_t_11)); __Pyx_GIVEREF(((PyObject *)__pyx_t_11)); PyList_SET_ITEM(__pyx_t_9, 1, __pyx_t_10); __Pyx_GIVEREF(__pyx_t_10); __pyx_t_11 = 0; __pyx_t_10 = 0; __pyx_t_10 = __Pyx_PyObject_Append(__pyx_v_x, ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; goto __pyx_L8; } __pyx_L8:; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":537 * for loop in range(NumEvents): * x.append([[buffer[loop].message & 0xff, (buffer[loop].message >> 8) & 0xFF, (buffer[loop].message >> 16) & 0xFF, (buffer[loop].message >> 24) & 0xFF], buffer[loop].timestamp]) * return x # <<<<<<<<<<<<<< */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_x); __pyx_r = __pyx_v_x; 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_2); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_XDECREF(__pyx_t_10); __Pyx_XDECREF(__pyx_t_11); __Pyx_AddTraceback("pypm.Input.Read"); __pyx_r = NULL; __pyx_L0:; __Pyx_DECREF(__pyx_v_x); __Pyx_DECREF(__pyx_v_NumEvents); __Pyx_DECREF(__pyx_v_loop); __Pyx_XGIVEREF(__pyx_r); __Pyx_FinishRefcountContext(); return __pyx_r; } static PyObject *__pyx_tp_new_4pypm_Output(PyTypeObject *t, PyObject *a, PyObject *k) { PyObject *o = (*t->tp_alloc)(t, 0); if (!o) return 0; return o; } static void __pyx_tp_dealloc_4pypm_Output(PyObject *o) { { PyObject *etype, *eval, *etb; PyErr_Fetch(&etype, &eval, &etb); ++Py_REFCNT(o); __pyx_pf_4pypm_6Output___dealloc__(o); if (PyErr_Occurred()) PyErr_WriteUnraisable(o); --Py_REFCNT(o); PyErr_Restore(etype, eval, etb); } (*Py_TYPE(o)->tp_free)(o); } static struct PyMethodDef __pyx_methods_4pypm_Output[] = { {__Pyx_NAMESTR("_check_open"), (PyCFunction)__pyx_pf_4pypm_6Output__check_open, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_4pypm_6Output__check_open)}, {__Pyx_NAMESTR("Close"), (PyCFunction)__pyx_pf_4pypm_6Output_Close, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_4pypm_6Output_Close)}, {__Pyx_NAMESTR("Abort"), (PyCFunction)__pyx_pf_4pypm_6Output_Abort, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_4pypm_6Output_Abort)}, {__Pyx_NAMESTR("Write"), (PyCFunction)__pyx_pf_4pypm_6Output_Write, METH_O, __Pyx_DOCSTR(__pyx_doc_4pypm_6Output_Write)}, {__Pyx_NAMESTR("WriteShort"), (PyCFunction)__pyx_pf_4pypm_6Output_WriteShort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_4pypm_6Output_WriteShort)}, {__Pyx_NAMESTR("WriteSysEx"), (PyCFunction)__pyx_pf_4pypm_6Output_WriteSysEx, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_4pypm_6Output_WriteSysEx)}, {0, 0, 0, 0} }; static PyNumberMethods __pyx_tp_as_number_Output = { 0, /*nb_add*/ 0, /*nb_subtract*/ 0, /*nb_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_divide*/ #endif 0, /*nb_remainder*/ 0, /*nb_divmod*/ 0, /*nb_power*/ 0, /*nb_negative*/ 0, /*nb_positive*/ 0, /*nb_absolute*/ 0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_MAJOR_VERSION < 3 0, /*nb_coerce*/ #endif 0, /*nb_int*/ #if PY_MAJOR_VERSION >= 3 0, /*reserved*/ #else 0, /*nb_long*/ #endif 0, /*nb_float*/ #if PY_MAJOR_VERSION < 3 0, /*nb_oct*/ #endif #if PY_MAJOR_VERSION < 3 0, /*nb_hex*/ #endif 0, /*nb_inplace_add*/ 0, /*nb_inplace_subtract*/ 0, /*nb_inplace_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_inplace_divide*/ #endif 0, /*nb_inplace_remainder*/ 0, /*nb_inplace_power*/ 0, /*nb_inplace_lshift*/ 0, /*nb_inplace_rshift*/ 0, /*nb_inplace_and*/ 0, /*nb_inplace_xor*/ 0, /*nb_inplace_or*/ 0, /*nb_floor_divide*/ 0, /*nb_true_divide*/ 0, /*nb_inplace_floor_divide*/ 0, /*nb_inplace_true_divide*/ #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX) 0, /*nb_index*/ #endif }; static PySequenceMethods __pyx_tp_as_sequence_Output = { 0, /*sq_length*/ 0, /*sq_concat*/ 0, /*sq_repeat*/ 0, /*sq_item*/ 0, /*sq_slice*/ 0, /*sq_ass_item*/ 0, /*sq_ass_slice*/ 0, /*sq_contains*/ 0, /*sq_inplace_concat*/ 0, /*sq_inplace_repeat*/ }; static PyMappingMethods __pyx_tp_as_mapping_Output = { 0, /*mp_length*/ 0, /*mp_subscript*/ 0, /*mp_ass_subscript*/ }; static PyBufferProcs __pyx_tp_as_buffer_Output = { #if PY_MAJOR_VERSION < 3 0, /*bf_getreadbuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getwritebuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getsegcount*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getcharbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_getbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_releasebuffer*/ #endif }; PyTypeObject __pyx_type_4pypm_Output = { PyVarObject_HEAD_INIT(0, 0) __Pyx_NAMESTR("pypm.Output"), /*tp_name*/ sizeof(struct __pyx_obj_4pypm_Output), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_4pypm_Output, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ &__pyx_tp_as_number_Output, /*tp_as_number*/ &__pyx_tp_as_sequence_Output, /*tp_as_sequence*/ &__pyx_tp_as_mapping_Output, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ &__pyx_tp_as_buffer_Output, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER, /*tp_flags*/ __Pyx_DOCSTR("\nclass Output:\n define an output MIDI stream. Takes the form:\n x = pypm.Output(MidiOutputDevice, latency)\n latency is in ms.\n If latency = 0 then timestamps for output are ignored.\n "), /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_4pypm_Output, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ __pyx_pf_4pypm_6Output___init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_4pypm_Output, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ }; static PyObject *__pyx_tp_new_4pypm_Input(PyTypeObject *t, PyObject *a, PyObject *k) { PyObject *o = (*t->tp_alloc)(t, 0); if (!o) return 0; return o; } static void __pyx_tp_dealloc_4pypm_Input(PyObject *o) { { PyObject *etype, *eval, *etb; PyErr_Fetch(&etype, &eval, &etb); ++Py_REFCNT(o); __pyx_pf_4pypm_5Input___dealloc__(o); if (PyErr_Occurred()) PyErr_WriteUnraisable(o); --Py_REFCNT(o); PyErr_Restore(etype, eval, etb); } (*Py_TYPE(o)->tp_free)(o); } static struct PyMethodDef __pyx_methods_4pypm_Input[] = { {__Pyx_NAMESTR("_check_open"), (PyCFunction)__pyx_pf_4pypm_5Input__check_open, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_4pypm_5Input__check_open)}, {__Pyx_NAMESTR("Close"), (PyCFunction)__pyx_pf_4pypm_5Input_Close, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_4pypm_5Input_Close)}, {__Pyx_NAMESTR("SetFilter"), (PyCFunction)__pyx_pf_4pypm_5Input_SetFilter, METH_O, __Pyx_DOCSTR(__pyx_doc_4pypm_5Input_SetFilter)}, {__Pyx_NAMESTR("SetChannelMask"), (PyCFunction)__pyx_pf_4pypm_5Input_SetChannelMask, METH_O, __Pyx_DOCSTR(__pyx_doc_4pypm_5Input_SetChannelMask)}, {__Pyx_NAMESTR("Poll"), (PyCFunction)__pyx_pf_4pypm_5Input_Poll, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_4pypm_5Input_Poll)}, {__Pyx_NAMESTR("Read"), (PyCFunction)__pyx_pf_4pypm_5Input_Read, METH_O, __Pyx_DOCSTR(__pyx_doc_4pypm_5Input_Read)}, {0, 0, 0, 0} }; static PyNumberMethods __pyx_tp_as_number_Input = { 0, /*nb_add*/ 0, /*nb_subtract*/ 0, /*nb_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_divide*/ #endif 0, /*nb_remainder*/ 0, /*nb_divmod*/ 0, /*nb_power*/ 0, /*nb_negative*/ 0, /*nb_positive*/ 0, /*nb_absolute*/ 0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_MAJOR_VERSION < 3 0, /*nb_coerce*/ #endif 0, /*nb_int*/ #if PY_MAJOR_VERSION >= 3 0, /*reserved*/ #else 0, /*nb_long*/ #endif 0, /*nb_float*/ #if PY_MAJOR_VERSION < 3 0, /*nb_oct*/ #endif #if PY_MAJOR_VERSION < 3 0, /*nb_hex*/ #endif 0, /*nb_inplace_add*/ 0, /*nb_inplace_subtract*/ 0, /*nb_inplace_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_inplace_divide*/ #endif 0, /*nb_inplace_remainder*/ 0, /*nb_inplace_power*/ 0, /*nb_inplace_lshift*/ 0, /*nb_inplace_rshift*/ 0, /*nb_inplace_and*/ 0, /*nb_inplace_xor*/ 0, /*nb_inplace_or*/ 0, /*nb_floor_divide*/ 0, /*nb_true_divide*/ 0, /*nb_inplace_floor_divide*/ 0, /*nb_inplace_true_divide*/ #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX) 0, /*nb_index*/ #endif }; static PySequenceMethods __pyx_tp_as_sequence_Input = { 0, /*sq_length*/ 0, /*sq_concat*/ 0, /*sq_repeat*/ 0, /*sq_item*/ 0, /*sq_slice*/ 0, /*sq_ass_item*/ 0, /*sq_ass_slice*/ 0, /*sq_contains*/ 0, /*sq_inplace_concat*/ 0, /*sq_inplace_repeat*/ }; static PyMappingMethods __pyx_tp_as_mapping_Input = { 0, /*mp_length*/ 0, /*mp_subscript*/ 0, /*mp_ass_subscript*/ }; static PyBufferProcs __pyx_tp_as_buffer_Input = { #if PY_MAJOR_VERSION < 3 0, /*bf_getreadbuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getwritebuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getsegcount*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getcharbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_getbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_releasebuffer*/ #endif }; PyTypeObject __pyx_type_4pypm_Input = { PyVarObject_HEAD_INIT(0, 0) __Pyx_NAMESTR("pypm.Input"), /*tp_name*/ sizeof(struct __pyx_obj_4pypm_Input), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_4pypm_Input, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ &__pyx_tp_as_number_Input, /*tp_as_number*/ &__pyx_tp_as_sequence_Input, /*tp_as_sequence*/ &__pyx_tp_as_mapping_Input, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ &__pyx_tp_as_buffer_Input, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER, /*tp_flags*/ __Pyx_DOCSTR("\nclass Input:\n define an input MIDI stream. Takes the form:\n x = pypm.Input(MidiInputDevice)\n "), /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_4pypm_Input, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ __pyx_pf_4pypm_5Input___init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_4pypm_Input, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ }; static struct PyMethodDef __pyx_methods[] = { {__Pyx_NAMESTR("Initialize"), (PyCFunction)__pyx_pf_4pypm_Initialize, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_4pypm_Initialize)}, {__Pyx_NAMESTR("Terminate"), (PyCFunction)__pyx_pf_4pypm_Terminate, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_4pypm_Terminate)}, {__Pyx_NAMESTR("GetDefaultInputDeviceID"), (PyCFunction)__pyx_pf_4pypm_GetDefaultInputDeviceID, METH_NOARGS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("GetDefaultOutputDeviceID"), (PyCFunction)__pyx_pf_4pypm_GetDefaultOutputDeviceID, METH_NOARGS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("CountDevices"), (PyCFunction)__pyx_pf_4pypm_CountDevices, METH_NOARGS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("GetDeviceInfo"), (PyCFunction)__pyx_pf_4pypm_GetDeviceInfo, METH_O, __Pyx_DOCSTR(__pyx_doc_4pypm_GetDeviceInfo)}, {__Pyx_NAMESTR("Time"), (PyCFunction)__pyx_pf_4pypm_Time, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_4pypm_Time)}, {__Pyx_NAMESTR("GetErrorText"), (PyCFunction)__pyx_pf_4pypm_GetErrorText, METH_O, __Pyx_DOCSTR(__pyx_doc_4pypm_GetErrorText)}, {__Pyx_NAMESTR("Channel"), (PyCFunction)__pyx_pf_4pypm_Channel, METH_O, __Pyx_DOCSTR(__pyx_doc_4pypm_Channel)}, {0, 0, 0, 0} }; static void __pyx_init_filenames(void); /*proto*/ #if PY_MAJOR_VERSION >= 3 static struct PyModuleDef __pyx_moduledef = { PyModuleDef_HEAD_INIT, __Pyx_NAMESTR("pypm"), 0, /* 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___main__, __pyx_k___main__, sizeof(__pyx_k___main__), 1, 1, 1}, {&__pyx_kp___init__, __pyx_k___init__, sizeof(__pyx_k___init__), 1, 1, 1}, {&__pyx_kp___dealloc__, __pyx_k___dealloc__, sizeof(__pyx_k___dealloc__), 1, 1, 1}, {&__pyx_kp__check_open, __pyx_k__check_open, sizeof(__pyx_k__check_open), 1, 1, 1}, {&__pyx_kp_Close, __pyx_k_Close, sizeof(__pyx_k_Close), 1, 1, 1}, {&__pyx_kp_Abort, __pyx_k_Abort, sizeof(__pyx_k_Abort), 1, 1, 1}, {&__pyx_kp_Write, __pyx_k_Write, sizeof(__pyx_k_Write), 1, 1, 1}, {&__pyx_kp_WriteShort, __pyx_k_WriteShort, sizeof(__pyx_k_WriteShort), 1, 1, 1}, {&__pyx_kp_WriteSysEx, __pyx_k_WriteSysEx, sizeof(__pyx_k_WriteSysEx), 1, 1, 1}, {&__pyx_kp_SetFilter, __pyx_k_SetFilter, sizeof(__pyx_k_SetFilter), 1, 1, 1}, {&__pyx_kp_SetChannelMask, __pyx_k_SetChannelMask, sizeof(__pyx_k_SetChannelMask), 1, 1, 1}, {&__pyx_kp_Poll, __pyx_k_Poll, sizeof(__pyx_k_Poll), 1, 1, 1}, {&__pyx_kp_Read, __pyx_k_Read, sizeof(__pyx_k_Read), 1, 1, 1}, {&__pyx_kp_i, __pyx_k_i, sizeof(__pyx_k_i), 1, 1, 1}, {&__pyx_kp_err, __pyx_k_err, sizeof(__pyx_k_err), 1, 1, 1}, {&__pyx_kp_chan, __pyx_k_chan, sizeof(__pyx_k_chan), 1, 1, 1}, {&__pyx_kp_OutputDevice, __pyx_k_OutputDevice, sizeof(__pyx_k_OutputDevice), 1, 1, 1}, {&__pyx_kp_latency, __pyx_k_latency, sizeof(__pyx_k_latency), 1, 1, 1}, {&__pyx_kp_data, __pyx_k_data, sizeof(__pyx_k_data), 1, 1, 1}, {&__pyx_kp_status, __pyx_k_status, sizeof(__pyx_k_status), 1, 1, 1}, {&__pyx_kp_1, __pyx_k_1, sizeof(__pyx_k_1), 1, 1, 1}, {&__pyx_kp_2, __pyx_k_2, sizeof(__pyx_k_2), 1, 1, 1}, {&__pyx_kp_when, __pyx_k_when, sizeof(__pyx_k_when), 1, 1, 1}, {&__pyx_kp_msg, __pyx_k_msg, sizeof(__pyx_k_msg), 1, 1, 1}, {&__pyx_kp_InputDevice, __pyx_k_InputDevice, sizeof(__pyx_k_InputDevice), 1, 1, 1}, {&__pyx_kp_buffersize, __pyx_k_buffersize, sizeof(__pyx_k_buffersize), 1, 1, 1}, {&__pyx_kp_filters, __pyx_k_filters, sizeof(__pyx_k_filters), 1, 1, 1}, {&__pyx_kp_mask, __pyx_k_mask, sizeof(__pyx_k_mask), 1, 1, 1}, {&__pyx_kp_length, __pyx_k_length, sizeof(__pyx_k_length), 1, 1, 1}, {&__pyx_kp___version__, __pyx_k___version__, sizeof(__pyx_k___version__), 1, 1, 1}, {&__pyx_kp_array, __pyx_k_array, sizeof(__pyx_k_array), 1, 1, 1}, {&__pyx_kp_FILT_ACTIVE, __pyx_k_FILT_ACTIVE, sizeof(__pyx_k_FILT_ACTIVE), 1, 1, 1}, {&__pyx_kp_FILT_SYSEX, __pyx_k_FILT_SYSEX, sizeof(__pyx_k_FILT_SYSEX), 1, 1, 1}, {&__pyx_kp_FILT_CLOCK, __pyx_k_FILT_CLOCK, sizeof(__pyx_k_FILT_CLOCK), 1, 1, 1}, {&__pyx_kp_FILT_PLAY, __pyx_k_FILT_PLAY, sizeof(__pyx_k_FILT_PLAY), 1, 1, 1}, {&__pyx_kp_4, __pyx_k_4, sizeof(__pyx_k_4), 1, 1, 1}, {&__pyx_kp_FILT_TICK, __pyx_k_FILT_TICK, sizeof(__pyx_k_FILT_TICK), 1, 1, 1}, {&__pyx_kp_FILT_FD, __pyx_k_FILT_FD, sizeof(__pyx_k_FILT_FD), 1, 1, 1}, {&__pyx_kp_FILT_UNDEFINED, __pyx_k_FILT_UNDEFINED, sizeof(__pyx_k_FILT_UNDEFINED), 1, 1, 1}, {&__pyx_kp_FILT_RESET, __pyx_k_FILT_RESET, sizeof(__pyx_k_FILT_RESET), 1, 1, 1}, {&__pyx_kp_FILT_REALTIME, __pyx_k_FILT_REALTIME, sizeof(__pyx_k_FILT_REALTIME), 1, 1, 1}, {&__pyx_kp_FILT_NOTE, __pyx_k_FILT_NOTE, sizeof(__pyx_k_FILT_NOTE), 1, 1, 1}, {&__pyx_kp_5, __pyx_k_5, sizeof(__pyx_k_5), 1, 1, 1}, {&__pyx_kp_6, __pyx_k_6, sizeof(__pyx_k_6), 1, 1, 1}, {&__pyx_kp_FILT_AFTERTOUCH, __pyx_k_FILT_AFTERTOUCH, sizeof(__pyx_k_FILT_AFTERTOUCH), 1, 1, 1}, {&__pyx_kp_FILT_PROGRAM, __pyx_k_FILT_PROGRAM, sizeof(__pyx_k_FILT_PROGRAM), 1, 1, 1}, {&__pyx_kp_FILT_CONTROL, __pyx_k_FILT_CONTROL, sizeof(__pyx_k_FILT_CONTROL), 1, 1, 1}, {&__pyx_kp_FILT_PITCHBEND, __pyx_k_FILT_PITCHBEND, sizeof(__pyx_k_FILT_PITCHBEND), 1, 1, 1}, {&__pyx_kp_FILT_MTC, __pyx_k_FILT_MTC, sizeof(__pyx_k_FILT_MTC), 1, 1, 1}, {&__pyx_kp_FILT_SONG_POSITION, __pyx_k_FILT_SONG_POSITION, sizeof(__pyx_k_FILT_SONG_POSITION), 1, 1, 1}, {&__pyx_kp_FILT_SONG_SELECT, __pyx_k_FILT_SONG_SELECT, sizeof(__pyx_k_FILT_SONG_SELECT), 1, 1, 1}, {&__pyx_kp_FILT_TUNE, __pyx_k_FILT_TUNE, sizeof(__pyx_k_FILT_TUNE), 1, 1, 1}, {&__pyx_kp_FALSE, __pyx_k_FALSE, sizeof(__pyx_k_FALSE), 1, 1, 1}, {&__pyx_kp_TRUE, __pyx_k_TRUE, sizeof(__pyx_k_TRUE), 1, 1, 1}, {&__pyx_kp_Exception, __pyx_k_Exception, sizeof(__pyx_k_Exception), 1, 1, 1}, {&__pyx_kp_IndexError, __pyx_k_IndexError, sizeof(__pyx_k_IndexError), 1, 1, 1}, {&__pyx_kp_range, __pyx_k_range, sizeof(__pyx_k_range), 1, 1, 1}, {&__pyx_kp_19, __pyx_k_19, sizeof(__pyx_k_19), 0, 1, 0}, {&__pyx_kp_tostring, __pyx_k_tostring, sizeof(__pyx_k_tostring), 1, 1, 1}, {&__pyx_kp_append, __pyx_k_append, sizeof(__pyx_k_append), 1, 1, 1}, {&__pyx_kp_3, __pyx_k_3, sizeof(__pyx_k_3), 0, 0, 0}, {&__pyx_kp_7, __pyx_k_7, sizeof(__pyx_k_7), 0, 0, 0}, {&__pyx_kp_8, __pyx_k_8, sizeof(__pyx_k_8), 0, 0, 0}, {&__pyx_kp_9, __pyx_k_9, sizeof(__pyx_k_9), 0, 0, 0}, {&__pyx_kp_10, __pyx_k_10, sizeof(__pyx_k_10), 0, 0, 0}, {&__pyx_kp_11, __pyx_k_11, sizeof(__pyx_k_11), 0, 0, 0}, {&__pyx_kp_12, __pyx_k_12, sizeof(__pyx_k_12), 0, 0, 0}, {&__pyx_kp_13, __pyx_k_13, sizeof(__pyx_k_13), 0, 0, 0}, {&__pyx_kp_14, __pyx_k_14, sizeof(__pyx_k_14), 0, 0, 0}, {&__pyx_kp_15, __pyx_k_15, sizeof(__pyx_k_15), 0, 0, 0}, {&__pyx_kp_16, __pyx_k_16, sizeof(__pyx_k_16), 0, 0, 0}, {&__pyx_kp_17, __pyx_k_17, sizeof(__pyx_k_17), 0, 0, 0}, {&__pyx_kp_18, __pyx_k_18, sizeof(__pyx_k_18), 0, 0, 0}, {&__pyx_kp_20, __pyx_k_20, sizeof(__pyx_k_20), 0, 0, 0}, {&__pyx_kp_21, __pyx_k_21, sizeof(__pyx_k_21), 0, 0, 0}, {&__pyx_kp_22, __pyx_k_22, sizeof(__pyx_k_22), 0, 0, 0}, {&__pyx_kp_23, __pyx_k_23, sizeof(__pyx_k_23), 0, 0, 0}, {&__pyx_kp_24, __pyx_k_24, sizeof(__pyx_k_24), 0, 0, 0}, {0, 0, 0, 0, 0, 0} }; static int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_Exception = __Pyx_GetName(__pyx_b, __pyx_kp_Exception); if (!__pyx_builtin_Exception) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_builtin_IndexError = __Pyx_GetName(__pyx_b, __pyx_kp_IndexError); if (!__pyx_builtin_IndexError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_kp_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;} return 0; __pyx_L1_error:; return -1; } static int __Pyx_InitGlobals(void) { __pyx_int_0x1 = PyInt_FromLong(0x1); if (unlikely(!__pyx_int_0x1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0x2 = PyInt_FromLong(0x2); if (unlikely(!__pyx_int_0x2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0x4 = PyInt_FromLong(0x4); if (unlikely(!__pyx_int_0x4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0x8 = PyInt_FromLong(0x8); if (unlikely(!__pyx_int_0x8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0x10 = PyInt_FromLong(0x10); if (unlikely(!__pyx_int_0x10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0x20 = PyInt_FromLong(0x20); if (unlikely(!__pyx_int_0x20)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0x30 = PyInt_FromLong(0x30); if (unlikely(!__pyx_int_0x30)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0x40 = PyInt_FromLong(0x40); if (unlikely(!__pyx_int_0x40)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0x7F = PyInt_FromLong(0x7F); if (unlikely(!__pyx_int_0x7F)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0x80 = PyInt_FromLong(0x80); if (unlikely(!__pyx_int_0x80)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0x100 = PyInt_FromLong(0x100); if (unlikely(!__pyx_int_0x100)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0x200 = PyInt_FromLong(0x200); if (unlikely(!__pyx_int_0x200)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0x300 = PyInt_FromLong(0x300); if (unlikely(!__pyx_int_0x300)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0x400 = PyInt_FromLong(0x400); if (unlikely(!__pyx_int_0x400)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0x800 = PyInt_FromLong(0x800); if (unlikely(!__pyx_int_0x800)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0x1000 = PyInt_FromLong(0x1000); if (unlikely(!__pyx_int_0x1000)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0x2000 = PyInt_FromLong(0x2000); if (unlikely(!__pyx_int_0x2000)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0x4000 = PyInt_FromLong(0x4000); if (unlikely(!__pyx_int_0x4000)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0x8000 = PyInt_FromLong(0x8000); if (unlikely(!__pyx_int_0x8000)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0x10000 = PyInt_FromLong(0x10000); if (unlikely(!__pyx_int_0x10000)) {__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_4096 = PyInt_FromLong(4096); if (unlikely(!__pyx_int_4096)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0xFF = PyInt_FromLong(0xFF); if (unlikely(!__pyx_int_0xFF)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_16 = PyInt_FromLong(16); if (unlikely(!__pyx_int_16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0xFF0000 = PyInt_FromLong(0xFF0000); if (unlikely(!__pyx_int_0xFF0000)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_8 = PyInt_FromLong(8); if (unlikely(!__pyx_int_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0xFF00 = PyInt_FromLong(0xFF00); if (unlikely(!__pyx_int_0xFF00)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_1024 = PyInt_FromLong(1024); if (unlikely(!__pyx_int_1024)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__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 initpypm(void); /*proto*/ PyMODINIT_FUNC initpypm(void) #else PyMODINIT_FUNC PyInit_pypm(void); /*proto*/ PyMODINIT_FUNC PyInit_pypm(void) #endif { PyObject *__pyx_1 = 0; #ifdef CYTHON_REFNANNY void* __pyx_refchk = NULL; __Pyx_Refnanny = __Pyx_ImportRefcountAPI("refnanny"); if (!__Pyx_Refnanny) { PyErr_Clear(); __Pyx_Refnanny = __Pyx_ImportRefcountAPI("Cython.Runtime.refnanny"); if (!__Pyx_Refnanny) Py_FatalError("failed to import refnanny module"); } __pyx_refchk = __Pyx_Refnanny->NewContext("PyMODINIT_FUNC PyInit_pypm(void)", __LINE__, __FILE__); #endif __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;} /*--- Library function declarations ---*/ __pyx_init_filenames(); /*--- 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 /*--- 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;} /*--- Module creation code ---*/ #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4(__Pyx_NAMESTR("pypm"), __pyx_methods, 0, 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;}; if (__pyx_module_is_main_pypm) { if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_kp___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;} __pyx_skip_dispatch = 0; /*--- Global init code ---*/ /*--- Function export code ---*/ /*--- Type init code ---*/ if (PyType_Ready(&__pyx_type_4pypm_Output) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetAttrString(__pyx_m, "Output", (PyObject *)&__pyx_type_4pypm_Output) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_4pypm_Output = &__pyx_type_4pypm_Output; if (PyType_Ready(&__pyx_type_4pypm_Input) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetAttrString(__pyx_m, "Input", (PyObject *)&__pyx_type_4pypm_Input) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_4pypm_Input = &__pyx_type_4pypm_Input; /*--- Type import code ---*/ /*--- Function import code ---*/ /*--- Execution code ---*/ /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":7 * # harrison@media.mit.edu * # written in Pyrex * __version__="0.05" # <<<<<<<<<<<<<< * * import array */ if (PyObject_SetAttr(__pyx_m, __pyx_kp___version__, __pyx_kp_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":9 * __version__="0.05" * * import array # <<<<<<<<<<<<<< * * # CHANGES: */ __pyx_1 = __Pyx_Import(__pyx_kp_array, 0); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_1); if (PyObject_SetAttr(__pyx_m, __pyx_kp_array, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_1); __pyx_1 = 0; /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":108 * PtTimestamp Pt_Time() * * FILT_ACTIVE=0x1 # <<<<<<<<<<<<<< * FILT_SYSEX=0x2 * FILT_CLOCK=0x4 */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_FILT_ACTIVE, __pyx_int_0x1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":109 * * FILT_ACTIVE=0x1 * FILT_SYSEX=0x2 # <<<<<<<<<<<<<< * FILT_CLOCK=0x4 * FILT_PLAY=0x8 */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_FILT_SYSEX, __pyx_int_0x2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":110 * FILT_ACTIVE=0x1 * FILT_SYSEX=0x2 * FILT_CLOCK=0x4 # <<<<<<<<<<<<<< * FILT_PLAY=0x8 * FILT_F9=0x10 */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_FILT_CLOCK, __pyx_int_0x4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":111 * FILT_SYSEX=0x2 * FILT_CLOCK=0x4 * FILT_PLAY=0x8 # <<<<<<<<<<<<<< * FILT_F9=0x10 * FILT_TICK=0x10 */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_FILT_PLAY, __pyx_int_0x8) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":112 * FILT_CLOCK=0x4 * FILT_PLAY=0x8 * FILT_F9=0x10 # <<<<<<<<<<<<<< * FILT_TICK=0x10 * FILT_FD=0x20 */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_4, __pyx_int_0x10) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":113 * FILT_PLAY=0x8 * FILT_F9=0x10 * FILT_TICK=0x10 # <<<<<<<<<<<<<< * FILT_FD=0x20 * FILT_UNDEFINED=0x30 */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_FILT_TICK, __pyx_int_0x10) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":114 * FILT_F9=0x10 * FILT_TICK=0x10 * FILT_FD=0x20 # <<<<<<<<<<<<<< * FILT_UNDEFINED=0x30 * FILT_RESET=0x40 */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_FILT_FD, __pyx_int_0x20) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":115 * FILT_TICK=0x10 * FILT_FD=0x20 * FILT_UNDEFINED=0x30 # <<<<<<<<<<<<<< * FILT_RESET=0x40 * FILT_REALTIME=0x7F */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_FILT_UNDEFINED, __pyx_int_0x30) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":116 * FILT_FD=0x20 * FILT_UNDEFINED=0x30 * FILT_RESET=0x40 # <<<<<<<<<<<<<< * FILT_REALTIME=0x7F * FILT_NOTE=0x80 */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_FILT_RESET, __pyx_int_0x40) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":117 * FILT_UNDEFINED=0x30 * FILT_RESET=0x40 * FILT_REALTIME=0x7F # <<<<<<<<<<<<<< * FILT_NOTE=0x80 * FILT_CHANNEL_AFTERTOUCH=0x100 */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_FILT_REALTIME, __pyx_int_0x7F) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":118 * FILT_RESET=0x40 * FILT_REALTIME=0x7F * FILT_NOTE=0x80 # <<<<<<<<<<<<<< * FILT_CHANNEL_AFTERTOUCH=0x100 * FILT_POLY_AFTERTOUCH=0x200 */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_FILT_NOTE, __pyx_int_0x80) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":119 * FILT_REALTIME=0x7F * FILT_NOTE=0x80 * FILT_CHANNEL_AFTERTOUCH=0x100 # <<<<<<<<<<<<<< * FILT_POLY_AFTERTOUCH=0x200 * FILT_AFTERTOUCH=0x300 */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_5, __pyx_int_0x100) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":120 * FILT_NOTE=0x80 * FILT_CHANNEL_AFTERTOUCH=0x100 * FILT_POLY_AFTERTOUCH=0x200 # <<<<<<<<<<<<<< * FILT_AFTERTOUCH=0x300 * FILT_PROGRAM=0x400 */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_6, __pyx_int_0x200) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":121 * FILT_CHANNEL_AFTERTOUCH=0x100 * FILT_POLY_AFTERTOUCH=0x200 * FILT_AFTERTOUCH=0x300 # <<<<<<<<<<<<<< * FILT_PROGRAM=0x400 * FILT_CONTROL=0x800 */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_FILT_AFTERTOUCH, __pyx_int_0x300) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":122 * FILT_POLY_AFTERTOUCH=0x200 * FILT_AFTERTOUCH=0x300 * FILT_PROGRAM=0x400 # <<<<<<<<<<<<<< * FILT_CONTROL=0x800 * FILT_PITCHBEND=0x1000 */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_FILT_PROGRAM, __pyx_int_0x400) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":123 * FILT_AFTERTOUCH=0x300 * FILT_PROGRAM=0x400 * FILT_CONTROL=0x800 # <<<<<<<<<<<<<< * FILT_PITCHBEND=0x1000 * FILT_MTC=0x2000 */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_FILT_CONTROL, __pyx_int_0x800) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":124 * FILT_PROGRAM=0x400 * FILT_CONTROL=0x800 * FILT_PITCHBEND=0x1000 # <<<<<<<<<<<<<< * FILT_MTC=0x2000 * FILT_SONG_POSITION=0x4000 */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_FILT_PITCHBEND, __pyx_int_0x1000) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":125 * FILT_CONTROL=0x800 * FILT_PITCHBEND=0x1000 * FILT_MTC=0x2000 # <<<<<<<<<<<<<< * FILT_SONG_POSITION=0x4000 * FILT_SONG_SELECT=0x8000 */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_FILT_MTC, __pyx_int_0x2000) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":126 * FILT_PITCHBEND=0x1000 * FILT_MTC=0x2000 * FILT_SONG_POSITION=0x4000 # <<<<<<<<<<<<<< * FILT_SONG_SELECT=0x8000 * FILT_TUNE=0x10000 */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_FILT_SONG_POSITION, __pyx_int_0x4000) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":127 * FILT_MTC=0x2000 * FILT_SONG_POSITION=0x4000 * FILT_SONG_SELECT=0x8000 # <<<<<<<<<<<<<< * FILT_TUNE=0x10000 * FALSE=0 */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_FILT_SONG_SELECT, __pyx_int_0x8000) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":128 * FILT_SONG_POSITION=0x4000 * FILT_SONG_SELECT=0x8000 * FILT_TUNE=0x10000 # <<<<<<<<<<<<<< * FALSE=0 * TRUE=1 */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_FILT_TUNE, __pyx_int_0x10000) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":129 * FILT_SONG_SELECT=0x8000 * FILT_TUNE=0x10000 * FALSE=0 # <<<<<<<<<<<<<< * TRUE=1 * */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_FALSE, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":130 * FILT_TUNE=0x10000 * FALSE=0 * TRUE=1 # <<<<<<<<<<<<<< * * def Initialize(): */ if (PyObject_SetAttr(__pyx_m, __pyx_kp_TRUE, __pyx_int_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "/home/rene/dev/pygame/pygame/trunk/src/pypm.pyx":514 * return err * * def Read(self,length): # <<<<<<<<<<<<<< * """ * Read(length): returns up to midi events stored in */ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_1); __Pyx_AddTraceback("pypm"); Py_DECREF(__pyx_m); __pyx_m = 0; __pyx_L0:; __Pyx_FinishRefcountContext(); #if PY_MAJOR_VERSION < 3 return; #else return __pyx_m; #endif } static const char *__pyx_filenames[] = { "pypm.pyx", }; /* Runtime support code */ static void __pyx_init_filenames(void) { __pyx_f = __pyx_filenames; } 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 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 *number, *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"; } number = (num_expected == 1) ? "" : "s"; PyErr_Format(PyExc_TypeError, #if PY_VERSION_HEX < 0x02050000 "%s() takes %s %d positional argument%s (%d given)", #else "%s() takes %s %zd positional argument%s (%zd given)", #endif func_name, more_or_less, num_expected, number, num_found); } 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 PyObject *__Pyx_Import(PyObject *name, PyObject *from_list) { PyObject *__import__ = 0; PyObject *empty_list = 0; PyObject *module = 0; PyObject *global_dict = 0; PyObject *empty_dict = 0; PyObject *list; __import__ = __Pyx_GetAttrString(__pyx_b, "__import__"); if (!__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; module = PyObject_CallFunctionObjArgs(__import__, name, global_dict, empty_dict, list, NULL); bad: Py_XDECREF(empty_list); Py_XDECREF(__import__); Py_XDECREF(empty_dict); return module; } #if 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 *arg_tuple, int newline) { PyObject *f; PyObject* v; int i; if (!(f = __Pyx_GetStdout())) return -1; for (i=0; i < PyTuple_GET_SIZE(arg_tuple); i++) { if (PyFile_SoftSpace(f, 1)) { if (PyFile_WriteString(" ", f) < 0) return -1; } v = PyTuple_GET_ITEM(arg_tuple, i); if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0) return -1; 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) return -1; PyFile_SoftSpace(f, 0); } return 0; } #else /* Python 3 has a print function */ static int __Pyx_Print(PyObject *arg_tuple, int newline) { PyObject* kwargs = 0; PyObject* result = 0; PyObject* end_string; if (!__pyx_print) { __pyx_print = __Pyx_GetAttrString(__pyx_b, "print"); if (!__pyx_print) return -1; } if (!newline) { if (!__pyx_print_kwargs) { __pyx_print_kwargs = PyDict_New(); if (!__pyx_print_kwargs) return -1; end_string = PyUnicode_FromStringAndSize(" ", 1); if (!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 (!result) return -1; Py_DECREF(result); return 0; } #endif #if PY_MAJOR_VERSION < 3 static int __Pyx_PrintOne(PyObject *o) { PyObject *f; if (!(f = __Pyx_GetStdout())) return -1; if (PyFile_SoftSpace(f, 0)) { if (PyFile_WriteString(" ", f) < 0) return -1; } if (PyFile_WriteObject(o, f, Py_PRINT_RAW) < 0) return -1; if (PyFile_WriteString("\n", f) < 0) return -1; return 0; /* the line below is just to avoid compiler * compiler warnings about unused functions */ return __Pyx_Print(NULL, 0); } #else /* Python 3 has a print function */ static int __Pyx_PrintOne(PyObject *o) { int res; PyObject* arg_tuple = PyTuple_New(1); if (unlikely(!arg_tuple)) return -1; Py_INCREF(o); PyTuple_SET_ITEM(arg_tuple, 0, o); res = __Pyx_Print(arg_tuple, 1); Py_DECREF(arg_tuple); return res; } #endif static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) { PyObject *result; result = PyObject_GetAttr(dict, name); if (!result) PyErr_SetObject(PyExc_NameError, name); return result; } static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) { 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; } static INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; PyThreadState *tstate = PyThreadState_GET(); #if PY_MAJOR_VERSION >= 3 /* Note: this is a temporary work-around to prevent crashes in Python 3.0 */ if ((tstate->exc_type != NULL) & (tstate->exc_type != Py_None)) { tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; PyErr_NormalizeException(&type, &value, &tb); PyErr_NormalizeException(&tmp_type, &tmp_value, &tmp_tb); tstate->exc_type = 0; tstate->exc_value = 0; tstate->exc_traceback = 0; PyException_SetContext(value, tmp_value); Py_DECREF(tmp_type); Py_XDECREF(tmp_tb); } #endif 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 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; } static INLINE int __Pyx_StrEq(const char *s1, const char *s2) { while (*s1 != '\0' && *s1 == *s2) { s1++; s2++; } return *s1 == *s2; } static INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) { 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())) return (unsigned char)-1; if (unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned char"); return (unsigned char)-1; } PyErr_SetString(PyExc_OverflowError, "value too large to convert to unsigned char"); return (unsigned char)-1; } return (unsigned char)val; } return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x); } static INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) { 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())) return (unsigned short)-1; if (unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned short"); return (unsigned short)-1; } PyErr_SetString(PyExc_OverflowError, "value too large to convert to unsigned short"); return (unsigned short)-1; } return (unsigned short)val; } return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x); } static INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) { 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())) return (unsigned int)-1; if (unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned int"); return (unsigned int)-1; } PyErr_SetString(PyExc_OverflowError, "value too large to convert to unsigned int"); return (unsigned int)-1; } return (unsigned int)val; } return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x); } static INLINE char __Pyx_PyInt_AsChar(PyObject* x) { if (sizeof(char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(char)val)) { if (unlikely(val == -1 && PyErr_Occurred())) return (char)-1; PyErr_SetString(PyExc_OverflowError, "value too large to convert to char"); return (char)-1; } return (char)val; } return (char)__Pyx_PyInt_AsLong(x); } static INLINE short __Pyx_PyInt_AsShort(PyObject* x) { if (sizeof(short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(short)val)) { if (unlikely(val == -1 && PyErr_Occurred())) return (short)-1; PyErr_SetString(PyExc_OverflowError, "value too large to convert to short"); return (short)-1; } return (short)val; } return (short)__Pyx_PyInt_AsLong(x); } static INLINE int __Pyx_PyInt_AsInt(PyObject* x) { if (sizeof(int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(int)val)) { if (unlikely(val == -1 && PyErr_Occurred())) return (int)-1; PyErr_SetString(PyExc_OverflowError, "value too large to convert to int"); return (int)-1; } return (int)val; } return (int)__Pyx_PyInt_AsLong(x); } static INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) { 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())) return (signed char)-1; PyErr_SetString(PyExc_OverflowError, "value too large to convert to signed char"); return (signed char)-1; } return (signed char)val; } return (signed char)__Pyx_PyInt_AsSignedLong(x); } static INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) { 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())) return (signed short)-1; PyErr_SetString(PyExc_OverflowError, "value too large to convert to signed short"); return (signed short)-1; } return (signed short)val; } return (signed short)__Pyx_PyInt_AsSignedLong(x); } static INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) { 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())) return (signed int)-1; PyErr_SetString(PyExc_OverflowError, "value too large to convert to signed int"); return (signed int)-1; } return (signed int)val; } return (signed int)__Pyx_PyInt_AsSignedLong(x); } static INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) { #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_CheckExact(x) || PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (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_CheckExact(x) || PyLong_Check(x))) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned long"); return (unsigned long)-1; } return PyLong_AsUnsignedLong(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 INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) { #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_CheckExact(x) || PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (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_CheckExact(x) || PyLong_Check(x))) { 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 PyLong_AsUnsignedLongLong(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 INLINE long __Pyx_PyInt_AsLong(PyObject* x) { #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_CheckExact(x) || PyInt_Check(x))) { long val = PyInt_AS_LONG(x); return (long)val; } else #endif if (likely(PyLong_CheckExact(x) || PyLong_Check(x))) { return 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 INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) { #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_CheckExact(x) || PyInt_Check(x))) { long val = PyInt_AS_LONG(x); return (PY_LONG_LONG)val; } else #endif if (likely(PyLong_CheckExact(x) || PyLong_Check(x))) { return 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 INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) { #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_CheckExact(x) || PyInt_Check(x))) { long val = PyInt_AS_LONG(x); return (signed long)val; } else #endif if (likely(PyLong_CheckExact(x) || PyLong_Check(x))) { return 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 INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) { #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_CheckExact(x) || PyInt_Check(x))) { long val = PyInt_AS_LONG(x); return (signed PY_LONG_LONG)val; } else #endif if (likely(PyLong_CheckExact(x) || PyLong_Check(x))) { return 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; } } #include "compile.h" #include "frameobject.h" #include "traceback.h" static void __Pyx_AddTraceback(const char *funcname) { PyObject *py_srcfile = 0; PyObject *py_funcname = 0; PyObject *py_globals = 0; PyObject *empty_string = 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; #if PY_MAJOR_VERSION < 3 empty_string = PyString_FromStringAndSize("", 0); #else empty_string = PyBytes_FromStringAndSize("", 0); #endif if (!empty_string) goto bad; py_code = PyCode_New( 0, /*int argcount,*/ #if PY_MAJOR_VERSION >= 3 0, /*int kwonlyargcount,*/ #endif 0, /*int nlocals,*/ 0, /*int stacksize,*/ 0, /*int flags,*/ empty_string, /*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,*/ empty_string /*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(empty_string); 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->is_identifier)) { *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_identifier || (t->is_unicode && t->intern)) { *t->p = PyUnicode_InternFromString(t->s); } else if (t->is_unicode) { *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 INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { if (x == Py_True) return 1; else if ((x == Py_False) | (x == Py_None)) return 0; else return PyObject_IsTrue(x); } static 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 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 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 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; } pygame-1.9.1release/src/pygamedocs.h0000644000175000017500000035622211216627051017351 0ustar vincentvincent/* Auto generated file: with makeref.py . Docs go in src/ *.doc . */ #define DOC_PYGAME "the top level pygame package" #define DOC_PYGAMEINIT "pygame.init(): return (numpass, numfail)\ninitialize all imported pygame modules" #define DOC_PYGAMEQUIT "pygame.quit(): return None\nuninitialize all pygame modules" #define DOC_PYGAMEERROR "raise pygame.error, message\nstandard pygame exception" #define DOC_PYGAMEGETERROR "pygame.get_error(): return errorstr\nget the current error message" #define DOC_PYGAMESETERROR "pygame.set_error(error_msg): return None\nset the current error message" #define DOC_PYGAMEGETSDLVERSION "pygame.get_sdl_version(): return major, minor, patch\nget the version number of SDL" #define DOC_PYGAMEGETSDLBYTEORDER "pygame.get_sdl_byteorder(): return int\nget the byte order of SDL" #define DOC_PYGAMEREGISTERQUIT "register_quit(callable): return None\nregister a function to be called when pygame quits" #define DOC_PYGAMEVERSION "module pygame.version\nsmall module containing version information" #define DOC_PYGAMEVERSIONVER "pygame.version.ver = '1.2'\nversion number as a string" #define DOC_PYGAMEVERSIONVERNUM "pygame.version.vernum = (1, 5, 3)\ntupled integers of the version" #define DOC_PYGAMECAMERA "pygame module for camera use" #define DOC_PYGAMECAMERACOLORSPACE "pygame.camera.colorspace(Surface, format, DestSurface = None): return Surface\nSurface colorspace conversion" #define DOC_PYGAMECAMERALISTCAMERAS "pygame.camera.list_cameras(): return [cameras]\nreturns a list of available cameras" #define DOC_PYGAMECAMERACAMERA "pygame.camera.Camera(device, (width, height), format): return Camera\nload a camera" #define DOC_CAMERASTART "Camera.start(): return None\nopens, initializes, and starts capturing" #define DOC_CAMERASTOP "Camera.stop(): return None\nstops, uninitializes, and closes the camera" #define DOC_CAMERAGETCONTROLS "Camera.get_controls(): return (hflip = bool, vflip = bool, brightness)\ngets current values of user controls" #define DOC_CAMERASETCONTROLS "Camera.set_controls(hflip = bool, vflip = bool, brightness): return (hflip = bool, vflip = bool, brightness)\nchanges camera settings if supported by the camera" #define DOC_CAMERAGETSIZE "Camera.get_size(): return (width, height)\nreturns the dimensions of the images being recorded" #define DOC_CAMERAQUERYIMAGE "Camera.query_image(): return bool\nchecks if a frame is ready" #define DOC_CAMERAGETIMAGE "Camera.get_image(Surface = None): return Surface\ncaptures an image as a Surface" #define DOC_CAMERAGETRAW "Camera.get_raw(): return string\nreturns an unmodified image as a string" #define DOC_PYGAMECDROM "pygame module for audio cdrom control" #define DOC_PYGAMECDROMINIT "pygame.cdrom.init(): return None\ninitialize the cdrom module" #define DOC_PYGAMECDROMQUIT "pygame.cdrom.quit(): return None\nuninitialize the cdrom module" #define DOC_PYGAMECDROMGETINIT "pygame.cdrom.get_init(): return bool\ntrue if the cdrom module is initialized" #define DOC_PYGAMECDROMGETCOUNT "pygame.cdrom.get_count(): return count\nnumber of cd drives on the system" #define DOC_PYGAMECDROMCD "pygame.cdrom.CD(id): return CD\nclass to manage a cdrom drive" #define DOC_CDINIT "CD.init(): return None\ninitialize a cdrom drive for use" #define DOC_CDQUIT "CD.quit(): return None\nuninitialize a cdrom drive for use" #define DOC_CDGETINIT "CD.get_init(): return bool\ntrue if this cd device initialized" #define DOC_CDPLAY "CD.play(track, start=None, end=None): return None\nstart playing audio" #define DOC_CDSTOP "CD.stop(): return None\nstop audio playback" #define DOC_CDPAUSE "CD.pause(): return None\ntemporarily stop audio playback" #define DOC_CDRESUME "CD.resume(): return None\nunpause audio playback" #define DOC_CDEJECT "CD.eject(): return None\neject or open the cdrom drive" #define DOC_CDGETID "CD.get_id(): return id\nthe index of the cdrom drive" #define DOC_CDGETNAME "CD.get_name(): return name\nthe system name of the cdrom drive" #define DOC_CDGETBUSY "CD.get_busy(): return bool\ntrue if the drive is playing audio" #define DOC_CDGETPAUSED "CD.get_paused(): return bool\ntrue if the drive is paused" #define DOC_CDGETCURRENT "CD.get_current(): return track, seconds\nthe current audio playback position" #define DOC_CDGETEMPTY "CD.get_empty(): return bool\nFalse if a cdrom is in the drive" #define DOC_CDGETNUMTRACKS "CD.get_numtracks(): return count\nthe number of tracks on the cdrom" #define DOC_CDGETTRACKAUDIO "CD.get_track_audio(track): return bool\ntrue if the cdrom track has audio data" #define DOC_CDGETALL "CD.get_all(): return [(audio, start, end, lenth), ...]\nget all track information" #define DOC_CDGETTRACKSTART "CD.get_track_start(track): return seconds\nstart time of a cdrom track" #define DOC_CDGETTRACKLENGTH "CD.get_track_length(track): return seconds\nlength of a cdrom track" #define DOC_PYGAMECOLOR "pygame.Color(name): Return Color\npygame.Color(r, g, b, a): Return Color\npygame.Color(rgbvalue): Return Color\npygame object for color representations" #define DOC_COLORR "Color.r: Return int\nGets or sets the red value of the Color." #define DOC_COLORG "Color.g: Return int\nGets or sets the green value of the Color." #define DOC_COLORB "Color.b: Return int\nGets or sets the blue value of the Color." #define DOC_COLORA "Color.a: Return int\nGets or sets the alpha value of the Color." #define DOC_COLORCMY "Color.cmy: Return tuple\nGets or sets the CMY representation of the Color." #define DOC_COLORHSVA "Color.hsva: Return tuple\nGets or sets the HSVA representation of the Color." #define DOC_COLORHSLA "Color.hsla: Return tuple\nGets or sets the HSLA representation of the Color." #define DOC_COLORI1I2I3 "Color.i1i2i3: Return tuple\nGets or sets the I1I2I3 representation of the Color." #define DOC_COLORNORMALIZE "Color.normalize(): Return tuple\nReturns the normalized RGBA values of the Color." #define DOC_COLORCORRECTGAMMA "Color.correct_gamma (gamma): Return Color\nApplies a certain gamma value to the Color." #define DOC_COLORSETLENGTH "Color.set_length(len)\nSet the number of elements in the Color to 1,2,3, or 4." #define DOC_PYGAMECURSORS "pygame module for cursor resources" #define DOC_PYGAMECURSORSCOMPILE "pygame.cursor.compile(strings, black='X', white='.', xor='o'): return data, mask\ncreate binary cursor data from simple strings" #define DOC_PYGAMECURSORSLOADXBM "pygame.cursors.load_xbm(cursorfile): return cursor_args\npygame.cursors.load_xbm(cursorfile, maskfile): return cursor_args\nload cursor data from an xbm file" #define DOC_PYGAMEDISPLAY "pygame module to control the display window and screen" #define DOC_PYGAMEDISPLAYINIT "pygame.display.init(): return None\ninitialize the display module" #define DOC_PYGAMEDISPLAYQUIT "pygame.display.quit(): return None\nuninitialize the display module" #define DOC_PYGAMEDISPLAYGETINIT "pygame.display.get_init(): return bool\ntrue if the display module is initialized" #define DOC_PYGAMEDISPLAYSETMODE "pygame.display.set_mode(resolution=(0,0), flags=0, depth=0): return Surface\ninitialize a window or screen for display" #define DOC_PYGAMEDISPLAYGETSURFACE "pygame.display.get_surface(): return Surface\nget a reference to the currently set display surface" #define DOC_PYGAMEDISPLAYFLIP "pygame.display.flip(): return None\nupdate the full display Surface to the screen" #define DOC_PYGAMEDISPLAYUPDATE "pygame.display.update(rectangle=None): return None\npygame.display.update(rectangle_list): return None\nupdate portions of the screen for software displays" #define DOC_PYGAMEDISPLAYGETDRIVER "pygame.display.get_driver(): return name\nget the name of the pygame display backend" #define DOC_PYGAMEDISPLAYINFO "pygame.display.Info(): return VideoInfo\nCreate a video display information object" #define DOC_PYGAMEDISPLAYGETWMINFO "pygame.display.get_wm_info(): return dict\nGet information about the current windowing system" #define DOC_PYGAMEDISPLAYLISTMODES "pygame.display.list_modes(depth=0, flags=pygame.FULLSCREEN): return list\nget list of available fullscreen modes" #define DOC_PYGAMEDISPLAYMODEOK "pygame.display.mode_ok(size, flags=0, depth=0): return depth\npick the best color depth for a display mode" #define DOC_PYGAMEDISPLAYGLGETATTRIBUTE "pygame.display.gl_get_attribute(flag): return value\nget the value for an opengl flag for the current display" #define DOC_PYGAMEDISPLAYGLSETATTRIBUTE "pygame.display.gl_set_attribute(flag, value): return None\nrequest an opengl display attribute for the display mode" #define DOC_PYGAMEDISPLAYGETACTIVE "pygame.display.get_active(): return bool\ntrue when the display is active on the display" #define DOC_PYGAMEDISPLAYICONIFY "pygame.display.iconify(): return bool\niconify the display surface" #define DOC_PYGAMEDISPLAYTOGGLEFULLSCREEN "pygame.display.toggle_fullscreen(): return bool\nswitch between fullscreen and windowed displays" #define DOC_PYGAMEDISPLAYSETGAMMA "pygame.display.set_gamma(red, green=None, blue=None): return bool\nchange the hardware gamma ramps" #define DOC_PYGAMEDISPLAYSETGAMMARAMP "change the hardware gamma ramps with a custom lookup\npygame.display.set_gamma_ramp(red, green, blue): return bool\nset_gamma_ramp(red, green, blue): return bool" #define DOC_PYGAMEDISPLAYSETICON "pygame.display.set_icon(Surface): return None\nchange the system image for the display window" #define DOC_PYGAMEDISPLAYSETCAPTION "pygame.display.set_caption(title, icontitle=None): return None\nset the current window caption" #define DOC_PYGAMEDISPLAYGETCAPTION "pygame.display.get_caption(): return (title, icontitle)\nget the current window caption" #define DOC_PYGAMEDISPLAYSETPALETTE "pygame.display.set_palette(palette=None): return None\nset the display color palette for indexed displays" #define DOC_PYGAMEDRAW "pygame module for drawing shapes" #define DOC_PYGAMEDRAWRECT "pygame.draw.rect(Surface, color, Rect, width=0): return Rect\ndraw a rectangle shape" #define DOC_PYGAMEDRAWPOLYGON "pygame.draw.polygon(Surface, color, pointlist, width=0): return Rect\ndraw a shape with any number of sides" #define DOC_PYGAMEDRAWCIRCLE "pygame.draw.circle(Surface, color, pos, radius, width=0): return Rect\ndraw a circle around a point" #define DOC_PYGAMEDRAWELLIPSE "pygame.draw.ellipse(Surface, color, Rect, width=0): return Rect\ndraw a round shape inside a rectangle" #define DOC_PYGAMEDRAWARC "pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width=1): return Rect\ndraw a partial section of an ellipse" #define DOC_PYGAMEDRAWLINE "pygame.draw.line(Surface, color, start_pos, end_pos, width=1): return Rect\ndraw a straight line segment" #define DOC_PYGAMEDRAWLINES "pygame.draw.lines(Surface, color, closed, pointlist, width=1): return Rect\ndraw multiple contiguous line segments" #define DOC_PYGAMEDRAWAALINE "pygame.draw.aaline(Surface, color, startpos, endpos, blend=1): return Rect\ndraw fine antialiased lines" #define DOC_PYGAMEDRAWAALINES "pygame.draw.aalines(Surface, color, closed, pointlist, blend=1): return Rect" #define DOC_PYGAMEEVENT "pygame module for interacting with events and queues" #define DOC_PYGAMEEVENTPUMP "pygame.event.pump(): return None\ninternally process pygame event handlers" #define DOC_PYGAMEEVENTGET "pygame.event.get(): return Eventlist\npygame.event.get(type): return Eventlist\npygame.event.get(typelist): return Eventlist\nget events from the queue" #define DOC_PYGAMEEVENTPOLL "pygame.event.poll(): return Event\nget a single event from the queue" #define DOC_PYGAMEEVENTWAIT "pygame.event.wait(): return Event\nwait for a single event from the queue" #define DOC_PYGAMEEVENTPEEK "pygame.event.peek(type): return bool\npygame.event.peek(typelist): return bool\ntest if event types are waiting on the queue" #define DOC_PYGAMEEVENTCLEAR "pygame.event.clear(): return None\npygame.event.clear(type): return None\npygame.event.clear(typelist): return None\nremove all events from the queue" #define DOC_PYGAMEEVENTEVENTNAME "pygame.event.event_name(type): return string\nget the string name from and event id" #define DOC_PYGAMEEVENTSETBLOCKED "pygame.event.set_blocked(type): return None\npygame.event.set_blocked(typelist): return None\npygame.event.set_blocked(None): return None\ncontrol which events are allowed on the queue" #define DOC_PYGAMEEVENTSETALLOWED "pygame.event.set_allowed(type): return None\npygame.event.set_allowed(typelist): return None\npygame.event.set_allowed(None): return None\ncontrol which events are allowed on the queue" #define DOC_PYGAMEEVENTGETBLOCKED "pygame.event.get_blocked(type): return bool\ntest if a type of event is blocked from the queue" #define DOC_PYGAMEEVENTSETGRAB "pygame.event.set_grab(bool): return None\ncontrol the sharing of input devices with other applications" #define DOC_PYGAMEEVENTGETGRAB "pygame.event.get_grab(): return bool\ntest if the program is sharing input devices" #define DOC_PYGAMEEVENTPOST "pygame.event.post(Event): return None\nplace a new event on the queue" #define DOC_PYGAMEEVENTEVENT "pygame.event.Event(type, dict): return Event\npygame.event.Event(type, **attributes): return Event\ncreate a new event object" #define DOC_PYGAMEEXAMPLES "module of example programs" #define DOC_PYGAMEEXAMPLESALIENSMAIN "pygame.aliens.main(): return None\nplay the full aliens example" #define DOC_PYGAMEEXAMPLESOLDALIENMAIN "pygame.examples.oldalien.main(): return None\nplay the original aliens example" #define DOC_PYGAMEEXAMPLESSTARSMAIN "pygame.examples.stars.main(): return None\nrun a simple starfield example" #define DOC_PYGAMEEXAMPLESCHIMPMAIN "pygame.examples.chimp.main(): return None\nhit the moving chimp" #define DOC_PYGAMEEXAMPLESMOVEITMAIN "pygame.examples.moveit.main(): return None\ndisplay animated objects on the screen" #define DOC_PYGAMEEXAMPLESFONTYMAIN "pygame.examples.fonty.main(): return None\nrun a font rendering example" #define DOC_PYGAMEEXAMPLESVGRADEMAIN "pygame.examples.vgrade.main(): return None\ndisplay a vertical gradient" #define DOC_PYGAMEEXAMPLESEVENTLISTMAIN "pygame.examples.eventlist.main(): return None\ndisplay pygame events" #define DOC_PYGAMEEXAMPLESARRAYDEMOMAIN "pygame.examples.arraydemo.main(arraytype=None): return None\nshow various surfarray effects" #define DOC_PYGAMEEXAMPLESSOUNDMAIN "pygame.examples.sound.main(file_path=None): return None\nload and play a sound" #define DOC_PYGAMEEXAMPLESSOUNDARRAYDEMOSMAIN "pygame.examples.sound_array_demos.main(arraytype=None): return None\nplay various sndarray effects" #define DOC_PYGAMEEXAMPLESLIQUIDMAIN "pygame.examples.liquid.main(): return None\ndisplay an animated liquid effect" #define DOC_PYGAMEEXAMPLESGLCUBEMAIN "pygame.examples.glcube.main(): return None\ndisplay an animated 3D cube using OpenGL" #define DOC_PYGAMEEXAMPLESSCRAPCLIPBOARDMAIN "pygame.examples.scrap_clipboard.main(): return None\naccess the clipboard" #define DOC_PYGAMEEXAMPLESMASKMAIN "pygame.examples.mask.main(*args): return None\ndisplay multiple images bounce off each other using collision detection" #define DOC_PYGAMEEXAMPLESTESTSPRITEMAIN "pygame.examples.testsprite.main(update_rects = True, use_static = False, use_FastRenderGroup = False, screen_dims = [640, 480], use_alpha = False, flags = 0): return None\nshow lots of sprites moving around" #define DOC_PYGAMEEXAMPLESHEADLESSNOWINDOWSNEEDEDMAIN "pygame.examples.headless_no_windows_needed.main(fin, fout, w, h): return None\nwrite an image file that is smoothscaled copy of an input file" #define DOC_PYGAMEEXAMPLESFASTEVENTSMAIN "pygame.examples.fastevents.main(): return None\nstress test the fastevents module" #define DOC_PYGAMEEXAMPLESOVERLAYMAIN "pygame.examples.overlay.main(fname): return None\nplay a .pgm video using overlays" #define DOC_PYGAMEEXAMPLESBLENDFILLMAIN "pygame.examples.blend_fill.main(): return None\ndemonstrate the various surface.fill method blend options" #define DOC_PYGAMEEXAMPLESCURSORSMAIN "pygame.examples.cursors.main(): return None\ndisplay two different custom cursors" #define DOC_PYGAMEEXAMPLESPIXELARRAYMAIN "pygame.examples.pixelarray.main(): return None\ndisplay various pixelarray generated effects" #define DOC_PYGAMEEXAMPLESSCALETESTMAIN "pygame.examples.scaletest.main(imagefile, convert_alpha=False, run_speed_test=True): return None\ninteractively scale an image using smoothscale" #define DOC_PYGAMEEXAMPLESMIDIMAIN "pygame.examples.midi.main(mode='output', device_id=None): return None\nrun a midi example" #define DOC_PYGAMEEXAMPLESSCROLLMAIN "pygame.examples.scroll.main(image_file=None): return None\nrun a Surface.scroll example that shows a magnified image" #define DOC_PYGAMEEXAMPLESMOVIEPLAYERMAIN "pygame.examples.moveplayer.main(filepath): return None\nplay an MPEG movie" #define DOC_PYGAMEFONT "pygame module for loading and rendering fonts" #define DOC_PYGAMEFONTINIT "pygame.font.init(): return None\ninitialize the font module" #define DOC_PYGAMEFONTQUIT "pygame.font.quit(): return None\nuninitialize the font module" #define DOC_PYGAMEFONTGETINIT "pygame.font.get_init(): return bool\ntrue if the font module is initialized" #define DOC_PYGAMEFONTGETDEFAULTFONT "pygame.font.get_default_font(): return string\nget the filename of the default font" #define DOC_PYGAMEFONTGETFONTS "pygame.font.get_fonts(): return list of strings\nget all available fonts" #define DOC_PYGAMEFONTMATCHFONT "pygame.font.match_font(name, bold=False, italic=False): return path\nfind a specific font on the system" #define DOC_PYGAMEFONTSYSFONT "pygame.font.SysFont(name, size, bold=False, italic=False): return Font\ncreate a Font object from the system fonts" #define DOC_PYGAMEFONTFONT "pygame.font.Font(filename, size): return Font\npygame.font.Font(object, size): return Font\ncreate a new Font object from a file" #define DOC_FONTRENDER "Font.render(text, antialias, color, background=None): return Surface\ndraw text on a new Surface" #define DOC_FONTSIZE "Font.size(text): return (width, height)\ndetermine the amount of space needed to render text" #define DOC_FONTSETUNDERLINE "Font.set_underline(bool): return None\ncontrol if text is rendered with an underline" #define DOC_FONTGETUNDERLINE "Font.get_underline(): return bool\ncheck if text will be rendered with an underline" #define DOC_FONTSETBOLD "Font.set_bold(bool): return None\nenable fake rendering of bold text" #define DOC_FONTGETBOLD "Font.get_bold(): return bool\ncheck if text will be rendered bold" #define DOC_FONTSETITALIC "Font.set_bold(bool): return None\nenable fake rendering of italic text" #define DOC_FONTMETRICS "Font.metrics(text): return list\nGets the metrics for each character in the pased string." #define DOC_FONTGETITALIC "Font.get_italic(): return bool\ncheck if the text will be rendered italic" #define DOC_FONTGETLINESIZE "Font.get_linesize(): return int\nget the line space of the font text" #define DOC_FONTGETHEIGHT "Font.get_height(): return int\nget the height of the font" #define DOC_FONTGETASCENT "Font.get_ascent(): return int\nget the ascent of the font" #define DOC_FONTGETDESCENT "Font.get_descent(): return int\nget the descent of the font" #define DOC_PYGAMEGFXDRAW "pygame module for drawing shapes" #define DOC_PYGAMEGFXDRAWPIXEL "pygame.gfxdraw.pixel(surface, x, y, color): return None\nplace a pixel" #define DOC_PYGAMEGFXDRAWHLINE "pygame.gfxdraw.hline(surface, x1, x2, y, color): return None\ndraw a horizontal line" #define DOC_PYGAMEGFXDRAWVLINE "pgyame.gfxdraw.vline(surface, x, y1, y2, color): return None\ndraw a vertical line" #define DOC_PYGAMEGFXDRAWRECTANGLE "pgyame.gfxdraw.rectangle(surface, rect, color): return None\ndraw a rectangle" #define DOC_PYGAMEGFXDRAWBOX "pgyame.gfxdraw.box(surface, rect, color): return None\ndraw a box" #define DOC_PYGAMEGFXDRAWLINE "pgyame.gfxdraw.line(surface, x1, y1, x2, y2, color): return None\ndraw a line" #define DOC_PYGAMEGFXDRAWCIRCLE "pgyame.gfxdraw.circle(surface, x, y, r, color): return None\ndraw a circle" #define DOC_PYGAMEGFXDRAWARC "pgyame.gfxdraw.arc(surface, x, y, r, start, end, color): return None\ndraw an arc" #define DOC_PYGAMEGFXDRAWAACIRCLE "pgyame.gfxdraw.aacircle(surface, x, y, r, color): return None\ndraw an anti-aliased circle" #define DOC_PYGAMEGFXDRAWFILLEDCIRCLE "pgyame.gfxdraw.filled_circle(surface, x, y, r, color): return None\ndraw a filled circle" #define DOC_PYGAMEGFXDRAWELLIPSE "pgyame.gfxdraw.ellipse(surface, x, y, rx, ry, color): return None\ndraw an ellipse" #define DOC_PYGAMEGFXDRAWAAELLIPSE "pgyame.gfxdraw.aaellipse(surface, x, y, rx, ry, color): return None\ndraw an anti-aliased ellipse" #define DOC_PYGAMEGFXDRAWFILLEDELLIPSE "pgyame.gfxdraw.filled_ellipse(surface, x, y, rx, ry, color): return None\ndraw a filled ellipse" #define DOC_PYGAMEGFXDRAWPIE "pgyame.gfxdraw.pie(surface, x, y, r, start, end, color): return None\ndraw a pie" #define DOC_PYGAMEGFXDRAWTRIGON "pgyame.gfxdraw.trigon(surface, x1, y1, x2, y2, x3, y3, color): return None\ndraw a triangle" #define DOC_PYGAMEGFXDRAWAATRIGON "pgyame.gfxdraw.aatrigon(surface, x1, y1, x2, y2, x3, y3, color): return None\ndraw an anti-aliased triangle" #define DOC_PYGAMEGFXDRAWFILLEDTRIGON "pgyame.gfxdraw.filled_trigon(surface, x1, y1, x3, y2, x3, y3, color): return None\ndraw a filled trigon" #define DOC_PYGAMEGFXDRAWPOLYGON "pgyame.gfxdraw.polygon(surface, points, color): return None\ndraw a polygon" #define DOC_PYGAMEGFXDRAWAAPOLYGON "pgyame.gfxdraw.aapolygon(surface, points, color): return None\ndraw an anti-aliased polygon" #define DOC_PYGAMEGFXDRAWFILLEDPOLYGON "pgyame.gfxdraw.filled_polygon(surface, points, color): return None\ndraw a filled polygon" #define DOC_PYGAMEGFXDRAWTEXTUREDPOLYGON "pgyame.gfxdraw.textured_polygon(surface, points, texture, tx, ty): return None\ndraw a textured polygon" #define DOC_PYGAMEGFXDRAWBEZIER "pgyame.gfxdraw.bezier(surface, points, steps, color): return None\ndraw a bezier curve" #define DOC_PYGAMEIMAGE "pygame module for image transfer" #define DOC_PYGAMEIMAGELOAD "pygame.image.load(filename): return Surface\npygame.image.load(fileobj, namehint=""): return Surface\nload new image from a file" #define DOC_PYGAMEIMAGESAVE "pygame.image.save(Surface, filename): return None\nsave an image to disk" #define DOC_PYGAMEIMAGEGETEXTENDED "pygame.image.get_extended(): return bool\ntest if extended image formats can be loaded" #define DOC_PYGAMEIMAGETOSTRING "pygame.image.tostring(Surface, format, flipped=False): return string\ntransfer image to string buffer" #define DOC_PYGAMEIMAGEFROMSTRING "pygame.image.fromstring(string, size, format, flipped=False): return Surface\ncreate new Surface from a string buffer" #define DOC_PYGAMEIMAGEFROMBUFFER "pygame.image.frombuffer(string, size, format): return Surface\ncreate a new Surface that shares data inside a string buffer" #define DOC_PYGAMEJOYSTICK "pygame module for interacting with joystick devices" #define DOC_PYGAMEJOYSTICKINIT "pygame.joystick.init(): return None\ninitialize the joystick module" #define DOC_PYGAMEJOYSTICKQUIT "pygame.joystick.quit(): return None\nuninitialize the joystick module" #define DOC_PYGAMEJOYSTICKGETINIT "pygame.joystick.get_init(): return bool\ntrue if the joystick module is initialized" #define DOC_PYGAMEJOYSTICKGETCOUNT "pygame.joystick.get_count(): return count\nnumber of joysticks on the system" #define DOC_PYGAMEJOYSTICKJOYSTICK "pygame.joystick.Joystick(id): return Joystick\ncreate a new Joystick object" #define DOC_JOYSTICKINIT "Joystick.init(): return None\ninitialize the Joystick" #define DOC_JOYSTICKQUIT "Joystick.quit(): return None\nuninitialize the Joystick" #define DOC_JOYSTICKGETINIT "Joystick.get_init(): return bool\ncheck if the Joystick is initialized" #define DOC_JOYSTICKGETID "Joystick.get_id(): return int\nget the Joystick ID" #define DOC_JOYSTICKGETNAME "Joystick.get_name(): return string\nget the Joystick system name" #define DOC_JOYSTICKGETNUMAXES "Joystick.get_numaxes(): return int\nget the number of axes on a Joystick" #define DOC_JOYSTICKGETAXIS "Joystick.get_axis(axis_number): return float\nget the current position of an axis" #define DOC_JOYSTICKGETNUMBALLS "Joystick.get_numballs(): return int\nget the number of trackballs on a Joystick" #define DOC_JOYSTICKGETBALL "Joystick.get_ball(ball_number): return x, y\nget the relative position of a trackball" #define DOC_JOYSTICKGETNUMBUTTONS "Joystick.get_numbuttons(): return int\nget the number of buttons on a Joystick" #define DOC_JOYSTICKGETBUTTON "Joystick.get_button(button): return bool\nget the current button state" #define DOC_JOYSTICKGETNUMHATS "Joystick.get_numhats(): return int\nget the number of hat controls on a Joystick" #define DOC_JOYSTICKGETHAT "Joystick.get_hat(hat_number): return x, y\nget the position of a joystick hat" #define DOC_PYGAMEKEY "pygame module to work with the keyboard" #define DOC_PYGAMEKEYGETFOCUSED "pygame.key.get_focused(): return bool\ntrue if the display is receiving keyboard input from the system" #define DOC_PYGAMEKEYGETPRESSED "pygame.key.get_pressed(): return bools\nget the state of all keyboard buttons" #define DOC_PYGAMEKEYGETMODS "pygame.key.get_mods(): return int\ndetermine which modifier keys are being held" #define DOC_PYGAMEKEYSETMODS "pygame.key.set_mods(int): return None\ntemporarily set which modifier keys are pressed" #define DOC_PYGAMEKEYSETREPEAT "pygame.key.set_repeat(): return None\npygame.key.set_repeat(delay, interval): return None\ncontrol how held keys are repeated" #define DOC_PYGAMEKEYGETREPEAT "pygame.key.get_repeat(): return (delay, interval)\nsee how held keys are repeated" #define DOC_PYGAMEKEYNAME "pygame.key.name(key): return string\nget the name of a key identifier" #define DOC_PYGAMELOCALS "pygame constants" #define DOC_PYGAMEMASK "pygame module for image masks." #define DOC_PYGAMEMASKFROMSURFACE "pygame.mask.from_surface(Surface, threshold = 127) -> Mask\nReturns a Mask from the given surface." #define DOC_PYGAMEMASKFROMTHRESHOLD "pygame.mask.from_surface(Surface, color, threshold = (0,0,0,255), othersurface = None, palette_colors = 1) -> Mask\nCreates a mask by thresholding Surfaces" #define DOC_PYGAMEMASKMASK "pygame.Mask((width, height)): return Mask\npygame object for representing 2d bitmasks" #define DOC_MASKGETSIZE "Mask.get_size() -> width,height\nReturns the size of the mask." #define DOC_MASKGETAT "Mask.get_at((x,y)) -> int\nReturns nonzero if the bit at (x,y) is set." #define DOC_MASKSETAT "Mask.set_at((x,y),value)\nSets the position in the mask given by x and y." #define DOC_MASKOVERLAP "Mask.overlap(othermask, offset) -> x,y\nReturns the point of intersection if the masks overlap with the given offset - or None if it does not overlap." #define DOC_MASKOVERLAPAREA "Mask.overlap_area(othermask, offset) -> numpixels\nReturns the number of overlapping 'pixels'." #define DOC_MASKOVERLAPMASK "Mask.overlap_mask(othermask, offset) -> Mask\nReturns a mask of the overlapping pixels" #define DOC_MASKFILL "Mask.fill()\nSets all bits to 1" #define DOC_MASKCLEAR "Mask.clear()\nSets all bits to 0" #define DOC_MASKINVERT "Mask.invert()\nFlips the bits in a Mask" #define DOC_MASKSCALE "Mask.scale((x, y)) -> Mask\nResizes a mask" #define DOC_MASKDRAW "Mask.draw(othermask, offset)\nDraws a mask onto another" #define DOC_MASKERASE "Mask.erase(othermask, offset)\nErases a mask from another" #define DOC_MASKCOUNT "Mask.count() -> pixels\nReturns the number of set pixels" #define DOC_MASKCENTROID "Mask.centroid() -> (x, y)\nReturns the centroid of the pixels in a Mask" #define DOC_MASKANGLE "Mask.angle() -> theta\nReturns the orientation of the pixels" #define DOC_MASKOUTLINE "Mask.outline(every = 1) -> [(x,y), (x,y) ...]\nlist of points outlining an object" #define DOC_MASKCONVOLVE "Mask.convolve(othermask, outputmask = None, offset = (0,0)) -> Mask\nReturn the convolution of self with another mask." #define DOC_MASKCONNECTEDCOMPONENT "Mask.connected_component((x,y) = None) -> Mask\nReturns a mask of a connected region of pixels." #define DOC_MASKCONNECTEDCOMPONENTS "Mask.connected_components(min = 0) -> [Masks]\nReturns a list of masks of connected regions of pixels." #define DOC_MASKGETBOUNDINGRECTS "Mask.get_bounding_rects() -> Rects\nReturns a list of bounding rects of regions of set pixels." #define DOC_PYGAMEMIDI "pygame module for interacting with midi input and output." #define DOC_PYGAMEMIDIINPUT "Input(device_id)\nInput(device_id, buffer_size)\nInput is used to get midi input from midi devices." #define DOC_INPUTCLOSE "Input.close(): return None\n closes a midi stream, flushing any pending buffers." #define DOC_INPUTPOLL "Input.poll(): return Bool\nreturns true if there's data, or false if not." #define DOC_INPUTREAD "Input.read(num_events): return midi_event_list\nreads num_events midi events from the buffer." #define DOC_PYGAMEMIDIMIDIEXCEPTION "MidiException(errno)\nexception that pygame.midi functions and classes can raise" #define DOC_PYGAMEMIDIOUTPUT "Output(device_id)\nOutput(device_id, latency = 0)\nOutput(device_id, buffer_size = 4096)\nOutput(device_id, latency, buffer_size)\nOutput is used to send midi to an output device" #define DOC_OUTPUTABORT "Output.abort(): return None\n terminates outgoing messages immediately" #define DOC_OUTPUTCLOSE "Output.close(): return None\n closes a midi stream, flushing any pending buffers." #define DOC_OUTPUTNOTEOFF "Output.note_off(note, velocity=None, channel = 0)\nturns a midi note off. Note must be on." #define DOC_OUTPUTNOTEON "Output.note_on(note, velocity=None, channel = 0)\nturns a midi note on. Note must be off." #define DOC_OUTPUTSETINSTRUMENT "Output.set_instrument(instrument_id, channel = 0)\nselect an instrument, with a value between 0 and 127" #define DOC_OUTPUTWRITE "Output.write(data)\nwrites a list of midi data to the Output" #define DOC_OUTPUTWRITESHORT "Output.write_short(status)\nOutput.write_short(status, data1 = 0, data2 = 0)\nwrite_short(status <, data1><, data2>)" #define DOC_OUTPUTWRITESYSEX "Output.write_sys_ex(when, msg)\nwrites a timestamped system-exclusive midi message." #define DOC_PYGAMEMIDIGETCOUNT "pygame.midi.get_count(): return num_devices\ngets the number of devices." #define DOC_PYGAMEMIDIGETDEFAULTINPUTID "pygame.midi.get_default_input_id(): return default_id\ngets default input device number" #define DOC_PYGAMEMIDIGETDEFAULTOUTPUTID "pygame.midi.get_default_output_id(): return default_id\ngets default output device number" #define DOC_PYGAMEMIDIGETDEVICEINFO "pygame.midi.get_device_info(an_id): return (interf, name, input, output, opened)\n returns information about a midi device" #define DOC_PYGAMEMIDIINIT "pygame.midi.init(): return None\ninitialize the midi module" #define DOC_PYGAMEMIDIMIDIS2EVENTS "pygame.midi.midis2events(midis, device_id): return [Event, ...]\nconverts midi events to pygame events" #define DOC_PYGAMEMIDIQUIT "pygame.midi.quit(): return None\nuninitialize the midi module" #define DOC_PYGAMEMIDITIME "pygame.midi.time(): return time\nreturns the current time in ms of the PortMidi timer" #define DOC_PYGAMEMIXER "pygame module for loading and playing sounds" #define DOC_PYGAMEMIXERINIT "pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=4096): return None\ninitialize the mixer module" #define DOC_PYGAMEMIXERPREINIT "pygame.mixer.pre_init(frequency=22050, size=-16, channels=2, buffersize=4096): return None\npreset the mixer init arguments" #define DOC_PYGAMEMIXERQUIT "pygame.mixer.quit(): return None\nuninitialize the mixer" #define DOC_PYGAMEMIXERGETINIT "pygame.mixer.get_init(): return (frequency, format, channels)\ntest if the mixer is initialized" #define DOC_PYGAMEMIXERSTOP "pygame.mixer.stop(): return None\nstop playback of all sound channels" #define DOC_PYGAMEMIXERPAUSE "pygame.mixer.pause(): return None\ntemporarily stop playback of all sound channels" #define DOC_PYGAMEMIXERUNPAUSE "pygame.mixer.unpause(): return None\nresume paused playback of sound channels" #define DOC_PYGAMEMIXERFADEOUT "pygame.mixer.fadeout(time): return None\nfade out the volume on all sounds before stopping" #define DOC_PYGAMEMIXERSETNUMCHANNELS "pygame.mixer.set_num_channels(count): return None\nset the total number of playback channels" #define DOC_PYGAMEMIXERGETNUMCHANNELS "get the total number of playback channels" #define DOC_PYGAMEMIXERSETRESERVED "pygame.mixer.set_reserved(count): return None\nreserve channels from being automatically used" #define DOC_PYGAMEMIXERFINDCHANNEL "pygame.mixer.find_channel(force=False): return Channel\nfind an unused channel" #define DOC_PYGAMEMIXERGETBUSY "pygame.mixer.get_busy(): return bool\ntest if any sound is being mixed" #define DOC_PYGAMEMIXERSOUND "pygame.mixer.Sound(filename): return Sound\npygame.mixer.Sound(buffer): return Sound\npygame.mixer.Sound(object): return Sound\nCreate a new Sound object from a file" #define DOC_SOUNDPLAY "Sound.play(loops=0, maxtime=0, fade_ms=0): return Channel\nbegin sound playback" #define DOC_SOUNDSTOP "Sound.stop(): return None\nstop sound playback" #define DOC_SOUNDFADEOUT "Sound.fadeout(time): return None\nstop sound playback after fading out" #define DOC_SOUNDSETVOLUME "Sound.set_volume(value): return None\nset the playback volume for this Sound" #define DOC_SOUNDGETVOLUME "Sound.get_volume(): return value\nget the playback volume" #define DOC_SOUNDGETNUMCHANNELS "Sound.get_num_channels(): return count\ncount how many times this Sound is playing" #define DOC_SOUNDGETLENGTH "Sound.get_length(): return seconds\nget the length of the Sound" #define DOC_SOUNDGETBUFFER "Sound.get_buffer(): return BufferProxy\nacquires a buffer object for the sameples of the Sound." #define DOC_PYGAMEMIXERCHANNEL "pygame.mixer.Channel(id): return Channel\nCreate a Channel object for controlling playback" #define DOC_CHANNELPLAY "Channel.play(Sound, loops=0, maxtime=0, fade_ms=0): return None\nplay a Sound on a specific Channel" #define DOC_CHANNELSTOP "Channel.stop(): return None\nstop playback on a Channel" #define DOC_CHANNELPAUSE "Channel.pause(): return None\ntemporarily stop playback of a channel" #define DOC_CHANNELUNPAUSE "Channel.unpause(): return None\nresume pause playback of a channel" #define DOC_CHANNELFADEOUT "Channel.fadeout(time): return None\nstop playback after fading channel out" #define DOC_CHANNELSETVOLUME "Channel.set_volume(value): return None\nChannel.set_volume(left, right): return None\nset the volume of a playing channel" #define DOC_CHANNELGETVOLUME "Channel.get_volume(): return value\nget the volume of the playing channel" #define DOC_CHANNELGETBUSY "Channel.get_busy(): return bool\ncheck if the channel is active" #define DOC_CHANNELGETSOUND "Channel.get_sound(): return Sound\nget the currently playing Sound" #define DOC_CHANNELQUEUE "Channel.queue(Sound): return None\nqueue a Sound object to follow the current" #define DOC_CHANNELGETQUEUE "Channel.get_queue(): return Sound\nreturn any Sound that is queued" #define DOC_CHANNELSETENDEVENT "Channel.set_endevent(): return None\nChannel.set_endevent(type): return None\nhave the channel send an event when playback stops" #define DOC_CHANNELGETENDEVENT "Channel.get_endevent(): return type\nget the event a channel sends when playback stops" #define DOC_PYGAMEMOUSE "pygame module to work with the mouse" #define DOC_PYGAMEMOUSEGETPRESSED "pygame.moouse.get_pressed(): return (button1, button2, button3)\nget the state of the mouse buttons" #define DOC_PYGAMEMOUSEGETPOS "pygame.mouse.get_pos(): return (x, y)\nget the mouse cursor position" #define DOC_PYGAMEMOUSEGETREL "pygame.mouse.get_rel(): return (x, y)\nget the amount of mouse movement" #define DOC_PYGAMEMOUSESETPOS "pygame.mouse.set_pos([x, y]): return None\nset the mouse cursor position" #define DOC_PYGAMEMOUSESETVISIBLE "pygame.mouse.set_visible(bool): return bool\nhide or show the mouse cursor" #define DOC_PYGAMEMOUSEGETFOCUSED "pygame.mouse.get_focused(): return bool\ncheck if the display is receiving mouse input" #define DOC_PYGAMEMOUSESETCURSOR "pygame.mouse.set_cursor(size, hotspot, xormasks, andmasks): return None\nset the image for the system mouse cursor" #define DOC_PYGAMEMOUSEGETCURSOR "pygame.mouse.get_cursor(): return (size, hotspot, xormasks, andmasks)\nget the image for the system mouse cursor" #define DOC_PYGAMEMOVIE "pygame module for playback of mpeg video" #define DOC_PYGAMEMOVIEMOVIE "pygame.movie.Movie(filename): return Movie\npygame.movie.Movie(object): return Movie\nload an mpeg movie file" #define DOC_MOVIEPLAY "Movie.play(loops=0): return None\nstart playback of a movie" #define DOC_MOVIESTOP "Movie.stop(): return None\nstop movie playback" #define DOC_MOVIEPAUSE "Movie.pause(): return None\ntemporarily stop and resume playback" #define DOC_MOVIESKIP "Movie.skip(seconds): return None\nadvance the movie playback position" #define DOC_MOVIEREWIND "Movie.rewind(): return None\nrestart the movie playback" #define DOC_MOVIERENDERFRAME "Movie.render_frame(frame_number): return frame_number\nset the current video frame" #define DOC_MOVIEGETFRAME "Movie.get_frame(): return frame_number\nget the current video frame" #define DOC_MOVIEGETTIME "Movie.get_time(): return seconds\nget the current vide playback time" #define DOC_MOVIEGETBUSY "Movie.get_busy(): return bool\ncheck if the movie is currently playing" #define DOC_MOVIEGETLENGTH "Movie.get_length(): return seconds\nthe total length of the movie in seconds" #define DOC_MOVIEGETSIZE "Movie.get_size(): return (width, height)\nget the resolution of the video" #define DOC_MOVIEHASVIDEO "Movie.get_video(): return bool\ncheck if the movie file contains video" #define DOC_MOVIEHASAUDIO "Movie.get_audio(): return bool\ncheck if the movie file contains audio" #define DOC_MOVIESETVOLUME "Movie.set_volume(value): return None\nset the audio playback volume" #define DOC_MOVIESETDISPLAY "Movie.set_display(Surface, rect=None): return None\nset the video target Surface" #define DOC_PYGAMEMIXERMUSIC "pygame module for controlling streamed audio" #define DOC_PYGAMEMIXERMUSICLOAD "pygame.mixer.music.load(filename): return None\npygame.mixer.music.load(object): return None\nLoad a music file for playback" #define DOC_PYGAMEMIXERMUSICPLAY "pygame.mixer.music.play(loops=0, start=0.0): return None\nStart the playback of the music stream" #define DOC_PYGAMEMIXERMUSICREWIND "pygame.mixer.music.rewind(): return None\nrestart music" #define DOC_PYGAMEMIXERMUSICSTOP "pygame.mixer.music.stop(): return None\nstop the music playback" #define DOC_PYGAMEMIXERMUSICPAUSE "pygame.mixer.music.pause(): return None\ntemporarily stop music playback" #define DOC_PYGAMEMIXERMUSICUNPAUSE "pygame.mixer.music.unpause(): return None\nresume paused music" #define DOC_PYGAMEMIXERMUSICFADEOUT "pygame.mixer.music.fadeout(time): return None\nstop music playback after fading out" #define DOC_PYGAMEMIXERMUSICSETVOLUME "pygame.mixer.music.set_volume(value): return None\nset the music volume" #define DOC_PYGAMEMIXERMUSICGETVOLUME "pygame.mixer.music.get_volume(): return value\nget the music volume" #define DOC_PYGAMEMIXERMUSICGETBUSY "pygame.mixer.music.get_busy(): return bool\ncheck if the music stream is playing" #define DOC_PYGAMEMIXERMUSICGETPOS "pygame.mixer.music.get_pos(): return time\nget the music play time" #define DOC_PYGAMEMIXERMUSICQUEUE "pygame.mixer.music.queue(filename): return None\nqueue a music file to follow the current" #define DOC_PYGAMEMIXERMUSICSETENDEVENT "pygame.mixer.music.set_endevent(): return None\npygame.mixer.music.set_endevent(type): return None\nhave the music send an event when playback stops" #define DOC_PYGAMEMIXERMUSICGETENDEVENT "pygame.mixer.music.get_endevent(): return type\nget the event a channel sends when playback stops" #define DOC_PYGAMEOVERLAY "pygame.Overlay(format, (width, height)): return Overlay\npygame object for video overlay graphics" #define DOC_OVERLAYDISPLAY "Overlay.display((y, u, v)): return None\nOverlay.display(): return None\nset the overlay pixel data" #define DOC_OVERLAYSETLOCATION "Overlay.set_location(rect): return None\ncontrol where the overlay is displayed" #define DOC_OVERLAYGETHARDWARE "Overlay.get_hardware(rect): return int\ntest if the Overlay is hardware accelerated" #define DOC_PYGAMEPIXELARRAY "pygame.PixelArray(Surface): return PixelArray\npygame object for direct pixel access of surfaces" #define DOC_PIXELARRAYSURFACE "PixelArray.surface: Return Surface\nGets the Surface the PixelArray uses." #define DOC_PIXELARRAYMAKESURFACE "PixelArray.make_surface (): Return Surface\nCreates a new Surface from the current PixelArray." #define DOC_PIXELARRAYREPLACE "PixelArray.replace (color, repcolor, distance=0, weights=(0.299, 0.587, 0.114)): Return None\nReplaces the passed color in the PixelArray with another one." #define DOC_PIXELARRAYEXTRACT "PixelArray.extract (color, distance=0, weights=(0.299, 0.587, 0.114)): Return PixelArray\nExtracts the passed color from the PixelArray." #define DOC_PIXELARRAYCOMPARE "PixelArray.compare (array, distance=0, weights=(0.299, 0.587, 0.114)): Return PixelArray\nCompares the PixelArray with another one." #define DOC_PYGAMERECT "pygame.Rect(left, top, width, height): return Rect\npygame.Rect((left, top), (width, height)): return Rect\npygame.Rect(object): return Rect\npygame object for storing rectangular coordinates" #define DOC_RECTCOPY "Rect.copy(): return Rect\ncopy the rectangle" #define DOC_RECTMOVE "Rect.move(x, y): return Rect\nmoves the rectangle" #define DOC_RECTMOVEIP "Rect.move_ip(x, y): return None\nmoves the rectangle, in place" #define DOC_RECTINFLATE "Rect.inflate(x, y): return Rect\ngrow or shrink the rectangle size" #define DOC_RECTINFLATEIP "Rect.inflate_ip(x, y): return None\ngrow or shrink the rectangle size, in place" #define DOC_RECTCLAMP "Rect.clamp(Rect): return Rect\nmoves the rectangle inside another" #define DOC_RECTCLAMPIP "Rect.clamp_ip(Rect): return None\nmoves the rectangle inside another, in place" #define DOC_RECTCLIP "Rect.clip(Rect): return Rect\ncrops a rectangle inside another" #define DOC_RECTUNION "Rect.union(Rect): return Rect\njoins two rectangles into one" #define DOC_RECTUNIONIP "Rect.union_ip(Rect): return None\njoins two rectangles into one, in place" #define DOC_RECTUNIONALL "Rect.unionall(Rect_sequence): return Rect\nthe union of many rectangles" #define DOC_RECTUNIONALLIP "Rect.unionall_ip(Rect_sequence): return None\nthe union of many rectangles, in place" #define DOC_RECTFIT "Rect.fit(Rect): return Rect\nresize and move a rectangle with aspect ratio" #define DOC_RECTNORMALIZE "Rect.normalize(): return None\ncorrect negative sizes" #define DOC_RECTCONTAINS "Rect.contains(Rect): return bool\ntest if one rectangle is inside another" #define DOC_RECTCOLLIDEPOINT "Rect.collidepoint(x, y): return bool\nRect.collidepoint((x,y)): return bool\ntest if a point is inside a rectangle" #define DOC_RECTCOLLIDERECT "Rect.colliderect(Rect): return bool\ntest if two rectangles overlap" #define DOC_RECTCOLLIDELIST "Rect.collidelist(list): return index\ntest if one rectangle in a list intersects" #define DOC_RECTCOLLIDELISTALL "Rect.collidelistall(list): return indices\ntest if all rectangles in a list intersect" #define DOC_RECTCOLLIDEDICT "Rect.collidedict(dict): return (key, value)\ntest if one rectangle in a dictionary intersects" #define DOC_RECTCOLLIDEDICTALL "Rect.collidedictall(dict): return [(key, value), ...]\ntest if all rectangles in a dictionary intersect" #define DOC_PYGAMESCRAP "pygame module for clipboard support." #define DOC_PYGAMESCRAPINIT "scrap.init () -> None\nInitializes the scrap module." #define DOC_PYGAMESCRAPGET "scrap.get (type) -> string\nGets the data for the specified type from the clipboard." #define DOC_PYGAMESCRAPGETTYPES "scrap.get_types () -> list\nGets a list of the available clipboard types." #define DOC_PYGAMESCRAPPUT "scrap.put(type, data) -> None\nPlaces data into the clipboard." #define DOC_PYGAMESCRAPCONTAINS "scrap.contains (type) -> bool\nChecks, whether a certain type is available in the clipboard." #define DOC_PYGAMESCRAPLOST "scrap.lost() -> bool\nChecks whether the clipboard is currently owned by the application." #define DOC_PYGAMESCRAPSETMODE "scrap.set_mode(mode) -> None\nSets the clipboard access mode." #define DOC_PYGAMESNDARRAY "pygame module for accessing sound sample data" #define DOC_PYGAMESNDARRAYARRAY "pygame.sndarray.array(Sound): return array\ncopy Sound samples into an array" #define DOC_PYGAMESNDARRAYSAMPLES "pygame.sndarray.samples(Sound): return array\nreference Sound samples into an array" #define DOC_PYGAMESNDARRAYMAKESOUND "pygame.sndarray.make_sound(array): return Sound\nconvert an array into a Sound object" #define DOC_PYGAMESNDARRAYUSEARRAYTYPE "pygame.sndarray.use_arraytype (arraytype): return None\nSets the array system to be used for sound arrays" #define DOC_PYGAMESNDARRAYGETARRAYTYPE "pygame.sndarray.get_arraytype (): return str\nGets the currently active array type." #define DOC_PYGAMESNDARRAYGETARRAYTYPES "pygame.sndarray.get_arraytypes (): return tuple\nGets the array system types currently supported." #define DOC_PYGAMESPRITE "pygame module with basic game object classes" #define DOC_PYGAMESPRITESPRITE "pygame.sprite.Sprite(*groups): return Sprite\nsimple base class for visible game objects" #define DOC_SPRITEUPDATE "Sprite.update(*args):\nmethod to control sprite behavior" #define DOC_SPRITEADD "Sprite.add(*groups): return None\nadd the sprite to groups" #define DOC_SPRITEREMOVE "Sprite.remove(*groups): return None\nremove the sprite from groups" #define DOC_SPRITEKILL "Sprite.kill(): return None\nremove the Sprite from all Groups" #define DOC_SPRITEALIVE "Sprite.alive(): return bool\ndoes the sprite belong to any groups" #define DOC_SPRITEGROUPS "Sprite.groups(): return group_list\nlist of Groups that contain this Sprite" #define DOC_PYGAMESPRITEDIRTYSPRITE "pygame.sprite.DirtySprite(*groups): return DirtySprite\na more featureful subclass of Sprite with more attributes" #define DOC_ "" #define DOC_PYGAMESPRITEGROUP "pygame.sprite.Group(*sprites): return Group\ncontainer class for many Sprites" #define DOC_GROUPSPRITES "Group.sprites(): return sprite_list\nlist of the Sprites this Group contains" #define DOC_GROUPCOPY "Group.copy(): return Group\nduplicate the Group" #define DOC_GROUPADD "Group.add(*sprites): return None\nadd Sprites to this Group" #define DOC_GROUPREMOVE "Group.remove(*sprites): return None\nremove Sprites from the Group" #define DOC_GROUPHAS "Group.has(*sprites): return None\ntest if a Group contains Sprites" #define DOC_GROUPUPDATE "Group.update(*args): return None\ncall the update method on contained Sprites" #define DOC_GROUPDRAW "Group.draw(Surface): return None\nblit the Sprite images" #define DOC_GROUPCLEAR "Group.clear(Surface_dest, background): return None\ndraw a background over the Sprites" #define DOC_GROUPEMPTY "Group.empty(): return None\nremove all Sprites" #define DOC_PYGAMESPRITERENDERUPDATES "pygame.sprite.RenderUpdates(*sprites): return RenderUpdates\nGroup class that tracks dirty updates" #define DOC_RENDERUPDATESDRAW "RenderUpdates.draw(surface): return Rect_list\nblit the Sprite images and track changed areas" #define DOC_PYGAMESPRITEORDEREDUPDATES "pygame.sprite.OrderedUpdates(*spites): return OrderedUpdates\nRenderUpdates class that draws Sprites in order of addition" #define DOC_PYGAMESPRITELAYEREDUPDATES "pygame.sprite.LayeredUpdates(*spites, **kwargs): return LayeredUpdates\nLayeredUpdates Group handles layers, that draws like OrderedUpdates." #define DOC_LAYEREDUPDATESADD "LayeredUpdates.add(*sprites, **kwargs): return None\nadd a sprite or sequence of sprites to a group" #define DOC_LAYEREDUPDATESSPRITES "LayeredUpdates.sprites(): return sprites\nreturns a ordered list of sprites (first back, last top)." #define DOC_LAYEREDUPDATESDRAW "LayeredUpdates.draw(surface): return Rect_list\ndraw all sprites in the right order onto the passed surface." #define DOC_LAYEREDUPDATESGETSPRITESAT "LayeredUpdates.get_sprites_at(pos): return colliding_sprites\nreturns a list with all sprites at that position." #define DOC_LAYEREDUPDATESGETSPRITE "LayeredUpdates.get_sprite(idx): return sprite\nreturns the sprite at the index idx from the groups sprites" #define DOC_LAYEREDUPDATESREMOVESPRITESOFLAYER "LayeredUpdates.remove_sprites_of_layer(layer_nr): return sprites\nremoves all sprites from a layer and returns them as a list." #define DOC_LAYEREDUPDATESLAYERS "LayeredUpdates.layers(): return layers\nreturns a list of layers defined (unique), sorted from botton up." #define DOC_LAYEREDUPDATESCHANGELAYER "LayeredUpdates.change_layer(sprite, new_layer): return None\nchanges the layer of the sprite" #define DOC_LAYEREDUPDATESGETLAYEROFSPRITE "LayeredUpdates.get_layer_of_sprite(sprite): return layer\nreturns the layer that sprite is currently in." #define DOC_LAYEREDUPDATESGETTOPLAYER "LayeredUpdates.get_top_layer(): return layer\nreturns the top layer" #define DOC_LAYEREDUPDATESGETBOTTOMLAYER "LayeredUpdates.get_bottom_layer(): return layer\nreturns the bottom layer" #define DOC_LAYEREDUPDATESMOVETOFRONT "LayeredUpdates.move_to_front(sprite): return None\nbrings the sprite to front layer" #define DOC_LAYEREDUPDATESMOVETOBACK "LayeredUpdates.move_to_back(sprite): return None\nmoves the sprite to the bottom layer" #define DOC_LAYEREDUPDATESGETTOPSPRITE "LayeredUpdates.get_top_sprite(): return Sprite\nreturns the topmost sprite" #define DOC_LAYEREDUPDATESGETSPRITESFROMLAYER "LayeredUpdates.get_sprites_from_layer(layer): return sprites\nreturns all sprites from a layer, ordered by how they where added" #define DOC_LAYEREDUPDATESSWITCHLAYER "LayeredUpdates.switch_layer(layer1_nr, layer2_nr): return None\nswitches the sprites from layer1 to layer2" #define DOC_PYGAMESPRITELAYEREDDIRTY "pygame.sprite.LayeredDirty(*spites, **kwargs): return LayeredDirty\nLayeredDirty Group is for DirtySprites. Subclasses LayeredUpdates." #define DOC_LAYEREDDIRTYDRAW "LayeredDirty.draw(surface, bgd=None): return Rect_list\ndraw all sprites in the right order onto the passed surface." #define DOC_LAYEREDDIRTYCLEAR "LayeredDirty.clear(surface, bgd): return None\nused to set background" #define DOC_LAYEREDDIRTYREPAINTRECT "LayeredDirty.repaint_rect(screen_rect): return None\nrepaints the given area" #define DOC_LAYEREDDIRTYSETCLIP "LayeredDirty.set_clip(screen_rect=None): return None\nclip the area where to draw. Just pass None (default) to reset the clip" #define DOC_LAYEREDDIRTYGETCLIP "LayeredDirty.get_clip(): return Rect\nclip the area where to draw. Just pass None (default) to reset the clip" #define DOC_LAYEREDDIRTYCHANGELAYER "change_layer(sprite, new_layer): return None\nchanges the layer of the sprite" #define DOC_LAYEREDDIRTYSETTIMINGTRESHOLD "set_timing_treshold(time_ms): return None\nsets the treshold in milliseconds" #define DOC_PYGAMESPRITEGROUPSINGLE "pygame.sprite.GroupSingle(sprite=None): return GroupSingle\nGroup container that holds a single Sprite" #define DOC_PYGAMESPRITESPRITECOLLIDE "pygame.sprite.spritecollide(sprite, group, dokill, collided = None): return Sprite_list\nfind Sprites in a Group that intersect another Sprite" #define DOC_PYGAMESPRITECOLLIDERECT "pygame.sprite.collide_rect(left, right): return bool\ncollision detection between two sprites, using rects." #define DOC_PYGAMESPRITECOLLIDERECTRATIO "pygame.sprite.collide_rect_ratio(ratio): return collided_callable\ncollision detection between two sprites, using rects scaled to a ratio." #define DOC_PYGAMESPRITECOLLIDECIRCLE "pygame.sprite.collide_circle(left, right): return bool\ncollision detection between two sprites, using circles." #define DOC_PYGAMESPRITECOLLIDECIRCLERATIO "pygame.sprite.collide_circle_ratio(ratio): return collided_callable\ncollision detection between two sprites, using circles scaled to a ratio." #define DOC_PYGAMESPRITECOLLIDEMASK "pygame.sprite.collide_mask(SpriteLeft, SpriteRight): return bool\ncollision detection between two sprites, using masks." #define DOC_PYGAMESPRITEGROUPCOLLIDE "pygame.sprite.groupcollide(group1, group2, dokill1, dokill2): return Sprite_dict\nfind all Sprites that collide between two Groups" #define DOC_PYGAMESPRITESPRITECOLLIDEANY "pygame.sprite.spritecollideany(sprite, group): return bool\nsimple test if a Sprite intersects anything in a Group" #define DOC_ "" #define DOC_PYGAMESURFACE "pygame.Surface((width, height), flags=0, depth=0, masks=None): return Surface\npygame.Surface((width, height), flags=0, Surface): return Surface\npygame object for representing images" #define DOC_SURFACEBLIT "Surface.blit(source, dest, area=None, special_flags = 0): return Rect\ndraw one image onto another" #define DOC_SURFACECONVERT "Surface.convert(Surface): return Surface\nSurface.convert(depth, flags=0): return Surface\nSurface.convert(masks, flags=0): return Surface\nSurface.convert(): return Surface\nchange the pixel format of an image" #define DOC_SURFACECONVERTALPHA "Surface.convert_alpha(Surface): return Surface\nSurface.convert_alpha(): return Surface\nchange the pixel format of an image including per pixel alphas" #define DOC_SURFACECOPY "Surface.copy(): return Surface\ncreate a new copy of a Surface" #define DOC_SURFACEFILL "Surface.fill(color, rect=None, special_flags=0): return Rect\nfill Surface with a solid color" #define DOC_SURFACESCROLL "Surface.scroll(dx=0, dy=0): return None\nShift the surface image in place" #define DOC_SURFACESETCOLORKEY "Surface.set_colorkey(Color, flags=0): return None\nSurface.set_colorkey(None): return None\nSet the transparent colorkey" #define DOC_SURFACEGETCOLORKEY "Surface.get_colorkey(): return RGB or None\nGet the current transparent colorkey" #define DOC_SURFACESETALPHA "Surface.set_alpha(value, flags=0): return None\nSurface.set_alpha(None): return None\nset the alpha value for the full Surface image" #define DOC_SURFACEGETALPHA "Surface.get_alpha(): return int_value or None\nget the current Surface transparency value" #define DOC_SURFACELOCK "Surface.lock(): return None\nlock the Surface memory for pixel access" #define DOC_SURFACEUNLOCK "Surface.unlock(): return None\nunlock the Surface memory from pixel access" #define DOC_SURFACEMUSTLOCK "Surface.mustlock(): return bool\ntest if the Surface requires locking" #define DOC_SURFACEGETLOCKED "Surface.get_locked(): return bool\ntest if the Surface is current locked" #define DOC_SURFACEGETLOCKS "Surface.get_locks(): return tuple\nGets the locks for the Surface" #define DOC_SURFACEGETAT "Surface.get_at((x, y)): return Color\nget the color value at a single pixel" #define DOC_SURFACESETAT "Surface.set_at((x, y), Color): return None\nset the color value for a single pixel" #define DOC_SURFACEGETPALETTE "Surface.get_palette(): return [RGB, RGB, RGB, ...]\nget the color index palette for an 8bit Surface" #define DOC_SURFACEGETPALETTEAT "Surface.get_palette_at(index): return RGB\nget the color for a single entry in a palette" #define DOC_SURFACESETPALETTE "Surface.set_palette([RGB, RGB, RGB, ...]): return None\nset the color palette for an 8bit Surface" #define DOC_SURFACESETPALETTEAT "Surface.set_at(index, RGB): return None\nset the color for a single index in an 8bit Surface palette" #define DOC_SURFACEMAPRGB "Surface.map_rgb(Color): return mapped_int\nconvert a color into a mapped color value" #define DOC_SURFACEUNMAPRGB "Surface.map_rgb(mapped_int): return Color\nconvert a mapped integer color value into a Color" #define DOC_SURFACESETCLIP "Surface.set_clip(rect): return None\nSurface.set_clip(None): return None\nset the current clipping area of the Surface" #define DOC_SURFACEGETCLIP "Surface.get_clip(): return Rect\nget the current clipping area of the Surface" #define DOC_SURFACESUBSURFACE "Surface.subsurface(Rect): return Surface\ncreate a new surface that references its parent" #define DOC_SURFACEGETPARENT "Surface.get_parent(): return Surface\nfind the parent of a subsurface" #define DOC_SURFACEGETABSPARENT "Surface.get_abs_parent(): return Surface\nfind the top level parent of a subsurface" #define DOC_SURFACEGETOFFSET "Surface.get_offset(): return (x, y)\nfind the position of a child subsurface inside a parent" #define DOC_SURFACEGETABSOFFSET "Surface.get_abs_offset(): return (x, y)\nfind the absolute position of a child subsurface inside its top level parent" #define DOC_SURFACEGETSIZE "Surface.get_size(): return (width, height)\nget the dimensions of the Surface" #define DOC_SURFACEGETWIDTH "Surface.get_width(): return width\nget the width of the Surface" #define DOC_SURFACEGETHEIGHT "Surface.get_height(): return height\nget the height of the Surface" #define DOC_SURFACEGETRECT "Surface.get_rect(**kwargs): return Rect\nget the rectangular area of the Surface" #define DOC_SURFACEGETBITSIZE "Surface.get_bitsize(): return int\nget the bit depth of the Surface pixel format" #define DOC_SURFACEGETBYTESIZE "Surface.get_bytesize(): return int\nget the bytes used per Surface pixel" #define DOC_SURFACEGETFLAGS "Surface.get_flags(): return int\nget the additional flags used for the Surface" #define DOC_SURFACEGETPITCH "Surface.get_pitch(): return int\nget the number of bytes used per Surface row" #define DOC_SURFACEGETMASKS "Surface.get_masks(): return (R, G, B, A)\nthe bitmasks needed to convert between a color and a mapped integer" #define DOC_SURFACESETMASKS "Surface.set_masks((r,g,b,a)): return None\nset the bitmasks needed to convert between a color and a mapped integer" #define DOC_SURFACEGETSHIFTS "Surface.get_shifts(): return (R, G, B, A)\nthe bit shifts needed to convert between a color and a mapped integer" #define DOC_SURFACESETSHIFTS "Surface.get_shifts((r,g,b,a)): return None\nsets the bit shifts needed to convert between a color and a mapped integer" #define DOC_SURFACEGETLOSSES "Surface.get_losses(): return (R, G, B, A)\nthe significant bits used to convert between a color and a mapped integer" #define DOC_SURFACEGETBOUNDINGRECT "Surface.get_bounding_rect(min_alpha = 1): return Rect\nfind the smallest rect containing data" #define DOC_SURFACEGETBUFFER "Surface.get_buffer(): return BufferProxy\nacquires a buffer object for the pixels of the Surface." #define DOC_PYGAMESURFARRAY "pygame module for accessing surface pixel data using array interfaces" #define DOC_PYGAMESURFARRAYARRAY2D "pygame.surfarray.array2d(Surface): return array\nCopy pixels into a 2d array" #define DOC_PYGAMESURFARRAYPIXELS2D "pygame.surfarray.pixels2d(Surface): return array\nReference pixels into a 2d array" #define DOC_PYGAMESURFARRAYARRAY3D "pygame.surfarray.array3d(Surface): return array\nCopy pixels into a 3d array" #define DOC_PYGAMESURFARRAYPIXELS3D "pygame.surfarray.pixels3d(Surface): return array\nReference pixels into a 3d array" #define DOC_PYGAMESURFARRAYARRAYALPHA "pygame.surfarray.array_alpha(Surface): return array\nCopy pixel alphas into a 2d array" #define DOC_PYGAMESURFARRAYPIXELSALPHA "pygame.surfarray.pixels_alpha(Surface): return array\nReference pixel alphas into a 2d array" #define DOC_PYGAMESURFARRAYARRAYCOLORKEY "pygame.surfarray.array_colorkey(Surface): return array\nCopy the colorkey values into a 2d array" #define DOC_PYGAMESURFARRAYMAKESURFACE "pygame.surfarray.make_surface(array): return Surface\nCopy an array to a new surface" #define DOC_PYGAMESURFARRAYBLITARRAY "pygame.surfarray.blit_array(Surface, array): return None\nBlit directly from a array values" #define DOC_PYGAMESURFARRAYMAPARRAY "pygame.surfarray.map_array(Surface, array3d): return array2d\nMap a 3d array into a 2d array" #define DOC_PYGAMESURFARRAYUSEARRAYTYPE "pygame.surfarray.use_arraytype (arraytype): return None\nSets the array system to be used for surface arrays" #define DOC_PYGAMESURFARRAYGETARRAYTYPE "pygame.surfarray.get_arraytype (): return str\nGets the currently active array type." #define DOC_PYGAMESURFARRAYGETARRAYTYPES "pygame.surfarray.get_arraytypes (): return tuple\nGets the array system types currently supported." #define DOC_PYGAMETESTS "Pygame unit test suite package" #define DOC_PYGAMETESTSRUN "pygame.tests.run(*args, **kwds): return tuple\nRun the Pygame unit test suite" #define DOC_PYGAMETIME "pygame module for monitoring time" #define DOC_PYGAMETIMEGETTICKS "pygame.time.get_ticks(): return milliseconds\nget the time in milliseconds" #define DOC_PYGAMETIMEWAIT "pygame.time.wait(milliseconds): return time\npause the program for an amount of time" #define DOC_PYGAMETIMEDELAY "pygame.time.delay(milliseconds): return time\npause the program for an amount of time" #define DOC_PYGAMETIMESETTIMER "pygame.time.set_timer(eventid, milliseconds): return None\nrepeatedly create an event on the event queue" #define DOC_PYGAMETIMECLOCK "pygame.time.Clock(): return Clock\ncreate an object to help track time" #define DOC_CLOCKTICK "Clock.tick(framerate=0): return milliseconds\ncontrol timer events\nupdate the clock" #define DOC_CLOCKTICKBUSYLOOP "Clock.tick_busy_loop(framerate=0): return milliseconds\ncontrol timer events\nupdate the clock" #define DOC_CLOCKGETTIME "Clock.get_time(): return milliseconds\ntime used in the previous tick" #define DOC_CLOCKGETRAWTIME "Clock.get_rawtime(): return milliseconds\nactual time used in the previous tick" #define DOC_CLOCKGETFPS "Clock.get_fps(): return float\ncompute the clock framerate" #define DOC_PYGAMETRANSFORM "pygame module to transform surfaces" #define DOC_PYGAMETRANSFORMFLIP "pygame.transform.flip(Surface, xbool, ybool): return Surface\nflip vertically and horizontally" #define DOC_PYGAMETRANSFORMSCALE "pygame.transform.scale(Surface, (width, height), DestSurface = None): return Surface\nresize to new resolution" #define DOC_PYGAMETRANSFORMROTATE "pygame.transform.rotate(Surface, angle): return Surface\nrotate an image" #define DOC_PYGAMETRANSFORMROTOZOOM "pygame.transform.rotozoom(Surface, angle, scale): return Surface\nfiltered scale and rotation" #define DOC_PYGAMETRANSFORMSCALE2X "pygame.transform.scale2x(Surface, DestSurface = None): Surface\nspecialized image doubler" #define DOC_PYGAMETRANSFORMSMOOTHSCALE "pygame.transform.smoothscale(Surface, (width, height), DestSurface = None): return Surface\nscale a surface to an arbitrary size smoothly" #define DOC_PYGAMETRANSFORMGETSMOOTHSCALEBACKEND "pygame.transform.get_smoothscale_backend(): return String\nreturn smoothscale filter version in use: 'GENERIC', 'MMX', or 'SSE'" #define DOC_PYGAMETRANSFORMSETSMOOTHSCALEBACKEND "pygame.transform.get_smoothscale_backend(type): return None\nset smoothscale filter version to one of: 'GENERIC', 'MMX', or 'SSE'" #define DOC_PYGAMETRANSFORMCHOP "pygame.transform.chop(Surface, rect): return Surface\ngets a copy of an image with an interior area removed" #define DOC_PYGAMETRANSFORMLAPLACIAN "pygame.transform.laplacian(Surface, DestSurface = None): return Surface\nfind edges in a surface" #define DOC_PYGAMETRANSFORMAVERAGESURFACES "pygame.transform.average_surfaces(Surfaces, DestSurface = None, palette_colors = 1): return Surface\nfind the average surface from many surfaces." #define DOC_PYGAMETRANSFORMAVERAGECOLOR "pygame.transform.average_color(Surface, Rect = None): return Color\nfinds the average color of a surface" #define DOC_PYGAMETRANSFORMTHRESHOLD "pygame.transform.threshold(DestSurface, Surface, color, threshold = (0,0,0,0), diff_color = (0,0,0,0), change_return = 1, Surface = None, inverse = False): return num_threshold_pixels\nfinds which, and how many pixels in a surface are within a threshold of a color." /* Docs in a comments... slightly easier to read. */ /* pygame the top level pygame package pygame.init pygame.init(): return (numpass, numfail) initialize all imported pygame modules pygame.quit pygame.quit(): return None uninitialize all pygame modules pygame.error raise pygame.error, message standard pygame exception pygame.get_error pygame.get_error(): return errorstr get the current error message pygame.set_error pygame.set_error(error_msg): return None set the current error message pygame.get_sdl_version pygame.get_sdl_version(): return major, minor, patch get the version number of SDL pygame.get_sdl_byteorder pygame.get_sdl_byteorder(): return int get the byte order of SDL pygame.register_quit register_quit(callable): return None register a function to be called when pygame quits pygame.version module pygame.version small module containing version information pygame.version.ver pygame.version.ver = '1.2' version number as a string pygame.version.vernum pygame.version.vernum = (1, 5, 3) tupled integers of the version pygame.camera pygame module for camera use pygame.camera.colorspace pygame.camera.colorspace(Surface, format, DestSurface = None): return Surface Surface colorspace conversion pygame.camera.list_cameras pygame.camera.list_cameras(): return [cameras] returns a list of available cameras pygame.camera.Camera pygame.camera.Camera(device, (width, height), format): return Camera load a camera Camera.start Camera.start(): return None opens, initializes, and starts capturing Camera.stop Camera.stop(): return None stops, uninitializes, and closes the camera Camera.get_controls Camera.get_controls(): return (hflip = bool, vflip = bool, brightness) gets current values of user controls Camera.set_controls Camera.set_controls(hflip = bool, vflip = bool, brightness): return (hflip = bool, vflip = bool, brightness) changes camera settings if supported by the camera Camera.get_size Camera.get_size(): return (width, height) returns the dimensions of the images being recorded Camera.query_image Camera.query_image(): return bool checks if a frame is ready Camera.get_image Camera.get_image(Surface = None): return Surface captures an image as a Surface Camera.get_raw Camera.get_raw(): return string returns an unmodified image as a string pygame.cdrom pygame module for audio cdrom control pygame.cdrom.init pygame.cdrom.init(): return None initialize the cdrom module pygame.cdrom.quit pygame.cdrom.quit(): return None uninitialize the cdrom module pygame.cdrom.get_init pygame.cdrom.get_init(): return bool true if the cdrom module is initialized pygame.cdrom.get_count pygame.cdrom.get_count(): return count number of cd drives on the system pygame.cdrom.CD pygame.cdrom.CD(id): return CD class to manage a cdrom drive CD.init CD.init(): return None initialize a cdrom drive for use CD.quit CD.quit(): return None uninitialize a cdrom drive for use CD.get_init CD.get_init(): return bool true if this cd device initialized CD.play CD.play(track, start=None, end=None): return None start playing audio CD.stop CD.stop(): return None stop audio playback CD.pause CD.pause(): return None temporarily stop audio playback CD.resume CD.resume(): return None unpause audio playback CD.eject CD.eject(): return None eject or open the cdrom drive CD.get_id CD.get_id(): return id the index of the cdrom drive CD.get_name CD.get_name(): return name the system name of the cdrom drive CD.get_busy CD.get_busy(): return bool true if the drive is playing audio CD.get_paused CD.get_paused(): return bool true if the drive is paused CD.get_current CD.get_current(): return track, seconds the current audio playback position CD.get_empty CD.get_empty(): return bool False if a cdrom is in the drive CD.get_numtracks CD.get_numtracks(): return count the number of tracks on the cdrom CD.get_track_audio CD.get_track_audio(track): return bool true if the cdrom track has audio data CD.get_all CD.get_all(): return [(audio, start, end, lenth), ...] get all track information CD.get_track_start CD.get_track_start(track): return seconds start time of a cdrom track CD.get_track_length CD.get_track_length(track): return seconds length of a cdrom track pygame.Color pygame.Color(name): Return Color pygame.Color(r, g, b, a): Return Color pygame.Color(rgbvalue): Return Color pygame object for color representations Color.r Color.r: Return int Gets or sets the red value of the Color. Color.g Color.g: Return int Gets or sets the green value of the Color. Color.b Color.b: Return int Gets or sets the blue value of the Color. Color.a Color.a: Return int Gets or sets the alpha value of the Color. Color.cmy Color.cmy: Return tuple Gets or sets the CMY representation of the Color. Color.hsva Color.hsva: Return tuple Gets or sets the HSVA representation of the Color. Color.hsla Color.hsla: Return tuple Gets or sets the HSLA representation of the Color. Color.i1i2i3 Color.i1i2i3: Return tuple Gets or sets the I1I2I3 representation of the Color. Color.normalize Color.normalize(): Return tuple Returns the normalized RGBA values of the Color. Color.correct_gamma Color.correct_gamma (gamma): Return Color Applies a certain gamma value to the Color. Color.set_length Color.set_length(len) Set the number of elements in the Color to 1,2,3, or 4. pygame.cursors pygame module for cursor resources pygame.cursors.compile pygame.cursor.compile(strings, black='X', white='.', xor='o'): return data, mask create binary cursor data from simple strings pygame.cursors.load_xbm pygame.cursors.load_xbm(cursorfile): return cursor_args pygame.cursors.load_xbm(cursorfile, maskfile): return cursor_args load cursor data from an xbm file pygame.display pygame module to control the display window and screen pygame.display.init pygame.display.init(): return None initialize the display module pygame.display.quit pygame.display.quit(): return None uninitialize the display module pygame.display.get_init pygame.display.get_init(): return bool true if the display module is initialized pygame.display.set_mode pygame.display.set_mode(resolution=(0,0), flags=0, depth=0): return Surface initialize a window or screen for display pygame.display.get_surface pygame.display.get_surface(): return Surface get a reference to the currently set display surface pygame.display.flip pygame.display.flip(): return None update the full display Surface to the screen pygame.display.update pygame.display.update(rectangle=None): return None pygame.display.update(rectangle_list): return None update portions of the screen for software displays pygame.display.get_driver pygame.display.get_driver(): return name get the name of the pygame display backend pygame.display.Info pygame.display.Info(): return VideoInfo Create a video display information object pygame.display.get_wm_info pygame.display.get_wm_info(): return dict Get information about the current windowing system pygame.display.list_modes pygame.display.list_modes(depth=0, flags=pygame.FULLSCREEN): return list get list of available fullscreen modes pygame.display.mode_ok pygame.display.mode_ok(size, flags=0, depth=0): return depth pick the best color depth for a display mode pygame.display.gl_get_attribute pygame.display.gl_get_attribute(flag): return value get the value for an opengl flag for the current display pygame.display.gl_set_attribute pygame.display.gl_set_attribute(flag, value): return None request an opengl display attribute for the display mode pygame.display.get_active pygame.display.get_active(): return bool true when the display is active on the display pygame.display.iconify pygame.display.iconify(): return bool iconify the display surface pygame.display.toggle_fullscreen pygame.display.toggle_fullscreen(): return bool switch between fullscreen and windowed displays pygame.display.set_gamma pygame.display.set_gamma(red, green=None, blue=None): return bool change the hardware gamma ramps pygame.display.set_gamma_ramp change the hardware gamma ramps with a custom lookup pygame.display.set_gamma_ramp(red, green, blue): return bool set_gamma_ramp(red, green, blue): return bool pygame.display.set_icon pygame.display.set_icon(Surface): return None change the system image for the display window pygame.display.set_caption pygame.display.set_caption(title, icontitle=None): return None set the current window caption pygame.display.get_caption pygame.display.get_caption(): return (title, icontitle) get the current window caption pygame.display.set_palette pygame.display.set_palette(palette=None): return None set the display color palette for indexed displays pygame.draw pygame module for drawing shapes pygame.draw.rect pygame.draw.rect(Surface, color, Rect, width=0): return Rect draw a rectangle shape pygame.draw.polygon pygame.draw.polygon(Surface, color, pointlist, width=0): return Rect draw a shape with any number of sides pygame.draw.circle pygame.draw.circle(Surface, color, pos, radius, width=0): return Rect draw a circle around a point pygame.draw.ellipse pygame.draw.ellipse(Surface, color, Rect, width=0): return Rect draw a round shape inside a rectangle pygame.draw.arc pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width=1): return Rect draw a partial section of an ellipse pygame.draw.line pygame.draw.line(Surface, color, start_pos, end_pos, width=1): return Rect draw a straight line segment pygame.draw.lines pygame.draw.lines(Surface, color, closed, pointlist, width=1): return Rect draw multiple contiguous line segments pygame.draw.aaline pygame.draw.aaline(Surface, color, startpos, endpos, blend=1): return Rect draw fine antialiased lines pygame.draw.aalines pygame.draw.aalines(Surface, color, closed, pointlist, blend=1): return Rect pygame.event pygame module for interacting with events and queues pygame.event.pump pygame.event.pump(): return None internally process pygame event handlers pygame.event.get pygame.event.get(): return Eventlist pygame.event.get(type): return Eventlist pygame.event.get(typelist): return Eventlist get events from the queue pygame.event.poll pygame.event.poll(): return Event get a single event from the queue pygame.event.wait pygame.event.wait(): return Event wait for a single event from the queue pygame.event.peek pygame.event.peek(type): return bool pygame.event.peek(typelist): return bool test if event types are waiting on the queue pygame.event.clear pygame.event.clear(): return None pygame.event.clear(type): return None pygame.event.clear(typelist): return None remove all events from the queue pygame.event.event_name pygame.event.event_name(type): return string get the string name from and event id pygame.event.set_blocked pygame.event.set_blocked(type): return None pygame.event.set_blocked(typelist): return None pygame.event.set_blocked(None): return None control which events are allowed on the queue pygame.event.set_allowed pygame.event.set_allowed(type): return None pygame.event.set_allowed(typelist): return None pygame.event.set_allowed(None): return None control which events are allowed on the queue pygame.event.get_blocked pygame.event.get_blocked(type): return bool test if a type of event is blocked from the queue pygame.event.set_grab pygame.event.set_grab(bool): return None control the sharing of input devices with other applications pygame.event.get_grab pygame.event.get_grab(): return bool test if the program is sharing input devices pygame.event.post pygame.event.post(Event): return None place a new event on the queue pygame.event.Event pygame.event.Event(type, dict): return Event pygame.event.Event(type, **attributes): return Event create a new event object pygame.examples module of example programs pygame.examples.aliens.main pygame.aliens.main(): return None play the full aliens example pygame.examples.oldalien.main pygame.examples.oldalien.main(): return None play the original aliens example pygame.examples.stars.main pygame.examples.stars.main(): return None run a simple starfield example pygame.examples.chimp.main pygame.examples.chimp.main(): return None hit the moving chimp pygame.examples.moveit.main pygame.examples.moveit.main(): return None display animated objects on the screen pygame.examples.fonty.main pygame.examples.fonty.main(): return None run a font rendering example pygame.examples.vgrade.main pygame.examples.vgrade.main(): return None display a vertical gradient pygame.examples.eventlist.main pygame.examples.eventlist.main(): return None display pygame events pygame.examples.arraydemo.main pygame.examples.arraydemo.main(arraytype=None): return None show various surfarray effects pygame.examples.sound.main pygame.examples.sound.main(file_path=None): return None load and play a sound pygame.examples.sound_array_demos.main pygame.examples.sound_array_demos.main(arraytype=None): return None play various sndarray effects pygame.examples.liquid.main pygame.examples.liquid.main(): return None display an animated liquid effect pygame.examples.glcube.main pygame.examples.glcube.main(): return None display an animated 3D cube using OpenGL pygame.examples.scrap_clipboard.main pygame.examples.scrap_clipboard.main(): return None access the clipboard pygame.examples.mask.main pygame.examples.mask.main(*args): return None display multiple images bounce off each other using collision detection pygame.examples.testsprite.main pygame.examples.testsprite.main(update_rects = True, use_static = False, use_FastRenderGroup = False, screen_dims = [640, 480], use_alpha = False, flags = 0): return None show lots of sprites moving around pygame.examples.headless_no_windows_needed.main pygame.examples.headless_no_windows_needed.main(fin, fout, w, h): return None write an image file that is smoothscaled copy of an input file pygame.examples.fastevents.main pygame.examples.fastevents.main(): return None stress test the fastevents module pygame.examples.overlay.main pygame.examples.overlay.main(fname): return None play a .pgm video using overlays pygame.examples.blend_fill.main pygame.examples.blend_fill.main(): return None demonstrate the various surface.fill method blend options pygame.examples.cursors.main pygame.examples.cursors.main(): return None display two different custom cursors pygame.examples.pixelarray.main pygame.examples.pixelarray.main(): return None display various pixelarray generated effects pygame.examples.scaletest.main pygame.examples.scaletest.main(imagefile, convert_alpha=False, run_speed_test=True): return None interactively scale an image using smoothscale pygame.examples.midi.main pygame.examples.midi.main(mode='output', device_id=None): return None run a midi example pygame.examples.scroll.main pygame.examples.scroll.main(image_file=None): return None run a Surface.scroll example that shows a magnified image pygame.examples.movieplayer.main pygame.examples.moveplayer.main(filepath): return None play an MPEG movie pygame.font pygame module for loading and rendering fonts pygame.font.init pygame.font.init(): return None initialize the font module pygame.font.quit pygame.font.quit(): return None uninitialize the font module pygame.font.get_init pygame.font.get_init(): return bool true if the font module is initialized pygame.font.get_default_font pygame.font.get_default_font(): return string get the filename of the default font pygame.font.get_fonts pygame.font.get_fonts(): return list of strings get all available fonts pygame.font.match_font pygame.font.match_font(name, bold=False, italic=False): return path find a specific font on the system pygame.font.SysFont pygame.font.SysFont(name, size, bold=False, italic=False): return Font create a Font object from the system fonts pygame.font.Font pygame.font.Font(filename, size): return Font pygame.font.Font(object, size): return Font create a new Font object from a file Font.render Font.render(text, antialias, color, background=None): return Surface draw text on a new Surface Font.size Font.size(text): return (width, height) determine the amount of space needed to render text Font.set_underline Font.set_underline(bool): return None control if text is rendered with an underline Font.get_underline Font.get_underline(): return bool check if text will be rendered with an underline Font.set_bold Font.set_bold(bool): return None enable fake rendering of bold text Font.get_bold Font.get_bold(): return bool check if text will be rendered bold Font.set_italic Font.set_bold(bool): return None enable fake rendering of italic text Font.metrics Font.metrics(text): return list Gets the metrics for each character in the pased string. Font.get_italic Font.get_italic(): return bool check if the text will be rendered italic Font.get_linesize Font.get_linesize(): return int get the line space of the font text Font.get_height Font.get_height(): return int get the height of the font Font.get_ascent Font.get_ascent(): return int get the ascent of the font Font.get_descent Font.get_descent(): return int get the descent of the font pygame.gfxdraw pygame module for drawing shapes pygame.gfxdraw.pixel pygame.gfxdraw.pixel(surface, x, y, color): return None place a pixel pygame.gfxdraw.hline pygame.gfxdraw.hline(surface, x1, x2, y, color): return None draw a horizontal line pygame.gfxdraw.vline pgyame.gfxdraw.vline(surface, x, y1, y2, color): return None draw a vertical line pygame.gfxdraw.rectangle pgyame.gfxdraw.rectangle(surface, rect, color): return None draw a rectangle pygame.gfxdraw.box pgyame.gfxdraw.box(surface, rect, color): return None draw a box pygame.gfxdraw.line pgyame.gfxdraw.line(surface, x1, y1, x2, y2, color): return None draw a line pygame.gfxdraw.circle pgyame.gfxdraw.circle(surface, x, y, r, color): return None draw a circle pygame.gfxdraw.arc pgyame.gfxdraw.arc(surface, x, y, r, start, end, color): return None draw an arc pygame.gfxdraw.aacircle pgyame.gfxdraw.aacircle(surface, x, y, r, color): return None draw an anti-aliased circle pygame.gfxdraw.filled_circle pgyame.gfxdraw.filled_circle(surface, x, y, r, color): return None draw a filled circle pygame.gfxdraw.ellipse pgyame.gfxdraw.ellipse(surface, x, y, rx, ry, color): return None draw an ellipse pygame.gfxdraw.aaellipse pgyame.gfxdraw.aaellipse(surface, x, y, rx, ry, color): return None draw an anti-aliased ellipse pygame.gfxdraw.filled_ellipse pgyame.gfxdraw.filled_ellipse(surface, x, y, rx, ry, color): return None draw a filled ellipse pygame.gfxdraw.pie pgyame.gfxdraw.pie(surface, x, y, r, start, end, color): return None draw a pie pygame.gfxdraw.trigon pgyame.gfxdraw.trigon(surface, x1, y1, x2, y2, x3, y3, color): return None draw a triangle pygame.gfxdraw.aatrigon pgyame.gfxdraw.aatrigon(surface, x1, y1, x2, y2, x3, y3, color): return None draw an anti-aliased triangle pygame.gfxdraw.filled_trigon pgyame.gfxdraw.filled_trigon(surface, x1, y1, x3, y2, x3, y3, color): return None draw a filled trigon pygame.gfxdraw.polygon pgyame.gfxdraw.polygon(surface, points, color): return None draw a polygon pygame.gfxdraw.aapolygon pgyame.gfxdraw.aapolygon(surface, points, color): return None draw an anti-aliased polygon pygame.gfxdraw.filled_polygon pgyame.gfxdraw.filled_polygon(surface, points, color): return None draw a filled polygon pygame.gfxdraw.textured_polygon pgyame.gfxdraw.textured_polygon(surface, points, texture, tx, ty): return None draw a textured polygon pygame.gfxdraw.bezier pgyame.gfxdraw.bezier(surface, points, steps, color): return None draw a bezier curve pygame.image pygame module for image transfer pygame.image.load pygame.image.load(filename): return Surface pygame.image.load(fileobj, namehint=""): return Surface load new image from a file pygame.image.save pygame.image.save(Surface, filename): return None save an image to disk pygame.image.get_extended pygame.image.get_extended(): return bool test if extended image formats can be loaded pygame.image.tostring pygame.image.tostring(Surface, format, flipped=False): return string transfer image to string buffer pygame.image.fromstring pygame.image.fromstring(string, size, format, flipped=False): return Surface create new Surface from a string buffer pygame.image.frombuffer pygame.image.frombuffer(string, size, format): return Surface create a new Surface that shares data inside a string buffer pygame.joystick pygame module for interacting with joystick devices pygame.joystick.init pygame.joystick.init(): return None initialize the joystick module pygame.joystick.quit pygame.joystick.quit(): return None uninitialize the joystick module pygame.joystick.get_init pygame.joystick.get_init(): return bool true if the joystick module is initialized pygame.joystick.get_count pygame.joystick.get_count(): return count number of joysticks on the system pygame.joystick.Joystick pygame.joystick.Joystick(id): return Joystick create a new Joystick object Joystick.init Joystick.init(): return None initialize the Joystick Joystick.quit Joystick.quit(): return None uninitialize the Joystick Joystick.get_init Joystick.get_init(): return bool check if the Joystick is initialized Joystick.get_id Joystick.get_id(): return int get the Joystick ID Joystick.get_name Joystick.get_name(): return string get the Joystick system name Joystick.get_numaxes Joystick.get_numaxes(): return int get the number of axes on a Joystick Joystick.get_axis Joystick.get_axis(axis_number): return float get the current position of an axis Joystick.get_numballs Joystick.get_numballs(): return int get the number of trackballs on a Joystick Joystick.get_ball Joystick.get_ball(ball_number): return x, y get the relative position of a trackball Joystick.get_numbuttons Joystick.get_numbuttons(): return int get the number of buttons on a Joystick Joystick.get_button Joystick.get_button(button): return bool get the current button state Joystick.get_numhats Joystick.get_numhats(): return int get the number of hat controls on a Joystick Joystick.get_hat Joystick.get_hat(hat_number): return x, y get the position of a joystick hat pygame.key pygame module to work with the keyboard pygame.key.get_focused pygame.key.get_focused(): return bool true if the display is receiving keyboard input from the system pygame.key.get_pressed pygame.key.get_pressed(): return bools get the state of all keyboard buttons pygame.key.get_mods pygame.key.get_mods(): return int determine which modifier keys are being held pygame.key.set_mods pygame.key.set_mods(int): return None temporarily set which modifier keys are pressed pygame.key.set_repeat pygame.key.set_repeat(): return None pygame.key.set_repeat(delay, interval): return None control how held keys are repeated pygame.key.get_repeat pygame.key.get_repeat(): return (delay, interval) see how held keys are repeated pygame.key.name pygame.key.name(key): return string get the name of a key identifier pygame.locals pygame constants pygame.mask pygame module for image masks. pygame.mask.from_surface pygame.mask.from_surface(Surface, threshold = 127) -> Mask Returns a Mask from the given surface. pygame.mask.from_threshold pygame.mask.from_surface(Surface, color, threshold = (0,0,0,255), othersurface = None, palette_colors = 1) -> Mask Creates a mask by thresholding Surfaces pygame.mask.Mask pygame.Mask((width, height)): return Mask pygame object for representing 2d bitmasks Mask.get_size Mask.get_size() -> width,height Returns the size of the mask. Mask.get_at Mask.get_at((x,y)) -> int Returns nonzero if the bit at (x,y) is set. Mask.set_at Mask.set_at((x,y),value) Sets the position in the mask given by x and y. Mask.overlap Mask.overlap(othermask, offset) -> x,y Returns the point of intersection if the masks overlap with the given offset - or None if it does not overlap. Mask.overlap_area Mask.overlap_area(othermask, offset) -> numpixels Returns the number of overlapping 'pixels'. Mask.overlap_mask Mask.overlap_mask(othermask, offset) -> Mask Returns a mask of the overlapping pixels Mask.fill Mask.fill() Sets all bits to 1 Mask.clear Mask.clear() Sets all bits to 0 Mask.invert Mask.invert() Flips the bits in a Mask Mask.scale Mask.scale((x, y)) -> Mask Resizes a mask Mask.draw Mask.draw(othermask, offset) Draws a mask onto another Mask.erase Mask.erase(othermask, offset) Erases a mask from another Mask.count Mask.count() -> pixels Returns the number of set pixels Mask.centroid Mask.centroid() -> (x, y) Returns the centroid of the pixels in a Mask Mask.angle Mask.angle() -> theta Returns the orientation of the pixels Mask.outline Mask.outline(every = 1) -> [(x,y), (x,y) ...] list of points outlining an object Mask.convolve Mask.convolve(othermask, outputmask = None, offset = (0,0)) -> Mask Return the convolution of self with another mask. Mask.connected_component Mask.connected_component((x,y) = None) -> Mask Returns a mask of a connected region of pixels. Mask.connected_components Mask.connected_components(min = 0) -> [Masks] Returns a list of masks of connected regions of pixels. Mask.get_bounding_rects Mask.get_bounding_rects() -> Rects Returns a list of bounding rects of regions of set pixels. pygame.midi pygame module for interacting with midi input and output. pygame.midi.Input Input(device_id) Input(device_id, buffer_size) Input is used to get midi input from midi devices. Input.close Input.close(): return None closes a midi stream, flushing any pending buffers. Input.poll Input.poll(): return Bool returns true if there's data, or false if not. Input.read Input.read(num_events): return midi_event_list reads num_events midi events from the buffer. pygame.midi.MidiException MidiException(errno) exception that pygame.midi functions and classes can raise pygame.midi.Output Output(device_id) Output(device_id, latency = 0) Output(device_id, buffer_size = 4096) Output(device_id, latency, buffer_size) Output is used to send midi to an output device Output.abort Output.abort(): return None terminates outgoing messages immediately Output.close Output.close(): return None closes a midi stream, flushing any pending buffers. Output.note_off Output.note_off(note, velocity=None, channel = 0) turns a midi note off. Note must be on. Output.note_on Output.note_on(note, velocity=None, channel = 0) turns a midi note on. Note must be off. Output.set_instrument Output.set_instrument(instrument_id, channel = 0) select an instrument, with a value between 0 and 127 Output.write Output.write(data) writes a list of midi data to the Output Output.write_short Output.write_short(status) Output.write_short(status, data1 = 0, data2 = 0) write_short(status <, data1><, data2>) Output.write_sys_ex Output.write_sys_ex(when, msg) writes a timestamped system-exclusive midi message. pygame.midi.get_count pygame.midi.get_count(): return num_devices gets the number of devices. pygame.midi.get_default_input_id pygame.midi.get_default_input_id(): return default_id gets default input device number pygame.midi.get_default_output_id pygame.midi.get_default_output_id(): return default_id gets default output device number pygame.midi.get_device_info pygame.midi.get_device_info(an_id): return (interf, name, input, output, opened) returns information about a midi device pygame.midi.init pygame.midi.init(): return None initialize the midi module pygame.midi.midis2events pygame.midi.midis2events(midis, device_id): return [Event, ...] converts midi events to pygame events pygame.midi.quit pygame.midi.quit(): return None uninitialize the midi module pygame.midi.time pygame.midi.time(): return time returns the current time in ms of the PortMidi timer pygame.mixer pygame module for loading and playing sounds pygame.mixer.init pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=4096): return None initialize the mixer module pygame.mixer.pre_init pygame.mixer.pre_init(frequency=22050, size=-16, channels=2, buffersize=4096): return None preset the mixer init arguments pygame.mixer.quit pygame.mixer.quit(): return None uninitialize the mixer pygame.mixer.get_init pygame.mixer.get_init(): return (frequency, format, channels) test if the mixer is initialized pygame.mixer.stop pygame.mixer.stop(): return None stop playback of all sound channels pygame.mixer.pause pygame.mixer.pause(): return None temporarily stop playback of all sound channels pygame.mixer.unpause pygame.mixer.unpause(): return None resume paused playback of sound channels pygame.mixer.fadeout pygame.mixer.fadeout(time): return None fade out the volume on all sounds before stopping pygame.mixer.set_num_channels pygame.mixer.set_num_channels(count): return None set the total number of playback channels pygame.mixer.get_num_channels get the total number of playback channels pygame.mixer.set_reserved pygame.mixer.set_reserved(count): return None reserve channels from being automatically used pygame.mixer.find_channel pygame.mixer.find_channel(force=False): return Channel find an unused channel pygame.mixer.get_busy pygame.mixer.get_busy(): return bool test if any sound is being mixed pygame.mixer.Sound pygame.mixer.Sound(filename): return Sound pygame.mixer.Sound(buffer): return Sound pygame.mixer.Sound(object): return Sound Create a new Sound object from a file Sound.play Sound.play(loops=0, maxtime=0, fade_ms=0): return Channel begin sound playback Sound.stop Sound.stop(): return None stop sound playback Sound.fadeout Sound.fadeout(time): return None stop sound playback after fading out Sound.set_volume Sound.set_volume(value): return None set the playback volume for this Sound Sound.get_volume Sound.get_volume(): return value get the playback volume Sound.get_num_channels Sound.get_num_channels(): return count count how many times this Sound is playing Sound.get_length Sound.get_length(): return seconds get the length of the Sound Sound.get_buffer Sound.get_buffer(): return BufferProxy acquires a buffer object for the sameples of the Sound. pygame.mixer.Channel pygame.mixer.Channel(id): return Channel Create a Channel object for controlling playback Channel.play Channel.play(Sound, loops=0, maxtime=0, fade_ms=0): return None play a Sound on a specific Channel Channel.stop Channel.stop(): return None stop playback on a Channel Channel.pause Channel.pause(): return None temporarily stop playback of a channel Channel.unpause Channel.unpause(): return None resume pause playback of a channel Channel.fadeout Channel.fadeout(time): return None stop playback after fading channel out Channel.set_volume Channel.set_volume(value): return None Channel.set_volume(left, right): return None set the volume of a playing channel Channel.get_volume Channel.get_volume(): return value get the volume of the playing channel Channel.get_busy Channel.get_busy(): return bool check if the channel is active Channel.get_sound Channel.get_sound(): return Sound get the currently playing Sound Channel.queue Channel.queue(Sound): return None queue a Sound object to follow the current Channel.get_queue Channel.get_queue(): return Sound return any Sound that is queued Channel.set_endevent Channel.set_endevent(): return None Channel.set_endevent(type): return None have the channel send an event when playback stops Channel.get_endevent Channel.get_endevent(): return type get the event a channel sends when playback stops pygame.mouse pygame module to work with the mouse pygame.mouse.get_pressed pygame.moouse.get_pressed(): return (button1, button2, button3) get the state of the mouse buttons pygame.mouse.get_pos pygame.mouse.get_pos(): return (x, y) get the mouse cursor position pygame.mouse.get_rel pygame.mouse.get_rel(): return (x, y) get the amount of mouse movement pygame.mouse.set_pos pygame.mouse.set_pos([x, y]): return None set the mouse cursor position pygame.mouse.set_visible pygame.mouse.set_visible(bool): return bool hide or show the mouse cursor pygame.mouse.get_focused pygame.mouse.get_focused(): return bool check if the display is receiving mouse input pygame.mouse.set_cursor pygame.mouse.set_cursor(size, hotspot, xormasks, andmasks): return None set the image for the system mouse cursor pygame.mouse.get_cursor pygame.mouse.get_cursor(): return (size, hotspot, xormasks, andmasks) get the image for the system mouse cursor pygame.movie pygame module for playback of mpeg video pygame.movie.Movie pygame.movie.Movie(filename): return Movie pygame.movie.Movie(object): return Movie load an mpeg movie file Movie.play Movie.play(loops=0): return None start playback of a movie Movie.stop Movie.stop(): return None stop movie playback Movie.pause Movie.pause(): return None temporarily stop and resume playback Movie.skip Movie.skip(seconds): return None advance the movie playback position Movie.rewind Movie.rewind(): return None restart the movie playback Movie.render_frame Movie.render_frame(frame_number): return frame_number set the current video frame Movie.get_frame Movie.get_frame(): return frame_number get the current video frame Movie.get_time Movie.get_time(): return seconds get the current vide playback time Movie.get_busy Movie.get_busy(): return bool check if the movie is currently playing Movie.get_length Movie.get_length(): return seconds the total length of the movie in seconds Movie.get_size Movie.get_size(): return (width, height) get the resolution of the video Movie.has_video Movie.get_video(): return bool check if the movie file contains video Movie.has_audio Movie.get_audio(): return bool check if the movie file contains audio Movie.set_volume Movie.set_volume(value): return None set the audio playback volume Movie.set_display Movie.set_display(Surface, rect=None): return None set the video target Surface pygame.mixer.music pygame module for controlling streamed audio pygame.mixer.music.load pygame.mixer.music.load(filename): return None pygame.mixer.music.load(object): return None Load a music file for playback pygame.mixer.music.play pygame.mixer.music.play(loops=0, start=0.0): return None Start the playback of the music stream pygame.mixer.music.rewind pygame.mixer.music.rewind(): return None restart music pygame.mixer.music.stop pygame.mixer.music.stop(): return None stop the music playback pygame.mixer.music.pause pygame.mixer.music.pause(): return None temporarily stop music playback pygame.mixer.music.unpause pygame.mixer.music.unpause(): return None resume paused music pygame.mixer.music.fadeout pygame.mixer.music.fadeout(time): return None stop music playback after fading out pygame.mixer.music.set_volume pygame.mixer.music.set_volume(value): return None set the music volume pygame.mixer.music.get_volume pygame.mixer.music.get_volume(): return value get the music volume pygame.mixer.music.get_busy pygame.mixer.music.get_busy(): return bool check if the music stream is playing pygame.mixer.music.get_pos pygame.mixer.music.get_pos(): return time get the music play time pygame.mixer.music.queue pygame.mixer.music.queue(filename): return None queue a music file to follow the current pygame.mixer.music.set_endevent pygame.mixer.music.set_endevent(): return None pygame.mixer.music.set_endevent(type): return None have the music send an event when playback stops pygame.mixer.music.get_endevent pygame.mixer.music.get_endevent(): return type get the event a channel sends when playback stops pygame.Overlay pygame.Overlay(format, (width, height)): return Overlay pygame object for video overlay graphics Overlay.display Overlay.display((y, u, v)): return None Overlay.display(): return None set the overlay pixel data Overlay.set_location Overlay.set_location(rect): return None control where the overlay is displayed Overlay.get_hardware Overlay.get_hardware(rect): return int test if the Overlay is hardware accelerated pygame.PixelArray pygame.PixelArray(Surface): return PixelArray pygame object for direct pixel access of surfaces PixelArray.surface PixelArray.surface: Return Surface Gets the Surface the PixelArray uses. PixelArray.make_surface PixelArray.make_surface (): Return Surface Creates a new Surface from the current PixelArray. PixelArray.replace PixelArray.replace (color, repcolor, distance=0, weights=(0.299, 0.587, 0.114)): Return None Replaces the passed color in the PixelArray with another one. PixelArray.extract PixelArray.extract (color, distance=0, weights=(0.299, 0.587, 0.114)): Return PixelArray Extracts the passed color from the PixelArray. PixelArray.compare PixelArray.compare (array, distance=0, weights=(0.299, 0.587, 0.114)): Return PixelArray Compares the PixelArray with another one. pygame.Rect pygame.Rect(left, top, width, height): return Rect pygame.Rect((left, top), (width, height)): return Rect pygame.Rect(object): return Rect pygame object for storing rectangular coordinates Rect.copy Rect.copy(): return Rect copy the rectangle Rect.move Rect.move(x, y): return Rect moves the rectangle Rect.move_ip Rect.move_ip(x, y): return None moves the rectangle, in place Rect.inflate Rect.inflate(x, y): return Rect grow or shrink the rectangle size Rect.inflate_ip Rect.inflate_ip(x, y): return None grow or shrink the rectangle size, in place Rect.clamp Rect.clamp(Rect): return Rect moves the rectangle inside another Rect.clamp_ip Rect.clamp_ip(Rect): return None moves the rectangle inside another, in place Rect.clip Rect.clip(Rect): return Rect crops a rectangle inside another Rect.union Rect.union(Rect): return Rect joins two rectangles into one Rect.union_ip Rect.union_ip(Rect): return None joins two rectangles into one, in place Rect.unionall Rect.unionall(Rect_sequence): return Rect the union of many rectangles Rect.unionall_ip Rect.unionall_ip(Rect_sequence): return None the union of many rectangles, in place Rect.fit Rect.fit(Rect): return Rect resize and move a rectangle with aspect ratio Rect.normalize Rect.normalize(): return None correct negative sizes Rect.contains Rect.contains(Rect): return bool test if one rectangle is inside another Rect.collidepoint Rect.collidepoint(x, y): return bool Rect.collidepoint((x,y)): return bool test if a point is inside a rectangle Rect.colliderect Rect.colliderect(Rect): return bool test if two rectangles overlap Rect.collidelist Rect.collidelist(list): return index test if one rectangle in a list intersects Rect.collidelistall Rect.collidelistall(list): return indices test if all rectangles in a list intersect Rect.collidedict Rect.collidedict(dict): return (key, value) test if one rectangle in a dictionary intersects Rect.collidedictall Rect.collidedictall(dict): return [(key, value), ...] test if all rectangles in a dictionary intersect pygame.scrap pygame module for clipboard support. pygame.scrap.init scrap.init () -> None Initializes the scrap module. pygame.scrap.get scrap.get (type) -> string Gets the data for the specified type from the clipboard. pygame.scrap.get_types scrap.get_types () -> list Gets a list of the available clipboard types. pygame.scrap.put scrap.put(type, data) -> None Places data into the clipboard. pygame.scrap.contains scrap.contains (type) -> bool Checks, whether a certain type is available in the clipboard. pygame.scrap.lost scrap.lost() -> bool Checks whether the clipboard is currently owned by the application. pygame.scrap.set_mode scrap.set_mode(mode) -> None Sets the clipboard access mode. pygame.sndarray pygame module for accessing sound sample data pygame.sndarray.array pygame.sndarray.array(Sound): return array copy Sound samples into an array pygame.sndarray.samples pygame.sndarray.samples(Sound): return array reference Sound samples into an array pygame.sndarray.make_sound pygame.sndarray.make_sound(array): return Sound convert an array into a Sound object pygame.sndarray.use_arraytype pygame.sndarray.use_arraytype (arraytype): return None Sets the array system to be used for sound arrays pygame.sndarray.get_arraytype pygame.sndarray.get_arraytype (): return str Gets the currently active array type. pygame.sndarray.get_arraytypes pygame.sndarray.get_arraytypes (): return tuple Gets the array system types currently supported. pygame.sprite pygame module with basic game object classes pygame.sprite.Sprite pygame.sprite.Sprite(*groups): return Sprite simple base class for visible game objects Sprite.update Sprite.update(*args): method to control sprite behavior Sprite.add Sprite.add(*groups): return None add the sprite to groups Sprite.remove Sprite.remove(*groups): return None remove the sprite from groups Sprite.kill Sprite.kill(): return None remove the Sprite from all Groups Sprite.alive Sprite.alive(): return bool does the sprite belong to any groups Sprite.groups Sprite.groups(): return group_list list of Groups that contain this Sprite pygame.sprite.DirtySprite pygame.sprite.DirtySprite(*groups): return DirtySprite a more featureful subclass of Sprite with more attributes pygame.sprite.Group pygame.sprite.Group(*sprites): return Group container class for many Sprites Group.sprites Group.sprites(): return sprite_list list of the Sprites this Group contains Group.copy Group.copy(): return Group duplicate the Group Group.add Group.add(*sprites): return None add Sprites to this Group Group.remove Group.remove(*sprites): return None remove Sprites from the Group Group.has Group.has(*sprites): return None test if a Group contains Sprites Group.update Group.update(*args): return None call the update method on contained Sprites Group.draw Group.draw(Surface): return None blit the Sprite images Group.clear Group.clear(Surface_dest, background): return None draw a background over the Sprites Group.empty Group.empty(): return None remove all Sprites pygame.sprite.RenderUpdates pygame.sprite.RenderUpdates(*sprites): return RenderUpdates Group class that tracks dirty updates RenderUpdates.draw RenderUpdates.draw(surface): return Rect_list blit the Sprite images and track changed areas pygame.sprite.OrderedUpdates pygame.sprite.OrderedUpdates(*spites): return OrderedUpdates RenderUpdates class that draws Sprites in order of addition pygame.sprite.LayeredUpdates pygame.sprite.LayeredUpdates(*spites, **kwargs): return LayeredUpdates LayeredUpdates Group handles layers, that draws like OrderedUpdates. LayeredUpdates.add LayeredUpdates.add(*sprites, **kwargs): return None add a sprite or sequence of sprites to a group LayeredUpdates.sprites LayeredUpdates.sprites(): return sprites returns a ordered list of sprites (first back, last top). LayeredUpdates.draw LayeredUpdates.draw(surface): return Rect_list draw all sprites in the right order onto the passed surface. LayeredUpdates.get_sprites_at LayeredUpdates.get_sprites_at(pos): return colliding_sprites returns a list with all sprites at that position. LayeredUpdates.get_sprite LayeredUpdates.get_sprite(idx): return sprite returns the sprite at the index idx from the groups sprites LayeredUpdates.remove_sprites_of_layer LayeredUpdates.remove_sprites_of_layer(layer_nr): return sprites removes all sprites from a layer and returns them as a list. LayeredUpdates.layers LayeredUpdates.layers(): return layers returns a list of layers defined (unique), sorted from botton up. LayeredUpdates.change_layer LayeredUpdates.change_layer(sprite, new_layer): return None changes the layer of the sprite LayeredUpdates.get_layer_of_sprite LayeredUpdates.get_layer_of_sprite(sprite): return layer returns the layer that sprite is currently in. LayeredUpdates.get_top_layer LayeredUpdates.get_top_layer(): return layer returns the top layer LayeredUpdates.get_bottom_layer LayeredUpdates.get_bottom_layer(): return layer returns the bottom layer LayeredUpdates.move_to_front LayeredUpdates.move_to_front(sprite): return None brings the sprite to front layer LayeredUpdates.move_to_back LayeredUpdates.move_to_back(sprite): return None moves the sprite to the bottom layer LayeredUpdates.get_top_sprite LayeredUpdates.get_top_sprite(): return Sprite returns the topmost sprite LayeredUpdates.get_sprites_from_layer LayeredUpdates.get_sprites_from_layer(layer): return sprites returns all sprites from a layer, ordered by how they where added LayeredUpdates.switch_layer LayeredUpdates.switch_layer(layer1_nr, layer2_nr): return None switches the sprites from layer1 to layer2 pygame.sprite.LayeredDirty pygame.sprite.LayeredDirty(*spites, **kwargs): return LayeredDirty LayeredDirty Group is for DirtySprites. Subclasses LayeredUpdates. LayeredDirty.draw LayeredDirty.draw(surface, bgd=None): return Rect_list draw all sprites in the right order onto the passed surface. LayeredDirty.clear LayeredDirty.clear(surface, bgd): return None used to set background LayeredDirty.repaint_rect LayeredDirty.repaint_rect(screen_rect): return None repaints the given area LayeredDirty.set_clip LayeredDirty.set_clip(screen_rect=None): return None clip the area where to draw. Just pass None (default) to reset the clip LayeredDirty.get_clip LayeredDirty.get_clip(): return Rect clip the area where to draw. Just pass None (default) to reset the clip LayeredDirty.change_layer change_layer(sprite, new_layer): return None changes the layer of the sprite LayeredDirty.set_timing_treshold set_timing_treshold(time_ms): return None sets the treshold in milliseconds pygame.sprite.GroupSingle pygame.sprite.GroupSingle(sprite=None): return GroupSingle Group container that holds a single Sprite pygame.sprite.spritecollide pygame.sprite.spritecollide(sprite, group, dokill, collided = None): return Sprite_list find Sprites in a Group that intersect another Sprite pygame.sprite.collide_rect pygame.sprite.collide_rect(left, right): return bool collision detection between two sprites, using rects. pygame.sprite.collide_rect_ratio pygame.sprite.collide_rect_ratio(ratio): return collided_callable collision detection between two sprites, using rects scaled to a ratio. pygame.sprite.collide_circle pygame.sprite.collide_circle(left, right): return bool collision detection between two sprites, using circles. pygame.sprite.collide_circle_ratio pygame.sprite.collide_circle_ratio(ratio): return collided_callable collision detection between two sprites, using circles scaled to a ratio. pygame.sprite.collide_mask pygame.sprite.collide_mask(SpriteLeft, SpriteRight): return bool collision detection between two sprites, using masks. pygame.sprite.groupcollide pygame.sprite.groupcollide(group1, group2, dokill1, dokill2): return Sprite_dict find all Sprites that collide between two Groups pygame.sprite.spritecollideany pygame.sprite.spritecollideany(sprite, group): return bool simple test if a Sprite intersects anything in a Group pygame.Surface pygame.Surface((width, height), flags=0, depth=0, masks=None): return Surface pygame.Surface((width, height), flags=0, Surface): return Surface pygame object for representing images Surface.blit Surface.blit(source, dest, area=None, special_flags = 0): return Rect draw one image onto another Surface.convert Surface.convert(Surface): return Surface Surface.convert(depth, flags=0): return Surface Surface.convert(masks, flags=0): return Surface Surface.convert(): return Surface change the pixel format of an image Surface.convert_alpha Surface.convert_alpha(Surface): return Surface Surface.convert_alpha(): return Surface change the pixel format of an image including per pixel alphas Surface.copy Surface.copy(): return Surface create a new copy of a Surface Surface.fill Surface.fill(color, rect=None, special_flags=0): return Rect fill Surface with a solid color Surface.scroll Surface.scroll(dx=0, dy=0): return None Shift the surface image in place Surface.set_colorkey Surface.set_colorkey(Color, flags=0): return None Surface.set_colorkey(None): return None Set the transparent colorkey Surface.get_colorkey Surface.get_colorkey(): return RGB or None Get the current transparent colorkey Surface.set_alpha Surface.set_alpha(value, flags=0): return None Surface.set_alpha(None): return None set the alpha value for the full Surface image Surface.get_alpha Surface.get_alpha(): return int_value or None get the current Surface transparency value Surface.lock Surface.lock(): return None lock the Surface memory for pixel access Surface.unlock Surface.unlock(): return None unlock the Surface memory from pixel access Surface.mustlock Surface.mustlock(): return bool test if the Surface requires locking Surface.get_locked Surface.get_locked(): return bool test if the Surface is current locked Surface.get_locks Surface.get_locks(): return tuple Gets the locks for the Surface Surface.get_at Surface.get_at((x, y)): return Color get the color value at a single pixel Surface.set_at Surface.set_at((x, y), Color): return None set the color value for a single pixel Surface.get_palette Surface.get_palette(): return [RGB, RGB, RGB, ...] get the color index palette for an 8bit Surface Surface.get_palette_at Surface.get_palette_at(index): return RGB get the color for a single entry in a palette Surface.set_palette Surface.set_palette([RGB, RGB, RGB, ...]): return None set the color palette for an 8bit Surface Surface.set_palette_at Surface.set_at(index, RGB): return None set the color for a single index in an 8bit Surface palette Surface.map_rgb Surface.map_rgb(Color): return mapped_int convert a color into a mapped color value Surface.unmap_rgb Surface.map_rgb(mapped_int): return Color convert a mapped integer color value into a Color Surface.set_clip Surface.set_clip(rect): return None Surface.set_clip(None): return None set the current clipping area of the Surface Surface.get_clip Surface.get_clip(): return Rect get the current clipping area of the Surface Surface.subsurface Surface.subsurface(Rect): return Surface create a new surface that references its parent Surface.get_parent Surface.get_parent(): return Surface find the parent of a subsurface Surface.get_abs_parent Surface.get_abs_parent(): return Surface find the top level parent of a subsurface Surface.get_offset Surface.get_offset(): return (x, y) find the position of a child subsurface inside a parent Surface.get_abs_offset Surface.get_abs_offset(): return (x, y) find the absolute position of a child subsurface inside its top level parent Surface.get_size Surface.get_size(): return (width, height) get the dimensions of the Surface Surface.get_width Surface.get_width(): return width get the width of the Surface Surface.get_height Surface.get_height(): return height get the height of the Surface Surface.get_rect Surface.get_rect(**kwargs): return Rect get the rectangular area of the Surface Surface.get_bitsize Surface.get_bitsize(): return int get the bit depth of the Surface pixel format Surface.get_bytesize Surface.get_bytesize(): return int get the bytes used per Surface pixel Surface.get_flags Surface.get_flags(): return int get the additional flags used for the Surface Surface.get_pitch Surface.get_pitch(): return int get the number of bytes used per Surface row Surface.get_masks Surface.get_masks(): return (R, G, B, A) the bitmasks needed to convert between a color and a mapped integer Surface.set_masks Surface.set_masks((r,g,b,a)): return None set the bitmasks needed to convert between a color and a mapped integer Surface.get_shifts Surface.get_shifts(): return (R, G, B, A) the bit shifts needed to convert between a color and a mapped integer Surface.set_shifts Surface.get_shifts((r,g,b,a)): return None sets the bit shifts needed to convert between a color and a mapped integer Surface.get_losses Surface.get_losses(): return (R, G, B, A) the significant bits used to convert between a color and a mapped integer Surface.get_bounding_rect Surface.get_bounding_rect(min_alpha = 1): return Rect find the smallest rect containing data Surface.get_buffer Surface.get_buffer(): return BufferProxy acquires a buffer object for the pixels of the Surface. pygame.surfarray pygame module for accessing surface pixel data using array interfaces pygame.surfarray.array2d pygame.surfarray.array2d(Surface): return array Copy pixels into a 2d array pygame.surfarray.pixels2d pygame.surfarray.pixels2d(Surface): return array Reference pixels into a 2d array pygame.surfarray.array3d pygame.surfarray.array3d(Surface): return array Copy pixels into a 3d array pygame.surfarray.pixels3d pygame.surfarray.pixels3d(Surface): return array Reference pixels into a 3d array pygame.surfarray.array_alpha pygame.surfarray.array_alpha(Surface): return array Copy pixel alphas into a 2d array pygame.surfarray.pixels_alpha pygame.surfarray.pixels_alpha(Surface): return array Reference pixel alphas into a 2d array pygame.surfarray.array_colorkey pygame.surfarray.array_colorkey(Surface): return array Copy the colorkey values into a 2d array pygame.surfarray.make_surface pygame.surfarray.make_surface(array): return Surface Copy an array to a new surface pygame.surfarray.blit_array pygame.surfarray.blit_array(Surface, array): return None Blit directly from a array values pygame.surfarray.map_array pygame.surfarray.map_array(Surface, array3d): return array2d Map a 3d array into a 2d array pygame.surfarray.use_arraytype pygame.surfarray.use_arraytype (arraytype): return None Sets the array system to be used for surface arrays pygame.surfarray.get_arraytype pygame.surfarray.get_arraytype (): return str Gets the currently active array type. pygame.surfarray.get_arraytypes pygame.surfarray.get_arraytypes (): return tuple Gets the array system types currently supported. pygame.tests Pygame unit test suite package pygame.tests.run pygame.tests.run(*args, **kwds): return tuple Run the Pygame unit test suite pygame.time pygame module for monitoring time pygame.time.get_ticks pygame.time.get_ticks(): return milliseconds get the time in milliseconds pygame.time.wait pygame.time.wait(milliseconds): return time pause the program for an amount of time pygame.time.delay pygame.time.delay(milliseconds): return time pause the program for an amount of time pygame.time.set_timer pygame.time.set_timer(eventid, milliseconds): return None repeatedly create an event on the event queue pygame.time.Clock pygame.time.Clock(): return Clock create an object to help track time Clock.tick Clock.tick(framerate=0): return milliseconds control timer events update the clock Clock.tick_busy_loop Clock.tick_busy_loop(framerate=0): return milliseconds control timer events update the clock Clock.get_time Clock.get_time(): return milliseconds time used in the previous tick Clock.get_rawtime Clock.get_rawtime(): return milliseconds actual time used in the previous tick Clock.get_fps Clock.get_fps(): return float compute the clock framerate pygame.transform pygame module to transform surfaces pygame.transform.flip pygame.transform.flip(Surface, xbool, ybool): return Surface flip vertically and horizontally pygame.transform.scale pygame.transform.scale(Surface, (width, height), DestSurface = None): return Surface resize to new resolution pygame.transform.rotate pygame.transform.rotate(Surface, angle): return Surface rotate an image pygame.transform.rotozoom pygame.transform.rotozoom(Surface, angle, scale): return Surface filtered scale and rotation pygame.transform.scale2x pygame.transform.scale2x(Surface, DestSurface = None): Surface specialized image doubler pygame.transform.smoothscale pygame.transform.smoothscale(Surface, (width, height), DestSurface = None): return Surface scale a surface to an arbitrary size smoothly pygame.transform.get_smoothscale_backend pygame.transform.get_smoothscale_backend(): return String return smoothscale filter version in use: 'GENERIC', 'MMX', or 'SSE' pygame.transform.set_smoothscale_backend pygame.transform.get_smoothscale_backend(type): return None set smoothscale filter version to one of: 'GENERIC', 'MMX', or 'SSE' pygame.transform.chop pygame.transform.chop(Surface, rect): return Surface gets a copy of an image with an interior area removed pygame.transform.laplacian pygame.transform.laplacian(Surface, DestSurface = None): return Surface find edges in a surface pygame.transform.average_surfaces pygame.transform.average_surfaces(Surfaces, DestSurface = None, palette_colors = 1): return Surface find the average surface from many surfaces. pygame.transform.average_color pygame.transform.average_color(Surface, Rect = None): return Color finds the average color of a surface pygame.transform.threshold pygame.transform.threshold(DestSurface, Surface, color, threshold = (0,0,0,0), diff_color = (0,0,0,0), change_return = 1, Surface = None, inverse = False): return num_threshold_pixels finds which, and how many pixels in a surface are within a threshold of a color. */ pygame-1.9.1release/src/pygame.h0000644000175000017500000010137011224420716016466 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ #ifndef PYGAME_H #define PYGAME_H /** This header file includes all the definitions for the ** base pygame extensions. This header only requires ** SDL and Python includes. The reason for functions ** prototyped with #define's is to allow for maximum ** python portability. It also uses python as the ** runtime linker, which allows for late binding. For more ** information on this style of development, read the Python ** docs on this subject. ** http://www.python.org/doc/current/ext/using-cobjects.html ** ** If using this to build your own derived extensions, ** you'll see that the functions available here are mainly ** used to help convert between python objects and SDL objects. ** Since this library doesn't add a lot of functionality to ** the SDL libarary, it doesn't need to offer a lot either. ** ** When initializing your extension module, you must manually ** import the modules you want to use. (this is the part about ** using python as the runtime linker). Each module has its ** own import_xxx() routine. You need to perform this import ** after you have initialized your own module, and before ** you call any routines from that module. Since every module ** in pygame does this, there are plenty of examples. ** ** The base module does include some useful conversion routines ** that you are free to use in your own extension. ** ** When making changes, it is very important to keep the ** FIRSTSLOT and NUMSLOT constants up to date for each ** section. Also be sure not to overlap any of the slots. ** When you do make a mistake with this, it will result ** is a dereferenced NULL pointer that is easier to diagnose ** than it could be :] **/ #if defined(HAVE_SNPRINTF) /* defined in python.h (pyerrors.h) and SDL.h (SDL_config.h) */ #undef HAVE_SNPRINTF /* remove GCC redefine warning */ #endif // This must be before all else #if defined(__SYMBIAN32__) && defined( OPENC ) #include #if defined(__WINS__) void* _alloca(size_t size); # define alloca _alloca #endif #endif #include // No signal() #if defined(__SYMBIAN32__) && defined(HAVE_SIGNAL_H) #undef HAVE_SIGNAL_H #endif #if defined(HAVE_SNPRINTF) #undef HAVE_SNPRINTF #endif #ifdef MS_WIN32 /*Python gives us MS_WIN32, SDL needs just WIN32*/ #ifndef WIN32 #define WIN32 #endif #endif /// Prefix when initializing module #define MODPREFIX "" /// Prefix when importing module #define IMPPREFIX "pygame." #ifdef __SYMBIAN32__ #undef MODPREFIX #undef IMPPREFIX // On Symbian there is no pygame package. The extensions are built-in or in sys\bin. #define MODPREFIX "pygame_" #define IMPPREFIX "pygame_" #endif #include /* macros used throughout the source */ #define RAISE(x,y) (PyErr_SetString((x), (y)), (PyObject*)NULL) #if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION == 3 # define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None # define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True # define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False #endif /* Py_ssize_t availability. */ #if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) typedef int Py_ssize_t; #define PY_SSIZE_T_MAX INT_MAX #define PY_SSIZE_T_MIN INT_MIN typedef inquiry lenfunc; typedef intargfunc ssizeargfunc; typedef intobjargproc ssizeobjargproc; typedef intintargfunc ssizessizeargfunc; typedef intintobjargproc ssizessizeobjargproc; typedef getreadbufferproc readbufferproc; typedef getwritebufferproc writebufferproc; typedef getsegcountproc segcountproc; typedef getcharbufferproc charbufferproc; #endif #define PyType_Init(x) (((x).ob_type) = &PyType_Type) #define PYGAMEAPI_LOCAL_ENTRY "_PYGAME_C_API" #ifndef MIN #define MIN(a,b) ((a) < (b) ? (a) : (b)) #endif #ifndef MAX #define MAX(a,b) ( (a) > (b) ? (a) : (b)) #endif #ifndef ABS #define ABS(a) (((a) < 0) ? -(a) : (a)) #endif /* test sdl initializations */ #define VIDEO_INIT_CHECK() \ if(!SDL_WasInit(SDL_INIT_VIDEO)) \ return RAISE(PyExc_SDLError, "video system not initialized") #define CDROM_INIT_CHECK() \ if(!SDL_WasInit(SDL_INIT_CDROM)) \ return RAISE(PyExc_SDLError, "cdrom system not initialized") #define JOYSTICK_INIT_CHECK() \ if(!SDL_WasInit(SDL_INIT_JOYSTICK)) \ return RAISE(PyExc_SDLError, "joystick system not initialized") /* BASE */ #define PYGAMEAPI_BASE_FIRSTSLOT 0 #define PYGAMEAPI_BASE_NUMSLOTS 13 #ifndef PYGAMEAPI_BASE_INTERNAL #define PyExc_SDLError ((PyObject*)PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT]) #define PyGame_RegisterQuit \ (*(void(*)(void(*)(void)))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 1]) #define IntFromObj \ (*(int(*)(PyObject*, int*))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 2]) #define IntFromObjIndex \ (*(int(*)(PyObject*, int, int*))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 3]) #define TwoIntsFromObj \ (*(int(*)(PyObject*, int*, int*))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 4]) #define FloatFromObj \ (*(int(*)(PyObject*, float*))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 5]) #define FloatFromObjIndex \ (*(float(*)(PyObject*, int, float*)) \ PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 6]) #define TwoFloatsFromObj \ (*(int(*)(PyObject*, float*, float*)) \ PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 7]) #define UintFromObj \ (*(int(*)(PyObject*, Uint32*))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 8]) #define UintFromObjIndex \ (*(int(*)(PyObject*, int, Uint32*)) \ PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 9]) #define PyGame_Video_AutoQuit \ (*(void(*)(void))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 10]) #define PyGame_Video_AutoInit \ (*(int(*)(void))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 11]) #define RGBAFromObj \ (*(int(*)(PyObject*, Uint8*))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 12]) #define import_pygame_base() { \ PyObject *_module = PyImport_ImportModule(IMPPREFIX "base"); \ if (_module != NULL) { \ PyObject *_dict = PyModule_GetDict(_module); \ PyObject *_c_api = PyDict_GetItemString(_dict, \ PYGAMEAPI_LOCAL_ENTRY); \ if(PyCObject_Check(_c_api)) { \ int i; void** localptr = (void**)PyCObject_AsVoidPtr(_c_api); \ for(i = 0; i < PYGAMEAPI_BASE_NUMSLOTS; ++i) \ PyGAME_C_API[i + PYGAMEAPI_BASE_FIRSTSLOT] = localptr[i]; \ } \ Py_DECREF(_module); \ } \ } #endif /* RECT */ #define PYGAMEAPI_RECT_FIRSTSLOT \ (PYGAMEAPI_BASE_FIRSTSLOT + PYGAMEAPI_BASE_NUMSLOTS) #define PYGAMEAPI_RECT_NUMSLOTS 4 typedef struct { int x, y; int w, h; }GAME_Rect; typedef struct { PyObject_HEAD GAME_Rect r; PyObject *weakreflist; } PyRectObject; #define PyRect_AsRect(x) (((PyRectObject*)x)->r) #ifndef PYGAMEAPI_RECT_INTERNAL #define PyRect_Check(x) \ ((x)->ob_type == (PyTypeObject*)PyGAME_C_API[PYGAMEAPI_RECT_FIRSTSLOT + 0]) #define PyRect_Type (*(PyTypeObject*)PyGAME_C_API[PYGAMEAPI_RECT_FIRSTSLOT + 0]) #define PyRect_New \ (*(PyObject*(*)(SDL_Rect*))PyGAME_C_API[PYGAMEAPI_RECT_FIRSTSLOT + 1]) #define PyRect_New4 \ (*(PyObject*(*)(int,int,int,int))PyGAME_C_API[PYGAMEAPI_RECT_FIRSTSLOT + 2]) #define GameRect_FromObject \ (*(GAME_Rect*(*)(PyObject*, GAME_Rect*)) \ PyGAME_C_API[PYGAMEAPI_RECT_FIRSTSLOT + 3]) #define import_pygame_rect() { \ PyObject *_module = PyImport_ImportModule(IMPPREFIX "rect"); \ if (_module != NULL) { \ PyObject *_dict = PyModule_GetDict(_module); \ PyObject *_c_api = PyDict_GetItemString(_dict, \ PYGAMEAPI_LOCAL_ENTRY); \ if(PyCObject_Check(_c_api)) { \ int i; void** localptr = (void**)PyCObject_AsVoidPtr(_c_api); \ for(i = 0; i < PYGAMEAPI_RECT_NUMSLOTS; ++i) \ PyGAME_C_API[i + PYGAMEAPI_RECT_FIRSTSLOT] = localptr[i]; \ } \ Py_DECREF(_module); \ } \ } #endif /* CDROM */ #define PYGAMEAPI_CDROM_FIRSTSLOT \ (PYGAMEAPI_RECT_FIRSTSLOT + PYGAMEAPI_RECT_NUMSLOTS) #define PYGAMEAPI_CDROM_NUMSLOTS 2 typedef struct { PyObject_HEAD int id; } PyCDObject; #define PyCD_AsID(x) (((PyCDObject*)x)->id) #ifndef PYGAMEAPI_CDROM_INTERNAL #define PyCD_Check(x) \ ((x)->ob_type == (PyTypeObject*)PyGAME_C_API[PYGAMEAPI_CDROM_FIRSTSLOT + 0]) #define PyCD_Type (*(PyTypeObject*)PyGAME_C_API[PYGAMEAPI_CDROM_FIRSTSLOT + 0]) #define PyCD_New \ (*(PyObject*(*)(int))PyGAME_C_API[PYGAMEAPI_CDROM_FIRSTSLOT + 1]) #define import_pygame_cd() { \ PyObject *_module = PyImport_ImportModule(IMPPREFIX "cdrom"); \ if (_module != NULL) { \ PyObject *_dict = PyModule_GetDict(_module); \ PyObject *_c_api = PyDict_GetItemString(_dict, \ PYGAMEAPI_LOCAL_ENTRY); \ if(PyCObject_Check(_c_api)) { \ int i; void** localptr = (void**)PyCObject_AsVoidPtr(_c_api); \ for(i = 0; i < PYGAMEAPI_CDROM_NUMSLOTS; ++i) \ PyGAME_C_API[i + PYGAMEAPI_CDROM_FIRSTSLOT] = localptr[i]; \ } \ Py_DECREF(_module); \ } \ } #endif /* JOYSTICK */ #define PYGAMEAPI_JOYSTICK_FIRSTSLOT \ (PYGAMEAPI_CDROM_FIRSTSLOT + PYGAMEAPI_CDROM_NUMSLOTS) #define PYGAMEAPI_JOYSTICK_NUMSLOTS 2 typedef struct { PyObject_HEAD int id; } PyJoystickObject; #define PyJoystick_AsID(x) (((PyJoystickObject*)x)->id) #ifndef PYGAMEAPI_JOYSTICK_INTERNAL #define PyJoystick_Check(x) \ ((x)->ob_type == (PyTypeObject*) \ PyGAME_C_API[PYGAMEAPI_JOYSTICK_FIRSTSLOT + 0]) #define PyJoystick_Type \ (*(PyTypeObject*)PyGAME_C_API[PYGAMEAPI_JOYSTICK_FIRSTSLOT + 0]) #define PyJoystick_New \ (*(PyObject*(*)(int))PyGAME_C_API[PYGAMEAPI_JOYSTICK_FIRSTSLOT + 1]) #define import_pygame_joystick() { \ PyObject *_module = PyImport_ImportModule(IMPPREFIX "joystick"); \ if (_module != NULL) { \ PyObject *_dict = PyModule_GetDict(_module); \ PyObject *_c_api = PyDict_GetItemString(_dict, \ PYGAMEAPI_LOCAL_ENTRY); \ if(PyCObject_Check(_c_api)) { \ int i; void** localptr = (void**)PyCObject_AsVoidPtr(_c_api); \ for(i = 0; i < PYGAMEAPI_JOYSTICK_NUMSLOTS; ++i) \ PyGAME_C_API[i + PYGAMEAPI_JOYSTICK_FIRSTSLOT] = \ localptr[i]; \ } \ Py_DECREF(_module); \ } \ } #endif /* DISPLAY */ #define PYGAMEAPI_DISPLAY_FIRSTSLOT \ (PYGAMEAPI_JOYSTICK_FIRSTSLOT + PYGAMEAPI_JOYSTICK_NUMSLOTS) #define PYGAMEAPI_DISPLAY_NUMSLOTS 2 typedef struct { PyObject_HEAD SDL_VideoInfo info; } PyVidInfoObject; #define PyVidInfo_AsVidInfo(x) (((PyVidInfoObject*)x)->info) #ifndef PYGAMEAPI_DISPLAY_INTERNAL #define PyVidInfo_Check(x) \ ((x)->ob_type == (PyTypeObject*) \ PyGAME_C_API[PYGAMEAPI_DISPLAY_FIRSTSLOT + 0]) #define PyVidInfo_Type \ (*(PyTypeObject*)PyGAME_C_API[PYGAMEAPI_DISPLAY_FIRSTSLOT + 0]) #define PyVidInfo_New \ (*(PyObject*(*)(SDL_VideoInfo*)) \ PyGAME_C_API[PYGAMEAPI_DISPLAY_FIRSTSLOT + 1]) #define import_pygame_display() { \ PyObject *_module = PyImport_ImportModule(IMPPREFIX "display"); \ if (_module != NULL) { \ PyObject *_dict = PyModule_GetDict(_module); \ PyObject *_c_api = PyDict_GetItemString(_dict, \ PYGAMEAPI_LOCAL_ENTRY); \ if(PyCObject_Check(_c_api)) { \ int i; void** localptr = (void**)PyCObject_AsVoidPtr(_c_api); \ for(i = 0; i < PYGAMEAPI_DISPLAY_NUMSLOTS; ++i) \ PyGAME_C_API[i + PYGAMEAPI_DISPLAY_FIRSTSLOT] = \ localptr[i]; \ } \ Py_DECREF(_module); \ } \ } #endif /* SURFACE */ #define PYGAMEAPI_SURFACE_FIRSTSLOT \ (PYGAMEAPI_DISPLAY_FIRSTSLOT + PYGAMEAPI_DISPLAY_NUMSLOTS) #define PYGAMEAPI_SURFACE_NUMSLOTS 3 typedef struct { PyObject_HEAD SDL_Surface* surf; struct SubSurface_Data* subsurface; /*ptr to subsurface data (if a * subsurface)*/ PyObject *weakreflist; PyObject *locklist; PyObject *dependency; } PySurfaceObject; #define PySurface_AsSurface(x) (((PySurfaceObject*)x)->surf) #ifndef PYGAMEAPI_SURFACE_INTERNAL #define PySurface_Check(x) \ ((x)->ob_type == (PyTypeObject*) \ PyGAME_C_API[PYGAMEAPI_SURFACE_FIRSTSLOT + 0]) #define PySurface_Type \ (*(PyTypeObject*)PyGAME_C_API[PYGAMEAPI_SURFACE_FIRSTSLOT + 0]) #define PySurface_New \ (*(PyObject*(*)(SDL_Surface*)) \ PyGAME_C_API[PYGAMEAPI_SURFACE_FIRSTSLOT + 1]) #define PySurface_Blit \ (*(int(*)(PyObject*,PyObject*,SDL_Rect*,SDL_Rect*,int)) \ PyGAME_C_API[PYGAMEAPI_SURFACE_FIRSTSLOT + 2]) #define import_pygame_surface() do { \ PyObject *_module = PyImport_ImportModule(IMPPREFIX "surface"); \ if (_module != NULL) { \ PyObject *_dict = PyModule_GetDict(_module); \ PyObject *_c_api = PyDict_GetItemString(_dict, \ PYGAMEAPI_LOCAL_ENTRY); \ if(PyCObject_Check(_c_api)) { \ int i; void** localptr = (void**)PyCObject_AsVoidPtr(_c_api); \ for(i = 0; i < PYGAMEAPI_SURFACE_NUMSLOTS; ++i) \ PyGAME_C_API[i + PYGAMEAPI_SURFACE_FIRSTSLOT] = \ localptr[i]; \ } \ Py_DECREF(_module); \ } \ else \ { \ break; \ } \ _module = PyImport_ImportModule(IMPPREFIX "surflock"); \ if (_module != NULL) { \ PyObject *_dict = PyModule_GetDict(_module); \ PyObject *_c_api = PyDict_GetItemString(_dict, \ PYGAMEAPI_LOCAL_ENTRY); \ if(PyCObject_Check(_c_api)) { \ int i; void** localptr = (void**)PyCObject_AsVoidPtr(_c_api); \ for(i = 0; i < PYGAMEAPI_SURFLOCK_NUMSLOTS; ++i) \ PyGAME_C_API[i + PYGAMEAPI_SURFLOCK_FIRSTSLOT] = \ localptr[i]; \ } \ Py_DECREF(_module); \ } \ } while (0) #endif /* SURFLOCK */ /*auto import/init by surface*/ #define PYGAMEAPI_SURFLOCK_FIRSTSLOT \ (PYGAMEAPI_SURFACE_FIRSTSLOT + PYGAMEAPI_SURFACE_NUMSLOTS) #define PYGAMEAPI_SURFLOCK_NUMSLOTS 8 struct SubSurface_Data { PyObject* owner; int pixeloffset; int offsetx, offsety; }; typedef struct { PyObject_HEAD PyObject *surface; PyObject *lockobj; PyObject *weakrefs; } PyLifetimeLock; #ifndef PYGAMEAPI_SURFLOCK_INTERNAL #define PyLifetimeLock_Check(x) \ ((x)->ob_type == (PyTypeObject*) \ PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 0]) #define PySurface_Prep(x) \ if(((PySurfaceObject*)x)->subsurface) \ (*(*(void(*)(PyObject*)) \ PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 1]))(x) #define PySurface_Unprep(x) \ if(((PySurfaceObject*)x)->subsurface) \ (*(*(void(*)(PyObject*)) \ PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 2]))(x) #define PySurface_Lock \ (*(int(*)(PyObject*))PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 3]) #define PySurface_Unlock \ (*(int(*)(PyObject*))PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 4]) #define PySurface_LockBy \ (*(int(*)(PyObject*,PyObject*)) \ PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 5]) #define PySurface_UnlockBy \ (*(int(*)(PyObject*,PyObject*)) \ PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 6]) #define PySurface_LockLifetime \ (*(PyObject*(*)(PyObject*,PyObject*)) \ PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 7]) #endif /* EVENT */ #define PYGAMEAPI_EVENT_FIRSTSLOT \ (PYGAMEAPI_SURFLOCK_FIRSTSLOT + PYGAMEAPI_SURFLOCK_NUMSLOTS) #define PYGAMEAPI_EVENT_NUMSLOTS 4 typedef struct { PyObject_HEAD int type; PyObject* dict; } PyEventObject; #ifndef PYGAMEAPI_EVENT_INTERNAL #define PyEvent_Check(x) \ ((x)->ob_type == (PyTypeObject*)PyGAME_C_API[PYGAMEAPI_EVENT_FIRSTSLOT + 0]) #define PyEvent_Type \ (*(PyTypeObject*)PyGAME_C_API[PYGAMEAPI_EVENT_FIRSTSLOT + 0]) #define PyEvent_New \ (*(PyObject*(*)(SDL_Event*))PyGAME_C_API[PYGAMEAPI_EVENT_FIRSTSLOT + 1]) #define PyEvent_New2 \ (*(PyObject*(*)(int, PyObject*))PyGAME_C_API[PYGAMEAPI_EVENT_FIRSTSLOT + 2]) #define PyEvent_FillUserEvent \ (*(int (*)(PyEventObject*, SDL_Event*)) \ PyGAME_C_API[PYGAMEAPI_EVENT_FIRSTSLOT + 3]) #define import_pygame_event() { \ PyObject *_module = PyImport_ImportModule(IMPPREFIX "event"); \ if (_module != NULL) { \ PyObject *_dict = PyModule_GetDict(_module); \ PyObject *_c_api = PyDict_GetItemString(_dict, \ PYGAMEAPI_LOCAL_ENTRY); \ if(PyCObject_Check(_c_api)) { \ int i; void** localptr = (void**)PyCObject_AsVoidPtr(_c_api); \ for(i = 0; i < PYGAMEAPI_EVENT_NUMSLOTS; ++i) \ PyGAME_C_API[i + PYGAMEAPI_EVENT_FIRSTSLOT] = localptr[i]; \ } \ Py_DECREF(_module); \ } \ } #endif /* RWOBJECT */ /*the rwobject are only needed for C side work, not accessable from python*/ #define PYGAMEAPI_RWOBJECT_FIRSTSLOT \ (PYGAMEAPI_EVENT_FIRSTSLOT + PYGAMEAPI_EVENT_NUMSLOTS) #define PYGAMEAPI_RWOBJECT_NUMSLOTS 4 #ifndef PYGAMEAPI_RWOBJECT_INTERNAL #define RWopsFromPython \ (*(SDL_RWops*(*)(PyObject*))PyGAME_C_API[PYGAMEAPI_RWOBJECT_FIRSTSLOT + 0]) #define RWopsCheckPython \ (*(int(*)(SDL_RWops*))PyGAME_C_API[PYGAMEAPI_RWOBJECT_FIRSTSLOT + 1]) #define RWopsFromPythonThreaded \ (*(SDL_RWops*(*)(PyObject*))PyGAME_C_API[PYGAMEAPI_RWOBJECT_FIRSTSLOT + 2]) #define RWopsCheckPythonThreaded \ (*(int(*)(SDL_RWops*))PyGAME_C_API[PYGAMEAPI_RWOBJECT_FIRSTSLOT + 3]) #define import_pygame_rwobject() { \ PyObject *_module = PyImport_ImportModule(IMPPREFIX "rwobject"); \ if (_module != NULL) { \ PyObject *_dict = PyModule_GetDict(_module); \ PyObject *_c_api = PyDict_GetItemString(_dict, \ PYGAMEAPI_LOCAL_ENTRY); \ if(PyCObject_Check(_c_api)) { \ int i; void** localptr = (void**)PyCObject_AsVoidPtr(_c_api); \ for(i = 0; i < PYGAMEAPI_RWOBJECT_NUMSLOTS; ++i) \ PyGAME_C_API[i + PYGAMEAPI_RWOBJECT_FIRSTSLOT] = \ localptr[i]; \ } \ Py_DECREF(_module); \ } \ } #endif /* BufferProxy */ typedef struct { PyObject_HEAD PyObject *dict; /* dict for subclassing */ PyObject *weakrefs; /* Weakrefs for subclassing */ void *buffer; /* Pointer to the buffer of the parent object. */ Py_ssize_t length; /* Length of the buffer. */ PyObject *parent; /* Parent object associated with this object. */ PyObject *lock; /* Lock object for the surface. */ } PyBufferProxy; #define PYGAMEAPI_BUFFERPROXY_FIRSTSLOT \ (PYGAMEAPI_RWOBJECT_FIRSTSLOT + PYGAMEAPI_RWOBJECT_NUMSLOTS) #define PYGAMEAPI_BUFFERPROXY_NUMSLOTS 2 #ifndef PYGAMEAPI_BUFFERPROXY_INTERNAL #define PyBufferProxy_Check(x) \ ((x)->ob_type == (PyTypeObject*) \ PyGAME_C_API[PYGAMEAPI_BUFFERPROXY_FIRSTSLOT + 0]) #define PyBufferProxy_New \ (*(PyObject*(*)(PyObject*, void*, Py_ssize_t, PyObject*)) \ PyGAME_C_API[PYGAMEAPI_BUFFERPROXY_FIRSTSLOT + 1]) #define import_pygame_bufferproxy() \ { \ PyObject *_module = PyImport_ImportModule (IMPPREFIX "bufferproxy");\ if (_module != NULL) \ { \ PyObject *_dict = PyModule_GetDict (_module); \ PyObject *_c_api = PyDict_GetItemString \ (_dict, PYGAMEAPI_LOCAL_ENTRY); \ if (PyCObject_Check (_c_api)) \ { \ int i; \ void** localptr = (void**) PyCObject_AsVoidPtr (_c_api); \ for (i = 0; i < PYGAMEAPI_BUFFERPROXY_NUMSLOTS; ++i) \ PyGAME_C_API[i + PYGAMEAPI_BUFFERPROXY_FIRSTSLOT] = \ localptr[i]; \ } \ Py_DECREF (_module); \ } \ } #endif /* PYGAMEAPI_BUFFERPROXY_INTERNAL */ /* PixelArray */ #define PYGAMEAPI_PIXELARRAY_FIRSTSLOT \ (PYGAMEAPI_BUFFERPROXY_FIRSTSLOT + PYGAMEAPI_BUFFERPROXY_NUMSLOTS) #define PYGAMEAPI_PIXELARRAY_NUMSLOTS 2 #ifndef PYGAMEAPI_PIXELARRAY_INTERNAL #define PyPixelArray_Check(x) \ ((x)->ob_type == (PyTypeObject*) \ PyGAME_C_API[PYGAMEAPI_PIXELARRAY_FIRSTSLOT + 0]) #define PyPixelArray_New \ (*(PyObject*(*)) PyGAME_C_API[PYGAMEAPI_PIXELARRAY_FIRSTSLOT + 1]) #define import_pygame_pixelarray() \ { \ PyObject *_module = PyImport_ImportModule (IMPPREFIX "pixelarray"); \ if (_module != NULL) \ { \ PyObject *_dict = PyModule_GetDict (_module); \ PyObject *_c_api = PyDict_GetItemString \ (_dict, PYGAMEAPI_LOCAL_ENTRY); \ if (PyCObject_Check (_c_api)) \ { \ int i; \ void** localptr = (void**) PyCObject_AsVoidPtr (_c_api); \ for (i = 0; i < PYGAMEAPI_PIXELARRAY_NUMSLOTS; ++i) \ PyGAME_C_API[i + PYGAMEAPI_PIXELARRAY_FIRSTSLOT] = \ localptr[i]; \ } \ Py_DECREF (_module); \ } \ } #endif /* PYGAMEAPI_PIXELARRAY_INTERNAL */ /* Color */ #define PYGAMEAPI_COLOR_FIRSTSLOT \ (PYGAMEAPI_PIXELARRAY_FIRSTSLOT + PYGAMEAPI_PIXELARRAY_NUMSLOTS) #define PYGAMEAPI_COLOR_NUMSLOTS 4 #ifndef PYGAMEAPI_COLOR_INTERNAL #define PyColor_Check(x) \ ((x)->ob_type == (PyTypeObject*) \ PyGAME_C_API[PYGAMEAPI_COLOR_FIRSTSLOT + 0]) #define PyColor_New \ (*(PyObject *(*)(Uint8*)) PyGAME_C_API[PYGAMEAPI_COLOR_FIRSTSLOT + 1]) #define PyColor_NewLength \ (*(PyObject *(*)(Uint8*, Uint8)) PyGAME_C_API[PYGAMEAPI_COLOR_FIRSTSLOT + 3]) #define RGBAFromColorObj \ (*(int(*)(PyObject*, Uint8*)) PyGAME_C_API[PYGAMEAPI_COLOR_FIRSTSLOT + 2]) #define import_pygame_color() \ { \ PyObject *_module = PyImport_ImportModule (IMPPREFIX "color"); \ if (_module != NULL) \ { \ PyObject *_dict = PyModule_GetDict (_module); \ PyObject *_c_api = PyDict_GetItemString \ (_dict, PYGAMEAPI_LOCAL_ENTRY); \ if (PyCObject_Check (_c_api)) \ { \ int i; \ void** localptr = (void**) PyCObject_AsVoidPtr (_c_api); \ for (i = 0; i < PYGAMEAPI_COLOR_NUMSLOTS; ++i) \ PyGAME_C_API[i + PYGAMEAPI_COLOR_FIRSTSLOT] = \ localptr[i]; \ } \ Py_DECREF (_module); \ } \ } #endif /* PYGAMEAPI_COLOR_INTERNAL */ #ifndef NO_PYGAME_C_API #define PYGAMEAPI_TOTALSLOTS \ (PYGAMEAPI_COLOR_FIRSTSLOT + PYGAMEAPI_COLOR_NUMSLOTS) static void* PyGAME_C_API[PYGAMEAPI_TOTALSLOTS] = { NULL }; #endif /*last platform compiler stuff*/ #if defined(macintosh) && defined(__MWERKS__) || defined(__SYMBIAN32__) #define PYGAME_EXPORT __declspec(export) #else #define PYGAME_EXPORT #endif #if defined(__SYMBIAN32__) && PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION == 2 // These are missing from Python 2.2 #ifndef Py_RETURN_NONE #define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None #define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True #define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False #ifndef intrptr_t #define intptr_t int // No PySlice_GetIndicesEx on Py 2.2 #define PySlice_GetIndicesEx(a,b,c,d,e,f) PySlice_GetIndices(a,b,c,d,e) #define PyBool_FromLong(x) Py_BuildValue("b", x) #endif // _symport_free and malloc are not exported in python.dll // See http://discussion.forum.nokia.com/forum/showthread.php?t=57874 #undef PyObject_NEW #define PyObject_NEW PyObject_New #undef PyMem_MALLOC #define PyMem_MALLOC PyMem_Malloc #undef PyObject_DEL #define PyObject_DEL PyObject_Del #endif // intptr_t #endif // __SYMBIAN32__ Python 2.2.2 #endif /* PYGAME_H */ pygame-1.9.1release/src/pygame.doc0000644000175000017500000001075411176715722017023 0ustar vincentvincentpygame the top level pygame package The pygame package represents the top-level package for others to use. Pygame itself is broken into many submodules, but this does not affect programs that use Pygame. As a convenience, most of the top-level variables in pygame have been placed inside a module named 'pygame.locals'. This is meant to be used with 'from pygame.locals import *', in addition to 'import pygame'. When you 'import pygame' all available pygame submodules are automatically imported. Be aware that some of the pygame modules are considered "optional", and may not be available. In that case, Pygame will provide a placeholder object instead of the module, which can be used to test for availability.
    init initialize all imported pygame modules pygame.init(): return (numpass, numfail) Initialize all imported Pygame modules. No exceptions will be raised if a module fails, but the total number if successful and failed inits will be returned as a tuple. You can always initialize individual modules manually, but pygame.init is a convenient way to get everything started. The init() functions for individual modules will raise exceptions when they fail. You may want to initalise the different modules seperately to speed up your program or to not use things your game does not. It is safe to call this init() more than once: repeated calls will have no effect. This is true even if you have pygame.quit() all the modules. quit uninitialize all pygame modules pygame.quit(): return None Uninitialize all pygame modules that have previously been initialized. When the Python interpreter shuts down, this method is called regardless, so your program should not need it, except when it wants to terminate its pygame resources and continue. It is safe to call this function more than once: repeated calls have no effect. Note, that pygame.quit will not exit your program. Consider letting your program end in the same way a normal python program will end. error standard pygame exception raise pygame.error, message This exception is raised whenever a pygame or SDL operation fails. You can catch any anticipated problems and deal with the error. The exception is always raised with a descriptive message about the problem. Derived from the RuntimeError exception, which can also be used to catch these raised errors. get_error get the current error message pygame.get_error(): return errorstr SDL maintains an internal error message. This message will usually be given to you when pygame.error is raised. You will rarely need to call this function. set_error set the current error message pygame.set_error(error_msg): return None SDL maintains an internal error message. This message will usually be given to you when pygame.error is raised. You will rarely need to call this function. get_sdl_version get the version number of SDL pygame.get_sdl_version(): return major, minor, patch Returns the three version numbers of the SDL library. This version is built at compile time. It can be used to detect which features may not be available through Pygame. get_sdl_version is new in pygame 1.7.0 get_sdl_byteorder get the byte order of SDL pygame.get_sdl_byteorder(): return int Returns the byte order of the SDL library. It returns LIL_ENDIAN for little endian byte order and BIG_ENDIAN for big endian byte order. get_sdl_byteorder is new in pygame 1.8 register_quit register a function to be called when pygame quits register_quit(callable): return None When pygame.quit is called, all registered quit functions are called. Pygame modules do this automatically when they are initializing. This function is not be needed for regular pygame users. version small module containing version information module pygame.version This module is automatically imported into the pygame package and offers a few variables to check with version of pygame has been imported.
    ver version number as a string pygame.version.ver = '1.2' This is the version represented as a string. It can contain a micro release number as well, e.g., '1.5.2' vernum tupled integers of the version pygame.version.vernum = (1, 5, 3) This variable for the version can easily be compared with other version numbers of the same format. An example of checking Pygame version numbers would look like this: if pygame.version.vernum < (1, 5): print 'Warning, older version of Pygame (%s)' % pygame.version.ver disable_advanced_features = True pygame-1.9.1release/src/pixelarray_methods.c0000644000175000017500000011144011207055754021110 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2007-2008 Marcus von Appen This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* Simple weighted euclidian distance, which tries to get near to the * human eye reception using the weights. * It receives RGB values in the range 0-255 and returns a distance * value between 0.0 and 1.0. */ #define COLOR_DIFF_RGB(wr,wg,wb,r1,g1,b1,r2,g2,b2) \ (sqrt (wr * (r1 - r2) * (r1 - r2) + \ wg * (g1 - g2) * (g1 - g2) + \ wb * (b1 - b2) * (b1 - b2)) / 255.0) #define WR_NTSC 0.299 #define WG_NTSC 0.587 #define WB_NTSC 0.114 /** * Tries to retrieve a valid color for a Surface. */ static int _get_color_from_object (PyObject *val, SDL_PixelFormat *format, Uint32 *color) { Uint8 rgba[4]; if (!val) return 0; if (PyInt_Check (val)) { long intval = PyInt_AsLong (val); if (intval == -1 && PyErr_Occurred ()) { PyErr_SetString (PyExc_ValueError, "invalid color argument"); return 0; } *color = (Uint32) intval; return 1; } else if (PyLong_Check (val)) { unsigned long longval = PyLong_AsUnsignedLong (val); if (PyErr_Occurred ()) { PyErr_SetString(PyExc_ValueError, "invalid color argument"); return 0; } *color = (Uint32) longval; return 1; } else if (RGBAFromColorObj (val, rgba)) { *color = (Uint32) SDL_MapRGBA (format, rgba[0], rgba[1], rgba[2], rgba[3]); return 1; } else PyErr_SetString (PyExc_ValueError, "invalid color argument"); return 0; } /** * Retrieves a single pixel located at index from the surface pixel * array. */ static PyObject* _get_single_pixel (Uint8 *pixels, int bpp, Uint32 _index, Uint32 row) { Uint32 pixel; switch (bpp) { case 1: pixel = (Uint32)*((Uint8 *) pixels + row + _index); break; case 2: pixel = (Uint32)*((Uint16 *) (pixels + row) + _index); break; case 3: { Uint8 *px = ((Uint8 *) (pixels + row) + _index * 3); #if SDL_BYTEORDER == SDL_LIL_ENDIAN pixel = (px[0]) + (px[1] << 8) + (px[2] << 16); #else pixel = (px[2]) + (px[1] << 8) + (px[0] << 16); #endif break; } default: /* 4 bpp */ pixel = *((Uint32 *) (pixels + row) + _index); break; } return PyInt_FromLong ((long)pixel); } /** * Sets a single pixel located at index from the surface pixel array. */ static void _set_single_pixel (Uint8 *pixels, int bpp, Uint32 _index, Uint32 row, SDL_PixelFormat *format, Uint32 color) { switch (bpp) { case 1: *((Uint8 *) pixels + row + _index) = (Uint8) color; break; case 2: *((Uint16 *) (pixels + row) + _index) = (Uint16) color; break; case 3: #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *((Uint8 *) (pixels + row) + _index * 3 + (format->Rshift >> 3)) = (Uint8) (color >> 16); *((Uint8 *) (pixels + row) + _index * 3 + (format->Gshift >> 3)) = (Uint8) (color >> 8); *((Uint8 *) (pixels + row) + _index * 3 + (format->Bshift >> 3)) = (Uint8) color; #else *((Uint8 *) (pixels + row) + _index * 3 + 2 - (format->Rshift >> 3)) = (Uint8) (color >> 16); *((Uint8 *) (pixels + row) + _index * 3 + 2 - (format->Gshift >> 3)) = (Uint8) (color >> 8); *((Uint8 *) (pixels + row) + _index * 3 + 2 - (format->Bshift >> 3)) = (Uint8) color; #endif break; default: /* 4 bpp */ *((Uint32 *) (pixels + row) + _index) = color; break; } } /** * Creates a new surface using the currently applied dimensions, step * size, etc. */ static PyObject* _make_surface(PyPixelArray *array) { PyObject *newsf; SDL_Surface *tmpsf; SDL_Surface *newsurf; Uint8 *pixels; Uint8 *origpixels; SDL_Surface *surface; int bpp; Uint32 x = 0; Uint32 y = 0; Uint32 vx = 0; Uint32 vy = 0; Uint32 posx = 0; Uint32 posy = 0; Uint32 absxstep; Uint32 absystep; surface = PySurface_AsSurface (array->surface); bpp = surface->format->BytesPerPixel; /* Create the second surface. */ tmpsf = SDL_CreateRGBSurface (surface->flags, (int) (array->xlen / ABS (array->xstep)), (int) (array->ylen / ABS (array->ystep)), bpp, surface->format->Rmask, surface->format->Gmask, surface->format->Bmask, surface->format->Amask); if (!tmpsf) return RAISE (PyExc_SDLError, SDL_GetError ()); /* Guarantee an identical format. */ newsurf = SDL_ConvertSurface (tmpsf, surface->format, surface->flags); if (!newsurf) { SDL_FreeSurface (tmpsf); return RAISE (PyExc_SDLError, SDL_GetError ()); } SDL_FreeSurface (tmpsf); newsf = PySurface_New (newsurf); if (!newsf) { SDL_FreeSurface (newsurf); return NULL; } /* Acquire a temporary lock. */ if (SDL_MUSTLOCK (newsurf) == 0) SDL_LockSurface (newsurf); pixels = (Uint8 *) newsurf->pixels; origpixels = (Uint8 *) surface->pixels; absxstep = ABS (array->xstep); absystep = ABS (array->ystep); y = array->ystart; Py_BEGIN_ALLOW_THREADS; /* Single value assignment. */ switch (bpp) { case 1: while (posy < array->ylen) { vx = 0; x = array->xstart; posx = 0; while (posx < array->xlen) { *((Uint8 *) pixels + vy * newsurf->pitch + vx) = (Uint8)*((Uint8 *) origpixels + y * array->padding + x); vx++; x += array->xstep; posx += absxstep; } vy++; y += array->ystep; posy += absystep; } break; case 2: while (posy < array->ylen) { vx = 0; x = array->xstart; posx = 0; while (posx < array->xlen) { *((Uint16 *) (pixels + vy * newsurf->pitch) + vx) = (Uint16)*((Uint16 *) (origpixels + y * array->padding) + x); vx++; x += array->xstep; posx += absxstep; } vy++; y += array->ystep; posy += absystep; } break; case 3: { Uint8 *px; Uint8 *vpx; SDL_PixelFormat *format = newsurf->format; SDL_PixelFormat *vformat = surface->format; while (posy < array->ylen) { vx = 0; x = array->xstart; posx = 0; while (posx < array->xlen) { px = ((Uint8 *) (pixels + vy * newsurf->pitch) + vx * 3); vpx = ((Uint8 *) (origpixels + y * array->padding) + x * 3); #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *(px + (format->Rshift >> 3)) = *(vpx + (vformat->Rshift >> 3)); *(px + (format->Gshift >> 3)) = *(vpx + (vformat->Gshift >> 3)); *(px + (format->Bshift >> 3)) = *(vpx + (vformat->Bshift >> 3)); #else *(px + 2 - (format->Rshift >> 3)) = *(vpx + 2 - (vformat->Rshift >> 3)); *(px + 2 - (format->Gshift >> 3)) = *(vpx + 2 - (vformat->Gshift >> 3)); *(px + 2 - (format->Bshift >> 3)) = *(vpx + 2 - (vformat->Bshift >> 3)); #endif vx++; x += array->xstep; posx += absxstep; } vy++; y += array->ystep; posy += absystep; } break; } default: while (posy < array->ylen) { vx = 0; x = array->xstart; posx = 0; while (posx < array->xlen) { *((Uint32 *) (pixels + vy * newsurf->pitch) + vx) = (Uint32)*((Uint32 *) (origpixels + y * array->padding) + x); vx++; x += array->xstep; posx += absxstep; } vy++; y += array->ystep; posy += absystep; } break; } Py_END_ALLOW_THREADS; if (SDL_MUSTLOCK (newsurf) == 0) SDL_UnlockSurface (newsurf); return newsf; } static int _get_weights (PyObject *weights, float *wr, float *wg, float *wb) { int success = 1; float rgb[3] = { 0 }; if (!weights) { *wr = WR_NTSC; *wg = WG_NTSC; *wb = WB_NTSC; return 1; } if (!PySequence_Check (weights)) { PyErr_SetString (PyExc_TypeError, "weights must be a sequence"); success = 0; } else if (PySequence_Size (weights) < 3) { PyErr_SetString (PyExc_TypeError, "weights must contain at least 3 values"); success = 0; } else { PyObject *item; int i; for (i = 0; i < 3; i++) { item = PySequence_GetItem (weights, i); if (PyNumber_Check (item)) { PyObject *num = NULL; if ((num = PyNumber_Float (item)) != NULL) { rgb[i] = (float) PyFloat_AsDouble (num); Py_DECREF (num); } else if ((num = PyNumber_Int (item)) != NULL) { rgb[i] = (float) PyInt_AsLong (num); if (rgb[i] == -1 && PyErr_Occurred ()) success = 0; Py_DECREF (num); } else if ((num = PyNumber_Long (item)) != NULL) { rgb[i] = (float) PyLong_AsLong (num); if (PyErr_Occurred () && PyErr_ExceptionMatches (PyExc_OverflowError)) success = 0; Py_DECREF (num); } } else { PyErr_SetString (PyExc_TypeError, "invalid weights"); success = 0; } Py_XDECREF (item); if (!success) break; } } if (success) { float sum = 0; *wr = rgb[0]; *wg = rgb[1]; *wb = rgb[2]; if ((*wr < 0 || *wg < 0 || *wb < 0) || (*wr == 0 && *wg == 0 && *wb == 0)) { PyErr_SetString (PyExc_ValueError, "weights must be positive and greater than 0"); return 0; } /* Build the average weight values. */ sum = *wr + *wg + *wb; *wr = *wr / sum; *wg = *wg / sum; *wb = *wb / sum; return success; } return 0; } static PyObject* _replace_color (PyPixelArray *array, PyObject *args, PyObject *kwds) { PyObject *weights = NULL; PyObject *delcolor = NULL; PyObject *replcolor = NULL; Uint32 dcolor; Uint32 rcolor; Uint8 r1, g1, b1, r2, g2, b2, a2; SDL_Surface *surface; float distance = 0; float wr, wg, wb; Uint32 x = 0; Uint32 y = 0; Uint32 posx = 0; Uint32 posy = 0; Sint32 absxstep; Sint32 absystep; Uint8 *pixels; static char *keys[] = { "color", "repcolor", "distance", "weights", NULL }; if (!PyArg_ParseTupleAndKeywords (args, kwds, "OO|fO", keys, &delcolor, &replcolor, &distance, &weights)) return NULL; if (distance < 0 || distance > 1) return RAISE (PyExc_ValueError, "distance must be in the range from 0.0 to 1.0"); surface = PySurface_AsSurface (array->surface); if (!_get_color_from_object (delcolor, surface->format, &dcolor) || !_get_color_from_object (replcolor, surface->format, &rcolor)) return NULL; if (!_get_weights (weights, &wr, &wg, &wb)) return NULL; surface = PySurface_AsSurface (array->surface); pixels = surface->pixels; absxstep = ABS (array->xstep); absystep = ABS (array->ystep); y = array->ystart; if (distance) SDL_GetRGB (dcolor, surface->format, &r1, &g1, &b1); Py_BEGIN_ALLOW_THREADS; switch (surface->format->BytesPerPixel) { case 1: { Uint8 *pixel; while (posy < array->ylen) { x = array->xstart; posx = 0; while (posx < array->xlen) { pixel = ((Uint8 *) pixels + y * surface->pitch + x); if (distance) { GET_PIXELVALS_1 (r2, g2, b2, a2, pixel, surface->format); if (COLOR_DIFF_RGB (wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) *pixel = (Uint8) rcolor; } else if (*pixel == dcolor) *pixel = (Uint8) rcolor; x += array->xstep; posx += absxstep; } y += array->ystep; posy += absystep; } break; } case 2: { Uint16 *pixel; int ppa = (surface->flags & SDL_SRCALPHA && surface->format->Amask); while (posy < array->ylen) { x = array->xstart; posx = 0; while (posx < array->xlen) { pixel = ((Uint16 *) (pixels + y * surface->pitch) + x); if (distance) { GET_PIXELVALS (r2, g2, b2, a2, (Uint32) *pixel, surface->format, ppa); if (COLOR_DIFF_RGB (wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) *pixel = (Uint16) rcolor; } else if (*pixel == dcolor) *pixel = (Uint16) rcolor; x += array->xstep; posx += absxstep; } y += array->ystep; posy += absystep; } break; } case 3: { Uint8 *px; Uint32 pxcolor; SDL_PixelFormat *format = surface->format; int ppa = (surface->flags & SDL_SRCALPHA && format->Amask); while (posy < array->ylen) { x = array->xstart; posx = 0; while (posx < array->xlen) { px = ((Uint8 *) (pixels + y * surface->pitch) + x * 3); #if SDL_BYTEORDER == SDL_LIL_ENDIAN pxcolor = (px[0]) + (px[1] << 8) + (px[2] << 16); if (distance) { GET_PIXELVALS (r2, g2, b2, a2, pxcolor, format, ppa); if (COLOR_DIFF_RGB (wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *(px + (format->Rshift >> 3)) = (Uint8) (rcolor >> 16); *(px + (format->Gshift >> 3)) = (Uint8) (rcolor >> 8); *(px + (format->Bshift >> 3)) = (Uint8) rcolor; } } else if (pxcolor == dcolor) { *(px + (format->Rshift >> 3)) = (Uint8) (rcolor >> 16); *(px + (format->Gshift >> 3)) = (Uint8) (rcolor >> 8); *(px + (format->Bshift >> 3)) = (Uint8) rcolor; } #else pxcolor = (px[2]) + (px[1] << 8) + (px[0] << 16); if (distance) { GET_PIXELVALS (r2, g2, b2, a2, pxcolor, format, ppa); if (COLOR_DIFF_RGB (wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *(px + 2 - (format->Rshift >> 3)) = (Uint8) (rcolor >> 16); *(px + 2 - (format->Gshift >> 3)) = (Uint8) (rcolor >> 8); *(px + 2 - (format->Bshift >> 3)) = (Uint8) rcolor; } } else if (pxcolor == dcolor) { *(px + 2 - (format->Rshift >> 3)) = (Uint8) (rcolor >> 16); *(px + 2 - (format->Gshift >> 3)) = (Uint8) (rcolor >> 8); *(px + 2 - (format->Bshift >> 3)) = (Uint8) rcolor; } #endif x += array->xstep; posx += absxstep; } y += array->ystep; posy += absystep; } break; } default: { Uint32 *pixel; int ppa = (surface->flags & SDL_SRCALPHA && surface->format->Amask); while (posy < array->ylen) { x = array->xstart; posx = 0; while (posx < array->xlen) { pixel = ((Uint32 *) (pixels + y * surface->pitch) + x); if (distance) { GET_PIXELVALS (r2, g2, b2, a2, *pixel, surface->format, ppa); if (COLOR_DIFF_RGB (wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) *pixel = rcolor; } else if (*pixel == dcolor) *pixel = rcolor; x += array->xstep; posx += absxstep; } y += array->ystep; posy += absystep; } break; } } Py_END_ALLOW_THREADS; Py_RETURN_NONE; } static PyObject* _extract_color (PyPixelArray *array, PyObject *args, PyObject *kwds) { PyObject *weights = NULL; PyObject *sf = NULL; PyObject *excolor = NULL; PyPixelArray *newarray = NULL; Uint32 color; Uint32 white; Uint32 black; SDL_Surface *surface; float distance = 0; float wr, wg, wb; Uint8 r1, g1, b1, r2, g2, b2, a2; Uint32 x = 0; Uint32 y = 0; Uint32 posx = 0; Uint32 posy = 0; Sint32 absxstep; Sint32 absystep; Uint8 *pixels; static char *keys[] = { "color", "distance", "weights", NULL }; if (!PyArg_ParseTupleAndKeywords (args, kwds, "O|fO", keys, &excolor, &distance, &weights)) return NULL; if (distance < 0 || distance > 1) return RAISE (PyExc_ValueError, "distance must be in the range from 0.0 to 1.0"); if (!_get_weights (weights, &wr, &wg, &wb)) return NULL; surface = PySurface_AsSurface (array->surface); if (!_get_color_from_object (excolor, surface->format, &color)) return NULL; /* Create the b/w mask surface. */ sf = _make_surface (array); if (!sf) return NULL; newarray = (PyPixelArray *) PyPixelArray_New (sf); if (!newarray) { Py_DECREF (sf); return NULL; } surface = PySurface_AsSurface (newarray->surface); black = SDL_MapRGBA (surface->format, 0, 0, 0, 255); white = SDL_MapRGBA (surface->format, 255, 255, 255, 255); if (distance) SDL_GetRGB (color, surface->format, &r1, &g1, &b1); pixels = surface->pixels; absxstep = ABS (newarray->xstep); absystep = ABS (newarray->ystep); y = newarray->ystart; Py_BEGIN_ALLOW_THREADS; switch (surface->format->BytesPerPixel) { case 1: { Uint8 *pixel; while (posy < newarray->ylen) { x = newarray->xstart; posx = 0; while (posx < newarray->xlen) { pixel = ((Uint8 *) pixels + y * surface->pitch + x); if (distance) { GET_PIXELVALS_1 (r2, g2, b2, a2, pixel, surface->format); if (COLOR_DIFF_RGB (wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) *pixel = (Uint8) white; else *pixel = (Uint8) black; } else *pixel = (*pixel == color) ? (Uint8) white : (Uint8) black; x += newarray->xstep; posx += absxstep; } y += newarray->ystep; posy += absystep; } break; } case 2: { Uint16 *pixel; int ppa = (surface->flags & SDL_SRCALPHA && surface->format->Amask); while (posy < newarray->ylen) { x = newarray->xstart; posx = 0; while (posx < newarray->xlen) { pixel = ((Uint16 *) (pixels + y * surface->pitch) + x); if (distance) { GET_PIXELVALS (r2, g2, b2, a2, (Uint32) *pixel, surface->format, ppa); if (COLOR_DIFF_RGB (wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) *pixel = (Uint16) white; else *pixel = (Uint16) black; } else *pixel = (*pixel == color) ? (Uint16) white : (Uint16) black; x += newarray->xstep; posx += absxstep; } y += newarray->ystep; posy += absystep; } break; } case 3: { Uint8 *px; Uint32 pxcolor; SDL_PixelFormat *format = surface->format; int ppa = (surface->flags & SDL_SRCALPHA && format->Amask); while (posy < newarray->ylen) { x = newarray->xstart; posx = 0; while (posx < newarray->xlen) { px = ((Uint8 *) (pixels + y * surface->pitch) + x * 3); #if SDL_BYTEORDER == SDL_LIL_ENDIAN pxcolor = (px[0]) + (px[1] << 8) + (px[2] << 16); if (distance) { GET_PIXELVALS (r2, g2, b2, a2, pxcolor, format, ppa); if (COLOR_DIFF_RGB (wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *(px + (format->Rshift >> 3)) = (Uint8) (white >> 16); *(px + (format->Gshift >> 3)) = (Uint8) (white >> 8); *(px + (format->Bshift >> 3)) = (Uint8) white; } else { *(px + (format->Rshift >> 3)) = (Uint8) (black >> 16); *(px + (format->Gshift >> 3)) = (Uint8) (black >> 8); *(px + (format->Bshift >> 3)) = (Uint8) black; } } else if (pxcolor == color) { *(px + (format->Rshift >> 3)) = (Uint8) (white >> 16); *(px + (format->Gshift >> 3)) = (Uint8) (white >> 8); *(px + (format->Bshift >> 3)) = (Uint8) white; } else { *(px + (format->Rshift >> 3)) = (Uint8) (black >> 16); *(px + (format->Gshift >> 3)) = (Uint8) (black >> 8); *(px + (format->Bshift >> 3)) = (Uint8) black; } #else pxcolor = (px[2]) + (px[1] << 8) + (px[0] << 16); if (distance) { GET_PIXELVALS (r2, g2, b2, a2, pxcolor, format, ppa); if (COLOR_DIFF_RGB (wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *(px + 2 - (format->Rshift >> 3)) = (Uint8) (white >> 16); *(px + 2 - (format->Gshift >> 3)) = (Uint8) (white >> 8); *(px + 2 - (format->Bshift >> 3)) = (Uint8) white; } else { *(px + 2 - (format->Rshift >> 3)) = (Uint8) (black >> 16); *(px + 2 - (format->Gshift >> 3)) = (Uint8) (black >> 8); *(px + 2 - (format->Bshift >> 3)) = (Uint8) black; } } else if (pxcolor == color) { *(px + 2 - (format->Rshift >> 3)) = (Uint8) (white >> 16); *(px + 2 - (format->Gshift >> 3)) = (Uint8) (white >> 8); *(px + 2 - (format->Bshift >> 3)) = (Uint8) white; } else { *(px + 2 - (format->Rshift >> 3)) = (Uint8) (black >> 16); *(px + 2 - (format->Gshift >> 3)) = (Uint8) (black >> 8); *(px + 2 - (format->Bshift >> 3)) = (Uint8) black; } #endif x += newarray->xstep; posx += absxstep; } y += newarray->ystep; posy += absystep; } break; } default: { Uint32 *pixel; int ppa = (surface->flags & SDL_SRCALPHA && surface->format->Amask); while (posy < newarray->ylen) { x = newarray->xstart; posx = 0; while (posx < newarray->xlen) { pixel = ((Uint32 *) (pixels + y * surface->pitch) + x); if (distance) { GET_PIXELVALS (r2, g2, b2, a2, *pixel, surface->format, ppa); if (COLOR_DIFF_RGB (wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) *pixel = white; else *pixel = black; } else *pixel = (*pixel == color) ? white : black; x += newarray->xstep; posx += absxstep; } y += newarray->ystep; posy += absystep; } break; } } Py_END_ALLOW_THREADS; return (PyObject *) newarray; } static PyObject* _compare (PyPixelArray *array, PyObject *args, PyObject *kwds) { PyPixelArray *array2 = NULL; PyPixelArray *newarray = NULL; PyObject *weights = NULL; PyObject *sf = NULL; SDL_Surface *surface1 = NULL; SDL_Surface *surface2 = NULL; Uint32 black; Uint32 white; float distance = 0; Uint8 r1, g1, b1, a1, r2, g2, b2, a2; float wr, wg, wb; Uint32 x = 0; Uint32 y = 0; Uint32 vx = 0; Uint32 vy = 0; Uint32 posx = 0; Uint32 posy = 0; Sint32 absxstep; Sint32 absystep; Uint8 *pixels1; Uint8 *pixels2; static char *keys[] = { "array", "distance", "weights", NULL }; if (!PyArg_ParseTupleAndKeywords (args, kwds, "O|fO", keys, &newarray, &distance, &weights)) return NULL; if (!PyPixelArray_Check (newarray)) return RAISE (PyExc_TypeError, "invalid array type"); array2 = (PyPixelArray *) newarray; newarray = NULL; if (distance < 0 || distance > 1) return RAISE (PyExc_ValueError, "distance must be in the range from 0.0 to 1.0"); if (!_get_weights (weights, &wr, &wg, &wb)) return NULL; if (array->ylen / ABS (array->ystep) != array2->ylen / ABS (array2->ystep) || array->xlen / ABS (array->xstep) != array2->xlen / ABS (array2->xstep)) { /* Bounds do not match. */ PyErr_SetString (PyExc_ValueError, "array sizes do not match"); return NULL; } surface1 = PySurface_AsSurface (array->surface); surface2 = PySurface_AsSurface (array2->surface); if (surface2->format->BytesPerPixel != surface1->format->BytesPerPixel) return RAISE (PyExc_ValueError, "bit depths do not match"); /* Create the b/w mask surface. */ sf = _make_surface (array); if (!sf) return NULL; newarray = (PyPixelArray *) PyPixelArray_New (sf); if (!newarray) { Py_DECREF (sf); return NULL; } surface1 = PySurface_AsSurface (newarray->surface); black = SDL_MapRGBA (surface1->format, 0, 0, 0, 255); white = SDL_MapRGBA (surface1->format, 255, 255, 255, 255); pixels1 = surface1->pixels; pixels2 = surface2->pixels; absxstep = ABS (array2->xstep); absystep = ABS (array2->ystep); y = array2->ystart; Py_BEGIN_ALLOW_THREADS; switch (surface1->format->BytesPerPixel) { case 1: { Uint8 *pixel1, *pixel2; while (posy < newarray->ylen) { vx = array2->xstart; x = newarray->xstart; posx = 0; while (posx < newarray->xlen) { pixel1 = ((Uint8 *) pixels1 + y * surface1->pitch + x); pixel2 = ((Uint8 *) pixels2 + vy * surface2->pitch + vx); if (distance) { GET_PIXELVALS_1 (r1, g1, b1, a1, pixel1, surface1->format); GET_PIXELVALS_1 (r2, g2, b2, a2, pixel2, surface2->format); if (COLOR_DIFF_RGB (wr, wg, wb, r1, g1, b1, r2, g2, b2) > distance) *pixel1 = (Uint8) white; else *pixel1 = (Uint8) black; } else *pixel1 = (*pixel1 == *pixel2) ? (Uint8) white : (Uint8) black; vx += array2->xstep; x += newarray->xstep; posx += absxstep; } vy += array2->ystep; y += newarray->ystep; posy += absystep; } break; } case 2: { Uint16 *pixel1, *pixel2; int ppa = (surface1->flags & SDL_SRCALPHA && surface1->format->Amask); while (posy < newarray->ylen) { vx = array2->xstart; x = array->xstart; posx = 0; while (posx < newarray->xlen) { pixel1 = ((Uint16 *) (pixels1 + y * surface1->pitch) + x); pixel2 = ((Uint16 *) (pixels2 + vy * surface2->pitch) + vx); if (distance) { GET_PIXELVALS (r1, g1, b1, a1, (Uint32) *pixel1, surface1->format, ppa); GET_PIXELVALS (r2, g2, b2, a2, (Uint32) *pixel2, surface1->format, ppa); if (COLOR_DIFF_RGB (wr, wg, wb, r1, g1, b1, r2, g2, b2) > distance) *pixel1 = (Uint16) white; else *pixel1 = (Uint16) black; } else *pixel1 = (*pixel1 == *pixel2) ? (Uint16) white : (Uint16) black; vx += array2->xstep; x += newarray->xstep; posx += absxstep; } vy += array2->ystep; y += newarray->ystep; posy += absystep; } break; } case 3: { Uint8 *px1, *px2; Uint32 pxcolor1, pxcolor2; SDL_PixelFormat *format = surface1->format; int ppa1 = (surface1->flags & SDL_SRCALPHA && surface1->format->Amask); int ppa2 = (surface2->flags & SDL_SRCALPHA && surface2->format->Amask); while (posy < newarray->ylen) { vx = array2->xstart; x = newarray->xstart; posx = 0; while (posx < newarray->xlen) { px1 = ((Uint8 *) (pixels1 + y * surface1->pitch) + x * 3); px2 = ((Uint8 *) (pixels2 + vy * surface2->pitch) + vx * 3); #if SDL_BYTEORDER == SDL_LIL_ENDIAN pxcolor1 = (px1[0]) + (px1[1] << 8) + (px1[2] << 16); pxcolor2 = (px2[0]) + (px2[1] << 8) + (px2[2] << 16); if (distance) { GET_PIXELVALS (r1, g1, b1, a1, pxcolor1, surface1->format, ppa1); GET_PIXELVALS (r2, g2, b2, a2, pxcolor2, surface2->format, ppa2); if (COLOR_DIFF_RGB (wr, wg, wb, r1, g1, b1, r2, g2, b2) > distance) { *(px1 + (format->Rshift >> 3)) = (Uint8) (white >> 16); *(px1 + (format->Gshift >> 3)) = (Uint8) (white >> 8); *(px1 + (format->Bshift >> 3)) = (Uint8) white; } else { *(px1 + (format->Rshift >> 3)) = (Uint8) (black >> 16); *(px1 + (format->Gshift >> 3)) = (Uint8) (black >> 8); *(px1 + (format->Bshift >> 3)) = (Uint8) black; } } else if (pxcolor1 != pxcolor2) { *(px1 + (format->Rshift >> 3)) = (Uint8) (white >> 16); *(px1 + (format->Gshift >> 3)) = (Uint8) (white >> 8); *(px1 + (format->Bshift >> 3)) = (Uint8) white; } else { *(px1 + (format->Rshift >> 3)) = (Uint8) (black >> 16); *(px1 + (format->Gshift >> 3)) = (Uint8) (black >> 8); *(px1 + (format->Bshift >> 3)) = (Uint8) black; } #else pxcolor1 = (px1[2]) + (px1[1] << 8) + (px1[0] << 16); pxcolor2 = (px2[2]) + (px2[1] << 8) + (px2[0] << 16); if (distance) { GET_PIXELVALS (r1, g1, b1, a1, pxcolor1, surface1->format, ppa1); GET_PIXELVALS (r2, g2, b2, a2, pxcolor2, surface2->format, ppa2); if (COLOR_DIFF_RGB (wr, wg, wb, r1, g1, b1, r2, g2, b2) > distance) { *(px1 + 2 - (format->Rshift >> 3)) = (Uint8) (white >> 16); *(px1 + 2 - (format->Gshift >> 3)) = (Uint8) (white >> 8); *(px1 + 2 - (format->Bshift >> 3)) = (Uint8) white; } else { *(px1 + 2 - (format->Rshift >> 3)) = (Uint8) (black >> 16); *(px1 + 2 - (format->Gshift >> 3)) = (Uint8) (black >> 8); *(px1 + 2 - (format->Bshift >> 3)) = (Uint8) black; } } else if (pxcolor1 != pxcolor2) { *(px1 + 2 - (format->Rshift >> 3)) = (Uint8) (white >> 16); *(px1 + 2 - (format->Gshift >> 3)) = (Uint8) (white >> 8); *(px1 + 2 - (format->Bshift >> 3)) = (Uint8) white; } else { *(px1 + 2 - (format->Rshift >> 3)) = (Uint8) (black >> 16); *(px1 + 2 - (format->Gshift >> 3)) = (Uint8) (black >> 8); *(px1 + 2 - (format->Bshift >> 3)) = (Uint8) black; } #endif vx += array2->xstep; x += newarray->xstep; posx += absxstep; } vy += array2->ystep; y += newarray->ystep; posy += absystep; } break; } default: { Uint32 *pixel1, *pixel2; int ppa1 = (surface1->flags & SDL_SRCALPHA && surface1->format->Amask); int ppa2 = (surface2->flags & SDL_SRCALPHA && surface2->format->Amask); while (posy < newarray->ylen) { vx = array2->xstart; x = newarray->xstart; posx = 0; while (posx < newarray->xlen) { pixel1 = ((Uint32 *) (pixels1 + y * surface1->pitch) + x); pixel2 = ((Uint32 *) (pixels2 + vy * surface2->pitch) + vx); if (distance) { GET_PIXELVALS (r1, g1, b1, a1, *pixel1, surface1->format, ppa1); GET_PIXELVALS (r2, g2, b2, a2, *pixel2, surface2->format, ppa2); if (COLOR_DIFF_RGB (wr, wg, wb, r1, g1, b1, r2, g2, b2) > distance) *pixel1 = white; else *pixel1 = black; } else *pixel1 = (*pixel1 == *pixel2) ? white : black; vx += array2->xstep; x += newarray->xstep; posx += absxstep; } vy += array2->ystep; y += newarray->ystep; posy += absystep; } break; } } Py_END_ALLOW_THREADS; return (PyObject *) newarray; } pygame-1.9.1release/src/pixelarray.doc0000644000175000017500000001264411001455412017701 0ustar vincentvincentpygame.PixelArray pygame object for direct pixel access of surfaces pygame.PixelArray(Surface): return PixelArray The PixelArray wraps up a Surface and provides a direct 2D array access to its pixels using the surface its rows as first and its columns as second axis. It supports slicing, row and pixel manipluation, slicing and slice assignments while inplace operations such as addition, subtraction, multiplication, division and so forth are not allowed. While it is possible to assign both, integer color values and RGB(A) color tuples, the PixelArray will only use integers for the color representation. Thus, checking for certain colors has to be done using the Surface.map_rgb() method of the surface, the PixelArray was created for. pxarray = pygame.PixelArray (surface) # Check, if the first pixel at the topleft corner is blue if pxarray[0][0] == surface.map_rgb ((0, 0, 255)): ... Pixels can be manipulated using integer values or color tuples. pxarray[x][y] = 0xFF00FF pxarray[x][y] = (255, 0, 255) If you operate on a slice, you also can use arbitrary sequences or other PixelArray objects to modify the pixels. They have to match the size of the PixelArray however. pxarray[a:b] = 0xFF00FF # set all pixels to 0xFF00FF pxarray[a:b] = (0xFF00FF, 0xAACCEE, ... ) # first pixel = 0xFF00FF, # second pixel = 0xAACCEE, ... pxarray[a:b] = ((255, 0, 255), (170, 204, 238), ...) # same as above pxarray[a:b] = ((255, 0, 255), 0xAACCEE, ...) # same as above pxarray[a:b] = otherarray[x:y] # slice sizes must match Note, that something like pxarray[2:4][3:5] = ... will not cause a rectangular manipulation. Instead it will be first sliced to a two-column array, which then shall be sliced by columns once more, which will fail due an IndexError. This is caused by the slicing mechanisms in python and an absolutely correct behaviour. Create a single columned slice first, which you can manipulate then: pxarray[2][3:5] = ... pxarray[3][3:5] = ... If you want to make a rectangular manipulation or create a view of a part of the PixelArray, you also can use the subscript abilities. You can easily create different view by creating 'subarrays' using the subscripts. # Create some new PixelArray objects providing a different view # of the original array/surface. newarray = pxarray[2:4,3:5] otherarray = pxarray[::2,::2] Subscripts also can be used to do fast rectangular pixel manipulations instead of iterating over the x or y axis as above. pxarray[::2,:] = (0, 0, 0) # Make each second column black. During its lifetime, the PixelArray locks the surface, thus you explicitly have to delete it once its not used anymore and the surface should perform operations in the same scope. New in pygame 1.8. Subscript support is new in pygame 1.8.1.
    surface Gets the Surface the PixelArray uses. PixelArray.surface: Return Surface The Surface, the PixelArray was created for. make_surface Creates a new Surface from the current PixelArray. PixelArray.make_surface (): Return Surface Creates a new Surface from the current PixelArray. Depending on the current PixelArray the size, pixel order etc. will be different from the original Surface. # Create a new surface flipped around the vertical axis. sf = pxarray[:,::-1].make_surface () New in pygame 1.8.1. replace Replaces the passed color in the PixelArray with another one. PixelArray.replace (color, repcolor, distance=0, weights=(0.299, 0.587, 0.114)): Return None Replaces the pixels with the passed color in the PixelArray by changing them them to the passed replacement color. It uses a simple weighted euclidian distance formula to calculate the distance between the colors. The distance space ranges from 0.0 to 1.0 and is used as threshold for the color detection. This causes the replacement to take pixels with a similar, but not exactly identical color, into account as well. This is an in place operation that directly affects the pixels of the PixelArray. New in pygame 1.8.1. extract Extracts the passed color from the PixelArray. PixelArray.extract (color, distance=0, weights=(0.299, 0.587, 0.114)): Return PixelArray Extracts the passed color by changing all matching pixels to white, while non-matching pixels are changed to black. This returns a new PixelArray with the black/white color mask. It uses a simple weighted euclidian distance formula to calculate the distance between the colors. The distance space ranges from 0.0 to 1.0 and is used as threshold for the color detection. This causes the extraction to take pixels with a similar, but not exactly identical color, into account as well. New in pygame 1.8.1. compare Compares the PixelArray with another one. PixelArray.compare (array, distance=0, weights=(0.299, 0.587, 0.114)): Return PixelArray Compares the contents of the PixelArray with those from the passed PixelArray. It returns a new PixelArray with a black/white color mask that indicates the differences (white) of both arrays. Both PixelArray objects must have indentical bit depths and dimensions. It uses a simple weighted euclidian distance formula to calculate the distance between the colors. The distance space ranges from 0.0 to 1.0 and is used as threshold for the color detection. This causes the comparision to mark pixels with a similar, but not exactly identical color, as black. New in pygame 1.8.1. pygame-1.9.1release/src/pixelarray.c0000644000175000017500000017050111216024112017350 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2007-2008 Marcus von Appen This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define PYGAMEAPI_PIXELARRAY_INTERNAL #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" #include "surface.h" #if PY_VERSION_HEX < 0x02050000 #define PyIndex_Check(op) 0 #endif typedef struct { PyObject_HEAD PyObject *dict; /* dict for subclassing */ PyObject *weakrefs; /* Weakrefs for subclassing */ PyObject *surface; /* Surface associated with the array. */ PyObject *lock; /* Lock object for the surface. */ Uint32 xstart; /* X offset for subarrays */ Uint32 ystart; /* Y offset for subarrays */ Uint32 xlen; /* X segment length. */ Uint32 ylen; /* Y segment length. */ Sint32 xstep; /* X offset step width. */ Sint32 ystep; /* Y offset step width. */ Uint32 padding; /* Padding to get to the next x offset. */ PyObject *parent; /* Parent pixel array */ } PyPixelArray; static PyPixelArray* _pxarray_new_internal (PyTypeObject *type, PyObject *surface, Uint32 xstart, Uint32 ystart, Uint32 xlen, Uint32 ylen, Sint32 xstep, Sint32 ystep, Uint32 padding, PyObject *parent); static PyObject* _pxarray_new (PyTypeObject *type, PyObject *args, PyObject *kwds); static void _pxarray_dealloc (PyPixelArray *self); static PyObject* _pxarray_get_dict (PyPixelArray *self, void *closure); static PyObject* _pxarray_get_surface (PyPixelArray *self, void *closure); static PyObject* _pxarray_repr (PyPixelArray *array); static PyObject* _array_slice_internal (PyPixelArray *array, Sint32 _start, Sint32 _end, Sint32 _step); /* Sequence methods */ static Py_ssize_t _pxarray_length (PyPixelArray *array); static PyObject* _pxarray_item (PyPixelArray *array, Py_ssize_t _index); #if !PY3 static PyObject* _pxarray_slice (PyPixelArray *array, Py_ssize_t low, Py_ssize_t high); #endif static int _array_assign_array (PyPixelArray *array, Py_ssize_t low, Py_ssize_t high, PyPixelArray *val); static int _array_assign_sequence (PyPixelArray *array, Py_ssize_t low, Py_ssize_t high, PyObject *val); static int _array_assign_slice (PyPixelArray *array, Py_ssize_t low, Py_ssize_t high, Uint32 color); static int _pxarray_ass_item (PyPixelArray *array, Py_ssize_t _index, PyObject *value); static int _pxarray_ass_slice (PyPixelArray *array, Py_ssize_t low, Py_ssize_t high, PyObject *value); static int _pxarray_contains (PyPixelArray *array, PyObject *value); static PyObject* _pxarray_iter (PyPixelArray *array); /* Mapping methods */ static int _get_subslice (PyObject *op, Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step); static PyObject* _pxarray_subscript (PyPixelArray *array, PyObject *op); static int _pxarray_ass_subscript (PyPixelArray *array, PyObject* op, PyObject* value); /* C API interfaces */ static PyObject* PyPixelArray_New (PyObject *surfobj); /* Incomplete forward declaration so we can use it in the methods included * below. */ static PyTypeObject PyPixelArray_Type; #define PyPixelArray_Check(o) \ (Py_TYPE (o) == (PyTypeObject *) &PyPixelArray_Type) #define SURFACE_EQUALS(x,y) \ (((PyPixelArray *)x)->surface == ((PyPixelArray *)y)->surface) #include "pixelarray_methods.c" /** * Methods, which are bound to the PyPixelArray type. */ static PyMethodDef _pxarray_methods[] = { { "compare", (PyCFunction) _compare, METH_VARARGS | METH_KEYWORDS, DOC_PIXELARRAYCOMPARE }, { "extract", (PyCFunction) _extract_color, METH_VARARGS | METH_KEYWORDS, DOC_PIXELARRAYEXTRACT }, { "make_surface", (PyCFunction) _make_surface, METH_VARARGS | METH_NOARGS, DOC_PIXELARRAYMAKESURFACE }, { "replace", (PyCFunction) _replace_color, METH_VARARGS | METH_KEYWORDS, DOC_PIXELARRAYREPLACE }, { NULL, NULL, 0, NULL } }; #if PY3 static void Text_ConcatAndDel (PyObject **string, PyObject *newpart) { PyObject *result = NULL; if (*string != NULL && newpart != NULL) { PyUnicode_Concat (*string, newpart); Py_DECREF (*string); Py_DECREF (newpart); } else { Py_XDECREF (*string); Py_XDECREF (newpart); } *string = result; } #else #define Text_ConcatAndDel PyString_ConcatAndDel #endif /** * Getters and setters for the PyPixelArray. */ static PyGetSetDef _pxarray_getsets[] = { { "__dict__", (getter) _pxarray_get_dict, NULL, NULL, NULL }, { "surface", (getter) _pxarray_get_surface, NULL, DOC_PIXELARRAYSURFACE, NULL }, { NULL, NULL, NULL, NULL, NULL } }; /** * Sequence interface support for the PyPixelArray. * concat and repeat are not implemented due to the possible confusion * of their behaviour (see lists numpy array). */ static PySequenceMethods _pxarray_sequence = { (lenfunc) _pxarray_length, /*sq_length*/ NULL, /*sq_concat*/ NULL, /*sq_repeat*/ (ssizeargfunc) _pxarray_item, /*sq_item*/ #if PY3 NULL, #else (ssizessizeargfunc) _pxarray_slice, /*sq_slice*/ #endif (ssizeobjargproc) _pxarray_ass_item, /*sq_ass_item*/ #if PY3 NULL, #else (ssizessizeobjargproc) _pxarray_ass_slice, /*sq_ass_slice*/ #endif (objobjproc) _pxarray_contains, /*sq_contains*/ NULL, /*sq_inplace_concat*/ NULL, /*sq_inplace_repeat*/ }; /** * Mapping interface support for the PyPixelArray. */ static PyMappingMethods _pxarray_mapping = { (inquiry) _pxarray_length, /*mp_length*/ (binaryfunc) _pxarray_subscript, /*mp_subscript*/ (objobjargproc) _pxarray_ass_subscript, /*mp_ass_subscript*/ }; static PyTypeObject PyPixelArray_Type = { TYPE_HEAD (NULL, 0) "pygame.PixelArray", /* tp_name */ sizeof (PyPixelArray), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor) _pxarray_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_compare */ (reprfunc) _pxarray_repr, /* tp_repr */ 0, /* tp_as_number */ &_pxarray_sequence, /* tp_as_sequence */ &_pxarray_mapping, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, DOC_PYGAMEPIXELARRAY, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ offsetof (PyPixelArray, weakrefs), /* tp_weaklistoffset */ (getiterfunc) _pxarray_iter, /* tp_iter */ 0, /* tp_iternext */ _pxarray_methods, /* tp_methods */ 0, /* tp_members */ _pxarray_getsets, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ offsetof (PyPixelArray, dict), /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ _pxarray_new, /* tp_new */ #ifndef __SYMBIAN32__ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ 0 /* tp_del */ #endif }; static PyPixelArray* _pxarray_new_internal (PyTypeObject *type, PyObject *surface, Uint32 xstart, Uint32 ystart, Uint32 xlen, Uint32 ylen, Sint32 xstep, Sint32 ystep, Uint32 padding, PyObject *parent) { PyPixelArray *self = (PyPixelArray *) type->tp_alloc (type, 0); if (!self) return NULL; self->surface = (PyObject *) surface; self->lock = NULL; self->parent = NULL; Py_INCREF (surface); if (!parent) { /* Initial PixelArray */ if (surface) { self->lock = PySurface_LockLifetime (surface, (PyObject *) self); if (!self->lock) { Py_DECREF (surface); Py_TYPE (self)->tp_free ((PyObject *) self); return NULL; } } } else { self->parent = parent; Py_INCREF (parent); self->lock = ((PyPixelArray *)parent)->lock; Py_INCREF (self->lock); } self->weakrefs = NULL; self->dict = NULL; self->xstart = xstart; self->ystart = ystart; self->xlen = xlen; self->ylen = ylen; self->xstep = xstep; self->ystep = ystep; self->padding = padding; return self; } /** * Creates a new PyPixelArray. */ static PyObject* _pxarray_new (PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *surfobj; SDL_Surface* surface; if (!PyArg_ParseTuple (args, "O!", &PySurface_Type, &surfobj)) return NULL; surface = PySurface_AsSurface (surfobj); if (surface->format->BytesPerPixel < 1 || surface->format->BytesPerPixel > 4) return RAISE (PyExc_ValueError, "unsupport bit depth for reference array"); return (PyObject *) _pxarray_new_internal (type, surfobj, 0, 0, (Uint32) surface->w, (Uint32) surface->h, 1, 1, surface->pitch, NULL); } /** * Deallocates the PyPixelArray and its members. */ static void _pxarray_dealloc (PyPixelArray *self) { if (self->weakrefs) PyObject_ClearWeakRefs ((PyObject *) self); Py_XDECREF (self->lock); Py_XDECREF (self->parent); Py_XDECREF (self->dict); Py_DECREF (self->surface); Py_TYPE (self)->tp_free ((PyObject *) self); } /**** Getter and setter access ****/ /** * Getter for PixelArray.__dict__. */ static PyObject* _pxarray_get_dict (PyPixelArray *self, void *closure) { if (!self->dict) { self->dict = PyDict_New (); if (!self->dict) return NULL; } Py_INCREF (self->dict); return self->dict; } /** * Getter for PixelArray.surface */ static PyObject* _pxarray_get_surface (PyPixelArray *self, void *closure) { Py_XINCREF (self->surface); return self->surface; } /**** Methods ****/ /** * repr(PixelArray) */ static PyObject* _pxarray_repr (PyPixelArray *array) { PyObject *string; SDL_Surface *surface; int bpp; Uint8 *pixels; Uint8 *px24; Uint32 pixel; Uint32 x = 0; Uint32 y = 0; Sint32 xlen = 0; Sint32 absxstep; Sint32 absystep; Uint32 posx = 0; Uint32 posy = 0; surface = PySurface_AsSurface (array->surface); bpp = surface->format->BytesPerPixel; pixels = (Uint8 *) surface->pixels; /* printf ("::ARRAY: %d:%d:%d, %d:%d:%d %d\n", array->xstart, array->xlen, array->xstep, array->ystart, array->ylen, array->ystep, array->padding); */ string = Text_FromUTF8 ("PixelArray("); absxstep = ABS (array->xstep); absystep = ABS (array->ystep); xlen = (Sint32) array->xlen - absxstep; y = array->ystart; switch (bpp) { case 1: while (posy < array->ylen) { /* Construct the rows */ Text_ConcatAndDel (&string, Text_FromUTF8 ("\n [")); if (string == NULL) { return NULL; } posx = 0; x = array->xstart; while (posx < (Uint32)xlen) { /* Construct the columns */ pixel = (Uint32) *((Uint8 *) pixels + x + y * array->padding); Text_ConcatAndDel (&string, Text_FromFormat ("%ld, ", (long)pixel)); if (string == NULL) { return NULL; } x += array->xstep; posx += absxstep; } pixel = (Uint32) *((Uint8 *) pixels + x + y * array->padding); Text_ConcatAndDel (&string, Text_FromFormat ("%ld]", (long)pixel)); if (string == NULL) { return NULL; } y += array->ystep; posy += absystep; } break; case 2: while (posy < array->ylen) { /* Construct the rows */ Text_ConcatAndDel (&string, Text_FromUTF8 ("\n [")); if (string == NULL) { return NULL; } posx = 0; x = array->xstart; while (posx < (Uint32)xlen) { /* Construct the columns */ pixel = (Uint32) *((Uint16 *) (pixels + y * array->padding) + x); Text_ConcatAndDel (&string, Text_FromFormat ("%ld, ", (long)pixel)); if (string == NULL) { return NULL; } x += array->xstep; posx += absxstep; } pixel = (Uint32) *((Uint16 *) (pixels + y * array->padding) + x); Text_ConcatAndDel (&string, Text_FromFormat ("%ld]", (long)pixel)); if (string == NULL) { return NULL; } y += array->ystep; posy += absystep; } break; case 3: while (posy < array->ylen) { /* Construct the rows */ Text_ConcatAndDel (&string, Text_FromUTF8 ("\n [")); if (string == NULL) { return NULL; } posx = 0; x = array->xstart; while (posx < (Uint32)xlen) { /* Construct the columns */ px24 = ((Uint8 *) (pixels + y * array->padding) + x * 3); #if SDL_BYTEORDER == SDL_LIL_ENDIAN pixel = (px24[0]) + (px24[1] << 8) + (px24[2] << 16); #else pixel = (px24[2]) + (px24[1] << 8) + (px24[0] << 16); #endif Text_ConcatAndDel (&string, Text_FromFormat ("%ld, ", (long)pixel)); if (string == NULL) { return NULL; } x += array->xstep; posx += absxstep; } px24 = ((Uint8 *) (pixels + y * array->padding) + x * 3); #if SDL_BYTEORDER == SDL_LIL_ENDIAN pixel = (px24[0]) + (px24[1] << 8) + (px24[2] << 16); #else pixel = (px24[2]) + (px24[1] << 8) + (px24[0] << 16); #endif Text_ConcatAndDel (&string, Text_FromFormat ("%ld]", (long)pixel)); if (string == NULL) { return NULL; } y += array->ystep; posy += absystep; } break; default: /* 4bpp */ while (posy < array->ylen) { /* Construct the rows */ Text_ConcatAndDel (&string, Text_FromUTF8 ("\n [")); if (string == NULL) { return NULL; } posx = 0; x = array->xstart; while (posx < (Uint32)xlen) { /* Construct the columns */ pixel = *((Uint32 *) (pixels + y * array->padding) + x); Text_ConcatAndDel (&string, Text_FromFormat ("%ld, ", (long)pixel)); if (string == NULL) { return NULL; } x += array->xstep; posx += absxstep; } pixel = *((Uint32 *) (pixels + y * array->padding) + x); Text_ConcatAndDel (&string, Text_FromFormat ("%ld]", (long)pixel)); if (string == NULL) { return NULL; } y += array->ystep; posy += absystep; } break; } Text_ConcatAndDel (&string, Text_FromUTF8 ("\n)")); return string; } /** * Creates a 2D slice of the array. */ static PyObject* _array_slice_internal (PyPixelArray *array, Sint32 _start, Sint32 _end, Sint32 _step) { Uint32 xstart = 0; Uint32 ystart = 0; Uint32 xlen; Uint32 ylen; Sint32 xstep; Sint32 ystep; Uint32 padding; if (_end == _start) return RAISE (PyExc_IndexError, "array size must not be 0"); if (array->xlen == 1) { ystart = array->ystart + _start * array->ystep; xstart = array->xstart; xlen = array->xlen; ylen = ABS (_end - _start); ystep = _step; xstep = array->xstep; padding = array->padding; /* Out of bounds? */ if (_start >= (Sint32) array->ylen && ystep > 0) return RAISE (PyExc_IndexError, "array index out of range"); } else { xstart = array->xstart + _start * array->xstep; ystart = array->ystart; xlen = ABS (_end - _start); ylen = array->ylen; xstep = _step; ystep = array->ystep; padding = array->padding; /* Out of bounds? */ if (_start >= (Sint32) array->xlen && xstep > 0) return RAISE (PyExc_IndexError, "array index out of range"); } /* printf ("VALS: %d:%d, %d:%d %d:%d %d\n", xstart, ystart, xlen, xstep, ylen, ystep, padding); */ return (PyObject *) _pxarray_new_internal (&PyPixelArray_Type, array->surface, xstart, ystart, xlen, ylen, xstep, ystep, padding, (PyObject *) array); } /**** Sequence interfaces ****/ /** * len (array) */ static Py_ssize_t _pxarray_length (PyPixelArray *array) { if (array->xlen > 1) return array->xlen / ABS (array->xstep); return array->ylen / ABS (array->ystep); } /** * array[x] */ static PyObject* _pxarray_item (PyPixelArray *array, Py_ssize_t _index) { SDL_Surface *surface; int bpp; if (_index < 0) return RAISE (PyExc_IndexError, "array index out of range"); surface = PySurface_AsSurface (array->surface); bpp = surface->format->BytesPerPixel; /* Access of a single column. */ if (array->xlen == 1) { if ((Uint32) _index >= array->ystart + array->ylen) return RAISE (PyExc_IndexError, "array index out of range"); return _get_single_pixel ((Uint8 *) surface->pixels, bpp, array->xstart, _index * array->padding * array->ystep); } if (array->ylen == 1) { if ((Uint32) _index >= array->xstart + array->xlen) return RAISE (PyExc_IndexError, "array index out of range"); return _get_single_pixel ((Uint8 *) surface->pixels, bpp, array->xstart + _index * array->xstep, array->ystart * array->padding * array->ystep); } return _array_slice_internal (array, _index, _index + 1, 1); } #if !PY3 /** * array[x:y] */ static PyObject* _pxarray_slice (PyPixelArray *array, Py_ssize_t low, Py_ssize_t high) { if (low < 0) low = 0; else if (low > (Sint32) array->xlen) low = array->xlen; if (high < low) high = low; else if (high > (Sint32) array->xlen) high = array->xlen; if (low == high) Py_RETURN_NONE; return _array_slice_internal (array, low, high, 1); } #endif static int _array_assign_array (PyPixelArray *array, Py_ssize_t low, Py_ssize_t high, PyPixelArray *val) { SDL_Surface *surface; SDL_Surface *valsf = NULL; Uint32 x = 0; Uint32 y = 0; Uint32 vx = 0; Uint32 vy = 0; int bpp; int valbpp; Uint8 *pixels; Uint8 *valpixels; int copied = 0; Uint32 xstart = 0; Uint32 ystart = 0; Uint32 xlen; Uint32 ylen; Sint32 xstep; Sint32 ystep; Uint32 padding; Uint32 posx = 0; Uint32 posy = 0; Sint32 absxstep; Sint32 absystep; /* Set the correct slice indices */ surface = PySurface_AsSurface (array->surface); if (array->xlen == 1) { xstart = array->xstart; ystart = array->ystart + low * array->ystep; xlen = array->xlen; ylen = ABS (high - low); ystep = array->ystep; xstep = array->xstep; padding = array->padding; } else { xstart = array->xstart + low * array->xstep; ystart = array->ystart; xlen = ABS (high - low); ylen = array->ylen; xstep = array->xstep; ystep = array->ystep; padding = array->padding; } /* printf ("ARRAY: %d:%d:%d, %d:%d:%d -- VAL: %d:%d:%d, %d:%d:%d\n", xstart, xlen, xstep, ystart, ylen, ystep, val->xstart, val->xlen, val->xstep, val->ystart, val->ylen, val->ystep); */ if (val->ylen / ABS (val->ystep) != ylen / ABS (ystep) || val->xlen / ABS (val->xstep) != xlen / ABS (xstep)) { /* Bounds do not match. */ PyErr_SetString (PyExc_ValueError, "array sizes do not match"); return -1; } valsf = PySurface_AsSurface (val->surface); bpp = surface->format->BytesPerPixel; valbpp = valsf->format->BytesPerPixel; pixels = (Uint8 *) surface->pixels; valpixels = valsf->pixels; if (bpp != valbpp) { /* bpp do not match. We cannot guarantee that the padding and co * would be set correctly. */ PyErr_SetString (PyExc_ValueError, "bit depths do not match"); return -1; } /* If we reassign the same array, we need to copy the pixels * first. */ if (SURFACE_EQUALS (array, val)) { /* We assign a different view or so. Copy the source buffer. */ valpixels = malloc ((size_t) (surface->pitch * surface->h)); if (!valpixels) { PyErr_SetString (PyExc_ValueError, "could not copy pixels"); return -1; } valpixels = memcpy (valpixels, pixels, (size_t) (surface->pitch * surface->h)); copied = 1; } absxstep = ABS (xstep); absystep = ABS (ystep); y = ystart; vy = val->ystart; Py_BEGIN_ALLOW_THREADS; /* Single value assignment. */ switch (bpp) { case 1: while (posy < ylen) { vx = val->xstart; posx = 0; x = xstart; while (posx < xlen) { *((Uint8 *) pixels + y * padding + x) = (Uint8)*((Uint8 *) valpixels + vy * val->padding + vx); vx += val->xstep; x += xstep; posx += absxstep; } vy += val->ystep; y += ystep; posy += absystep; } break; case 2: while (posy < ylen) { vx = val->xstart; posx = 0; x = xstart; while (posx < xlen) { *((Uint16 *) (pixels + y * padding) + x) = (Uint16)*((Uint16 *) (valpixels + vy * val->padding) + vx); vx += val->xstep; x += xstep; posx += absxstep; } vy += val->ystep; y += ystep; posy += absystep; } break; case 3: { Uint8 *px; Uint8 *vpx; SDL_PixelFormat *format = surface->format; SDL_PixelFormat *vformat = valsf->format; while (posy < ylen) { vx = val->xstart; posx = 0; x = xstart; while (posx < xlen) { px = ((Uint8 *) (pixels + y * padding) + x * 3); vpx = ((Uint8 *) (valpixels + vy * val->padding) + vx * 3); #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *(px + (format->Rshift >> 3)) = *(vpx + (vformat->Rshift >> 3)); *(px + (format->Gshift >> 3)) = *(vpx + (vformat->Gshift >> 3)); *(px + (format->Bshift >> 3)) = *(vpx + (vformat->Bshift >> 3)); #else *(px + 2 - (format->Rshift >> 3)) = *(vpx + 2 - (vformat->Rshift >> 3)); *(px + 2 - (format->Gshift >> 3)) = *(vpx + 2 - (vformat->Gshift >> 3)); *(px + 2 - (format->Bshift >> 3)) = *(vpx + 2 - (vformat->Bshift >> 3)); #endif vx += val->xstep; x += xstep; posx += absxstep; } vy += val->ystep; y += ystep; posy += absystep; } break; } default: while (posy < ylen) { vx = val->xstart; posx = 0; x = xstart; while (posx < xlen) { *((Uint32 *) (pixels + y * padding) + x) = (Uint32)*((Uint32 *) (valpixels + vy * val->padding) + vx); vx += val->xstep; x += xstep; posx += absxstep; } vy += val->ystep; y += ystep; posy += absystep; } break; } Py_END_ALLOW_THREADS; if (copied) { free (valpixels); } return 0; } static int _array_assign_sequence (PyPixelArray *array, Py_ssize_t low, Py_ssize_t high, PyObject *val) { SDL_Surface *surface; Uint32 x = 0; Uint32 y = 0; int bpp; int gooverx = 0; Uint8 *pixels; Uint32 color = 0; Uint32 *colorvals = NULL; Uint32 *nextcolor = NULL; Py_ssize_t offset = 0; Py_ssize_t seqsize = PySequence_Size (val); Uint32 xstart = 0; Uint32 ystart = 0; Uint32 xlen; Uint32 ylen; Sint32 xstep; Sint32 ystep; Uint32 padding; Uint32 posx = 0; Uint32 posy = 0; Sint32 absxstep; Sint32 absystep; surface = PySurface_AsSurface (array->surface); bpp = surface->format->BytesPerPixel; pixels = (Uint8 *) surface->pixels; /* Set the correct slice indices */ if (array->xlen == 1) { xstart = array->xstart; ystart = array->ystart + low * array->ystep; xlen = array->xlen; ylen = ABS (high - low); ystep = array->ystep; xstep = array->xstep; padding = array->padding; } else { xstart = array->xstart + low * array->xstep; ystart = array->ystart; xlen = ABS (high - low); ylen = array->ylen; xstep = array->xstep; ystep = array->ystep; padding = array->padding; } if ((Uint32)seqsize != ylen / ABS (ystep)) { if ((Uint32)seqsize != xlen / ABS (xstep)) { PyErr_SetString(PyExc_ValueError, "sequence size mismatch"); return -1; } gooverx = 1; /* We have to iterate over the x axis. */ } if (seqsize == 1) { /* Single value assignment. */ _set_single_pixel (pixels, bpp, xstart, ystart + padding * ystep, surface->format, color); return 0; } /* Copy the values. */ colorvals = malloc (sizeof (Uint32) * seqsize); if (!colorvals) { PyErr_SetString (PyExc_ValueError, "could not copy colors"); return -1; } for (offset = 0; offset < seqsize; offset++) { if (!_get_color_from_object (PySequence_Fast_GET_ITEM (val, offset), surface->format, &color)) { free (colorvals); return -1; } colorvals[offset] = color; } absxstep = ABS (xstep); absystep = ABS (ystep); y = ystart; nextcolor = colorvals; Py_BEGIN_ALLOW_THREADS; switch (bpp) { case 1: if (gooverx) { while (posy < ylen) { posx = 0; x = xstart; nextcolor = colorvals; while (posx < xlen) { color = *nextcolor++; *((Uint8 *) pixels + y * padding + x) = (Uint8) color; x += xstep; posx += absxstep; } y += ystep; posy += absystep; } } else { while (posy < ylen) { posx = 0; x = xstart; color = *nextcolor++; while (posx < xlen) { *((Uint8 *) pixels + y * padding + x) = (Uint8) color; x += xstep; posx += absxstep; } y += ystep; posy += absystep; } } break; case 2: if (gooverx) { while (posy < ylen) { posx = 0; x = xstart; nextcolor = colorvals; while (posx < xlen) { color = *nextcolor++; *((Uint16 *) (pixels + y * padding) + x) = (Uint16) color; x += xstep; posx += absxstep; } y += ystep; posy += absystep; } } else { while (posy < ylen) { posx = 0; x = xstart; color = *nextcolor++; while (posx < xlen) { *((Uint16 *) (pixels + y * padding) + x) = (Uint16) color; x += xstep; posx += absxstep; } y += ystep; posy += absystep; } } break; case 3: { Uint8 *px; SDL_PixelFormat *format = surface->format; if (gooverx) { while (posy < ylen) { posx = 0; x = xstart; nextcolor = colorvals; while (posx < xlen) { color = *nextcolor++; px = ((Uint8 *) (pixels + y * padding) + x * 3); #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *(px + (format->Rshift >> 3)) = (Uint8) (color >> 16); *(px + (format->Gshift >> 3)) = (Uint8) (color >> 8); *(px + (format->Bshift >> 3)) = (Uint8) color; #else *(px + 2 - (format->Rshift >> 3)) = (Uint8) (color >> 16); *(px + 2 - (format->Gshift >> 3)) = (Uint8) (color >> 8); *(px + 2 - (format->Bshift >> 3)) = (Uint8) color; #endif x += xstep; posx += absxstep; } y += ystep; posy += absystep; } } else { while (posy < ylen) { posx = 0; x = xstart; color = *nextcolor++; while (posx < xlen) { px = ((Uint8 *) (pixels + y * padding) + x * 3); #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *(px + (format->Rshift >> 3)) = (Uint8) (color >> 16); *(px + (format->Gshift >> 3)) = (Uint8) (color >> 8); *(px + (format->Bshift >> 3)) = (Uint8) color; #else *(px + 2 - (format->Rshift >> 3)) = (Uint8) (color >> 16); *(px + 2 - (format->Gshift >> 3)) = (Uint8) (color >> 8); *(px + 2 - (format->Bshift >> 3)) = (Uint8) color; #endif x += xstep; posx += absxstep; } y += ystep; posy += absystep; } } break; } default: if (gooverx) { while (posy < ylen) { posx = 0; x = xstart; nextcolor = colorvals; while (posx < xlen) { color = *nextcolor++; *((Uint32 *) (pixels + y * padding) + x) = color; x += xstep; posx += absxstep; } y += ystep; posy += absystep; } } else { while (posy < ylen) { posx = 0; x = xstart; color = *nextcolor++; while (posx < xlen) { *((Uint32 *) (pixels + y * padding) + x) = color; x += xstep; posx += absxstep; } y += ystep; posy += absystep; } } break; } free (colorvals); Py_END_ALLOW_THREADS; return 0; } static int _array_assign_slice (PyPixelArray *array, Py_ssize_t low, Py_ssize_t high, Uint32 color) { SDL_Surface *surface; Uint32 x = 0; Uint32 y = 0; int bpp; Uint8 *pixels; Uint32 xstart = 0; Uint32 ystart = 0; Uint32 xlen; Uint32 ylen; Sint32 xstep; Sint32 ystep; Uint32 padding; Uint32 posx = 0; Uint32 posy = 0; Sint32 absxstep; Sint32 absystep; surface = PySurface_AsSurface (array->surface); bpp = surface->format->BytesPerPixel; pixels = (Uint8 *) surface->pixels; /* Set the correct slice indices */ if (array->xlen == 1) { xstart = array->xstart; ystart = array->ystart + low * array->ystep; xlen = array->xlen; ylen = ABS (high - low); ystep = array->ystep; xstep = array->xstep; padding = array->padding; } else { xstart = array->xstart + low * array->xstep; ystart = array->ystart; xlen = ABS (high - low); ylen = array->ylen; xstep = array->xstep; ystep = array->ystep; padding = array->padding; } absxstep = ABS (xstep); absystep = ABS (ystep); y = ystart; Py_BEGIN_ALLOW_THREADS; /* Single value assignment. */ switch (bpp) { case 1: while (posy < ylen) { posx = 0; x = xstart; while (posx < xlen) { *((Uint8 *) pixels + y * padding + x) = (Uint8) color; x += xstep; posx += absxstep; } y += ystep; posy += absystep; } break; case 2: while (posy < ylen) { posx = 0; x = xstart; while (posx < xlen) { *((Uint16 *) (pixels + y * padding) + x) = (Uint16) color; x += xstep; posx += absxstep; } y += ystep; posy += absystep; } break; case 3: { Uint8 *px; SDL_PixelFormat *format = surface->format; while (posy < ylen) { posx = 0; x = xstart; while (posx < xlen) { px = ((Uint8 *) (pixels + y * padding) + x * 3); #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *(px + (format->Rshift >> 3)) = (Uint8) (color >> 16); *(px + (format->Gshift >> 3)) = (Uint8) (color >> 8); *(px + (format->Bshift >> 3)) = (Uint8) color; #else *(px + 2 - (format->Rshift >> 3)) = (Uint8) (color >> 16); *(px + 2 - (format->Gshift >> 3)) = (Uint8) (color >> 8); *(px + 2 - (format->Bshift >> 3)) = (Uint8) color; #endif x += xstep; posx += absxstep; } y += ystep; posy += absystep; } break; } default: /* 4 bpp */ while (posy < ylen) { posx = 0; x = xstart; while (posx < xlen) { *((Uint32 *) (pixels + y * padding) + x) = color; x += xstep; posx += absxstep; } y += ystep; posy += absystep; } break; } Py_END_ALLOW_THREADS; return 0; } /** * array[x] = ... */ static int _pxarray_ass_item (PyPixelArray *array, Py_ssize_t _index, PyObject *value) { SDL_Surface *surface; Uint32 x = 0; Uint32 y = 0; int bpp; Uint8 *pixels; Uint32 color = 0; Uint32 xstart = 0; Uint32 ystart = 0; Uint32 xlen; Uint32 ylen; Sint32 xstep; Sint32 ystep; Uint32 padding; Uint32 posx = 0; Uint32 posy = 0; Sint32 absxstep; Sint32 absystep; surface = PySurface_AsSurface (array->surface); bpp = surface->format->BytesPerPixel; pixels = (Uint8 *) surface->pixels; if (!_get_color_from_object (value, surface->format, &color)) { if (PyPixelArray_Check (value)) { PyErr_Clear (); /* _get_color_from_object */ return _array_assign_array (array, _index, _index + 1, (PyPixelArray *) value); } else if (PySequence_Check (value)) { PyErr_Clear (); /* _get_color_from_object */ return _array_assign_sequence (array, _index, _index + 1, value); } else /* Error already set by _get_color_from_object(). */ return -1; } /* Set the correct slice indices */ if (array->xlen == 1) { xstart = array->xstart; ystart = array->ystart + _index * array->ystep; xlen = array->xlen; ylen = 1; ystep = array->ystep; xstep = array->xstep; padding = array->padding; } else { xstart = array->xstart + _index * array->xstep; ystart = array->ystart; xlen = 1; ylen = array->ylen; xstep = array->xstep; ystep = array->ystep; padding = array->padding; } /* printf ("ITEM: %d:%d, %d:%d %d:%d %d\n", xstart, ystart, xlen, xstep, ylen, ystep, padding); */ absxstep = ABS (xstep); absystep = ABS (ystep); y = ystart; Py_BEGIN_ALLOW_THREADS; /* Single value assignment. */ switch (bpp) { case 1: while (posy < ylen) { posx = 0; x = xstart; while (posx < xlen) { *((Uint8 *) pixels + y * padding + x) = (Uint8) color; x += xstep; posx += absxstep; } y += ystep; posy += absystep; } break; case 2: while (posy < ylen) { posx = 0; x = xstart; while (posx < xlen) { *((Uint16 *) (pixels + y * padding) + x) = (Uint16) color; x += xstep; posx += absxstep; } y += ystep; posy += absystep; } break; case 3: { Uint8 *px; SDL_PixelFormat *format = surface->format; while (posy < ylen) { posx = 0; x = xstart; while (posx < xlen) { px = ((Uint8 *) (pixels + y * padding) + x * 3); #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *(px + (format->Rshift >> 3)) = (Uint8) (color >> 16); *(px + (format->Gshift >> 3)) = (Uint8) (color >> 8); *(px + (format->Bshift >> 3)) = (Uint8) color; #else *(px + 2 - (format->Rshift >> 3)) = (Uint8) (color >> 16); *(px + 2 - (format->Gshift >> 3)) = (Uint8) (color >> 8); *(px + 2 - (format->Bshift >> 3)) = (Uint8) color; #endif x += xstep; posx += absxstep; } y += ystep; posy += absystep; } break; } default: /* 4 bpp */ while (posy < ylen) { posx = 0; x = xstart; while (posx < xlen) { *((Uint32 *) (pixels + y * padding) + x) = color; x += xstep; posx += absxstep; } y += ystep; posy += absystep; } break; } Py_END_ALLOW_THREADS; return 0; } /** * array[x:y] = .... */ static int _pxarray_ass_slice (PyPixelArray *array, Py_ssize_t low, Py_ssize_t high, PyObject *value) { SDL_Surface *surface; Uint32 color; if (array->xlen != 1) { if (low < 0) low = 0; else if (low > (Sint32) array->xlen) low = array->xlen; if (high < low) high = low; else if (high > (Sint32) array->xlen) high = array->xlen; } else { if (low < 0) low = 0; else if (low > (Sint32) array->ylen) low = array->ylen; if (high < low) high = low; else if (high > (Sint32) array->ylen) high = array->ylen; } surface = PySurface_AsSurface (array->surface); /* printf ("SLICE IS: %d:%d\n", low, high); */ if (PyPixelArray_Check (value)) { return _array_assign_array (array, low, high, (PyPixelArray *) value); } else if (_get_color_from_object (value, surface->format, &color)) { return _array_assign_slice (array, low, high, color); } else if (PySequence_Check (value)) { PyErr_Clear (); /* In case _get_color_from_object set it */ return _array_assign_sequence (array, low, high, value); } return 0; } /** * x in array */ static int _pxarray_contains (PyPixelArray *array, PyObject *value) { SDL_Surface *surface; Uint32 x = 0; Uint32 y = 0; Uint8 *pixels; int bpp; Uint32 color; Uint32 posx = 0; Uint32 posy = 0; Sint32 absxstep; Sint32 absystep; int found = 0; surface = PySurface_AsSurface (array->surface); bpp = surface->format->BytesPerPixel; pixels = (Uint8 *) surface->pixels; if (!_get_color_from_object (value, surface->format, &color)) return -1; absxstep = ABS (array->xstep); absystep = ABS (array->ystep); y = array->ystart; Py_BEGIN_ALLOW_THREADS; switch (bpp) { case 1: while (posy < array->ylen && !found) { posx = 0; x = array->xstart; while (posx < array->xlen) { if (*((Uint8 *) pixels + y * array->padding + x) == (Uint8) color) { found = 1; break; } x += array->xstep; posx += absxstep; } y += array->ystep; posy += absystep; } break; case 2: while (posy < array->ylen && !found) { posx = 0; x = array->xstart; while (posx < array->xlen) { if (*((Uint16 *) (pixels + y * array->padding) + x) == (Uint16) color) { found = 1; break; } x += array->xstep; posx += absxstep; } y += array->ystep; posy += absystep; } break; case 3: { Uint32 pxcolor; Uint8 *pix; while (posy < array->ylen && !found) { posx = 0; x = array->xstart; while (posx < array->xlen) { pix = ((Uint8 *) (pixels + y * array->padding) + x * 3); #if SDL_BYTEORDER == SDL_LIL_ENDIAN pxcolor = (pix[0]) + (pix[1] << 8) + (pix[2] << 16); #else pxcolor = (pix[2]) + (pix[1] << 8) + (pix[0] << 16); #endif if (pxcolor == color) { found = 1; break; } x += array->xstep; posx += absxstep; } y += array->ystep; posy += absystep; } break; } default: /* 4 bpp */ while (posy < array->ylen && !found) { posx = 0; x = array->xstart; while (posx < array->xlen) { if (*((Uint32 *) (pixels + y * array->padding) + x) == color) { found = 1; break; } x += array->xstep; posx += absxstep; } y += array->ystep; posy += absystep; } break; } Py_END_ALLOW_THREADS; return found; } /** * iter (arrray), for x in array */ static PyObject* _pxarray_iter (PyPixelArray *array) { /* printf ("Iter ARRAY: %d:%d:%d %d:%d:%d\n", array->xstart, array->xlen, array->xstep, array->ystart, array->ylen, array->ystep); */ return PySeqIter_New ((PyObject *) array); } /**** Mapping interfaces ****/ /** * Internally used parser function for the 2D slices: * array[x,y], array[:,:], ... */ static int _get_subslice (PyObject *op, Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step) { *start = -1; *stop = -1; *step = -1; if (PySlice_Check (op)) { Py_ssize_t slicelen; /* Operator is a slice: array[x::, */ if (PySlice_GetIndicesEx ((PySliceObject *) op, length, start, stop, step, &slicelen) < 0) { return 0; } } else if (PyInt_Check (op)) { /* Plain index: array[x, */ *start = PyInt_AsLong (op); if (*start < 0) *start += length; if (*start >= length || *start < 0) { PyErr_SetString(PyExc_IndexError, "invalid index"); return 0; } *stop = (*start) + 1; *step = 1; } else if (PyLong_Check (op)) { long long val = -1; /* Plain index: array[x, */ val = PyLong_AsLong (op); if ((val < INT_MIN) || (val > INT_MAX)) { PyErr_SetString(PyExc_ValueError, "index too big for array access"); return 0; } *start = (int) val; if (*start < 0) *start += length; if (*start >= length || *start < 0) { PyErr_SetString(PyExc_IndexError, "invalid index"); return 0; } *stop = (*start) + 1; *step = 1; } return 1; } /** * Slicing support for 1D and 2D access. * array[x,y] is only supported for 2D arrays. */ static PyObject* _pxarray_subscript (PyPixelArray *array, PyObject *op) { SDL_Surface *surface = PySurface_AsSurface (array->surface); /* Note: order matters here. * First check array[x,y], then array[x:y:z], then array[x] * Otherwise it'll fail. */ if (PySequence_Check (op)) { PyObject *obj; Py_ssize_t size = PySequence_Size (op); Py_ssize_t xstart, xstop, xstep; Py_ssize_t ystart, ystop, ystep; Py_ssize_t lenx, leny; if (size == 0) { /* array[,], array[()] ... */ Py_INCREF (array); return (PyObject *) array; } if (size > 2 || (size == 2 && array->xlen == 1)) return RAISE (PyExc_IndexError, "too many indices for the array"); lenx = (array->xlen > 1) ? array->xlen / ABS (array->xstep) : 0; leny = array->ylen / ABS (array->ystep); obj = PySequence_Fast_GET_ITEM (op, 0); if (obj == Py_Ellipsis || obj == Py_None) { /* Operator is the ellipsis or None * array[...,XXX], array[None,XXX] */ xstart = 0; xstop = array->xlen; xstep = array->xstep; } else if (!_get_subslice (obj, lenx, &xstart, &xstop, &xstep)) { /* Error on retrieving the subslice. */ return NULL; } if (size == 2) { obj = PySequence_Fast_GET_ITEM (op, 1); if (obj == Py_Ellipsis || obj == Py_None) { /* Operator is the ellipsis or None * array[XXX,...], array[XXX,None] */ ystart = array->ystart; ystop = array->ylen; ystep = array->ystep; } else if (!_get_subslice (obj, leny, &ystart, &ystop, &ystep)) { /* Error on retrieving the subslice. */ return NULL; } } else { ystart = array->ystart; ystop = array->ylen; ystep = array->ystep; } /* Null value? */ if (xstart == xstop || ystart == ystop) Py_RETURN_NONE; /* printf ("X: %d:%d:%d Y: %d:%d:%d\n", xstart, xstop, xstep, ystart, ystop, ystep); */ /* Single value? */ if (ABS (xstop - xstart) == 1 && ABS (ystop - ystart) == 1) { return _get_single_pixel ((Uint8 *) surface->pixels, surface->format->BytesPerPixel, array->xstart + xstart, ystart * array->padding * array->ystep); } /* printf ("NEW ARRAY: %d:%d:%d %d:%d:%d\n", array->xstart + xstart, ABS (xstop - xstart), xstep, array->ystart + ystart, ABS (ystop - ystart), ystep); */ return (PyObject *) _pxarray_new_internal (&PyPixelArray_Type, array->surface, (Uint32) array->xstart + xstart, (Uint32) array->ystart + ystart, (Uint32) ABS (xstop - xstart), (Uint32) ABS (ystop - ystart), (Sint32) xstep, (Sint32) ystep, (Uint32) array->padding, (PyObject *) array); } else if (PySlice_Check (op)) { /* A slice */ Py_ssize_t slicelen; Py_ssize_t step; Py_ssize_t start; Py_ssize_t stop; int retval; if (array->xlen > 1) { /* 2D array - slice along the x axis */ retval = PySlice_GetIndicesEx ((PySliceObject *) op, (Py_ssize_t) (array->xlen / ABS (array->xstep)), &start, &stop, &step, &slicelen); } else { /* 1D array - use the y axis. */ retval = PySlice_GetIndicesEx ((PySliceObject *) op, (Py_ssize_t) (array->ylen / ABS (array->ystep)), &start, &stop, &step, &slicelen); } if (retval < 0 || slicelen < 0) return NULL; if (slicelen == 0) Py_RETURN_NONE; /* printf ("start: %d, stop: %d, step: %d, len: %d\n", start, stop, step, slicelen); */ return (PyObject *) _array_slice_internal (array, start, stop, step); } else if (PyIndex_Check (op) || PyInt_Check (op) || PyLong_Check (op)) { Py_ssize_t i; #if PY_VERSION_HEX >= 0x02050000 PyObject *val = PyNumber_Index (op); if (!val) return NULL; /* A simple index. */ i = PyNumber_AsSsize_t (val, PyExc_IndexError); #else if (PyInt_Check (op)) i = PyInt_AsLong (op); else i = PyLong_AsLong (op); #endif if (i == -1 && PyErr_Occurred ()) return NULL; if (i < 0) i += (array->xlen > 1) ? array->xlen / ABS (array->xstep) : array->ylen / ABS (array->ystep); return _pxarray_item (array, i); } return RAISE (PyExc_TypeError, "index must be an integer, sequence or slice"); } static int _pxarray_ass_subscript (PyPixelArray *array, PyObject* op, PyObject* value) { /* TODO: by time we can make this faster by avoiding the creation of * temporary subarrays. */ /* Note: order matters here. * First check array[x,y], then array[x:y:z], then array[x] * Otherwise it'll fail. */ if (PySequence_Check (op)) { PyPixelArray *tmparray; PyObject *obj; Py_ssize_t size = PySequence_Size (op); Py_ssize_t xstart, xstop, xstep; Py_ssize_t ystart, ystop, ystep; Py_ssize_t lenx, leny; int retval; if (size == 0) { /* array[,], array[()] ... */ if (array->xlen == 1) return _pxarray_ass_slice (array, 0, (Py_ssize_t) array->ylen, value); else return _pxarray_ass_slice (array, 0, (Py_ssize_t) array->xlen, value); } if (size > 2 || (size == 2 && array->xlen == 1)) { PyErr_SetString (PyExc_IndexError, "too many indices for the array"); return -1; } lenx = (array->xlen > 1) ? array->xlen / ABS (array->xstep) : 0; leny = array->ylen / ABS (array->ystep); obj = PySequence_Fast_GET_ITEM (op, 0); if (obj == Py_Ellipsis || obj == Py_None) { /* Operator is the ellipsis or None * array[...,XXX], array[None,XXX] */ xstart = 0; xstop = array->xlen; xstep = array->xstep; } else if (!_get_subslice (obj, lenx, &xstart, &xstop, &xstep)) { /* Error on retrieving the subslice. */ return -1; } if (size == 2) { obj = PySequence_Fast_GET_ITEM (op, 1); if (obj == Py_Ellipsis || obj == Py_None) { /* Operator is the ellipsis or None * array[XXX,...], array[XXX,None] */ ystart = array->ystart; ystop = array->ylen; ystep = array->ystep; } else if (!_get_subslice (obj, leny, &ystart, &ystop, &ystep)) { /* Error on retrieving the subslice. */ return -1; } } else { ystart = array->ystart; ystop = array->ylen; ystep = array->ystep; } /* Null value? Do nothing then. */ if (xstart == xstop || ystart == ystop) return 0; /* Single value? */ if (ABS (xstop - xstart) == 1 && ABS (ystop - ystart) == 1) { tmparray = _pxarray_new_internal (&PyPixelArray_Type, array->surface, (Uint32) array->xstart + xstart, (Uint32) array->ystart + ystart, 1, 1, 1, 1, (Uint32) array->padding, (PyObject *) array); if (!tmparray) return -1; retval = _pxarray_ass_item (tmparray, 0, value); Py_DECREF (tmparray); return retval; } tmparray =_pxarray_new_internal (&PyPixelArray_Type, array->surface, (Uint32) array->xstart + xstart, (Uint32) array->ystart + ystart, (Uint32) ABS (xstop - xstart), (Uint32) ABS (ystop - ystart), (Sint32) xstep, (Sint32) ystep, (Uint32) array->padding, (PyObject *) array); if (!tmparray) return -1; if (tmparray->xlen == 1) retval = _pxarray_ass_slice (tmparray, 0, (Py_ssize_t) tmparray->ylen, value); else retval = _pxarray_ass_slice (tmparray, 0, (Py_ssize_t) tmparray->xlen, value); Py_DECREF (tmparray); return retval; } else if (PySlice_Check (op)) { /* A slice */ PyPixelArray *tmparray; Py_ssize_t slicelen; Py_ssize_t step; Py_ssize_t start; Py_ssize_t stop; int retval; if (array->xlen > 1) { /* 2D array - slice along the x axis */ retval = PySlice_GetIndicesEx ((PySliceObject *) op, (Py_ssize_t) (array->xlen / ABS (array->xstep)), &start, &stop, &step, &slicelen); } else { /* 1D array - use the y axis. */ retval = PySlice_GetIndicesEx ((PySliceObject *) op, (Py_ssize_t) (array->ylen / ABS (array->ystep)), &start, &stop, &step, &slicelen); } if (retval < 0 || slicelen < 0) return -1; if (slicelen == 0) return 0; /* printf ("start: %d, stop: %d, step: %d, len: %d\n", start, stop, step, slicelen); */ tmparray = (PyPixelArray *) _array_slice_internal (array, start, stop, step); if (!tmparray) return -1; if (tmparray->xlen == 1) retval = _pxarray_ass_slice (tmparray, 0, (Py_ssize_t) tmparray->ylen, value); else retval = _pxarray_ass_slice (tmparray, 0, (Py_ssize_t) tmparray->xlen, value); Py_DECREF (tmparray); return retval; } else if (PyIndex_Check (op) || PyInt_Check (op) || PyLong_Check (op)) { Py_ssize_t i; #if PY_VERSION_HEX >= 0x02050000 PyObject *val = PyNumber_Index (op); if (!val) return -1; /* A simple index. */ i = PyNumber_AsSsize_t (val, PyExc_IndexError); #else if (PyInt_Check (op)) i = PyInt_AsLong (op); else i = PyLong_AsLong (op); #endif if (i == -1 && PyErr_Occurred ()) return -1; if (i < 0) i += (array->xlen > 1) ? array->xlen / ABS (array->xstep) : array->ylen / ABS (array->ystep); return _pxarray_ass_item (array, i, value); } PyErr_SetString (PyExc_TypeError, "index must be an integer, sequence or slice"); return -1; } /**** C API interfaces ****/ static PyObject* PyPixelArray_New (PyObject *surfobj) { SDL_Surface *surface; if (!PySurface_Check (surfobj)) return RAISE (PyExc_TypeError, "argument is no a Surface"); surface = PySurface_AsSurface (surfobj); if (surface->format->BytesPerPixel < 1 || surface->format->BytesPerPixel > 4) return RAISE (PyExc_ValueError, "unsupported bit depth for reference array"); return (PyObject *) _pxarray_new_internal (&PyPixelArray_Type, surfobj, 0, 0, (Uint32) surface->w, (Uint32) surface->h, 1, 1, (Uint32) surface->pitch, NULL); } MODINIT_DEFINE (pixelarray) { PyObject *module; PyObject *dict; PyObject *apiobj; int ecode; static void* c_api[PYGAMEAPI_PIXELARRAY_NUMSLOTS]; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "pixelarray", NULL, -1, NULL, NULL, NULL, NULL, NULL }; #endif /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_color(); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_surface (); if (PyErr_Occurred ()) { MODINIT_ERROR; } /* type preparation */ if (PyType_Ready (&PyPixelArray_Type) < 0) { MODINIT_ERROR; } /* create the module */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "pixelarray", NULL, NULL); #endif if (module == NULL) { MODINIT_ERROR; } Py_INCREF (&PyPixelArray_Type); if (PyModule_AddObject (module, "PixelArray", (PyObject *) &PyPixelArray_Type) == -1) { Py_DECREF ((PyObject *) &PyPixelArray_Type); DECREF_MOD (module); MODINIT_ERROR; } PyPixelArray_Type.tp_getattro = PyObject_GenericGetAttr; dict = PyModule_GetDict (module); c_api[0] = &PyPixelArray_Type; c_api[1] = PyPixelArray_New; apiobj = PyCObject_FromVoidPtr (c_api, NULL); if (apiobj == NULL) { DECREF_MOD (module); MODINIT_ERROR; } ecode = PyDict_SetItemString (dict, PYGAMEAPI_LOCAL_ENTRY, apiobj); Py_DECREF (apiobj); if (ecode == -1) { DECREF_MOD (module); MODINIT_ERROR; } MODINIT_RETURN (module); } pygame-1.9.1release/src/pgopengl.h0000644000175000017500000000061311024515251017012 0ustar vincentvincent#if !defined(PGOPENGL_H) #define PGOPENGL_H /** This header includes definitions of Opengl functions as pointer types for ** use with the SDL function SDL_GL_GetProcAddress. **/ #if defined(_WIN32) #define GL_APIENTRY __stdcall #else #define GL_APIENTRY #endif typedef void (GL_APIENTRY *GL_glReadPixels_Func)(int, int, int, int, unsigned int, unsigned int, void*); #endif pygame-1.9.1release/src/pgcompat.h0000644000175000017500000000750411176715722017034 0ustar vincentvincent/* Python 2.x/3.x compitibility tools */ #if !defined(PGCOMPAT_H) #define PGCOMPAT_H #if PY_MAJOR_VERSION >= 3 #define PY3 1 /* Define some aliases for the removed PyInt_* functions */ #define PyInt_Check(op) PyLong_Check(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_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #define PyInt_AS_LONG PyLong_AS_LONG #define PyNumber_Int PyNumber_Long /* Weakrefs flags changed in 3.x */ #define Py_TPFLAGS_HAVE_WEAKREFS 0 /* Module init function returns new module instance. */ #define MODINIT_RETURN(x) return x #define MODINIT_DEFINE(mod_name) PyMODINIT_FUNC PyInit_##mod_name (void) #define DECREF_MOD(mod) Py_DECREF (mod) /* Type header differs. */ #define TYPE_HEAD(x,y) PyVarObject_HEAD_INIT(x,y) /* Text interface. Use unicode strings. */ #define Text_Type PyUnicode_Type #define Text_Check PyUnicode_Check #define Text_FromUTF8 PyUnicode_FromString #define Text_FromUTF8AndSize PyUnicode_FromStringAndSize #define Text_FromFormat PyUnicode_FromFormat #define Text_GetSize PyUnicode_GetSize #define Text_GET_SIZE PyUnicode_GET_SIZE /* Binary interface. Use bytes. */ #define Bytes_Type PyBytes_Type #define Bytes_Check PyBytes_Check #define Bytes_Size PyBytes_Size #define Bytes_AsString PyBytes_AsString #define Bytes_AsStringAndSize PyBytes_AsStringAndSize #define Bytes_FromStringAndSize PyBytes_FromStringAndSize #define Bytes_AS_STRING PyBytes_AS_STRING #define Bytes_GET_SIZE PyBytes_GET_SIZE #define IsTextObj(x) (PyUnicode_Check(x) || PyBytes_Check(x)) /* Renamed builtins */ #define BUILTINS_MODULE "builtins" #define BUILTINS_UNICODE "str" #define BUILTINS_UNICHR "chr" #else /* PY_VERSION_HEX >= 0x03000000 */ #define PY3 0 /* Module init function returns nothing. */ #define MODINIT_RETURN(x) return #define MODINIT_DEFINE(mod_name) PyMODINIT_FUNC init##mod_name (void) #define DECREF_MOD(mod) /* Type header differs. */ #define TYPE_HEAD(x,y) \ PyObject_HEAD_INIT(x) \ 0, /* Text interface. Use ascii strings. */ #define Text_Type PyString_Type #define Text_Check PyString_Check #define Text_FromUTF8 PyString_FromString #define Text_FromUTF8AndSize PyString_FromStringAndSize #define Text_FromFormat PyString_FromFormat #define Text_GetSize PyString_GetSize #define Text_GET_SIZE PyString_GET_SIZE /* Binary interface. Use ascii strings. */ #define Bytes_Type PyString_Type #define Bytes_Check PyString_Check #define Bytes_Size PyString_Size #define Bytes_AsString PyString_AsString #define Bytes_AsStringAndSize PyString_AsStringAndSize #define Bytes_FromStringAndSize PyString_FromStringAndSize #define Bytes_AS_STRING PyString_AS_STRING #define Bytes_GET_SIZE PyString_GET_SIZE /* Renamed builtins */ #define BUILTINS_MODULE "__builtin__" #define BUILTINS_UNICODE "unicode" #define BUILTINS_UNICHR "unichr" #endif /* PY_VERSION_HEX >= 0x03000000 */ #define MODINIT_ERROR MODINIT_RETURN (NULL) /* Module state. These macros are used to define per-module macros. * v - global state variable (Python 2.x) * s - global state structure (Python 3.x) */ #define PY2_GETSTATE(v) (&(v)) #define PY3_GETSTATE(s, m) ((struct s *) PyModule_GetState (m)) /* Pep 3123: Making PyObject_HEAD conform to standard C */ #if !defined(Py_TYPE) #define Py_TYPE(o) (((PyObject*)(o))->ob_type) #define Py_REFCNT(o) (((PyObject*)(o))->ob_refcnt) #define Py_SIZE(o) (((PyVarObject*)(o))->ob_size) #endif #endif /* !defined(PGCOMPAT_H) */ pygame-1.9.1release/src/pgarrinter.h0000644000175000017500000000161411136035450017360 0ustar vincentvincent/* array structure interface version 3 declarations */ const int PAI_CONTIGUOUS = 0x01; const int PAI_FORTRAN = 0x02; const int PAI_ALIGNED = 0x100; const int PAI_NOTSWAPPED = 0x200; const int PAI_WRITEABLE = 0x400; typedef struct { int two; /* contains the integer 2 -- simple sanity check */ int nd; /* number of dimensions */ char typekind; /* kind in array -- character code of typestr */ int itemsize; /* size of each element */ int flags; /* flags indicating how the data should be */ /* interpreted */ Py_intptr_t *shape; /* A length-nd array of shape information */ Py_intptr_t *strides; /* A length-nd array of stride information */ void *data; /* A pointer to the first element of the array */ PyObject *descr; /* NULL or a data-description */ } PyArrayInterface; pygame-1.9.1release/src/overlay.doc0000644000175000017500000000400410351473250017200 0ustar vincentvincentpygame.Overlay pygame object for video overlay graphics pygame.Overlay(format, (width, height)): return Overlay The Overlay objects provide support for accessing hardware video overlays. Video overlays do not use standard RGB pixel formats, and can use multiple resolutions of data to create a single image. The Overlay objects represent lower level access to the display hardware. To use the object you must understand the technical details of video overlays. The Overlay format determines the type of pixel data used. Not all hardware will support all types of overlay formats. Here is a list of available format types: YV12_OVERLAY, IYUV_OVERLAY, YUV2_OVERLAY, UYVY_OVERLAY, YVYU_OVERLAY The width and height arguments control the size for the overlay image data. The overlay image can be displayed at any size, not just the resolution of the overlay. The overlay objects are always visible, and always show above the regular display contents.
    display set the overlay pixel data Overlay.display((y, u, v)): return None Overlay.display(): return None Display the yuv data in SDL's overlay planes. The y, u, and v arguments are strings of binary data. The data must be in the correct format used to create the Overlay. If no argument is passed in, the Overlay will simply be redrawn with the current data. This can be useful when the Overlay is not really hardware accelerated. The strings are not validated, and improperly sized strings could crash the program. set_location control where the overlay is displayed Overlay.set_location(rect): return None Set the location for the overlay. The overlay will always be shown relative to the main display Surface. This does not actually redraw the overlay, it will be updated on the next call to Overlay.display(). get_hardware test if the Overlay is hardware accelerated Overlay.get_hardware(rect): return int Returns a True value when the Overlay is hardware accelerated. If the platform does not support acceleration, software rendering is used. pygame-1.9.1release/src/overlay.c0000644000175000017500000001725211207055754016674 0ustar vincentvincent/* * A part of the pydfb module. Provides interface for basic overlay * manipulation functions. * In this implementation overlay can use only one layer out of maximum * possible. After getting overlay, no overlay can be created. * * Copyright (C) 2002-2003 Dmitry Borisov * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Dmitry Borisov */ #include #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" typedef struct { PyObject_HEAD SDL_Overlay *cOverlay; GAME_Rect cRect; } PyGameOverlay; static void overlay_dealloc (PyGameOverlay *self) { if (SDL_WasInit (SDL_INIT_VIDEO) && self->cOverlay) SDL_FreeYUVOverlay (self->cOverlay); PyObject_Free ((PyObject*)self); } static PyObject* Overlay_SetLocation (PyGameOverlay *self, PyObject *args) { GAME_Rect *rect, temp; rect = GameRect_FromObject (args, &temp); if (!rect) return RAISE (PyExc_TypeError, "Invalid rectstyle argument"); self->cRect.x = rect->x; self->cRect.y = rect->y; self->cRect.w = rect->w; self->cRect.h = rect->h; Py_RETURN_NONE; } static PyObject* Overlay_Display (PyGameOverlay *self, PyObject *args) { SDL_Rect cRect; // Parse data params for frame int ls_y, ls_u, ls_v, y; unsigned char *src_y=0, *src_u=0, *src_v=0; if (PyTuple_Size (args)) { if (!PyArg_ParseTuple (args, "(s#s#s#)", &src_y, &ls_y, &src_u, &ls_u, &src_v, &ls_v)) return NULL; } if (src_y) { Uint8 *dst_y=0, *dst_u=0, *dst_v=0; SDL_LockYUVOverlay (self->cOverlay); // No clipping at this time( only support for YUV420 ) dst_y = self->cOverlay->pixels[0]; dst_v = self->cOverlay->pixels[1]; dst_u = self->cOverlay->pixels[2]; for (y = 0; y < self->cOverlay->h; y++) { memcpy (dst_y, src_y, self->cOverlay->w); src_y += ls_y / self->cOverlay->h; dst_y += self->cOverlay->pitches[0]; if (!(y & 1)) { src_u += (ls_u * 2)/self->cOverlay->h; src_v += (ls_v * 2)/self->cOverlay->h; dst_u += self->cOverlay->pitches[ 1 ]; dst_v += self->cOverlay->pitches[ 2 ]; } else { memcpy (dst_u, src_u, (ls_u * 2) / self->cOverlay->h); memcpy (dst_v, src_v, (ls_v * 2) / self->cOverlay->h); } } SDL_UnlockYUVOverlay (self->cOverlay); } cRect.x = self->cRect.x; cRect.y = self->cRect.y; cRect.w = self->cRect.w; cRect.h = self->cRect.h; SDL_DisplayYUVOverlay (self->cOverlay, &cRect); Py_RETURN_NONE; } static PyObject* Overlay_GetHardware (PyGameOverlay *self) { return PyInt_FromLong (self->cOverlay->hw_overlay); } PyObject* Overlay_New (PyTypeObject *type, PyObject *args, PyObject *kwds) { int pixelformat; PyGameOverlay *self; int w, h; SDL_Surface *screen; if (!PyArg_ParseTuple (args, "i(ii)", &pixelformat, &w, &h)) return NULL; if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot create overlay without pygame.display initialized"); screen = SDL_GetVideoSurface (); if (!screen) return RAISE (PyExc_SDLError, "Display mode not set"); // Create new Overlay object self= (PyGameOverlay *)type->tp_alloc (type, 0); if (!self) return NULL; // Create layer with desired format self->cOverlay = SDL_CreateYUVOverlay (w, h, pixelformat, screen); if (!self->cOverlay) return RAISE (PyExc_SDLError, "Cannot create overlay"); self->cRect.x= 0; self->cRect.y= 0; self->cRect.w= w; self->cRect.h= h; return (PyObject*)self; } static PyMethodDef Overlay_methods[] = { { "set_location", (PyCFunction) Overlay_SetLocation, METH_VARARGS, DOC_OVERLAYSETLOCATION }, { "display", (PyCFunction) Overlay_Display, METH_VARARGS, DOC_OVERLAYDISPLAY }, { "get_hardware", (PyCFunction) Overlay_GetHardware, METH_NOARGS, DOC_OVERLAYGETHARDWARE }, {NULL, NULL, 0, NULL} /* Sentinel */ }; PyTypeObject PyOverlay_Type = { TYPE_HEAD (NULL, 0) "pygame.overlay", /*tp_name*/ sizeof(PyGameOverlay), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor) overlay_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ DOC_PYGAMEOVERLAY, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ Overlay_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ Overlay_New, /* tp_new */ }; static PyMethodDef _overlay_methods[] = { { NULL, NULL, 0, NULL } }; MODINIT_DEFINE (overlay) { PyObject *module; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "overlay", NULL, -1, _overlay_methods, NULL, NULL, NULL, NULL }; #endif /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_rect (); if (PyErr_Occurred ()) { MODINIT_ERROR; } if (PyType_Ready (&PyOverlay_Type) == -1) { MODINIT_ERROR; } /* create the module */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule (MODPREFIX "overlay", _overlay_methods ); #endif if (module == NULL) { MODINIT_ERROR; } /* create the module reference */ Py_INCREF ((PyObject *)&PyOverlay_Type); if (PyModule_AddObject (module, "Overlay", (PyObject *)&PyOverlay_Type) == -1) { Py_DECREF ((PyObject *)&PyOverlay_Type); DECREF_MOD (module); MODINIT_ERROR; } MODINIT_RETURN (module); } pygame-1.9.1release/src/numeric_arrayobject.h0000644000175000017500000004152310737363157021253 0ustar vincentvincent/* * Imported Numeric-24.2 numeric/arrayobject.h header file to make the * Numeric dependency obsolete. */ /* * Legal Notice * * *** Legal Notice for all LLNL-contributed files *** * * Copyright (c) 1996. The Regents of the University of California. All * rights reserved. * * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire * notice is included in all copies of any software which is or includes * a copy or modification of this software and in all copies of the * supporting documentation for such software. * * This work was produced at the University of California, Lawrence * Livermore National Laboratory under contract no. W-7405-ENG-48 * between the U.S. Department of Energy and The Regents of the * University of California for the operation of UC LLNL. * * DISCLAIMER * * This software was prepared as an account of work sponsored by an * agency of the United States Government. Neither the United States * Government nor the University of California nor any of their * employees, makes any warranty, express or implied, or assumes any * liability or responsibility for the accuracy, completeness, or * usefulness of any information, apparatus, product, or process * disclosed, or represents that its use would not infringe * privately-owned rights. Reference herein to any specific commercial * products, process, or service by trade name, trademark, manufacturer, * or otherwise, does not necessarily constitute or imply its * endorsement, recommendation, or favoring by the United States * Government or the University of California. The views and opinions of * authors expressed herein do not necessarily state or reflect those of * the United States Government or the University of California, and * shall not be used for advertising or product endorsement purposes. */ #ifndef Py_ARRAYOBJECT_H #define Py_ARRAYOBJECT_H #ifdef __cplusplus extern "C" { #endif #define REFCOUNT(obj) (((PyObject *)(obj))->ob_refcnt) #define MAX_ELSIZE 16 #define PyArray_UNSIGNED_TYPES enum PyArray_TYPES { PyArray_CHAR, PyArray_UBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_USHORT, PyArray_INT, PyArray_UINT, PyArray_LONG, PyArray_FLOAT, PyArray_DOUBLE, PyArray_CFLOAT, PyArray_CDOUBLE, PyArray_OBJECT, PyArray_NTYPES, PyArray_NOTYPE}; typedef void (PyArray_VectorUnaryFunc) (char *, int, char *, int, int); typedef PyObject * (PyArray_GetItemFunc) (char *); typedef int (PyArray_SetItemFunc) (PyObject *, char *); typedef struct { PyArray_VectorUnaryFunc *cast[PyArray_NTYPES]; /* Functions to cast to */ /* all other types */ PyArray_GetItemFunc *getitem; PyArray_SetItemFunc *setitem; int type_num, elsize; char *one, *zero; char type; } PyArray_Descr; /* Array flags */ #define CONTIGUOUS 1 #define OWN_DIMENSIONS 2 #define OWN_STRIDES 4 #define OWN_DATA 8 #define SAVESPACE 16 /* type bit */ #define SAVESPACEBIT 128 typedef struct { PyObject_HEAD char *data; int nd; int *dimensions, *strides; PyObject *base; PyArray_Descr *descr; int flags; PyObject *weakreflist; } PyArrayObject; /* Array Interface flags */ #define FORTRAN 0x002 #define ALIGNED 0x100 #define NOTSWAPPED 0x200 #define WRITEABLE 0x400 typedef struct { int version; int nd; char typekind; int itemsize; int flags; Py_intptr_t *shape; Py_intptr_t *strides; void *data; } PyArrayInterface; /* * C API */ /* Type definitions */ #define PyArray_Type_NUM 0 /* Function definitions */ /* The following are not intended for use in user code, only needed by umath. */ /* If you write your own match library, you might want this function. */ #define PyArray_SetNumericOps_RET int #define PyArray_SetNumericOps_PROTO (PyObject *) #define PyArray_SetNumericOps_NUM 1 #define PyArray_INCREF_RET int #define PyArray_INCREF_PROTO (PyArrayObject *ap) #define PyArray_INCREF_NUM 2 #define PyArray_XDECREF_RET int #define PyArray_XDECREF_PROTO (PyArrayObject *ap) #define PyArray_XDECREF_NUM 3 /* Export the array error object. Is this a good idea? */ #define PyArrayError_RET PyObject * #define PyArrayError_PROTO (void) #define PyArrayError_NUM 4 /* Set the array print function to be a python function */ #define PyArray_SetStringFunction_RET void #define PyArray_SetStringFunction_PROTO (PyObject *op, int repr) #define PyArray_SetStringFunction_NUM 5 /* Get the PyArray_Descr structure for a typecode */ #define PyArray_DescrFromType_RET PyArray_Descr * #define PyArray_DescrFromType_PROTO (int) #define PyArray_DescrFromType_NUM 6 /* Cast an array to a different type */ #define PyArray_Cast_RET PyObject * #define PyArray_Cast_PROTO (PyArrayObject *, int) #define PyArray_Cast_NUM 7 /* Check the type coercion rules */ #define PyArray_CanCastSafely_RET int #define PyArray_CanCastSafely_PROTO (int fromtype, int totype) #define PyArray_CanCastSafely_NUM 8 /* Return the typecode to use for an object if it was an array */ #define PyArray_ObjectType_RET int #define PyArray_ObjectType_PROTO (PyObject *, int) #define PyArray_ObjectType_NUM 9 #define _PyArray_multiply_list_RET int #define _PyArray_multiply_list_PROTO (int *lp, int n) #define _PyArray_multiply_list_NUM 10 /* The following defines the C API for the array object for most users */ #define PyArray_SIZE(mp) (_PyArray_multiply_list((mp)->dimensions, (mp)->nd)) #define PyArray_NBYTES(mp) ((mp)->descr->elsize * PyArray_SIZE(mp)) /* Obviously this needs some work. */ #define PyArray_ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS) #define PyArray_ISSPACESAVER(m) (((PyArrayObject *)m)->flags & SAVESPACE) #define PyScalarArray_Check(m) (PyArray_Check((m)) && (((PyArrayObject *)(m))->nd == 0)) /* Return the size in number of items of an array */ #define PyArray_Size_RET int #define PyArray_Size_PROTO (PyObject *) #define PyArray_Size_NUM 11 /* Array creation functions */ /* new_array = PyArray_FromDims(n_dimensions, dimensions[n_dimensions], item_type); */ #define PyArray_FromDims_RET PyObject * #define PyArray_FromDims_PROTO (int, int *, int) #define PyArray_FromDims_NUM 12 /* array_from_existing_data = PyArray_FromDimsAndData(n_dims, dims[n_dims], item_type, old_data); */ /* WARNING: using PyArray_FromDimsAndData is not reccommended! It should only be used to refer to */ /* global arrays that will never be freed (like FORTRAN common blocks). */ #define PyArray_FromDimsAndData_RET PyObject * #define PyArray_FromDimsAndData_PROTO (int, int *, int, char *) #define PyArray_FromDimsAndData_NUM 13 /* Initialize from a python object. */ /* PyArray_ContiguousFromObject(object, typecode, min_dimensions, max_dimensions) */ /* if max_dimensions = 0, then any number of dimensions are allowed. */ /* If you want an exact number of dimensions, you should use max_dimensions */ /* = min_dimensions. */ #define PyArray_ContiguousFromObject_RET PyObject * #define PyArray_ContiguousFromObject_PROTO (PyObject *, int, int, int) #define PyArray_ContiguousFromObject_NUM 14 /* Same as contiguous, except guarantees a copy of the original data */ #define PyArray_CopyFromObject_RET PyObject * #define PyArray_CopyFromObject_PROTO (PyObject *, int, int, int) #define PyArray_CopyFromObject_NUM 15 /* Shouldn't be used unless you know what you're doing and are not scared by discontiguous arrays */ #define PyArray_FromObject_RET PyObject * #define PyArray_FromObject_PROTO (PyObject *, int, int, int) #define PyArray_FromObject_NUM 16 /* Return either an array, or if passed a 0d array return the appropriate python scalar */ #define PyArray_Return_RET PyObject * #define PyArray_Return_PROTO (PyArrayObject *) #define PyArray_Return_NUM 17 #define PyArray_Reshape_RET PyObject * #define PyArray_Reshape_PROTO (PyArrayObject *ap, PyObject *shape) #define PyArray_Reshape_NUM 18 #define PyArray_Copy_RET PyObject * #define PyArray_Copy_PROTO (PyArrayObject *ap) #define PyArray_Copy_NUM 19 #define PyArray_Take_RET PyObject * #define PyArray_Take_PROTO (PyObject *ap, PyObject *items, int axis) #define PyArray_Take_NUM 20 /*Getting arrays in various useful forms. */ #define PyArray_As1D_RET int #define PyArray_As1D_PROTO (PyObject **op, char **ptr, int *d1, int typecode) #define PyArray_As1D_NUM 21 #define PyArray_As2D_RET int #define PyArray_As2D_PROTO (PyObject **op, char ***ptr, int *d1, int *d2, int typecode) #define PyArray_As2D_NUM 22 #define PyArray_Free_RET int #define PyArray_Free_PROTO (PyObject *op, char *ptr) #define PyArray_Free_NUM 23 /* array_from_existing_data = PyArray_FromDimsAndDataAndDescr(n_dims, dims[n_dims], descr, old_data); */ /* WARNING: using PyArray_FromDimsAndDataAndDescr is not reccommended! It should only be used to refer to */ /* global arrays that will never be freed (like FORTRAN common blocks). */ #define PyArray_FromDimsAndDataAndDescr_RET PyObject * #define PyArray_FromDimsAndDataAndDescr_PROTO (int, int *, PyArray_Descr *, char *) #define PyArray_FromDimsAndDataAndDescr_NUM 24 #define PyArray_Converter_RET int #define PyArray_Converter_PROTO (PyObject *, PyObject **) #define PyArray_Converter_NUM 25 #define PyArray_Put_RET PyObject * #define PyArray_Put_PROTO (PyObject *ap, PyObject *items, PyObject* values) #define PyArray_Put_NUM 26 #define PyArray_PutMask_RET PyObject * #define PyArray_PutMask_PROTO (PyObject *ap, PyObject *mask, PyObject* values) #define PyArray_PutMask_NUM 27 #define PyArray_CopyArray_RET int #define PyArray_CopyArray_PROTO (PyArrayObject *dest, PyArrayObject *src) #define PyArray_CopyArray_NUM 28 #define PyArray_ValidType_RET int #define PyArray_ValidType_PROTO (int type) #define PyArray_ValidType_NUM 29 /* Convert a Python object to a C int, if possible. Checks for potential overflow, which is important on machines where sizeof(int) != sizeof(long) (note that a Python int is a C long). Handles Python ints, Python longs, and any ArrayObject that works in int(). */ #define PyArray_IntegerAsInt_RET int #define PyArray_IntegerAsInt_PROTO (PyObject *o) #define PyArray_IntegerAsInt_NUM 30 /* Total number of C API pointers */ #define PyArray_API_pointers 31 #ifdef _ARRAY_MODULE extern PyTypeObject PyArray_Type; #define PyArray_Check(op) ((op)->ob_type == &PyArray_Type) extern PyArray_SetNumericOps_RET PyArray_SetNumericOps \ PyArray_SetNumericOps_PROTO; extern PyArray_INCREF_RET PyArray_INCREF PyArray_INCREF_PROTO; extern PyArray_XDECREF_RET PyArray_XDECREF PyArray_XDECREF_PROTO; extern PyArrayError_RET PyArrayError PyArrayError_PROTO; extern PyArray_SetStringFunction_RET PyArray_SetStringFunction \ PyArray_SetStringFunction_PROTO; extern PyArray_DescrFromType_RET PyArray_DescrFromType \ PyArray_DescrFromType_PROTO; extern PyArray_Cast_RET PyArray_Cast PyArray_Cast_PROTO; extern PyArray_CanCastSafely_RET PyArray_CanCastSafely \ PyArray_CanCastSafely_PROTO; extern PyArray_ObjectType_RET PyArray_ObjectType PyArray_ObjectType_PROTO; extern _PyArray_multiply_list_RET _PyArray_multiply_list \ _PyArray_multiply_list_PROTO; extern PyArray_Size_RET PyArray_Size PyArray_Size_PROTO; extern PyArray_FromDims_RET PyArray_FromDims PyArray_FromDims_PROTO; extern PyArray_FromDimsAndData_RET PyArray_FromDimsAndData \ PyArray_FromDimsAndData_PROTO; extern PyArray_FromDimsAndDataAndDescr_RET PyArray_FromDimsAndDataAndDescr \ PyArray_FromDimsAndDataAndDescr_PROTO; extern PyArray_ContiguousFromObject_RET PyArray_ContiguousFromObject \ PyArray_ContiguousFromObject_PROTO; extern PyArray_CopyFromObject_RET PyArray_CopyFromObject \ PyArray_CopyFromObject_PROTO; extern PyArray_FromObject_RET PyArray_FromObject PyArray_FromObject_PROTO; extern PyArray_Return_RET PyArray_Return PyArray_Return_PROTO; extern PyArray_Reshape_RET PyArray_Reshape PyArray_Reshape_PROTO; extern PyArray_Copy_RET PyArray_Copy PyArray_Copy_PROTO; extern PyArray_Take_RET PyArray_Take PyArray_Take_PROTO; extern PyArray_As1D_RET PyArray_As1D PyArray_As1D_PROTO; extern PyArray_As2D_RET PyArray_As2D PyArray_As2D_PROTO; extern PyArray_Free_RET PyArray_Free PyArray_Free_PROTO; extern PyArray_Converter_RET PyArray_Converter PyArray_Converter_PROTO; extern PyArray_Put_RET PyArray_Put PyArray_Put_PROTO; extern PyArray_PutMask_RET PyArray_PutMask PyArray_PutMask_PROTO; extern PyArray_CopyArray_RET PyArray_CopyArray PyArray_CopyArray_PROTO; extern PyArray_ValidType_RET PyArray_ValidType PyArray_ValidType_PROTO; extern PyArray_IntegerAsInt_RET PyArray_IntegerAsInt PyArray_IntegerAsInt_PROTO; #else #if defined(PY_ARRAY_UNIQUE_SYMBOL) #define PyArray_API PY_ARRAY_UNIQUE_SYMBOL #endif /* C API address pointer */ #if defined(NO_IMPORT) || defined(NO_IMPORT_ARRAY) extern void **PyArray_API; #else #if defined(PY_ARRAY_UNIQUE_SYMBOL) void **PyArray_API; #else static void **PyArray_API; #endif #endif #define PyArray_Check(op) \ ((op)->ob_type == (PyTypeObject *)PyArray_API[PyArray_Type_NUM]) #define PyArray_Type *(PyTypeObject *)PyArray_API[PyArray_Type_NUM] #define PyArray_SetNumericOps \ (*(PyArray_SetNumericOps_RET (*)PyArray_SetNumericOps_PROTO) \ PyArray_API[PyArray_SetNumericOps_NUM]) #define PyArray_INCREF \ (*(PyArray_INCREF_RET (*)PyArray_INCREF_PROTO) \ PyArray_API[PyArray_INCREF_NUM]) #define PyArray_XDECREF \ (*(PyArray_XDECREF_RET (*)PyArray_XDECREF_PROTO) \ PyArray_API[PyArray_XDECREF_NUM]) #define PyArrayError \ (*(PyArrayError_RET (*)PyArrayError_PROTO) \ PyArray_API[PyArrayError_NUM]) #define PyArray_SetStringFunction \ (*(PyArray_SetStringFunction_RET (*)PyArray_SetStringFunction_PROTO) \ PyArray_API[PyArray_SetStringFunction_NUM]) #define PyArray_DescrFromType \ (*(PyArray_DescrFromType_RET (*)PyArray_DescrFromType_PROTO) \ PyArray_API[PyArray_DescrFromType_NUM]) #define PyArray_Cast \ (*(PyArray_Cast_RET (*)PyArray_Cast_PROTO) \ PyArray_API[PyArray_Cast_NUM]) #define PyArray_CanCastSafely \ (*(PyArray_CanCastSafely_RET (*)PyArray_CanCastSafely_PROTO) \ PyArray_API[PyArray_CanCastSafely_NUM]) #define PyArray_ObjectType \ (*(PyArray_ObjectType_RET (*)PyArray_ObjectType_PROTO) \ PyArray_API[PyArray_ObjectType_NUM]) #define _PyArray_multiply_list \ (*(_PyArray_multiply_list_RET (*)_PyArray_multiply_list_PROTO) \ PyArray_API[_PyArray_multiply_list_NUM]) #define PyArray_Size \ (*(PyArray_Size_RET (*)PyArray_Size_PROTO) \ PyArray_API[PyArray_Size_NUM]) #define PyArray_FromDims \ (*(PyArray_FromDims_RET (*)PyArray_FromDims_PROTO) \ PyArray_API[PyArray_FromDims_NUM]) #define PyArray_FromDimsAndData \ (*(PyArray_FromDimsAndData_RET (*)PyArray_FromDimsAndData_PROTO) \ PyArray_API[PyArray_FromDimsAndData_NUM]) #define PyArray_FromDimsAndDataAndDescr \ (*(PyArray_FromDimsAndDataAndDescr_RET (*)PyArray_FromDimsAndDataAndDescr_PROTO) \ PyArray_API[PyArray_FromDimsAndDataAndDescr_NUM]) #define PyArray_ContiguousFromObject \ (*(PyArray_ContiguousFromObject_RET (*)PyArray_ContiguousFromObject_PROTO) \ PyArray_API[PyArray_ContiguousFromObject_NUM]) #define PyArray_CopyFromObject \ (*(PyArray_CopyFromObject_RET (*)PyArray_CopyFromObject_PROTO) \ PyArray_API[PyArray_CopyFromObject_NUM]) #define PyArray_FromObject \ (*(PyArray_FromObject_RET (*)PyArray_FromObject_PROTO) \ PyArray_API[PyArray_FromObject_NUM]) #define PyArray_Return \ (*(PyArray_Return_RET (*)PyArray_Return_PROTO) \ PyArray_API[PyArray_Return_NUM]) #define PyArray_Reshape \ (*(PyArray_Reshape_RET (*)PyArray_Reshape_PROTO) \ PyArray_API[PyArray_Reshape_NUM]) #define PyArray_Copy \ (*(PyArray_Copy_RET (*)PyArray_Copy_PROTO) \ PyArray_API[PyArray_Copy_NUM]) #define PyArray_Take \ (*(PyArray_Take_RET (*)PyArray_Take_PROTO) \ PyArray_API[PyArray_Take_NUM]) #define PyArray_As1D \ (*(PyArray_As1D_RET (*)PyArray_As1D_PROTO) \ PyArray_API[PyArray_As1D_NUM]) #define PyArray_As2D \ (*(PyArray_As2D_RET (*)PyArray_As2D_PROTO) \ PyArray_API[PyArray_As2D_NUM]) #define PyArray_Free \ (*(PyArray_Free_RET (*)PyArray_Free_PROTO) \ PyArray_API[PyArray_Free_NUM]) #define PyArray_Converter \ (*(PyArray_Converter_RET (*)PyArray_Converter_PROTO) \ PyArray_API[PyArray_Converter_NUM]) #define PyArray_Put \ (*(PyArray_Put_RET (*)PyArray_Put_PROTO) \ PyArray_API[PyArray_Put_NUM]) #define PyArray_PutMask \ (*(PyArray_PutMask_RET (*)PyArray_PutMask_PROTO) \ PyArray_API[PyArray_PutMask_NUM]) #define PyArray_CopyArray \ (*(PyArray_CopyArray_RET (*)PyArray_CopyArray_PROTO) \ PyArray_API[PyArray_CopyArray_NUM]) #define PyArray_ValidType \ (*(PyArray_ValidType_RET (*)PyArray_ValidType_PROTO) \ PyArray_API[PyArray_ValidType_NUM]) #define PyArray_IntegerAsInt \ (*(PyArray_IntegerAsInt_RET (*)PyArray_IntegerAsInt_PROTO) \ PyArray_API[PyArray_IntegerAsInt_NUM]) #define import_array() \ { \ PyObject *numpy = PyImport_ImportModule("_numpy"); \ if (numpy != NULL) { \ PyObject *module_dict = PyModule_GetDict(numpy); \ PyObject *c_api_object = PyDict_GetItemString(module_dict, "_ARRAY_API"); \ if (PyCObject_Check(c_api_object)) { \ PyArray_API = (void **)PyCObject_AsVoidPtr(c_api_object); \ } \ } \ } #endif #ifdef __cplusplus } #endif #endif /* !Py_ARRAYOBJECT_H */ pygame-1.9.1release/src/music.doc0000644000175000017500000001107611204417377016654 0ustar vincentvincentpygame.mixer.music pygame module for controlling streamed audio The music module is closely tied to pygame.mixer. Use the music module to control the playback of music in the sound mixer. The difference between the music playback and regular Sound playback is that the music is streamed, and never actually loaded all at once. The mixer system only supports a single music stream at once. Be aware that MP3 support is limited. On some systems an unsupported format can crash the program, e.g. Debian Linux. Consider using OGG instead.
    load Load a music file for playback pygame.mixer.music.load(filename): return None pygame.mixer.music.load(object): return None This will load a music filename/file object and prepare it for playback. If a music stream is already playing it will be stopped. This does not start the music playing. play Start the playback of the music stream pygame.mixer.music.play(loops=0, start=0.0): return None This will play the loaded music stream. If the music is already playing it will be restarted. The loops argument controls the number of repeats a music will play. play(5) will cause the music to played once, then repeated five times, for a total of six. If the loops is -1 then the music will repeat indefinitely. The starting position argument controls where in the music the song starts playing. The starting position is dependent on the format of music playing. MP3 and OGG use the position as time (in seconds). MOD music it is the pattern order number. Passing a startpos will raise a NotImplementedError if it cannot set the start position rewind restart music pygame.mixer.music.rewind(): return None Resets playback of the current music to the beginning. stop stop the music playback pygame.mixer.music.stop(): return None Stops the music playback if it is currently playing. pause temporarily stop music playback pygame.mixer.music.pause(): return None Temporarily stop playback of the music stream. It can be resumed with the pygame.mixer.music.unpause() function. unpause resume paused music pygame.mixer.music.unpause(): return None This will resume the playback of a music stream after it has been paused. fadeout stop music playback after fading out pygame.mixer.music.fadeout(time): return None This will stop the music playback after it has been faded out over the specified time (measured in milliseconds). Note, that this function blocks until the music has faded out. set_volume set the music volume pygame.mixer.music.set_volume(value): return None Set the volume of the music playback. The value argument is between 0.0 and 1.0. When new music is loaded the volume is reset. get_volume get the music volume pygame.mixer.music.get_volume(): return value Returns the current volume for the mixer. The value will be between 0.0 and 1.0. get_busy check if the music stream is playing pygame.mixer.music.get_busy(): return bool Returns True when the music stream is actively playing. When the music is idle this returns False. get_pos get the music play time pygame.mixer.music.get_pos(): return time This gets the number of milliseconds that the music has been playing for. The returned time only represents how long the music has been playing; it does not take into account any starting position offsets. queue queue a music file to follow the current pygame.mixer.music.queue(filename): return None This will load a music file and queue it. A queued music file will begin as soon as the current music naturally ends. If the current music is ever stopped or changed, the queued song will be lost. The following example will play music by Bach six times, then play music by Mozart once: pygame.mixer.music.load('bach.ogg') pygame.mixer.music.play(5) # Plays six times, not five! pygame.mixer.music.queue('mozart.ogg') set_endevent have the music send an event when playback stops pygame.mixer.music.set_endevent(): return None pygame.mixer.music.set_endevent(type): return None This causes Pygame to signal (by means of the event queue) when the music is done playing. The argument determines the type of event that will be queued. The event will be queued every time the music finishes, not just the first time. To stop the event from being queued, call this method with no argument. get_endevent get the event a channel sends when playback stops pygame.mixer.music.get_endevent(): return type Returns the event type to be sent every time the music finishes playback. If there is no endevent the function returns pygame.NOEVENT. pygame-1.9.1release/src/music.c0000644000175000017500000002554011207055754016332 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* * music module for pygame */ #define PYGAMEAPI_MUSIC_INTERNAL #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" #include "mixer.h" static Mix_Music* current_music = NULL; static Mix_Music* queue_music = NULL; static int endmusic_event = SDL_NOEVENT; static Uint64 music_pos = 0; static long music_pos_time = -1; static int music_frequency = 0; static Uint16 music_format = 0; static int music_channels = 0; static void mixmusic_callback (void *udata, Uint8 *stream, int len) { if (!Mix_PausedMusic ()) { music_pos += len; music_pos_time = SDL_GetTicks (); } } static void endmusic_callback (void) { if (endmusic_event && SDL_WasInit (SDL_INIT_VIDEO)) { SDL_Event e; memset (&e, 0, sizeof (e)); e.type = endmusic_event; SDL_PushEvent (&e); } if (queue_music) { if (current_music) Mix_FreeMusic (current_music); current_music = queue_music; queue_music = NULL; Mix_HookMusicFinished (endmusic_callback); music_pos = 0; Mix_PlayMusic (current_music, 0); } else { music_pos_time = -1; Mix_SetPostMix (NULL, NULL); } } /*music module methods*/ static PyObject* music_play (PyObject* self, PyObject* args) { int loops = 0; float startpos = 0.0; int val, volume = 0; if (!PyArg_ParseTuple (args, "|if", &loops, &startpos)) return NULL; MIXER_INIT_CHECK (); if (!current_music) return RAISE (PyExc_SDLError, "music not loaded"); Mix_HookMusicFinished (endmusic_callback); Mix_SetPostMix (mixmusic_callback, NULL); Mix_QuerySpec (&music_frequency, &music_format, &music_channels); music_pos = 0; music_pos_time = SDL_GetTicks (); #if MIX_MAJOR_VERSION>=1 && MIX_MINOR_VERSION>=2 && MIX_PATCHLEVEL>=3 Py_BEGIN_ALLOW_THREADS volume = Mix_VolumeMusic (-1); val = Mix_FadeInMusicPos (current_music, loops, 0, startpos); Mix_VolumeMusic (volume); Py_END_ALLOW_THREADS #else if (startpos) return RAISE (PyExc_NotImplementedError, "music start position requires SDL_mixer-1.2.4"); Py_BEGIN_ALLOW_THREADS val = Mix_PlayMusic (current_music, loops); Py_END_ALLOW_THREADS #endif if (val == -1) return RAISE (PyExc_SDLError, SDL_GetError ()); Py_RETURN_NONE; } static PyObject* music_get_busy (PyObject* self) { MIXER_INIT_CHECK (); return PyInt_FromLong (Mix_PlayingMusic ()); } static PyObject* music_fadeout (PyObject* self, PyObject* args) { int _time; if (!PyArg_ParseTuple (args, "i", &_time)) return NULL; MIXER_INIT_CHECK (); Mix_FadeOutMusic (_time); if (queue_music) { Mix_FreeMusic (queue_music); queue_music = NULL; } Py_RETURN_NONE; } static PyObject* music_stop (PyObject* self) { MIXER_INIT_CHECK (); Mix_HaltMusic (); if (queue_music) { Mix_FreeMusic (queue_music); queue_music = NULL; } Py_RETURN_NONE; } static PyObject* music_pause (PyObject* self) { MIXER_INIT_CHECK (); Mix_PauseMusic (); Py_RETURN_NONE; } static PyObject* music_unpause (PyObject* self) { MIXER_INIT_CHECK (); Mix_ResumeMusic (); Py_RETURN_NONE; } static PyObject* music_rewind (PyObject* self) { MIXER_INIT_CHECK (); Mix_RewindMusic (); Py_RETURN_NONE; } static PyObject* music_set_volume (PyObject* self, PyObject* args) { float volume; if (!PyArg_ParseTuple (args, "f", &volume)) return NULL; MIXER_INIT_CHECK (); Mix_VolumeMusic ((int)(volume * 128)); Py_RETURN_NONE; } static PyObject* music_get_volume (PyObject* self) { int volume; MIXER_INIT_CHECK (); volume = Mix_VolumeMusic (-1); return PyFloat_FromDouble (volume / 128.0); } static PyObject* music_get_pos (PyObject* self) { long ticks; MIXER_INIT_CHECK (); if (music_pos_time < 0) return PyLong_FromLong (-1); ticks = (long) (1000 * music_pos / (music_channels * music_frequency * ((music_format & 0xff) >> 3))); if (!Mix_PausedMusic ()) ticks += SDL_GetTicks () - music_pos_time; return PyInt_FromLong ((long)ticks); } static PyObject* music_set_endevent (PyObject* self, PyObject* args) { int eventid = SDL_NOEVENT; if (!PyArg_ParseTuple (args, "|i", &eventid)) return NULL; endmusic_event = eventid; Py_RETURN_NONE; } static PyObject* music_get_endevent (PyObject* self) { return PyInt_FromLong (endmusic_event); } static PyObject* music_load (PyObject* self, PyObject* args) { char* name = NULL; PyObject* file; Mix_Music* new_music; SDL_RWops *rw; if(!PyArg_ParseTuple(args, "O", &file)) return NULL; MIXER_INIT_CHECK (); #if (MIX_MAJOR_VERSION*100*100 + MIX_MINOR_VERSION*100 + MIX_PATCHLEVEL) >= 10208 if(!Bytes_Check(file) && !PyUnicode_Check(file)) { rw = RWopsFromPythonThreaded(file); if(!rw) return NULL; Py_BEGIN_ALLOW_THREADS new_music = Mix_LoadMUS_RW(rw); Py_END_ALLOW_THREADS } else #endif { #if PY3 if (PyUnicode_Check(file)) { if (!PyArg_ParseTuple(args, "s", &name)) { return NULL; } } else { if (!PyArg_ParseTuple(args, "y", &name)) { return NULL; } } #else if(!PyArg_ParseTuple(args, "s", &name)) return NULL; #endif Py_BEGIN_ALLOW_THREADS new_music = Mix_LoadMUS(name); Py_END_ALLOW_THREADS } if (!new_music) return RAISE (PyExc_SDLError, SDL_GetError ()); Py_BEGIN_ALLOW_THREADS if (current_music) { Mix_FreeMusic (current_music); current_music = NULL; } if (queue_music) { Mix_FreeMusic (queue_music); queue_music = NULL; } Py_END_ALLOW_THREADS current_music = new_music; Py_RETURN_NONE; } static PyObject* music_queue (PyObject* self, PyObject* args) { char* name = NULL; PyObject* file; Mix_Music* new_music; SDL_RWops *rw; if (!PyArg_ParseTuple (args, "O", &file)) return NULL; MIXER_INIT_CHECK (); #if MIX_MAJOR_VERSION*100*100 + MIX_MINOR_VERSION*100 + MIX_PATCHLEVEL >= 10208 if(!Bytes_Check(file) && !PyUnicode_Check(file)) { rw = RWopsFromPythonThreaded(file); if(!rw) return NULL; Py_BEGIN_ALLOW_THREADS new_music = Mix_LoadMUS_RW(rw); Py_END_ALLOW_THREADS } else #endif { #if PY3 if (PyUnicode_Check(file)) { if (!PyArg_ParseTuple(args, "s", &name)) { return NULL; } } else { if (!PyArg_ParseTuple(args, "y", &name)) { return NULL; } } #else if(!PyArg_ParseTuple(args, "s", &name)) return NULL; #endif Py_BEGIN_ALLOW_THREADS new_music = Mix_LoadMUS(name); Py_END_ALLOW_THREADS } if (!new_music) return RAISE (PyExc_SDLError, SDL_GetError ()); Py_BEGIN_ALLOW_THREADS if (queue_music) { Mix_FreeMusic (queue_music); queue_music = NULL; } Py_END_ALLOW_THREADS queue_music = new_music; Py_RETURN_NONE; } static PyMethodDef _music_methods[] = { { "set_endevent", music_set_endevent, METH_VARARGS, DOC_PYGAMEMIXERMUSICSETENDEVENT }, { "get_endevent", (PyCFunction) music_get_endevent, METH_NOARGS, DOC_PYGAMEMIXERMUSICGETENDEVENT }, { "play", music_play, METH_VARARGS, DOC_PYGAMEMIXERMUSICPLAY }, { "get_busy", (PyCFunction) music_get_busy, METH_NOARGS, DOC_PYGAMEMIXERMUSICGETBUSY }, { "fadeout", music_fadeout, METH_VARARGS, DOC_PYGAMEMIXERMUSICFADEOUT }, { "stop", (PyCFunction) music_stop, METH_NOARGS, DOC_PYGAMEMIXERMUSICSTOP }, { "pause", (PyCFunction) music_pause, METH_NOARGS, DOC_PYGAMEMIXERMUSICPAUSE }, { "unpause", (PyCFunction) music_unpause, METH_NOARGS, DOC_PYGAMEMIXERMUSICUNPAUSE }, { "rewind", (PyCFunction) music_rewind, METH_NOARGS, DOC_PYGAMEMIXERMUSICREWIND }, { "set_volume", music_set_volume, METH_VARARGS, DOC_PYGAMEMIXERMUSICSETVOLUME }, { "get_volume", (PyCFunction) music_get_volume, METH_NOARGS, DOC_PYGAMEMIXERMUSICGETVOLUME }, { "get_pos", (PyCFunction) music_get_pos, METH_NOARGS, DOC_PYGAMEMIXERMUSICGETPOS }, { "load", music_load, METH_VARARGS, DOC_PYGAMEMIXERMUSICLOAD }, { "queue", music_queue, METH_VARARGS, DOC_PYGAMEMIXERMUSICQUEUE }, { NULL, NULL, 0, NULL } }; MODINIT_DEFINE (mixer_music) { PyObject *module; PyObject *cobj; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "mixer_music", DOC_PYGAMEMIXERMUSIC, -1, _music_methods, NULL, NULL, NULL, NULL }; #endif PyMIXER_C_API[0] = PyMIXER_C_API[0]; /*clean an unused warning*/ /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_rwobject (); if (PyErr_Occurred ()) { MODINIT_ERROR; } /* create the module */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "mixer_music", _music_methods, DOC_PYGAMEMIXERMUSIC); #endif if (module == NULL) { MODINIT_ERROR; } cobj = PyCObject_FromVoidPtr (¤t_music, NULL); if (cobj == NULL) { DECREF_MOD (module); MODINIT_ERROR; } if (PyModule_AddObject(module, "_MUSIC_POINTER", cobj) < 0) { Py_DECREF (cobj); DECREF_MOD (module); MODINIT_ERROR; } cobj = PyCObject_FromVoidPtr (&queue_music, NULL); if (cobj == NULL) { DECREF_MOD (module); MODINIT_ERROR; } if (PyModule_AddObject(module, "_QUEUE_POINTER", cobj) < 0) { Py_DECREF (cobj); DECREF_MOD (module); MODINIT_ERROR; } MODINIT_RETURN (module); } pygame-1.9.1release/src/movie.doc0000644000175000017500000001131710441267015016643 0ustar vincentvincentpygame.movie pygame module for playback of mpeg video NOTE: pygame.movie currently does not work on windows with the latest pygame release. As no one has managed to get smpeg working there. The alternative is to use pymedia Pygame can playback video and audio from basic encoded MPEG1 video files. Movie playback happens in background threads, which makes playback easy to manage. The audio for Movies must have full control over the sound system. This means the pygame.mixer module must be uninitialized if the movie's sound is to be played. The common solution is to call pygame.mixer.quit() before the movie begins. The mixer can be reinitialized after the movie is finished. The video overlay planes are drawn on top of everything in the display window. To draw the movie as normal graphics into the display window, create an offscreen Surface and set that as the movie target. Then once per frame blit that surface to the screen.
    Movie load an mpeg movie file pygame.movie.Movie(filename): return Movie pygame.movie.Movie(object): return Movie Load a new MPEG movie stream from a file or a python file object. The Movie object operates similar to the Sound objects from pygame.mixer. Movie objects have a target display Surface. The movie is rendered into this Surface in a background thread. If the target Surface is the display Surface, the movie will try to use the hardware accelerated video overlay. The default target is the display Surface.
    play start playback of a movie Movie.play(loops=0): return None Starts playback of the movie. Sound and video will begin playing if they are not disabled. The optional loops argument controls how many times the movie will be repeated. A loop value of -1 means the movie will repeat forever. stop stop movie playback Movie.stop(): return None Stops the playback of a movie. The video and audio playback will be stopped at their current position. pause temporarily stop and resume playback Movie.pause(): return None This will temporarily stop or restart movie playback. skip advance the movie playback position Movie.skip(seconds): return None Advance the movie playback time in seconds. This can be called before the movie is played to set the starting playback time. This can only skip the movie forward, not backwards. The argument is a floating point number. rewind restart the movie playback Movie.rewind(): return None Sets the movie playback position to the start of the movie. The movie will automatically begin playing even if it stopped. The can raise a ValueError if the movie cannot be rewound. If the rewind fails the movie object is considered invalid. render_frame set the current video frame Movie.render_frame(frame_number): return frame_number This takes an integer frame number to render. It attempts to render the given frame from the movie to the target Surface. It returns the real frame number that got rendered. get_frame get the current video frame Movie.get_frame(): return frame_number Returns the integer frame number of the current video frame. get_time get the current vide playback time Movie.get_time(): return seconds Return the current playback time as a floating point value in seconds. This method currently seems broken and always returns 0.0. get_busy check if the movie is currently playing Movie.get_busy(): return bool Returns true if the movie is currently being played. get_length the total length of the movie in seconds Movie.get_length(): return seconds Returns the length of the movie in seconds as a floating point value. get_size get the resolution of the video Movie.get_size(): return (width, height) Gets the resolution of the movie video. The movie will be stretched to the size of any Surface, but this will report the natural video size. has_video check if the movie file contains video Movie.get_video(): return bool True when the opened movie file contains a video stream. has_audio check if the movie file contains audio Movie.get_audio(): return bool True when the opened movie file contains an audio stream. set_volume set the audio playback volume Movie.set_volume(value): return None Set the playback volume for this movie. The argument is a value between 0.0 and 1.0. If the volume is set to 0 the movie audio will not be decoded. set_display set the video target Surface Movie.set_display(Surface, rect=None): return None Set the output target Surface for the movie video. You may also pass a rectangle argument for the position, which will move and stretch the video into the given area. If None is passed as the target Surface, the video decoding will be disabled. pygame-1.9.1release/src/movie.c0000644000175000017500000003745011207055754016334 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* * movie playback for pygame */ #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" #include "smpeg.h" typedef struct { PyObject_HEAD SMPEG* movie; PyObject* surftarget; PyObject* filesource; } PyMovieObject; #define PyMovie_AsSMPEG(x) (((PyMovieObject*)x)->movie) static PyTypeObject PyMovie_Type; static PyObject* PyMovie_New (SMPEG*); #define PyMovie_Check(x) ((x)->ob_type == &PyMovie_Type) /* movie object methods */ static PyObject* movie_play (PyObject* self) { SMPEG* movie = PyMovie_AsSMPEG (self); int loops = 0; if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot convert without pygame.display initialized"); Py_BEGIN_ALLOW_THREADS; SMPEG_loop (movie, loops); SMPEG_play (movie); Py_END_ALLOW_THREADS; Py_RETURN_NONE; } static PyObject* movie_stop (PyObject* self) { SMPEG* movie = PyMovie_AsSMPEG (self); if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot convert without pygame.display initialized"); Py_BEGIN_ALLOW_THREADS; SMPEG_stop (movie); Py_END_ALLOW_THREADS; Py_RETURN_NONE; } static PyObject* movie_pause (PyObject* self) { SMPEG* movie = PyMovie_AsSMPEG (self); if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot convert without pygame.display initialized"); Py_BEGIN_ALLOW_THREADS; SMPEG_pause (movie); Py_END_ALLOW_THREADS; Py_RETURN_NONE; } static PyObject* movie_rewind (PyObject* self) { SMPEG* movie = PyMovie_AsSMPEG (self); if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot convert without pygame.display initialized"); Py_BEGIN_ALLOW_THREADS; SMPEG_rewind (movie); Py_END_ALLOW_THREADS; Py_RETURN_NONE; } static PyObject* movie_skip (PyObject* self, PyObject* args) { SMPEG* movie = PyMovie_AsSMPEG (self); float seconds; if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot convert without pygame.display initialized"); if (!PyArg_ParseTuple (args, "f", &seconds)) return NULL; Py_BEGIN_ALLOW_THREADS; SMPEG_skip (movie, seconds); Py_END_ALLOW_THREADS; Py_RETURN_NONE; } static PyObject* movie_set_volume (PyObject* self, PyObject* args) { SMPEG* movie = PyMovie_AsSMPEG (self); float value; int volume; if (!PyArg_ParseTuple (args, "f", &value)) return NULL; if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot convert without pygame.display initialized"); Py_BEGIN_ALLOW_THREADS; volume = (int) (value * 100); if (volume < 0) volume = 0; if (volume > 100) volume = 100; SMPEG_setvolume (movie, volume); Py_END_ALLOW_THREADS; Py_RETURN_NONE; } static PyObject* movie_set_display (PyObject* self, PyObject* args) { SMPEG* movie = PyMovie_AsSMPEG (self); PyObject* surfobj, *posobj=NULL; GAME_Rect *rect, temp; int x=0, y=0; if (!PyArg_ParseTuple (args, "O|O", &surfobj, &posobj)) return NULL; if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot convert without pygame.display initialized"); Py_XDECREF (((PyMovieObject*) self)->surftarget); ((PyMovieObject*) self)->surftarget = NULL; if (PySurface_Check (surfobj)) { SMPEG_Info info; SDL_Surface* surf; if (posobj == NULL) { Py_BEGIN_ALLOW_THREADS; SMPEG_getinfo (movie, &info); SMPEG_scaleXY (movie, info.width, info.height); Py_END_ALLOW_THREADS; x = y = 0; } else if (TwoIntsFromObj (posobj, &x, &y)) { Py_BEGIN_ALLOW_THREADS; SMPEG_getinfo (movie, &info); SMPEG_scaleXY (movie, info.width, info.height); Py_END_ALLOW_THREADS; } else if ((rect = GameRect_FromObject (posobj, &temp))) { x = rect->x; y = rect->y; Py_BEGIN_ALLOW_THREADS; SMPEG_scaleXY (movie, rect->w, rect->h); Py_END_ALLOW_THREADS; } else return RAISE (PyExc_TypeError, "Invalid position argument"); surf = PySurface_AsSurface (surfobj); Py_BEGIN_ALLOW_THREADS; SMPEG_getinfo (movie, &info); SMPEG_enablevideo (movie, 1); SMPEG_setdisplay (movie, surf, NULL, NULL); SMPEG_move (movie, x, y); Py_END_ALLOW_THREADS; } else { Py_BEGIN_ALLOW_THREADS; SMPEG_enablevideo (movie, 0); Py_END_ALLOW_THREADS; if (surfobj != Py_None) return RAISE (PyExc_TypeError, "destination must be a Surface"); } Py_RETURN_NONE; } static PyObject* movie_has_video (PyObject* self) { SMPEG* movie = PyMovie_AsSMPEG (self); SMPEG_Info info; if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot convert without pygame.display initialized"); Py_BEGIN_ALLOW_THREADS; SMPEG_getinfo (movie, &info); Py_END_ALLOW_THREADS; return PyInt_FromLong (info.has_video); } static PyObject* movie_has_audio (PyObject* self) { SMPEG* movie = PyMovie_AsSMPEG (self); SMPEG_Info info; if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot convert without pygame.display initialized"); Py_BEGIN_ALLOW_THREADS; SMPEG_getinfo (movie, &info); Py_END_ALLOW_THREADS; return PyInt_FromLong (info.has_audio); } static PyObject* movie_get_size (PyObject* self) { SMPEG* movie = PyMovie_AsSMPEG (self); SMPEG_Info info; if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot convert without pygame.display initialized"); Py_BEGIN_ALLOW_THREADS; SMPEG_getinfo (movie, &info); Py_END_ALLOW_THREADS; return Py_BuildValue ("(ii)", info.width, info.height); } static PyObject* movie_get_frame (PyObject* self) { SMPEG* movie = PyMovie_AsSMPEG (self); SMPEG_Info info; if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot convert without pygame.display initialized"); Py_BEGIN_ALLOW_THREADS; SMPEG_getinfo (movie, &info); Py_END_ALLOW_THREADS; return PyInt_FromLong (info.current_frame); } static PyObject* movie_get_time (PyObject* self) { SMPEG* movie = PyMovie_AsSMPEG (self); SMPEG_Info info; if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot convert without pygame.display initialized"); Py_BEGIN_ALLOW_THREADS; SMPEG_getinfo (movie, &info); Py_END_ALLOW_THREADS; return PyFloat_FromDouble (info.current_time); } static PyObject* movie_get_length (PyObject* self) { SMPEG* movie; SMPEG_Info info; if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot convert without pygame.display initialized"); movie = PyMovie_AsSMPEG (self); Py_BEGIN_ALLOW_THREADS; SMPEG_getinfo (movie, &info); Py_END_ALLOW_THREADS; return PyFloat_FromDouble (info.total_time); } static PyObject* movie_get_busy (PyObject* self) { SMPEG* movie; if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot convert without pygame.display initialized"); movie = PyMovie_AsSMPEG (self); return PyInt_FromLong (SMPEG_status (movie) == SMPEG_PLAYING); } static PyObject* movie_render_frame (PyObject* self, PyObject* args) { SMPEG* movie = PyMovie_AsSMPEG (self); SMPEG_Info info; int framenum; if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot convert without pygame.display initialized"); if (!PyArg_ParseTuple (args, "i", &framenum)) return NULL; Py_BEGIN_ALLOW_THREADS; SMPEG_renderFrame (movie, framenum); SMPEG_getinfo (movie, &info); Py_END_ALLOW_THREADS; return PyInt_FromLong (info.current_frame); } static PyMethodDef movie_methods[] = { { "play", (PyCFunction)movie_play, METH_NOARGS, DOC_MOVIEPLAY }, { "stop", (PyCFunction) movie_stop, METH_NOARGS, DOC_MOVIESTOP }, { "pause", (PyCFunction) movie_pause, METH_NOARGS, DOC_MOVIEPAUSE }, { "rewind", (PyCFunction) movie_rewind, METH_NOARGS, DOC_MOVIEREWIND }, { "skip", movie_skip, METH_VARARGS, DOC_MOVIESKIP }, { "set_volume", movie_set_volume, METH_VARARGS, DOC_MOVIESETVOLUME }, { "set_display", movie_set_display, METH_VARARGS, DOC_MOVIESETDISPLAY }, { "has_video", (PyCFunction) movie_has_video, METH_NOARGS, DOC_MOVIEHASVIDEO }, { "has_audio", (PyCFunction) movie_has_audio, METH_NOARGS, DOC_MOVIEHASAUDIO }, { "get_size", (PyCFunction) movie_get_size, METH_NOARGS, DOC_MOVIEGETSIZE }, { "get_frame", (PyCFunction) movie_get_frame, METH_NOARGS, DOC_MOVIEGETFRAME }, { "get_time", (PyCFunction) movie_get_time, METH_NOARGS, DOC_MOVIEGETTIME }, { "get_length", (PyCFunction) movie_get_length, METH_NOARGS, DOC_MOVIEGETLENGTH }, { "get_busy", (PyCFunction) movie_get_busy, METH_NOARGS, DOC_MOVIEGETBUSY }, { "render_frame", movie_render_frame, METH_VARARGS, DOC_MOVIERENDERFRAME }, { NULL, NULL, 0, NULL } }; /*sound object internals*/ static void movie_dealloc (PyObject* self) { SMPEG* movie = PyMovie_AsSMPEG (self); Py_BEGIN_ALLOW_THREADS; SMPEG_delete (movie); Py_END_ALLOW_THREADS; Py_XDECREF (((PyMovieObject*) self)->surftarget); Py_XDECREF (((PyMovieObject*) self)->filesource); PyObject_DEL (self); } static PyTypeObject PyMovie_Type = { TYPE_HEAD (NULL, 0) "movie", /* name */ sizeof(PyMovieObject), /* basic size */ 0, /* itemsize */ movie_dealloc, /* dealloc */ 0, /* print */ 0, /* getattr */ 0, /* setattr */ 0, /* compare */ 0, /* repr */ 0, /* as_number */ 0, /* as_sequence */ 0, /* as_mapping */ 0, /* hash */ 0, /* call */ 0, /* str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* flags */ DOC_PYGAMEMOVIEMOVIE, /* Documentation string */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ movie_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ }; /*movie module methods*/ static PyObject* Movie (PyObject* self, PyObject* arg) { PyObject* file, *final, *filesource=NULL; char* name = NULL; SMPEG* movie=NULL; SMPEG_Info info; SDL_Surface* screen; char* error; int audioavail = 0; if (!SDL_WasInit (SDL_INIT_VIDEO)) return RAISE (PyExc_SDLError, "cannot convert without pygame.display initialized"); if (!PyArg_ParseTuple (arg, "O", &file)) return NULL; if (!SDL_WasInit (SDL_INIT_AUDIO)) audioavail = 1; if (Bytes_Check (file) || PyUnicode_Check (file)) { if (!PyArg_ParseTuple (arg, "s", &name)) return NULL; movie = SMPEG_new (name, &info, audioavail); } #if !PY3 else if (PyFile_Check (file)) { SDL_RWops *rw = SDL_RWFromFP (PyFile_AsFile (file), 0); movie = SMPEG_new_rwops (rw, &info, audioavail); filesource = file; Py_INCREF (file); } #endif else { SDL_RWops *rw; if (!(rw = RWopsFromPythonThreaded (file))) return NULL; Py_BEGIN_ALLOW_THREADS; movie = SMPEG_new_rwops (rw, &info, audioavail); Py_END_ALLOW_THREADS; } if (!movie) return RAISE (PyExc_SDLError, "Cannot create Movie object"); error = SMPEG_error (movie); if (error) { /* while this would seem correct, it causes a crash, so don't * delete SMPEG_delete(movie);*/ return RAISE (PyExc_SDLError, error); } Py_BEGIN_ALLOW_THREADS; SMPEG_enableaudio (movie, audioavail); screen = SDL_GetVideoSurface (); if (screen) SMPEG_setdisplay (movie, screen, NULL, NULL); SMPEG_scaleXY (movie, info.width, info.height); Py_END_ALLOW_THREADS; final = PyMovie_New (movie); if (!final) SMPEG_delete (movie); ((PyMovieObject*) final)->filesource = filesource; return final; } static PyMethodDef _movie_methods[] = { { "Movie", Movie, METH_VARARGS, DOC_PYGAMEMOVIEMOVIE }, { NULL, NULL, 0, NULL } }; static PyObject* PyMovie_New (SMPEG* movie) { PyMovieObject* movieobj; if (!movie) return RAISE (PyExc_RuntimeError, "unable to create movie."); movieobj = PyObject_NEW (PyMovieObject, &PyMovie_Type); if (movieobj) movieobj->movie = movie; movieobj->surftarget = NULL; movieobj->filesource = NULL; return (PyObject*)movieobj; } MODINIT_DEFINE (movie) { PyObject *module, *dict; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "movie", DOC_PYGAMEMOVIE, -1, _movie_methods, NULL, NULL, NULL, NULL }; #endif /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_surface (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_rwobject (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_rect (); if (PyErr_Occurred ()) { MODINIT_ERROR; } /* type preparation */ if (PyType_Ready (&PyMovie_Type) == -1) { MODINIT_ERROR; } /* create the module */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 ("movie", _movie_methods, DOC_PYGAMEMOVIE); #endif if (module == NULL) { MODINIT_ERROR; } dict = PyModule_GetDict (module); if (PyDict_SetItemString (dict, "MovieType", (PyObject *)&PyMovie_Type) == -1) { DECREF_MOD (module); MODINIT_ERROR; } MODINIT_RETURN (module); } pygame-1.9.1release/src/mouse.doc0000644000175000017500000001137410441266602016660 0ustar vincentvincentpygame.mouse pygame module to work with the mouse The mouse functions can be used to get the current state of the mouse device. These functions can also alter the system cursor for the mouse. When the display mode is set, the event queue will start receiving mouse events. The mouse buttons generate pygame.MOUSEBUTTONDOWN and pygame.MOUSEBUTTONUP events when they are pressed and released. These events contain a button attribute representing which button was pressed. The mouse wheel will generate pygame.MOUSEBUTTONDOWN events when rolled. The button will be set to 4 when the wheel is rolled up, and to button 5 when the wheel is rolled down. Anytime the mouse is moved it generates a pygame.MOUSEMOTION event. The mouse movement is broken into small and accurate motion events. As the mouse is moving many motion events will be placed on the queue. Mouse motion events that are not properly cleaned from the event queue are the primary reason the event queue fills up. If the mouse cursor is hidden, and input is grabbed to the current display the mouse will enter a virtual input mode, where the relative movements of the mouse will never be stopped by the borders of the screen. See the functions pygame.mouse.set_visible() and pygame.event.set_grab() to get this configured.
    get_pressed get the state of the mouse buttons pygame.moouse.get_pressed(): return (button1, button2, button3) Returns a sequence of booleans representing the state of all the mouse buttons. A true value means the mouse is currently being pressed at the time of the call. Note, to get all of the mouse events it is better to use either pygame.event.wait() or pygame.event.get() and check all of those events to see if they are MOUSEBUTTONDOWN, MOUSEBUTTONUP, or MOUSEMOTION. Note, that on X11 some XServers use middle button emulation. When you click both buttons 1 and 3 at the same time a 2 button event can be emitted. Note, remember to call pygame.event.get() before this function. Otherwise it will not work. get_pos get the mouse cursor position pygame.mouse.get_pos(): return (x, y) Returns the X and Y position of the mouse cursor. The position is relative the the top-left corner of the display. The cursor position can be located outside of the display window, but is always constrained to the screen. get_rel get the amount of mouse movement pygame.mouse.get_rel(): return (x, y) Returns the amount of movement in X and Y since the previous call to this function. The relative movement of the mouse cursor is constrained to the edges of the screen, but see the virtual input mouse mode for a way around this. Virtual input mode is described at the top of the page. set_pos set the mouse cursor position pygame.mouse.set_pos([x, y]): return None Set the current mouse position to arguments given. If the mouse cursor is visible it will jump to the new coordinates. Moving the mouse will generate a new pygaqme.MOUSEMOTION event. set_visible hide or show the mouse cursor pygame.mouse.set_visible(bool): return bool If the bool argument is true, the mouse cursor will be visible. This will return the previous visible state of the cursor. get_focused check if the display is receiving mouse input pygame.mouse.get_focused(): return bool Returns true when pygame is receiving mouse input events (or, in windowing terminology, is "active" or has the "focus"). This method is most useful when working in a window. By contrast, in full-screen mode, this method always returns true. Note: under MS Windows, the window that has the mouse focus also has the keyboard focus. But under X-Windows, one window can receive mouse events and another receive keyboard events. pygame.mouse.get_focused() indicates whether the pygame window receives mouse events. set_cursor set the image for the system mouse cursor pygame.mouse.set_cursor(size, hotspot, xormasks, andmasks): return None When the mouse cursor is visible, it will be displayed as a black and white bitmap using the given bitmask arrays. The size is a sequence containing the cursor width and height. Hotspot is a sequence containing the cursor hotspot position. xormasks is a sequence of bytes containing the cursor xor data masks. Lastly is andmasks, a sequence of bytes containting the cursor bitmask data. Width must be a multiple of 8, and the mask arrays must be the correct size for the given width and height. Otherwise an exception is raised. See the pygame.cursor module for help creating default and custom masks for the system cursor. get_cursor get the image for the system mouse cursor pygame.mouse.get_cursor(): return (size, hotspot, xormasks, andmasks) Get the information about the mouse system cursor. The return value is the same data as the arguments passed into pygame.mouse.set_cursor(). pygame-1.9.1release/src/mouse.c0000644000175000017500000001506211207055754016340 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* * pygame mouse module */ #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" /* mouse module functions */ static PyObject* mouse_set_pos (PyObject* self, PyObject* args) { int x, y; if (!TwoIntsFromObj (args, &x, &y)) return RAISE (PyExc_TypeError, "invalid position argument for set_pos"); VIDEO_INIT_CHECK (); SDL_WarpMouse ((Uint16)x, (Uint16)y); Py_RETURN_NONE; } static PyObject* mouse_get_pos (PyObject* self) { int x, y; VIDEO_INIT_CHECK (); SDL_GetMouseState (&x, &y); return Py_BuildValue ("(ii)", x, y); } static PyObject* mouse_get_rel (PyObject* self) { int x, y; VIDEO_INIT_CHECK (); SDL_GetRelativeMouseState (&x, &y); return Py_BuildValue ("(ii)", x, y); } static PyObject* mouse_get_pressed (PyObject* self) { PyObject* tuple; int state; VIDEO_INIT_CHECK (); state = SDL_GetMouseState (NULL, NULL); if (!(tuple = PyTuple_New (3))) return NULL; PyTuple_SET_ITEM (tuple, 0, PyInt_FromLong ((state & SDL_BUTTON (1)) != 0)); PyTuple_SET_ITEM (tuple, 1, PyInt_FromLong ((state & SDL_BUTTON (2)) != 0)); PyTuple_SET_ITEM (tuple, 2, PyInt_FromLong ((state & SDL_BUTTON (3)) != 0)); return tuple; } static PyObject* mouse_set_visible (PyObject* self, PyObject* args) { int toggle; if (!PyArg_ParseTuple (args, "i", &toggle)) return NULL; VIDEO_INIT_CHECK (); toggle = SDL_ShowCursor (toggle); return PyInt_FromLong (toggle); } static PyObject* mouse_get_focused (PyObject* self) { VIDEO_INIT_CHECK (); return PyInt_FromLong ((SDL_GetAppState () & SDL_APPMOUSEFOCUS) != 0); } static PyObject* mouse_set_cursor (PyObject* self, PyObject* args) { int w, h, spotx, spoty; PyObject *xormask, *andmask; Uint8 *xordata=NULL, *anddata=NULL; int xorsize, andsize, loop; int val; SDL_Cursor *lastcursor, *cursor = NULL; if (!PyArg_ParseTuple (args, "(ii)(ii)OO", &w, &h, &spotx, &spoty, &xormask, &andmask)) return NULL; VIDEO_INIT_CHECK (); if (!PySequence_Check (xormask) || !PySequence_Check (andmask)) return RAISE (PyExc_TypeError, "xormask and andmask must be sequences"); if (w % 8) return RAISE (PyExc_ValueError, "Cursor width must be divisible by 8."); xorsize = PySequence_Length (xormask); andsize = PySequence_Length (andmask); if (xorsize != w * h / 8 || andsize != w * h / 8) return RAISE (PyExc_ValueError, "bitmasks must be sized width*height/8"); xordata = (Uint8*) malloc (xorsize); anddata = (Uint8*) malloc (andsize); for (loop = 0; loop < xorsize; ++loop) { if (!IntFromObjIndex (xormask, loop, &val)) goto interror; xordata[loop] = (Uint8)val; if (!IntFromObjIndex (andmask, loop, &val)) goto interror; anddata[loop] = (Uint8)val; } cursor = SDL_CreateCursor (xordata, anddata, w, h, spotx, spoty); free (xordata); free (anddata); xordata = NULL; anddata = NULL; if (!cursor) return RAISE (PyExc_SDLError, SDL_GetError ()); lastcursor = SDL_GetCursor (); SDL_SetCursor (cursor); SDL_FreeCursor (lastcursor); Py_RETURN_NONE; interror: if (xordata) free (xordata); if (anddata) free (anddata); return RAISE (PyExc_TypeError, "Invalid number in mask array"); } static PyObject* mouse_get_cursor (PyObject* self) { SDL_Cursor *cursor = NULL; PyObject* xordata, *anddata; int size, loop, w, h, spotx, spoty; VIDEO_INIT_CHECK (); cursor = SDL_GetCursor (); if (!cursor) return RAISE (PyExc_SDLError, SDL_GetError ()); w = cursor->area.w; h = cursor->area.h; spotx = cursor->hot_x; spoty = cursor->hot_y; size = cursor->area.w * cursor->area.h / 8; xordata = PyTuple_New(size); if (!xordata) return NULL; anddata = PyTuple_New (size); if (!anddata) { Py_DECREF (anddata); return NULL; } for (loop = 0; loop < size; ++loop) { PyTuple_SET_ITEM (xordata, loop, PyInt_FromLong (cursor->data[loop])); PyTuple_SET_ITEM (anddata, loop, PyInt_FromLong (cursor->mask[loop])); } return Py_BuildValue ("((ii)(ii)NN)", w, h, spotx, spoty, xordata, anddata); } static PyMethodDef _mouse_methods[] = { { "set_pos", mouse_set_pos, METH_VARARGS, DOC_PYGAMEMOUSESETPOS }, { "get_pos", (PyCFunction) mouse_get_pos, METH_VARARGS, DOC_PYGAMEMOUSEGETPOS }, { "get_rel", (PyCFunction) mouse_get_rel, METH_VARARGS, DOC_PYGAMEMOUSEGETREL }, { "get_pressed", (PyCFunction) mouse_get_pressed, METH_VARARGS, DOC_PYGAMEMOUSEGETPRESSED }, { "set_visible", mouse_set_visible, METH_VARARGS, DOC_PYGAMEMOUSESETVISIBLE }, { "get_focused", (PyCFunction) mouse_get_focused, METH_VARARGS, DOC_PYGAMEMOUSEGETFOCUSED }, { "set_cursor", mouse_set_cursor, METH_VARARGS, DOC_PYGAMEMOUSESETCURSOR }, { "get_cursor", (PyCFunction) mouse_get_cursor, METH_VARARGS, DOC_PYGAMEMOUSEGETCURSOR }, { NULL, NULL, 0, NULL } }; MODINIT_DEFINE (mouse) { PyObject *module; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "mouse", DOC_PYGAMEMOUSE, -1, _mouse_methods, NULL, NULL, NULL, NULL }; #endif /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } /* create the module */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 ("mouse", _mouse_methods, DOC_PYGAMEMOUSE); #endif if (module == NULL) { MODINIT_ERROR; } MODINIT_RETURN (module); } pygame-1.9.1release/src/mixer.h0000644000175000017500000000500511200727740016327 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ #include #include #include /* test mixer initializations */ #define MIXER_INIT_CHECK() \ if(!SDL_WasInit(SDL_INIT_AUDIO)) \ return RAISE(PyExc_SDLError, "mixer system not initialized") #define PYGAMEAPI_MIXER_NUMSLOTS 7 typedef struct { PyObject_HEAD Mix_Chunk* chunk; PyObject *weakreflist; } PySoundObject; typedef struct { PyObject_HEAD int chan; } PyChannelObject; #define PySound_AsChunk(x) (((PySoundObject*)x)->chunk) #define PyChannel_AsInt(x) (((PyChannelObject*)x)->chan) #ifndef PYGAMEAPI_MIXER_INTERNAL #define PySound_Check(x) ((x)->ob_type == (PyTypeObject*)PyMIXER_C_API[0]) #define PySound_Type (*(PyTypeObject*)PyMIXER_C_API[0]) #define PySound_New (*(PyObject*(*)(Mix_Chunk*))PyMIXER_C_API[1]) #define PySound_Play (*(PyObject*(*)(PyObject*, PyObject*))PyMIXER_C_API[2]) #define PyChannel_Check(x) ((x)->ob_type == (PyTypeObject*)PyMIXER_C_API[3]) #define PyChannel_Type (*(PyTypeObject*)PyMIXER_C_API[3]) #define PyChannel_New (*(PyObject*(*)(int))PyMIXER_C_API[4]) #define PyMixer_AutoInit (*(PyObject*(*)(PyObject*, PyObject*))PyMIXER_C_API[5]) #define PyMixer_AutoQuit (*(void(*)(void))PyMIXER_C_API[6]) #define import_pygame_mixer() { \ PyObject *_module = PyImport_ImportModule(IMPPREFIX "mixer"); \ if (_module != NULL) { \ PyObject *_dict = PyModule_GetDict(_module); \ PyObject *_c_api = PyDict_GetItemString(_dict, PYGAMEAPI_LOCAL_ENTRY); \ if(PyCObject_Check(_c_api)) {\ void** localptr = (void**)PyCObject_AsVoidPtr(_c_api); \ memcpy(PyMIXER_C_API, localptr, sizeof(void*)*PYGAMEAPI_MIXER_NUMSLOTS); \ } Py_DECREF(_module); } } #endif static void* PyMIXER_C_API[PYGAMEAPI_MIXER_NUMSLOTS] = {NULL}; pygame-1.9.1release/src/mixer.doc0000644000175000017500000003615411140460664016660 0ustar vincentvincentpygame.mixer pygame module for loading and playing sounds This module contains classes for loading Sound objects and controlling playback. The mixer module is optional and depends on SDL_mixer. Your program should test that pygame.mixer is available and intialized before using it. The mixer module has a limited number of channels for playback of sounds. Usually programs tell pygame to start playing audio and it selects an available channel automatically. The default is 8 simultaneous channels, but complex programs can get more precise control over the number of channels and their use. All sound playback is mixed in background threads. When you begin to play a Sound object, it will return immediately while the sound continues to play. A single Sound object can also be actively played back multiple times. The mixer also has a special streaming channel. This is for music playback and is accessed through the pygame.mixer.music module. The mixer module must be initialized like other pygame modules, but it has some extra conditions. The pygame.mixer.init() function takes several optional arguments to control the playback rate and sample size. Pygame will default to reasonable values, but pygame cannot perform Sound resampling, so the mixer should be initialized to match the values of your audio resources. NOTE: Not to get less laggy sound, use a smaller buffer size. The default is set to reduce the chance of scratchy sounds on some computers. You can change the default buffer by calling pygame.mixer.pre_init before pygame.mixer.init or pygame.init is called. For example: pygame.mixer.pre_init(44100,-16,2, 1024) The default size was changed from 1024 to 3072 in pygame 1.8.
    init initialize the mixer module pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=4096): return None Initialize the mixer module for Sound loading and playback. The default arguments can be overridden to provide specific audio mixing. Keyword arguments are accepted. For backward compatibility where an argument is set zero the default value is used (possible changed by a pre_init call). The size argument represents how many bits are used for each audio sample. If the value is negative then signed sample values will be used. Positive values mean unsigned audio samples will be used. An invalid value raises an exception. The channels argument is used to specify whether to use mono or stereo. 1 for mono and 2 for stereo. No other values are supported (negative values are treated as 1, values greater than 2 as 2). The buffer argument controls the number of internal samples used in the sound mixer. The default value should work for most cases. It can be lowered to reduce latency, but sound dropout may occur. It can be raised to larger values to ensure playback never skips, but it will impose latency on sound playback. The buffer size must be a power of two (if not it is rounded up to the next nearest power of 2). Some platforms require the pygame.mixer module to be initialized after the display modules have initialized. The top level pygame.init() takes care of this automatically, but cannot pass any arguments to the mixer init. To solve this, mixer has a function pygame.mixer.pre_init() to set the proper defaults before the toplevel init is used. It is safe to call this more than once, but after the mixer is initialized you cannot change the playback arguments without first calling pygame.mixer.quit(). pre_init preset the mixer init arguments pygame.mixer.pre_init(frequency=22050, size=-16, channels=2, buffersize=4096): return None Call pre_init to change the defaults used when the real pygame.mixer.init() is called. Keyword arguments are accepted. The best way to set custom mixer playback values is to call pygame.mixer.pre_init() before calling the top level pygame.init(). For backward compatibility argument values of zero is replaced with the startup defaults. quit uninitialize the mixer pygame.mixer.quit(): return None This will uninitialize pygame.mixer. All playback will stop and any loaded Sound objects may not be compatible with the mixer if it is reinitialized later. get_init test if the mixer is initialized pygame.mixer.get_init(): return (frequency, format, channels) If the mixer is initialized, this returns the playback arguments it is using. If the mixer has not been initialized this returns None stop stop playback of all sound channels pygame.mixer.stop(): return None This will stop all playback of all active mixer channels. pause temporarily stop playback of all sound channels pygame.mixer.pause(): return None This will temporarily stop all playback on the active mixer channels. The playback can later be resumed with pygame.mixer.unpause() unpause resume paused playback of sound channels pygame.mixer.unpause(): return None This will resume all active sound channels after they have been paused. fadeout fade out the volume on all sounds before stopping pygame.mixer.fadeout(time): return None This will fade out the volume on all active channels over the time argument in milliseconds. After the sound is muted the playback will stop. set_num_channels set the total number of playback channels pygame.mixer.set_num_channels(count): return None Sets the number of available channels for the mixer. The default value is 8. The value can be increased or decreased. If the value is decreased, sounds playing on the truncated channels are stopped. get_num_channels get the total number of playback channels Returns the number of currently active playback channels. set_reserved reserve channels from being automatically used pygame.mixer.set_reserved(count): return None The mixer can reserve any number of channels that will not be automatically selected for playback by Sounds. If sounds are currently playing on the reserved channels they will not be stopped. This allows the application to reserve a specific number of channels for important sounds that must not be dropped or have a guaranteed channel to play on. find_channel find an unused channel pygame.mixer.find_channel(force=False): return Channel This will find and return an inactive Channel object. If there are no inactive Channels this function will return None. If there are no inactive channels and the force argument is True, this will find the Channel with the longest running Sound and return it. If the mixer has reserved channels from pygame.mixer.set_reserved() then those channels will not be returned here. get_busy test if any sound is being mixed pygame.mixer.get_busy(): return bool Returns True if the mixer is busy mixing any channels. If the mixer is idle then this return False. Sound Create a new Sound object from a file pygame.mixer.Sound(filename): return Sound pygame.mixer.Sound(buffer): return Sound pygame.mixer.Sound(object): return Sound Load a new sound buffer from a filename, a python file object or a readable buffer object. Limited resampling will be performed to help the sample match the initialize arguments for the mixer. The Sound object represents actual sound sample data. Methods that change the state of the Sound object will the all instances of the Sound playback. The Sound can be loaded from an OGG audio file or from an uncompressed WAV. Note: The buffer will be copied internally, no data will be shared between it and the Sound object. pygame.mixer.Sound(buffer) is new in pygame 1.8
    play begin sound playback Sound.play(loops=0, maxtime=0, fade_ms=0): return Channel Begin playback of the Sound (i.e., on the computer's speakers) on an available Channel. This will forcibly select a Channel, so playback may cut off a currently playing sound if necessary. The loops argument controls how many times the sample will be repeated after being played the first time. A value of 5 means that the sound will be played once, then repeated five times, and so is played a total of six times. The default value (zero) means the Sound is not repeated, and so is only played once. If loops is set to -1 the Sound will loop indefinitely (though you can still call stop() to stop it). The maxtime argument can be used to stop playback after a given number of milliseconds. The fade_ms argument will make the sound start playing at 0 volume and fade up to full volume over the time given. The sample may end before the fade-in is complete. This returns the Channel object for the channel that was selected. stop stop sound playback Sound.stop(): return None This will stop the playback of this Sound on any active Channels. fadeout stop sound playback after fading out Sound.fadeout(time): return None This will stop playback of the sound after fading it out over the time argument in milliseconds. The Sound will fade and stop on all actively playing channels. set_volume set the playback volume for this Sound Sound.set_volume(value): return None This will set the playback volume (loudness) for this Sound. This will immediately affect the Sound if it is playing. It will also affect any future playback of this Sound. The argument is a value from 0.0 to 1.0. get_volume get the playback volume Sound.get_volume(): return value Return a value from 0.0 to 1.0 representing the volume for this Sound. get_num_channels count how many times this Sound is playing Sound.get_num_channels(): return count Return the number of active channels this sound is playing on. get_length get the length of the Sound Sound.get_length(): return seconds Return the length of this Sound in seconds. get_buffer acquires a buffer object for the sameples of the Sound. Sound.get_buffer(): return BufferProxy Return a buffer object for the Sound samples. The buffer can be used for direct access and manipulation. New in pygame 1.8. Channel Create a Channel object for controlling playback pygame.mixer.Channel(id): return Channel Return a Channel object for one of the current channels. The id must be a value from 0 to the value of pygame.mixer.get_num_channels(). The Channel object can be used to get fine control over the playback of Sounds. A channel can only playback a single Sound at time. Using channels is entirely optional since pygame can manage them by default.
    play play a Sound on a specific Channel Channel.play(Sound, loops=0, maxtime=0, fade_ms=0): return None This will begin playback of a Sound on a specific Channel. If the Channel is currently playing any other Sound it will be stopped. The loops argument has the same meaning as in Sound.play(): it is the number of times to repeat the sound after the first time. If it is 3, the sound will be played 4 times (the first time, then three more). If loops is -1 then the playback will repeat indefinitely. As in Sound.play(), the maxtime argument can be used to stop playback of the Sound after a given number of milliseconds. As in Sound.play(), the fade_ms argument can be used fade in the sound. stop stop playback on a Channel Channel.stop(): return None Stop sound playback on a channel. After playback is stopped the channel becomes available for new Sounds to play on it. pause temporarily stop playback of a channel Channel.pause(): return None Temporarily stop the playback of sound on a channel. It can be resumed at a later time with Channel.unpause() unpause resume pause playback of a channel Channel.unpause(): return None Resume the playback on a paused channel. fadeout stop playback after fading channel out Channel.fadeout(time): return None Stop playback of a channel after fading out the sound over the given time argument in milliseconds. set_volume set the volume of a playing channel Channel.set_volume(value): return None Channel.set_volume(left, right): return None Set the volume (loudness) of a playing sound. When a channel starts to play its volume value is reset. This only affects the current sound. The value argument is between 0.0 and 1.0. If one argument is passed, it will be the volume of both speakers. If two arguments are passed and the mixer is in stereo mode, the first argument will be the volume of the left speaker and the second will be the volume of the right speaker. (If the second argument is None, the first argument will be the volume of both speakers.) If the channel is playing a Sound on which set_volume() has also been called, both calls are taken into account. For example: sound = pygame.mixer.Sound("s.wav") channel = s.play() # Sound plays at full volume by default sound.set_volume(0.9) # Now plays at 90% of full volume. sound.set_volume(0.6) # Now plays at 60% (previous value replaced). channel.set_volume(0.5) # Now plays at 30% (0.6 * 0.5). get_volume get the volume of the playing channel Channel.get_volume(): return value Return the volume of the channel for the current playing sound. This does not take into account stereo separation used by Channel.set_volume. The Sound object also has its own volume which is mixed with the channel. get_busy check if the channel is active Channel.get_busy(): return bool Returns true if the channel is activily mixing sound. If the channel is idle this returns False. get_sound get the currently playing Sound Channel.get_sound(): return Sound Return the actual Sound object currently playing on this channel. If the channel is idle None is returned. queue queue a Sound object to follow the current Channel.queue(Sound): return None When a Sound is queued on a Channel, it will begin playing immediately after the current Sound is finished. Each channel can only have a single Sound queued at a time. The queued Sound will only play if the current playback finished automatically. It is cleared on any other call to Channel.stop() or Channel.play(). If there is no sound actively playing on the Channel then the Sound will begin playing immediately. get_queue return any Sound that is queued Channel.get_queue(): return Sound If a Sound is already queued on this channel it will be returned. Once the queued sound begins playback it will no longer be on the queue. set_endevent have the channel send an event when playback stops Channel.set_endevent(): return None Channel.set_endevent(type): return None When an endevent is set for a channel, it will send an event to the pygame queue every time a sound finishes playing on that channel (not just the first time). Use pygame.event.get() to retrieve the endevent once it's sent. Note that if you called Sound.play(n) or Channel.play(sound,n), the end event is sent only once: after the sound has been played "n+1" times (see the documentation of Sound.play). If Channel.stop() or Channel.play() is called while the sound was still playing, the event will be posted immediately. The type argument will be the event id sent to the queue. This can be any valid event type, but a good choice would be a value between pygame.locals.USEREVENT and pygame.locals.NUMEVENTS. If no type argument is given then the Channel will stop sending endevents. get_endevent get the event a channel sends when playback stops Channel.get_endevent(): return type Returns the event type to be sent every time the Channel finishes playback of a Sound. If there is no endevent the function returns pygame.NOEVENT. pygame-1.9.1release/src/mixer.c0000644000175000017500000010112711207055754016332 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* * mixer module for pygame */ #define PYGAMEAPI_MIXER_INTERNAL #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" #include "mixer.h" /* Since they are documented, the default init values are defined here rather than taken from SDL_mixer. It also means that the default size is defined in Pygame, rather than SDL AUDIO_xxx, terms. */ #define PYGAME_MIXER_DEFAULT_FREQUENCY 22050 #define PYGAME_MIXER_DEFAULT_SIZE -16 #define PYGAME_MIXER_DEFAULT_CHANNELS 2 #define PYGAME_MIXER_DEFAULT_CHUNKSIZE 4096 static PyTypeObject PySound_Type; static PyTypeObject PyChannel_Type; static PyObject* PySound_New (Mix_Chunk*); static PyObject* PyChannel_New (int); #define PySound_Check(x) ((x)->ob_type == &PySound_Type) #define PyChannel_Check(x) ((x)->ob_type == &PyChannel_Type) /* Zero values will be replaced with defaults by _init(). */ static int request_frequency = PYGAME_MIXER_DEFAULT_FREQUENCY; static int request_size = PYGAME_MIXER_DEFAULT_SIZE; static int request_stereo = PYGAME_MIXER_DEFAULT_CHANNELS; static int request_chunksize = PYGAME_MIXER_DEFAULT_CHUNKSIZE; static int sound_init (PyObject* self, PyObject* arg, PyObject* kwarg); struct ChannelData { PyObject* sound; PyObject* queue; int endevent; }; static struct ChannelData *channeldata = NULL; static int numchanneldata = 0; Mix_Music** current_music; Mix_Music** queue_music; static void endsound_callback (int channel) { if (channeldata) { if (channeldata[channel].endevent && SDL_WasInit (SDL_INIT_VIDEO)) { SDL_Event e; memset (&e, 0, sizeof(e)); e.type = channeldata[channel].endevent; if (e.type >= SDL_USEREVENT && e.type < SDL_NUMEVENTS) e.user.code = channel; SDL_PushEvent (&e); } if (channeldata[channel].queue) { int channelnum; Mix_Chunk* sound = PySound_AsChunk (channeldata[channel].queue); Py_XDECREF (channeldata[channel].sound); channeldata[channel].sound = channeldata[channel].queue; channeldata[channel].queue = NULL; channelnum = Mix_PlayChannelTimed (channel, sound, 0, -1); if (channelnum != -1) Mix_GroupChannel (channelnum, (intptr_t)sound); } else { Py_XDECREF (channeldata[channel].sound); channeldata[channel].sound = NULL; } } } static void autoquit(void) { int i; if (SDL_WasInit (SDL_INIT_AUDIO)) { Mix_HaltMusic (); if (channeldata) { for (i = 0; i < numchanneldata; ++i) { Py_XDECREF (channeldata[i].sound); Py_XDECREF (channeldata[i].queue); } free (channeldata); channeldata = NULL; numchanneldata = 0; } if (current_music) { if (*current_music) { Mix_FreeMusic (*current_music); *current_music = NULL; } current_music = NULL; } if (queue_music) { if (*queue_music) { Mix_FreeMusic (*queue_music); *queue_music = NULL; } queue_music = NULL; } Mix_CloseAudio (); SDL_QuitSubSystem (SDL_INIT_AUDIO); } } static PyObject* _init (int freq, int size, int stereo, int chunk) { Uint16 fmt = 0; int i; if (!freq) { freq = request_frequency; } if (!size) { size = request_size; } if (!stereo) { stereo = request_stereo; } if (!chunk) { chunk = request_chunksize; } if (stereo >= 2) stereo = 2; else stereo = 1; /* printf("size:%d:\n", size); */ switch (size) { case 8: fmt = AUDIO_U8; break; case -8: fmt = AUDIO_S8; break; case 16: fmt = AUDIO_U16SYS; break; case -16: fmt = AUDIO_S16SYS; break; default: PyErr_Format(PyExc_ValueError, "unsupported size %i", size); return NULL; } /* printf("size:%d:\n", size); */ /*make chunk a power of 2*/ for (i = 0; 1 << i < chunk; ++i); //yes, semicolon on for loop chunk = MAX (1 << i, 256); if (!SDL_WasInit (SDL_INIT_AUDIO)) { PyGame_RegisterQuit (autoquit); if (!channeldata) /*should always be null*/ { numchanneldata = MIX_CHANNELS; channeldata = (struct ChannelData*) malloc (sizeof (struct ChannelData) *numchanneldata); for (i = 0; i < numchanneldata; ++i) { channeldata[i].sound = NULL; channeldata[i].queue = NULL; channeldata[i].endevent = 0; } } if (SDL_InitSubSystem (SDL_INIT_AUDIO) == -1) return PyInt_FromLong (0); if (Mix_OpenAudio (freq, fmt, stereo, chunk) == -1) { SDL_QuitSubSystem (SDL_INIT_AUDIO); return PyInt_FromLong (0); } #if MIX_MAJOR_VERSION>=1 && MIX_MINOR_VERSION>=2 && MIX_PATCHLEVEL>=3 Mix_ChannelFinished (endsound_callback); #endif /* A bug in sdl_mixer where the stereo is reversed for 8 bit. So we use this CPU hogging effect to reverse it for us. Hopefully this bug is fixed in SDL_mixer 1.2.9 printf("MIX_MAJOR_VERSION :%d: MIX_MINOR_VERSION :%d: MIX_PATCHLEVEL :%d: \n", MIX_MAJOR_VERSION, MIX_MINOR_VERSION, MIX_PATCHLEVEL); */ #if MIX_MAJOR_VERSION>=1 && MIX_MINOR_VERSION>=2 && MIX_PATCHLEVEL<=8 if(fmt == AUDIO_U8) { if(!Mix_SetReverseStereo(MIX_CHANNEL_POST, 1)) { /* We do nothing... because might as well just let it go ahead. */ /* return RAISE (PyExc_SDLError, Mix_GetError()); */ } } #endif Mix_VolumeMusic (127); } return PyInt_FromLong (1); } static PyObject* autoinit (PyObject* self, PyObject* arg) { int freq = 0, size = 0, stereo = 0, chunk = 0; if (!PyArg_ParseTuple (arg, "|iiii", &freq, &size, &stereo, &chunk)) return NULL; return _init (freq, size, stereo, chunk); } static PyObject* quit (PyObject* self) { autoquit (); Py_RETURN_NONE; } static PyObject* init (PyObject* self, PyObject* args, PyObject* keywds) { int freq = 0, size = 0, stereo = 0, chunk = 0; PyObject* result; int value; static char *kwids[] = {"frequency", "size", "channels", "buffer", NULL}; if (!PyArg_ParseTupleAndKeywords (args, keywds, "|iiii", kwids, &freq, &size, &stereo, &chunk)) { return NULL; } result = _init (freq, size, stereo, chunk); if (!result) return NULL; value = PyObject_IsTrue (result); Py_DECREF (result); if (!value) return RAISE (PyExc_SDLError, SDL_GetError()); Py_RETURN_NONE; } static PyObject* get_init (PyObject* self) { int freq, channels, realform; Uint16 format; if (!SDL_WasInit (SDL_INIT_AUDIO)) Py_RETURN_NONE; if (!Mix_QuerySpec (&freq, &format, &channels)) Py_RETURN_NONE; //create a signed or unsigned number of bits per sample // XXX: When mixer is init'd with a format of -8, this returns +8 realform = format&~0xff ? - (format&0xff) : format&0xff; return Py_BuildValue ("(iii)", freq, realform, channels); } static PyObject* pre_init (PyObject* self, PyObject* args, PyObject* keywds) { static char *kwids[] = {"frequency", "size", "channels", "buffer", NULL}; request_frequency = 0; request_size = 0; request_stereo = 0; request_chunksize = 0; if (!PyArg_ParseTupleAndKeywords (args, keywds, "|iiii", kwids, &request_frequency, &request_size, &request_stereo, &request_chunksize)) return NULL; if (!request_frequency) { request_frequency = PYGAME_MIXER_DEFAULT_FREQUENCY; } if (!request_size) { request_size = PYGAME_MIXER_DEFAULT_SIZE; } if (!request_stereo) { request_stereo = PYGAME_MIXER_DEFAULT_CHANNELS; } if (!request_chunksize) { request_chunksize = PYGAME_MIXER_DEFAULT_CHUNKSIZE; } Py_RETURN_NONE; } /* sound object methods */ static PyObject* snd_play (PyObject* self, PyObject* args, PyObject* kwargs) { Mix_Chunk* chunk = PySound_AsChunk (self); int channelnum = -1; int loops = 0, playtime = -1, fade_ms = 0; char *kwids[] = { "loops", "maxtime", "fade_ms", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|iii", kwids, &loops, &playtime, &fade_ms)) return NULL; if (fade_ms > 0) { channelnum = Mix_FadeInChannelTimed (-1, chunk, loops, fade_ms, playtime); } else { channelnum = Mix_PlayChannelTimed (-1, chunk, loops, playtime); } if (channelnum == -1) Py_RETURN_NONE; Py_XDECREF (channeldata[channelnum].sound); Py_XDECREF (channeldata[channelnum].queue); channeldata[channelnum].queue = NULL; channeldata[channelnum].sound = self; Py_INCREF (self); //make sure volume on this arbitrary channel is set to full Mix_Volume (channelnum, 128); Mix_GroupChannel (channelnum, (intptr_t)chunk); return PyChannel_New (channelnum); } static PyObject* snd_get_num_channels (PyObject* self) { Mix_Chunk* chunk = PySound_AsChunk (self); MIXER_INIT_CHECK (); return PyInt_FromLong (Mix_GroupCount ((intptr_t)chunk)); } static PyObject* snd_fadeout (PyObject* self, PyObject* args) { Mix_Chunk* chunk = PySound_AsChunk (self); int _time; if (!PyArg_ParseTuple (args, "i", &_time)) return NULL; MIXER_INIT_CHECK (); Mix_FadeOutGroup ((intptr_t)chunk, _time); Py_RETURN_NONE; } static PyObject* snd_stop (PyObject* self) { Mix_Chunk* chunk = PySound_AsChunk (self); MIXER_INIT_CHECK (); Mix_HaltGroup ((intptr_t)chunk); Py_RETURN_NONE; } static PyObject* snd_set_volume (PyObject* self, PyObject* args) { Mix_Chunk* chunk = PySound_AsChunk (self); float volume; if (!PyArg_ParseTuple (args, "f", &volume)) return NULL; MIXER_INIT_CHECK (); Mix_VolumeChunk (chunk, (int)(volume*128)); Py_RETURN_NONE; } static PyObject* snd_get_volume (PyObject* self) { Mix_Chunk* chunk = PySound_AsChunk (self); int volume; MIXER_INIT_CHECK (); volume = Mix_VolumeChunk (chunk, -1); return PyFloat_FromDouble (volume / 128.0); } static PyObject* snd_get_length (PyObject* self) { Mix_Chunk* chunk = PySound_AsChunk (self); int freq, channels, mixerbytes, numsamples; Uint16 format; MIXER_INIT_CHECK (); Mix_QuerySpec (&freq, &format, &channels); if (format==AUDIO_S8 || format==AUDIO_U8) mixerbytes = 1; else mixerbytes = 2; numsamples = chunk->alen / mixerbytes / channels; return PyFloat_FromDouble ((float)numsamples / (float)freq); } static PyObject* snd_get_buffer (PyObject* self) { PyObject *buffer; Mix_Chunk* chunk; MIXER_INIT_CHECK (); chunk = PySound_AsChunk (self); buffer = PyBufferProxy_New (self, chunk->abuf, (Py_ssize_t) chunk->alen, NULL); if (!buffer) return RAISE (PyExc_SDLError, "could acquire a buffer for the sound"); return buffer; } static PyMethodDef sound_methods[] = { { "play", (PyCFunction) snd_play, METH_VARARGS | METH_KEYWORDS, DOC_SOUNDPLAY }, { "get_num_channels", (PyCFunction) snd_get_num_channels, METH_NOARGS, DOC_SOUNDGETNUMCHANNELS }, { "fadeout", snd_fadeout, METH_VARARGS, DOC_SOUNDFADEOUT }, { "stop", (PyCFunction) snd_stop, METH_NOARGS, DOC_SOUNDSTOP }, { "set_volume", snd_set_volume, METH_VARARGS, DOC_SOUNDSETVOLUME }, { "get_volume", (PyCFunction) snd_get_volume, METH_NOARGS, DOC_SOUNDGETVOLUME }, { "get_length", (PyCFunction) snd_get_length, METH_NOARGS, DOC_SOUNDGETLENGTH }, { "get_buffer", (PyCFunction) snd_get_buffer, METH_NOARGS, DOC_SOUNDGETBUFFER }, { NULL, NULL, 0, NULL } }; /*sound object internals*/ static void sound_dealloc (PySoundObject* self) { Mix_Chunk* chunk = PySound_AsChunk ((PyObject*)self); if (chunk) Mix_FreeChunk (chunk); if (self->weakreflist) PyObject_ClearWeakRefs ((PyObject*)self); Py_TYPE(self)->tp_free ((PyObject*)self); } static PyTypeObject PySound_Type = { TYPE_HEAD (NULL, 0) "Sound", sizeof(PySoundObject), 0, (destructor)sound_dealloc, 0, 0, 0, /*setattr*/ 0, /*compare*/ 0, /*repr*/ 0, /*as_number*/ 0, /*as_sequence*/ 0, /*as_mapping*/ (hashfunc)NULL, /*hash*/ (ternaryfunc)NULL, /*call*/ (reprfunc)NULL, /*str*/ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ DOC_PYGAMEMIXERSOUND, /* Documentation string */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ offsetof(PySoundObject, weakreflist), /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ sound_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ sound_init, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ }; //PyType_GenericNew, /* tp_new */ /* channel object methods */ static PyObject* chan_play (PyObject* self, PyObject* args, PyObject* kwargs) { int channelnum = PyChannel_AsInt (self); PyObject* sound; Mix_Chunk* chunk; int loops = 0, playtime = -1, fade_ms = 0; char *kwids[] = { "Sound", "loops", "maxtime", "fade_ms", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!|iii", kwids, &PySound_Type, &sound, &loops, &playtime, &fade_ms)) return NULL; chunk = PySound_AsChunk (sound); if (fade_ms > 0) { channelnum = Mix_FadeInChannelTimed (channelnum, chunk, loops, fade_ms, playtime); } else { channelnum = Mix_PlayChannelTimed (channelnum, chunk, loops, playtime); } if (channelnum != -1) Mix_GroupChannel (channelnum, (intptr_t)chunk); Py_XDECREF (channeldata[channelnum].sound); Py_XDECREF (channeldata[channelnum].queue); channeldata[channelnum].sound = sound; channeldata[channelnum].queue = NULL; Py_INCREF (sound); Py_RETURN_NONE; } static PyObject* chan_queue (PyObject* self, PyObject* args) { int channelnum = PyChannel_AsInt (self); PyObject* sound; Mix_Chunk* chunk; if (!PyArg_ParseTuple (args, "O!", &PySound_Type, &sound)) return NULL; chunk = PySound_AsChunk (sound); if (!channeldata[channelnum].sound) /*nothing playing*/ { channelnum = Mix_PlayChannelTimed (channelnum, chunk, 0, -1); if (channelnum != -1) Mix_GroupChannel (channelnum, (intptr_t)chunk); channeldata[channelnum].sound = sound; Py_INCREF (sound); } else { Py_XDECREF (channeldata[channelnum].queue); channeldata[channelnum].queue = sound; Py_INCREF (sound); } Py_RETURN_NONE; } static PyObject* chan_get_busy (PyObject* self) { int channelnum = PyChannel_AsInt (self); MIXER_INIT_CHECK (); return PyInt_FromLong (Mix_Playing (channelnum)); } static PyObject* chan_fadeout (PyObject* self, PyObject* args) { int channelnum = PyChannel_AsInt (self); int _time; if (!PyArg_ParseTuple (args, "i", &_time)) return NULL; MIXER_INIT_CHECK (); Mix_FadeOutChannel (channelnum, _time); Py_RETURN_NONE; } static PyObject* chan_stop (PyObject* self) { int channelnum = PyChannel_AsInt (self); MIXER_INIT_CHECK (); Mix_HaltChannel (channelnum); Py_RETURN_NONE; } static PyObject* chan_pause (PyObject* self) { int channelnum = PyChannel_AsInt (self); MIXER_INIT_CHECK (); Mix_Pause (channelnum); Py_RETURN_NONE; } static PyObject* chan_unpause (PyObject* self) { int channelnum = PyChannel_AsInt (self); MIXER_INIT_CHECK (); Mix_Resume (channelnum); Py_RETURN_NONE; } static PyObject* chan_set_volume (PyObject* self, PyObject* args) { int channelnum = PyChannel_AsInt (self); float volume, stereovolume=-1.11f; int result; Uint8 left, right; if (!PyArg_ParseTuple (args, "f|f", &volume, &stereovolume)) return NULL; MIXER_INIT_CHECK (); #if MIX_MAJOR_VERSION>=1 && MIX_MINOR_VERSION>=2 && MIX_PATCHLEVEL>=1 if ((stereovolume <= -1.10f) && (stereovolume >= -1.12f)) { /* The normal volume will be used. No panning. so panning is * set to full. this is incase it was set previously to * something else. NOTE: there is no way to GetPanning * variables. */ left = 255; right = 255; if(!Mix_SetPanning(channelnum, left, right)) { return RAISE (PyExc_SDLError, Mix_GetError()); } } else { /* NOTE: here the volume will be set to 1.0 and the panning will * be used. */ left = (Uint8)(volume * 255); right = (Uint8)(stereovolume * 255); /* printf("left:%d: right:%d:\n", left, right); */ if(!Mix_SetPanning(channelnum, left, right)) { return RAISE (PyExc_SDLError, Mix_GetError()); } volume = 1.0f; } #else if (! ((stereovolume <= -1.10f) && (stereovolume >= -1.12f))) volume = (volume + stereovolume) * 0.5f; #endif result = Mix_Volume (channelnum, (int)(volume*128)); Py_RETURN_NONE; } static PyObject* chan_get_volume (PyObject* self) { int channelnum = PyChannel_AsInt (self); int volume; MIXER_INIT_CHECK (); volume = Mix_Volume (channelnum, -1); return PyFloat_FromDouble (volume / 128.0); } static PyObject* chan_get_sound (PyObject* self) { int channelnum = PyChannel_AsInt (self); PyObject* sound; sound = channeldata[channelnum].sound; if (!sound) Py_RETURN_NONE; Py_INCREF (sound); return sound; } static PyObject* chan_get_queue(PyObject* self) { int channelnum = PyChannel_AsInt (self); PyObject* sound; sound = channeldata[channelnum].queue; if (!sound) Py_RETURN_NONE; Py_INCREF (sound); return sound; } static PyObject* chan_set_endevent (PyObject* self, PyObject* args) { int channelnum = PyChannel_AsInt (self); int event = SDL_NOEVENT; if (!PyArg_ParseTuple (args, "|i", &event)) return NULL; channeldata[channelnum].endevent = event; Py_RETURN_NONE; } static PyObject* chan_get_endevent (PyObject* self) { int channelnum = PyChannel_AsInt (self); return PyInt_FromLong (channeldata[channelnum].endevent); } static PyMethodDef channel_methods[] = { { "play", (PyCFunction) chan_play, METH_KEYWORDS, DOC_CHANNELPLAY }, { "queue", chan_queue, METH_VARARGS, DOC_CHANNELQUEUE }, { "get_busy", (PyCFunction) chan_get_busy, METH_NOARGS, DOC_CHANNELGETBUSY }, { "fadeout", chan_fadeout, METH_VARARGS, DOC_CHANNELFADEOUT }, { "stop", (PyCFunction) chan_stop, METH_NOARGS, DOC_CHANNELSTOP }, { "pause", (PyCFunction) chan_pause, METH_NOARGS, DOC_CHANNELPAUSE }, { "unpause", (PyCFunction) chan_unpause, METH_NOARGS, DOC_CHANNELUNPAUSE }, { "set_volume", chan_set_volume, METH_VARARGS, DOC_CHANNELSETVOLUME }, { "get_volume", (PyCFunction) chan_get_volume, METH_NOARGS, DOC_CHANNELGETVOLUME }, { "get_sound", (PyCFunction) chan_get_sound, METH_NOARGS, DOC_CHANNELGETSOUND }, { "get_queue", (PyCFunction) chan_get_queue, METH_NOARGS, DOC_CHANNELGETQUEUE }, { "set_endevent", chan_set_endevent, METH_VARARGS, DOC_CHANNELSETENDEVENT }, { "get_endevent", (PyCFunction) chan_get_endevent, METH_NOARGS, DOC_CHANNELGETENDEVENT }, { NULL, NULL, 0, NULL } }; /* channel object internals */ static void channel_dealloc (PyObject* self) { PyObject_DEL (self); } static PyTypeObject PyChannel_Type = { TYPE_HEAD (NULL, 0) "Channel", /* name */ sizeof(PyChannelObject), /* basic size */ 0, /* itemsize */ channel_dealloc, /* dealloc */ 0, /* print */ 0, /* getattr */ 0, /* setattr */ 0, /* compare */ 0, /* repr */ 0, /* as_number */ 0, /* as_sequence */ 0, /* as_mapping */ (hashfunc)0, /* hash */ (ternaryfunc)0, /* call */ 0, /* str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* flags */ DOC_PYGAMEMIXERCHANNEL, /* Documentation string */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ channel_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ }; /*mixer module methods*/ static PyObject* get_num_channels (PyObject* self) { MIXER_INIT_CHECK (); return PyInt_FromLong (Mix_GroupCount (-1)); } static PyObject* set_num_channels (PyObject* self, PyObject* args) { int numchans, i; if (!PyArg_ParseTuple (args, "i", &numchans)) return NULL; MIXER_INIT_CHECK (); if (numchans > numchanneldata) { channeldata = (struct ChannelData*) realloc (channeldata, sizeof (struct ChannelData) * numchans); for (i = numchanneldata; i < numchans; ++i) { channeldata[i].sound = NULL; channeldata[i].queue = NULL; channeldata[i].endevent = 0; } numchanneldata = numchans; } Mix_AllocateChannels (numchans); Py_RETURN_NONE; } static PyObject* set_reserved (PyObject* self, PyObject* args) { int numchans; if (!PyArg_ParseTuple (args, "i", &numchans)) return NULL; MIXER_INIT_CHECK (); Mix_ReserveChannels (numchans); Py_RETURN_NONE; } static PyObject* get_busy (PyObject* self) { if (!SDL_WasInit (SDL_INIT_AUDIO)) return PyInt_FromLong (0); return PyInt_FromLong (Mix_Playing (-1)); } static PyObject* Channel (PyObject* self, PyObject* args) { int chan; if (!PyArg_ParseTuple (args, "i", &chan)) return NULL; MIXER_INIT_CHECK (); return PyChannel_New (chan); } static PyObject* mixer_find_channel (PyObject* self, PyObject* args) { int chan, force = 0; if (!PyArg_ParseTuple (args, "|i", &force)) return NULL; MIXER_INIT_CHECK (); chan = Mix_GroupAvailable (-1); if (chan == -1) { if (!force) Py_RETURN_NONE; chan = Mix_GroupOldest (-1); } return PyChannel_New (chan); } static PyObject* mixer_fadeout (PyObject* self, PyObject* args) { int _time; if (!PyArg_ParseTuple (args, "i", &_time)) return NULL; MIXER_INIT_CHECK (); Mix_FadeOutChannel (-1, _time); Py_RETURN_NONE; } static PyObject* mixer_stop (PyObject* self) { MIXER_INIT_CHECK (); Mix_HaltChannel (-1); Py_RETURN_NONE; } static PyObject* mixer_pause (PyObject* self) { MIXER_INIT_CHECK (); Mix_Pause (-1); Py_RETURN_NONE; } static PyObject* mixer_unpause (PyObject* self) { MIXER_INIT_CHECK (); Mix_Resume (-1); Py_RETURN_NONE; } static int sound_init (PyObject* self, PyObject* arg, PyObject* kwarg) { PyObject* file; char* name = NULL; Mix_Chunk* chunk = NULL; ((PySoundObject*)self)->chunk = NULL; if (!PyArg_ParseTuple (arg, "O", &file)) return -1; if (!SDL_WasInit (SDL_INIT_AUDIO)) { RAISE (PyExc_SDLError, "mixer system not initialized"); return -1; } #if PY3 Py_INCREF (file); if (PyUnicode_Check (file)) { PyObject *tmp = PyUnicode_AsASCIIString (file); if (tmp == NULL) { goto error; } Py_DECREF (file); file = tmp; } if (Bytes_Check (file)) #else if (PyString_Check (file) || PyUnicode_Check (file)) #endif { if (PyArg_ParseTuple (arg, "s", &name)) { Py_BEGIN_ALLOW_THREADS; chunk = Mix_LoadWAV (name); Py_END_ALLOW_THREADS; } } if (!chunk) { const void *buf; Py_ssize_t buflen; if (PyObject_AsReadBuffer (file, &buf, &buflen) == 0) { chunk = malloc (sizeof (Mix_Chunk)); if (!chunk) { RAISE (PyExc_MemoryError, "cannot allocate chunk"); goto error; } chunk->alen = buflen; chunk->abuf = malloc ((size_t) buflen); if (!chunk->abuf) { free (chunk); RAISE (PyExc_MemoryError, "cannot allocate chunk"); goto error; } chunk->allocated = 1; chunk->volume = 128; memcpy (chunk->abuf, buf, (size_t) buflen); } else PyErr_Clear (); } if (!chunk) { SDL_RWops *rw; if (!(rw = RWopsFromPython (file))) goto error; if (RWopsCheckPython (rw)) chunk = Mix_LoadWAV_RW (rw, 1); else { Py_BEGIN_ALLOW_THREADS; chunk = Mix_LoadWAV_RW (rw, 1); Py_END_ALLOW_THREADS; } } if (!chunk) { RAISE (PyExc_SDLError, SDL_GetError ()); goto error; } ((PySoundObject*)self)->chunk = chunk; #if PY3 Py_DECREF (file); #endif return 0; error: #if PY3 Py_DECREF (file); #endif return -1; } static PyMethodDef _mixer_methods[] = { { "__PYGAMEinit__", autoinit, METH_VARARGS, "auto initialize for mixer" }, { "init", (PyCFunction) init, METH_VARARGS | METH_KEYWORDS, DOC_PYGAMEMIXERINIT }, { "quit", (PyCFunction) quit, METH_NOARGS, DOC_PYGAMEMIXERQUIT }, { "get_init", (PyCFunction) get_init, METH_NOARGS, DOC_PYGAMEMIXERGETINIT }, { "pre_init", (PyCFunction) pre_init, METH_VARARGS | METH_KEYWORDS, DOC_PYGAMEMIXERPREINIT }, { "get_num_channels", (PyCFunction) get_num_channels, METH_NOARGS, DOC_PYGAMEMIXERGETNUMCHANNELS }, { "set_num_channels", set_num_channels, METH_VARARGS, DOC_PYGAMEMIXERSETNUMCHANNELS }, { "set_reserved", set_reserved, METH_VARARGS, DOC_PYGAMEMIXERSETRESERVED }, { "get_busy", (PyCFunction) get_busy, METH_NOARGS, DOC_PYGAMEMIXERGETBUSY }, { "Channel", Channel, METH_VARARGS, DOC_PYGAMEMIXERCHANNEL }, { "find_channel", mixer_find_channel, METH_VARARGS, DOC_PYGAMEMIXERFINDCHANNEL }, { "fadeout", mixer_fadeout, METH_VARARGS, DOC_PYGAMEMIXERFADEOUT }, { "stop", (PyCFunction) mixer_stop, METH_NOARGS, DOC_PYGAMEMIXERSTOP }, { "pause", (PyCFunction) mixer_pause, METH_NOARGS, DOC_PYGAMEMIXERPAUSE }, { "unpause", (PyCFunction) mixer_unpause, METH_NOARGS, DOC_PYGAMEMIXERUNPAUSE }, /* { "lookup_frequency", lookup_frequency, 1, doc_lookup_frequency },*/ { NULL, NULL, 0, NULL } }; static PyObject* PySound_New (Mix_Chunk* chunk) { PySoundObject* soundobj; if (!chunk) return RAISE (PyExc_RuntimeError, "unable to create sound."); soundobj = (PySoundObject *)PySound_Type.tp_new (&PySound_Type, NULL, NULL); if (soundobj) soundobj->chunk = chunk; return (PyObject*)soundobj; } static PyObject* PyChannel_New (int channelnum) { PyChannelObject* chanobj; if (channelnum < 0 || channelnum >= Mix_GroupCount (-1)) return RAISE (PyExc_IndexError, "invalid channel index"); chanobj = PyObject_NEW (PyChannelObject, &PyChannel_Type); if (!chanobj) return NULL; chanobj->chan = channelnum; return (PyObject*)chanobj; } MODINIT_DEFINE (mixer) { PyObject *module, *dict, *apiobj, *music=NULL; int ecode; static void* c_api[PYGAMEAPI_MIXER_NUMSLOTS]; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "mixer", DOC_PYGAMEMIXER, -1, _mixer_methods, NULL, NULL, NULL, NULL }; #endif PyMIXER_C_API[0] = PyMIXER_C_API[0]; /*this cleans an unused warning*/ /* imported needed apis; Do this first so if there is an error the module is not loaded. */ /*imported needed apis*/ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_rwobject (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_bufferproxy (); if (PyErr_Occurred ()) { MODINIT_ERROR; } /* type preparation */ if (PyType_Ready (&PySound_Type) < 0) { MODINIT_ERROR; } if (PyType_Ready (&PyChannel_Type) < 0) { MODINIT_ERROR; } /* create the module */ PySound_Type.tp_new = &PyType_GenericNew; #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "mixer", _mixer_methods, DOC_PYGAMEMIXER); #endif if (module == NULL) { MODINIT_ERROR; } dict = PyModule_GetDict (module); if (PyDict_SetItemString (dict, "Sound", (PyObject *)&PySound_Type) < 0) { DECREF_MOD (module); MODINIT_ERROR; } if (PyDict_SetItemString (dict, "SoundType", (PyObject *)&PySound_Type) < 0) { DECREF_MOD (module); MODINIT_ERROR; } if (PyDict_SetItemString (dict, "ChannelType", (PyObject *)&PyChannel_Type) < 0) { DECREF_MOD (module); MODINIT_ERROR; } /* export the c api */ c_api[0] = &PySound_Type; c_api[1] = PySound_New; c_api[2] = snd_play; c_api[3] = &PyChannel_Type; c_api[4] = PyChannel_New; c_api[5] = autoinit; c_api[6] = autoquit; apiobj = PyCObject_FromVoidPtr (c_api, NULL); if (apiobj == NULL) { DECREF_MOD (module); MODINIT_ERROR; } ecode = PyDict_SetItemString (dict, PYGAMEAPI_LOCAL_ENTRY, apiobj); Py_DECREF (apiobj); if (ecode < 0) { DECREF_MOD (module); MODINIT_ERROR; } music = PyImport_ImportModule(IMPPREFIX "mixer_music"); if (!music) { PyErr_Clear (); /* try loading it under this name... */ #if PY_VERSION_HEX >= 0x02060000 /* Is this Python 2.6 or greater? */ /* Use relative paths. */ music = PyImport_ImportModule(".mixer_music"); #else music = PyImport_ImportModule("mixer_music"); #endif /*printf("NOTE3: here in mixer.c...\n"); */ } if (music != NULL) { PyObject* ptr, *_dict; /* printf("NOTE: failed loading pygame.mixer_music in src/mixer.c\n"); */ if (PyModule_AddObject (module, "music", music) < 0) { DECREF_MOD (module); Py_DECREF (music); MODINIT_ERROR; } _dict = PyModule_GetDict (music); ptr = PyDict_GetItemString (_dict, "_MUSIC_POINTER"); current_music = (Mix_Music**)PyCObject_AsVoidPtr (ptr); ptr = PyDict_GetItemString (_dict, "_QUEUE_POINTER"); queue_music = (Mix_Music**)PyCObject_AsVoidPtr (ptr); } else /*music module not compiled? cleanly ignore*/ { current_music = NULL; PyErr_Clear (); } MODINIT_RETURN (module); } pygame-1.9.1release/src/mask.h0000644000175000017500000000252111202451362016132 0ustar vincentvincent#include #include "bitmask.h" #define PYGAMEAPI_MASK_NUMSLOTS 1 #define PYGAMEAPI_LOCAL_ENTRY "_PYGAME_C_API" typedef struct { PyObject_HEAD bitmask_t *mask; } PyMaskObject; #define PyMask_AsBitmap(x) (((PyMaskObject*)x)->mask) #ifndef PYGAMEAPI_MASK_INTERNAL #define PyMask_Type (*(PyTypeObject*)PyMASK_C_API[0]) #define PyMask_Check(x) ((x)->ob_type == &PyMask_Type) #define import_pygame_mask() { \ PyObject *module = PyImport_ImportModule(IMPPREFIX "mask"); \ if (module != NULL) { \ PyObject *dict = PyModule_GetDict(module); \ PyObject *c_api = PyDict_GetItemString(dict, PYGAMEAPI_LOCAL_ENTRY); \ if(PyCObject_Check(c_api)) { \ void** localptr = (void**) PyCObject_AsVoidPtr(c_api); \ memcpy(PyMASK_C_API, localptr, sizeof(void*)*PYGAMEAPI_MASK_NUMSLOTS); \ } Py_DECREF(module); \ } \ } #endif /* !defined(PYGAMEAPI_MASK_INTERNAL) */ static void* PyMASK_C_API[PYGAMEAPI_MASK_NUMSLOTS] = {NULL}; pygame-1.9.1release/src/mask.doc0000644000175000017500000001346511206703402016460 0ustar vincentvincentpygame.mask pygame module for image masks. Useful for fast pixel perfect collision detection. A Mask uses 1bit per pixel to store which parts collide. New in pygame 1.8.
    from_surface Returns a Mask from the given surface. pygame.mask.from_surface(Surface, threshold = 127) -> Mask Makes the transparent parts of the Surface not set, and the opaque parts set. The alpha of each pixel is checked to see if it is greater than the given threshold. If the Surface is color keyed, then threshold is not used. from_threshold Creates a mask by thresholding Surfaces pygame.mask.from_surface(Surface, color, threshold = (0,0,0,255), othersurface = None, palette_colors = 1) -> Mask This is a more featureful method of getting a Mask from a Surface. If supplied with only one Surface, all pixels within the threshold of the supplied color are set in the Mask. If given the optional othersurface, all pixels in Surface that are within the threshold of the corresponding pixel in othersurface are set in the Mask. Mask pygame object for representing 2d bitmasks pygame.Mask((width, height)): return Mask
    get_size Returns the size of the mask. Mask.get_size() -> width,height get_at Returns nonzero if the bit at (x,y) is set. Mask.get_at((x,y)) -> int Coordinates start at (0,0) is top left - just like Surfaces. set_at Sets the position in the mask given by x and y. Mask.set_at((x,y),value) overlap Returns the point of intersection if the masks overlap with the given offset - or None if it does not overlap. Mask.overlap(othermask, offset) -> x,y The overlap tests uses the following offsets (which may be negative): +----+----------.. |A | yoffset | +-+----------.. +--|B |xoffset | | : : overlap_area Returns the number of overlapping 'pixels'. Mask.overlap_area(othermask, offset) -> numpixels You can see how many pixels overlap with the other mask given. This can be used to see in which direction things collide, or to see how much the two masks collide. An approximate collision normal can be found by calculating the gradient of the overlap area through the finite difference. dx = Mask.overlap_area(othermask,(x+1,y)) - Mask.overlap_area(othermask,(x-1,y)) dy = Mask.overlap_area(othermask,(x,y+1)) - Mask.overlap_area(othermask,(x,y-1)) overlap_mask Returns a mask of the overlapping pixels Mask.overlap_mask(othermask, offset) -> Mask Returns a Mask the size of the original Mask containing only the overlapping pixels between Mask and othermask. fill Sets all bits to 1 Mask.fill() Sets all bits in a Mask to 1. clear Sets all bits to 0 Mask.clear() Sets all bits in a Mask to 0. invert Flips the bits in a Mask Mask.invert() Flips all of the bits in a Mask, so that the set pixels turn to unset pixels and the unset pixels turn to set pixels. scale Resizes a mask Mask.scale((x, y)) -> Mask Returns a new Mask of the Mask scaled to the requested size. draw Draws a mask onto another Mask.draw(othermask, offset) Performs a bitwise OR, drawing othermask onto Mask. erase Erases a mask from another Mask.erase(othermask, offset) Erases all pixels set in othermask from Mask. count Returns the number of set pixels Mask.count() -> pixels Returns the number of set pixels in the Mask. centroid Returns the centroid of the pixels in a Mask Mask.centroid() -> (x, y) Finds the centroid, the center of pixel mass, of a Mask. Returns a coordinate tuple for the centroid of the Mask. In the event the Mask is empty, it will return (0,0). angle Returns the orientation of the pixels Mask.angle() -> theta Finds the approximate orientation of the pixels in the image from -90 to 90 degrees. This works best if performed on one connected component of pixels. It will return 0.0 on an empty Mask. outline list of points outlining an object Mask.outline(every = 1) -> [(x,y), (x,y) ...] Returns a list of points of the outline of the first object it comes across in a Mask. For this to be useful, there should probably only be one connected component of pixels in the Mask. The every option allows you to skip pixels in the outline. For example, setting it to 10 would return a list of every 10th pixel in the outline. convolve Return the convolution of self with another mask. Mask.convolve(othermask, outputmask = None, offset = (0,0)) -> Mask Returns a mask with the (i-offset[0],j-offset[1]) bit set if shifting othermask so that it's lower right corner pixel is at (i,j) would cause it to overlap with self. If an outputmask is specified, the output is drawn onto outputmask and outputmask is returned. Otherwise a mask of size self.get_size() + othermask.get_size() - (1,1) is created. connected_component Returns a mask of a connected region of pixels. Mask.connected_component((x,y) = None) -> Mask This uses the SAUF algorithm to find a connected component in the Mask. It checks 8 point connectivity. By default, it will return the largest connected component in the image. Optionally, a coordinate pair of a pixel can be specified, and the connected component containing it will be returned. In the event the pixel at that location is not set, the returned Mask will be empty. The Mask returned is the same size as the original Mask. connected_components Returns a list of masks of connected regions of pixels. Mask.connected_components(min = 0) -> [Masks] Returns a list of masks of connected regions of pixels. An optional minimum number of pixels per connected region can be specified to filter out noise. get_bounding_rects Returns a list of bounding rects of regions of set pixels. Mask.get_bounding_rects() -> Rects This gets a bounding rect of connected regions of set pixels. A bounding rect is one for which each of the connected pixels is inside the rect. pygame-1.9.1release/src/mask.c0000644000175000017500000013276111216024112016131 0ustar vincentvincent/* Copyright (C) 2002-2007 Ulf Ekstrom except for the bitcount function. This wrapper code was originally written by Danny van Bruggen(?) for the SCAM library, it was then converted by Ulf Ekstrom to wrap the bitmask library, a spinoff from SCAM. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* a couple of print debugging helpers */ /* #define CALLLOG2(x,y) fprintf(stderr, (x), (y)); #define CALLLOG(x) fprintf(stderr, (x)); */ #define PYGAMEAPI_MASK_INTERNAL 1 #include "mask.h" #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" #include "structmember.h" #include "bitmask.h" #include #ifndef M_PI #define M_PI 3.14159265358979323846 #endif static PyTypeObject PyMask_Type; /* mask object methods */ static PyObject* mask_get_size(PyObject* self, PyObject* args) { bitmask_t *mask = PyMask_AsBitmap(self); if(!PyArg_ParseTuple(args, "")) return NULL; return Py_BuildValue("(ii)", mask->w, mask->h); } static PyObject* mask_get_at(PyObject* self, PyObject* args) { bitmask_t *mask = PyMask_AsBitmap(self); int x, y, val; if(!PyArg_ParseTuple(args, "(ii)", &x, &y)) return NULL; if (x >= 0 && x < mask->w && y >= 0 && y < mask->h) { val = bitmask_getbit(mask, x, y); } else { PyErr_Format(PyExc_IndexError, "%d, %d is out of bounds", x, y); return NULL; } return PyInt_FromLong(val); } static PyObject* mask_set_at(PyObject* self, PyObject* args) { bitmask_t *mask = PyMask_AsBitmap(self); int x, y, value = 1; if(!PyArg_ParseTuple(args, "(ii)|i", &x, &y, &value)) return NULL; if (x >= 0 && x < mask->w && y >= 0 && y < mask->h) { if (value) { bitmask_setbit(mask, x, y); } else { bitmask_clearbit(mask, x, y); } } else { PyErr_Format(PyExc_IndexError, "%d, %d is out of bounds", x, y); return NULL; } Py_INCREF(Py_None); return Py_None; } static PyObject* mask_overlap(PyObject* self, PyObject* args) { bitmask_t *mask = PyMask_AsBitmap(self); bitmask_t *othermask; PyObject *maskobj; int x, y, val; int xp,yp; if(!PyArg_ParseTuple(args, "O!(ii)", &PyMask_Type, &maskobj, &x, &y)) return NULL; othermask = PyMask_AsBitmap(maskobj); val = bitmask_overlap_pos(mask, othermask, x, y, &xp, &yp); if (val) { return Py_BuildValue("(ii)", xp,yp); } else { Py_INCREF(Py_None); return Py_None; } } static PyObject* mask_overlap_area(PyObject* self, PyObject* args) { bitmask_t *mask = PyMask_AsBitmap(self); bitmask_t *othermask; PyObject *maskobj; int x, y, val; if(!PyArg_ParseTuple(args, "O!(ii)", &PyMask_Type, &maskobj, &x, &y)) { return NULL; } othermask = PyMask_AsBitmap(maskobj); val = bitmask_overlap_area(mask, othermask, x, y); return PyInt_FromLong(val); } static PyObject* mask_overlap_mask(PyObject* self, PyObject* args) { int x, y; bitmask_t *mask = PyMask_AsBitmap(self); bitmask_t *output = bitmask_create(mask->w, mask->h); bitmask_t *othermask; PyObject *maskobj; PyMaskObject *maskobj2 = PyObject_New(PyMaskObject, &PyMask_Type); if(!PyArg_ParseTuple(args, "O!(ii)", &PyMask_Type, &maskobj, &x, &y)) { return NULL; } othermask = PyMask_AsBitmap(maskobj); bitmask_overlap_mask(mask, othermask, output, x, y); if(maskobj2) maskobj2->mask = output; return (PyObject*)maskobj2; } static PyObject* mask_fill(PyObject* self, PyObject* args) { bitmask_t *mask = PyMask_AsBitmap(self); bitmask_fill(mask); Py_RETURN_NONE; } static PyObject* mask_clear(PyObject* self, PyObject* args) { bitmask_t *mask = PyMask_AsBitmap(self); bitmask_clear(mask); Py_RETURN_NONE; } static PyObject* mask_invert(PyObject* self, PyObject* args) { bitmask_t *mask = PyMask_AsBitmap(self); bitmask_invert(mask); Py_RETURN_NONE; } static PyObject* mask_scale(PyObject* self, PyObject* args) { int x, y; bitmask_t *input = PyMask_AsBitmap(self); bitmask_t *output; PyMaskObject *maskobj = PyObject_New(PyMaskObject, &PyMask_Type); if(!PyArg_ParseTuple(args, "(ii)", &x, &y)) { return NULL; } output = bitmask_scale(input, x, y); if(maskobj) maskobj->mask = output; return (PyObject*)maskobj; } static PyObject* mask_draw(PyObject* self, PyObject* args) { bitmask_t *mask = PyMask_AsBitmap(self); bitmask_t *othermask; PyObject *maskobj; int x, y; if(!PyArg_ParseTuple(args, "O!(ii)", &PyMask_Type, &maskobj, &x, &y)) { return NULL; } othermask = PyMask_AsBitmap(maskobj); bitmask_draw(mask, othermask, x, y); Py_RETURN_NONE; } static PyObject* mask_erase(PyObject* self, PyObject* args) { bitmask_t *mask = PyMask_AsBitmap(self); bitmask_t *othermask; PyObject *maskobj; int x, y; if(!PyArg_ParseTuple(args, "O!(ii)", &PyMask_Type, &maskobj, &x, &y)) { return NULL; } othermask = PyMask_AsBitmap(maskobj); bitmask_erase(mask, othermask, x, y); Py_RETURN_NONE; } static PyObject* mask_count(PyObject* self, PyObject* args) { bitmask_t *m = PyMask_AsBitmap(self); return PyInt_FromLong(bitmask_count(m)); } static PyObject* mask_centroid(PyObject* self, PyObject* args) { bitmask_t *mask = PyMask_AsBitmap(self); int x, y; long int m10, m01, m00; PyObject *xobj, *yobj; m10 = m01 = m00 = 0; for (x = 0; x < mask->w; x++) { for (y = 0; y < mask->h; y++) { if (bitmask_getbit(mask, x, y)) { m10 += x; m01 += y; m00++; } } } if (m00) { xobj = PyInt_FromLong(m10/m00); yobj = PyInt_FromLong(m01/m00); } else { xobj = PyInt_FromLong(0); yobj = PyInt_FromLong(0); } return Py_BuildValue("(NN)", xobj, yobj); } static PyObject* mask_angle(PyObject* self, PyObject* args) { bitmask_t *mask = PyMask_AsBitmap(self); int x, y, xc, yc; long int m10, m01, m00, m20, m02, m11; double theta; m10 = m01 = m00 = m20 = m02 = m11 = 0; for (x = 0; x < mask->w; x++) { for (y = 0; y < mask->h; y++) { if (bitmask_getbit(mask, x, y)) { m10 += x; m20 += x*x; m11 += x*y; m02 += y*y; m01 += y; m00++; } } } if (m00) { xc = m10/m00; yc = m01/m00; theta = -90.0*atan2(2*(m11/m00 - xc*yc),(m20/m00 - xc*xc)-(m02/m00 - yc*yc))/M_PI; return PyFloat_FromDouble(theta); } else { return PyFloat_FromDouble(0); } } static PyObject* mask_outline(PyObject* self, PyObject* args) { bitmask_t* c = PyMask_AsBitmap(self); bitmask_t* m = bitmask_create(c->w + 2, c->h + 2); PyObject *plist, *value; int x, y, every, e, firstx, firsty, secx, secy, currx, curry, nextx, nexty, n; int a[14], b[14]; a[0] = a[1] = a[7] = a[8] = a[9] = b[1] = b[2] = b[3] = b[9] = b[10] = b[11]= 1; a[2] = a[6] = a[10] = b[4] = b[0] = b[12] = b[8] = 0; a[3] = a[4] = a[5] = a[11] = a[12] = a[13] = b[5] = b[6] = b[7] = b[13] = -1; plist = NULL; plist = PyList_New (0); if (!plist) return NULL; every = 1; n = firstx = firsty = secx = x = 0; if(!PyArg_ParseTuple(args, "|i", &every)) { return NULL; } /* by copying to a new, larger mask, we avoid having to check if we are at a border pixel every time. */ bitmask_draw(m, c, 1, 1); e = every; /* find the first set pixel in the mask */ for (y = 1; y < m->h-1; y++) { for (x = 1; x < m->w-1; x++) { if (bitmask_getbit(m, x, y)) { firstx = x; firsty = y; value = Py_BuildValue("(ii)", x-1, y-1); PyList_Append(plist, value); Py_DECREF(value); break; } } if (bitmask_getbit(m, x, y)) break; } /* covers the mask having zero pixels or only the final pixel */ if ((x == m->w-1) && (y == m->h-1)) { bitmask_free(m); return plist; } /* check just the first pixel for neighbors */ for (n = 0;n < 8;n++) { if (bitmask_getbit(m, x+a[n], y+b[n])) { currx = secx = x+a[n]; curry = secy = y+b[n]; e--; if (!e) { e = every; value = Py_BuildValue("(ii)", secx-1, secy-1); PyList_Append(plist, value); Py_DECREF(value); } break; } } /* if there are no neighbors, return */ if (!secx) { bitmask_free(m); return plist; } /* the outline tracing loop */ for (;;) { /* look around the pixel, it has to have a neighbor */ for (n = (n + 6) & 7;;n++) { if (bitmask_getbit(m, currx+a[n], curry+b[n])) { nextx = currx+a[n]; nexty = curry+b[n]; e--; if (!e) { e = every; if ((curry == firsty && currx == firstx) && (secx == nextx && secy == nexty)) { break; } value = Py_BuildValue("(ii)", nextx-1, nexty-1); PyList_Append(plist, value); Py_DECREF(value); } break; } } /* if we are back at the first pixel, and the next one will be the second one we visited, we are done */ if ((curry == firsty && currx == firstx) && (secx == nextx && secy == nexty)) { break; } curry = nexty; currx = nextx; } bitmask_free(m); return plist; } static PyObject* mask_convolve(PyObject* aobj, PyObject* args) { PyObject *bobj, *oobj = Py_None; bitmask_t *a, *b, *o; int xoffset = 0, yoffset = 0; if (!PyArg_ParseTuple (args, "O!|O(ii)", &PyMask_Type, &bobj, &oobj, &xoffset, &yoffset)) return NULL; a = PyMask_AsBitmap(aobj); b = PyMask_AsBitmap(bobj); if (oobj == Py_None) { PyMaskObject *result = PyObject_New(PyMaskObject, &PyMask_Type); result->mask = bitmask_create(a->w + b->w - 1, a->h + b->h - 1); oobj = (PyObject*) result; } else Py_INCREF(oobj); o = PyMask_AsBitmap(oobj); bitmask_convolve(a, b, o, xoffset, yoffset); return oobj; } static PyObject* mask_from_surface(PyObject* self, PyObject* args) { bitmask_t *mask; SDL_Surface* surf; PyObject* surfobj; PyMaskObject *maskobj; int x, y, threshold, ashift, aloss, usethresh; Uint8 *pixels; SDL_PixelFormat *format; Uint32 color, amask; Uint8 *pix; Uint8 a; /* set threshold as 127 default argument. */ threshold = 127; /* get the surface from the passed in arguments. * surface, threshold */ if (!PyArg_ParseTuple (args, "O!|i", &PySurface_Type, &surfobj, &threshold)) { return NULL; } surf = PySurface_AsSurface(surfobj); /* lock the surface, release the GIL. */ PySurface_Lock (surfobj); Py_BEGIN_ALLOW_THREADS; /* get the size from the surface, and create the mask. */ mask = bitmask_create(surf->w, surf->h); if(!mask) { /* Py_END_ALLOW_THREADS; */ return NULL; /*RAISE(PyExc_Error, "cannot create bitmask");*/ } pixels = (Uint8 *) surf->pixels; format = surf->format; amask = format->Amask; ashift = format->Ashift; aloss = format->Aloss; usethresh = !(surf->flags & SDL_SRCCOLORKEY); for(y=0; y < surf->h; y++) { pixels = (Uint8 *) surf->pixels + y*surf->pitch; for(x=0; x < surf->w; x++) { /* Get the color. TODO: should use an inline helper * function for this common function. */ switch (format->BytesPerPixel) { case 1: color = (Uint32)*((Uint8 *) pixels); pixels++; break; case 2: color = (Uint32)*((Uint16 *) pixels); pixels += 2; break; case 3: pix = ((Uint8 *) pixels); pixels += 3; #if SDL_BYTEORDER == SDL_LIL_ENDIAN color = (pix[0]) + (pix[1] << 8) + (pix[2] << 16); #else color = (pix[2]) + (pix[1] << 8) + (pix[0] << 16); #endif break; default: /* case 4: */ color = *((Uint32 *) pixels); pixels += 4; break; } if (usethresh) { a = ((color & amask) >> ashift) << aloss; /* no colorkey, so we check the threshold of the alpha */ if (a > threshold) { bitmask_setbit(mask, x, y); } } else { /* test against the colour key. */ if (format->colorkey != color) { bitmask_setbit(mask, x, y); } } } } Py_END_ALLOW_THREADS; /* unlock the surface, release the GIL. */ PySurface_Unlock (surfobj); /*create the new python object from mask*/ maskobj = PyObject_New(PyMaskObject, &PyMask_Type); if(maskobj) maskobj->mask = mask; return (PyObject*)maskobj; } /* palette_colors - this only affects surfaces with a palette if true we look at the colors from the palette, otherwise we threshold the pixel values. This is useful if the surface is actually greyscale colors, and not palette colors. */ void bitmask_threshold (bitmask_t *m, SDL_Surface *surf, SDL_Surface *surf2, Uint32 color, Uint32 threshold, int palette_colors) { int x, y, rshift, gshift, bshift, rshift2, gshift2, bshift2; int rloss, gloss, bloss, rloss2, gloss2, bloss2; Uint8 *pixels, *pixels2; SDL_PixelFormat *format, *format2; Uint32 the_color, the_color2, rmask, gmask, bmask, rmask2, gmask2, bmask2; Uint8 *pix; Uint8 r, g, b, a; Uint8 tr, tg, tb, ta; int bpp1, bpp2; pixels = (Uint8 *) surf->pixels; format = surf->format; rmask = format->Rmask; gmask = format->Gmask; bmask = format->Bmask; rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; rloss = format->Rloss; gloss = format->Gloss; bloss = format->Bloss; bpp1 = surf->format->BytesPerPixel; if(surf2) { format2 = surf2->format; rmask2 = format2->Rmask; gmask2 = format2->Gmask; bmask2 = format2->Bmask; rshift2 = format2->Rshift; gshift2 = format2->Gshift; bshift2 = format2->Bshift; rloss2 = format2->Rloss; gloss2 = format2->Gloss; bloss2 = format2->Bloss; pixels2 = (Uint8 *) surf2->pixels; bpp2 = surf->format->BytesPerPixel; } else { /* make gcc stop complaining */ rmask2 = gmask2 = bmask2 = 0; rshift2 = gshift2 = bshift2 = 0; rloss2 = gloss2 = bloss2 = 0; format2 = NULL; pixels2 = NULL; bpp2 = 0; } SDL_GetRGBA (color, format, &r, &g, &b, &a); SDL_GetRGBA (threshold, format, &tr, &tg, &tb, &ta); for(y=0; y < surf->h; y++) { pixels = (Uint8 *) surf->pixels + y*surf->pitch; if (surf2) { pixels2 = (Uint8 *) surf2->pixels + y*surf2->pitch; } for(x=0; x < surf->w; x++) { /* the_color = surf->get_at(x,y) */ switch (bpp1) { case 1: the_color = (Uint32)*((Uint8 *) pixels); pixels++; break; case 2: the_color = (Uint32)*((Uint16 *) pixels); pixels += 2; break; case 3: pix = ((Uint8 *) pixels); pixels += 3; #if SDL_BYTEORDER == SDL_LIL_ENDIAN the_color = (pix[0]) + (pix[1] << 8) + (pix[2] << 16); #else the_color = (pix[2]) + (pix[1] << 8) + (pix[0] << 16); #endif break; default: /* case 4: */ the_color = *((Uint32 *) pixels); pixels += 4; break; } if (surf2) { switch (bpp2) { case 1: the_color2 = (Uint32)*((Uint8 *) pixels2); pixels2++; break; case 2: the_color2 = (Uint32)*((Uint16 *) pixels2); pixels2 += 2; break; case 3: pix = ((Uint8 *) pixels2); pixels2 += 3; #if SDL_BYTEORDER == SDL_LIL_ENDIAN the_color2 = (pix[0]) + (pix[1] << 8) + (pix[2] << 16); #else the_color2 = (pix[2]) + (pix[1] << 8) + (pix[0] << 16); #endif break; default: /* case 4: */ the_color2 = *((Uint32 *) pixels2); pixels2 += 4; break; } /* TODO: will need to handle surfaces with palette colors. */ if((bpp2 == 1) && (bpp1 == 1) && (!palette_colors)) { /* Don't look at the color of the surface, just use the value. This is useful for 8bit images that aren't actually using the palette. */ if ( (abs( (the_color2) - (the_color)) < tr ) ) { /* this pixel is within the threshold of othersurface. */ bitmask_setbit(m, x, y); } } else if ((abs((((the_color2 & rmask2) >> rshift2) << rloss2) - (((the_color & rmask) >> rshift) << rloss)) < tr) & (abs((((the_color2 & gmask2) >> gshift2) << gloss2) - (((the_color & gmask) >> gshift) << gloss)) < tg) & (abs((((the_color2 & bmask2) >> bshift2) << bloss2) - (((the_color & bmask) >> bshift) << bloss)) < tb)) { /* this pixel is within the threshold of othersurface. */ bitmask_setbit(m, x, y); } /* TODO: will need to handle surfaces with palette colors. TODO: will need to handle the case where palette_colors == 0 */ } else if ((abs((((the_color & rmask) >> rshift) << rloss) - r) < tr) & (abs((((the_color & gmask) >> gshift) << gloss) - g) < tg) & (abs((((the_color & bmask) >> bshift) << bloss) - b) < tb)) { /* this pixel is within the threshold of the color. */ bitmask_setbit(m, x, y); } } } } static PyObject* mask_from_threshold(PyObject* self, PyObject* args) { PyObject *surfobj, *surfobj2 = NULL; PyMaskObject *maskobj; bitmask_t* m; SDL_Surface* surf = NULL, *surf2 = NULL; int bpp; PyObject *rgba_obj_color, *rgba_obj_threshold = NULL; Uint8 rgba_color[4]; Uint8 rgba_threshold[4] = {0, 0, 0, 255}; Uint32 color; Uint32 color_threshold; int palette_colors = 1; if (!PyArg_ParseTuple (args, "O!O|OO!i", &PySurface_Type, &surfobj, &rgba_obj_color, &rgba_obj_threshold, &PySurface_Type, &surfobj2, &palette_colors)) return NULL; surf = PySurface_AsSurface (surfobj); if(surfobj2) { surf2 = PySurface_AsSurface (surfobj2); } if (PyInt_Check (rgba_obj_color)) { color = (Uint32) PyInt_AsLong (rgba_obj_color); } else if (PyLong_Check (rgba_obj_color)) { color = (Uint32) PyLong_AsUnsignedLong (rgba_obj_color); } else if (RGBAFromColorObj (rgba_obj_color, rgba_color)) { color = SDL_MapRGBA (surf->format, rgba_color[0], rgba_color[1], rgba_color[2], rgba_color[3]); } else { return RAISE (PyExc_TypeError, "invalid color argument"); } if(rgba_obj_threshold) { if (PyInt_Check (rgba_obj_threshold)) color_threshold = (Uint32) PyInt_AsLong (rgba_obj_threshold); else if (PyLong_Check (rgba_obj_threshold)) color_threshold = (Uint32) PyLong_AsUnsignedLong (rgba_obj_threshold); else if (RGBAFromColorObj (rgba_obj_threshold, rgba_threshold)) color_threshold = SDL_MapRGBA (surf->format, rgba_threshold[0], rgba_threshold[1], rgba_threshold[2], rgba_threshold[3]); else return RAISE (PyExc_TypeError, "invalid threshold argument"); } else { color_threshold = SDL_MapRGBA (surf->format, rgba_threshold[0], rgba_threshold[1], rgba_threshold[2], rgba_threshold[3]); } bpp = surf->format->BytesPerPixel; m = bitmask_create(surf->w, surf->h); PySurface_Lock(surfobj); if(surfobj2) { PySurface_Lock(surfobj2); } Py_BEGIN_ALLOW_THREADS; bitmask_threshold (m, surf, surf2, color, color_threshold, palette_colors); Py_END_ALLOW_THREADS; PySurface_Unlock(surfobj); if(surfobj2) { PySurface_Unlock(surfobj2); } maskobj = PyObject_New(PyMaskObject, &PyMask_Type); if(maskobj) maskobj->mask = m; return (PyObject*)maskobj; } /* the initial labelling phase of the connected components algorithm Returns: The highest label in the labelled image input - The input Mask image - An array to store labelled pixels ufind - The union-find label equivalence array largest - An array to store the number of pixels for each label */ unsigned int cc_label(bitmask_t *input, unsigned int* image, unsigned int* ufind, unsigned int* largest) { unsigned int *buf; unsigned int x, y, w, h, root, aroot, croot, temp, label; label = 0; w = input->w; h = input->h; ufind[0] = 0; buf = image; /* special case for first pixel */ if(bitmask_getbit(input, 0, 0)) { /* process for a new connected comp: */ label++; /* create a new label */ *buf = label; /* give the pixel the label */ ufind[label] = label; /* put the label in the equivalence array */ largest[label] = 1; /* the label has 1 pixel associated with it */ } else { *buf = 0; } buf++; /* special case for first row. Go over the first row except the first pixel. */ for(x = 1; x < w; x++) { if (bitmask_getbit(input, x, 0)) { if (*(buf-1)) { /* d label */ *buf = *(buf-1); } else { /* create label */ label++; *buf = label; ufind[label] = label; largest[label] = 0; } largest[*buf]++; } else { *buf = 0; } buf++; } /* the rest of the image */ for(y = 1; y < h; y++) { /* first pixel of the row */ if (bitmask_getbit(input, 0, y)) { if (*(buf-w)) { /* b label */ *buf = *(buf-w); } else if (*(buf-w+1)) { /* c label */ *buf = *(buf-w+1); } else { /* create label */ label++; *buf = label; ufind[label] = label; largest[label] = 0; } largest[*buf]++; } else { *buf = 0; } buf++; /* middle pixels of the row */ for(x = 1; x < (w-1); x++) { if (bitmask_getbit(input, x, y)) { if (*(buf-w)) { /* b label */ *buf = *(buf-w); } else if (*(buf-w+1)) { /* c branch of tree */ if (*(buf-w-1)) { /* union(c, a) */ croot = root = *(buf-w+1); while (ufind[root] < root) { /* find root */ root = ufind[root]; } if (croot != *(buf-w-1)) { temp = aroot = *(buf-w-1); while (ufind[aroot] < aroot) { /* find root */ aroot = ufind[aroot]; } if (root > aroot) { root = aroot; } while (ufind[temp] > root) { /* set root */ aroot = ufind[temp]; ufind[temp] = root; temp = aroot; } } while (ufind[croot] > root) { /* set root */ temp = ufind[croot]; ufind[croot] = root; croot = temp; } *buf = root; } else if (*(buf-1)) { /* union(c, d) */ croot = root = *(buf-w+1); while (ufind[root] < root) { /* find root */ root = ufind[root]; } if (croot != *(buf-1)) { temp = aroot = *(buf-1); while (ufind[aroot] < aroot) { /* find root */ aroot = ufind[aroot]; } if (root > aroot) { root = aroot; } while (ufind[temp] > root) { /* set root */ aroot = ufind[temp]; ufind[temp] = root; temp = aroot; } } while (ufind[croot] > root) { /* set root */ temp = ufind[croot]; ufind[croot] = root; croot = temp; } *buf = root; } else { /* c label */ *buf = *(buf-w+1); } } else if (*(buf-w-1)) { /* a label */ *buf = *(buf-w-1); } else if (*(buf-1)) { /* d label */ *buf = *(buf-1); } else { /* create label */ label++; *buf = label; ufind[label] = label; largest[label] = 0; } largest[*buf]++; } else { *buf = 0; } buf++; } /* last pixel of the row, if its not also the first pixel of the row */ if (w > 1) { if (bitmask_getbit(input, x, y)) { if (*(buf-w)) { /* b label */ *buf = *(buf-w); } else if (*(buf-w-1)) { /* a label */ *buf = *(buf-w-1); } else if (*(buf-1)) { /* d label */ *buf = *(buf-1); } else { /* create label */ label++; *buf = label; ufind[label] = label; largest[label] = 0; } largest[*buf]++; } else { *buf = 0; } buf++; } } return label; } /* Connected component labeling based on the SAUF algorithm by Kesheng Wu, Ekow Otoo, and Kenji Suzuki. The algorithm is best explained by their paper, "Two Strategies to Speed up Connected Component Labeling Algorithms", but in summary, it is a very efficient two pass method for 8-connected components. It uses a decision tree to minimize the number of neighbors that need to be checked. It stores equivalence information in an array based union-find. This implementation also has a final step of finding bounding boxes. */ /* returns -2 on memory allocation error, otherwise 0 on success. input - the input mask. num_bounding_boxes - returns the number of bounding rects found. rects - returns the rects that are found. Allocates the memory for the rects. */ static int get_bounding_rects(bitmask_t *input, int *num_bounding_boxes, GAME_Rect** ret_rects) { unsigned int *image, *ufind, *largest, *buf; int x, y, w, h, temp, label, relabel; GAME_Rect* rects; rects = NULL; label = 0; w = input->w; h = input->h; /* a temporary image to assign labels to each bit of the mask */ image = (unsigned int *) malloc(sizeof(int)*w*h); if(!image) { return -2; } /* allocate enough space for the maximum possible connected components */ /* the union-find array. see wikipedia for info on union find */ ufind = (unsigned int *) malloc(sizeof(int)*(w/2 + 1)*(h/2 + 1)); if(!ufind) { return -2; } largest = (unsigned int *) malloc(sizeof(int)*(w/2 + 1)*(h/2 + 1)); if(!largest) { return -2; } /* do the initial labelling */ label = cc_label(input, image, ufind, largest); relabel = 0; /* flatten and relabel the union-find equivalence array. Start at label 1 because label 0 indicates an unset pixel. For this reason, we also use <= label rather than < label. */ for (x = 1; x <= label; x++) { if (ufind[x] < x) { /* is it a union find root? */ ufind[x] = ufind[ufind[x]]; /* relabel it to its root */ } else { /* its a root */ relabel++; ufind[x] = relabel; /* assign the lowest label available */ } } *num_bounding_boxes = relabel; if (relabel == 0) { /* early out, as we didn't find anything. */ free(image); free(ufind); free(largest); *ret_rects = rects; return 0; } /* the bounding rects, need enough space for the number of labels */ rects = (GAME_Rect *) malloc(sizeof(GAME_Rect) * (relabel +1)); if(!rects) { return -2; } for (temp = 0; temp <= relabel; temp++) { rects[temp].h = 0; /* so we know if its a new rect or not */ } /* find the bounding rect of each connected component */ buf = image; for (y = 0; y < h; y++) { for (x = 0; x < w; x++) { if (ufind[*buf]) { /* if the pixel is part of a component */ if (rects[ufind[*buf]].h) { /* the component has a rect */ temp = rects[ufind[*buf]].x; rects[ufind[*buf]].x = MIN(x, temp); rects[ufind[*buf]].y = MIN(y, rects[ufind[*buf]].y); rects[ufind[*buf]].w = MAX(rects[ufind[*buf]].w + temp, x + 1) - rects[ufind[*buf]].x; rects[ufind[*buf]].h = MAX(rects[ufind[*buf]].h, y - rects[ufind[*buf]].y + 1); } else { /* otherwise, start the rect */ rects[ufind[*buf]].x = x; rects[ufind[*buf]].y = y; rects[ufind[*buf]].w = 1; rects[ufind[*buf]].h = 1; } } buf++; } } free(image); free(ufind); free(largest); *ret_rects = rects; return 0; } static PyObject* mask_get_bounding_rects(PyObject* self, PyObject* args) { GAME_Rect *regions; GAME_Rect *aregion; int num_bounding_boxes, i, r; PyObject* ret; PyObject* rect; bitmask_t *mask = PyMask_AsBitmap(self); ret = NULL; regions = NULL; aregion = NULL; num_bounding_boxes = 0; Py_BEGIN_ALLOW_THREADS; r = get_bounding_rects(mask, &num_bounding_boxes, ®ions); Py_END_ALLOW_THREADS; if(r == -2) { /* memory out failure */ return RAISE (PyExc_MemoryError, "Not enough memory to get bounding rects. \n"); } ret = PyList_New (0); if (!ret) return NULL; /* build a list of rects to return. Starts at 1 because we never use 0. */ for(i=1; i <= num_bounding_boxes; i++) { aregion = regions + i; rect = PyRect_New4 ( aregion->x, aregion->y, aregion->w, aregion->h ); PyList_Append (ret, rect); Py_DECREF (rect); } free(regions); return ret; } /* returns the number of connected components. returns -2 on memory allocation error. Allocates memory for components. */ static int get_connected_components(bitmask_t *mask, bitmask_t ***components, int min) { unsigned int *image, *ufind, *largest, *buf; int x, y, w, h, label, relabel; bitmask_t** comps; label = 0; w = mask->w; h = mask->h; /* a temporary image to assign labels to each bit of the mask */ image = (unsigned int *) malloc(sizeof(int)*w*h); if(!image) { return -2; } /* allocate enough space for the maximum possible connected components */ /* the union-find array. see wikipedia for info on union find */ ufind = (unsigned int *) malloc(sizeof(int)*(w/2 + 1)*(h/2 + 1)); if(!ufind) { free(image); return -2; } largest = (unsigned int *) malloc(sizeof(int)*(w/2 + 1)*(h/2 + 1)); if(!largest) { free(image); free(ufind); return -2; } /* do the initial labelling */ label = cc_label(mask, image, ufind, largest); for (x = 1; x <= label; x++) { if (ufind[x] < x) { largest[ufind[x]] += largest[x]; } } relabel = 0; /* flatten and relabel the union-find equivalence array. Start at label 1 because label 0 indicates an unset pixel. For this reason, we also use <= label rather than < label. */ for (x = 1; x <= label; x++) { if (ufind[x] < x) { /* is it a union find root? */ ufind[x] = ufind[ufind[x]]; /* relabel it to its root */ } else { /* its a root */ if (largest[x] >= min) { relabel++; ufind[x] = relabel; /* assign the lowest label available */ } else { ufind[x] = 0; } } } if (relabel == 0) { /* early out, as we didn't find anything. */ free(image); free(ufind); free(largest); return 0; } /* allocate space for the mask array */ comps = (bitmask_t **) malloc(sizeof(bitmask_t *) * (relabel +1)); if(!comps) { free(image); free(ufind); free(largest); return -2; } /* create the empty masks */ for (x = 1; x <= relabel; x++) { comps[x] = bitmask_create(w, h); } /* set the bits in each mask */ buf = image; for (y = 0; y < h; y++) { for (x = 0; x < w; x++) { if (ufind[*buf]) { /* if the pixel is part of a component */ bitmask_setbit(comps[ufind[*buf]], x, y); } buf++; } } free(image); free(ufind); free(largest); *components = comps; return relabel; } static PyObject* mask_connected_components(PyObject* self, PyObject* args) { PyObject* ret; PyMaskObject *maskobj; bitmask_t **components; bitmask_t *mask = PyMask_AsBitmap(self); int i, num_components, min; min = 0; components = NULL; if(!PyArg_ParseTuple(args, "|i", &min)) { return NULL; } Py_BEGIN_ALLOW_THREADS; num_components = get_connected_components(mask, &components, min); Py_END_ALLOW_THREADS; if (num_components == -2) return RAISE (PyExc_MemoryError, "Not enough memory to get components. \n"); ret = PyList_New(0); if (!ret) return NULL; for (i=1; i <= num_components; i++) { maskobj = PyObject_New(PyMaskObject, &PyMask_Type); if(maskobj) { maskobj->mask = components[i]; PyList_Append (ret, (PyObject *) maskobj); Py_DECREF((PyObject *) maskobj); } } free(components); return ret; } /* Connected component labeling based on the SAUF algorithm by Kesheng Wu, Ekow Otoo, and Kenji Suzuki. The algorithm is best explained by their paper, "Two Strategies to Speed up Connected Component Labeling Algorithms", but in summary, it is a very efficient two pass method for 8-connected components. It uses a decision tree to minimize the number of neighbors that need to be checked. It stores equivalence information in an array based union-find. This implementation also tracks the number of pixels in each label, finding the biggest one while flattening the union-find equivalence array. It then writes an output mask containing only the largest connected component. */ /* returns -2 on memory allocation error. */ static int largest_connected_comp(bitmask_t* input, bitmask_t* output, int ccx, int ccy) { unsigned int *image, *ufind, *largest, *buf; unsigned int max, x, y, w, h, label; w = input->w; h = input->h; /* a temporary image to assign labels to each bit of the mask */ image = (unsigned int *) malloc(sizeof(int)*w*h); if(!image) { return -2; } /* allocate enough space for the maximum possible connected components */ /* the union-find array. see wikipedia for info on union find */ ufind = (unsigned int *) malloc(sizeof(int)*(w/2 + 1)*(h/2 + 1)); if(!ufind) { free(image); return -2; } /* an array to track the number of pixels associated with each label */ largest = (unsigned int *) malloc(sizeof(int)*(w/2 + 1)*(h/2 + 1)); if(!largest) { free(image); free(ufind); return -2; } /* do the initial labelling */ label = cc_label(input, image, ufind, largest); max = 1; /* flatten the union-find equivalence array */ for (x = 2; x <= label; x++) { if (ufind[x] != x) { /* is it a union find root? */ largest[ufind[x]] += largest[x]; /* add its pixels to its root */ ufind[x] = ufind[ufind[x]]; /* relabel it to its root */ } if (largest[ufind[x]] > largest[max]) { /* is it the new biggest? */ max = ufind[x]; } } /* write out the final image */ buf = image; if (ccx >= 0) max = ufind[*(buf+ccy*w+ccx)]; for (y = 0; y < h; y++) { for (x = 0; x < w; x++) { if (ufind[*buf] == max) { /* if the label is the max one */ bitmask_setbit(output, x, y); /* set the bit in the mask */ } buf++; } } free(image); free(ufind); free(largest); return 0; } static PyObject* mask_connected_component(PyObject* self, PyObject* args) { bitmask_t *input = PyMask_AsBitmap(self); bitmask_t *output = bitmask_create(input->w, input->h); PyMaskObject *maskobj = PyObject_New(PyMaskObject, &PyMask_Type); int x, y; x = -1; if(!PyArg_ParseTuple(args, "|(ii)", &x, &y)) { return NULL; } /* if a coordinate is specified, make the pixel there is actually set */ if (x == -1 || bitmask_getbit(input, x, y)) { if (largest_connected_comp(input, output, x, y) == -2) { return RAISE (PyExc_MemoryError, "Not enough memory to get bounding rects. \n"); } } if(maskobj) maskobj->mask = output; return (PyObject*)maskobj; } static PyMethodDef mask_methods[] = { { "get_size", mask_get_size, METH_VARARGS, DOC_MASKGETSIZE}, { "get_at", mask_get_at, METH_VARARGS, DOC_MASKGETAT }, { "set_at", mask_set_at, METH_VARARGS, DOC_MASKSETAT }, { "overlap", mask_overlap, METH_VARARGS, DOC_MASKOVERLAP }, { "overlap_area", mask_overlap_area, METH_VARARGS, DOC_MASKOVERLAPAREA }, { "overlap_mask", mask_overlap_mask, METH_VARARGS, DOC_MASKOVERLAPMASK }, { "fill", mask_fill, METH_NOARGS, DOC_MASKFILL }, { "clear", mask_clear, METH_NOARGS, DOC_MASKCLEAR }, { "invert", mask_invert, METH_NOARGS, DOC_MASKINVERT }, { "scale", mask_scale, METH_VARARGS, DOC_MASKSCALE }, { "draw", mask_draw, METH_VARARGS, DOC_MASKDRAW }, { "erase", mask_erase, METH_VARARGS, DOC_MASKERASE }, { "count", mask_count, METH_NOARGS, DOC_MASKCOUNT }, { "centroid", mask_centroid, METH_NOARGS, DOC_MASKCENTROID }, { "angle", mask_angle, METH_NOARGS, DOC_MASKANGLE }, { "outline", mask_outline, METH_VARARGS, DOC_MASKOUTLINE }, { "convolve", mask_convolve, METH_VARARGS, DOC_MASKCONVOLVE }, { "connected_component", mask_connected_component, METH_VARARGS, DOC_MASKCONNECTEDCOMPONENT }, { "connected_components", mask_connected_components, METH_VARARGS, DOC_MASKCONNECTEDCOMPONENTS }, { "get_bounding_rects", mask_get_bounding_rects, METH_NOARGS, DOC_MASKGETBOUNDINGRECTS }, { NULL, NULL, 0, NULL } }; /*mask object internals*/ static void mask_dealloc(PyObject* self) { bitmask_t *mask = PyMask_AsBitmap(self); bitmask_free(mask); PyObject_DEL(self); } static PyTypeObject PyMask_Type = { TYPE_HEAD (NULL, 0) "pygame.mask.Mask", sizeof(PyMaskObject), 0, mask_dealloc, 0, 0, 0, 0, 0, 0, NULL, 0, (hashfunc)NULL, (ternaryfunc)NULL, (reprfunc)NULL, 0L,0L,0L,0L, DOC_PYGAMEMASKMASK, /* Documentation string */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ mask_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ }; /*mask module methods*/ static PyObject* Mask(PyObject* self, PyObject* args) { bitmask_t *mask; int w,h; PyMaskObject *maskobj; if(!PyArg_ParseTuple(args, "(ii)", &w, &h)) return NULL; mask = bitmask_create(w,h); if(!mask) return NULL; /*RAISE(PyExc_Error, "cannot create bitmask");*/ /*create the new python object from mask*/ maskobj = PyObject_New(PyMaskObject, &PyMask_Type); if(maskobj) maskobj->mask = mask; return (PyObject*)maskobj; } static PyMethodDef _mask_methods[] = { { "Mask", Mask, METH_VARARGS, DOC_PYGAMEMASKMASK }, { "from_surface", mask_from_surface, METH_VARARGS, DOC_PYGAMEMASKFROMSURFACE}, { "from_threshold", mask_from_threshold, METH_VARARGS, DOC_PYGAMEMASKFROMTHRESHOLD}, { NULL, NULL, 0, NULL } }; MODINIT_DEFINE (mask) { PyObject *module, *dict, *apiobj; static void* c_api[PYGAMEAPI_MASK_NUMSLOTS]; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "mask", DOC_PYGAMEMASK, -1, _mask_methods, NULL, NULL, NULL, NULL }; #endif /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_color (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_surface (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_rect (); if (PyErr_Occurred ()) { MODINIT_ERROR; } /* create the mask type */ if (PyType_Ready (&PyMask_Type) < 0) { MODINIT_ERROR; } /* create the module */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3(MODPREFIX "mask", _mask_methods, DOC_PYGAMEMASK); #endif if (module == NULL) { MODINIT_ERROR; } dict = PyModule_GetDict(module); if (PyDict_SetItemString (dict, "MaskType", (PyObject *)&PyMask_Type) == -1) { DECREF_MOD(module); MODINIT_ERROR; } /* export the c api */ c_api[0] = &PyMask_Type; apiobj = PyCObject_FromVoidPtr (c_api, NULL); if (apiobj == NULL) { DECREF_MOD (module); MODINIT_ERROR; } if (PyModule_AddObject (module, PYGAMEAPI_LOCAL_ENTRY, apiobj) == -1) { Py_DECREF (apiobj); DECREF_MOD (module); MODINIT_ERROR; } MODINIT_RETURN (module); } pygame-1.9.1release/src/key.doc0000644000175000017500000002053310754645572016333 0ustar vincentvincentpygame.key pygame module to work with the keyboard This module contains functions for dealing with the keyboard. The event queue gets pygame.KEYDOWN and pygame.KEYUP events when the keyboard buttons are pressed and released. Both events have a key attribute that is a integer id representing every key on the keyboard. The pygame.KEYDOWN event has an additional attributes unicode, and scancode. unicode represents a single character string that is the fully translated character entered. This takes into account the shift and composition keys. scancode represents the platform specific key code. This could be different from keyboard to keyboard, but is useful for key selection of weird keys like the multimedia keys. There are many keyboard constants, they are used to represent keys on the keyboard. The following is a list of all keyboard constants KeyASCII ASCII Common Name K_BACKSPACE \b backspace K_TAB \t tab K_CLEAR clear K_RETURN \r return K_PAUSE pause K_ESCAPE ^[ escape K_SPACE space K_EXCLAIM ! exclaim K_QUOTEDBL " quotedbl K_HASH # hash K_DOLLAR $ dollar K_AMPERSAND & ampersand K_QUOTE quote K_LEFTPAREN ( left parenthesis K_RIGHTPAREN ) right parenthesis K_ASTERISK * asterisk K_PLUS + plus sign K_COMMA , comma K_MINUS - minus sign K_PERIOD . period K_SLASH / forward slash K_0 0 0 K_1 1 1 K_2 2 2 K_3 3 3 K_4 4 4 K_5 5 5 K_6 6 6 K_7 7 7 K_8 8 8 K_9 9 9 K_COLON : colon K_SEMICOLON ; semicolon K_LESS < less-than sign K_EQUALS = equals sign K_GREATER > greater-than sign K_QUESTION ? question mark K_AT @ at K_LEFTBRACKET [ left bracket K_BACKSLASH \ backslash K_RIGHTBRACKET ] right bracket K_CARET ^ caret K_UNDERSCORE _ underscore K_BACKQUOTE ` grave K_a a a K_b b b K_c c c K_d d d K_e e e K_f f f K_g g g K_h h h K_i i i K_j j j K_k k k K_l l l K_m m m K_n n n K_o o o K_p p p K_q q q K_r r r K_s s s K_t t t K_u u u K_v v v K_w w w K_x x x K_y y y K_z z z K_DELETE delete K_KP0 keypad 0 K_KP1 keypad 1 K_KP2 keypad 2 K_KP3 keypad 3 K_KP4 keypad 4 K_KP5 keypad 5 K_KP6 keypad 6 K_KP7 keypad 7 K_KP8 keypad 8 K_KP9 keypad 9 K_KP_PERIOD . keypad period K_KP_DIVIDE / keypad divide K_KP_MULTIPLY * keypad multiply K_KP_MINUS - keypad minus K_KP_PLUS + keypad plus K_KP_ENTER \r keypad enter K_KP_EQUALS = keypad equals K_UP up arrow K_DOWN down arrow K_RIGHT right arrow K_LEFT left arrow K_INSERT insert K_HOME home K_END end K_PAGEUP page up K_PAGEDOWN page down K_F1 F1 K_F2 F2 K_F3 F3 K_F4 F4 K_F5 F5 K_F6 F6 K_F7 F7 K_F8 F8 K_F9 F9 K_F10 F10 K_F11 F11 K_F12 F12 K_F13 F13 K_F14 F14 K_F15 F15 K_NUMLOCK numlock K_CAPSLOCK capslock K_SCROLLOCK scrollock K_RSHIFT right shift K_LSHIFT left shift K_RCTRL right ctrl K_LCTRL left ctrl K_RALT right alt K_LALT left alt K_RMETA right meta K_LMETA left meta K_LSUPER left windows key K_RSUPER right windows key K_MODE mode shift K_HELP help K_PRINT print screen K_SYSREQ sysrq K_BREAK break K_MENU menu K_POWER power K_EURO euro The keyboard also has a list of modifier states that can be assembled bit bitwise ORing them together. KMOD_NONE, KMOD_LSHIFT, KMOD_RSHIFT, KMOD_SHIFT, KMOD_CAPS, KMOD_LCTRL, KMOD_RCTRL, KMOD_CTRL, KMOD_LALT, KMOD_RALT, KMOD_ALT, KMOD_LMETA, KMOD_RMETA, KMOD_META, KMOD_NUM, KMOD_MODE
    get_focused true if the display is receiving keyboard input from the system pygame.key.get_focused(): return bool This is true when the display window has keyboard focus from the system. If the display needs to ensure it does not lose keyboard focus, it can use pygame.event.set_grab() to grab all input. get_pressed get the state of all keyboard buttons pygame.key.get_pressed(): return bools Returns a sequence of boolean values representing the state of every key on the keyboard. Use the key constant values to index the array. A True value means the that button is pressed. Getting the list of pushed buttons with this function is not the proper way to handle text entry from the user. You have no way to know the order of keys pressed, and rapidly pushed keys can be completely unnoticed between two calls to pygame.key.get_pressed(). There is also no way to translate these pushed keys into a fully translated character value. See the pygame.KEYDOWN events on the event queue for this functionality. get_mods determine which modifier keys are being held pygame.key.get_mods(): return int Returns a single integer representing a bitmask of all the modifier keys being held. Using bitwise operators you can test if specific shift keys are pressed, the state of the capslock button, and more. set_mods temporarily set which modifier keys are pressed pygame.key.set_mods(int): return None Create a bitmask of the modifier constants you want to impose on your program. set_repeat control how held keys are repeated pygame.key.set_repeat(): return None pygame.key.set_repeat(delay, interval): return None When the keyboard repeat is enabled, keys that are held down will generate multiple pygame.KEYDOWN events. The delay is the number of milliseconds before the first repeated pygame.KEYDOWN will be sent. After that another pygame.KEYDOWN will be sent every interval milliseconds. If no arguments are passed the key repeat is disabled. When pygame is initialized the key repeat is disabled. get_repeat see how held keys are repeated pygame.key.get_repeat(): return (delay, interval) When the keyboard repeat is enabled, keys that are held down will generate multiple pygame.KEYDOWN events. The delay is the number of milliseconds before the first repeated pygame.KEYDOWN will be sent. After that another pygame.KEYDOWN will be sent every interval milliseconds. When pygame is initialized the key repeat is disabled. New in pygame 1.8. name get the name of a key identifier pygame.key.name(key): return string Get the descriptive name of the button from a keyboard button id constant. pygame-1.9.1release/src/key.c0000644000175000017500000001043511207055754015777 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* * pygame keyboard module */ #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" /* keyboard module functions */ static PyObject* key_set_repeat (PyObject* self, PyObject* args) { int delay = 0, interval = 0; if (!PyArg_ParseTuple (args, "|ii", &delay, &interval)) return NULL; VIDEO_INIT_CHECK (); if (delay && !interval) interval = delay; if (SDL_EnableKeyRepeat (delay, interval) == -1) return RAISE (PyExc_SDLError, SDL_GetError ()); Py_RETURN_NONE; } static PyObject* key_get_repeat (PyObject* self, PyObject* args) { int delay = 0, interval = 0; VIDEO_INIT_CHECK (); #if SDL_VERSION_ATLEAST(1, 2, 10) SDL_GetKeyRepeat (&delay, &interval); return Py_BuildValue ("(ii)", delay, interval); #else Py_RETURN_NONE; #endif } static PyObject* key_get_pressed (PyObject* self) { int num_keys; Uint8* key_state; PyObject* key_tuple; int i; VIDEO_INIT_CHECK (); key_state = SDL_GetKeyState (&num_keys); if (!key_state || !num_keys) Py_RETURN_NONE; if (!(key_tuple = PyTuple_New (num_keys))) return NULL; for (i = 0;i < num_keys;i++) { PyObject* key_elem; key_elem = PyInt_FromLong (key_state[i]); if (!key_elem) { Py_DECREF (key_tuple); return NULL; } PyTuple_SET_ITEM (key_tuple, i, key_elem); } return key_tuple; } static PyObject* key_name (PyObject* self, PyObject* args) { int key; if (!PyArg_ParseTuple (args, "i", &key)) return NULL; return Text_FromUTF8 (SDL_GetKeyName (key)); } static PyObject* key_get_mods (PyObject* self) { VIDEO_INIT_CHECK (); return PyInt_FromLong (SDL_GetModState ()); } static PyObject* key_set_mods (PyObject* self, PyObject* args) { int mods; if (!PyArg_ParseTuple (args, "i", &mods)) return NULL; VIDEO_INIT_CHECK (); SDL_SetModState (mods); Py_RETURN_NONE; } static PyObject* key_get_focused (PyObject* self) { VIDEO_INIT_CHECK (); return PyInt_FromLong ((SDL_GetAppState () & SDL_APPINPUTFOCUS) != 0); } static PyMethodDef _key_methods[] = { { "set_repeat", key_set_repeat, METH_VARARGS, DOC_PYGAMEKEYSETREPEAT }, { "get_repeat", key_get_repeat, METH_NOARGS, DOC_PYGAMEKEYGETREPEAT }, { "get_pressed", (PyCFunction) key_get_pressed, METH_NOARGS, DOC_PYGAMEKEYGETPRESSED }, { "name", key_name, METH_VARARGS, DOC_PYGAMEKEYNAME }, { "get_mods", (PyCFunction) key_get_mods, METH_NOARGS, DOC_PYGAMEKEYGETMODS }, { "set_mods", key_set_mods, METH_VARARGS, DOC_PYGAMEKEYSETMODS }, { "get_focused", (PyCFunction) key_get_focused, METH_NOARGS, DOC_PYGAMEKEYGETFOCUSED }, { NULL, NULL, 0, NULL } }; MODINIT_DEFINE (key) { PyObject *module; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "key", DOC_PYGAMEKEY, -1, _key_methods, NULL, NULL, NULL, NULL }; #endif /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } /* create the module */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "key", _key_methods, DOC_PYGAMEKEY); #endif if (module == NULL) { MODINIT_ERROR; } MODINIT_RETURN (module); } pygame-1.9.1release/src/joystick.doc0000644000175000017500000001527010437510213017361 0ustar vincentvincentpygame.joystick pygame module for interacting with joystick devices The joystick module manages the joystick devices on a computer (there can be more than one). Joystick devices include trackballs and video-game-style gamepads, and the module allows the use of multiple buttons and "hats".
    init initialize the joystick module pygame.joystick.init(): return None This function is called automatically by pygame.init(). It initializes the joystick module. This will scan the system for all joystick devices. The module must be initialized before any other functions will work. It is safe to call this function more than once. quit uninitialize the joystick module pygame.joystick.quit(): return None Uninitialize the joystick module. After you call this any existing joystick objects will no longer work. It is safe to call this function more than once. get_init true if the joystick module is initialized pygame.joystick.get_init(): return bool Test if the pygame.joystick.init() function has been called. get_count number of joysticks on the system pygame.joystick.get_count(): return count Return the number of joystick devices on the system. The count will be 0 if there are no joysticks on the system. When you create Joystick objects using Joystick(id), you pass an integer that must be lower than this count. Joystick create a new Joystick object pygame.joystick.Joystick(id): return Joystick Create a new joystick to access a physical device. The id argument must be a value from 0 to pygame.joystick.get_count()-1. To access most of the Joystick methods, you'll need to init() the Joystick. This is separate from making sure the joystick module is initialized. When multiple Joysticks objects are created for the same physical joystick device (i.e., they have the same ID number), the state and values for those Joystick objects will be shared. The Joystick object allows you to get information about the types of controls on a joystick device. Once the device is initialized the Pygame event queue will start receiving events about its input. You can call the Joystick.get_name() and Joystick.get_id() functions without initializing the Joystick object.
    init initialize the Joystick Joystick.init(): return None The Joystick must be initialized to get most of the information about the controls. While the Joystick is initialized the Pygame event queue will receive events from the Joystick input. It is safe to call this more than once. quit uninitialize the Joystick Joystick.quit(): return None This will unitialize a Joystick. After this the Pygame event queue will no longer receive events from the device. It is safe to call this more than once. get_init check if the Joystick is initialized Joystick.get_init(): return bool Returns True if the init() method has already been called on this Joystick object. get_id get the Joystick ID Joystick.get_id(): return int Returns the integer ID that represents this device. This is the same value that was passed to the Joystick() constructor. This method can safely be called while the Joystick is not initialized. get_name get the Joystick system name Joystick.get_name(): return string Returns the system name for this joystick device. It is unknown what name the system will give to the Joystick, but it should be a unique name that identifies the device. This method can safely be called while the Joystick is not initialized. get_numaxes get the number of axes on a Joystick Joystick.get_numaxes(): return int Returns the number of input axes are on a Joystick. There will usually be two for the position. Controls like rudders and throttles are treated as additional axes. The pygame.JOYAXISMOTION events will be in the range from -1.0 to 1.0. A value of 0.0 means the axis is centered. Gamepad devices will usually be -1, 0, or 1 with no values in between. Older analog joystick axes will not always use the full -1 to 1 range, and the centered value will be some area around 0. Analog joysticks usually have a bit of noise in their axis, which will generate a lot of rapid small motion events. get_axis get the current position of an axis Joystick.get_axis(axis_number): return float Returns the current position of a joystick axis. The value will range from -1 to 1 with a value of 0 being centered. You may want to take into account some tolerance to handle jitter, and joystick drift may keep the joystick from centering at 0 or using the full range of position values. The axis number must be an integer from zero to get_numaxes()-1. get_numballs get the number of trackballs on a Joystick Joystick.get_numballs(): return int Returns the number of trackball devices on a Joystick. These devices work similar to a mouse but they have no absolute position; they only have relative amounts of movement. The pygame.JOYBALLMOTION event will be sent when the trackball is rolled. It will report the amount of movement on the trackball. get_ball get the relative position of a trackball Joystick.get_ball(ball_number): return x, y Returns the relative movement of a joystick button. The value is a x, y pair holding the relative movement since the last call to get_ball. The ball number must be an integer from zero to get_numballs()-1. get_numbuttons get the number of buttons on a Joystick Joystick.get_numbuttons(): return int Returns the number of pushable buttons on the joystick. These buttons have a boolean (on or off) state. Buttons generate a pygame.JOYBUTTONDOWN and pygame.JOYBUTTONUP event when they are pressed and released. get_button get the current button state Joystick.get_button(button): return bool Returns the current state of a joystick button. get_numhats get the number of hat controls on a Joystick Joystick.get_numhats(): return int Returns the number of joystick hats on a Joystick. Hat devices are like miniature digital joysticks on a joystick. Each hat has two axes of input. The pygame.JOYHATMOTION event is generated when the hat changes position. The position attribute for the event contains a pair of values that are either -1, 0, or 1. A position of (0, 0) means the hat is centered. get_hat get the position of a joystick hat Joystick.get_hat(hat_number): return x, y Returns the current position of a position hat. The position is given as two values representing the X and Y position for the hat. (0, 0) means centered. A value of -1 means left/down and a value of 1 means right/up: so (-1, 0) means left; (1, 0) means right; (0, 1) means up; (1, 1) means upper-right; etc. This value is digital, i.e., each coordinate can be -1, 0 or 1 but never in-between. The hat number must be between 0 and get_numhats()-1. pygame-1.9.1release/src/joystick.c0000644000175000017500000003257211207055754017054 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ #define PYGAMEAPI_JOYSTICK_INTERNAL #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" #define JOYSTICK_MAXSTICKS 32 static SDL_Joystick* joystick_stickdata[JOYSTICK_MAXSTICKS] = {NULL}; static PyTypeObject PyJoystick_Type; static PyObject* PyJoystick_New (int); #define PyJoystick_Check(x) ((x)->ob_type == &PyJoystick_Type) static void joy_autoquit (void) { int loop; for (loop = 0; loop < JOYSTICK_MAXSTICKS; ++loop) { if (joystick_stickdata[loop]) { SDL_JoystickClose (joystick_stickdata[loop]); joystick_stickdata[loop] = NULL; } } if (SDL_WasInit (SDL_INIT_JOYSTICK)) { SDL_JoystickEventState (SDL_ENABLE); SDL_QuitSubSystem (SDL_INIT_JOYSTICK); } } static PyObject* joy_autoinit (PyObject* self) { if (!SDL_WasInit (SDL_INIT_JOYSTICK)) { if (SDL_InitSubSystem (SDL_INIT_JOYSTICK)) { return PyInt_FromLong (0); } SDL_JoystickEventState (SDL_ENABLE); PyGame_RegisterQuit (joy_autoquit); } return PyInt_FromLong (1); } static PyObject* quit (PyObject* self) { joy_autoquit (); Py_RETURN_NONE; } static PyObject* init (PyObject* self) { PyObject* result; int istrue; result = joy_autoinit (self); istrue = PyObject_IsTrue (result); Py_DECREF (result); if (!istrue) { return RAISE (PyExc_SDLError, SDL_GetError ()); } Py_RETURN_NONE; } static PyObject* get_init (PyObject* self) { return PyInt_FromLong (SDL_WasInit (SDL_INIT_JOYSTICK) != 0); } /*joystick object funcs*/ static void joy_dealloc (PyObject* self) { PyObject_DEL (self); } static PyObject* Joystick (PyObject* self, PyObject* args) { int id; if (!PyArg_ParseTuple (args, "i", &id)) { return NULL; } JOYSTICK_INIT_CHECK (); return PyJoystick_New (id); } static PyObject* get_count (PyObject* self) { JOYSTICK_INIT_CHECK (); return PyInt_FromLong (SDL_NumJoysticks ()); } static PyObject* joy_init (PyObject* self) { int joy_id = PyJoystick_AsID (self); JOYSTICK_INIT_CHECK (); if (!joystick_stickdata[joy_id]) { joystick_stickdata[joy_id] = SDL_JoystickOpen (joy_id); if (!joystick_stickdata[joy_id]) { return RAISE (PyExc_SDLError, SDL_GetError ()); } } Py_RETURN_NONE; } static PyObject* joy_quit (PyObject* self) { int joy_id = PyJoystick_AsID (self); JOYSTICK_INIT_CHECK (); if (joystick_stickdata[joy_id]) { SDL_JoystickClose (joystick_stickdata[joy_id]); joystick_stickdata[joy_id] = NULL; } Py_RETURN_NONE; } static PyObject* joy_get_init (PyObject* self) { int joy_id = PyJoystick_AsID (self); return PyInt_FromLong (joystick_stickdata[joy_id] != NULL); } static PyObject* joy_get_id (PyObject* self) { int joy_id = PyJoystick_AsID (self); return PyInt_FromLong (joy_id); } static PyObject* joy_get_name (PyObject* self) { int joy_id = PyJoystick_AsID (self); JOYSTICK_INIT_CHECK (); return Text_FromUTF8 (SDL_JoystickName (joy_id)); } static PyObject* joy_get_numaxes (PyObject* self) { int joy_id = PyJoystick_AsID (self); SDL_Joystick* joy = joystick_stickdata[joy_id]; JOYSTICK_INIT_CHECK (); if (!joy) { return RAISE (PyExc_SDLError, "Joystick not initialized"); } return PyInt_FromLong (SDL_JoystickNumAxes (joy)); } static PyObject* joy_get_axis (PyObject* self, PyObject* args) { int joy_id = PyJoystick_AsID (self); SDL_Joystick* joy = joystick_stickdata[joy_id]; int axis, value; if (!PyArg_ParseTuple (args, "i", &axis)) { return NULL; } JOYSTICK_INIT_CHECK (); if (!joy) { return RAISE (PyExc_SDLError, "Joystick not initialized"); } if (axis < 0 || axis >= SDL_JoystickNumAxes (joy)) { return RAISE (PyExc_SDLError, "Invalid joystick axis"); } value = SDL_JoystickGetAxis (joy, axis); printf("SDL_JoystickGetAxis value:%d:\n", value); return PyFloat_FromDouble (value / 32768.0); } static PyObject* joy_get_numbuttons (PyObject* self) { int joy_id = PyJoystick_AsID (self); SDL_Joystick* joy = joystick_stickdata[joy_id]; JOYSTICK_INIT_CHECK (); if (!joy) { return RAISE (PyExc_SDLError, "Joystick not initialized"); } return PyInt_FromLong (SDL_JoystickNumButtons (joy)); } static PyObject* joy_get_button (PyObject* self, PyObject* args) { int joy_id = PyJoystick_AsID (self); SDL_Joystick* joy = joystick_stickdata[joy_id]; int _index, value; if (!PyArg_ParseTuple (args, "i", &_index)) { return NULL; } JOYSTICK_INIT_CHECK (); if (!joy) { return RAISE (PyExc_SDLError, "Joystick not initialized"); } if (_index < 0 || _index >= SDL_JoystickNumButtons (joy)) { return RAISE (PyExc_SDLError, "Invalid joystick button"); } value = SDL_JoystickGetButton (joy, _index); printf("SDL_JoystickGetButton value:%d:\n", value); return PyInt_FromLong (value); } static PyObject* joy_get_numballs (PyObject* self) { int joy_id = PyJoystick_AsID (self); SDL_Joystick* joy = joystick_stickdata[joy_id]; JOYSTICK_INIT_CHECK (); if (!joy) { return RAISE (PyExc_SDLError, "Joystick not initialized"); } return PyInt_FromLong (SDL_JoystickNumBalls (joy)); } static PyObject* joy_get_ball (PyObject* self, PyObject* args) { int joy_id = PyJoystick_AsID (self); SDL_Joystick* joy = joystick_stickdata[joy_id]; int _index, dx, dy; Uint32 value; if (!PyArg_ParseTuple (args, "i", &_index)) { return NULL; } JOYSTICK_INIT_CHECK (); if (!joy) { return RAISE (PyExc_SDLError, "Joystick not initialized"); } value = SDL_JoystickNumBalls (joy); printf("SDL_JoystickNumBalls value:%d:\n", value); if (_index < 0 || _index >= value) { return RAISE (PyExc_SDLError, "Invalid joystick trackball"); } SDL_JoystickGetBall (joy, _index, &dx, &dy); return Py_BuildValue ("(ii)", dx, dy); } static PyObject* joy_get_numhats (PyObject* self) { int joy_id = PyJoystick_AsID (self); Uint32 value; SDL_Joystick* joy = joystick_stickdata[joy_id]; JOYSTICK_INIT_CHECK (); if (!joy) { return RAISE (PyExc_SDLError, "Joystick not initialized"); } value = SDL_JoystickNumHats (joy); printf("SDL_JoystickNumHats value:%d:\n", value); return PyInt_FromLong (value); } static PyObject* joy_get_hat (PyObject* self, PyObject* args) { int joy_id = PyJoystick_AsID (self); SDL_Joystick* joy = joystick_stickdata[joy_id]; int _index, px, py; Uint32 value; if (!PyArg_ParseTuple (args, "i", &_index)) { return NULL; } JOYSTICK_INIT_CHECK (); if (!joy) { return RAISE (PyExc_SDLError, "Joystick not initialized"); } if (_index < 0 || _index >= SDL_JoystickNumHats (joy)) { return RAISE(PyExc_SDLError, "Invalid joystick hat"); } px = py = 0; value = SDL_JoystickGetHat (joy, _index); printf("SDL_JoystickGetHat value:%d:\n", value); if (value & SDL_HAT_UP) { py = 1; } else if (value & SDL_HAT_DOWN) { py = -1; } if (value & SDL_HAT_RIGHT) { px = 1; } else if (value & SDL_HAT_LEFT) { px = -1; } return Py_BuildValue ("(ii)", px, py); } static PyMethodDef joy_methods[] = { { "init", (PyCFunction) joy_init, METH_NOARGS, DOC_JOYSTICKINIT }, { "quit", (PyCFunction) joy_quit, METH_NOARGS, DOC_JOYSTICKQUIT }, { "get_init", (PyCFunction) joy_get_init, METH_NOARGS, DOC_JOYSTICKGETINIT }, { "get_id", (PyCFunction) joy_get_id, METH_NOARGS, DOC_JOYSTICKGETID }, { "get_name", (PyCFunction) joy_get_name, METH_NOARGS, DOC_JOYSTICKGETNAME }, { "get_numaxes", (PyCFunction) joy_get_numaxes, METH_NOARGS, DOC_JOYSTICKGETNUMAXES }, { "get_axis", joy_get_axis, METH_VARARGS, DOC_JOYSTICKGETAXIS }, { "get_numbuttons", (PyCFunction) joy_get_numbuttons, METH_NOARGS, DOC_JOYSTICKGETNUMBUTTONS }, { "get_button", joy_get_button, METH_VARARGS, DOC_JOYSTICKGETBUTTON }, { "get_numballs", (PyCFunction) joy_get_numballs, METH_NOARGS, DOC_JOYSTICKGETNUMBALLS }, { "get_ball", joy_get_ball, METH_VARARGS, DOC_JOYSTICKGETBALL }, { "get_numhats", (PyCFunction) joy_get_numhats, METH_NOARGS, DOC_JOYSTICKGETNUMHATS }, { "get_hat", joy_get_hat, METH_VARARGS, DOC_JOYSTICKGETHAT }, { NULL, NULL, 0, NULL } }; static PyTypeObject PyJoystick_Type = { TYPE_HEAD (NULL, 0) "Joystick", /* name */ sizeof(PyJoystickObject), /* basic size */ 0, /* itemsize */ joy_dealloc, /* dealloc */ 0, /* print */ 0, /* getattr */ 0, /* setattr */ 0, /* compare */ 0, /* repr */ 0, /* as_number */ 0, /* as_sequence */ 0, /* as_mapping */ 0, /* hash */ 0, /* call */ 0, /* str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* flags */ DOC_PYGAMEJOYSTICKJOYSTICK, /* Documentation string */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ joy_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ }; static PyObject* PyJoystick_New (int id) { PyJoystickObject* joy; if (id < 0 || id >= JOYSTICK_MAXSTICKS || id >= SDL_NumJoysticks ()) { return RAISE (PyExc_SDLError, "Invalid joystick device number"); } joy = PyObject_NEW (PyJoystickObject, &PyJoystick_Type); if (!joy) { return NULL; } joy->id = id; return (PyObject*)joy; } static PyMethodDef _joystick_methods[] = { { "__PYGAMEinit__", (PyCFunction) joy_autoinit, METH_NOARGS, "auto initialize function for joystick" }, { "init", (PyCFunction) init, METH_NOARGS, DOC_PYGAMEJOYSTICKINIT }, { "quit", (PyCFunction) quit, METH_NOARGS, DOC_PYGAMEJOYSTICKQUIT }, { "get_init", (PyCFunction) get_init, METH_NOARGS, DOC_PYGAMEJOYSTICKGETINIT }, { "get_count", (PyCFunction) get_count, METH_NOARGS, DOC_PYGAMEJOYSTICKGETCOUNT }, { "Joystick", Joystick, METH_VARARGS, DOC_PYGAMEJOYSTICKJOYSTICK }, { NULL, NULL, 0, NULL } }; MODINIT_DEFINE (joystick) { PyObject *module, *dict, *apiobj; int ecode; static void* c_api[PYGAMEAPI_JOYSTICK_NUMSLOTS]; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "joystick", DOC_PYGAMEJOYSTICK, -1, _joystick_methods, NULL, NULL, NULL, NULL }; #endif /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } /* type preparation */ if (PyType_Ready (&PyJoystick_Type) == -1) { MODINIT_ERROR; } /* create the module */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 ("joystick", _joystick_methods, DOC_PYGAMEJOYSTICK); #endif if (module == NULL) { MODINIT_ERROR; } dict = PyModule_GetDict (module); if (PyDict_SetItemString (dict, "JoystickType", (PyObject *)&PyJoystick_Type) == -1) { DECREF_MOD (module); MODINIT_ERROR; } /* export the c api */ c_api[0] = &PyJoystick_Type; c_api[1] = PyJoystick_New; apiobj = PyCObject_FromVoidPtr (c_api, NULL); if (apiobj == NULL) { DECREF_MOD (module); MODINIT_ERROR; } ecode = PyDict_SetItemString (dict, PYGAMEAPI_LOCAL_ENTRY, apiobj); Py_DECREF (apiobj); if (ecode == -1) { DECREF_MOD (module); MODINIT_ERROR; } MODINIT_RETURN (module); } pygame-1.9.1release/src/imageext.c0000644000175000017500000004210311207055754017007 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners Copyright (C) 2006 Rene Dudfield This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* * extended image module for pygame, note this only has * the extended load and save functions, which are autmatically used * by the normal pygame.image module if it is available. */ // This is temporal until PNG support is done for Symbian #ifdef __SYMBIAN32__ #include #else #include #endif #include /* Keep a stray macro from conflicting with python.h */ #if defined(HAVE_PROTOTYPES) #undef HAVE_PROTOTYPES #endif /* Remove GCC macro redefine warnings. */ #if defined(HAVE_STDDEF_H) /* also defined in pygame.h (python.h) */ #undef HAVE_STDDEF_H #endif #if defined(HAVE_STDLIB_H) /* also defined in pygame.h (SDL.h) */ #undef HAVE_STDLIB_H #endif #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" #include "pgopengl.h" #include static char* find_extension (char* fullname) { char* dot; if (!fullname) return NULL; dot = strrchr (fullname, '.'); if (!dot) return fullname; return dot + 1; } static PyObject* image_load_ext (PyObject* self, PyObject* arg) { PyObject *file, *final; #if PY3 PyObject *oname, *odecoded = NULL; #endif char* name = NULL; SDL_Surface* surf; SDL_RWops *rw; if (!PyArg_ParseTuple (arg, "O|s", &file, &name)) return NULL; #if PY3 if (PyUnicode_Check (file)) #else if (PyString_Check (file) || PyUnicode_Check (file)) #endif { if (!PyArg_ParseTuple (arg, "s|O", &name, &file)) return NULL; Py_BEGIN_ALLOW_THREADS; surf = IMG_Load (name); Py_END_ALLOW_THREADS; } #if PY3 else if (PyBytes_Check (file)) { name = PyBytes_AsString (file); if (name == NULL) { return NULL; } Py_BEGIN_ALLOW_THREADS; surf = IMG_Load (name); Py_END_ALLOW_THREADS; } #endif else { #if PY3 if (name == NULL) { oname = PyObject_GetAttrString (file, "name"); if (oname == NULL) { PyErr_Clear (); } else { if (PyUnicode_Check (oname)) { odecoded = PyUnicode_AsASCIIString (oname); Py_DECREF (oname); if (odecoded == NULL) { return NULL; } name = PyBytes_AsString (odecoded); } else if (PyBytes_Check (oname)) { name = PyBytes_AsString (oname); } } } #else if (!name && PyFile_Check (file)) name = PyString_AsString (PyFile_Name (file)); #endif if (!(rw = RWopsFromPython (file))) { #if PY3 Py_XDECREF (odecoded); #endif return NULL; } if (RWopsCheckPython (rw)) { surf = IMG_LoadTyped_RW (rw, 1, find_extension (name)); } else { Py_BEGIN_ALLOW_THREADS; surf = IMG_LoadTyped_RW (rw, 1, find_extension (name)); Py_END_ALLOW_THREADS; } #if PY3 Py_XDECREF (odecoded); #endif } if (!surf) return RAISE (PyExc_SDLError, IMG_GetError ()); final = PySurface_New (surf); if (!final) SDL_FreeSurface (surf); return final; } #ifdef PNG_H static int write_png (char *file_name, png_bytep *rows, int w, int h, int colortype, int bitdepth) { png_structp png_ptr; png_infop info_ptr; FILE *fp = NULL; char *doing = "open for writing"; if (!(fp = fopen (file_name, "wb"))) goto fail; doing = "create png write struct"; if (!(png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL))) goto fail; doing = "create png info struct"; if (!(info_ptr = png_create_info_struct (png_ptr))) goto fail; if (setjmp (png_jmpbuf (png_ptr))) goto fail; doing = "init IO"; png_init_io (png_ptr, fp); doing = "write header"; png_set_IHDR (png_ptr, info_ptr, w, h, bitdepth, colortype, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); doing = "write info"; png_write_info (png_ptr, info_ptr); doing = "write image"; png_write_image (png_ptr, rows); doing = "write end"; png_write_end (png_ptr, NULL); doing = "closing file"; if(0 != fclose (fp)) goto fail; return 0; fail: SDL_SetError ("SavePNG: could not %s", doing); return -1; } static int SavePNG (SDL_Surface *surface, char *file) { static unsigned char** ss_rows; static int ss_size; static int ss_w, ss_h; SDL_Surface *ss_surface; SDL_Rect ss_rect; int r, i; int alpha = 0; int pixel_bits = 32; unsigned surf_flags; unsigned surf_alpha; ss_rows = 0; ss_size = 0; ss_surface = NULL; ss_w = surface->w; ss_h = surface->h; if (surface->format->Amask) { alpha = 1; pixel_bits = 32; } else pixel_bits = 24; ss_surface = SDL_CreateRGBSurface (SDL_SWSURFACE|SDL_SRCALPHA, ss_w, ss_h, pixel_bits, #if SDL_BYTEORDER == SDL_BIG_ENDIAN 0xff0000, 0xff00, 0xff, 0x000000ff #else 0xff, 0xff00, 0xff0000, 0xff000000 #endif ); if (ss_surface == NULL) return -1; surf_flags = surface->flags & (SDL_SRCALPHA | SDL_SRCCOLORKEY); surf_alpha = surface->format->alpha; if (surf_flags & SDL_SRCALPHA) SDL_SetAlpha (surface, 0, 255); if (surf_flags & SDL_SRCCOLORKEY) SDL_SetColorKey (surface, 0, surface->format->colorkey); ss_rect.x = 0; ss_rect.y = 0; ss_rect.w = ss_w; ss_rect.h = ss_h; SDL_BlitSurface (surface, &ss_rect, ss_surface, NULL); if (ss_size == 0) { ss_size = ss_h; ss_rows = (unsigned char**) malloc (sizeof (unsigned char*) * ss_size); if (ss_rows == NULL) return -1; } if (surf_flags & SDL_SRCALPHA) SDL_SetAlpha (surface, SDL_SRCALPHA, (Uint8)surf_alpha); if (surf_flags & SDL_SRCCOLORKEY) SDL_SetColorKey (surface, SDL_SRCCOLORKEY, surface->format->colorkey); for (i = 0; i < ss_h; i++) { ss_rows[i] = ((unsigned char*)ss_surface->pixels) + i * ss_surface->pitch; } if (alpha) { r = write_png (file, ss_rows, surface->w, surface->h, PNG_COLOR_TYPE_RGB_ALPHA, 8); } else { r = write_png (file, ss_rows, surface->w, surface->h, PNG_COLOR_TYPE_RGB, 8); } free (ss_rows); SDL_FreeSurface (ss_surface); ss_surface = NULL; return r; } #endif /* end if PNG_H */ #ifdef JPEGLIB_H #define NUM_LINES_TO_WRITE 500 int write_jpeg (char *file_name, unsigned char** image_buffer, int image_width, int image_height, int quality) { struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; FILE * outfile; JSAMPROW row_pointer[NUM_LINES_TO_WRITE]; int row_stride; int num_lines_to_write; int lines_written; int i; row_stride = image_width * 3; num_lines_to_write = NUM_LINES_TO_WRITE; cinfo.err = jpeg_std_error (&jerr); jpeg_create_compress (&cinfo); if ((outfile = fopen (file_name, "wb")) == NULL) { SDL_SetError ("SaveJPEG: could not open %s", file_name); return -1; } jpeg_stdio_dest (&cinfo, outfile); cinfo.image_width = image_width; cinfo.image_height = image_height; cinfo.input_components = 3; cinfo.in_color_space = JCS_RGB; /* cinfo.optimize_coding = FALSE; */ /* cinfo.optimize_coding = FALSE; */ jpeg_set_defaults (&cinfo); jpeg_set_quality (&cinfo, quality, TRUE); jpeg_start_compress (&cinfo, TRUE); /* try and write many scanlines at once. */ while (cinfo.next_scanline < cinfo.image_height) { if (num_lines_to_write > (cinfo.image_height - cinfo.next_scanline) -1) { num_lines_to_write = (cinfo.image_height - cinfo.next_scanline); } /* copy the memory from the buffers */ for(i =0; i < num_lines_to_write; i++) { row_pointer[i] = image_buffer[cinfo.next_scanline + i]; } /* num_lines_to_write = 1; row_pointer[0] = image_buffer[cinfo.next_scanline]; printf("num_lines_to_write:%d: cinfo.image_height:%d: cinfo.next_scanline:%d:\n", num_lines_to_write, cinfo.image_height, cinfo.next_scanline); */ lines_written = jpeg_write_scanlines (&cinfo, row_pointer, num_lines_to_write); /* printf("lines_written:%d:\n", lines_written); */ } jpeg_finish_compress (&cinfo); fclose (outfile); jpeg_destroy_compress (&cinfo); return 0; } int SaveJPEG (SDL_Surface *surface, char *file) { static unsigned char** ss_rows; static int ss_size; static int ss_w, ss_h; SDL_Surface *ss_surface; SDL_Rect ss_rect; int r, i; int alpha = 0; int pixel_bits = 32; int free_ss_surface = 1; ss_rows = 0; ss_size = 0; ss_surface = NULL; ss_w = surface->w; ss_h = surface->h; alpha = 0; pixel_bits = 24; if(!surface) { return -1; } /* See if the Surface is suitable for using directly. So no conversion is needed. 24bit, RGB */ if((surface->format->BytesPerPixel == 3) && !(surface->flags & SDL_SRCALPHA) && (surface->format->Rshift == 0)) { /* printf("not creating...\n"); */ ss_surface = surface; free_ss_surface = 0; } else { /* printf("creating...\n"); */ /* If it is not, then we need to make a new surface. */ ss_surface = SDL_CreateRGBSurface (SDL_SWSURFACE, ss_w, ss_h, pixel_bits, #if SDL_BYTEORDER == SDL_BIG_ENDIAN 0xff0000, 0xff00, 0xff, 0x000000ff #else 0xff, 0xff00, 0xff0000, 0xff000000 #endif ); if (ss_surface == NULL) { return -1; } ss_rect.x = 0; ss_rect.y = 0; ss_rect.w = ss_w; ss_rect.h = ss_h; SDL_BlitSurface (surface, &ss_rect, ss_surface, NULL); free_ss_surface = 1; } ss_size = ss_h; ss_rows = (unsigned char**) malloc (sizeof (unsigned char*) * ss_size); if(ss_rows == NULL) { /* clean up the allocated surface too */ if(free_ss_surface) { SDL_FreeSurface (ss_surface); } return -1; } /* copy pointers to the scanlines... since they might not be packed. */ for (i = 0; i < ss_h; i++) { ss_rows[i] = ((unsigned char*)ss_surface->pixels) + i * ss_surface->pitch; } r = write_jpeg (file, ss_rows, surface->w, surface->h, 85); free (ss_rows); if(free_ss_surface) { SDL_FreeSurface (ss_surface); ss_surface = NULL; } return r; } #endif /* end if JPEGLIB_H */ /* NOTE XX HACK TODO FIXME: this opengltosdl is also in image.c need to share it between both. */ static SDL_Surface* opengltosdl (void) { /*we need to get ahold of the pyopengl glReadPixels function*/ /*we use pyopengl's so we don't need to link with opengl at compiletime*/ SDL_Surface *surf = NULL; Uint32 rmask, gmask, bmask; int i; unsigned char *pixels = NULL; GL_glReadPixels_Func p_glReadPixels= NULL; p_glReadPixels = (GL_glReadPixels_Func) SDL_GL_GetProcAddress("glReadPixels"); surf = SDL_GetVideoSurface (); if(!surf) { RAISE (PyExc_RuntimeError, "Cannot get video surface."); return NULL; } if(!p_glReadPixels) { RAISE (PyExc_RuntimeError, "Cannot find glReadPixels function."); return NULL; } pixels = (unsigned char*) malloc(surf->w * surf->h * 3); if(!pixels) { RAISE (PyExc_MemoryError, "Cannot allocate enough memory for pixels."); return NULL; } /* GL_RGB, GL_UNSIGNED_BYTE */ p_glReadPixels(0, 0, surf->w, surf->h, 0x1907, 0x1401, pixels); if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { rmask=0x000000FF; gmask=0x0000FF00; bmask=0x00FF0000; } else { rmask=0x00FF0000; gmask=0x0000FF00; bmask=0x000000FF; } surf = SDL_CreateRGBSurface (SDL_SWSURFACE, surf->w, surf->h, 24, rmask, gmask, bmask, 0); if (!surf) { free(pixels); RAISE (PyExc_SDLError, SDL_GetError ()); return NULL; } for (i = 0; i < surf->h; ++i) { memcpy (((char *) surf->pixels) + surf->pitch * i, pixels + 3 * surf->w * (surf->h - i - 1), surf->w * 3); } free(pixels); return surf; } static PyObject* image_save_ext (PyObject* self, PyObject* arg) { PyObject* surfobj, *file; SDL_Surface *surf; SDL_Surface *temp = NULL; int result; if (!PyArg_ParseTuple (arg, "O!O", &PySurface_Type, &surfobj, &file)) return NULL; surf = PySurface_AsSurface (surfobj); if (surf->flags & SDL_OPENGL) { temp = surf = opengltosdl (); if (!surf) return NULL; } else PySurface_Prep (surfobj); #if PY3 if (PyUnicode_Check (file) || PyBytes_Check (file)) #else if (PyString_Check (file) || PyUnicode_Check (file)) #endif { int namelen; char* name; #if PY3 if (PyBytes_Check (file)) { if (!PyArg_ParseTuple (arg, "0|y", &file, &name)) { return NULL; } } else #endif if (!PyArg_ParseTuple (arg, "O|s", &file, &name)) return NULL; namelen = strlen (name); if ((namelen >= 4) && (((name[namelen - 1]=='g' || name[namelen - 1]=='G') && (name[namelen - 2]=='e' || name[namelen - 2]=='E') && (name[namelen - 3]=='p' || name[namelen - 3]=='P') && (name[namelen - 4]=='j' || name[namelen - 4]=='J')) || ((name[namelen - 1]=='g' || name[namelen - 1]=='G') && (name[namelen - 2]=='p' || name[namelen - 2]=='P') && (name[namelen - 3]=='j' || name[namelen - 3]=='J')))) { #ifdef JPEGLIB_H /* jpg save functions seem *NOT* thread safe at least on windows. */ /* Py_BEGIN_ALLOW_THREADS; */ result = SaveJPEG (surf, name); /* Py_END_ALLOW_THREADS; */ #else return RAISE (PyExc_SDLError, "No support for jpg compiled in."); #endif } else if ((namelen >= 3) && ((name[namelen - 1]=='g' || name[namelen - 1]=='G') && (name[namelen - 2]=='n' || name[namelen - 2]=='N') && (name[namelen - 3]=='p' || name[namelen - 3]=='P'))) { #ifdef PNG_H /*Py_BEGIN_ALLOW_THREADS; */ result = SavePNG (surf, name); /*Py_END_ALLOW_THREADS; */ #else return RAISE (PyExc_SDLError, "No support for png compiled in."); #endif } else result = -1; } else return NULL; if(temp) SDL_FreeSurface (temp); else PySurface_Unprep (surfobj); if (result == -1) return RAISE (PyExc_SDLError, SDL_GetError ()); Py_RETURN_NONE; } static PyMethodDef _imageext_methods[] = { { "load_extended", image_load_ext, METH_VARARGS, DOC_PYGAMEIMAGE }, { "save_extended", image_save_ext, METH_VARARGS, DOC_PYGAMEIMAGE }, { NULL, NULL, 0, NULL } }; /*DOC*/ static char _imageext_doc[] = /*DOC*/ "additional image loaders"; MODINIT_DEFINE (imageext) { PyObject *module; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "imageext", _imageext_doc, -1, _imageext_methods, NULL, NULL, NULL, NULL }; #endif /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_surface (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_rwobject (); if (PyErr_Occurred ()) { MODINIT_ERROR; } /* create the module */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3(MODPREFIX "imageext", _imageext_methods, _imageext_doc); #endif MODINIT_RETURN (module); } pygame-1.9.1release/src/image.doc0000644000175000017500000001132610663257233016615 0ustar vincentvincentpygame.image pygame module for image transfer The image module contains functions for loading and saving pictures, as well as transferring Surfaces to formats usable by other packages. Note that there is no Image class; an image is loaded as a Surface object. The Surface class allows manipulation (drawing lines, setting pixels, capturing regions, etc.). The image module is a required dependency of Pygame, but it only optionally supports any extended file formats. By default it can only load uncompressed BMP images. When built with full image support, the pygame.image.load() function can support the following formats. * JPG * PNG * GIF (non animated) * BMP * PCX * TGA (uncompressed) * TIF * LBM (and PBM) * PBM (and PGM, PPM) * XPM Saving images only supports a limited set of formats. You can save to the following formats. * BMP * TGA * PNG * JPEG PNG, JPEG saving new in pygame 1.8.
    load load new image from a file pygame.image.load(filename): return Surface pygame.image.load(fileobj, namehint=""): return Surface Load an image from a file source. You can pass either a filename or a Python file-like object. Pygame will automatically determine the image type (e.g., GIF or bitmap) and create a new Surface object from the data. In some cases it will need to know the file extension (e.g., GIF images should end in ".gif"). If you pass a raw file-like object, you may also want to pass the original filename as the namehint argument. The returned Surface will contain the same color format, colorkey and alpha transparency as the file it came from. You will often want to call Surface.convert() with no arguments, to create a copy that will draw more quickly on the screen. For alpha transparency, like in .png images use the convert_alpha() method after loading so that the image has per pixel transparency. Pygame may not always be built to support all image formats. At minimum it will support uncompressed BMP. If pygame.image.get_extended() returns 'True', you should be able to load most images( including png, jpg and gif ). You should use os.path.join() for compatibility. eg. asurf = pygame.image.load(os.path.join('data', 'bla.png')) save save an image to disk pygame.image.save(Surface, filename): return None This will save your Surface as either a BMP, TGA, PNG, or JPEG image. If the filename extension is unrecognized it will default to TGA. Both TGA, and BMP file formats create uncompressed files. PNG, JPEG saving new in pygame 1.8. get_extended test if extended image formats can be loaded pygame.image.get_extended(): return bool If pygame is built with extended image formats this function will return True. It is still not possible to determine which formats will be available, but generally you will be able to load them all. tostring transfer image to string buffer pygame.image.tostring(Surface, format, flipped=False): return string Creates a string that can be transferred with the 'fromstring' method in other Python imaging packages. Some Python image packages prefer their images in bottom-to-top format (PyOpenGL for example). If you pass True for the flipped argument, the string buffer will be vertically flipped. The format argument is a string of one of the following values. Note that only 8bit Surfaces can use the "P" format. The other formats will work for any Surface. Also note that other Python image packages support more formats than Pygame. * P, 8bit palettized Surfaces * RGB, 24bit image * RGBX, 32bit image with unused space * RGBA, 32bit image with an alpha channel * ARGB, 32bit image with alpha channel first * RGBA_PREMULT, 32bit image with colors scaled by alpha channel * ARGB_PREMULT, 32bit image with colors scaled by alpha channel, alpha channel first fromstring create new Surface from a string buffer pygame.image.fromstring(string, size, format, flipped=False): return Surface This function takes arguments similar to pygame.image.tostring(). The size argument is a pair of numbers representing the width and height. Once the new Surface is created you can destroy the string buffer. The size and format image must compute the exact same size as the passed string buffer. Otherwise an exception will be raised. See the pygame.image.frombuffer() method for a potentially faster way to transfer images into Pygame. frombuffer create a new Surface that shares data inside a string buffer pygame.image.frombuffer(string, size, format): return Surface Create a new Surface that shares pixel data directly from the string buffer. This method takes the same arguments as pygame.image.fromstring(), but is unable to vertically flip the source data. This will run much faster than pygame.image.fromstring, since no pixel data must be allocated and copied. pygame-1.9.1release/src/image.c0000644000175000017500000013031511207055754016271 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners Copyright (C) 2006 Rene Dudfield This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* * image module for pygame */ #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" #include "pgopengl.h" struct _module_state { int is_extended; }; #if PY3 #define GETSTATE(m) PY3_GETSTATE (_module_state, m) #else static struct _module_state _state = { 0 }; #define GETSTATE(m) PY2_GETSTATE (_state) #endif static int SaveTGA (SDL_Surface *surface, char *file, int rle); static int SaveTGA_RW (SDL_Surface *surface, SDL_RWops *out, int rle); static SDL_Surface* opengltosdl (void); #define DATAROW(data, row, width, height, flipped) \ ((flipped) ? (((char*) data) + (height - row - 1) * width) : \ (((char*) data) + row * width)) static PyObject* image_load_basic (PyObject* self, PyObject* arg) { PyObject* file, *final; char* name = NULL; SDL_Surface* surf; SDL_RWops *rw; if (!PyArg_ParseTuple (arg, "O|s", &file, &name)) return NULL; #if PY3 if (PyUnicode_Check (file)) { if (!PyArg_ParseTuple (arg, "s|O", &name, &file)) return NULL; Py_BEGIN_ALLOW_THREADS; surf = SDL_LoadBMP (name); Py_END_ALLOW_THREADS; } else if (PyBytes_Check (file)) { if (!PyArg_ParseTuple (arg, "y|O", &name, &file)) return NULL; Py_BEGIN_ALLOW_THREADS; surf = SDL_LoadBMP (name); Py_END_ALLOW_THREADS; } #else if (PyString_Check (file) || PyUnicode_Check (file)) { if (!PyArg_ParseTuple (arg, "s|O", &name, &file)) return NULL; Py_BEGIN_ALLOW_THREADS; surf = SDL_LoadBMP (name); Py_END_ALLOW_THREADS; } #endif else { if (!(rw = RWopsFromPython (file))) return NULL; if (RWopsCheckPython (rw)) surf = SDL_LoadBMP_RW (rw, 1); else { Py_BEGIN_ALLOW_THREADS; surf = SDL_LoadBMP_RW (rw, 1); Py_END_ALLOW_THREADS; } } if (!surf) return RAISE (PyExc_SDLError, SDL_GetError ()); final = PySurface_New (surf); if (!final) SDL_FreeSurface (surf); return final; } static SDL_Surface* opengltosdl () { /*we need to get ahold of the pyopengl glReadPixels function*/ /*we use pyopengl's so we don't need to link with opengl at compiletime*/ SDL_Surface *surf = NULL; Uint32 rmask, gmask, bmask; int i; unsigned char *pixels = NULL; GL_glReadPixels_Func p_glReadPixels = NULL; p_glReadPixels = (GL_glReadPixels_Func) SDL_GL_GetProcAddress("glReadPixels"); surf = SDL_GetVideoSurface (); if(!surf) { RAISE (PyExc_RuntimeError, "Cannot get video surface."); return NULL; } if(!p_glReadPixels) { RAISE (PyExc_RuntimeError, "Cannot find glReadPixels function."); return NULL; } /* GL_UNSIGNED_BYTE = 5121 GL_RGB = 6407 */ pixels = (unsigned char*) malloc(surf->w * surf->h * 3); if(!pixels) { RAISE (PyExc_MemoryError, "Cannot allocate enough memory for pixels."); return NULL; } //p_glReadPixels(0, 0, surf->w, surf->h, 6407, 5121, pixels); //glReadPixels(0, 0, surf->w, surf->h, 0x1907, 0x1401, pixels); p_glReadPixels(0, 0, surf->w, surf->h, 0x1907, 0x1401, pixels); if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { rmask=0x000000FF; gmask=0x0000FF00; bmask=0x00FF0000; } else { rmask=0x00FF0000; gmask=0x0000FF00; bmask=0x000000FF; } surf = SDL_CreateRGBSurface (SDL_SWSURFACE, surf->w, surf->h, 24, rmask, gmask, bmask, 0); if (!surf) { free(pixels); RAISE (PyExc_SDLError, SDL_GetError ()); return NULL; } for (i = 0; i < surf->h; ++i) { memcpy (((char *) surf->pixels) + surf->pitch * i, pixels + 3 * surf->w * (surf->h - i - 1), surf->w * 3); } free(pixels); return surf; } PyObject* image_save (PyObject* self, PyObject* arg) { PyObject* surfobj, *file; PyObject *imgext = NULL; SDL_Surface *surf; SDL_Surface *temp = NULL; int result = 0; if (!PyArg_ParseTuple (arg, "O!O", &PySurface_Type, &surfobj, &file)) return NULL; surf = PySurface_AsSurface (surfobj); if (surf->flags & SDL_OPENGL) { temp = surf = opengltosdl (); if (!surf) return NULL; } else PySurface_Prep (surfobj); #if PY3 if (PyBytes_Check (file) || PyUnicode_Check (file)) #else if (PyString_Check (file) || PyUnicode_Check (file)) #endif { int namelen; char* name; int written = 0; #if PY3 if (PyUnicode_Check (file)) { if (!PyArg_ParseTuple (arg, "O|s", &file, &name)) { return NULL; } } else { if (!PyArg_ParseTuple (arg, "O|y", &file, &name)) { return NULL; } } #else if (!PyArg_ParseTuple (arg, "O|s", &file, &name)) return NULL; #endif namelen = strlen (name); if (namelen > 3) { if ((name[namelen - 1]=='p' || name[namelen - 1]=='P') && (name[namelen - 2]=='m' || name[namelen - 2]=='M') && (name[namelen - 3]=='b' || name[namelen - 3]=='B')) { Py_BEGIN_ALLOW_THREADS; result = SDL_SaveBMP (surf, name); Py_END_ALLOW_THREADS; written = 1; } else if (((name[namelen - 1]=='g' || name[namelen - 1]=='G') && (name[namelen - 2]=='n' || name[namelen - 2]=='N') && (name[namelen - 3]=='p' || name[namelen - 3]=='P')) || ((name[namelen - 1]=='g' || name[namelen - 1]=='G') && (name[namelen - 2]=='e' || name[namelen - 2]=='E') && (name[namelen - 3]=='p' || name[namelen - 3]=='P') && (name[namelen - 4]=='j' || name[namelen - 4]=='J')) || ((name[namelen - 1]=='g' || name[namelen - 1]=='G') && (name[namelen - 2]=='p' || name[namelen - 2]=='P') && (name[namelen - 3]=='j' || name[namelen - 3]=='J'))) { /* If it is .png .jpg .jpeg use the extended module. */ /* try to get extended formats */ imgext = PyImport_ImportModule (IMPPREFIX "imageext"); if (imgext) { PyObject *extdict = PyModule_GetDict (imgext); PyObject* extsave = PyDict_GetItemString (extdict, "save_extended"); PyObject* data = PyObject_CallObject (extsave, arg); if (!data) result = -1; Py_DECREF (imgext); /* Data must be decremented here, not? */ if (data) { Py_DECREF (data); } } else { result = -2; } written = 1; } } if (!written) { Py_BEGIN_ALLOW_THREADS; result = SaveTGA (surf, name, 1); Py_END_ALLOW_THREADS; } } else { SDL_RWops* rw; if (!(rw = RWopsFromPython (file))) return NULL; result = SaveTGA_RW (surf, rw, 1); } if (temp) SDL_FreeSurface (temp); else PySurface_Unprep (surfobj); if (result == -2) return imgext; if (result == -1) return RAISE (PyExc_SDLError, SDL_GetError ()); Py_RETURN_NONE; } PyObject* image_get_extended (PyObject* self, PyObject* arg) { return PyInt_FromLong (GETSTATE (self)->is_extended); } PyObject* image_tostring (PyObject* self, PyObject* arg) { PyObject *surfobj, *string = NULL; char *format, *data, *pixels; SDL_Surface *surf, *temp = NULL; int w, h, color, flipped = 0; Py_ssize_t len; Uint32 Rmask, Gmask, Bmask, Amask, Rshift, Gshift, Bshift, Ashift, Rloss, Gloss, Bloss, Aloss; int hascolorkey, colorkey; Uint32 alpha; if (!PyArg_ParseTuple (arg, "O!s|i", &PySurface_Type, &surfobj, &format, &flipped)) return NULL; surf = PySurface_AsSurface (surfobj); if (surf->flags & SDL_OPENGL) { temp = surf = opengltosdl (); if (!surf) return NULL; } Rmask = surf->format->Rmask; Gmask = surf->format->Gmask; Bmask = surf->format->Bmask; Amask = surf->format->Amask; Rshift = surf->format->Rshift; Gshift = surf->format->Gshift; Bshift = surf->format->Bshift; Ashift = surf->format->Ashift; Rloss = surf->format->Rloss; Gloss = surf->format->Gloss; Bloss = surf->format->Bloss; Aloss = surf->format->Aloss; hascolorkey = (surf->flags & SDL_SRCCOLORKEY) && !Amask; colorkey = surf->format->colorkey; if (!strcmp (format, "P")) { if (surf->format->BytesPerPixel != 1) return RAISE (PyExc_ValueError, "Can only create \"P\" format data with 8bit Surfaces"); string = Bytes_FromStringAndSize (NULL, surf->w * surf->h); if (!string) return NULL; Bytes_AsStringAndSize (string, &data, &len); PySurface_Lock (surfobj); pixels = (char*) surf->pixels; for (h = 0; h < surf->h; ++h) memcpy (DATAROW (data, h, surf->w, surf->h, flipped), pixels + (h * surf->pitch), surf->w); PySurface_Unlock (surfobj); } else if (!strcmp (format, "RGB")) { string = Bytes_FromStringAndSize (NULL, surf->w * surf->h * 3); if (!string) return NULL; Bytes_AsStringAndSize (string, &data, &len); if (!temp) PySurface_Lock (surfobj); pixels = (char*) surf->pixels; switch (surf->format->BytesPerPixel) { case 1: for (h = 0; h < surf->h; ++h) { Uint8* ptr = (Uint8*) DATAROW (surf->pixels, h, surf->pitch, surf->h, flipped); for (w = 0; w < surf->w; ++w) { color = *ptr++; data[0] = (char) surf->format->palette->colors[color].r; data[1] = (char) surf->format->palette->colors[color].g; data[2] = (char) surf->format->palette->colors[color].b; data += 3; } } break; case 2: for (h = 0; h < surf->h; ++h) { Uint16* ptr = (Uint16*) DATAROW (surf->pixels, h, surf->pitch, surf->h, flipped); for(w = 0; w < surf->w; ++w) { color = *ptr++; data[0] = (char) (((color & Rmask) >> Rshift) << Rloss); data[1] = (char) (((color & Gmask) >> Gshift) << Gloss); data[2] = (char) (((color & Bmask) >> Bshift) << Bloss); data += 3; } } break; case 3: for (h = 0; h < surf->h; ++h) { Uint8* ptr = (Uint8*) DATAROW (surf->pixels, h, surf->pitch, surf->h, flipped); for(w = 0; w < surf->w; ++w) { #if SDL_BYTEORDER == SDL_LIL_ENDIAN color = ptr[0] + (ptr[1]<<8) + (ptr[2]<<16); #else color = ptr[2] + (ptr[1]<<8) + (ptr[0]<<16); #endif ptr += 3; data[0] = (char) (((color & Rmask) >> Rshift) << Rloss); data[1] = (char) (((color & Gmask) >> Gshift) << Gloss); data[2] = (char) (((color & Bmask) >> Bshift) << Bloss); data += 3; } } break; case 4: for (h = 0; h < surf->h; ++h) { Uint32* ptr = (Uint32*) DATAROW (surf->pixels, h, surf->pitch, surf->h, flipped); for (w = 0; w < surf->w; ++w) { color = *ptr++; data[0] = (char) (((color & Rmask) >> Rshift) << Rloss); data[1] = (char) (((color & Gmask) >> Gshift) << Rloss); data[2] = (char) (((color & Bmask) >> Bshift) << Rloss); data += 3; } } break; } if (!temp) PySurface_Unlock (surfobj); } else if (!strcmp (format, "RGBX") || !strcmp (format, "RGBA")) { if (strcmp (format, "RGBA")) hascolorkey = 0; string = Bytes_FromStringAndSize (NULL, surf->w * surf->h * 4); if (!string) return NULL; Bytes_AsStringAndSize (string, &data, &len); PySurface_Lock (surfobj); pixels = (char*) surf->pixels; switch (surf->format->BytesPerPixel) { case 1: for(h = 0; h < surf->h; ++h) { Uint8* ptr = (Uint8*) DATAROW (surf->pixels, h, surf->pitch, surf->h, flipped); for(w = 0; w < surf->w; ++w) { color = *ptr++; data[0] = (char) surf->format->palette->colors[color].r; data[1] = (char) surf->format->palette->colors[color].g; data[2] = (char) surf->format->palette->colors[color].b; data[3] = hascolorkey ? (char)(color != colorkey) * 255 : (char)255; data += 4; } } break; case 2: for (h = 0; h < surf->h; ++h) { Uint16* ptr = (Uint16*) DATAROW (surf->pixels, h, surf->pitch, surf->h, flipped); for(w = 0; w < surf->w; ++w) { color = *ptr++; data[0] = (char) (((color & Rmask) >> Rshift) << Rloss); data[1] = (char) (((color & Gmask) >> Gshift) << Gloss); data[2] = (char) (((color & Bmask) >> Bshift) << Bloss); data[3] = hascolorkey ? (char)(color!=colorkey) * 255 : (char)(Amask ? (((color & Amask) >> Ashift) << Aloss) : 255); data += 4; } } break; case 3: for (h = 0; h < surf->h; ++h) { Uint8* ptr = (Uint8*) DATAROW (surf->pixels, h, surf->pitch, surf->h, flipped); for (w = 0; w < surf->w; ++w) { #if SDL_BYTEORDER == SDL_LIL_ENDIAN color = ptr[0] + (ptr[1]<<8) + (ptr[2]<<16); #else color = ptr[2] + (ptr[1]<<8) + (ptr[0]<<16); #endif ptr += 3; data[0] = (char) (((color & Rmask) >> Rshift) << Rloss); data[1] = (char) (((color & Gmask) >> Gshift) << Gloss); data[2] = (char) (((color & Bmask) >> Bshift) << Bloss); data[3] = hascolorkey ? (char)(color!=colorkey)*255 : (char)(Amask ? (((color & Amask) >> Ashift) << Aloss) : 255); data += 4; } } break; case 4: for (h = 0; h < surf->h; ++h) { Uint32* ptr = (Uint32*) DATAROW (surf->pixels, h, surf->pitch, surf->h, flipped); for(w = 0; w < surf->w; ++w) { color = *ptr++; data[0] = (char) (((color & Rmask) >> Rshift) << Rloss); data[1] = (char) (((color & Gmask) >> Gshift) << Gloss); data[2] = (char) (((color & Bmask) >> Bshift) << Bloss); data[3] = hascolorkey ? (char)(color!=colorkey)*255 : (char)(Amask ? (((color & Amask) >> Ashift) << Aloss) : 255); data += 4; } } break; } PySurface_Unlock (surfobj); } else if (!strcmp (format, "ARGB")) { hascolorkey = 0; string = Bytes_FromStringAndSize (NULL, surf->w * surf->h * 4); if (!string) return NULL; Bytes_AsStringAndSize (string, &data, &len); PySurface_Lock (surfobj); pixels = (char*) surf->pixels; switch (surf->format->BytesPerPixel) { case 1: for (h = 0; h < surf->h; ++h) { Uint8* ptr = (Uint8*) DATAROW (surf->pixels, h, surf->pitch, surf->h, flipped); for (w = 0; w < surf->w; ++w) { color = *ptr++; data[1] = (char)surf->format->palette->colors[color].r; data[2] = (char)surf->format->palette->colors[color].g; data[3] = (char)surf->format->palette->colors[color].b; data[0] = hascolorkey ? (char)(color!=colorkey)*255 : (char)255; data += 4; } } break; case 2: for(h = 0; h < surf->h; ++h) { Uint16* ptr = (Uint16*) DATAROW (surf->pixels, h, surf->pitch, surf->h, flipped); for(w = 0; w < surf->w; ++w) { color = *ptr++; data[1] = (char) (((color & Rmask) >> Rshift) << Rloss); data[2] = (char) (((color & Gmask) >> Gshift) << Gloss); data[3] = (char) (((color & Bmask) >> Bshift) << Bloss); data[0] = hascolorkey ? (char)(color!=colorkey)*255 : (char)(Amask ? (((color & Amask) >> Ashift) << Aloss) : 255); data += 4; } } break; case 3: for (h = 0; h < surf->h; ++h) { Uint8* ptr = (Uint8*) DATAROW (surf->pixels, h, surf->pitch, surf->h, flipped); for (w = 0; w < surf->w; ++w) { #if SDL_BYTEORDER == SDL_LIL_ENDIAN color = ptr[0] + (ptr[1]<<8) + (ptr[2]<<16); #else color = ptr[2] + (ptr[1]<<8) + (ptr[0]<<16); #endif ptr += 3; data[1] = (char) (((color & Rmask) >> Rshift) << Rloss); data[2] = (char) (((color & Gmask) >> Gshift) << Gloss); data[3] = (char) (((color & Bmask) >> Bshift) << Bloss); data[0] = hascolorkey ? (char)(color!=colorkey)*255 : (char)(Amask ? (((color & Amask) >> Ashift) << Aloss) : 255); data += 4; } } break; case 4: for (h = 0; h < surf->h; ++h) { Uint32* ptr = (Uint32*) DATAROW (surf->pixels, h, surf->pitch, surf->h, flipped); for (w = 0; w < surf->w; ++w) { color = *ptr++; data[1] = (char) (((color & Rmask) >> Rshift) << Rloss); data[2] = (char) (((color & Gmask) >> Gshift) << Gloss); data[3] = (char) (((color & Bmask) >> Bshift) << Bloss); data[0] = hascolorkey ? (char)(color!=colorkey)*255 : (char)(Amask ? (((color & Amask) >> Ashift) << Aloss) : 255); data += 4; } } break; } PySurface_Unlock (surfobj); } else if (!strcmp (format, "RGBA_PREMULT")) { if (surf->format->BytesPerPixel == 1 || surf->format->Amask == 0) return RAISE (PyExc_ValueError, "Can only create pre-multiplied alpha strings if the surface has per-pixel alpha"); hascolorkey = 0; string = Bytes_FromStringAndSize (NULL, surf->w * surf->h * 4); if (!string) return NULL; Bytes_AsStringAndSize (string, &data, &len); PySurface_Lock (surfobj); pixels = (char*) surf->pixels; switch (surf->format->BytesPerPixel) { case 2: for (h = 0; h < surf->h; ++h) { Uint16* ptr = (Uint16*) DATAROW (surf->pixels, h, surf->pitch, surf->h, flipped); for(w = 0; w < surf->w; ++w) { color = *ptr++; alpha = ((color & Amask) >> Ashift) << Aloss; data[0] = (char) ((((color & Rmask) >> Rshift) << Rloss)*alpha/255); data[1] = (char) ((((color & Gmask) >> Gshift) << Gloss)*alpha/255); data[2] = (char) ((((color & Bmask) >> Bshift) << Bloss)*alpha/255); data[3] = (char) alpha; data += 4; } } break; case 3: for (h = 0; h < surf->h; ++h) { Uint8* ptr = (Uint8*) DATAROW (surf->pixels, h, surf->pitch, surf->h, flipped); for (w = 0; w < surf->w; ++w) { #if SDL_BYTEORDER == SDL_LIL_ENDIAN color = ptr[0] + (ptr[1]<<8) + (ptr[2]<<16); #else color = ptr[2] + (ptr[1]<<8) + (ptr[0]<<16); #endif ptr += 3; alpha = ((color & Amask) >> Ashift) << Aloss; data[0] = (char) ((((color & Rmask) >> Rshift) << Rloss)*alpha/255); data[1] = (char) ((((color & Gmask) >> Gshift) << Gloss)*alpha/255); data[2] = (char) ((((color & Bmask) >> Bshift) << Bloss)*alpha/255); data[3] = (char) alpha; data += 4; } } break; case 4: for (h = 0; h < surf->h; ++h) { Uint32* ptr = (Uint32*) DATAROW (surf->pixels, h, surf->pitch, surf->h, flipped); for(w = 0; w < surf->w; ++w) { color = *ptr++; alpha = ((color & Amask) >> Ashift) << Aloss; if (alpha == 0) { data[0] = data[1] = data[2] = 0; } else { data[0] = (char) ((((color & Rmask) >> Rshift) << Rloss)*alpha/255); data[1] = (char) ((((color & Gmask) >> Gshift) << Gloss)*alpha/255); data[2] = (char) ((((color & Bmask) >> Bshift) << Bloss)*alpha/255); } data[3] = (char) alpha; data += 4; } } break; } PySurface_Unlock (surfobj); } else if (!strcmp (format, "ARGB_PREMULT")) { if (surf->format->BytesPerPixel == 1 || surf->format->Amask == 0) return RAISE (PyExc_ValueError, "Can only create pre-multiplied alpha strings if the surface has per-pixel alpha"); hascolorkey = 0; string = Bytes_FromStringAndSize (NULL, surf->w * surf->h * 4); if (!string) return NULL; Bytes_AsStringAndSize (string, &data, &len); PySurface_Lock (surfobj); pixels = (char*) surf->pixels; switch (surf->format->BytesPerPixel) { case 2: for (h = 0; h < surf->h; ++h) { Uint16* ptr = (Uint16*) DATAROW (surf->pixels, h, surf->pitch, surf->h, flipped); for(w = 0; w < surf->w; ++w) { color = *ptr++; alpha = ((color & Amask) >> Ashift) << Aloss; data[1] = (char) ((((color & Rmask) >> Rshift) << Rloss)*alpha/255); data[2] = (char) ((((color & Gmask) >> Gshift) << Gloss)*alpha/255); data[3] = (char) ((((color & Bmask) >> Bshift) << Bloss)*alpha/255); data[0] = (char) alpha; data += 4; } } break; case 3: for (h = 0; h < surf->h; ++h) { Uint8* ptr = (Uint8*) DATAROW (surf->pixels, h, surf->pitch, surf->h, flipped); for (w = 0; w < surf->w; ++w) { #if SDL_BYTEORDER == SDL_LIL_ENDIAN color = ptr[0] + (ptr[1]<<8) + (ptr[2]<<16); #else color = ptr[2] + (ptr[1]<<8) + (ptr[0]<<16); #endif ptr += 3; alpha = ((color & Amask) >> Ashift) << Aloss; data[1] = (char) ((((color & Rmask) >> Rshift) << Rloss)*alpha/255); data[2] = (char) ((((color & Gmask) >> Gshift) << Gloss)*alpha/255); data[3] = (char) ((((color & Bmask) >> Bshift) << Bloss)*alpha/255); data[0] = (char) alpha; data += 4; } } break; case 4: for (h = 0; h < surf->h; ++h) { Uint32* ptr = (Uint32*) DATAROW (surf->pixels, h, surf->pitch, surf->h, flipped); for(w = 0; w < surf->w; ++w) { color = *ptr++; alpha = ((color & Amask) >> Ashift) << Aloss; if (alpha == 0) { data[1] = data[2] = data[3] = 0; } else { data[1] = (char) ((((color & Rmask) >> Rshift) << Rloss)*alpha/255); data[2] = (char) ((((color & Gmask) >> Gshift) << Gloss)*alpha/255); data[3] = (char) ((((color & Bmask) >> Bshift) << Bloss)*alpha/255); } data[0] = (char) alpha; data += 4; } } break; } PySurface_Unlock (surfobj); } else { if (temp) SDL_FreeSurface (temp); return RAISE (PyExc_ValueError, "Unrecognized type of format"); } if (temp) SDL_FreeSurface (temp); return string; } PyObject* image_fromstring (PyObject* self, PyObject* arg) { PyObject *string; char *format, *data; SDL_Surface *surf = NULL; int w, h, flipped=0; Py_ssize_t len; int loopw, looph; if (!PyArg_ParseTuple (arg, "O!(ii)s|i", &Bytes_Type, &string, &w, &h, &format, &flipped)) return NULL; if (w < 1 || h < 1) return RAISE (PyExc_ValueError, "Resolution must be positive values"); Bytes_AsStringAndSize (string, &data, &len); if (!strcmp (format, "P")) { if (len != w * h) return RAISE (PyExc_ValueError, "String length does not equal format and resolution size"); surf = SDL_CreateRGBSurface (0, w, h, 8, 0, 0, 0, 0); if (!surf) return RAISE (PyExc_SDLError, SDL_GetError ()); SDL_LockSurface (surf); for (looph = 0; looph < h; ++looph) memcpy(((char*) surf->pixels) + looph * surf->pitch, DATAROW (data, looph, w, h, flipped), w); SDL_UnlockSurface (surf); } else if (!strcmp (format, "RGB")) { if (len != w * h * 3) return RAISE (PyExc_ValueError, "String length does not equal format and resolution size"); surf = SDL_CreateRGBSurface (0, w, h, 24, 0xFF<<16, 0xFF<<8, 0xFF, 0); if (!surf) return RAISE (PyExc_SDLError, SDL_GetError ()); SDL_LockSurface (surf); for (looph = 0; looph < h; ++looph) { Uint8* pix = (Uint8*) DATAROW (surf->pixels, looph, surf->pitch, h, flipped); for (loopw = 0; loopw < w; ++loopw) { #if SDL_BYTEORDER == SDL_LIL_ENDIAN pix[2] = data[0]; pix[1] = data[1]; pix[0] = data[2]; #else pix[0] = data[0]; pix[1] = data[1]; pix[2] = data[2]; #endif pix += 3; data += 3; } } SDL_UnlockSurface (surf); } else if (!strcmp (format, "RGBA") || !strcmp (format, "RGBX")) { int alphamult = !strcmp (format, "RGBA"); if (len != w * h * 4) return RAISE (PyExc_ValueError, "String length does not equal format and resolution size"); surf = SDL_CreateRGBSurface ((alphamult ? SDL_SRCALPHA : 0), w, h, 32, #if SDL_BYTEORDER == SDL_LIL_ENDIAN 0xFF, 0xFF<<8, 0xFF<<16, (alphamult ? 0xFF << 24 : 0)); #else 0xFF<<24, 0xFF<<16, 0xFF<<8, (alphamult ? 0xFF : 0)); #endif if (!surf) return RAISE (PyExc_SDLError, SDL_GetError ()); SDL_LockSurface (surf); for (looph = 0; looph < h; ++looph) { Uint32* pix = (Uint32*) DATAROW (surf->pixels, looph, surf->pitch, h, flipped); for (loopw = 0; loopw < w; ++loopw) { *pix++ = *((Uint32*) data); data += 4; } } SDL_UnlockSurface (surf); } else if (!strcmp (format, "ARGB")) { if (len != w * h * 4) return RAISE (PyExc_ValueError, "String length does not equal format and resolution size"); surf = SDL_CreateRGBSurface (SDL_SRCALPHA, w, h, 32, #if SDL_BYTEORDER == SDL_LIL_ENDIAN 0xFF<<8, 0xFF<<16, 0xFF<<24, 0xFF); #else 0xFF<<16, 0xFF<<8, 0xFF, 0xFF<<24); #endif if (!surf) return RAISE (PyExc_SDLError, SDL_GetError ()); SDL_LockSurface (surf); for (looph = 0; looph < h; ++looph) { Uint32* pix = (Uint32*) DATAROW (surf->pixels, looph, surf->pitch, h, flipped); for (loopw = 0; loopw < w; ++loopw) { *pix++ = *((Uint32*) data); data += 4; } } SDL_UnlockSurface (surf); } else return RAISE (PyExc_ValueError, "Unrecognized type of format"); if (!surf) return NULL; return PySurface_New (surf); } PyObject* image_frombuffer (PyObject* self, PyObject* arg) { PyObject *buffer; char *format, *data; SDL_Surface *surf = NULL; int w, h; Py_ssize_t len; PyObject *surfobj; if (!PyArg_ParseTuple (arg, "O(ii)s|i", &buffer, &w, &h, &format)) return NULL; if (w < 1 || h < 1) return RAISE (PyExc_ValueError, "Resolution must be positive values"); /* breaking constness here, we should really not change this string */ if (PyObject_AsCharBuffer (buffer, (const char**)&data, &len) == -1) return NULL; if (!strcmp (format, "P")) { if (len != w * h) return RAISE (PyExc_ValueError, "Buffer length does not equal format and resolution size"); surf = SDL_CreateRGBSurfaceFrom (data, w, h, 8, w, 0, 0, 0, 0); } else if (!strcmp (format, "RGB")) { if (len != w * h * 3) return RAISE (PyExc_ValueError, "Buffer length does not equal format and resolution size"); surf = SDL_CreateRGBSurfaceFrom (data, w, h, 24, w * 3, 0xFF, 0xFF<<8, 0xFF<<16, 0); /* #if SDL_BYTEORDER == SDL_LIL_ENDIAN 0xFF, 0xFF<<8, 0xFF<<16, 0xFF<<24 #else 0xFF<<24, 0xFF<<16, 0xFF<<8, 0xFF #endif ); */ } else if (!strcmp (format, "RGBA") || !strcmp (format, "RGBX")) { int alphamult = !strcmp (format, "RGBA"); if (len != w * h * 4) return RAISE (PyExc_ValueError, "Buffer length does not equal format and resolution size"); surf = SDL_CreateRGBSurfaceFrom (data, w, h, 32, w * 4, #if SDL_BYTEORDER == SDL_LIL_ENDIAN 0xFF, 0xFF<<8, 0xFF<<16, (alphamult ? 0xFF << 24 : 0)); #else 0xFF<<24, 0xFF<<16, 0xFF<<8, (alphamult ? 0xFF : 0)); #endif if(alphamult) surf->flags |= SDL_SRCALPHA; } else if (!strcmp (format, "ARGB")) { if (len != w * h * 4) return RAISE (PyExc_ValueError, "Buffer length does not equal format and resolution size"); surf = SDL_CreateRGBSurfaceFrom (data, w, h, 32, w*4, #if SDL_BYTEORDER == SDL_LIL_ENDIAN 0xFF<<24, 0xFF, 0xFF<<8, 0xFF<<16); #else 0xFF, 0xFF<<24, 0xFF<<16, 0xFF<<8); #endif surf->flags |= SDL_SRCALPHA; } else return RAISE(PyExc_ValueError, "Unrecognized type of format"); if (!surf) return RAISE (PyExc_SDLError, SDL_GetError ()); surfobj = PySurface_New (surf); Py_INCREF (buffer); ((PySurfaceObject*) surfobj)->dependency = buffer; return surfobj; } /*******************************************************/ /* tga code by Mattias Engdegard, in the public domain */ /*******************************************************/ struct TGAheader { Uint8 infolen; /* length of info field */ Uint8 has_cmap; /* 1 if image has colormap, 0 otherwise */ Uint8 type; Uint8 cmap_start[2]; /* index of first colormap entry */ Uint8 cmap_len[2]; /* number of entries in colormap */ Uint8 cmap_bits; /* bits per colormap entry */ Uint8 yorigin[2]; /* image origin (ignored here) */ Uint8 xorigin[2]; Uint8 width[2]; /* image size */ Uint8 height[2]; Uint8 pixel_bits; /* bits/pixel */ Uint8 flags; }; enum tga_type { TGA_TYPE_INDEXED = 1, TGA_TYPE_RGB = 2, TGA_TYPE_BW = 3, TGA_TYPE_RLE = 8 /* additive */ }; #define TGA_INTERLEAVE_MASK 0xc0 #define TGA_INTERLEAVE_NONE 0x00 #define TGA_INTERLEAVE_2WAY 0x40 #define TGA_INTERLEAVE_4WAY 0x80 #define TGA_ORIGIN_MASK 0x30 #define TGA_ORIGIN_LEFT 0x00 #define TGA_ORIGIN_RIGHT 0x10 #define TGA_ORIGIN_LOWER 0x00 #define TGA_ORIGIN_UPPER 0x20 /* read/write unaligned little-endian 16-bit ints */ #define LE16(p) ((p)[0] + ((p)[1] << 8)) #define SETLE16(p, v) ((p)[0] = (v), (p)[1] = (v) >> 8) #ifndef MIN #define MIN(a, b) ((a) < (b) ? (a) : (b)) #endif #define TGA_RLE_MAX 128 /* max length of a TGA RLE chunk */ /* return the number of bytes in the resulting buffer after RLE-encoding a line of TGA data */ static int rle_line (Uint8 *src, Uint8 *dst, int w, int bpp) { int x = 0; int out = 0; int raw = 0; while (x < w) { Uint32 pix; int x0 = x; memcpy (&pix, src + x * bpp, bpp); x++; while (x < w && memcmp (&pix, src + x * bpp, bpp) == 0 && x - x0 < TGA_RLE_MAX) x++; /* use a repetition chunk iff the repeated pixels would consume two bytes or more */ if ((x - x0 - 1) * bpp >= 2 || x == w) { /* output previous raw chunks */ while (raw < x0) { int n = MIN (TGA_RLE_MAX, x0 - raw); dst[out++] = n - 1; memcpy (dst + out, src + raw * bpp, n * bpp); out += n * bpp; raw += n; } if (x - x0 > 0) { /* output new repetition chunk */ dst[out++] = 0x7f + x - x0; memcpy (dst + out, &pix, bpp); out += bpp; } raw = x; } } return out; } /* * Save a surface to an output stream in TGA format. * 8bpp surfaces are saved as indexed images with 24bpp palette, or with * 32bpp palette if colourkeying is used. * 15, 16, 24 and 32bpp surfaces are saved as 24bpp RGB images, * or as 32bpp RGBA images if alpha channel is used. * * RLE compression is not used in the output file. * * Returns -1 upon error, 0 if success */ static int SaveTGA_RW (SDL_Surface *surface, SDL_RWops *out, int rle) { SDL_Surface *linebuf = NULL; int alpha = 0; int ckey = -1; struct TGAheader h; int srcbpp; unsigned surf_flags; unsigned surf_alpha; Uint32 rmask, gmask, bmask, amask; SDL_Rect r; int bpp; Uint8 *rlebuf = NULL; h.infolen = 0; SETLE16 (h.cmap_start, 0); srcbpp = surface->format->BitsPerPixel; if (srcbpp < 8) { SDL_SetError ("cannot save <8bpp images as TGA"); return -1; } if (srcbpp == 8) { h.has_cmap = 1; h.type = TGA_TYPE_INDEXED; if (surface->flags & SDL_SRCCOLORKEY) { ckey = surface->format->colorkey; h.cmap_bits = 32; } else h.cmap_bits = 24; SETLE16 (h.cmap_len, surface->format->palette->ncolors); h.pixel_bits = 8; rmask = gmask = bmask = amask = 0; } else { h.has_cmap = 0; h.type = TGA_TYPE_RGB; h.cmap_bits = 0; SETLE16 (h.cmap_len, 0); if (surface->format->Amask) { alpha = 1; h.pixel_bits = 32; } else h.pixel_bits = 24; if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { int s = alpha ? 0 : 8; amask = 0x000000ff >> s; rmask = 0x0000ff00 >> s; gmask = 0x00ff0000 >> s; bmask = 0xff000000 >> s; } else { amask = alpha ? 0xff000000 : 0; rmask = 0x00ff0000; gmask = 0x0000ff00; bmask = 0x000000ff; } } bpp = h.pixel_bits >> 3; if (rle) h.type += TGA_TYPE_RLE; SETLE16 (h.yorigin, 0); SETLE16 (h.xorigin, 0); SETLE16 (h.width, surface->w); SETLE16 (h.height, surface->h); h.flags = TGA_ORIGIN_UPPER | (alpha ? 8 : 0); if (!SDL_RWwrite (out, &h, sizeof (h), 1)) return -1; if (h.has_cmap) { int i; SDL_Palette *pal = surface->format->palette; Uint8 entry[4]; for (i = 0; i < pal->ncolors; i++) { entry[0] = pal->colors[i].b; entry[1] = pal->colors[i].g; entry[2] = pal->colors[i].r; entry[3] = (i == ckey) ? 0 : 0xff; if (!SDL_RWwrite (out, entry, h.cmap_bits >> 3, 1)) return -1; } } linebuf = SDL_CreateRGBSurface (SDL_SWSURFACE, surface->w, 1, h.pixel_bits, rmask, gmask, bmask, amask); if (!linebuf) return -1; if (h.has_cmap) SDL_SetColors (linebuf, surface->format->palette->colors, 0, surface->format->palette->ncolors); if (rle) { rlebuf = malloc (bpp * surface->w + 1 + surface->w / TGA_RLE_MAX); if (!rlebuf) { SDL_SetError ("out of memory"); goto error; } } /* Temporarily remove colourkey and alpha from surface so copies are opaque */ surf_flags = surface->flags & (SDL_SRCALPHA | SDL_SRCCOLORKEY); surf_alpha = surface->format->alpha; if (surf_flags & SDL_SRCALPHA) SDL_SetAlpha (surface, 0, 255); if (surf_flags & SDL_SRCCOLORKEY) SDL_SetColorKey (surface, 0, surface->format->colorkey); r.x = 0; r.w = surface->w; r.h = 1; for (r.y = 0; r.y < surface->h; r.y++) { int n; void *buf; if (SDL_BlitSurface (surface, &r, linebuf, NULL) < 0) break; if (rle) { buf = rlebuf; n = rle_line (linebuf->pixels, rlebuf, surface->w, bpp); } else { buf = linebuf->pixels; n = surface->w * bpp; } if (!SDL_RWwrite (out, buf, n, 1)) break; } /* restore flags */ if (surf_flags & SDL_SRCALPHA) SDL_SetAlpha (surface, SDL_SRCALPHA, (Uint8)surf_alpha); if (surf_flags & SDL_SRCCOLORKEY) SDL_SetColorKey (surface, SDL_SRCCOLORKEY, surface->format->colorkey); error: free (rlebuf); SDL_FreeSurface (linebuf); return 0; } static int SaveTGA (SDL_Surface *surface, char *file, int rle) { SDL_RWops *out = SDL_RWFromFile (file, "wb"); int ret; if (!out) return -1; ret = SaveTGA_RW (surface, out, rle); SDL_RWclose (out); return ret; } static PyMethodDef _image_methods[] = { { "load_basic", image_load_basic, METH_VARARGS, DOC_PYGAMEIMAGELOAD }, { "save", image_save, METH_VARARGS, DOC_PYGAMEIMAGESAVE }, { "get_extended", (PyCFunction) image_get_extended, METH_NOARGS, DOC_PYGAMEIMAGEGETEXTENDED }, { "tostring", image_tostring, METH_VARARGS, DOC_PYGAMEIMAGETOSTRING }, { "fromstring", image_fromstring, METH_VARARGS, DOC_PYGAMEIMAGEFROMSTRING }, { "frombuffer", image_frombuffer, METH_VARARGS, DOC_PYGAMEIMAGEFROMBUFFER }, { NULL, NULL, 0, NULL } }; MODINIT_DEFINE (image) { PyObject *module, *dict; PyObject *extmodule; struct _module_state *st; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "image", DOC_PYGAMEIMAGE, sizeof (struct _module_state), _image_methods, NULL, NULL, NULL, NULL }; #endif /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_surface (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_rwobject (); if (PyErr_Occurred ()) { MODINIT_ERROR; } /* create the module */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "image", _image_methods, DOC_PYGAMEIMAGE); #endif if (module == NULL) { MODINIT_ERROR; } st = GETSTATE (module); dict = PyModule_GetDict (module); /* try to get extended formats */ extmodule = PyImport_ImportModule (IMPPREFIX "imageext"); if (extmodule) { PyObject *extdict = PyModule_GetDict (extmodule); PyObject* extload = PyDict_GetItemString (extdict, "load_extended"); PyObject* extsave = PyDict_GetItemString (extdict, "save_extended"); PyDict_SetItemString (dict, "load_extended", extload); PyDict_SetItemString (dict, "save_extended", extsave); PyDict_SetItemString (dict, "load", extload); /* PyDict_SetItemString does an internal INCREF */ /* Py_INCREF(extload); Py_INCREF(extsave); Py_INCREF(extload); */ Py_DECREF (extmodule); st->is_extended = 1; } else { PyObject* basicload = PyDict_GetItemString (dict, "load_basic"); PyErr_Clear (); PyDict_SetItemString (dict, "load_extended", Py_None); PyDict_SetItemString (dict, "save_extended", Py_None); PyDict_SetItemString (dict, "load", basicload); /* PyDict_SetItemString does an internal INCREF */ /* Py_INCREF(Py_None); Py_INCREF(Py_None); Py_INCREF(basicload); */ st->is_extended = 0; } MODINIT_RETURN (module); } pygame-1.9.1release/src/gfxdraw.doc0000644000175000017500000000645111210364127017166 0ustar vincentvincentpygame.gfxdraw pygame module for drawing shapes Wraps SDL_gfx primatives. EXPERIMENTAL!: meaning this api may change, or dissapear in later pygame releases. If you use this, your code will break with the next pygame release. Most of the functions accept a color argument that is an RGB triplet. These can also accept an RGBA quadruplet. The color argument can also be an integer pixel value that is already mapped to the Surface's pixel format. For all functions the arguments are strictly positional. Only integers are accepted for coordinates and radii. For functions like rectangle that accept a rect argument any (x, y, w, h) sequence is accepted, though pygame.Rect instances are prefered. Note that for a pygame.Rect the drawing will not include Rect.bottomright. The right and bottom attributes of a Rect lie one pixel outside of the Rect's boarder. New in pygame 1.9.0.
    pixel place a pixel pygame.gfxdraw.pixel(surface, x, y, color): return None hline draw a horizontal line pygame.gfxdraw.hline(surface, x1, x2, y, color): return None vline draw a vertical line pgyame.gfxdraw.vline(surface, x, y1, y2, color): return None rectangle draw a rectangle pgyame.gfxdraw.rectangle(surface, rect, color): return None box draw a box pgyame.gfxdraw.box(surface, rect, color): return None line draw a line pgyame.gfxdraw.line(surface, x1, y1, x2, y2, color): return None circle draw a circle pgyame.gfxdraw.circle(surface, x, y, r, color): return None arc draw an arc pgyame.gfxdraw.arc(surface, x, y, r, start, end, color): return None aacircle draw an anti-aliased circle pgyame.gfxdraw.aacircle(surface, x, y, r, color): return None filled_circle draw a filled circle pgyame.gfxdraw.filled_circle(surface, x, y, r, color): return None ellipse draw an ellipse pgyame.gfxdraw.ellipse(surface, x, y, rx, ry, color): return None aaellipse draw an anti-aliased ellipse pgyame.gfxdraw.aaellipse(surface, x, y, rx, ry, color): return None filled_ellipse draw a filled ellipse pgyame.gfxdraw.filled_ellipse(surface, x, y, rx, ry, color): return None pie draw a pie pgyame.gfxdraw.pie(surface, x, y, r, start, end, color): return None trigon draw a triangle pgyame.gfxdraw.trigon(surface, x1, y1, x2, y2, x3, y3, color): return None aatrigon draw an anti-aliased triangle pgyame.gfxdraw.aatrigon(surface, x1, y1, x2, y2, x3, y3, color): return None filled_trigon draw a filled trigon pgyame.gfxdraw.filled_trigon(surface, x1, y1, x3, y2, x3, y3, color): return None polygon draw a polygon pgyame.gfxdraw.polygon(surface, points, color): return None aapolygon draw an anti-aliased polygon pgyame.gfxdraw.aapolygon(surface, points, color): return None filled_polygon draw a filled polygon pgyame.gfxdraw.filled_polygon(surface, points, color): return None textured_polygon draw a textured polygon pgyame.gfxdraw.textured_polygon(surface, points, texture, tx, ty): return None A per-pixel alpha texture blit to a per-pixel alpha surface will differ from a Surface.blit() blit. Also, a per-pixel alpha texture cannot be used with an 8-bit per pixel destination. bezier draw a bezier curve pgyame.gfxdraw.bezier(surface, points, steps, color): return None pygame-1.9.1release/src/gfxdraw.c0000644000175000017500000007561011226560760016656 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2008 Marcus von Appen This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* This is a proposed SDL_gfx draw module for Pygame. It is backported from Pygame 2. TODO: - Add gfxdraw.doc file. - Unpdate Setup.in and config modules. - Move Python 3 compatibility macros to a header. - Determine if SDL video must be initiated for all routines to work. Add check if required, else remove ASSERT_VIDEO_INIT. - Unit tests. - Example (Maybe). */ #define PYGAME_SDLGFXPRIM_INTERNAL #include "pygame.h" #include "pygamedocs.h" #include "surface.h" #include "pgcompat.h" #include "SDL_gfx/SDL_gfxPrimitives.h" static PyObject* _gfx_pixelcolor (PyObject *self, PyObject* args); static PyObject* _gfx_hlinecolor (PyObject *self, PyObject* args); static PyObject* _gfx_vlinecolor (PyObject *self, PyObject* args); static PyObject* _gfx_rectanglecolor (PyObject *self, PyObject* args); static PyObject* _gfx_boxcolor (PyObject *self, PyObject* args); static PyObject* _gfx_linecolor (PyObject *self, PyObject* args); static PyObject* _gfx_circlecolor (PyObject *self, PyObject* args); static PyObject* _gfx_arccolor (PyObject *self, PyObject* args); static PyObject* _gfx_aacirclecolor (PyObject *self, PyObject* args); static PyObject* _gfx_filledcirclecolor (PyObject *self, PyObject* args); static PyObject* _gfx_ellipsecolor (PyObject *self, PyObject* args); static PyObject* _gfx_aaellipsecolor (PyObject *self, PyObject* args); static PyObject* _gfx_filledellipsecolor (PyObject *self, PyObject* args); static PyObject* _gfx_piecolor (PyObject *self, PyObject* args); static PyObject* _gfx_trigoncolor (PyObject *self, PyObject* args); static PyObject* _gfx_aatrigoncolor (PyObject *self, PyObject* args); static PyObject* _gfx_filledtrigoncolor (PyObject *self, PyObject* args); static PyObject* _gfx_polygoncolor (PyObject *self, PyObject* args); static PyObject* _gfx_aapolygoncolor (PyObject *self, PyObject* args); static PyObject* _gfx_filledpolygoncolor (PyObject *self, PyObject* args); static PyObject* _gfx_texturedpolygon (PyObject *self, PyObject* args); static PyObject* _gfx_beziercolor (PyObject *self, PyObject* args); static PyMethodDef _gfxdraw_methods[] = { { "pixel", _gfx_pixelcolor, METH_VARARGS, DOC_PYGAMEGFXDRAWPIXEL }, { "hline", _gfx_hlinecolor, METH_VARARGS, DOC_PYGAMEGFXDRAWHLINE }, { "vline", _gfx_vlinecolor, METH_VARARGS, DOC_PYGAMEGFXDRAWVLINE }, { "rectangle", _gfx_rectanglecolor, METH_VARARGS, DOC_PYGAMEGFXDRAWRECTANGLE }, { "box", _gfx_boxcolor, METH_VARARGS, DOC_PYGAMEGFXDRAWRECTANGLE }, { "line", _gfx_linecolor, METH_VARARGS, DOC_PYGAMEGFXDRAWLINE }, { "circle", _gfx_circlecolor, METH_VARARGS, DOC_PYGAMEGFXDRAWCIRCLE }, { "arc", _gfx_arccolor, METH_VARARGS, DOC_PYGAMEGFXDRAWARC }, { "aacircle", _gfx_aacirclecolor, METH_VARARGS, DOC_PYGAMEGFXDRAWAACIRCLE }, { "filled_circle", _gfx_filledcirclecolor, METH_VARARGS, DOC_PYGAMEGFXDRAWFILLEDCIRCLE }, { "ellipse", _gfx_ellipsecolor, METH_VARARGS, DOC_PYGAMEGFXDRAWELLIPSE }, { "aaellipse", _gfx_aaellipsecolor, METH_VARARGS, DOC_PYGAMEGFXDRAWAAELLIPSE }, { "filled_ellipse", _gfx_filledellipsecolor, METH_VARARGS, DOC_PYGAMEGFXDRAWFILLEDELLIPSE }, { "pie", _gfx_piecolor, METH_VARARGS, DOC_PYGAMEGFXDRAWPIE }, { "trigon", _gfx_trigoncolor, METH_VARARGS, DOC_PYGAMEGFXDRAWTRIGON }, { "aatrigon", _gfx_aatrigoncolor, METH_VARARGS, DOC_PYGAMEGFXDRAWAATRIGON }, { "filled_trigon", _gfx_filledtrigoncolor, METH_VARARGS, DOC_PYGAMEGFXDRAWFILLEDTRIGON }, { "polygon", _gfx_polygoncolor, METH_VARARGS, DOC_PYGAMEGFXDRAWPOLYGON }, { "aapolygon", _gfx_aapolygoncolor, METH_VARARGS, DOC_PYGAMEGFXDRAWAAPOLYGON }, { "filled_polygon", _gfx_filledpolygoncolor, METH_VARARGS, DOC_PYGAMEGFXDRAWFILLEDPOLYGON }, { "textured_polygon", _gfx_texturedpolygon, METH_VARARGS, DOC_PYGAMEGFXDRAWTEXTUREDPOLYGON }, { "bezier", _gfx_beziercolor, METH_VARARGS, DOC_PYGAMEGFXDRAWBEZIER }, { NULL, NULL, 0, NULL }, }; #define ASSERT_VIDEO_INIT(unused) /* Is video really needed for gfxdraw? */ static int Sint16FromObj (PyObject *item, Sint16 *val) { PyObject* intobj; long tmp; if (PyNumber_Check (item)) { if (!(intobj = PyNumber_Int (item))) return 0; tmp = PyInt_AsLong (intobj); Py_DECREF (intobj); if (tmp == -1 && PyErr_Occurred ()) return 0; *val = (Sint16)tmp; return 1; } return 0; } static int Sint16FromSeqIndex (PyObject* obj, Py_ssize_t _index, Sint16* val) { int result = 0; PyObject* item; item = PySequence_GetItem (obj, _index); if (item) { result = Sint16FromObj (item, val); Py_DECREF (item); } return result; } static PyObject* _gfx_pixelcolor (PyObject *self, PyObject* args) { PyObject *surface, *color; Sint16 x, y; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OhhO:pixel", &surface, &x, &y, &color)) return NULL; if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } if (pixelRGBA (PySurface_AsSurface (surface), x, y, rgba[0], rgba[1], rgba[2], rgba[3]) == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_hlinecolor (PyObject *self, PyObject* args) { PyObject *surface, *color; Sint16 x1, x2, y; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OhhhO:hline", &surface, &x1, &x2, &y, &color)) return NULL; if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } if (hlineRGBA (PySurface_AsSurface (surface), x1, x2, y, rgba[0], rgba[1], rgba[2], rgba[3]) == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_vlinecolor (PyObject *self, PyObject* args) { PyObject *surface, *color; Sint16 x, _y1, y2; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OhhhO:vline", &surface, &x, &_y1, &y2, &color)) return NULL; if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } if (vlineRGBA (PySurface_AsSurface (surface), x, _y1, y2, rgba[0], rgba[1], rgba[2], rgba[3]) == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_rectanglecolor (PyObject *self, PyObject* args) { PyObject *surface, *color, *rect; GAME_Rect temprect, *sdlrect; Sint16 x1, x2, _y1, y2; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OOO:rectangle", &surface, &rect, &color)) { return NULL; } if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } sdlrect = GameRect_FromObject (rect, &temprect); if (sdlrect == NULL) { return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } x1 = sdlrect->x; _y1 = sdlrect->y; x2 = (Sint16) (sdlrect->x + sdlrect->w - 1); y2 = (Sint16) (sdlrect->y + sdlrect->h - 1); if (rectangleRGBA (PySurface_AsSurface (surface), x1, _y1, x2, y2, rgba[0], rgba[1], rgba[2], rgba[3]) == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_boxcolor (PyObject *self, PyObject* args) { PyObject *surface, *color, *rect; GAME_Rect temprect, *sdlrect; Sint16 x1, x2, _y1, y2; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OOO:box", &surface, &rect, &color)) { return NULL; } if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } sdlrect = GameRect_FromObject (rect, &temprect); if (sdlrect == NULL) { return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } x1 = sdlrect->x; _y1 = sdlrect->y; x2 = (Sint16) (sdlrect->x + sdlrect->w - 1); y2 = (Sint16) (sdlrect->y + sdlrect->h - 1); if (boxRGBA (PySurface_AsSurface (surface), x1, _y1, x2, y2, rgba[0], rgba[1], rgba[2], rgba[3]) == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_linecolor (PyObject *self, PyObject* args) { PyObject *surface, *color; Sint16 x1, x2, _y1, y2; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OhhhhO:line", &surface, &x1, &_y1, &x2, &y2, &color)) return NULL; if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } if (lineRGBA (PySurface_AsSurface (surface), x1, _y1, x2, y2, rgba[0], rgba[1], rgba[2], rgba[3]) == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_circlecolor (PyObject *self, PyObject* args) { PyObject *surface, *color; Sint16 x, y, r; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OhhhO:circle", &surface, &x, &y, &r, &color)) return NULL; if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } if (circleRGBA (PySurface_AsSurface (surface), x, y, r, rgba[0], rgba[1], rgba[2], rgba[3]) == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_arccolor (PyObject *self, PyObject* args) { PyObject *surface, *color; Sint16 x, y, r, start, end; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OhhhhhO:arc", &surface, &x, &y, &r, &start, &end, &color)) return NULL; if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } if (arcRGBA (PySurface_AsSurface (surface), x, y, r, start, end, rgba[0], rgba[1], rgba[2], rgba[3]) == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_aacirclecolor (PyObject *self, PyObject* args) { PyObject *surface, *color; Sint16 x, y, r; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OhhhO:aacircle", &surface, &x, &y, &r, &color)) return NULL; if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } if (aacircleRGBA (PySurface_AsSurface (surface), x, y, r, rgba[0], rgba[1], rgba[2], rgba[3]) == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_filledcirclecolor (PyObject *self, PyObject* args) { PyObject *surface, *color; Sint16 x, y, r; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OhhhO:filledcircle", &surface, &x, &y, &r, &color)) return NULL; if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } if (filledCircleRGBA (PySurface_AsSurface (surface), x, y, r, rgba[0], rgba[1], rgba[2], rgba[3]) == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_ellipsecolor (PyObject *self, PyObject* args) { PyObject *surface, *color; Sint16 x, y, rx, ry; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OhhhhO:ellipse", &surface, &x, &y, &rx, &ry, &color)) return NULL; if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } if (ellipseRGBA (PySurface_AsSurface (surface), x, y, rx, ry, rgba[0], rgba[1], rgba[2], rgba[3]) == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_aaellipsecolor (PyObject *self, PyObject* args) { PyObject *surface, *color; Sint16 x, y, rx, ry; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OhhhhO:aaellipse", &surface, &x, &y, &rx, &ry, &color)) return NULL; if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } if (aaellipseRGBA (PySurface_AsSurface (surface), x, y, rx, ry, rgba[0], rgba[1], rgba[2], rgba[3]) == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_filledellipsecolor (PyObject *self, PyObject* args) { PyObject *surface, *color; Sint16 x, y, rx, ry; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OhhhhO:filled_ellipse", &surface, &x, &y, &rx, &ry, &color)) return NULL; if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } if (filledEllipseRGBA (PySurface_AsSurface (surface), x, y, rx, ry, rgba[0], rgba[1], rgba[2], rgba[3]) == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_piecolor (PyObject *self, PyObject* args) { PyObject *surface, *color; Sint16 x, y, r, start, end; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OhhhhhO:pie", &surface, &x, &y, &r, &start, &end, &color)) return NULL; if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } if (pieRGBA (PySurface_AsSurface (surface), x, y, r, start, end, rgba[0], rgba[1], rgba[2], rgba[3]) == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_trigoncolor (PyObject *self, PyObject* args) { PyObject *surface, *color; Sint16 x1, x2, x3, _y1, y2, y3; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OhhhhhhO:trigon", &surface, &x1, &_y1, &x2, &y2, &x3, &y3, &color)) return NULL; if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } if (trigonRGBA (PySurface_AsSurface (surface), x1, _y1, x2, y2, x3, y3, rgba[0], rgba[1], rgba[2], rgba[3]) == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_aatrigoncolor (PyObject *self, PyObject* args) { PyObject *surface, *color; Sint16 x1, x2, x3, _y1, y2, y3; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OhhhhhhO:aatrigon", &surface, &x1, &_y1, &x2, &y2, &x3, &y3, &color)) return NULL; if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } if (aatrigonRGBA (PySurface_AsSurface (surface), x1, _y1, x2, y2, x3, y3, rgba[0], rgba[1], rgba[2], rgba[3]) == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_filledtrigoncolor (PyObject *self, PyObject* args) { PyObject *surface, *color; Sint16 x1, x2, x3, _y1, y2, y3; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OhhhhhhO:filled_trigon", &surface, &x1, &_y1, &x2, &y2, &x3, &y3, &color)) return NULL; if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } if (filledTrigonRGBA (PySurface_AsSurface (surface), x1, _y1, x2, y2, x3, y3, rgba[0], rgba[1], rgba[2], rgba[3]) == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_polygoncolor (PyObject *self, PyObject* args) { PyObject *surface, *color, *points, *item; Sint16 *vx, *vy, x, y; Py_ssize_t count, i; int ret; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OOO:polygon", &surface, &points, &color)) return NULL; if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } if (!PySequence_Check (points)) { PyErr_SetString (PyExc_TypeError, "points must be a sequence"); return NULL; } count = PySequence_Size (points); if (count < 3) { PyErr_SetString (PyExc_ValueError, "points must contain more than 2 points"); return NULL; } vx = PyMem_New (Sint16, (size_t) count); vy = PyMem_New (Sint16, (size_t) count); if (!vx || !vy) { if (vx) PyMem_Free (vx); if (vy) PyMem_Free (vy); return NULL; } for (i = 0; i < count; i++) { item = PySequence_ITEM (points, i); if (!Sint16FromSeqIndex (item, 0, &x)) { PyMem_Free (vx); PyMem_Free (vy); Py_XDECREF (item); return NULL; } if (!Sint16FromSeqIndex (item, 1, &y)) { PyMem_Free (vx); PyMem_Free (vy); Py_XDECREF (item); return NULL; } Py_DECREF (item); vx[i] = x; vy[i] = y; } Py_BEGIN_ALLOW_THREADS; ret = polygonRGBA (PySurface_AsSurface (surface), vx, vy, (int)count, rgba[0], rgba[1], rgba[2], rgba[3]); Py_END_ALLOW_THREADS; PyMem_Free (vx); PyMem_Free (vy); if (ret == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_aapolygoncolor (PyObject *self, PyObject* args) { PyObject *surface, *color, *points, *item; Sint16 *vx, *vy, x, y; Py_ssize_t count, i; int ret; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OOO:aapolygon", &surface, &points, &color)) return NULL; if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } if (!PySequence_Check (points)) { PyErr_SetString (PyExc_TypeError, "points must be a sequence"); return NULL; } count = PySequence_Size (points); if (count < 3) { PyErr_SetString (PyExc_ValueError, "points must contain more than 2 points"); return NULL; } vx = PyMem_New (Sint16, (size_t) count); vy = PyMem_New (Sint16, (size_t) count); if (!vx || !vy) { if (vx) PyMem_Free (vx); if (vy) PyMem_Free (vy); return NULL; } for (i = 0; i < count; i++) { item = PySequence_ITEM (points, i); if (!Sint16FromSeqIndex (item, 0, &x)) { PyMem_Free (vx); PyMem_Free (vy); Py_XDECREF (item); return NULL; } if (!Sint16FromSeqIndex (item, 1, &y)) { PyMem_Free (vx); PyMem_Free (vy); Py_XDECREF (item); return NULL; } Py_DECREF (item); vx[i] = x; vy[i] = y; } Py_BEGIN_ALLOW_THREADS; ret = aapolygonRGBA (PySurface_AsSurface (surface), vx, vy, (int)count, rgba[0], rgba[1], rgba[2], rgba[3]); Py_END_ALLOW_THREADS; PyMem_Free (vx); PyMem_Free (vy); if (ret == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_filledpolygoncolor (PyObject *self, PyObject* args) { PyObject *surface, *color, *points, *item; Sint16 *vx, *vy, x, y; Py_ssize_t count, i; int ret; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OOO:filled_polygon", &surface, &points, &color)) return NULL; if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } if (!PySequence_Check (points)) { PyErr_SetString (PyExc_TypeError, "points must be a sequence"); return NULL; } count = PySequence_Size (points); if (count < 3) { PyErr_SetString (PyExc_ValueError, "points must contain more than 2 points"); return NULL; } vx = PyMem_New (Sint16, (size_t) count); vy = PyMem_New (Sint16, (size_t) count); if (!vx || !vy) { if (vx) PyMem_Free (vx); if (vy) PyMem_Free (vy); return NULL; } for (i = 0; i < count; i++) { item = PySequence_ITEM (points, i); if (!Sint16FromSeqIndex (item, 0, &x)) { PyMem_Free (vx); PyMem_Free (vy); Py_XDECREF (item); return NULL; } if (!Sint16FromSeqIndex (item, 1, &y)) { PyMem_Free (vx); PyMem_Free (vy); Py_XDECREF (item); return NULL; } Py_DECREF (item); vx[i] = x; vy[i] = y; } Py_BEGIN_ALLOW_THREADS; ret = filledPolygonRGBA (PySurface_AsSurface (surface), vx, vy, (int)count, rgba[0], rgba[1], rgba[2], rgba[3]); Py_END_ALLOW_THREADS; PyMem_Free (vx); PyMem_Free (vy); if (ret == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_texturedpolygon (PyObject *self, PyObject* args) { PyObject *surface, *texture, *points, *item; SDL_Surface *s_surface, *s_texture; Sint16 *vx, *vy, x, y, tdx, tdy; Py_ssize_t count, i; int ret; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OOOhh:textured_polygon", &surface, &points, &texture, &tdx, &tdy)) return NULL; if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } s_surface = PySurface_AsSurface (surface); if (!PySurface_Check (texture)) { PyErr_SetString (PyExc_TypeError, "texture must be a Surface"); return NULL; } s_texture = PySurface_AsSurface (texture); if (!PySequence_Check (points)) { PyErr_SetString (PyExc_TypeError, "points must be a sequence"); return NULL; } if (s_surface->format->BytesPerPixel == 1 && (s_texture->format->Amask || s_texture->flags & SDL_SRCALPHA)) { PyErr_SetString (PyExc_ValueError, "Per-byte alpha texture unsupported " "for 8 bit surfaces"); return NULL; } count = PySequence_Size (points); if (count < 3) { PyErr_SetString (PyExc_ValueError, "points must contain more than 2 points"); return NULL; } vx = PyMem_New (Sint16, (size_t) count); vy = PyMem_New (Sint16, (size_t) count); if (!vx || !vy) { if (vx) PyMem_Free (vx); if (vy) PyMem_Free (vy); return NULL; } for (i = 0; i < count; i++) { item = PySequence_ITEM (points, i); if (!Sint16FromSeqIndex (item, 0, &x)) { PyMem_Free (vx); PyMem_Free (vy); Py_XDECREF (item); return NULL; } if (!Sint16FromSeqIndex (item, 1, &y)) { PyMem_Free (vx); PyMem_Free (vy); Py_XDECREF (item); return NULL; } Py_DECREF (item); vx[i] = x; vy[i] = y; } Py_BEGIN_ALLOW_THREADS; ret = texturedPolygon (s_surface, vx, vy, (int)count, s_texture, tdx, tdy); Py_END_ALLOW_THREADS; PyMem_Free (vx); PyMem_Free (vy); if (ret == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } static PyObject* _gfx_beziercolor (PyObject *self, PyObject* args) { PyObject *surface, *color, *points, *item; Sint16 *vx, *vy, x, y; Py_ssize_t count, i; int ret, steps; Uint8 rgba[4]; ASSERT_VIDEO_INIT (NULL); if (!PyArg_ParseTuple (args, "OOiO:bezier", &surface, &points, &steps, &color)) return NULL; if (!PySurface_Check (surface)) { PyErr_SetString (PyExc_TypeError, "surface must be a Surface"); return NULL; } if (!RGBAFromObj (color, rgba)) { PyErr_SetString (PyExc_TypeError, "invalid color argument"); return NULL; } if (!PySequence_Check (points)) { PyErr_SetString (PyExc_TypeError, "points must be a sequence"); return NULL; } count = PySequence_Size (points); if (count < 3) { PyErr_SetString (PyExc_ValueError, "points must contain more than 2 points"); return NULL; } vx = PyMem_New (Sint16, (size_t) count); vy = PyMem_New (Sint16, (size_t) count); if (!vx || !vy) { PyErr_SetString (PyExc_MemoryError, "memory allocation failed"); if (vx) PyMem_Free (vx); if (vy) PyMem_Free (vy); return NULL; } for (i = 0; i < count; i++) { item = PySequence_ITEM (points, i); if (!Sint16FromSeqIndex (item, 0, &x)) { PyMem_Free (vx); PyMem_Free (vy); Py_XDECREF (item); return NULL; } if (!Sint16FromSeqIndex (item, 1, &y)) { PyMem_Free (vx); PyMem_Free (vy); Py_XDECREF (item); return NULL; } Py_DECREF (item); vx[i] = x; vy[i] = y; } Py_BEGIN_ALLOW_THREADS; ret = bezierRGBA (PySurface_AsSurface (surface), vx, vy, (int)count, steps, rgba[0], rgba[1], rgba[2], rgba[3]); Py_END_ALLOW_THREADS; PyMem_Free (vx); PyMem_Free (vy); if (ret == -1) { PyErr_SetString (PyExc_SDLError, SDL_GetError ()); return NULL; } Py_RETURN_NONE; } MODINIT_DEFINE(gfxdraw) { PyObject *module; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, MODPREFIX "gfxdraw", DOC_PYGAMEGFXDRAW, -1, _gfxdraw_methods, NULL, NULL, NULL, NULL }; #endif /* importe needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base(); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_color(); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_rect(); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_surface(); if (PyErr_Occurred ()) { MODINIT_ERROR; } #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "gfxdraw", _gfxdraw_methods, DOC_PYGAMEGFXDRAW); #endif MODINIT_RETURN (module); } pygame-1.9.1release/src/font.h0000644000175000017500000000413611200727740016155 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ #include #if defined(HAVE_SNPRINTF) /* also defined in SDL_ttf (SDL.h) */ #undef HAVE_SNPRINTF /* remove GCC macro redefine warning */ #endif #include /* test font initialization */ #define FONT_INIT_CHECK() \ if(!(*(int*)PyFONT_C_API[2])) \ return RAISE(PyExc_SDLError, "font system not initialized") #define PYGAMEAPI_FONT_NUMSLOTS 3 typedef struct { PyObject_HEAD TTF_Font* font; PyObject* weakreflist; } PyFontObject; #define PyFont_AsFont(x) (((PyFontObject*)x)->font) #ifndef PYGAMEAPI_FONT_INTERNAL #define PyFont_Check(x) ((x)->ob_type == (PyTypeObject*)PyFONT_C_API[0]) #define PyFont_Type (*(PyTypeObject*)PyFONT_C_API[0]) #define PyFont_New (*(PyObject*(*)(TTF_Font*))PyFONT_C_API[1]) /*slot 2 taken by FONT_INIT_CHECK*/ #define import_pygame_font() { \ PyObject *module = PyImport_ImportModule(MODPREFIX "font"); \ if (module != NULL) { \ PyObject *dict = PyModule_GetDict(module); \ PyObject *c_api = PyDict_GetItemString(dict, PYGAMEAPI_LOCAL_ENTRY); \ if(PyCObject_Check(c_api)) {\ void** localptr = (void**)PyCObject_AsVoidPtr(c_api); \ memcpy(PyFONT_C_API, localptr, sizeof(void*)*PYGAMEAPI_FONT_NUMSLOTS); \ } Py_DECREF(module); } } #endif static void* PyFONT_C_API[PYGAMEAPI_FONT_NUMSLOTS] = {NULL}; pygame-1.9.1release/src/font.doc0000644000175000017500000002145110627127161016475 0ustar vincentvincentpygame.font pygame module for loading and rendering fonts The font module allows for rendering TrueType fonts into a new Surface object. This module is optional and requires SDL_ttf as a dependency. You should test that pygame.font is available and initialized before attempting to use the module. Most of the work done with fonts are done by using the actual Font objects. The module by itself only has routines to initialize the module and create Font objects with pygame.font.Font(). You can load fonts from the system by using the pygame.font.SysFont() function. There are a few other functions to help lookup the system fonts. Pygame comes with a builtin default font. This can always be accessed by passing None as the font name.
    init initialize the font module pygame.font.init(): return None This method is called automatically by pygame.init(). It initializes the font module. The module must be initialized before any other functions will work. It is safe to call this function more than once. quit uninitialize the font module pygame.font.quit(): return None Manually uninitialize SDL_ttf's font system. This is called automatically by pygame.quit(). It is safe to call this function even if font is currently not initialized. get_init true if the font module is initialized pygame.font.get_init(): return bool Test if the font module is initialized or not. get_default_font get the filename of the default font pygame.font.get_default_font(): return string Return the filename of the system font. This is not the full path to the file. This file can usually be found in the same directory as the font module, but it can also be bundled in separate archives. get_fonts get all available fonts pygame.font.get_fonts(): return list of strings Returns a list of all the fonts available on the system. The names of the fonts will be set to lowercase with all spaces and punctuation removed. This works on most systems, but some will return an empty list if they cannot find fonts. match_font find a specific font on the system pygame.font.match_font(name, bold=False, italic=False): return path Returns the full path to a font file on the system. If bold or italic are set to true, this will attempt to find the correct family of font. The font name can actually be a comma separated list of font names to try. If none of the given names are found, None is returned. Example: print pygame.font.match_font('bitstreamverasans') # output is: /usr/share/fonts/truetype/ttf-bitstream-vera/Vera.ttf # (but only if you have Vera on your system) SysFont create a Font object from the system fonts pygame.font.SysFont(name, size, bold=False, italic=False): return Font Return a new Font object that is loaded from the system fonts. The font will match the requested bold and italic flags. If a suitable system font is not found this will fallback on loading the default pygame font. The font name can be a comma separated list of font names to look for. Font create a new Font object from a file pygame.font.Font(filename, size): return Font pygame.font.Font(object, size): return Font Load a new font from a given filename or a python file object. The size is the height of the font in pixels. If the filename is None the Pygame default font will be loaded. If a font cannot be loaded from the arguments given an exception will be raised. Once the font is created the size cannot be changed. Font objects are mainly used to render text into new Surface objects. The render can emulate bold or italic features, but it is better to load from a font with actual italic or bold glyphs. The rendered text can be regular strings or unicode.
    render draw text on a new Surface Font.render(text, antialias, color, background=None): return Surface This creates a new Surface with the specified text rendered on it. Pygame provides no way to directly draw text on an existing Surface: instead you must use Font.render() to create an image (Surface) of the text, then blit this image onto another Surface. The text can only be a single line: newline characters are not rendered. The antialias argument is a boolean: if true the characters will have smooth edges. The color argument is the color of the text [e.g.: (0,0,255) for blue]. The optional background argument is a color to use for the text background. If no background is passed the area outside the text will be transparent. The Surface returned will be of the dimensions required to hold the text. (the same as those returned by Font.size()). If an empty string is passed for the text, a blank surface will be returned that is one pixel wide and the height of the font. Depending on the type of background and antialiasing used, this returns different types of Surfaces. For performance reasons, it is good to know what type of image will be used. If antialiasing is not used, the return image will always be an 8bit image with a two color palette. If the background is transparent a colorkey will be set. Antialiased images are rendered to 24-bit RGB images. If the background is transparent a pixel alpha will be included. Optimization: if you know that the final destination for the text (on the screen) will always have a solid background, and the text is antialiased, you can improve performance by specifying the background color. This will cause the resulting image to maintain transparency information by colorkey rather than (much less efficient) alpha values. If you render '\n' a unknown char will be rendered. Usually a rectangle. Instead you need to handle new lines yourself. Font rendering is not thread safe: only a single thread can render text any time. size determine the amount of space needed to render text Font.size(text): return (width, height) Returns the dimensions needed to render the text. This can be used to help determine the positioning needed for text before it is rendered. It can also be used for wordwrapping and other layout effects. Be aware that most fonts use kerning which adjusts the widths for specific letter pairs. For example, the width for "ae" will not always match the width for "a" + "e". set_underline control if text is rendered with an underline Font.set_underline(bool): return None When enabled, all rendered fonts will include an underline. The underline is always one pixel thick, regardless of font size. This can be mixed with the bold and italic modes. get_underline check if text will be rendered with an underline Font.get_underline(): return bool Return True when the font underline is enabled. set_bold enable fake rendering of bold text Font.set_bold(bool): return None Enables the bold rendering of text. This is a fake stretching of the font that doesn't look good on many font types. If possible load the font from a real bold font file. While bold, the font will have a different width than when normal. This can be mixed with the italic and underline modes. get_bold check if text will be rendered bold Font.get_bold(): return bool Return True when the font bold rendering mode is enabled. set_italic enable fake rendering of italic text Font.set_bold(bool): return None Enables fake rendering of italic text. This is a fake skewing of the font that doesn't look good on many font types. If possible load the font from a real italic font file. While italic the font will have a different width than when normal. This can be mixed with the bold and underline modes. metrics Gets the metrics for each character in the pased string. Font.metrics(text): return list The list contains tuples for each character, which contain the minimum X offset, the maximum X offset, the minimum Y offset, the maximum Y offset and the advance offset (bearing plus width) of the character. [(minx, maxx, miny, maxy, advance), (minx, maxx, miny, maxy, advance), ...] get_italic check if the text will be rendered italic Font.get_italic(): return bool Return True when the font italic rendering mode is enabled. get_linesize get the line space of the font text Font.get_linesize(): return int Return the height in pixels for a line of text with the font. When rendering multiple lines of text this is the recommended amount of space between lines. get_height get the height of the font Font.get_height(): return int Return the height in pixels of the actual rendered text. This is the average size for each glyph in the font. get_ascent get the ascent of the font Font.get_ascent(): return int Return the height in pixels for the font ascent. The ascent is the number of pixels from the font baseline to the top of the font. get_descent get the descent of the font Font.get_descent(): return int Return the height in pixels for the font descent. The descent is the number of pixels from the font baseline to the bottom of the font. pygame-1.9.1release/src/font.c0000644000175000017500000005005611216024112016140 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* * font module for pygame */ #define PYGAMEAPI_FONT_INTERNAL #include "font.h" #include #include #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" #include "structmember.h" static PyTypeObject PyFont_Type; static PyObject* PyFont_New (TTF_Font*); #define PyFont_Check(x) ((x)->ob_type == &PyFont_Type) static int font_initialized = 0; #ifndef __SYMBIAN32__ static const char const *font_defaultname = "freesansbold.ttf"; static const char const *pkgdatamodule_name = "pygame.pkgdata"; static const char const *resourcefunc_name = "getResource"; #else /// Symbian GCCE does not like the second const static const char *font_defaultname = "freesansbold.ttf"; static const char *pkgdatamodule_name = "pygame.pkgdata"; static const char *resourcefunc_name = "getResource"; #endif static PyObject* font_resource (const char *filename) { PyObject* load_basicfunc = NULL; PyObject* pkgdatamodule = NULL; PyObject* resourcefunc = NULL; PyObject* result = NULL; #if PY3 PyObject* tmp; #endif pkgdatamodule = PyImport_ImportModule (pkgdatamodule_name); if (!pkgdatamodule) goto font_resource_end; resourcefunc = PyObject_GetAttrString (pkgdatamodule, resourcefunc_name); if (!resourcefunc) goto font_resource_end; result = PyObject_CallFunction (resourcefunc, "s", filename); if (!result) goto font_resource_end; #if PY3 tmp = PyObject_GetAttrString (result, "name"); if (tmp != NULL) { Py_DECREF (result); result = tmp; } else { PyErr_Clear (); } #else if (PyFile_Check (result)) { PyObject *tmp = PyFile_Name (result); Py_INCREF (tmp); Py_DECREF (result); result = tmp; } #endif font_resource_end: Py_XDECREF (pkgdatamodule); Py_XDECREF (resourcefunc); Py_XDECREF (load_basicfunc); return result; } static void font_autoquit (void) { if (font_initialized) { font_initialized = 0; TTF_Quit (); } } static PyObject* font_autoinit (PyObject* self) { if (!font_initialized) { PyGame_RegisterQuit (font_autoquit); if (TTF_Init ()) return PyInt_FromLong (0); font_initialized = 1; } return PyInt_FromLong (font_initialized); } static PyObject* fontmodule_quit (PyObject* self) { font_autoquit (); Py_RETURN_NONE; } static PyObject* fontmodule_init (PyObject* self) { PyObject* result; int istrue; result = font_autoinit (self); istrue = PyObject_IsTrue (result); Py_DECREF (result); if (!istrue) return RAISE (PyExc_SDLError, SDL_GetError ()); Py_RETURN_NONE; } static PyObject* get_init (PyObject* self) { return PyInt_FromLong (font_initialized); } /* font object methods */ static PyObject* font_get_height (PyObject* self) { TTF_Font* font = PyFont_AsFont (self); return PyInt_FromLong (TTF_FontHeight (font)); } static PyObject* font_get_descent (PyObject* self) { TTF_Font* font = PyFont_AsFont (self); return PyInt_FromLong (TTF_FontDescent (font)); } static PyObject* font_get_ascent (PyObject* self) { TTF_Font* font = PyFont_AsFont (self); return PyInt_FromLong (TTF_FontAscent (font)); } static PyObject* font_get_linesize (PyObject* self) { TTF_Font* font = PyFont_AsFont (self); return PyInt_FromLong (TTF_FontLineSkip (font)); } static PyObject* font_get_bold (PyObject* self) { TTF_Font* font = PyFont_AsFont (self); return PyInt_FromLong ((TTF_GetFontStyle (font) & TTF_STYLE_BOLD) != 0); } static PyObject* font_set_bold (PyObject* self, PyObject* args) { TTF_Font* font = PyFont_AsFont (self); int style, val; if (!PyArg_ParseTuple (args, "i", &val)) return NULL; style = TTF_GetFontStyle (font); if (val) style |= TTF_STYLE_BOLD; else style &= ~TTF_STYLE_BOLD; TTF_SetFontStyle (font, style); Py_RETURN_NONE; } static PyObject* font_get_italic (PyObject* self) { TTF_Font* font = PyFont_AsFont (self); return PyInt_FromLong ((TTF_GetFontStyle (font) & TTF_STYLE_ITALIC) != 0); } static PyObject* font_set_italic (PyObject* self, PyObject* args) { TTF_Font* font = PyFont_AsFont (self); int style, val; if (!PyArg_ParseTuple (args, "i", &val)) return NULL; style = TTF_GetFontStyle (font); if(val) style |= TTF_STYLE_ITALIC; else style &= ~TTF_STYLE_ITALIC; TTF_SetFontStyle (font, style); Py_RETURN_NONE; } static PyObject* font_get_underline (PyObject* self) { TTF_Font* font = PyFont_AsFont (self); return PyInt_FromLong ((TTF_GetFontStyle (font) & TTF_STYLE_UNDERLINE) != 0); } static PyObject* font_set_underline (PyObject* self, PyObject* args) { TTF_Font* font = PyFont_AsFont (self); int style, val; if (!PyArg_ParseTuple (args, "i", &val)) return NULL; style = TTF_GetFontStyle (font); if(val) style |= TTF_STYLE_UNDERLINE; else style &= ~TTF_STYLE_UNDERLINE; TTF_SetFontStyle (font, style); Py_RETURN_NONE; } static PyObject* font_render (PyObject* self, PyObject* args) { TTF_Font* font = PyFont_AsFont (self); int aa; PyObject* text, *final; PyObject* fg_rgba_obj, *bg_rgba_obj = NULL; Uint8 rgba[4]; SDL_Surface* surf; SDL_Color foreg, backg; int just_return; just_return = 0; if (!PyArg_ParseTuple (args, "OiO|O", &text, &aa, &fg_rgba_obj, &bg_rgba_obj)) return NULL; if (!RGBAFromColorObj (fg_rgba_obj, rgba)) return RAISE (PyExc_TypeError, "Invalid foreground RGBA argument"); foreg.r = rgba[0]; foreg.g = rgba[1]; foreg.b = rgba[2]; if (bg_rgba_obj) { if (!RGBAFromColorObj (bg_rgba_obj, rgba)) return RAISE (PyExc_TypeError, "Invalid background RGBA argument"); backg.r = rgba[0]; backg.g = rgba[1]; backg.b = rgba[2]; backg.unused = 0; } else { backg.r = 0; backg.g = 0; backg.b = 0; backg.unused = 0; } if (!PyObject_IsTrue (text)) { int height = TTF_FontHeight (font); surf = SDL_CreateRGBSurface (SDL_SWSURFACE, 1, height, 32, 0xff<<16, 0xff<<8, 0xff, 0); if (!surf) return RAISE (PyExc_SDLError, "SDL_CreateRGBSurface failed"); if (bg_rgba_obj) { Uint32 c = SDL_MapRGB (surf->format, backg.r, backg.g, backg.b); SDL_FillRect (surf, NULL, c); } else SDL_SetColorKey (surf, SDL_SRCCOLORKEY, 0); just_return = 1; } else if (PyUnicode_Check (text)) { PyObject* strob = PyUnicode_AsEncodedString (text, "utf-8", "replace"); char *astring = Bytes_AsString (strob); if (aa) { if (!bg_rgba_obj) surf = TTF_RenderUTF8_Blended (font, astring, foreg); else surf = TTF_RenderUTF8_Shaded (font, astring, foreg, backg); } else surf = TTF_RenderUTF8_Solid (font, astring, foreg); Py_DECREF (strob); } else if (Bytes_Check (text)) { char* astring = Bytes_AsString (text); if (aa) { if (!bg_rgba_obj) surf = TTF_RenderText_Blended (font, astring, foreg); else surf = TTF_RenderText_Shaded (font, astring, foreg, backg); } else surf = TTF_RenderText_Solid (font, astring, foreg); } else return RAISE (PyExc_TypeError, "text must be a string or unicode"); if (!surf) return RAISE (PyExc_SDLError, TTF_GetError()); if (!aa && bg_rgba_obj && !just_return) /*turn off transparancy*/ { SDL_SetColorKey (surf, 0, 0); surf->format->palette->colors[0].r = backg.r; surf->format->palette->colors[0].g = backg.g; surf->format->palette->colors[0].b = backg.b; } final = PySurface_New (surf); if (!final) SDL_FreeSurface (surf); return final; } static PyObject* font_size (PyObject* self, PyObject* args) { TTF_Font* font = PyFont_AsFont (self); int w, h; PyObject* text; if (!PyArg_ParseTuple (args, "O", &text)) return NULL; if (PyUnicode_Check (text)) { //PyObject* strob = PyUnicode_AsEncodedObject(text, "utf-8", "replace"); PyObject* strob = PyUnicode_AsEncodedString (text, "utf-8", "replace"); char *string = Bytes_AsString (strob); TTF_SizeUTF8 (font, string, &w, &h); Py_DECREF (strob); } else if (Bytes_Check (text)) { char* string = Bytes_AsString (text); TTF_SizeText (font, string, &w, &h); } else return RAISE (PyExc_TypeError, "text must be a string or unicode"); return Py_BuildValue ("(ii)", w, h); } static PyObject* font_metrics (PyObject* self, PyObject* args) { TTF_Font *font = PyFont_AsFont (self); PyObject *list; PyObject *textobj; int length; int i; int minx; int maxx; int miny; int maxy; int advance; void *buf; int isunicode = 0; if (!PyArg_ParseTuple (args, "O", &textobj)) return NULL; if (PyUnicode_Check (textobj)) { buf = PyUnicode_AsUnicode (textobj); isunicode = 1; } else if (Bytes_Check (textobj)) buf = Bytes_AsString (textobj); else return RAISE (PyExc_TypeError, "text must be a string or unicode"); if (!buf) return NULL; if (isunicode) length = PyUnicode_GetSize (textobj); else length = Bytes_Size (textobj); if (length == 0) Py_RETURN_NONE; list = PyList_New (length); if (isunicode) { for (i = 0; i < length; i++) { /* TODO: * TTF_GlyphMetrics() seems to returns a value for any character, * using the default invalid character, if the char is not found. */ if (TTF_GlyphMetrics (font, (Uint16) ((Py_UNICODE*) buf)[i], &minx, &maxx, &miny, &maxy, &advance) == -1) { Py_INCREF (Py_None); PyList_SetItem (list, i, Py_None); /* No matching metrics. */ } else { PyList_SetItem (list, i, Py_BuildValue ("(iiiii)", minx, maxx, miny, maxy, advance)); } } } else { for (i = 0; i < length; i++) { /* TODO: * TTF_GlyphMetrics() seems to returns a value for any character, * using the default invalid character, if the char is not found. */ if (TTF_GlyphMetrics (font, (Uint16) ((char*) buf)[i], &minx, &maxx, &miny, &maxy, &advance) == -1) { Py_INCREF (Py_None); PyList_SetItem (list, i, Py_None); /* No matching metrics. */ } else { PyList_SetItem (list, i, Py_BuildValue ("(iiiii)", minx, maxx, miny, maxy, advance)); } } } return list; } static PyMethodDef font_methods[] = { { "get_height", (PyCFunction) font_get_height, METH_NOARGS, DOC_FONTGETHEIGHT }, { "get_descent", (PyCFunction) font_get_descent, METH_NOARGS, DOC_FONTGETDESCENT }, { "get_ascent", (PyCFunction) font_get_ascent, METH_NOARGS, DOC_FONTGETASCENT }, { "get_linesize", (PyCFunction) font_get_linesize, METH_NOARGS, DOC_FONTGETLINESIZE }, { "get_bold", (PyCFunction) font_get_bold, METH_NOARGS, DOC_FONTGETBOLD }, { "set_bold", font_set_bold, METH_VARARGS, DOC_FONTSETBOLD }, { "get_italic", (PyCFunction) font_get_italic, METH_NOARGS, DOC_FONTGETITALIC }, { "set_italic", font_set_italic, METH_VARARGS, DOC_FONTSETITALIC }, { "get_underline", (PyCFunction) font_get_underline, METH_NOARGS, DOC_FONTGETUNDERLINE }, { "set_underline", font_set_underline, METH_VARARGS, DOC_FONTSETUNDERLINE }, { "metrics", font_metrics, METH_VARARGS, DOC_FONTMETRICS }, { "render", font_render, METH_VARARGS, DOC_FONTRENDER }, { "size", font_size, METH_VARARGS, DOC_FONTSIZE }, { NULL, NULL, 0, NULL } }; /*font object internals*/ static void font_dealloc (PyFontObject* self) { TTF_Font* font = PyFont_AsFont (self); if (font && font_initialized) TTF_CloseFont (font); if (self->weakreflist) PyObject_ClearWeakRefs ((PyObject*) self); Py_TYPE(self)->tp_free ((PyObject*) self); } static int font_init (PyFontObject *self, PyObject *args, PyObject *kwds) { int fontsize; TTF_Font* font = NULL; PyObject* fileobj; self->font = NULL; if (!PyArg_ParseTuple (args, "Oi", &fileobj, &fontsize)) return -1; if (!font_initialized) { RAISE (PyExc_SDLError, "font not initialized"); return -1; } Py_INCREF (fileobj); if (fontsize <= 1) fontsize = 1; if (fileobj == Py_None) { fileobj = font_resource (font_defaultname); if (!fileobj) { char error[1024]; PyOS_snprintf (error, 1024, "default font not found '%s'", font_defaultname); RAISE (PyExc_RuntimeError, error); goto error; } fontsize = (int) (fontsize * .6875); if (fontsize <= 1) fontsize = 1; } if (PyUnicode_Check (fileobj)) { PyObject* tmp = PyUnicode_AsASCIIString (fileobj); if (tmp == NULL) { goto error; } fileobj = tmp; } if (Bytes_Check (fileobj)) { FILE* test; char* filename = Bytes_AsString (fileobj); if (!filename) { goto error; } /*check if it is a valid file, else SDL_ttf segfaults*/ test = fopen (filename, "rb"); if(!test) { PyObject *tmp = NULL; if (!strcmp (filename, font_defaultname)) { tmp = font_resource (font_defaultname); } if (!tmp) { PyErr_SetString (PyExc_IOError, "unable to read font filename"); goto error; } Py_DECREF (fileobj); fileobj = tmp; } else { fclose (test); Py_BEGIN_ALLOW_THREADS; font = TTF_OpenFont(filename, fontsize); Py_END_ALLOW_THREADS; } } if (!font) { #ifdef TTF_MAJOR_VERSION SDL_RWops *rw; rw = RWopsFromPython (fileobj); if (!rw) { goto error; } Py_BEGIN_ALLOW_THREADS; font = TTF_OpenFontIndexRW (rw, 1, fontsize, 0); Py_END_ALLOW_THREADS; #else RAISE (PyExc_NotImplementedError, "nonstring fonts require SDL_ttf-2.0.6"); goto error; #endif } if (!font) { RAISE (PyExc_RuntimeError, SDL_GetError ()); goto error; } Py_DECREF (fileobj); self->font = font; return 0; error: Py_DECREF (fileobj); return -1; } static PyTypeObject PyFont_Type = { TYPE_HEAD (NULL, 0) "pygame.font.Font", sizeof(PyFontObject), 0, (destructor)font_dealloc, 0, 0, /*getattr*/ 0, 0, 0, 0, NULL, 0, (hashfunc)NULL, (ternaryfunc)NULL, (reprfunc)NULL, 0L,0L,0L, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ DOC_PYGAMEFONTFONT, /* Documentation string */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ offsetof(PyFontObject, weakreflist), /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ font_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ (initproc)font_init, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ }; //PyType_GenericNew, /* tp_new */ /*font module methods*/ static PyObject* get_default_font (PyObject* self) { return Text_FromUTF8 (font_defaultname); } static PyMethodDef _font_methods[] = { { "__PYGAMEinit__", (PyCFunction) font_autoinit, METH_NOARGS, "auto initialize function for font" }, { "init", (PyCFunction) fontmodule_init, METH_NOARGS, DOC_PYGAMEFONTINIT }, { "quit", (PyCFunction) fontmodule_quit, METH_NOARGS, DOC_PYGAMEFONTQUIT }, { "get_init", (PyCFunction) get_init, METH_NOARGS, DOC_PYGAMEFONTGETINIT }, { "get_default_font", (PyCFunction) get_default_font, METH_NOARGS, DOC_PYGAMEFONTGETDEFAULTFONT }, { NULL, NULL, 0, NULL } }; static PyObject* PyFont_New (TTF_Font* font) { PyFontObject* fontobj; if (!font) return RAISE (PyExc_RuntimeError, "unable to load font."); fontobj = (PyFontObject *) PyFont_Type.tp_new (&PyFont_Type, NULL, NULL); if (fontobj) fontobj->font = font; return (PyObject*) fontobj; } MODINIT_DEFINE (font) { PyObject *module, *apiobj; static void* c_api[PYGAMEAPI_FONT_NUMSLOTS]; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "font", DOC_PYGAMEFONT, -1, _font_methods, NULL, NULL, NULL, NULL }; #endif PyFONT_C_API[0] = PyFONT_C_API[0]; /*clean an unused warning*/ /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_color (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_surface (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_rwobject (); if (PyErr_Occurred ()) { MODINIT_ERROR; } /* type preparation */ if (PyType_Ready (&PyFont_Type) < 0) { MODINIT_ERROR; } PyFont_Type.tp_new = PyType_GenericNew; #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "font", _font_methods, DOC_PYGAMEFONT); #endif if (module == NULL) { MODINIT_ERROR; } Py_INCREF ((PyObject*) &PyFont_Type); if (PyModule_AddObject (module, "FontType", (PyObject *) &PyFont_Type) == -1) { Py_DECREF ((PyObject *) &PyFont_Type); DECREF_MOD (module); MODINIT_ERROR; } Py_INCREF ((PyObject*) &PyFont_Type); if (PyModule_AddObject (module, "Font", (PyObject *) &PyFont_Type) == -1) { Py_DECREF ((PyObject *) &PyFont_Type); DECREF_MOD (module); MODINIT_ERROR; } /* export the c api */ c_api[0] = &PyFont_Type; c_api[1] = PyFont_New; c_api[2] = &font_initialized; apiobj = PyCObject_FromVoidPtr (c_api, NULL); if (apiobj == NULL) { DECREF_MOD (module); MODINIT_ERROR; } if (PyModule_AddObject (module, PYGAMEAPI_LOCAL_ENTRY, apiobj) == -1) { Py_DECREF (apiobj); DECREF_MOD (module); MODINIT_ERROR; } MODINIT_RETURN (module); } pygame-1.9.1release/src/ffmovie.h0000644000175000017500000000621310444044770016644 0ustar vincentvincent#include #include #include #define MAX_SOURCENAME 1024 #define MAX_AUDIOQ_SIZE (5 * 16 * 1024) /* SDL audio buffer size, in samples. Should be small to have precise A/V sync as SDL does not have hardware buffer fullness info. */ #define SDL_AUDIO_BUFFER_SIZE 1024 /* no AV sync correction is done if below the AV sync threshold */ #define AV_SYNC_THRESHOLD 0.08 /* no AV correction is done if too big error */ #define AV_NOSYNC_THRESHOLD 10.0 /* maximum audio speed change to get correct sync */ #define SAMPLE_CORRECTION_PERCENT_MAX 10 /* we use about AUDIO_DIFF_AVG_NB A-V differences to make the average */ #define AUDIO_DIFF_AVG_NB 20 /* NOTE: the size must be big enough to compensate the hardware audio buffersize size */ #define SAMPLE_ARRAY_SIZE (2*65536) typedef struct PacketQueue { AVPacketList *first_pkt, *last_pkt; int nb_packets; int size; int abort_request; SDL_mutex *mutex; SDL_cond *cond; } PacketQueue; typedef struct FFMovie { SDL_Thread *decode_thread; int abort_request; int paused; AVFormatContext *context; double external_clock; /* external clock base */ int64_t external_clock_time; double audio_clock; double audio_diff_cum; /* used for AV difference average computation */ double audio_diff_avg_coef; double audio_diff_threshold; int audio_diff_avg_count; AVStream *audio_st; PacketQueue audioq; int audio_hw_buf_size; /* samples output by the codec. we reserve more space for avsync compensation */ uint8_t audio_buf[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2]; int audio_buf_size; /* in bytes */ int audio_buf_index; /* in bytes */ AVPacket audio_pkt; uint8_t *audio_pkt_data; int audio_pkt_size; int64_t audio_pkt_ipts; int audio_volume; /*must self implement*/ int16_t sample_array[SAMPLE_ARRAY_SIZE]; int sample_array_index; int frame_count; double frame_timer; double frame_last_pts; double frame_last_delay; double frame_delay; /*display time of each frame, based on fps*/ double video_clock; /*seconds of video frame decoded*/ AVStream *video_st; int64_t vidpkt_timestamp; int vidpkt_start; double video_last_P_pts; /* pts of the last P picture (needed if B frames are present) */ double video_current_pts; /* current displayed pts (different from video_clock if frame fifos are used) */ SDL_mutex *dest_mutex; double dest_showtime; /*when to next show the dest_overlay*/ SDL_Overlay *dest_overlay; SDL_Surface *dest_surface; SDL_Rect dest_rect; double time_offset; /*track paused time*/ int audio_disable; const char *sourcename; } FFMovie; FFMovie *ffmovie_open(const char *filename); FFMovie *ffmovie_reopen(FFMovie *movie); void ffmovie_close(FFMovie *movie); void ffmovie_play(FFMovie *movie); void ffmovie_stop(FFMovie *movie); void ffmovie_pause(FFMovie *movie); void ffmovie_setvolume(FFMovie *movie, int volume); void ffmovie_setdisplay(FFMovie *movie, SDL_Surface *dest, SDL_Rect *rect); void ffmovie_abortall(void); pygame-1.9.1release/src/ffmovie.c0000644000175000017500000006477110444044770016654 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org This code based on the sample "ffplay" included with ffmpeg. The ffmpeg library is released as LGPL software. */ #include "pygame.h" #include "ffmovie.h" #ifndef MIN #define MIN(a,b) (((a) < (b)) ? (a) : (b)) #endif static int Global_abort_all = 0; static int Global_num_active = 0; static void print_error(const char *filename, int err) { switch(err) { case AVERROR_NUMEXPECTED: fprintf(stderr, "%s: Incorrect image filename syntax.\n" "Use '%%d' to specify the image number:\n" " for img1.jpg, img2.jpg, ..., use 'img%%d.jpg';\n" " for img001.jpg, img002.jpg, ..., use 'img%%03d.jpg'.\n", filename); break; case AVERROR_INVALIDDATA: fprintf(stderr, "%s: Error while parsing header\n", filename); break; case AVERROR_NOFMT: fprintf(stderr, "%s: Unknown format\n", filename); break; default: fprintf(stderr, "%s: Error while opening file (%d)\n", filename, err); break; } } /* packet queue handling */ static void packet_queue_init(PacketQueue *q) { memset(q, 0, sizeof(PacketQueue)); q->mutex = SDL_CreateMutex(); q->cond = SDL_CreateCond(); } static void packet_queue_end(PacketQueue *q) { AVPacketList *pkt, *pkt1; for(pkt = q->first_pkt; pkt != NULL; pkt = pkt1) { pkt1 = pkt->next; av_free_packet(&pkt->pkt); } SDL_DestroyMutex(q->mutex); SDL_DestroyCond(q->cond); } static int packet_queue_put(PacketQueue *q, AVPacket *pkt) { AVPacketList *pkt1; pkt1 = av_malloc(sizeof(AVPacketList)); if (!pkt1) return -1; pkt1->pkt = *pkt; pkt1->next = NULL; SDL_LockMutex(q->mutex); if (!q->last_pkt) q->first_pkt = pkt1; else q->last_pkt->next = pkt1; q->last_pkt = pkt1; q->nb_packets++; q->size += pkt1->pkt.size; /* XXX: should duplicate packet data in DV case */ SDL_CondSignal(q->cond); SDL_UnlockMutex(q->mutex); return 0; } static void packet_queue_abort(PacketQueue *q) { SDL_LockMutex(q->mutex); q->abort_request = 1; SDL_CondSignal(q->cond); SDL_UnlockMutex(q->mutex); } /* return < 0 if aborted, 0 if no packet and > 0 if packet. */ static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block) { AVPacketList *pkt1; int ret; SDL_LockMutex(q->mutex); for(;;) { if (q->abort_request || Global_abort_all) { ret = -1; break; } pkt1 = q->first_pkt; if (pkt1) { q->first_pkt = pkt1->next; if (!q->first_pkt) q->last_pkt = NULL; q->nb_packets--; q->size -= pkt1->pkt.size; *pkt = pkt1->pkt; av_free(pkt1); ret = 1; break; } else if (!block) { ret = 0; break; } else { SDL_CondWait(q->cond, q->mutex); } } SDL_UnlockMutex(q->mutex); return ret; } static void video_display(FFMovie *movie) { /*DECODE THREAD - from video_refresh_timer*/ SDL_LockMutex(movie->dest_mutex); if (movie->dest_overlay) { SDL_DisplayYUVOverlay(movie->dest_overlay, &movie->dest_rect); } SDL_UnlockMutex(movie->dest_mutex); } /* get the current audio clock value */ static double get_audio_clock(FFMovie *movie) { /*SDL AUDIO THREAD*/ double pts; int hw_buf_size, bytes_per_sec; pts = movie->audio_clock; hw_buf_size = movie->audio_hw_buf_size - movie->audio_buf_index; bytes_per_sec = 0; if (movie->audio_st) { bytes_per_sec = movie->audio_st->codec.sample_rate * 2 * movie->audio_st->codec.channels; } if (bytes_per_sec) pts -= (double)hw_buf_size / bytes_per_sec; return pts; } static double get_master_clock(FFMovie *movie) { Uint32 ticks = SDL_GetTicks(); return (ticks / 1000.0) - movie->time_offset; } /* called to display each frame */ static void video_refresh_timer(FFMovie* movie) { /*moving to DECODE THREAD, from queue_frame*/ double actual_delay, delay, sync_threshold, ref_clock, diff; int skipframe = 0; if (movie->video_st) { /*shouldn't ever even get this far if no video_st*/ /* update current video pts */ movie->video_current_pts = movie->video_clock; /* compute nominal delay */ delay = movie->video_clock - movie->frame_last_pts; if (delay <= 0 || delay >= 1.0) { /* if incorrect delay, use previous one */ delay = movie->frame_last_delay; } movie->frame_last_delay = delay; movie->frame_last_pts = movie->video_clock; /* we try to correct big delays by duplicating or deleting a frame */ ref_clock = get_master_clock(movie); diff = movie->video_clock - ref_clock; //printf("get_master_clock = %f\n", (float)(ref_clock/1000000.0)); /* skip or repeat frame. We take into account the delay to compute the threshold. I still don't know if it is the best guess */ sync_threshold = AV_SYNC_THRESHOLD; if (delay > sync_threshold) sync_threshold = delay; if (fabs(diff) < AV_NOSYNC_THRESHOLD) { if (diff <= -sync_threshold) { skipframe = 1; delay = 0; } else if (diff >= sync_threshold) { delay = 2 * delay; } } movie->frame_timer += delay; actual_delay = movie->frame_timer - get_master_clock(movie); //printf("DELAY: delay=%f, frame_timer=%f, video_clock=%f\n", // (float)delay, (float)movie->frame_timer, (float)movie->video_clock); if (actual_delay > 0.010) { movie->dest_showtime = movie->frame_timer; } if (skipframe) { movie->dest_showtime = 0; /*movie->dest_showtime = get_master_clock(movie); this shows every frame*/ } } } static int queue_picture(FFMovie *movie, AVFrame *src_frame) { /*DECODE LOOP*/ AVPicture pict; SDL_LockMutex(movie->dest_mutex); /* if the frame movie not skipped, then display it */ if (movie->dest_overlay) { /* get a pointer on the bitmap */ SDL_LockYUVOverlay(movie->dest_overlay); pict.data[0] = movie->dest_overlay->pixels[0]; pict.data[1] = movie->dest_overlay->pixels[2]; pict.data[2] = movie->dest_overlay->pixels[1]; pict.linesize[0] = movie->dest_overlay->pitches[0]; pict.linesize[1] = movie->dest_overlay->pitches[2]; pict.linesize[2] = movie->dest_overlay->pitches[1]; /* first fields of AVFrame match AVPicture, so it appears safe to cast here (at least of ffmpeg-0.4.8, this is how ffplay does it) AVPicture is just a container for 4 pixel pointers and 4 strides */ img_convert(&pict, PIX_FMT_YUV420P, (AVPicture *)src_frame, movie->video_st->codec.pix_fmt, movie->video_st->codec.width, movie->video_st->codec.height); SDL_UnlockYUVOverlay(movie->dest_overlay); video_refresh_timer(movie); } SDL_UnlockMutex(movie->dest_mutex); return 0; } static void update_video_clock(FFMovie *movie, AVFrame* frame, double pts) { /* if B frames are present, and if the current picture is a I or P frame, we use the last pts */ if (movie->video_st->codec.has_b_frames && frame->pict_type != FF_B_TYPE) { double last_P_pts = movie->video_last_P_pts; movie->video_last_P_pts = pts; pts = last_P_pts; } /* update video clock with pts, if present */ if (pts != 0) { movie->video_clock = pts; } else { movie->video_clock += movie->frame_delay; /* for MPEG2, the frame can be repeated, update accordingly */ if (frame->repeat_pict) { movie->video_clock += frame->repeat_pict * (movie->frame_delay * 0.5); } } } static int video_read_packet(FFMovie *movie, AVPacket *pkt) { /*DECODE THREAD*/ unsigned char *ptr; int len, len1, got_picture; AVFrame frame; double pts; ptr = pkt->data; if (movie->video_st->codec.codec_id == CODEC_ID_RAWVIDEO) { avpicture_fill((AVPicture *)&frame, ptr, movie->video_st->codec.pix_fmt, movie->video_st->codec.width, movie->video_st->codec.height); if (pkt->pts != AV_NOPTS_VALUE) pts = (double)pkt->pts * movie->context->pts_num / movie->context->pts_den; else pts = 0; frame.pict_type = FF_I_TYPE; update_video_clock(movie, &frame, pts); movie->frame_count++; /*this should probably represent displayed frames, not decoded*/ if (queue_picture(movie, &frame) < 0) return -1; } else { len = pkt->size; while (len > 0) { if (movie->vidpkt_start) { movie->vidpkt_start = 0; movie->vidpkt_timestamp = pkt->pts; } len1 = avcodec_decode_video(&movie->video_st->codec, &frame, &got_picture, ptr, len); if (len1 < 0) break; if (got_picture) { movie->frame_count++; /*this should probably represent displayed frames, not decoded*/ if (movie->vidpkt_timestamp != AV_NOPTS_VALUE) pts = (double)movie->vidpkt_timestamp * movie->context->pts_num / movie->context->pts_den; else pts = 0; update_video_clock(movie, &frame, pts); if (queue_picture(movie, &frame) < 0) return -1; movie->vidpkt_start = 1; } ptr += len1; len -= len1; } } return 0; } /* return the new audio buffer size (samples can be added or deleted to get better sync if video or external master clock) */ static int synchronize_audio(FFMovie *movie, short *samples, int samples_size1, double pts) { /*SDL AUDIO THREAD*/ int n, samples_size; double ref_clock; double diff, avg_diff; int wanted_size, min_size, max_size, nb_samples; n = 2 * movie->audio_st->codec.channels; samples_size = samples_size1; /* try to remove or add samples to correct the clock */ ref_clock = get_master_clock(movie); diff = get_audio_clock(movie) - ref_clock; if (diff < AV_NOSYNC_THRESHOLD) { movie->audio_diff_cum = diff + movie->audio_diff_avg_coef * movie->audio_diff_cum; if (movie->audio_diff_avg_count < AUDIO_DIFF_AVG_NB) { /* not enough measures to have a correct estimate */ movie->audio_diff_avg_count++; } else { /* estimate the A-V difference */ avg_diff = movie->audio_diff_cum * (1.0 - movie->audio_diff_avg_coef); if (fabs(avg_diff) >= movie->audio_diff_threshold) { wanted_size = samples_size + ((int)(diff * movie->audio_st->codec.sample_rate) * n); nb_samples = samples_size / n; min_size = ((nb_samples * (100 - SAMPLE_CORRECTION_PERCENT_MAX)) / 100) * n; max_size = ((nb_samples * (100 + SAMPLE_CORRECTION_PERCENT_MAX)) / 100) * n; if (wanted_size < min_size) wanted_size = min_size; else if (wanted_size > max_size) wanted_size = max_size; /* add or remove samples to correction the synchro */ if (wanted_size < samples_size) { /* remove samples */ samples_size = wanted_size; } else if (wanted_size > samples_size) { uint8_t *samples_end, *q; int nb; /* add samples */ nb = (samples_size - wanted_size); samples_end = (uint8_t *)samples + samples_size - n; q = samples_end + n; while (nb > 0) { memcpy(q, samples_end, n); q += n; nb -= n; } samples_size = wanted_size; } } } } else { /* too big difference : may be initial PTS errors, so reset A-V filter */ movie->audio_diff_avg_count = 0; movie->audio_diff_cum = 0; } return samples_size; } /* decode one audio frame and returns its uncompressed size */ static int audio_decode_frame(FFMovie *movie, uint8_t *audio_buf, double *pts_ptr) { /*SDL AUDIO THREAD*/ AVPacket *pkt = &movie->audio_pkt; int len1, data_size; double pts; for(;;) { if (movie->paused || movie->audioq.abort_request || Global_abort_all) { return -1; } while (movie->audio_pkt_size > 0) { len1 = avcodec_decode_audio(&movie->audio_st->codec, (int16_t *)audio_buf, &data_size, movie->audio_pkt_data, movie->audio_pkt_size); if (len1 < 0) break; movie->audio_pkt_data += len1; movie->audio_pkt_size -= len1; if (data_size > 0) { pts = 0; if (movie->audio_pkt_ipts != AV_NOPTS_VALUE) pts = (double)movie->audio_pkt_ipts * movie->context->pts_num / movie->context->pts_den; /* if no pts, then compute it */ if (pts != 0) { movie->audio_clock = pts; } else { int n; n = 2 * movie->audio_st->codec.channels; movie->audio_clock += (double)data_size / (double)(n * movie->audio_st->codec.sample_rate); } *pts_ptr = movie->audio_clock; movie->audio_pkt_ipts = AV_NOPTS_VALUE; /* we got samples : we can exit now */ return data_size; } } /* free previous packet if any */ if (pkt->destruct) av_free_packet(pkt); /* read next packet */ if (packet_queue_get(&movie->audioq, pkt, 1) < 0) return -1; movie->audio_pkt_data = pkt->data; movie->audio_pkt_size = pkt->size; movie->audio_pkt_ipts = pkt->pts; } } /* prepare a new audio buffer */ void sdl_audio_callback(void *opaque, Uint8 *stream, int len) { /*SDL AUDIO THREAD*/ FFMovie *movie = opaque; int audio_size, len1; double pts; while (len > 0) { if (movie->audio_buf_index >= movie->audio_buf_size) { audio_size = audio_decode_frame(movie, movie->audio_buf, &pts); if (audio_size < 0) { /* if error, just output silence */ movie->audio_buf_size = 1024; memset(movie->audio_buf, 0, movie->audio_buf_size); } else { audio_size = synchronize_audio(movie, (int16_t*)movie->audio_buf, audio_size, pts); movie->audio_buf_size = audio_size; } movie->audio_buf_index = 0; } len1 = movie->audio_buf_size - movie->audio_buf_index; if (len1 > len) len1 = len; memcpy(stream, (uint8_t *)movie->audio_buf + movie->audio_buf_index, len1); len -= len1; stream += len1; movie->audio_buf_index += len1; } } static void ffmovie_cleanup(FFMovie *movie) { if(!movie) return; if(movie->audio_st) { packet_queue_abort(&movie->audioq); SDL_CloseAudio(); packet_queue_end(&movie->audioq); avcodec_close(&movie->audio_st->codec); movie->audio_st = NULL; } if(movie->video_st) { avcodec_close(&movie->video_st->codec); movie->video_st = NULL; } if (movie->context) { av_close_input_file(movie->context); movie->context = NULL; } if(movie->dest_mutex) { SDL_DestroyMutex(movie->dest_mutex); movie->dest_mutex = NULL; } if (movie->dest_overlay) { SDL_FreeYUVOverlay(movie->dest_overlay); movie->dest_overlay = NULL; } Global_num_active--; } /* this thread gets the stream from the disk or the network */ static int decode_thread(void *arg) { /* DECODE THREAD */ FFMovie *movie = arg; int status; AVPacket pkt1, *pkt = &pkt1; while(!movie->abort_request && !Global_abort_all) { /* read if the queues have room */ if (movie->audioq.size < MAX_AUDIOQ_SIZE && !movie->dest_showtime) { if (av_read_packet(movie->context, pkt) < 0) { break; } if (movie->audio_st && pkt->stream_index == movie->audio_st->index) { packet_queue_put(&movie->audioq, pkt); } else if (movie->video_st && pkt->stream_index == movie->video_st->index) { status = video_read_packet(movie, pkt); av_free_packet(pkt); if(status < 0) { break; } } else { av_free_packet(pkt); } } if(movie->dest_showtime) { double now = get_master_clock(movie); if(now >= movie->dest_showtime) { video_display(movie); movie->dest_showtime = 0; } else { // printf("showtime not ready, waiting... (%.2f,%.2f)\n", // (float)now, (float)movie->dest_showtime); SDL_Delay(10); } } if(movie->paused) { double endpause, startpause = SDL_GetTicks() / 1000.0; while(movie->paused && !movie->abort_request && !Global_abort_all) { SDL_Delay(100); } endpause = SDL_GetTicks() / 1000.0; movie->dest_showtime = 0; movie->time_offset += endpause - startpause; } } ffmovie_cleanup(movie); return 0; } static int audiostream_init(FFMovie *movie, AVStream *stream) { /* MAIN THREAD */ AVCodec *codec; SDL_AudioSpec wanted_spec, spec; codec = avcodec_find_decoder(stream->codec.codec_id); if (!codec || avcodec_open(&stream->codec, codec) < 0) { return -1; } /* init sdl audio output */ wanted_spec.freq = stream->codec.sample_rate; wanted_spec.format = AUDIO_S16SYS; wanted_spec.channels = stream->codec.channels; if(wanted_spec.channels > 2) wanted_spec.channels = 2; wanted_spec.silence = 0; wanted_spec.samples = SDL_AUDIO_BUFFER_SIZE; wanted_spec.callback = sdl_audio_callback; wanted_spec.userdata = movie; if (SDL_OpenAudio(&wanted_spec, &spec) < 0) { fprintf(stderr, "SDL_OpenAudio: %s\n", SDL_GetError()); return -1; } movie->audio_st = stream; movie->audio_hw_buf_size = spec.size; movie->audio_buf_size = 0; movie->audio_buf_index = 0; movie->audio_pkt_size = 0; /* init averaging filter */ movie->audio_diff_avg_coef = exp(log(0.01) / AUDIO_DIFF_AVG_NB); movie->audio_diff_avg_count = 0; /* since we do not have a precise anough audio fifo fullness, we correct audio sync only if larger than this threshold */ movie->audio_diff_threshold = 2.0 * SDL_AUDIO_BUFFER_SIZE / stream->codec.sample_rate; /* should this be spec.freq instead of codec.sample_rate ?? */ memset(&movie->audio_pkt, 0, sizeof(movie->audio_pkt)); packet_queue_init(&movie->audioq); SDL_PauseAudio(0); return 0; } static int videostream_init(FFMovie *movie, AVStream *stream) { /* MAIN THREAD */ AVCodec *codec; codec = avcodec_find_decoder(stream->codec.codec_id); if (!codec || avcodec_open(&stream->codec, codec) < 0) return -1; movie->video_st = stream; movie->frame_last_delay = 40e-3; movie->frame_timer = SDL_GetTicks() / 1000.0; movie->frame_delay = (double)movie->video_st->codec.frame_rate_base / (double)movie->video_st->codec.frame_rate; movie->vidpkt_start = 1; movie->dest_mutex = SDL_CreateMutex(); return 0; } static int ffmovie_initialized = 0; FFMovie *ffmovie_open(const char *filename) { /* MAIN THREAD */ FFMovie *movie; int err, i; AVFormatParameters params = {0}; if(!ffmovie_initialized) { ffmovie_initialized = 1; av_register_all(); } movie = av_mallocz(sizeof(FFMovie)); if (!movie) return NULL; err = av_open_input_file(&movie->context, filename, NULL, 0, ¶ms); if (err < 0) { print_error(filename, err); return NULL; } err = av_find_stream_info(movie->context); if (err < 0) { av_free(movie); fprintf(stderr, "%s: could not find codec parameters\n", filename); return NULL; } /*find and open streams*/ for(i = 0; i < movie->context->nb_streams; i++) { AVStream *stream = movie->context->streams[i]; switch(stream->codec.codec_type) { case CODEC_TYPE_AUDIO: if (!movie->audio_st && !movie->audio_disable) audiostream_init(movie, stream); break; case CODEC_TYPE_VIDEO: if (!movie->video_st) videostream_init(movie, stream); break; default: break; } } if (!movie->video_st && !movie->audio_st) { fprintf(stderr, "%s: could not open codecs\n", filename); ffmovie_cleanup(movie); return NULL; } movie->frame_count = 0; movie->time_offset = 0.0; movie->paused = 1; movie->sourcename = strdup(filename); Global_num_active++; movie->decode_thread = SDL_CreateThread(decode_thread, movie); if (!movie->decode_thread) { ffmovie_cleanup(movie); return NULL; } return movie; } void ffmovie_close(FFMovie *movie) { /*MAIN THREAD*/ movie->abort_request = 1; SDL_WaitThread(movie->decode_thread, NULL); if(movie->sourcename) { free((void*)movie->sourcename); } av_free(movie); } void ffmovie_play(FFMovie *movie) { movie->paused = 0; } void ffmovie_stop(FFMovie *movie) { movie->paused = 1; /*should force blit of current frame to source*/ /*even better, to rgb not just yuv*/ } void ffmovie_pause(FFMovie *movie) { if(movie->paused) { ffmovie_play(movie); } else { ffmovie_stop(movie); } } int ffmovie_finished(FFMovie *movie) { return movie->context == NULL; } void ffmovie_setdisplay(FFMovie *movie, SDL_Surface *dest, SDL_Rect *rect) { /*MAIN THREAD*/ if(!movie->video_st || movie->abort_request || movie->context==NULL) { /*This movie has no video stream, or finished*/ return; } SDL_LockMutex(movie->dest_mutex); if(movie->dest_overlay) { /*clean any existing overlay*/ SDL_FreeYUVOverlay(movie->dest_overlay); movie->dest_overlay = NULL; } if(!dest) { /*no destination*/ movie->dest_overlay = NULL; } else { if(rect) { movie->dest_rect.x = rect->x; movie->dest_rect.y = rect->y; movie->dest_rect.w = rect->w; movie->dest_rect.h = rect->h; } else { movie->dest_rect.x = 0; movie->dest_rect.y = 0; movie->dest_rect.w = 0; movie->dest_rect.h = 0; } if(movie->dest_rect.w == 0) { movie->dest_rect.w = MIN(movie->video_st->codec.width, dest->w); } if(movie->dest_rect.h == 0) { movie->dest_rect.h = MIN(movie->video_st->codec.height, dest->h); } #if 0 /* XXX: use generic function */ /* XXX: disable overlay if no hardware acceleration or if RGB format */ switch(movie->video_st->codec.pix_fmt) { case PIX_FMT_YUV420P: case PIX_FMT_YUV422P: case PIX_FMT_YUV444P: case PIX_FMT_YUV422: case PIX_FMT_YUV410P: case PIX_FMT_YUV411P: is_yuv = 1; break; default: is_yuv = 0; break; } #endif movie->dest_surface = dest; movie->dest_overlay = SDL_CreateYUVOverlay( movie->video_st->codec.width, movie->video_st->codec.height, SDL_YV12_OVERLAY, dest); } SDL_UnlockMutex(movie->dest_mutex); /*set display time to now, force redraw*/ movie->dest_showtime = get_master_clock(movie); } void ffmovie_setvolume(FFMovie *movie, int volume) { if(movie->audio_st) { movie->audio_volume = volume; /*note, i'll need to multiply the sound data myself*/ } } void ffmovie_abortall() { Global_abort_all = 1; while(Global_num_active > 0) { SDL_Delay(200); } Global_abort_all = 0; } FFMovie *ffmovie_reopen(FFMovie *movie) { const char* filename; SDL_Overlay *dest_overlay; SDL_Surface *dest_surface; SDL_Rect dest_rect; int waspaused = movie->paused; filename = movie->sourcename; movie->sourcename = NULL; if(!filename) { return NULL; } SDL_LockMutex(movie->dest_mutex); dest_overlay = movie->dest_overlay; dest_surface = movie->dest_surface; dest_rect = movie->dest_rect; movie->dest_overlay = NULL; movie->dest_surface = NULL; SDL_UnlockMutex(movie->dest_mutex); ffmovie_close(movie); movie = ffmovie_open(filename); free((void*)filename); if(movie) { if(dest_overlay) { SDL_LockMutex(movie->dest_mutex); movie->dest_overlay = dest_overlay; movie->dest_surface = dest_surface; movie->dest_rect = dest_rect; SDL_UnlockMutex(movie->dest_mutex); } if(!waspaused) { ffmovie_play(movie); } } return movie; } pygame-1.9.1release/src/fastevents.h0000644000175000017500000000320710230627071017365 0ustar vincentvincent#ifndef _FASTEVENTS_H_ #define _FASTEVENTS_H_ /* NET2 is a threaded, event based, network IO library for SDL. Copyright (C) 2002 Bob Pendleton 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 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA If you do not wish to comply with the terms of the LGPL please contact the author as other terms are available for a fee. Bob Pendleton Bob@Pendleton.com */ #include "SDL.h" #ifdef __cplusplus extern "C" { #endif int FE_Init(void); // Initialize FE void FE_Quit(void); // shutdown FE void FE_PumpEvents(void); // replacement for SDL_PumpEvents int FE_PollEvent(SDL_Event *event); // replacement for SDL_PollEvent int FE_WaitEvent(SDL_Event *event); // replacement for SDL_WaitEvent int FE_PushEvent(SDL_Event *event); // replacement for SDL_PushEvent char *FE_GetError(void); // get the last error #ifdef __cplusplus } #endif #endif pygame-1.9.1release/src/fastevents.c0000644000175000017500000000713611207055754017375 0ustar vincentvincent/* NET2 is a threaded, event based, network IO library for SDL. Copyright (C) 2002 Bob Pendleton 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 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA If you do not wish to comply with the terms of the LGPL please contact the author as other terms are available for a fee. Bob Pendleton Bob@Pendleton.com */ #include #include #include #include "SDL.h" #include "SDL_thread.h" #include "fastevents.h" // ---------------------------------------- // //error handling code // static char *error = NULL; static __inline__ void setError (char *err) { error = err; } char* FE_GetError () { return error; } //---------------------------------------- // //Threads, mutexs, thread utils, and // thread safe wrappers // static SDL_mutex *eventLock = NULL; static SDL_cond *eventWait = NULL; static SDL_TimerID eventTimer = 0; //---------------------------------------- // // // int FE_PushEvent (SDL_Event * ev) { SDL_LockMutex (eventLock); while (-1 == SDL_PushEvent (ev)) SDL_CondWait (eventWait, eventLock); SDL_UnlockMutex (eventLock); SDL_CondSignal (eventWait); return 1; } //---------------------------------------- // // // void FE_PumpEvents () { SDL_LockMutex (eventLock); SDL_PumpEvents (); SDL_UnlockMutex (eventLock); } //---------------------------------------- // // // int FE_PollEvent (SDL_Event * event) { int val = 0; SDL_LockMutex (eventLock); val = SDL_PollEvent (event); SDL_UnlockMutex (eventLock); if (0 < val) SDL_CondSignal (eventWait); return val; } //---------------------------------------- // //Replacement for SDL_WaitEvent // int FE_WaitEvent (SDL_Event * event) { int val = 0; SDL_LockMutex (eventLock); while (0 >= (val = SDL_PollEvent (event))) SDL_CondWait (eventWait, eventLock); SDL_UnlockMutex (eventLock); SDL_CondSignal (eventWait); return val; } //---------------------------------------- // // // static Uint32 timerCallback (Uint32 interval, void *param) { SDL_CondBroadcast (eventWait); return interval; } //---------------------------------------- // // // int FE_Init () { if (0 == (SDL_INIT_TIMER & SDL_WasInit (SDL_INIT_TIMER))) SDL_InitSubSystem (SDL_INIT_TIMER); eventLock = SDL_CreateMutex (); if (NULL == eventLock) { setError ("FE: can't create a mutex"); return -1; } eventWait = SDL_CreateCond (); if (NULL == eventWait) { setError ("FE: can't create a condition variable"); return -1; } eventTimer = SDL_AddTimer (10, timerCallback, NULL); if (NULL == eventTimer) { setError ("FE: can't add a timer"); return -1; } return 0; } //---------------------------------------- // // // void FE_Quit () { SDL_DestroyMutex (eventLock); eventLock = NULL; SDL_DestroyCond (eventWait); eventWait = NULL; SDL_RemoveTimer (eventTimer); } pygame-1.9.1release/src/fastevent.c0000644000175000017500000002251011207055754017203 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* * pygame fastevent module */ #define PYGAMEAPI_FASTEVENT_INTERNAL #include "pygame.h" #include "pgcompat.h" #include "fastevents.h" static int FE_WasInit = 0; #define FE_INIT_CHECK() \ do \ { \ if (!FE_WasInit) \ return RAISE(PyExc_SDLError, \ "fastevent system not initialized"); \ } \ while (0) static void fastevent_cleanup (void) { if (FE_WasInit) { FE_Quit (); FE_WasInit = 0; } } /* fastevent module functions */ /* DOC */ static char doc_init[] = /* DOC */ "pygame.fastevent.init() -> None\n" /* DOC */ "initialize pygame.fastevent.\n" /* DOC */ ; static PyObject * fastevent_init (PyObject * self) { VIDEO_INIT_CHECK (); #ifndef WITH_THREAD return RAISE (PyExc_SDLError, "pygame.fastevent requires a threaded Python"); #else if (!FE_WasInit) { if (FE_Init () == -1) return RAISE (PyExc_SDLError, FE_GetError ()); PyGame_RegisterQuit (fastevent_cleanup); FE_WasInit = 1; } Py_RETURN_NONE; #endif /* WITH_THREAD */ } /* DOC */ static char doc_pump[] = /* DOC */ "pygame.fastevent.pump() -> None\n" /* DOC */ "update the internal messages\n" /* DOC */ "\n" /* DOC */ "For each frame of your game, you will need to make some sort\n" /* DOC */ "of call to the event queue. This ensures your program can internally\n" /* DOC */ "interact with the rest of the operating system. If you are not using\n" /* DOC */ "other event functions in your game, you should call pump() to allow\n" /* DOC */ "pygame to handle internal actions.\n" /* DOC */ "\n" /* DOC */ "There are important things that must be dealt with internally in the\n" /* DOC */ "event queue. The main window may need to be repainted. Certain joysticks\n" /* DOC */ "must be polled for their values. If you fail to make a call to the event\n" /* DOC */ "queue for too long, the system may decide your program has locked up.\n" /* DOC */ ; static PyObject * fastevent_pump (PyObject * self) { FE_INIT_CHECK (); FE_PumpEvents (); Py_RETURN_NONE; } /* DOC */ static char doc_wait[] = /* DOC */ "pygame.fastevent.wait() -> Event\n" /* DOC */ "wait for an event\n" /* DOC */ "\n" /* DOC */ "Returns the current event on the queue. If there are no messages\n" /* DOC */ "waiting on the queue, this will not return until one is\n" /* DOC */ "available. Sometimes it is important to use this wait to get\n" /* DOC */ "events from the queue, it will allow your application to idle\n" /* DOC */ "when the user isn't doing anything with it.\n" /* DOC */ ; static PyObject * fastevent_wait (PyObject * self) { SDL_Event event; int status; FE_INIT_CHECK (); Py_BEGIN_ALLOW_THREADS; status = FE_WaitEvent (&event); Py_END_ALLOW_THREADS; /* FE_WaitEvent will block forever on error */ if (!status) return RAISE (PyExc_SDLError, "unexpected error in FE_WaitEvent!"); return PyEvent_New (&event); } /* DOC */ static char doc_poll[] = /* DOC */ "pygame.fastevent.poll() -> Event\n" /* DOC */ "get an available event\n" /* DOC */ "\n" /* DOC */ "Returns next event on queue. If there is no event waiting on the\n" /* DOC */ "queue, this will return an event with type NOEVENT.\n" /* DOC */ ; static PyObject * fastevent_poll (PyObject * self) { SDL_Event event; int status; FE_INIT_CHECK (); status = FE_PollEvent (&event); if (status == 1) return PyEvent_New (&event); else { /* Check for -1 */ return PyEvent_New (NULL); } } /* DOC */ static char doc_get[] = /* DOC */ "pygame.fastevent.get() -> list of Events\n" /* DOC */ "get all events from the queue\n" /* DOC */ ; static PyObject * fastevent_get (PyObject * self) { SDL_Event event; PyObject *list, *e; int status; FE_INIT_CHECK (); list = PyList_New (0); if (!list) return NULL; FE_PumpEvents (); while (1) { status = FE_PollEvent (&event); if (status != 1) break; e = PyEvent_New (&event); if (!e) { Py_DECREF (list); return NULL; } PyList_Append (list, e); Py_DECREF (e); } return list; } /*DOC*/ static char doc_post[] = /*DOC*/ "pygame.fastevent.post(Event) -> None\n" /*DOC*/ "place an event on the queue\n" /*DOC*/ "\n" /*DOC*/ "This will post your own event objects onto the event queue.\n" /*DOC*/ "You can past any event type you want, but some care must be\n" /*DOC*/ "taken. For example, if you post a MOUSEBUTTONDOWN event to the\n" /*DOC*/ "queue, it is likely any code receiving the event will expect\n" /*DOC*/ "the standard MOUSEBUTTONDOWN attributes to be available, like\n" /*DOC*/ "'pos' and 'button'.\n" /*DOC*/ "\n" /*DOC*/ "Because pygame.fastevent.post() may have to wait for the queue\n" /*DOC*/ "to empty, you can get into a dead lock if you try to append an\n" /*DOC*/ "event on to a full queue from the thread that processes events.\n" /*DOC*/ "For that reason I do not recommend using this function in the\n" /*DOC*/ "main thread of an SDL program.\n" /*DOC*/ ; static PyObject * fastevent_post (PyObject * self, PyObject * arg) { SDL_Event event; int status; if (!PyObject_IsInstance (arg, (PyObject *) &PyEvent_Type)) { PyErr_Format (PyExc_TypeError, "argument 1 must be %s, not %s", PyEvent_Type.tp_name, Py_TYPE(arg)->tp_name); return NULL; } FE_INIT_CHECK (); if (PyEvent_FillUserEvent ((PyEventObject *) arg, &event)) return NULL; Py_BEGIN_ALLOW_THREADS; status = FE_PushEvent (&event); Py_END_ALLOW_THREADS; if (status != 1) return RAISE (PyExc_SDLError, "Unexpected error in FE_PushEvent"); Py_RETURN_NONE; } static PyMethodDef _fastevent_methods[] = { {"init", (PyCFunction) fastevent_init, METH_NOARGS, doc_init}, {"get", (PyCFunction) fastevent_get, METH_NOARGS, doc_get}, {"pump", (PyCFunction) fastevent_pump, METH_NOARGS, doc_pump}, {"wait", (PyCFunction) fastevent_wait, METH_NOARGS, doc_wait}, {"poll", (PyCFunction) fastevent_poll, METH_NOARGS, doc_poll}, {"post", fastevent_post, METH_O, doc_post}, {NULL, NULL, 0, NULL} }; /*DOC*/ static char doc_fastevent_MODULE[] = /*DOC*/ "pygame.fastevent is a wrapper for Bob Pendleton's fastevent\n" /*DOC*/ "library. It provides fast events for use in multithreaded\n" /*DOC*/ "environments. When using pygame.fastevent, you can not use\n" /*DOC*/ "any of the pump, wait, poll, post, get, peek, etc. functions\n" /*DOC*/ "from pygame.event, but you should use the Event objects.\n" /*DOC*/ ; MODINIT_DEFINE (fastevent) { PyObject *module, *eventmodule, *dict; int ecode; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "fastevent", doc_fastevent_MODULE, -1, _fastevent_methods, NULL, NULL, NULL, NULL }; #endif /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_event (); if (PyErr_Occurred ()) { MODINIT_ERROR; } /* create the module */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "fastevent", _fastevent_methods, doc_fastevent_MODULE); #endif if (module == NULL) { MODINIT_ERROR; } dict = PyModule_GetDict (module); /* add the event module functions if available */ eventmodule = PyImport_ImportModule (IMPPREFIX "event"); if (eventmodule) { char *NAMES[] = {"Event", "event_name", NULL}; int i; for (i = 0; NAMES[i]; i++) { PyObject *ref = PyObject_GetAttrString (eventmodule, NAMES[i]); if (ref) { ecode = PyDict_SetItemString (dict, NAMES[i], ref); Py_DECREF (ref); if (ecode == -1) { DECREF_MOD(module); MODINIT_ERROR; } } else PyErr_Clear (); } } else { PyErr_Clear (); } MODINIT_RETURN (module); } pygame-1.9.1release/src/event.doc0000644000175000017500000002150211171022746016643 0ustar vincentvincentpygame.event pygame module for interacting with events and queues Pygame handles all it's event messaging through an event queue. The routines in this module help you manage that event queue. The input queue is heavily dependent on the pygame display module. If the display has not been initialized and a video mode not set, the event queue will not really work. The queue is a regular queue of Event objects, there are a variety of ways to access the events it contains. From simply checking for the existance of events, to grabbing them directly off the stack. All events have a type identifier. This event type is in between the values of NOEVENT and NUMEVENTS. All user defined events can have the value of USEREVENT or higher. It is recommended make sure your event id's follow this system. To get the state of various input devices, you can forego the event queue and access the input devices directly with their appropriate modules; mouse, key, and joystick. If you use this method, remember that pygame requires some form of communication with the system window manager and other parts of the platform. To keep pygame in synch with the system, you will need to call pygame.event.pump() to keep everything current. You'll want to call this function usually once per game loop. The event queue offers some simple filtering. This can help performance slightly by blocking certain event types from the queue, use the pygame.event.set_allowed() and pygame.event.set_blocked() to work with this filtering. All events default to allowed. Joysticks will not send any events until the device has been initialized. An Event object contains an event type and a readonly set of member data. The Event object contains no method functions, just member data. Event objects are retrieved from the pygame event queue. You can create your own new events with the pygame.event.Event() function. Your program must take steps to keep the event queue from overflowing. If the program is not clearing or getting all events off the queue at regular intervals, it can overflow. When the queue overflows an exception is thrown. All Event objects contain an event type identifier in the Event.type member. You may also get full access to the Event's member data through the Event.dict method. All other member lookups will be passed through to the Event's dictionary values. While debugging and experimenting, you can print the Event objects for a quick display of its type and members. Events that come from the system will have a guaranteed set of member items based on the type. Here is a list of the Event members that are defined with each type. QUIT none ACTIVEEVENT gain, state KEYDOWN unicode, key, mod KEYUP key, mod MOUSEMOTION pos, rel, buttons MOUSEBUTTONUP pos, button MOUSEBUTTONDOWN pos, button JOYAXISMOTION joy, axis, value JOYBALLMOTION joy, ball, rel JOYHATMOTION joy, hat, value JOYBUTTONUP joy, button JOYBUTTONDOWN joy, button VIDEORESIZE size, w, h VIDEOEXPOSE none USEREVENT code Events support equality comparison. Two events are equal if they are the same type and have identical attribute values. Inequality checks also work.
    pump internally process pygame event handlers pygame.event.pump(): return None For each frame of your game, you will need to make some sort of call to the event queue. This ensures your program can internally interact with the rest of the operating system. If you are not using other event functions in your game, you should call pygame.event.pump() to allow pygame to handle internal actions. This function is not necessary if your program is consistently processing events on the queue through the other pygame.event functions. There are important things that must be dealt with internally in the event queue. The main window may need to be repainted or respond to the system. If you fail to make a call to the event queue for too long, the system may decide your program has locked up. get get events from the queue pygame.event.get(): return Eventlist pygame.event.get(type): return Eventlist pygame.event.get(typelist): return Eventlist This will get all the messages and remove them from the queue. If a type or sequence of types is given only those messages will be removed from the queue. If you are only taking specific events from the queue, be aware that the queue could eventually fill up with the events you are not interested. poll get a single event from the queue pygame.event.poll(): return Event Returns a single event from the queue. If the event queue is empty an event of type pygame.NOEVENT will be returned immediately. The returned event is removed from the queue. wait wait for a single event from the queue pygame.event.wait(): return Event Returns a single event from the queue. If the queue is empty this function will wait until one is created. The event is removed from the queue once it has been returned. While the program is waiting it will sleep in an idle state. This is important for programs that want to share the system with other applications. peek test if event types are waiting on the queue pygame.event.peek(type): return bool pygame.event.peek(typelist): return bool Returns true if there are any events of the given type waiting on the queue. If a sequence of event types is passed, this will return True if any of those events are on the queue. clear remove all events from the queue pygame.event.clear(): return None pygame.event.clear(type): return None pygame.event.clear(typelist): return None Remove all events or events of a specific type from the queue. This has the same effect as pygame.event.get() except nothing is returned. This can be slightly more effecient when clearing a full event queue. event_name get the string name from and event id pygame.event.event_name(type): return string Pygame uses integer ids to represent the event types. If you want to report these types to the user they should be converted to strings. This will return a the simple name for an event type. The string is in the WordCap style. set_blocked control which events are allowed on the queue pygame.event.set_blocked(type): return None pygame.event.set_blocked(typelist): return None pygame.event.set_blocked(None): return None The given event types are not allowed to appear on the event queue. By default all events can be placed on the queue. It is safe to disable an event type multiple times. If None is passed as the argument, this has the opposite effect and ALL of the event types are allowed to be placed on the queue. set_allowed control which events are allowed on the queue pygame.event.set_allowed(type): return None pygame.event.set_allowed(typelist): return None pygame.event.set_allowed(None): return None The given event types are allowed to appear on the event queue. By default all events can be placed on the queue. It is safe to enable an event type multiple times. If None is passed as the argument, NONE of the event types are allowed to be placed on the queue. get_blocked test if a type of event is blocked from the queue pygame.event.get_blocked(type): return bool Returns true if the given event type is blocked from the queue. set_grab control the sharing of input devices with other applications pygame.event.set_grab(bool): return None When your program runs in a windowed environment, it will share the mouse and keyboard devices with other applications that have focus. If your program sets the event grab to True, it will lock all input into your program. It is best to not always grab the input, since it prevents the user from doing other things on their system. get_grab test if the program is sharing input devices pygame.event.get_grab(): return bool Returns true when the input events are grabbed for this application. Use pygame.event.set_grab() to control this state. post place a new event on the queue pygame.event.post(Event): return None This places a new event at the end of the event queue. These Events will later be retrieved from the other queue functions. This is usually used for placing pygame.USEREVENT events on the queue. Although any type of event can be placed, if using the sytem event types your program should be sure to create the standard attributes with appropriate values. Event create a new event object pygame.event.Event(type, dict): return Event pygame.event.Event(type, **attributes): return Event Creates a new event with the given type. The event is created with the given attributes and values. The attributes can come from a dictionary argument, or as string keys from a dictionary. The given attributes will be readonly attributes on the new event object itself. These are the only attributes on the Event object, there are no methods attached to Event objects. pygame-1.9.1release/src/event.c0000644000175000017500000006704111226552737016341 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* * pygame event module */ #define PYGAMEAPI_EVENT_INTERNAL #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" // FIXME: The system message code is only tested on windows, so only // include it there for now. #include /*this user event object is for safely passing *objects through the event queue. */ #define USEROBJECT_CHECK1 0xDEADBEEF #define USEROBJECT_CHECK2 0xFEEDF00D typedef struct UserEventObject { struct UserEventObject* next; PyObject* object; } UserEventObject; static UserEventObject* user_event_objects = NULL; /*must pass dictionary as this object*/ static UserEventObject* user_event_addobject (PyObject* obj) { UserEventObject* userobj = PyMem_New (UserEventObject, 1); if (!userobj) return NULL; Py_INCREF (obj); userobj->next = user_event_objects; userobj->object = obj; user_event_objects = userobj; return userobj; } /*note, we doublecheck to make sure the pointer is in our list, *not just some random pointer. this will keep us safe(r). */ static PyObject* user_event_getobject (UserEventObject* userobj) { PyObject* obj = NULL; if (!user_event_objects) /*fail in most common case*/ return NULL; if (user_event_objects == userobj) { obj = userobj->object; user_event_objects = userobj->next; } else { UserEventObject* hunt = user_event_objects; while (hunt && hunt->next != userobj) hunt = hunt->next; if (hunt) { hunt->next = userobj->next; obj = userobj->object; } } if (obj) PyMem_Del (userobj); return obj; } static void user_event_cleanup (void) { if (user_event_objects) { UserEventObject *hunt, *kill; hunt = user_event_objects; while (hunt) { kill = hunt; hunt = hunt->next; Py_DECREF (kill->object); PyMem_Del (kill); } user_event_objects = NULL; } } static int PyEvent_FillUserEvent (PyEventObject *e, SDL_Event *event) { UserEventObject *userobj = user_event_addobject (e->dict); if (!userobj) return -1; event->type = e->type; event->user.code = USEROBJECT_CHECK1; event->user.data1 = (void*)USEROBJECT_CHECK2; event->user.data2 = userobj; return 0; } static PyTypeObject PyEvent_Type; static PyObject* PyEvent_New (SDL_Event*); static PyObject* PyEvent_New2 (int, PyObject*); #define PyEvent_Check(x) ((x)->ob_type == &PyEvent_Type) static char* name_from_eventtype (int type) { switch (type) { case SDL_ACTIVEEVENT: return "ActiveEvent"; case SDL_KEYDOWN: return "KeyDown"; case SDL_KEYUP: return "KeyUp"; case SDL_MOUSEMOTION: return "MouseMotion"; case SDL_MOUSEBUTTONDOWN: return "MouseButtonDown"; case SDL_MOUSEBUTTONUP: return "MouseButtonUp"; case SDL_JOYAXISMOTION: return "JoyAxisMotion"; case SDL_JOYBALLMOTION: return "JoyBallMotion"; case SDL_JOYHATMOTION: return "JoyHatMotion"; case SDL_JOYBUTTONUP: return "JoyButtonUp"; case SDL_JOYBUTTONDOWN: return "JoyButtonDown"; case SDL_QUIT: return "Quit"; case SDL_SYSWMEVENT: return "SysWMEvent"; case SDL_VIDEORESIZE: return "VideoResize"; case SDL_VIDEOEXPOSE: return "VideoExpose"; case SDL_NOEVENT: return "NoEvent"; } if (type >= SDL_USEREVENT && type < SDL_NUMEVENTS) return "UserEvent"; return "Unknown"; } /* Helper for adding objects to dictionaries. Check for errors with PyErr_Occurred() */ static void insobj (PyObject *dict, char *name, PyObject *v) { if(v) { PyDict_SetItemString (dict, name, v); Py_DECREF (v); } } #if defined(Py_USING_UNICODE) static PyObject* our_unichr (long uni) { static PyObject* bltin_unichr = NULL; if (bltin_unichr == NULL) { PyObject* bltins; bltins = PyImport_ImportModule (BUILTINS_MODULE); bltin_unichr = PyObject_GetAttrString (bltins, BUILTINS_UNICHR); Py_DECREF (bltins); } return PyEval_CallFunction (bltin_unichr, "(l)", uni); } static PyObject* our_empty_ustr (void) { static PyObject* empty_ustr = NULL; if (empty_ustr == NULL) { PyObject* bltins; PyObject* bltin_unicode; bltins = PyImport_ImportModule (BUILTINS_MODULE); bltin_unicode = PyObject_GetAttrString (bltins, BUILTINS_UNICODE); empty_ustr = PyEval_CallFunction (bltin_unicode, "(s)", ""); Py_DECREF (bltin_unicode); Py_DECREF (bltins); } Py_INCREF (empty_ustr); return empty_ustr; } #else static PyObject* our_unichr (long uni) { return PyInt_FromLong (uni); } static PyObject* our_empty_ustr (void) { return PyInt_FromLong (0); } #endif /* Py_USING_UNICODE */ static PyObject* dict_from_event (SDL_Event* event) { PyObject *dict=NULL, *tuple, *obj; int hx, hy; /*check if it is an event the user posted*/ if (event->user.code == USEROBJECT_CHECK1 && event->user.data1 == (void*)USEROBJECT_CHECK2) { dict = user_event_getobject ((UserEventObject*)event->user.data2); if (dict) return dict; } if (!(dict = PyDict_New ())) return NULL; switch (event->type) { case SDL_ACTIVEEVENT: insobj (dict, "gain", PyInt_FromLong (event->active.gain)); insobj (dict, "state", PyInt_FromLong (event->active.state)); break; case SDL_KEYDOWN: if (event->key.keysym.unicode) insobj (dict, "unicode", our_unichr (event->key.keysym.unicode)); else insobj (dict, "unicode", our_empty_ustr ()); case SDL_KEYUP: insobj (dict, "key", PyInt_FromLong (event->key.keysym.sym)); insobj (dict, "mod", PyInt_FromLong (event->key.keysym.mod)); insobj (dict, "scancode", PyInt_FromLong (event->key.keysym.scancode)); break; case SDL_MOUSEMOTION: obj = Py_BuildValue ("(ii)", event->motion.x, event->motion.y); insobj (dict, "pos", obj); obj = Py_BuildValue ("(ii)", event->motion.xrel, event->motion.yrel); insobj (dict, "rel", obj); if ((tuple = PyTuple_New (3))) { PyTuple_SET_ITEM (tuple, 0, PyInt_FromLong ((event->motion.state&SDL_BUTTON(1)) != 0)); PyTuple_SET_ITEM (tuple, 1, PyInt_FromLong ((event->motion.state&SDL_BUTTON(2)) != 0)); PyTuple_SET_ITEM (tuple, 2, PyInt_FromLong ((event->motion.state&SDL_BUTTON(3)) != 0)); insobj (dict, "buttons", tuple); } break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: obj = Py_BuildValue ("(ii)", event->button.x, event->button.y); insobj (dict, "pos", obj); insobj (dict, "button", PyInt_FromLong (event->button.button)); break; case SDL_JOYAXISMOTION: insobj (dict, "joy", PyInt_FromLong (event->jaxis.which)); insobj (dict, "axis", PyInt_FromLong (event->jaxis.axis)); insobj (dict, "value", PyFloat_FromDouble (event->jaxis.value/32767.0)); break; case SDL_JOYBALLMOTION: insobj (dict, "joy", PyInt_FromLong (event->jball.which)); insobj (dict, "ball", PyInt_FromLong (event->jball.ball)); obj = Py_BuildValue ("(ii)", event->jball.xrel, event->jball.yrel); insobj (dict, "rel", obj); break; case SDL_JOYHATMOTION: insobj (dict, "joy", PyInt_FromLong (event->jhat.which)); insobj (dict, "hat", PyInt_FromLong (event->jhat.hat)); hx = hy = 0; if (event->jhat.value&SDL_HAT_UP) hy = 1; else if (event->jhat.value&SDL_HAT_DOWN) hy = -1; if (event->jhat.value&SDL_HAT_RIGHT) hx = 1; else if (event->jhat.value&SDL_HAT_LEFT) hx = -1; insobj (dict, "value", Py_BuildValue ("(ii)", hx, hy)); break; case SDL_JOYBUTTONUP: case SDL_JOYBUTTONDOWN: insobj (dict, "joy", PyInt_FromLong (event->jbutton.which)); insobj (dict, "button", PyInt_FromLong (event->jbutton.button)); break; case SDL_VIDEORESIZE: obj = Py_BuildValue ("(ii)", event->resize.w, event->resize.h); insobj (dict, "size", obj); insobj (dict, "w", PyInt_FromLong (event->resize.w)); insobj (dict, "h", PyInt_FromLong (event->resize.h)); break; case SDL_SYSWMEVENT: #ifdef WIN32 insobj (dict, "hwnd", PyInt_FromLong ((long)(event-> syswm.msg->hwnd))); insobj (dict, "msg", PyInt_FromLong (event-> syswm.msg->msg)); insobj (dict, "wparam", PyInt_FromLong (event-> syswm.msg->wParam)); insobj (dict, "lparam", PyInt_FromLong (event-> syswm.msg->lParam)); #endif /* * Make the event */ #if (defined(unix) || defined(__unix__) || defined(_AIX) \ || defined(__OpenBSD__)) && \ (defined(SDL_VIDEO_DRIVER_X11) && !defined(__CYGWIN32__) && \ !defined(ENABLE_NANOX) && !defined(__QNXNTO__)) //printf("asdf :%d:", event->syswm.msg->event.xevent.type); insobj (dict, "event", Text_FromUTF8AndSize ((char*) & (event->syswm.msg->event.xevent), sizeof (XEvent))); #endif break; /* SDL_VIDEOEXPOSE and SDL_QUIT have no attributes */ } if (event->type >= SDL_USEREVENT && event->type < SDL_NUMEVENTS) insobj (dict, "code", PyInt_FromLong (event->user.code)); return dict; } /* event object internals */ static void event_dealloc (PyObject* self) { PyEventObject* e = (PyEventObject*)self; Py_XDECREF (e->dict); PyObject_DEL (self); } static PyObject* event_getattr (PyObject *self, char *name) { PyEventObject* e = (PyEventObject*)self; PyObject* item; if (!strcmp (name, "type")) return PyInt_FromLong (e->type); if (!strcmp (name, "dict")) { Py_INCREF (e->dict); return e->dict; } item = PyDict_GetItemString (e->dict, name); if(item) Py_INCREF (item); else RAISE (PyExc_AttributeError, "event member not defined"); return item; } PyObject* event_str (PyObject* self) { PyEventObject* e = (PyEventObject*)self; char str[1024]; PyObject *strobj; char *s; #if PY3 PyObject *encodedobj; #endif strobj = PyObject_Str (e->dict); if (strobj == NULL) { return NULL; } #if PY3 encodedobj = PyUnicode_AsASCIIString (strobj); Py_DECREF (strobj); strobj = encodedobj; encodedobj = NULL; if (strobj == NULL) { return NULL; } s = PyBytes_AsString (strobj); #else s = PyString_AsString (strobj); #endif sprintf (str, "", e->type, name_from_eventtype (e->type), s); Py_DECREF (strobj); return Text_FromUTF8 (str); } static int event_nonzero (PyEventObject *self) { return self->type != SDL_NOEVENT; } static PyNumberMethods event_as_number = { (binaryfunc)NULL, /*add*/ (binaryfunc)NULL, /*subtract*/ (binaryfunc)NULL, /*multiply*/ #if !PY3 (binaryfunc)NULL, /*divide*/ #endif (binaryfunc)NULL, /*remainder*/ (binaryfunc)NULL, /*divmod*/ (ternaryfunc)NULL, /*power*/ (unaryfunc)NULL, /*negative*/ (unaryfunc)NULL, /*pos*/ (unaryfunc)NULL, /*abs*/ (inquiry)event_nonzero, /*nonzero*/ (unaryfunc)NULL, /*invert*/ (binaryfunc)NULL, /*lshift*/ (binaryfunc)NULL, /*rshift*/ (binaryfunc)NULL, /*and*/ (binaryfunc)NULL, /*xor*/ (binaryfunc)NULL, /*or*/ #if !PY3 (coercion)NULL, /*coerce*/ #endif (unaryfunc)NULL, /*int*/ #if !PY3 (unaryfunc)NULL, /*long*/ #endif (unaryfunc)NULL, /*float*/ }; /* * eventA == eventB * eventA != eventB */ static PyObject* event_richcompare(PyObject *o1, PyObject *o2, int opid) { PyEventObject *e1, *e2; if (!PyEvent_Check(o1) || !PyEvent_Check(o2)) { goto Unimplemented; } e1 = (PyEventObject *) o1; e2 = (PyEventObject *) o2; switch (opid) { case Py_EQ: return PyBool_FromLong (e1->type == e2->type && PyObject_RichCompareBool (e1->dict, e2->dict, Py_EQ) == 1); case Py_NE: return PyBool_FromLong (e1->type != e2->type || PyObject_RichCompareBool (e1->dict, e2->dict, Py_NE) == 1); default: break; } Unimplemented: Py_INCREF (Py_NotImplemented); return Py_NotImplemented; } static PyTypeObject PyEvent_Type = { TYPE_HEAD (NULL, 0) "Event", /*name*/ sizeof(PyEventObject), /*basic size*/ 0, /*itemsize*/ event_dealloc, /*dealloc*/ 0, /*print*/ event_getattr, /*getattr*/ NULL, /*setattr*/ NULL, /*compare*/ event_str, /*repr*/ &event_as_number, /*as_number*/ NULL, /*as_sequence*/ NULL, /*as_mapping*/ (hashfunc)NULL, /*hash*/ (ternaryfunc)NULL, /*call*/ (reprfunc)NULL, /*str*/ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ #if PY3 0, #else Py_TPFLAGS_HAVE_RICHCOMPARE, #endif DOC_PYGAMEEVENTEVENT, /* Documentation string */ 0, /* tp_traverse */ 0, /* tp_clear */ event_richcompare, /* tp_richcompare */ }; static PyObject* PyEvent_New (SDL_Event* event) { PyEventObject* e; e = PyObject_NEW (PyEventObject, &PyEvent_Type); if(!e) return NULL; if (event) { e->type = event->type; e->dict = dict_from_event (event); } else { e->type = SDL_NOEVENT; e->dict = PyDict_New (); } return (PyObject*)e; } static PyObject* PyEvent_New2 (int type, PyObject* dict) { PyEventObject* e; e = PyObject_NEW (PyEventObject, &PyEvent_Type); if (e) { e->type = type; if (!dict) dict = PyDict_New (); else Py_INCREF (dict); e->dict = dict; } return (PyObject*)e; } /* event module functions */ static PyObject* Event (PyObject* self, PyObject* arg, PyObject* keywords) { PyObject* dict = NULL; PyObject* event; int type; if (!PyArg_ParseTuple (arg, "i|O!", &type, &PyDict_Type, &dict)) return NULL; if (!dict) dict = PyDict_New (); else Py_INCREF (dict); if (keywords) { PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next (keywords, &pos, &key, &value)) PyDict_SetItem (dict, key, value); } event = PyEvent_New2 (type, dict); Py_DECREF (dict); return event; } static PyObject* event_name (PyObject* self, PyObject* arg) { int type; if (!PyArg_ParseTuple (arg, "i", &type)) return NULL; return Text_FromUTF8 (name_from_eventtype (type)); } static PyObject* set_grab (PyObject* self, PyObject* arg) { int doit; if (!PyArg_ParseTuple (arg, "i", &doit)) return NULL; VIDEO_INIT_CHECK (); if (doit) SDL_WM_GrabInput (SDL_GRAB_ON); else SDL_WM_GrabInput (SDL_GRAB_OFF); Py_RETURN_NONE; } static PyObject* get_grab (PyObject* self, PyObject* arg) { int mode; VIDEO_INIT_CHECK (); mode = SDL_WM_GrabInput (SDL_GRAB_QUERY); return PyInt_FromLong (mode == SDL_GRAB_ON); } static PyObject* pygame_pump (PyObject* self, PyObject* args) { VIDEO_INIT_CHECK (); SDL_PumpEvents (); Py_RETURN_NONE; } static PyObject* pygame_wait (PyObject* self, PyObject* args) { SDL_Event event; int status; VIDEO_INIT_CHECK (); Py_BEGIN_ALLOW_THREADS; status = SDL_WaitEvent (&event); Py_END_ALLOW_THREADS; if (!status) return RAISE (PyExc_SDLError, SDL_GetError ()); return PyEvent_New (&event); } static PyObject* pygame_poll (PyObject* self, PyObject* args) { SDL_Event event; VIDEO_INIT_CHECK (); if (SDL_PollEvent (&event)) return PyEvent_New (&event); return PyEvent_New (NULL); } static PyObject* event_clear (PyObject* self, PyObject* args) { SDL_Event event; int mask = 0; int loop, num; PyObject* type; int val; if (PyTuple_Size (args) != 0 && PyTuple_Size (args) != 1) return RAISE (PyExc_ValueError, "get requires 0 or 1 argument"); VIDEO_INIT_CHECK (); if (PyTuple_Size (args) == 0) mask = SDL_ALLEVENTS; else { type = PyTuple_GET_ITEM (args, 0); if(PySequence_Check (type)) { num = PySequence_Size (type); for(loop = 0; loop < num; ++loop) { if (!IntFromObjIndex (type, loop, &val)) return RAISE (PyExc_TypeError, "type sequence must contain valid event types"); mask |= SDL_EVENTMASK (val); } } else if (IntFromObj (type, &val)) mask = SDL_EVENTMASK (val); else return RAISE (PyExc_TypeError, "get type must be numeric or a sequence"); } SDL_PumpEvents (); while (SDL_PeepEvents (&event, 1, SDL_GETEVENT, mask) == 1) {} Py_RETURN_NONE; } static PyObject* event_get (PyObject* self, PyObject* args) { SDL_Event event; int mask = 0; int loop, num; PyObject* type, *list, *e; int val; if (PyTuple_Size (args) != 0 && PyTuple_Size (args) != 1) return RAISE (PyExc_ValueError, "get requires 0 or 1 argument"); VIDEO_INIT_CHECK (); if (PyTuple_Size (args) == 0) mask = SDL_ALLEVENTS; else { type = PyTuple_GET_ITEM (args, 0); if (PySequence_Check (type)) { num = PySequence_Size (type); for(loop = 0; loop < num; ++loop) { if (!IntFromObjIndex (type, loop, &val)) return RAISE (PyExc_TypeError, "type sequence must contain valid event types"); mask |= SDL_EVENTMASK (val); } } else if (IntFromObj (type, &val)) mask = SDL_EVENTMASK (val); else return RAISE (PyExc_TypeError, "get type must be numeric or a sequence"); } list = PyList_New (0); if (!list) return NULL; SDL_PumpEvents (); while (SDL_PeepEvents (&event, 1, SDL_GETEVENT, mask) == 1) { e = PyEvent_New (&event); if (!e) { Py_DECREF (list); return NULL; } PyList_Append (list, e); Py_DECREF (e); } return list; } static PyObject* event_peek (PyObject* self, PyObject* args) { SDL_Event event; int result; int mask = 0; int loop, num, noargs=0; PyObject* type; int val; if (PyTuple_Size (args) != 0 && PyTuple_Size (args) != 1) return RAISE (PyExc_ValueError, "peek requires 0 or 1 argument"); VIDEO_INIT_CHECK (); if (PyTuple_Size (args) == 0) { mask = SDL_ALLEVENTS; noargs=1; } else { type = PyTuple_GET_ITEM (args, 0); if(PySequence_Check (type)) { num = PySequence_Size (type); for(loop = 0; loop < num; ++loop) { if (!IntFromObjIndex (type, loop, &val)) return RAISE (PyExc_TypeError, "type sequence must contain valid event types"); mask |= SDL_EVENTMASK (val); } } else if (IntFromObj (type, &val)) mask = SDL_EVENTMASK (val); else return RAISE (PyExc_TypeError, "peek type must be numeric or a sequence"); } SDL_PumpEvents (); result = SDL_PeepEvents (&event, 1, SDL_PEEKEVENT, mask); if (noargs) return PyEvent_New (&event); return PyInt_FromLong (result == 1); } static PyObject* event_post (PyObject* self, PyObject* args) { PyEventObject* e; SDL_Event event; int isblocked = 0; if (!PyArg_ParseTuple (args, "O!", &PyEvent_Type, &e)) return NULL; VIDEO_INIT_CHECK (); /* see if the event is blocked before posting it. */ isblocked = SDL_EventState (e->type, SDL_QUERY) == SDL_IGNORE; if (isblocked) { /* event is blocked, so we don't post it. */ Py_RETURN_NONE; } if (PyEvent_FillUserEvent (e, &event)) return NULL; if (SDL_PushEvent (&event) == -1) return RAISE (PyExc_SDLError, "Event queue full"); Py_RETURN_NONE; } static int CheckEventInRange(int evt) { return evt >= 0 && evt < SDL_NUMEVENTS; } static PyObject* set_allowed (PyObject* self, PyObject* args) { int loop, num; PyObject* type; int val; if (PyTuple_Size (args) != 1) return RAISE (PyExc_ValueError, "set_allowed requires 1 argument"); VIDEO_INIT_CHECK (); type = PyTuple_GET_ITEM (args, 0); if (PySequence_Check (type)) { num = PySequence_Length (type); for(loop = 0; loop < num; ++loop) { if (!IntFromObjIndex (type, loop, &val)) return RAISE (PyExc_TypeError, "type sequence must contain valid event types"); if(!CheckEventInRange(val)) return RAISE (PyExc_ValueError, "Invalid event in sequence"); SDL_EventState ((Uint8)val, SDL_ENABLE); } } else if (type == Py_None) SDL_EventState ((Uint8)0xFF, SDL_IGNORE); else if (IntFromObj (type, &val)) { if(!CheckEventInRange (val)) return RAISE (PyExc_ValueError, "Invalid event"); SDL_EventState ((Uint8)val, SDL_ENABLE); } else return RAISE (PyExc_TypeError, "type must be numeric or a sequence"); Py_RETURN_NONE; } static PyObject* set_blocked (PyObject* self, PyObject* args) { int loop, num; PyObject* type; int val; if (PyTuple_Size (args) != 1) return RAISE (PyExc_ValueError, "set_blocked requires 1 argument"); VIDEO_INIT_CHECK (); type = PyTuple_GET_ITEM (args, 0); if (PySequence_Check (type)) { num = PySequence_Length (type); for(loop = 0; loop < num; ++loop) { if (!IntFromObjIndex (type, loop, &val)) return RAISE (PyExc_TypeError, "type sequence must contain valid event types"); if(!CheckEventInRange(val)) return RAISE (PyExc_ValueError, "Invalid event in sequence"); SDL_EventState ((Uint8)val, SDL_IGNORE); } } else if (type == Py_None) SDL_EventState ((Uint8)0xFF, SDL_IGNORE); else if (IntFromObj (type, &val)) { if(!CheckEventInRange (val)) return RAISE (PyExc_ValueError, "Invalid event"); SDL_EventState ((Uint8)val, SDL_IGNORE); } else return RAISE (PyExc_TypeError, "type must be numeric or a sequence"); Py_RETURN_NONE; } static PyObject* get_blocked (PyObject* self, PyObject* args) { int loop, num; PyObject* type; int val; int isblocked = 0; if (PyTuple_Size (args) != 1) return RAISE (PyExc_ValueError, "get_blocked requires 1 argument"); VIDEO_INIT_CHECK (); type = PyTuple_GET_ITEM (args, 0); if (PySequence_Check (type)) { num = PySequence_Length (type); for (loop = 0; loop < num; ++loop) { if (!IntFromObjIndex (type, loop, &val)) return RAISE (PyExc_TypeError, "type sequence must contain valid event types"); if(!CheckEventInRange(val)) return RAISE (PyExc_ValueError, "Invalid event in sequence"); isblocked |= SDL_EventState ((Uint8)val, SDL_QUERY) == SDL_IGNORE; } } else if (IntFromObj (type, &val)) { if(!CheckEventInRange (val)) return RAISE (PyExc_ValueError, "Invalid event"); isblocked = SDL_EventState ((Uint8)val, SDL_QUERY) == SDL_IGNORE; } else return RAISE (PyExc_TypeError, "type must be numeric or a sequence"); return PyInt_FromLong (isblocked); } static PyMethodDef _event_methods[] = { { "Event", (PyCFunction)Event, 3, DOC_PYGAMEEVENTEVENT }, { "event_name", event_name, METH_VARARGS, DOC_PYGAMEEVENTEVENTNAME }, { "set_grab", set_grab, METH_VARARGS, DOC_PYGAMEEVENTSETGRAB }, { "get_grab", (PyCFunction) get_grab, METH_NOARGS, DOC_PYGAMEEVENTGETGRAB }, { "pump", (PyCFunction) pygame_pump, METH_NOARGS, DOC_PYGAMEEVENTPUMP }, { "wait", (PyCFunction) pygame_wait, METH_NOARGS, DOC_PYGAMEEVENTWAIT }, { "poll", (PyCFunction) pygame_poll, METH_NOARGS, DOC_PYGAMEEVENTPOLL }, { "clear", event_clear, METH_VARARGS, DOC_PYGAMEEVENTCLEAR }, { "get", event_get, METH_VARARGS, DOC_PYGAMEEVENTGET }, { "peek", event_peek, METH_VARARGS, DOC_PYGAMEEVENTPEEK }, { "post", event_post, METH_VARARGS, DOC_PYGAMEEVENTPOST }, { "set_allowed", set_allowed, METH_VARARGS, DOC_PYGAMEEVENTSETALLOWED }, { "set_blocked", set_blocked, METH_VARARGS, DOC_PYGAMEEVENTSETBLOCKED }, { "get_blocked", get_blocked, METH_VARARGS, DOC_PYGAMEEVENTGETBLOCKED }, { NULL, NULL, 0, NULL } }; MODINIT_DEFINE (event) { PyObject *module, *dict, *apiobj; int ecode; static void* c_api[PYGAMEAPI_EVENT_NUMSLOTS]; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "event", DOC_PYGAMEEVENT, -1, _event_methods, NULL, NULL, NULL, NULL }; #endif /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } /* type preparation */ if (PyType_Ready (&PyEvent_Type) < 0) { MODINIT_ERROR; } /* create the module */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "event", _event_methods, DOC_PYGAMEEVENT); #endif dict = PyModule_GetDict (module); if (PyDict_SetItemString (dict, "EventType", (PyObject *)&PyEvent_Type) == -1) { DECREF_MOD (module); MODINIT_ERROR; } /* export the c api */ c_api[0] = &PyEvent_Type; c_api[1] = PyEvent_New; c_api[2] = PyEvent_New2; c_api[3] = PyEvent_FillUserEvent; apiobj = PyCObject_FromVoidPtr (c_api, NULL); if (apiobj == NULL) { DECREF_MOD (module); MODINIT_ERROR; } ecode = PyDict_SetItemString (dict, PYGAMEAPI_LOCAL_ENTRY, apiobj); Py_DECREF (apiobj); if (ecode) { DECREF_MOD (module); MODINIT_ERROR; } /* Assume if there are events in the user events list * there is also a registered cleanup callback for them. */ if (user_event_objects == NULL) { PyGame_RegisterQuit (user_event_cleanup); } MODINIT_RETURN (module); } pygame-1.9.1release/src/draw.doc0000644000175000017500000001120110441274616016456 0ustar vincentvincentpygame.draw pygame module for drawing shapes Draw several simple shapes to a Surface. These functions will work for rendering to any format of Surface. Rendering to hardware Surfaces will be slower than regular software Surfaces. Most of the functions take a width argument to represent the size of stroke around the edge of the shape. If a width of 0 is passed the function will actually solid fill the entire shape. All the drawing functions respect the clip area for the Surface, and will be constrained to that area. The functions return a rectangle representing the bounding area of changed pixels. Most of the arguments accept a color argument that is an RGB triplet. These can also accept an RGBA quadruplet. The alpha value will be written directly into the Surface if it contains pixel alphas, but the draw function will not draw transparently. The color argument can also be an integer pixel value that is already mapped to the Surface's pixel format. These functions must temporarily lock the Surface they are operating on. Many sequential drawing calls can be sped up by locking and unlocking the Surface object around the draw calls.
    rect draw a rectangle shape pygame.draw.rect(Surface, color, Rect, width=0): return Rect Draws a rectangular shape on the Surface. The given Rect is the area of the rectangle. The width argument is the thickness to draw the outer edge. If width is zero then the rectangle will be filled. Keep in mind the Surface.fill() method works just as well for drawing filled rectangles. In fact the Surface.fill() can be hardware accelerated on some platforms with both software and hardware display modes. polygon draw a shape with any number of sides pygame.draw.polygon(Surface, color, pointlist, width=0): return Rect Draws a polygonal shape on the Surface. The pointlist argument is the vertices of the polygon. The width argument is the thickness to draw the outer edge. If width is zero then the polygon will be filled. For aapolygon, use aalines with the 'closed' parameter. circle draw a circle around a point pygame.draw.circle(Surface, color, pos, radius, width=0): return Rect Draws a circular shape on the Surface. The pos argument is the center of the circle, and radius is the size. The width argument is the thickness to draw the outer edge. If width is zero then the circle will be filled. ellipse draw a round shape inside a rectangle pygame.draw.ellipse(Surface, color, Rect, width=0): return Rect Draws an elliptical shape on the Surface. The given rectangle is the area that the circle will fill. The width argument is the thickness to draw the outer edge. If width is zero then the ellipse will be filled. arc draw a partial section of an ellipse pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width=1): return Rect Draws an elliptical arc on the Surface. The rect argument is the area that the ellipse will fill. The two angle arguments are the initial and final angle in radians, with the zero on the right. The width argument is the thickness to draw the outer edge. line draw a straight line segment pygame.draw.line(Surface, color, start_pos, end_pos, width=1): return Rect Draw a straight line segment on a Surface. There are no endcaps, the ends are squared off for thick lines. lines draw multiple contiguous line segments pygame.draw.lines(Surface, color, closed, pointlist, width=1): return Rect Draw a sequence of lines on a Surface. The pointlist argument is a series of points that are connected by a line. If the closed argument is true an additional line segment is drawn between the first and last points. This does not draw any endcaps or miter joints. Lines with sharp corners and wide line widths can have improper looking corners. aaline draw fine antialiased lines pygame.draw.aaline(Surface, color, startpos, endpos, blend=1): return Rect Draws an anti-aliased line on a surface. This will respect the clipping rectangle. A bounding box of the affected area is returned returned as a rectangle. If blend is true, the shades will be be blended with existing pixel shades instead of overwriting them. This function accepts floating point values for the end points. aalines pygame.draw.aalines(Surface, color, closed, pointlist, blend=1): return Rect Draws a sequence on a surface. You must pass at least two points in the sequence of points. The closed argument is a simple boolean and if true, a line will be draw between the first and last points. The boolean blend argument set to true will blend the shades with existing shades instead of overwriting them. This function accepts floating point values for the end points. pygame-1.9.1release/src/draw.c0000644000175000017500000012257511207055754016155 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* * drawing module for pygame */ #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" #include /* Many C libraries seem to lack the trunc call (added in C99) */ #define trunc(d) (((d) >= 0.0) ? (floor(d)) : (ceil(d))) #define FRAC(z) ((z) - trunc(z)) #define INVFRAC(z) (1 - FRAC(z)) static int clip_and_draw_line(SDL_Surface* surf, SDL_Rect* rect, Uint32 color, int* pts); static int clip_and_draw_aaline(SDL_Surface* surf, SDL_Rect* rect, Uint32 color, float* pts, int blend); static int clip_and_draw_line_width(SDL_Surface* surf, SDL_Rect* rect, Uint32 color, int width, int* pts); static int clipline(int* pts, int left, int top, int right, int bottom); static int clipaaline(float* pts, int left, int top, int right, int bottom); static void drawline(SDL_Surface* surf, Uint32 color, int startx, int starty, int endx, int endy); static void drawaaline(SDL_Surface* surf, Uint32 color, float startx, float starty, float endx, float endy, int blend); static void drawhorzline(SDL_Surface* surf, Uint32 color, int startx, int starty, int endx); static void drawvertline(SDL_Surface* surf, Uint32 color, int x1, int y1, int y2); static void draw_arc(SDL_Surface *dst, int x, int y, int radius1, int radius2, double angle_start, double angle_stop, Uint32 color); static void draw_ellipse(SDL_Surface *dst, int x, int y, int rx, int ry, Uint32 color); static void draw_fillellipse(SDL_Surface *dst, int x, int y, int rx, int ry, Uint32 color); static void draw_fillpoly(SDL_Surface *dst, int *vx, int *vy, int n, Uint32 color); static PyObject* aaline(PyObject* self, PyObject* arg) { PyObject *surfobj, *colorobj, *start, *end; SDL_Surface* surf; float startx, starty, endx, endy; int top, left, bottom, right; int blend=1; float pts[4]; Uint8 rgba[4]; Uint32 color; int anydraw; /*get all the arguments*/ if(!PyArg_ParseTuple(arg, "O!OOO|i", &PySurface_Type, &surfobj, &colorobj, &start, &end, &blend)) return NULL; surf = PySurface_AsSurface(surfobj); if(surf->format->BytesPerPixel !=3 && surf->format->BytesPerPixel != 4) return RAISE(PyExc_ValueError, "unsupported bit depth for aaline draw (supports 32 & 24 bit)"); if(RGBAFromColorObj(colorobj, rgba)) color = SDL_MapRGBA(surf->format, rgba[0], rgba[1], rgba[2], rgba[3]); else return RAISE(PyExc_TypeError, "invalid color argument"); if(!TwoFloatsFromObj(start, &startx, &starty)) return RAISE(PyExc_TypeError, "Invalid start position argument"); if(!TwoFloatsFromObj(end, &endx, &endy)) return RAISE(PyExc_TypeError, "Invalid end position argument"); if(!PySurface_Lock(surfobj)) return NULL; pts[0] = startx; pts[1] = starty; pts[2] = endx; pts[3] = endy; anydraw = clip_and_draw_aaline(surf, &surf->clip_rect, color, pts, blend); if(!PySurface_Unlock(surfobj)) return NULL; /*compute return rect*/ if(!anydraw) return PyRect_New4(startx, starty, 0, 0); if(pts[0] < pts[2]) { left = (int)(pts[0]); right = (int)(pts[2]); } else { left = (int)(pts[2]); right = (int)(pts[0]); } if(pts[1] < pts[3]) { top = (int)(pts[1]); bottom = (int)(pts[3]); } else { top = (int)(pts[3]); bottom = (int)(pts[1]); } return PyRect_New4(left, top, right-left+2, bottom-top+2); } static PyObject* line(PyObject* self, PyObject* arg) { PyObject *surfobj, *colorobj, *start, *end; SDL_Surface* surf; int startx, starty, endx, endy; int top, left, bottom, right; int width = 1; int pts[4]; Uint8 rgba[4]; Uint32 color; int anydraw; /*get all the arguments*/ if(!PyArg_ParseTuple(arg, "O!OOO|i", &PySurface_Type, &surfobj, &colorobj, &start, &end, &width)) return NULL; surf = PySurface_AsSurface(surfobj); if(surf->format->BytesPerPixel <= 0 || surf->format->BytesPerPixel > 4) return RAISE(PyExc_ValueError, "unsupport bit depth for line draw"); if(PyInt_Check(colorobj)) color = (Uint32)PyInt_AsLong(colorobj); else if(RGBAFromColorObj(colorobj, rgba)) color = SDL_MapRGBA(surf->format, rgba[0], rgba[1], rgba[2], rgba[3]); else return RAISE(PyExc_TypeError, "invalid color argument"); if(!TwoIntsFromObj(start, &startx, &starty)) return RAISE(PyExc_TypeError, "Invalid start position argument"); if(!TwoIntsFromObj(end, &endx, &endy)) return RAISE(PyExc_TypeError, "Invalid end position argument"); if(width < 1) return PyRect_New4(startx, starty, 0, 0); if(!PySurface_Lock(surfobj)) return NULL; pts[0] = startx; pts[1] = starty; pts[2] = endx; pts[3] = endy; anydraw = clip_and_draw_line_width(surf, &surf->clip_rect, color, width, pts); if(!PySurface_Unlock(surfobj)) return NULL; /*compute return rect*/ if(!anydraw) return PyRect_New4(startx, starty, 0, 0); if(pts[0] < pts[2]) { left = pts[0]; right = pts[2]; } else { left = pts[2]; right = pts[0]; } if(pts[1] < pts[3]) { top = pts[1]; bottom = pts[3]; } else { top = pts[3]; bottom = pts[1]; } return PyRect_New4(left, top, right-left+1, bottom-top+1); } static PyObject* aalines(PyObject* self, PyObject* arg) { PyObject *surfobj, *colorobj, *closedobj, *points, *item; SDL_Surface* surf; float x, y; int top, left, bottom, right; float pts[4]; Uint8 rgba[4]; Uint32 color; int closed, blend; int result, loop, length, drawn; float startx, starty; /*get all the arguments*/ if(!PyArg_ParseTuple(arg, "O!OOO|i", &PySurface_Type, &surfobj, &colorobj, &closedobj, &points, &blend)) return NULL; surf = PySurface_AsSurface(surfobj); if(surf->format->BytesPerPixel !=3 && surf->format->BytesPerPixel != 4) return RAISE(PyExc_ValueError, "unsupported bit depth for aaline draw (supports 32 & 24 bit)"); if(RGBAFromColorObj(colorobj, rgba)) color = SDL_MapRGBA(surf->format, rgba[0], rgba[1], rgba[2], rgba[3]); else return RAISE(PyExc_TypeError, "invalid color argument"); closed = PyObject_IsTrue(closedobj); if(!PySequence_Check(points)) return RAISE(PyExc_TypeError, "points argument must be a sequence of number pairs"); length = PySequence_Length(points); if(length < 2) return RAISE(PyExc_ValueError, "points argument must contain more than 1 points"); item = PySequence_GetItem(points, 0); result = TwoFloatsFromObj(item, &x, &y); Py_DECREF(item); if(!result) return RAISE(PyExc_TypeError, "points must be number pairs"); startx = pts[0] = x; starty = pts[1] = y; left = right = (int)x; top = bottom = (int)y; if(!PySurface_Lock(surfobj)) return NULL; drawn = 1; for(loop = 1; loop < length; ++loop) { item = PySequence_GetItem(points, loop); result = TwoFloatsFromObj(item, &x, &y); Py_DECREF(item); if(!result) continue; /*note, we silently skip over bad points :[ */ ++drawn; pts[0] = startx; pts[1] = starty; startx = pts[2] = x; starty = pts[3] = y; if(clip_and_draw_aaline(surf, &surf->clip_rect, color, pts, blend)) { left = MIN((int)MIN(pts[0], pts[2]), left); top = MIN((int)MIN(pts[1], pts[3]), top); right = MAX((int)MAX(pts[0], pts[2]), right); bottom = MAX((int)MAX(pts[1], pts[3]), bottom); } } if(closed && drawn > 2) { item = PySequence_GetItem(points, 0); result = TwoFloatsFromObj(item, &x, &y); Py_DECREF(item); if(result) { pts[0] = startx; pts[1] = starty; pts[2] = x; pts[3] = y; clip_and_draw_aaline(surf, &surf->clip_rect, color, pts, blend); } } if(!PySurface_Unlock(surfobj)) return NULL; /*compute return rect*/ return PyRect_New4(left, top, right-left+2, bottom-top+2); } static PyObject* lines(PyObject* self, PyObject* arg) { PyObject *surfobj, *colorobj, *closedobj, *points, *item; SDL_Surface* surf; int x, y; int top, left, bottom, right; int pts[4], width=1; Uint8 rgba[4]; Uint32 color; int closed; int result, loop, length, drawn; int startx, starty; /*get all the arguments*/ if(!PyArg_ParseTuple(arg, "O!OOO|i", &PySurface_Type, &surfobj, &colorobj, &closedobj, &points, &width)) return NULL; surf = PySurface_AsSurface(surfobj); if(surf->format->BytesPerPixel <= 0 || surf->format->BytesPerPixel > 4) return RAISE(PyExc_ValueError, "unsupport bit depth for line draw"); if(PyInt_Check(colorobj)) color = (Uint32)PyInt_AsLong(colorobj); else if(RGBAFromColorObj(colorobj, rgba)) color = SDL_MapRGBA(surf->format, rgba[0], rgba[1], rgba[2], rgba[3]); else return RAISE(PyExc_TypeError, "invalid color argument"); closed = PyObject_IsTrue(closedobj); if(!PySequence_Check(points)) return RAISE(PyExc_TypeError, "points argument must be a sequence of number pairs"); length = PySequence_Length(points); if(length < 2) return RAISE(PyExc_ValueError, "points argument must contain more than 1 points"); item = PySequence_GetItem(points, 0); result = TwoIntsFromObj(item, &x, &y); Py_DECREF(item); if(!result) return RAISE(PyExc_TypeError, "points must be number pairs"); startx = pts[0] = left = right = x; starty = pts[1] = top = bottom = y; if(width < 1) return PyRect_New4(left, top, 0, 0); if(!PySurface_Lock(surfobj)) return NULL; drawn = 1; for(loop = 1; loop < length; ++loop) { item = PySequence_GetItem(points, loop); result = TwoIntsFromObj(item, &x, &y); Py_DECREF(item); if(!result) continue; /*note, we silently skip over bad points :[ */ ++drawn; pts[0] = startx; pts[1] = starty; startx = pts[2] = x; starty = pts[3] = y; if(clip_and_draw_line_width(surf, &surf->clip_rect, color, width, pts)) { left = MIN(MIN(pts[0], pts[2]), left); top = MIN(MIN(pts[1], pts[3]), top); right = MAX(MAX(pts[0], pts[2]), right); bottom = MAX(MAX(pts[1], pts[3]), bottom); } } if(closed && drawn > 2) { item = PySequence_GetItem(points, 0); result = TwoIntsFromObj(item, &x, &y); Py_DECREF(item); if(result) { pts[0] = startx; pts[1] = starty; pts[2] = x; pts[3] = y; clip_and_draw_line_width(surf, &surf->clip_rect, color, width, pts); } } if(!PySurface_Unlock(surfobj)) return NULL; /*compute return rect*/ return PyRect_New4(left, top, right-left+1, bottom-top+1); } static PyObject* arc(PyObject* self, PyObject* arg) { PyObject *surfobj, *colorobj, *rectobj; GAME_Rect *rect, temp; SDL_Surface* surf; Uint8 rgba[4]; Uint32 color; int width=1, loop, t, l, b, r; double angle_start, angle_stop; /*get all the arguments*/ if(!PyArg_ParseTuple(arg, "O!OOdd|i", &PySurface_Type, &surfobj, &colorobj, &rectobj, &angle_start, &angle_stop, &width)) return NULL; rect = GameRect_FromObject(rectobj, &temp); if(!rect) return RAISE(PyExc_TypeError, "Invalid recstyle argument"); surf = PySurface_AsSurface(surfobj); if(surf->format->BytesPerPixel <= 0 || surf->format->BytesPerPixel > 4) return RAISE(PyExc_ValueError, "unsupport bit depth for drawing"); if(PyInt_Check(colorobj)) color = (Uint32)PyInt_AsLong(colorobj); else if(RGBAFromColorObj(colorobj, rgba)) color = SDL_MapRGBA(surf->format, rgba[0], rgba[1], rgba[2], rgba[3]); else return RAISE(PyExc_TypeError, "invalid color argument"); if ( width < 0 ) return RAISE(PyExc_ValueError, "negative width"); if ( width > rect->w / 2 || width > rect->h / 2 ) return RAISE(PyExc_ValueError, "width greater than ellipse radius"); if ( angle_stop < angle_start ) angle_stop += 360; if(!PySurface_Lock(surfobj)) return NULL; width = MIN(width, MIN(rect->w, rect->h) / 2); for(loop=0; loopx+rect->w/2, rect->y+rect->h/2, rect->w/2-loop, rect->h/2-loop, angle_start, angle_stop, color); } if(!PySurface_Unlock(surfobj)) return NULL; l = MAX(rect->x, surf->clip_rect.x); t = MAX(rect->y, surf->clip_rect.y); r = MIN(rect->x + rect->w, surf->clip_rect.x + surf->clip_rect.w); b = MIN(rect->y + rect->h, surf->clip_rect.y + surf->clip_rect.h); return PyRect_New4(l, t, MAX(r-l, 0), MAX(b-t, 0)); } static PyObject* ellipse(PyObject* self, PyObject* arg) { PyObject *surfobj, *colorobj, *rectobj; GAME_Rect *rect, temp; SDL_Surface* surf; Uint8 rgba[4]; Uint32 color; int width=0, loop, t, l, b, r; /*get all the arguments*/ if(!PyArg_ParseTuple(arg, "O!OO|i", &PySurface_Type, &surfobj, &colorobj, &rectobj, &width)) return NULL; rect = GameRect_FromObject(rectobj, &temp); if(!rect) return RAISE(PyExc_TypeError, "Invalid recstyle argument"); surf = PySurface_AsSurface(surfobj); if(surf->format->BytesPerPixel <= 0 || surf->format->BytesPerPixel > 4) return RAISE(PyExc_ValueError, "unsupport bit depth for drawing"); if(PyInt_Check(colorobj)) color = (Uint32)PyInt_AsLong(colorobj); else if(RGBAFromColorObj(colorobj, rgba)) color = SDL_MapRGBA(surf->format, rgba[0], rgba[1], rgba[2], rgba[3]); else return RAISE(PyExc_TypeError, "invalid color argument"); if ( width < 0 ) return RAISE(PyExc_ValueError, "negative width"); if ( width > rect->w / 2 || width > rect->h / 2 ) return RAISE(PyExc_ValueError, "width greater than ellipse radius"); if(!PySurface_Lock(surfobj)) return NULL; if(!width) draw_fillellipse(surf, (Sint16)(rect->x+rect->w/2), (Sint16)(rect->y+rect->h/2), (Sint16)(rect->w/2), (Sint16)(rect->h/2), color); else { width = MIN(width, MIN(rect->w, rect->h) / 2); for(loop=0; loopx+rect->w/2, rect->y+rect->h/2, rect->w/2-loop, rect->h/2-loop, color); } } if(!PySurface_Unlock(surfobj)) return NULL; l = MAX(rect->x, surf->clip_rect.x); t = MAX(rect->y, surf->clip_rect.y); r = MIN(rect->x + rect->w, surf->clip_rect.x + surf->clip_rect.w); b = MIN(rect->y + rect->h, surf->clip_rect.y + surf->clip_rect.h); return PyRect_New4(l, t, MAX(r-l, 0), MAX(b-t, 0)); } static PyObject* circle(PyObject* self, PyObject* arg) { PyObject *surfobj, *colorobj; SDL_Surface* surf; Uint8 rgba[4]; Uint32 color; int posx, posy, radius, t, l, b, r; int width=0, loop; /*get all the arguments*/ if(!PyArg_ParseTuple(arg, "O!O(ii)i|i", &PySurface_Type, &surfobj, &colorobj, &posx, &posy, &radius, &width)) return NULL; surf = PySurface_AsSurface(surfobj); if(surf->format->BytesPerPixel <= 0 || surf->format->BytesPerPixel > 4) return RAISE(PyExc_ValueError, "unsupport bit depth for drawing"); if(PyInt_Check(colorobj)) color = (Uint32)PyInt_AsLong(colorobj); else if(RGBAFromColorObj(colorobj, rgba)) color = SDL_MapRGBA(surf->format, rgba[0], rgba[1], rgba[2], rgba[3]); else return RAISE(PyExc_TypeError, "invalid color argument"); if ( radius < 0 ) return RAISE(PyExc_ValueError, "negative radius"); if ( width < 0 ) return RAISE(PyExc_ValueError, "negative width"); if ( width > radius ) return RAISE(PyExc_ValueError, "width greater than radius"); if(!PySurface_Lock(surfobj)) return NULL; if(!width) draw_fillellipse(surf, (Sint16)posx, (Sint16)posy, (Sint16)radius, (Sint16)radius, color); else for(loop=0; loopclip_rect.x); t = MAX(posy - radius, surf->clip_rect.y); r = MIN(posx + radius, surf->clip_rect.x + surf->clip_rect.w); b = MIN(posy + radius, surf->clip_rect.y + surf->clip_rect.h); return PyRect_New4(l, t, MAX(r-l, 0), MAX(b-t, 0)); } static PyObject* polygon(PyObject* self, PyObject* arg) { PyObject *surfobj, *colorobj, *points, *item; SDL_Surface* surf; Uint8 rgba[4]; Uint32 color; int width=0, length, loop, numpoints; int *xlist, *ylist; int x, y, top, left, bottom, right, result; /*get all the arguments*/ if(!PyArg_ParseTuple(arg, "O!OO|i", &PySurface_Type, &surfobj, &colorobj, &points, &width)) return NULL; if(width) { PyObject *args, *ret; args = Py_BuildValue("(OOiOi)", surfobj, colorobj, 1, points, width); if(!args) return NULL; ret = lines(NULL, args); Py_DECREF(args); return ret; } surf = PySurface_AsSurface(surfobj); if(surf->format->BytesPerPixel <= 0 || surf->format->BytesPerPixel > 4) return RAISE(PyExc_ValueError, "unsupport bit depth for line draw"); if(PyInt_Check(colorobj)) color = (Uint32)PyInt_AsLong(colorobj); else if(RGBAFromColorObj(colorobj, rgba)) color = SDL_MapRGBA(surf->format, rgba[0], rgba[1], rgba[2], rgba[3]); else return RAISE(PyExc_TypeError, "invalid color argument"); if(!PySequence_Check(points)) return RAISE(PyExc_TypeError, "points argument must be a sequence of number pairs"); length = PySequence_Length(points); if(length < 3) return RAISE(PyExc_ValueError, "points argument must contain more than 2 points"); item = PySequence_GetItem(points, 0); result = TwoIntsFromObj(item, &x, &y); Py_DECREF(item); if(!result) return RAISE(PyExc_TypeError, "points must be number pairs"); left = right = x; top = bottom = y; xlist = PyMem_New(int, length); ylist = PyMem_New(int, length); numpoints = 0; for(loop = 0; loop < length; ++loop) { item = PySequence_GetItem(points, loop); result = TwoIntsFromObj(item, &x, &y); Py_DECREF(item); if(!result) continue; /*note, we silently skip over bad points :[ */ xlist[numpoints] = x; ylist[numpoints] = y; ++numpoints; left = MIN(x, left); top = MIN(y, top); right = MAX(x, right); bottom = MAX(y, bottom); } if(!PySurface_Lock(surfobj)) { PyMem_Del(xlist); PyMem_Del(ylist); return NULL; } draw_fillpoly(surf, xlist, ylist, numpoints, color); PyMem_Del(xlist); PyMem_Del(ylist); if(!PySurface_Unlock(surfobj)) return NULL; left = MAX(left, surf->clip_rect.x); top = MAX(top, surf->clip_rect.y); right = MIN(right, surf->clip_rect.x + surf->clip_rect.w); bottom = MIN(bottom, surf->clip_rect.y + surf->clip_rect.h); return PyRect_New4(left, top, right-left+1, bottom-top+1); } static PyObject* rect(PyObject* self, PyObject* arg) { PyObject *surfobj, *colorobj, *rectobj, *points, *args, *ret=NULL; GAME_Rect* rect, temp; int t, l, b, r, width=0; /*get all the arguments*/ if(!PyArg_ParseTuple(arg, "O!OO|i", &PySurface_Type, &surfobj, &colorobj, &rectobj, &width)) return NULL; if(!(rect = GameRect_FromObject(rectobj, &temp))) return RAISE(PyExc_TypeError, "Rect argument is invalid"); l = rect->x; r = rect->x + rect->w - 1; t = rect->y; b = rect->y + rect->h - 1; /*build the pointlist*/ points = Py_BuildValue("((ii)(ii)(ii)(ii))", l, t, r, t, r, b, l, b); args = Py_BuildValue("(OONi)", surfobj, colorobj, points, width); if(args) ret = polygon(NULL, args); Py_XDECREF(args); return ret; } /*internal drawing tools*/ static int clip_and_draw_aaline(SDL_Surface* surf, SDL_Rect* rect, Uint32 color, float* pts, int blend) { if(!clipaaline(pts, rect->x+1, rect->y+1, rect->x+rect->w-2, rect->y+rect->h-2)) return 0; drawaaline(surf, color, pts[0], pts[1], pts[2], pts[3], blend); return 1; } static int clip_and_draw_line(SDL_Surface* surf, SDL_Rect* rect, Uint32 color, int* pts) { if(!clipline(pts, rect->x, rect->y, rect->x+rect->w-1, rect->y+rect->h-1)) return 0; if(pts[1] == pts[3]) drawhorzline(surf, color, pts[0], pts[1], pts[2]); else if(pts[0] == pts[2]) drawvertline(surf, color, pts[0], pts[1], pts[3]); else drawline(surf, color, pts[0], pts[1], pts[2], pts[3]); return 1; } static int clip_and_draw_line_width(SDL_Surface* surf, SDL_Rect* rect, Uint32 color, int width, int* pts) { int loop; int xinc=0, yinc=0; int newpts[4]; int range[4]; int anydrawn = 0; if(abs(pts[0]-pts[2]) > abs(pts[1]-pts[3])) yinc = 1; else xinc = 1; memcpy(newpts, pts, sizeof(int)*4); if(clip_and_draw_line(surf, rect, color, newpts)) { anydrawn = 1; memcpy(range, newpts, sizeof(int)*4); } else { range[0] = range[1] = 10000; range[2] = range[3] = -10000; } for(loop = 1; loop < width; loop += 2) { newpts[0] = pts[0] + xinc*(loop/2+1); newpts[1] = pts[1] + yinc*(loop/2+1); newpts[2] = pts[2] + xinc*(loop/2+1); newpts[3] = pts[3] + yinc*(loop/2+1); if(clip_and_draw_line(surf, rect, color, newpts)) { anydrawn = 1; range[0] = MIN(newpts[0], range[0]); range[1] = MIN(newpts[1], range[1]); range[2] = MAX(newpts[2], range[2]); range[3] = MAX(newpts[3], range[3]); } if(loop+1 right) code |= RIGHT_EDGE; if(y < top) code |= TOP_EDGE; if(y > bottom)code |= BOTTOM_EDGE; return code; } static int encodeFloat(float x, float y, int left, int top, int right, int bottom) { int code = 0; if(x < left) code |= LEFT_EDGE; if(x > right) code |= RIGHT_EDGE; if(y < top) code |= TOP_EDGE; if(y > bottom)code |= BOTTOM_EDGE; return code; } static int clipaaline(float* pts, int left, int top, int right, int bottom) { float x1 = pts[0]; float y1 = pts[1]; float x2 = pts[2]; float y2 = pts[3]; int code1, code2; int draw = 0; float swaptmp; int intswaptmp; float m; /*slope*/ while(1) { code1 = encodeFloat(x1, y1, left, top, right, bottom); code2 = encodeFloat(x2, y2, left, top, right, bottom); if(ACCEPT(code1, code2)) { draw = 1; break; } else if(REJECT(code1, code2)) { break; } else { if(INSIDE(code1)) { swaptmp = x2; x2 = x1; x1 = swaptmp; swaptmp = y2; y2 = y1; y1 = swaptmp; intswaptmp = code2; code2 = code1; code1 = intswaptmp; } if(x2 != x1) m = (y2 - y1) / (x2 - x1); else m = 1.0f; if(code1 & LEFT_EDGE) { y1 += ((float)left - x1) * m; x1 = (float)left; } else if(code1 & RIGHT_EDGE) { y1 += ((float)right - x1) * m; x1 = (float)right; } else if(code1 & BOTTOM_EDGE) { if(x2 != x1) x1 += ((float)bottom - y1) / m; y1 = (float)bottom; } else if(code1 & TOP_EDGE) { if(x2 != x1) x1 += ((float)top - y1) / m; y1 = (float)top; } } } if(draw) { pts[0] = x1; pts[1] = y1; pts[2] = x2; pts[3] = y2; } return draw; } static int clipline(int* pts, int left, int top, int right, int bottom) { int x1 = pts[0]; int y1 = pts[1]; int x2 = pts[2]; int y2 = pts[3]; int code1, code2; int draw = 0; int swaptmp; float m; /*slope*/ while(1) { code1 = encode(x1, y1, left, top, right, bottom); code2 = encode(x2, y2, left, top, right, bottom); if(ACCEPT(code1, code2)) { draw = 1; break; } else if(REJECT(code1, code2)) break; else { if(INSIDE(code1)) { swaptmp = x2; x2 = x1; x1 = swaptmp; swaptmp = y2; y2 = y1; y1 = swaptmp; swaptmp = code2; code2 = code1; code1 = swaptmp; } if(x2 != x1) m = (y2 - y1) / (float)(x2 - x1); else m = 1.0f; if(code1 & LEFT_EDGE) { y1 += (int)((left - x1) * m); x1 = left; } else if(code1 & RIGHT_EDGE) { y1 += (int)((right - x1) * m); x1 = right; } else if(code1 & BOTTOM_EDGE) { if(x2 != x1) x1 += (int)((bottom - y1) / m); y1 = bottom; } else if(code1 & TOP_EDGE) { if(x2 != x1) x1 += (int)((top - y1) / m); y1 = top; } } } if(draw) { pts[0] = x1; pts[1] = y1; pts[2] = x2; pts[3] = y2; } return draw; } static int set_at(SDL_Surface* surf, int x, int y, Uint32 color) { SDL_PixelFormat* format = surf->format; Uint8* pixels = (Uint8*)surf->pixels; Uint8* byte_buf, rgb[4]; if(x < surf->clip_rect.x || x >= surf->clip_rect.x + surf->clip_rect.w || y < surf->clip_rect.y || y >= surf->clip_rect.y + surf->clip_rect.h) return 0; switch(format->BytesPerPixel) { case 1: *((Uint8*)pixels + y * surf->pitch + x) = (Uint8)color; break; case 2: *((Uint16*)(pixels + y * surf->pitch) + x) = (Uint16)color; break; case 4: *((Uint32*)(pixels + y * surf->pitch) + x) = color; /* *((Uint32*)(pixels + y * surf->pitch) + x) = ~(*((Uint32*)(pixels + y * surf->pitch) + x)) * 31; */ break; default:/*case 3:*/ SDL_GetRGB(color, format, rgb, rgb+1, rgb+2); byte_buf = (Uint8*)(pixels + y * surf->pitch) + x * 3; #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *(byte_buf + (format->Rshift >> 3)) = rgb[0]; *(byte_buf + (format->Gshift >> 3)) = rgb[1]; *(byte_buf + (format->Bshift >> 3)) = rgb[2]; #else *(byte_buf + 2 - (format->Rshift >> 3)) = rgb[0]; *(byte_buf + 2 - (format->Gshift >> 3)) = rgb[1]; *(byte_buf + 2 - (format->Bshift >> 3)) = rgb[2]; #endif break; } return 1; } #define DRAWPIX32(pixel,colorptr,br,blend) \ if(SDL_BYTEORDER == SDL_BIG_ENDIAN) color <<= 8; \ if(blend) { \ int x; \ float nbr = 1.0-br; \ x = colorptr[0]*br+pixel[0]*nbr; \ pixel[0]= (x>254) ? 255: x; \ x = colorptr[1]*br+pixel[1]*nbr; \ pixel[1]= (x>254) ? 255: x; \ x = colorptr[2]*br+pixel[2]*nbr; \ pixel[2]= (x>254) ? 255: x; \ if(hasalpha) pixel[3] = pixel[0]+(br*255) - (pixel[3]*br); \ } else { \ pixel[0]=(Uint8)(colorptr[0]*br); \ pixel[1]=(Uint8)(colorptr[1]*br); \ pixel[2]=(Uint8)(colorptr[2]*br); \ if(hasalpha) pixel[3] = br*255; \ } /* Adapted from http://freespace.virgin.net/hugo.elias/graphics/x_wuline.htm */ static void drawaaline(SDL_Surface* surf, Uint32 color, float x1, float y1, float x2, float y2, int blend) { float grad, xd, yd; float xgap, ygap, xend, yend, xf, yf; float brightness1, brightness2; float swaptmp; int x, y, ix1, ix2, iy1, iy2; int pixx, pixy; Uint8* pixel; Uint8* pm = (Uint8*)surf->pixels; Uint8* colorptr = (Uint8*)&color; const int hasalpha = surf->format->Amask; pixx = surf->format->BytesPerPixel; pixy = surf->pitch; xd = x2-x1; yd = y2-y1; if (xd == 0 && yd == 0) { /* Single point. Due to the nature of the aaline clipping, this * is less exact than the normal line. */ set_at (surf, x1, y1, color); return; } if(fabs(xd)>fabs(yd)) { if(x1>x2) { swaptmp=x1; x1=x2; x2=swaptmp; swaptmp=y1; y1=y2; y2=swaptmp; xd = (x2-x1); yd = (y2-y1); } grad = yd/xd; xend = trunc(x1)+0.5; /* This makes more sense than trunc(x1+0.5) */ yend = y1+grad*(xend-x1); xgap = INVFRAC(x1); ix1 = (int)xend; iy1 = (int)yend; yf = yend+grad; brightness1 = INVFRAC(yend) * xgap; brightness2 = FRAC(yend) * xgap; pixel = pm + pixx * ix1 + pixy * iy1; DRAWPIX32(pixel, colorptr, brightness1, blend) pixel += pixy; DRAWPIX32(pixel, colorptr, brightness2, blend) xend = trunc(x2)+0.5; yend = y2+grad*(xend-x2); xgap = FRAC(x2); /* this also differs from Hugo's description. */ ix2 = (int)xend; iy2 = (int)yend; brightness1 = INVFRAC(yend) * xgap; brightness2 = FRAC(yend) * xgap; pixel = pm + pixx * ix2 + pixy * iy2; DRAWPIX32(pixel, colorptr, brightness1, blend) pixel += pixy; DRAWPIX32(pixel, colorptr, brightness2, blend) for(x=ix1+1; xy2) { swaptmp=y1; y1=y2; y2=swaptmp; swaptmp=x1; x1=x2; x2=swaptmp; yd = (y2-y1); xd = (x2-x1); } grad = xd/yd; yend = trunc(y1)+0.5; /* This makes more sense than trunc(x1+0.5) */ xend = x1+grad*(yend-y1); ygap = INVFRAC(y1); iy1 = (int)yend; ix1 = (int)xend; xf = xend+grad; brightness1 = INVFRAC(xend) * ygap; brightness2 = FRAC(xend) * ygap; pixel = pm + pixx * ix1 + pixy * iy1; DRAWPIX32(pixel, colorptr, brightness1, blend) pixel += pixx; DRAWPIX32(pixel, colorptr, brightness2, blend) yend = trunc(y2)+0.5; xend = x2+grad*(yend-y2); ygap = FRAC(y2); iy2 = (int)yend; ix2 = (int)xend; brightness1 = INVFRAC(xend) * ygap; brightness2 = FRAC(xend) * ygap; pixel = pm + pixx * ix2 + pixy * iy2; DRAWPIX32(pixel, colorptr, brightness1, blend) pixel += pixx; DRAWPIX32(pixel, colorptr, brightness2, blend) for(y=iy1+1; yformat->BytesPerPixel; pixy = surf->pitch; pixel = ((Uint8*)surf->pixels) + pixx * x1 + pixy * y1; pixx *= signx; pixy *= signy; if(deltax < deltay) /*swap axis if rise > run*/ { swaptmp = deltax; deltax = deltay; deltay = swaptmp; swaptmp = pixx; pixx = pixy; pixy = swaptmp; } switch(surf->format->BytesPerPixel) { case 1: for(; x < deltax; x++, pixel += pixx) { *pixel = (Uint8)color; y += deltay; if(y >= deltax) {y -= deltax; pixel += pixy;} }break; case 2: for(; x < deltax; x++, pixel += pixx) { *(Uint16*)pixel = (Uint16)color; y += deltay; if(y >= deltax) {y -= deltax; pixel += pixy;} }break; case 3: if(SDL_BYTEORDER == SDL_BIG_ENDIAN) color <<= 8; colorptr = (Uint8*)&color; for(; x < deltax; x++, pixel += pixx) { pixel[0] = colorptr[0]; pixel[1] = colorptr[1]; pixel[2] = colorptr[2]; y += deltay; if(y >= deltax) {y -= deltax; pixel += pixy;} }break; default: /*case 4*/ for(; x < deltax; x++, pixel += pixx) { *(Uint32*)pixel = (Uint32)color; y += deltay; if(y >= deltax) {y -= deltax; pixel += pixy;} }break; } } static void drawhorzline(SDL_Surface* surf, Uint32 color, int x1, int y1, int x2) { Uint8 *pixel, *end; Uint8 *colorptr; if(x1 == x2) { set_at(surf, x1, y1, color); return; } pixel = ((Uint8*)surf->pixels) + surf->pitch * y1; if(x1 < x2) { end = pixel + x2 * surf->format->BytesPerPixel; pixel += x1 * surf->format->BytesPerPixel; } else { end = pixel + x1 * surf->format->BytesPerPixel; pixel += x2 * surf->format->BytesPerPixel; } switch(surf->format->BytesPerPixel) { case 1: for(; pixel <= end; ++pixel) { *pixel = (Uint8)color; }break; case 2: for(; pixel <= end; pixel+=2) { *(Uint16*)pixel = (Uint16)color; }break; case 3: if(SDL_BYTEORDER == SDL_BIG_ENDIAN) color <<= 8; colorptr = (Uint8*)&color; for(; pixel <= end; pixel+=3) { pixel[0] = colorptr[0]; pixel[1] = colorptr[1]; pixel[2] = colorptr[2]; }break; default: /*case 4*/ for(; pixel <= end; pixel+=4) { *(Uint32*)pixel = color; }break; } } static void drawhorzlineclip(SDL_Surface* surf, Uint32 color, int x1, int y1, int x2) { if(y1 < surf->clip_rect.y || y1 >= surf->clip_rect.y + surf->clip_rect.h) return; if( x2 < x1 ) { int temp = x1; x1 = x2; x2 = temp; } x1 = MAX(x1, surf->clip_rect.x); x2 = MIN(x2, surf->clip_rect.x + surf->clip_rect.w-1); if(x2 < surf->clip_rect.x || x1 >= surf->clip_rect.x + surf->clip_rect.w) return; if(x1 == x2) set_at(surf, x1, y1, color); else drawhorzline(surf, color, x1, y1, x2); } static void drawvertline(SDL_Surface* surf, Uint32 color, int x1, int y1, int y2) { Uint8 *pixel, *end; Uint8 *colorptr; Uint32 pitch = surf->pitch; if(y1 == y2) { set_at(surf, x1, y1, color); return; } pixel = ((Uint8*)surf->pixels) + x1 * surf->format->BytesPerPixel; if(y1 < y2) { end = pixel + surf->pitch * y2; pixel += surf->pitch * y1; } else { end = pixel + surf->pitch * y1; pixel += surf->pitch * y2; } switch(surf->format->BytesPerPixel) { case 1: for(; pixel <= end; pixel+=pitch) { *pixel = (Uint8)color; }break; case 2: for(; pixel <= end; pixel+=pitch) { *(Uint16*)pixel = (Uint16)color; }break; case 3: if(SDL_BYTEORDER == SDL_BIG_ENDIAN) color <<= 8; colorptr = (Uint8*)&color; for(; pixel <= end; pixel+=pitch) { pixel[0] = colorptr[0]; pixel[1] = colorptr[1]; pixel[2] = colorptr[2]; }break; default: /*case 4*/ for(; pixel <= end; pixel+=pitch) { *(Uint32*)pixel = color; }break; } } static void drawvertlineclip(SDL_Surface* surf, Uint32 color, int x1, int y1, int y2) { if(x1 < surf->clip_rect.x || x1 >= surf->clip_rect.x + surf->clip_rect.w) return; if ( y2 < y1 ) { int temp = y1; y1 = y2; y2 = temp; } y1 = MAX(y1, surf->clip_rect.y); y2 = MIN(y2, surf->clip_rect.y + surf->clip_rect.h-1); if(y2 - y1 < 1) set_at( surf, x1, y1, color); else drawvertline(surf, color, x1, y1, y2); } static void draw_arc(SDL_Surface *dst, int x, int y, int radius1, int radius2, double angle_start, double angle_stop, Uint32 color) { double aStep; // Angle Step (rad) double a; // Current Angle (rad) int x_last, x_next, y_last, y_next; // Angle step in rad if (radius1clip_rect, color, points); x_last = x_next; y_last = y_next; } } static void draw_ellipse(SDL_Surface *dst, int x, int y, int rx, int ry, Uint32 color) { int ix, iy; int h, i, j, k; int oh, oi, oj, ok; int xmh, xph, ypk, ymk; int xmi, xpi, ymj, ypj; int xmj, xpj, ymi, ypi; int xmk, xpk, ymh, yph; if (rx==0 && ry==0) { /* Special case - draw a single pixel */ set_at( dst, x, y, color); return; } if (rx==0) { /* Special case for rx=0 - draw a vline */ drawvertlineclip( dst, color, x, (Sint16)(y-ry), (Sint16)(y+ry) ); return; } if (ry==0) { /* Special case for ry=0 - draw a hline */ drawhorzlineclip( dst, color, (Sint16)(x-rx), y, (Sint16)(x+rx) ); return; } /* Init vars */ oh = oi = oj = ok = 0xFFFF; if (rx > ry) { ix = 0; iy = rx * 64; do { h = (ix + 16) >> 6; i = (iy + 16) >> 6; j = (h * ry) / rx; k = (i * ry) / rx; if (((ok!=k) && (oj!=k)) || ((oj!=j) && (ok!=j)) || (k!=j)) { xph=x+h-1; xmh=x-h; if (k>0) { ypk=y+k-1; ymk=y-k; if(h > 0) { set_at(dst, xmh, ypk, color); set_at(dst, xmh, ymk, color); } set_at(dst, xph, ypk, color); set_at(dst, xph, ymk, color); } ok=k; xpi=x+i-1; xmi=x-i; if (j>0) { ypj=y+j-1; ymj=y-j; set_at(dst, xmi, ypj, color); set_at(dst, xpi, ypj, color); set_at(dst, xmi, ymj, color); set_at(dst, xpi, ymj, color); } oj=j; } ix = ix + iy / rx; iy = iy - ix / rx; } while (i > h); } else { ix = 0; iy = ry * 64; do { h = (ix + 32) >> 6; i = (iy + 32) >> 6; j = (h * rx) / ry; k = (i * rx) / ry; if (((oi!=i) && (oh!=i)) || ((oh!=h) && (oi!=h) && (i!=h))) { xmj=x-j; xpj=x+j-1; if (i>0) { ypi=y+i-1; ymi=y-i; if(j > 0) { set_at(dst, xmj, ypi, color); set_at(dst, xmj, ymi, color); } set_at(dst, xpj, ypi, color); set_at(dst, xpj, ymi, color); } oi=i; xmk=x-k; xpk=x+k-1; if (h>0) { yph=y+h-1; ymh=y-h; set_at(dst, xmk, yph, color); set_at(dst, xpk, yph, color); set_at(dst, xmk, ymh, color); set_at(dst, xpk, ymh, color); } oh=h; } ix = ix + iy / ry; iy = iy - ix / ry; } while(i > h); } } static void draw_fillellipse(SDL_Surface *dst, int x, int y, int rx, int ry, Uint32 color) { int ix, iy; int h, i, j, k; int oh, oi, oj, ok; if (rx==0 && ry==0) { /* Special case - draw a single pixel */ set_at( dst, x, y, color); return; } if (rx==0) { /* Special case for rx=0 - draw a vline */ drawvertlineclip( dst, color, x, (Sint16)(y-ry), (Sint16)(y+ry) ); return; } if (ry==0) { /* Special case for ry=0 - draw a hline */ drawhorzlineclip( dst, color, (Sint16)(x-rx), y, (Sint16)(x+rx) ); return; } /* Init vars */ oh = oi = oj = ok = 0xFFFF; /* Draw */ if (rx >= ry) { ix = 0; iy = rx * 64; do { h = (ix + 8) >> 6; i = (iy + 8) >> 6; j = (h * ry) / rx; k = (i * ry) / rx; if ((ok!=k) && (oj!=k) && (k h); } else { ix = 0; iy = ry * 64; do { h = (ix + 8) >> 6; i = (iy + 8) >> 6; j = (h * rx) / ry; k = (i * rx) / ry; if ((oi!=i) && (oh!=i) && (i h); } } static int compare_int(const void *a, const void *b) { return (*(const int *)a) - (*(const int *)b); } static void draw_fillpoly(SDL_Surface *dst, int *vx, int *vy, int n, Uint32 color) { int i; int y; int miny, maxy; int x1, y1; int x2, y2; int ind1, ind2; int ints; int *polyints = PyMem_New(int, n); if (polyints == NULL) { PyErr_NoMemory(); return; } /* Determine Y maxima */ miny = vy[0]; maxy = vy[0]; for (i=1; (i < n); i++) { miny = MIN(miny, vy[i]); maxy = MAX(maxy, vy[i]); } /* Draw, scanning y */ for(y=miny; (y <= maxy); y++) { ints = 0; for (i=0; (i < n); i++) { if (!i) { ind1 = n-1; ind2 = 0; } else { ind1 = i-1; ind2 = i; } y1 = vy[ind1]; y2 = vy[ind2]; if (y1 < y2) { x1 = vx[ind1]; x2 = vx[ind2]; } else if (y1 > y2) { y2 = vy[ind1]; y1 = vy[ind2]; x2 = vx[ind1]; x1 = vx[ind2]; } else { continue; } if ((y >= y1) && (y < y2)) { polyints[ints++] = (y-y1) * (x2-x1) / (y2-y1) + x1; } else if ((y == maxy) && (y > y1) && (y <= y2)) { polyints[ints++] = (y-y1) * (x2-x1) / (y2-y1) + x1; } } qsort(polyints, ints, sizeof(int), compare_int); for (i=0; (i init initialize the display module pygame.display.init(): return None Initializes the pygame display module. The display module cannot do anything until it is initialized. This is usually handled for you automatically when you call the higher level pygame.init(). Pygame will select from one of several internal display backends when it is initialized. The display mode will be chosen depending on the platform and permissions of current user. Before the display module is initialized the environment variable SDL_VIDEODRIVER can be set to control which backend is used. The systems with multiple choices are listed here. Windows : windib, directx Unix : x11, dga, fbcon, directfb, ggi, vgl, svgalib, aalib On some platforms it is possible to embed the pygame display into an already existing window. To do this, the environment variable SDL_WINDOWID must be set to a string containing the window id or handle. The environment variable is checked when the pygame display is initialized. Be aware that there can be many strange side effects when running in an embedded display. It is harmless to call this more than once, repeated calls have no effect. quit uninitialize the display module pygame.display.quit(): return None This will shut down the entire display module. This means any active displays will be closed. This will also be handled automatically when the program exits. It is harmless to call this more than once, repeated calls have no effect. get_init true if the display module is initialized pygame.display.get_init(): return bool Returns True if the pygame.display module is currently initialized. set_mode initialize a window or screen for display pygame.display.set_mode(resolution=(0,0), flags=0, depth=0): return Surface This function will create a display Surface. The arguments passed in are requests for a display type. The actual created display will be the best possible match supported by the system. The resolution argument is a pair of numbers representing the width and height. The flags argument is a collection of additional options. The depth argument represents the number of bits to use for color. The Surface that gets returned can be drawn to like a regular Surface but changes will eventually be seen on the monitor. If no resolution is passed or is set to (0, 0) and pygame uses SDL version 1.2.10 or above, the created Surface will have the same size as the current screen resolution. If only the width or height are set to 0, the Surface will have the same width or height as the screen resolution. Using a SDL version prior to 1.2.10 will raise an exception. It is usually best to not pass the depth argument. It will default to the best and fastest color depth for the system. If your game requires a specific color format you can control the depth with this argument. Pygame will emulate an unavailable color depth which can be slow. When requesting fullscreen display modes, sometimes an exact match for the requested resolution cannot be made. In these situations pygame will select the closest compatable match. The returned surface will still always match the requested resolution. The flags argument controls which type of display you want. There are several to choose from, and you can even combine multiple types using the bitwise or operator, (the pipe "|" character). If you pass 0 or no flags argument it will default to a software driven window. Here are the display flags you will want to choose from: pygame.FULLSCREEN create a fullscreen display pygame.DOUBLEBUF recommended for HWSURFACE or OPENGL pygame.HWSURFACE hardware accelerated, only in FULLSCREEN pygame.OPENGL create an opengl renderable display pygame.RESIZABLE display window should be sizeable pygame.NOFRAME display window will have no border or controls get_surface get a reference to the currently set display surface pygame.display.get_surface(): return Surface Return a reference to the currently set display Surface. If no display mode has been set this will return None. flip update the full display Surface to the screen pygame.display.flip(): return None This will update the contents of the entire display. If your display mode is using the flags pygame.HWSURFACE and pygame.DOUBLEBUF, this will wait for a vertical retrace and swap the surfaces. If you are using a different type of display mode, it will simply update the entire contents of the surface. When using an pygame.OPENGL display mode this will perform a gl buffer swap. update update portions of the screen for software displays pygame.display.update(rectangle=None): return None pygame.display.update(rectangle_list): return None This function is like an optimized version of pygame.display.flip() for software displays. It allows only a portion of the screen to updated, instead of the entire area. If no argument is passed it updates the entire Surface area like pygame.display.flip(). You can pass the function a single rectangle, or a sequence of rectangles. It is more efficient to pass many rectangles at once than to call update multiple times with single or a partial list of rectangles. If passing a sequence of rectangles it is safe to include None values in the list, which will be skipped. This call cannot be used on pygame.OPENGL displays and will generate an exception. get_driver get the name of the pygame display backend pygame.display.get_driver(): return name Pygame chooses one of many available display backends when it is initialized. This returns the internal name used for the display backend. This can be used to provide limited information about what display capabilities might be accelerated. See the SDL_VIDEODRIVER flags in pygame.display.set_mode() to see some of the common options. Info Create a video display information object pygame.display.Info(): return VideoInfo Creates a simple object containing several attributes to describe the current graphics environment. If this is called before pygame.display.set_mode() some platforms can provide information about the default display mode. This can also be called after setting the display mode to verify specific display options were satisfied. The VidInfo object has several attributes: hw: True if the display is hardware accelerated wm: True if windowed display modes can be used video_mem: The megabytes of video memory on the display. This is 0 if unknown bitsize: Number of bits used to store each pixel bytesize: Number of bytes used to store each pixel masks: Four values used to pack RGBA values into pixels shifts: Four values used to pack RGBA values into pixels losses: Four values used to pack RGBA values into pixels blit_hw: True if hardware Surface blitting is accelerated blit_hw_CC: True if hardware Surface colorkey blitting is accelerated blit_hw_A: True if hardware Surface pixel alpha blitting is accelerated blit_sw: True if software Surface blitting is accelerated blit_sw_CC: True if software Surface colorkey blitting is accelerated blit_sw_A: True if software Surface pixel alpha blitting is acclerated current_h, current_h: Width and height of the current video mode, or of the desktop mode if called before the display.set_mode is called. (current_h, current_w are available since SDL 1.2.10, and pygame 1.8.0) They are -1 on error, or if an old SDL is being used. get_wm_info Get information about the current windowing system pygame.display.get_wm_info(): return dict Creates a dictionary filled with string keys. The strings and values are arbitrarily created by the system. Some systems may have no information and an empty dictionary will be returned. Most platforms will return a "window" key with the value set to the system id for the current display. New with pygame 1.7.1 list_modes get list of available fullscreen modes pygame.display.list_modes(depth=0, flags=pygame.FULLSCREEN): return list This function returns a list of possible dimensions for a specified color depth. The return value will be an empty list if no display modes are available with the given arguments. A return value of -1 means that any requested resolution should work (this is likely the case for windowed modes). Mode sizes are sorted from biggest to smallest. If depth is 0, SDL will choose the current/best color depth for the display. The flags defaults to pygame.FULLSCREEN, but you may need to add additional flags for specific fullscreen modes. mode_ok pick the best color depth for a display mode pygame.display.mode_ok(size, flags=0, depth=0): return depth This function uses the same arguments as pygame.display.set_mode(). It is used to depermine if a requested display mode is available. It will return 0 if the display mode cannot be set. Otherwise it will return a pixel depth that best matches the display asked for. Usually the depth argument is not passed, but some platforms can support multiple display depths. If passed it will hint to which depth is a better match. The most useful flags to pass will be pygame.HWSURFACE, pygame.DOUBLEBUF, and maybe pygame.FULLSCREEN. The function will return 0 if these display flags cannot be set. gl_get_attribute get the value for an opengl flag for the current display pygame.display.gl_get_attribute(flag): return value After calling pygame.display.set_mode() with the pygame.OPENGL flag, it is a good idea to check the value of any requested OpenGL attributes. See pygame.display.gl_set_attribute() for a list of valid flags. gl_set_attribute request an opengl display attribute for the display mode pygame.display.gl_set_attribute(flag, value): return None When calling pygame.display.set_mode() with the pygame.OPENGL flag, Pygame automatically handles setting the OpenGL attributes like color and doublebuffering. OpenGL offers several other attributes you may want control over. Pass one of these attributes as the flag, and its appropriate value. This must be called before pygame.display.set_mode() The OPENGL flags are; GL_ALPHA_SIZE, GL_DEPTH_SIZE, GL_STENCIL_SIZE, GL_ACCUM_RED_SIZE, GL_ACCUM_GREEN_SIZE, GL_ACCUM_BLUE_SIZE, GL_ACCUM_ALPHA_SIZE, GL_MULTISAMPLEBUFFERS, GL_MULTISAMPLESAMPLES, GL_STEREO get_active true when the display is active on the display pygame.display.get_active(): return bool After pygame.display.set_mode() is called the display Surface will be visible on the screen. Most windowed displays can be hidden by the user. If the display Surface is hidden or iconified this will return False. iconify iconify the display surface pygame.display.iconify(): return bool Request the window for the display surface be iconified or hidden. Not all systems and displays support an iconified display. The function will return True if successfull. When the display is iconified pygame.display.get_active() will return False. The event queue should receive a ACTIVEEVENT event when the window has been iconified. toggle_fullscreen switch between fullscreen and windowed displays pygame.display.toggle_fullscreen(): return bool Switches the display window between windowed and fullscreen modes. This function only works under the unix x11 video driver. For most situations it is better to call pygame.display.set_mode() with new display flags. set_gamma change the hardware gamma ramps pygame.display.set_gamma(red, green=None, blue=None): return bool Set the red, green, and blue gamma values on the display hardware. If the green and blue arguments are not passed, they will both be the same as red. Not all systems and hardware support gamma ramps, if the function succeeds it will return True. A gamma value of 1.0 creates a linear color table. Lower values will darken the display and higher values will brighten. set_gamma_ramp set_gamma_ramp(red, green, blue): return bool change the hardware gamma ramps with a custom lookup pygame.display.set_gamma_ramp(red, green, blue): return bool Set the red, green, and blue gamma ramps with an explicit lookup table. Each argument should be sequence of 256 integers. The integers should range between 0 and 0xffff. Not all systems and hardware support gamma ramps, if the function succeeds it will return True. set_icon change the system image for the display window pygame.display.set_icon(Surface): return None Sets the runtime icon the system will use to represent the display window. All windows default to a simple pygame logo for the window icon. You can pass any surface, but most systems want a smaller image around 32x32. The image can have colorkey transparency which will be passed to the system. Some systems do not allow the window icon to change after it has been shown. This function can be called before pygame.display.set_mode() to create the icon before the display mode is set. set_caption set the current window caption pygame.display.set_caption(title, icontitle=None): return None If the display has a window title, this function will change the name on the window. Some systems support an alternate shorter title to be used for minimized displays. get_caption get the current window caption pygame.display.get_caption(): return (title, icontitle) Returns the title and icontitle for the display Surface. These will often be the same value. set_palette set the display color palette for indexed displays pygame.display.set_palette(palette=None): return None This will change the video display color palette for 8bit displays. This does not change the palette for the actual display Surface, only the palette that is used to display the Surface. If no palette argument is passed, the system default palette will be restored. The palette is a sequence of RGB triplets. pygame-1.9.1release/src/display.c0000644000175000017500000007224311226552737016665 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ /* * pygame display module */ #define PYGAMEAPI_DISPLAY_INTERNAL #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" #include static PyTypeObject PyVidInfo_Type; static PyObject* PyVidInfo_New (const SDL_VideoInfo* info); static void do_set_icon (PyObject *surface); static PyObject* DisplaySurfaceObject = NULL; static int icon_was_set = 0; #if (!defined(darwin)) static char* icon_defaultname = "pygame_icon.bmp"; static char* pkgdatamodule_name = "pygame.pkgdata"; static char* imagemodule_name = "pygame.image"; static char* resourcefunc_name = "getResource"; static char* load_basicfunc_name = "load_basic"; static PyObject* display_resource (char *filename) { PyObject* imagemodule = NULL; PyObject* load_basicfunc = NULL; PyObject* pkgdatamodule = NULL; PyObject* resourcefunc = NULL; PyObject* fresult = NULL; PyObject* result = NULL; #if PY3 PyObject* name = NULL; #endif pkgdatamodule = PyImport_ImportModule (pkgdatamodule_name); if (!pkgdatamodule) goto display_resource_end; resourcefunc = PyObject_GetAttrString (pkgdatamodule, resourcefunc_name); if (!resourcefunc) goto display_resource_end; imagemodule = PyImport_ImportModule (imagemodule_name); if (!imagemodule) goto display_resource_end; load_basicfunc = PyObject_GetAttrString (imagemodule, load_basicfunc_name); if (!load_basicfunc) goto display_resource_end; fresult = PyObject_CallFunction (resourcefunc, "s", filename); if (!fresult) goto display_resource_end; #if PY3 name = PyObject_GetAttrString (fresult, "name"); if (name != NULL) { if (Text_Check (name)) { Py_DECREF (fresult); fresult = name; name = NULL; } } else { PyErr_Clear (); } #else if (PyFile_Check (fresult)) { PyObject *tmp = PyFile_Name (fresult); Py_INCREF (tmp); Py_DECREF (fresult); fresult = tmp; } #endif result = PyObject_CallFunction (load_basicfunc, "O", fresult); if (!result) goto display_resource_end; display_resource_end: Py_XDECREF (pkgdatamodule); Py_XDECREF (resourcefunc); Py_XDECREF (imagemodule); Py_XDECREF (load_basicfunc); Py_XDECREF (fresult); #if PY3 Py_XDECREF (name); #endif return result; } #endif /* init routines */ static void display_autoquit (void) { if (DisplaySurfaceObject) { PySurface_AsSurface (DisplaySurfaceObject) = NULL; Py_DECREF (DisplaySurfaceObject); DisplaySurfaceObject = NULL; } } static PyObject* display_autoinit (PyObject* self, PyObject* arg) { PyGame_RegisterQuit (display_autoquit); return PyInt_FromLong (1); } static PyObject* quit (PyObject* self, PyObject* arg) { PyGame_Video_AutoQuit (); display_autoquit (); Py_RETURN_NONE; } static PyObject* init (PyObject* self) { if (!PyGame_Video_AutoInit()) return RAISE (PyExc_SDLError, SDL_GetError ()); if (!display_autoinit (NULL, NULL)) return NULL; Py_RETURN_NONE; } static PyObject* get_init (PyObject* self) { return PyInt_FromLong (SDL_WasInit (SDL_INIT_VIDEO) != 0); } static PyObject* get_active (PyObject* self) { return PyInt_FromLong ((SDL_GetAppState () & SDL_APPACTIVE) != 0); } /* vidinfo object */ static void vidinfo_dealloc (PyObject* self) { PyObject_DEL (self); } static PyObject* vidinfo_getattr (PyObject *self, char *name) { SDL_VideoInfo* info = &((PyVidInfoObject*) self)->info; int current_w = -1; int current_h = -1; SDL_version versioninfo; SDL_VERSION (&versioninfo); if (versioninfo.major >= 1 && versioninfo.minor >= 2 && versioninfo.patch >= 10 ) { current_w = info->current_w; current_h = info->current_h; } if (!strcmp (name, "hw")) return PyInt_FromLong (info->hw_available); else if (!strcmp (name, "wm")) return PyInt_FromLong (info->wm_available); else if (!strcmp (name, "blit_hw")) return PyInt_FromLong (info->blit_hw); else if (!strcmp (name, "blit_hw_CC")) return PyInt_FromLong (info->blit_hw_CC); else if (!strcmp (name, "blit_hw_A")) return PyInt_FromLong (info->blit_hw_A); else if (!strcmp (name, "blit_sw")) return PyInt_FromLong (info->blit_hw); else if (!strcmp (name, "blit_sw_CC")) return PyInt_FromLong (info->blit_hw_CC); else if (!strcmp (name, "blit_sw_A")) return PyInt_FromLong (info->blit_hw_A); else if (!strcmp (name, "blit_fill")) return PyInt_FromLong (info->blit_fill); else if (!strcmp (name, "video_mem")) return PyInt_FromLong (info->video_mem); else if (!strcmp (name, "bitsize")) return PyInt_FromLong (info->vfmt->BitsPerPixel); else if (!strcmp (name, "bytesize")) return PyInt_FromLong (info->vfmt->BytesPerPixel); else if (!strcmp (name, "masks")) return Py_BuildValue ("(iiii)", info->vfmt->Rmask, info->vfmt->Gmask, info->vfmt->Bmask, info->vfmt->Amask); else if (!strcmp (name, "shifts")) return Py_BuildValue ("(iiii)", info->vfmt->Rshift, info->vfmt->Gshift, info->vfmt->Bshift, info->vfmt->Ashift); else if (!strcmp (name, "losses")) return Py_BuildValue ("(iiii)", info->vfmt->Rloss, info->vfmt->Gloss, info->vfmt->Bloss, info->vfmt->Aloss); else if (!strcmp (name, "current_h")) return PyInt_FromLong (current_h); else if (!strcmp (name, "current_w")) return PyInt_FromLong (current_w); return RAISE (PyExc_AttributeError, "does not exist in vidinfo"); } PyObject* vidinfo_str (PyObject* self) { char str[1024]; int current_w = -1; int current_h = -1; SDL_VideoInfo* info = &((PyVidInfoObject*) self)->info; SDL_version versioninfo; SDL_VERSION (&versioninfo); if(versioninfo.major >= 1 && versioninfo.minor >= 2 && versioninfo.patch >= 10 ) { current_w = info->current_w; current_h = info->current_h; } sprintf (str, "\n", info->hw_available, info->wm_available, info->video_mem, info->blit_hw, info->blit_hw_CC, info->blit_hw_A, info->blit_sw, info->blit_sw_CC, info->blit_sw_A, info->vfmt->BitsPerPixel, info->vfmt->BytesPerPixel, info->vfmt->Rmask, info->vfmt->Gmask, info->vfmt->Bmask, info->vfmt->Amask, info->vfmt->Rshift, info->vfmt->Gshift, info->vfmt->Bshift, info->vfmt->Ashift, info->vfmt->Rloss, info->vfmt->Gloss, info->vfmt->Bloss, info->vfmt->Aloss, current_w, current_h); return Text_FromUTF8 (str); } static PyTypeObject PyVidInfo_Type = { TYPE_HEAD (NULL, 0) "VidInfo", /*name*/ sizeof(PyVidInfoObject), /*basic size*/ 0, /*itemsize*/ vidinfo_dealloc, /*dealloc*/ 0, /*print*/ vidinfo_getattr, /*getattr*/ NULL, /*setattr*/ NULL, /*compare*/ vidinfo_str, /*repr*/ NULL, /*as_number*/ NULL, /*as_sequence*/ NULL, /*as_mapping*/ (hashfunc)NULL, /*hash*/ (ternaryfunc)NULL, /*call*/ (reprfunc)NULL, /*str*/ }; static PyObject* PyVidInfo_New (const SDL_VideoInfo* i) { PyVidInfoObject* info; if (!i) return RAISE (PyExc_SDLError, SDL_GetError ()); info = PyObject_NEW (PyVidInfoObject, &PyVidInfo_Type); if (!info) return NULL; memcpy (&info->info, i, sizeof (SDL_VideoInfo)); return (PyObject*)info; } /* display functions */ static PyObject* get_driver (PyObject* self) { char buf[256]; VIDEO_INIT_CHECK (); if (!SDL_VideoDriverName (buf, sizeof (buf))) Py_RETURN_NONE; return Text_FromUTF8 (buf); } static PyObject* get_wm_info (PyObject* self) { PyObject *dict; PyObject *tmp; SDL_SysWMinfo info; VIDEO_INIT_CHECK (); SDL_VERSION (&(info.version)) dict = PyDict_New (); if (!dict || !SDL_GetWMInfo (&info)) return dict; /*scary #ifdef's match SDL_syswm.h*/ #if (defined(unix) || defined(__unix__) || \ defined(_AIX) || defined(__OpenBSD__)) && \ (defined(SDL_VIDEO_DRIVER_X11) && !defined(__CYGWIN32__) && \ !defined(ENABLE_NANOX) && !defined(__QNXNTO__)) tmp = PyInt_FromLong (info.info.x11.window); PyDict_SetItemString (dict, "window", tmp); Py_DECREF (tmp); tmp = PyCObject_FromVoidPtr (info.info.x11.display, NULL); PyDict_SetItemString (dict, "display", tmp); Py_DECREF (tmp); tmp = PyCObject_FromVoidPtr (info.info.x11.lock_func, NULL); PyDict_SetItemString (dict, "lock_func", tmp); Py_DECREF (tmp); tmp = PyCObject_FromVoidPtr (info.info.x11.unlock_func, NULL); PyDict_SetItemString (dict, "unlock_func", tmp); Py_DECREF (tmp); tmp = PyInt_FromLong (info.info.x11.fswindow); PyDict_SetItemString (dict, "fswindow", tmp); Py_DECREF (tmp); tmp = PyInt_FromLong (info.info.x11.wmwindow); PyDict_SetItemString (dict, "wmwindow", tmp); Py_DECREF (tmp); #elif defined(ENABLE_NANOX) tmp = PyInt_FromLong (info.window); PyDict_SetItemString (dict, "window", tmp); Py_DECREF (tmp); #elif defined(WIN32) tmp = PyInt_FromLong ((long)info.window); PyDict_SetItemString (dict, "window", tmp); Py_DECREF (tmp); tmp = PyInt_FromLong ((long)info.hglrc); PyDict_SetItemString (dict, "hglrc", tmp); Py_DECREF (tmp); #elif defined(__riscos__) tmp = PyInt_FromLong (info.window); PyDict_SetItemString (dict, "window", tmp); Py_DECREF (tmp); tmp = PyInt_FromLong (info.wimpVersion); PyDict_SetItemString (dict, "wimpVersion", tmp); Py_DECREF (tmp); tmp = PyInt_FromLong (info.taskHandle); PyDict_SetItemString (dict, "taskHandle", tmp); Py_DECREF (tmp); #elif (defined(__APPLE__) && defined(__MACH__)) /* do nothing. */ #else tmp = PyInt_FromLong (info.data); PyDict_SetItemString (dict, "data", tmp); Py_DECREF (tmp); #endif return dict; } static PyObject* Info (PyObject* self) { const SDL_VideoInfo* info; VIDEO_INIT_CHECK (); info = SDL_GetVideoInfo (); return PyVidInfo_New (info); } static PyObject* get_surface (PyObject* self) { if (!DisplaySurfaceObject) Py_RETURN_NONE; Py_INCREF (DisplaySurfaceObject); return DisplaySurfaceObject; } static PyObject* gl_set_attribute (PyObject* self, PyObject* arg) { int flag, value, result; VIDEO_INIT_CHECK (); if (!PyArg_ParseTuple (arg, "ii", &flag, &value)) return NULL; if (flag == -1) /*an undefined/unsupported val, ignore*/ Py_RETURN_NONE; result = SDL_GL_SetAttribute (flag, value); if (result == -1) return RAISE (PyExc_SDLError, SDL_GetError()); Py_RETURN_NONE; } static PyObject* gl_get_attribute (PyObject* self, PyObject* arg) { int flag, value, result; VIDEO_INIT_CHECK (); if (!PyArg_ParseTuple (arg, "i", &flag)) return NULL; result = SDL_GL_GetAttribute (flag, &value); if (result == -1) return RAISE (PyExc_SDLError, SDL_GetError ()); return PyInt_FromLong (value); } static PyObject* set_mode (PyObject* self, PyObject* arg) { SDL_Surface* surf; int depth = 0; int flags = SDL_SWSURFACE; int w = 0; int h = 0; int hasbuf; char *title, *icontitle; if (!PyArg_ParseTuple (arg, "|(ii)ii", &w, &h, &flags, &depth)) return NULL; if (w < 0 || h < 0) return RAISE (PyExc_SDLError, "Cannot set negative sized display mode"); if (w == 0 || h == 0) { SDL_version versioninfo; SDL_VERSION (&versioninfo); if (!(versioninfo.major > 1 || (versioninfo.major == 1 && versioninfo.minor > 2) || (versioninfo.major == 1 && versioninfo.minor == 2 && versioninfo.patch >= 10 ))) { return RAISE (PyExc_SDLError, "Cannot set 0 sized display mode"); } } if (!SDL_WasInit (SDL_INIT_VIDEO)) { /*note SDL works special like this too*/ if (!init (NULL)) return NULL; } if (flags & SDL_OPENGL) { if (flags & SDL_DOUBLEBUF) { flags &= ~SDL_DOUBLEBUF; SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1); } else SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 0); if (depth) SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, depth); surf = SDL_SetVideoMode (w, h, depth, flags); if (!surf) return RAISE (PyExc_SDLError, SDL_GetError ()); SDL_GL_GetAttribute (SDL_GL_DOUBLEBUFFER, &hasbuf); if (hasbuf) surf->flags |= SDL_DOUBLEBUF; } else { if (!depth) flags |= SDL_ANYFORMAT; Py_BEGIN_ALLOW_THREADS; surf = SDL_SetVideoMode (w, h, depth, flags); Py_END_ALLOW_THREADS; if (!surf) return RAISE (PyExc_SDLError, SDL_GetError ()); } SDL_WM_GetCaption (&title, &icontitle); if (!title || !*title) SDL_WM_SetCaption ("pygame window", "pygame"); /*probably won't do much, but can't hurt, and might help*/ SDL_PumpEvents (); if (DisplaySurfaceObject) ((PySurfaceObject*) DisplaySurfaceObject)->surf = surf; else DisplaySurfaceObject = PySurface_New (surf); #if !defined(darwin) if (!icon_was_set) { PyObject* iconsurf = display_resource (icon_defaultname); if (!iconsurf) PyErr_Clear (); else { SDL_SetColorKey (PySurface_AsSurface (iconsurf), SDL_SRCCOLORKEY, 0); do_set_icon (iconsurf); Py_DECREF (iconsurf); } } #endif Py_INCREF (DisplaySurfaceObject); return DisplaySurfaceObject; } static PyObject* mode_ok (PyObject* self, PyObject* args) { int depth = 0; int w, h; int flags = SDL_SWSURFACE; VIDEO_INIT_CHECK (); if (!PyArg_ParseTuple (args, "(ii)|ii", &w, &h, &flags, &depth)) return NULL; if (!depth) depth = SDL_GetVideoInfo ()->vfmt->BitsPerPixel; return PyInt_FromLong (SDL_VideoModeOK (w, h, depth, flags)); } static PyObject* list_modes (PyObject* self, PyObject* args) { SDL_PixelFormat format; SDL_Rect** rects; int flags=SDL_FULLSCREEN; PyObject *list, *size; format.BitsPerPixel = 0; if (PyTuple_Size (args)!=0 && !PyArg_ParseTuple (args, "|bi", &format.BitsPerPixel, &flags)) return NULL; VIDEO_INIT_CHECK (); if (!format.BitsPerPixel) format.BitsPerPixel = SDL_GetVideoInfo ()->vfmt->BitsPerPixel; rects = SDL_ListModes (&format, flags); if(rects == (SDL_Rect**)-1) return PyInt_FromLong (-1); if(!(list = PyList_New (0))) return NULL; if (!rects) return list; for (; *rects; ++rects) { if (!(size = Py_BuildValue ("(ii)", (*rects)->w, (*rects)->h))) { Py_DECREF (list); return NULL; } PyList_Append (list, size); Py_DECREF (size); } return list; } static PyObject* flip (PyObject* self) { SDL_Surface* screen; int status = 0; VIDEO_INIT_CHECK (); screen = SDL_GetVideoSurface (); if (!screen) return RAISE (PyExc_SDLError, "Display mode not set"); Py_BEGIN_ALLOW_THREADS; if (screen->flags & SDL_OPENGL) SDL_GL_SwapBuffers (); else status = SDL_Flip (screen) == -1; Py_END_ALLOW_THREADS; if (status == -1) return RAISE (PyExc_SDLError, SDL_GetError ()); Py_RETURN_NONE; } /*BAD things happen when out-of-bound rects go to updaterect*/ static SDL_Rect* screencroprect (GAME_Rect* r, int w, int h, SDL_Rect* cur) { if (r->x > w || r->y > h || (r->x + r->w) <= 0 || (r->y + r->h) <= 0) return 0; else { int right = MIN (r->x + r->w, w); int bottom = MIN (r->y + r->h, h); cur->x = (short) MAX (r->x, 0); cur->y = (short) MAX (r->y, 0); cur->w = (unsigned short) right - cur->x; cur->h = (unsigned short) bottom - cur->y; } return cur; } static PyObject* update (PyObject* self, PyObject* arg) { SDL_Surface* screen; GAME_Rect *gr, temp = { 0 }; int wide, high; PyObject* obj; VIDEO_INIT_CHECK (); screen = SDL_GetVideoSurface (); if (!screen) return RAISE (PyExc_SDLError, SDL_GetError ()); wide = screen->w; high = screen->h; if (screen->flags & SDL_OPENGL) return RAISE (PyExc_SDLError, "Cannot update an OPENGL display"); /*determine type of argument we got*/ if (PyTuple_Size (arg) == 0) { SDL_UpdateRect (screen, 0, 0, 0, 0); Py_RETURN_NONE; } else { obj = PyTuple_GET_ITEM (arg, 0); if (obj == Py_None) gr = &temp; else { gr = GameRect_FromObject (arg, &temp); if (!gr) PyErr_Clear (); else if (gr != &temp) { memcpy (&temp, gr, sizeof (temp)); gr = &temp; } } } if (gr) { SDL_Rect sdlr; if (screencroprect (gr, wide, high, &sdlr)) SDL_UpdateRect (screen, sdlr.x, sdlr.y, sdlr.w, sdlr.h); } else { PyObject* seq; PyObject* r; int loop, num, count; SDL_Rect* rects; if (PyTuple_Size (arg) != 1) return RAISE (PyExc_ValueError, "update requires a rectstyle or sequence of recstyles"); seq = PyTuple_GET_ITEM (arg, 0); if (!seq || !PySequence_Check (seq)) return RAISE (PyExc_ValueError, "update requires a rectstyle or sequence of recstyles"); num = PySequence_Length (seq); rects = PyMem_New (SDL_Rect, num); if (!rects) return NULL; count = 0; for (loop = 0; loop < num; ++loop) { SDL_Rect* cur_rect = (rects + count); /*get rect from the sequence*/ r = PySequence_GetItem (seq, loop); if (r == Py_None) { Py_DECREF(r); continue; } gr = GameRect_FromObject (r, &temp); Py_XDECREF (r); if (!gr) { PyMem_Free ((char*)rects); return RAISE (PyExc_ValueError, "update_rects requires a single list of rects"); } if (gr->w < 1 && gr->h < 1) continue; /*bail out if rect not onscreen*/ if (!screencroprect (gr, wide, high, cur_rect)) continue; ++count; } if (count) { Py_BEGIN_ALLOW_THREADS; SDL_UpdateRects (screen, count, rects); Py_END_ALLOW_THREADS; } PyMem_Free ((char*)rects); } Py_RETURN_NONE; } static PyObject* set_palette (PyObject* self, PyObject* args) { SDL_Surface* surf; SDL_Palette* pal; SDL_Color* colors; PyObject* list, *item = NULL; int i, len; int r, g, b; VIDEO_INIT_CHECK (); if (!PyArg_ParseTuple (args, "|O", &list)) return NULL; surf = SDL_GetVideoSurface (); if (!surf) return RAISE (PyExc_SDLError, "No display mode is set"); pal = surf->format->palette; if (surf->format->BytesPerPixel != 1 || !pal) return RAISE (PyExc_SDLError, "Display mode is not colormapped"); if (!list) { colors = pal->colors; len = pal->ncolors; SDL_SetPalette (surf, SDL_PHYSPAL, colors, 0, len); Py_RETURN_NONE; } if (!PySequence_Check (list)) return RAISE (PyExc_ValueError, "Argument must be a sequence type"); len = MIN (pal->ncolors, PySequence_Length (list)); colors = (SDL_Color*)malloc (len * sizeof (SDL_Color)); if (!colors) return NULL; for (i = 0; i < len; i++) { item = PySequence_GetItem (list, i); if (!PySequence_Check (item) || PySequence_Length (item) != 3) { Py_DECREF (item); free ((char*)colors); return RAISE (PyExc_TypeError, "takes a sequence of sequence of RGB"); } if(!IntFromObjIndex (item, 0, &r) || !IntFromObjIndex (item, 1, &g) || !IntFromObjIndex (item, 2, &b)) return RAISE (PyExc_TypeError, "RGB sequence must contain numeric values"); colors[i].r = (unsigned char)r; colors[i].g = (unsigned char)g; colors[i].b = (unsigned char)b; Py_DECREF (item); } SDL_SetPalette (surf, SDL_PHYSPAL, colors, 0, len); free ((char*)colors); Py_RETURN_NONE; } static PyObject* set_gamma (PyObject* self, PyObject* arg) { float r, g, b; int result; if (!PyArg_ParseTuple (arg, "f|ff", &r, &g, &b)) return NULL; if (PyTuple_Size (arg) == 1) g = b = r; VIDEO_INIT_CHECK (); result = SDL_SetGamma (r, g, b); return PyInt_FromLong (result == 0); } static int convert_to_uint16 (PyObject* python_array, Uint16* c_uint16_array) { int i; PyObject* item; if (!c_uint16_array) { RAISE (PyExc_RuntimeError, "Memory not allocated for c_uint16_array."); return 0; } if (!PySequence_Check (python_array)) { RAISE (PyExc_TypeError, "Array must be sequence type"); return 0; } if (PySequence_Size (python_array) != 256) { RAISE (PyExc_ValueError, "gamma ramp must be 256 elements long"); return 0; } for (i = 0; i < 256; i++) { item = PySequence_GetItem (python_array, i); if(!PyInt_Check (item)) { RAISE (PyExc_ValueError, "gamma ramp must contain integer elements"); return 0; } c_uint16_array[i] = (Uint16)PyInt_AsLong (item); Py_XDECREF (item); } return 1; } static PyObject* set_gamma_ramp (PyObject* self, PyObject* arg) { Uint16 *r, *g, *b; int result; r = (Uint16 *) malloc (256 * sizeof (Uint16)); if (!r) return NULL; g = (Uint16 *) malloc (256 * sizeof (Uint16)); if (!g) { free (r); return NULL; } b = (Uint16 *) malloc (256 * sizeof (Uint16)); if (!b) { free (r); free (g); return NULL; } if(!PyArg_ParseTuple (arg, "O&O&O&", convert_to_uint16, r, convert_to_uint16, g, convert_to_uint16, b)) { free (r); free (g); free (b); return NULL; } VIDEO_INIT_CHECK (); result = SDL_SetGammaRamp (r, g, b); free ((char*)r); free ((char*)g); free ((char*)b); return PyInt_FromLong (result == 0); } static PyObject* set_caption (PyObject* self, PyObject* arg) { char* title, *icontitle=NULL; if (!PyArg_ParseTuple (arg, "s|s", &title, &icontitle)) return NULL; if (!icontitle) icontitle = title; SDL_WM_SetCaption (title, icontitle); Py_RETURN_NONE; } static PyObject* get_caption (PyObject* self) { char* title, *icontitle; SDL_WM_GetCaption (&title, &icontitle); if (title && *title) return Py_BuildValue ("(ss)", title, icontitle); return Py_BuildValue ("()"); } static void do_set_icon (PyObject *surface) { SDL_Surface* surf = PySurface_AsSurface (surface); SDL_WM_SetIcon (surf, NULL); icon_was_set = 1; } static PyObject* set_icon (PyObject* self, PyObject* arg) { PyObject* surface; if (!PyArg_ParseTuple (arg, "O!", &PySurface_Type, &surface)) return NULL; if (!PyGame_Video_AutoInit ()) return RAISE (PyExc_SDLError, SDL_GetError ()); do_set_icon (surface); Py_RETURN_NONE; } static PyObject* iconify (PyObject* self) { int result; VIDEO_INIT_CHECK (); result = SDL_WM_IconifyWindow (); return PyInt_FromLong (result != 0); } static PyObject* toggle_fullscreen (PyObject* self) { SDL_Surface* screen; int result; VIDEO_INIT_CHECK (); screen = SDL_GetVideoSurface (); if (!screen) return RAISE (PyExc_SDLError, SDL_GetError ()); result = SDL_WM_ToggleFullScreen (screen); return PyInt_FromLong (result != 0); } static PyMethodDef _display_methods[] = { { "__PYGAMEinit__", display_autoinit, 1, "auto initialize function for display." }, { "init", (PyCFunction) init, METH_NOARGS, DOC_PYGAMEDISPLAYINIT }, { "quit", (PyCFunction) quit, METH_NOARGS, DOC_PYGAMEDISPLAYQUIT }, { "get_init", (PyCFunction) get_init, METH_NOARGS, DOC_PYGAMEDISPLAYGETINIT }, { "get_active", (PyCFunction) get_active, METH_NOARGS, DOC_PYGAMEDISPLAYGETACTIVE }, /* { "set_driver", set_driver, 1, doc_set_driver },*/ { "get_driver", (PyCFunction) get_driver, METH_NOARGS, DOC_PYGAMEDISPLAYGETDRIVER }, { "get_wm_info", (PyCFunction) get_wm_info, METH_NOARGS, DOC_PYGAMEDISPLAYGETWMINFO }, { "Info", (PyCFunction) Info, METH_NOARGS, DOC_PYGAMEDISPLAYINFO }, { "get_surface", (PyCFunction) get_surface, METH_NOARGS, DOC_PYGAMEDISPLAYGETSURFACE }, { "set_mode", set_mode, METH_VARARGS, DOC_PYGAMEDISPLAYSETMODE }, { "mode_ok", mode_ok, METH_VARARGS, DOC_PYGAMEDISPLAYMODEOK }, { "list_modes", list_modes, METH_VARARGS, DOC_PYGAMEDISPLAYLISTMODES }, { "flip", (PyCFunction) flip, METH_NOARGS, DOC_PYGAMEDISPLAYFLIP }, { "update", update, METH_VARARGS, DOC_PYGAMEDISPLAYUPDATE }, { "set_palette", set_palette, METH_VARARGS, DOC_PYGAMEDISPLAYSETPALETTE }, { "set_gamma", set_gamma, METH_VARARGS, DOC_PYGAMEDISPLAYSETGAMMA }, { "set_gamma_ramp", set_gamma_ramp, METH_VARARGS, DOC_PYGAMEDISPLAYSETGAMMARAMP }, { "set_caption", set_caption, METH_VARARGS, DOC_PYGAMEDISPLAYSETCAPTION }, { "get_caption", (PyCFunction) get_caption, METH_NOARGS, DOC_PYGAMEDISPLAYGETCAPTION }, { "set_icon", set_icon, METH_VARARGS, DOC_PYGAMEDISPLAYSETICON }, { "iconify", (PyCFunction) iconify, METH_NOARGS, DOC_PYGAMEDISPLAYICONIFY }, { "toggle_fullscreen", (PyCFunction) toggle_fullscreen, METH_NOARGS, DOC_PYGAMEDISPLAYTOGGLEFULLSCREEN }, { "gl_set_attribute", gl_set_attribute, METH_VARARGS, DOC_PYGAMEDISPLAYGLSETATTRIBUTE }, { "gl_get_attribute", gl_get_attribute, METH_VARARGS, DOC_PYGAMEDISPLAYGLGETATTRIBUTE }, { NULL, NULL, 0, NULL } }; MODINIT_DEFINE (display) { PyObject *module, *dict, *apiobj; int ecode; static void* c_api[PYGAMEAPI_DISPLAY_NUMSLOTS]; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "display", DOC_PYGAMEDISPLAY, -1, _display_methods, NULL, NULL, NULL, NULL }; #endif /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_rect (); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_surface (); if (PyErr_Occurred ()) { MODINIT_ERROR; } /* type preparation */ if (PyType_Ready (&PyVidInfo_Type) < 0) { MODINIT_ERROR; } /* create the module */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "display", _display_methods, DOC_PYGAMEDISPLAY); #endif if (module == NULL) { MODINIT_ERROR; } dict = PyModule_GetDict (module); /* export the c api */ c_api[0] = &PyVidInfo_Type; c_api[1] = PyVidInfo_New; apiobj = PyCObject_FromVoidPtr (c_api, NULL); if (apiobj == NULL) { DECREF_MOD (module); MODINIT_ERROR; } ecode = PyDict_SetItemString (dict, PYGAMEAPI_LOCAL_ENTRY, apiobj); Py_DECREF (apiobj); if (ecode) { DECREF_MOD (module); MODINIT_ERROR; } MODINIT_RETURN (module); } pygame-1.9.1release/src/constants.c0000644000175000017500000002477411207055754017236 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ #define NO_PYGAME_C_API #include "pygame.h" #include "pgcompat.h" #include "scrap.h" /* macros used to create each constant */ #define ADD_ERROR { DECREF_MOD (module); MODINIT_ERROR; } #define DEC_CONST(x) \ if (PyModule_AddIntConstant(module, #x, (int) SDL_##x)) ADD_ERROR #define DEC_CONSTK(x) \ if (PyModule_AddIntConstant(module, #x, (int) SDL##x)) ADD_ERROR #define DEC_CONSTN(x) \ if (PyModule_AddIntConstant(module, #x, (int) x)) ADD_ERROR #define DEC_CONSTS(x,y) \ if (PyModule_AddIntConstant(module, #x, (int) y)) ADD_ERROR #define ADD_STRING_CONST(x) \ if (PyModule_AddStringConstant(module, #x, x)) ADD_ERROR static PyMethodDef _constant_methods[] = { {NULL} }; /*DOC*/ static char _constants_doc[] = /*DOC*/ "Constants defined by SDL and needed in Pygame.\n"; MODINIT_DEFINE(constants) { PyObject* module; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "constants", _constants_doc, -1, _constant_methods, NULL, NULL, NULL, NULL }; #endif #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "constants", _constant_methods, _constants_doc); #endif if (module == NULL) { MODINIT_ERROR; } DEC_CONST (LIL_ENDIAN); DEC_CONST (BIG_ENDIAN); DEC_CONST(YV12_OVERLAY); DEC_CONST(IYUV_OVERLAY); DEC_CONST(YUY2_OVERLAY); DEC_CONST(UYVY_OVERLAY); DEC_CONST(YVYU_OVERLAY); DEC_CONST(SWSURFACE); DEC_CONST(HWSURFACE); DEC_CONST(RESIZABLE); DEC_CONST(ASYNCBLIT); DEC_CONST(OPENGL); DEC_CONST(OPENGLBLIT); DEC_CONST(ANYFORMAT); DEC_CONST(HWPALETTE); DEC_CONST(DOUBLEBUF); DEC_CONST(FULLSCREEN); DEC_CONST(HWACCEL); DEC_CONST(SRCCOLORKEY); DEC_CONST(RLEACCELOK); DEC_CONST(RLEACCEL); DEC_CONST(SRCALPHA); DEC_CONST(PREALLOC); DEC_CONST(NOFRAME); DEC_CONST(GL_RED_SIZE); DEC_CONST(GL_GREEN_SIZE); DEC_CONST(GL_BLUE_SIZE); DEC_CONST(GL_ALPHA_SIZE); DEC_CONST(GL_BUFFER_SIZE); DEC_CONST(GL_DOUBLEBUFFER); DEC_CONST(GL_DEPTH_SIZE); DEC_CONST(GL_STENCIL_SIZE); DEC_CONST(GL_ACCUM_RED_SIZE); DEC_CONST(GL_ACCUM_GREEN_SIZE); DEC_CONST(GL_ACCUM_BLUE_SIZE); DEC_CONST(GL_ACCUM_ALPHA_SIZE); #if SDL_VERSION_ATLEAST(1, 2, 5) DEC_CONST(GL_STEREO); #else PyModule_AddIntConstant(module, "GL_STEREO", -1); #endif #if SDL_VERSION_ATLEAST(1, 2, 6) DEC_CONST(GL_MULTISAMPLEBUFFERS); DEC_CONST(GL_MULTISAMPLESAMPLES); #else PyModule_AddIntConstant(module, "GL_MULTISAMPLEBUFFERS", -1); PyModule_AddIntConstant(module, "GL_MULTISAMPLESAMPLES", -1); #endif #if SDL_VERSION_ATLEAST(1, 2, 10) DEC_CONST(GL_SWAP_CONTROL); DEC_CONST(GL_ACCELERATED_VISUAL); #else PyModule_AddIntConstant(module, "GL_SWAP_CONTROL", -1); PyModule_AddIntConstant(module, "GL_ACCELERATED_VISUAL", -1); #endif #if SDL_VERSION_ATLEAST(1, 2, 13) DEC_CONST(BUTTON_X1); DEC_CONST(BUTTON_X2); #else PyModule_AddIntConstant(module, "BUTTON_X1", -1); PyModule_AddIntConstant(module, "BUTTON_X2", -1); #endif DEC_CONSTN(TIMER_RESOLUTION); DEC_CONSTN(AUDIO_U8); DEC_CONSTN(AUDIO_S8); DEC_CONSTN(AUDIO_U16LSB); DEC_CONSTN(AUDIO_S16LSB); DEC_CONSTN(AUDIO_U16MSB); DEC_CONSTN(AUDIO_S16MSB); DEC_CONSTN(AUDIO_U16); DEC_CONSTN(AUDIO_S16); DEC_CONSTN(AUDIO_U16SYS); DEC_CONSTN(AUDIO_S16SYS); #define SCRAP_TEXT PYGAME_SCRAP_TEXT #define SCRAP_BMP PYGAME_SCRAP_BMP #define SCRAP_PPM PYGAME_SCRAP_PPM #define SCRAP_PBM PYGAME_SCRAP_PBM ADD_STRING_CONST(SCRAP_TEXT); ADD_STRING_CONST(SCRAP_BMP); ADD_STRING_CONST(SCRAP_PPM); ADD_STRING_CONST(SCRAP_PBM); PyModule_AddIntConstant(module, "SCRAP_CLIPBOARD", 0); PyModule_AddIntConstant(module, "SCRAP_SELECTION", 1); /* BLEND_ADD is an alias for BLEND_RGB_ADD */ #define PYGAME_BLEND_RGB_ADD 0x1 #define PYGAME_BLEND_RGB_SUB 0x2 #define PYGAME_BLEND_RGB_MULT 0x3 #define PYGAME_BLEND_RGB_MIN 0x4 #define PYGAME_BLEND_RGB_MAX 0x5 #define PYGAME_BLEND_ADD PYGAME_BLEND_RGB_ADD #define PYGAME_BLEND_SUB PYGAME_BLEND_RGB_SUB #define PYGAME_BLEND_MULT PYGAME_BLEND_RGB_MULT #define PYGAME_BLEND_MIN PYGAME_BLEND_RGB_MIN #define PYGAME_BLEND_MAX PYGAME_BLEND_RGB_MAX #define PYGAME_BLEND_RGBA_ADD 0x6 #define PYGAME_BLEND_RGBA_SUB 0x7 #define PYGAME_BLEND_RGBA_MULT 0x8 #define PYGAME_BLEND_RGBA_MIN 0x9 #define PYGAME_BLEND_RGBA_MAX 0x10 DEC_CONSTS(BLEND_ADD, PYGAME_BLEND_ADD); DEC_CONSTS(BLEND_SUB, PYGAME_BLEND_SUB); DEC_CONSTS(BLEND_MULT, PYGAME_BLEND_MULT); DEC_CONSTS(BLEND_MIN, PYGAME_BLEND_MIN); DEC_CONSTS(BLEND_MAX, PYGAME_BLEND_MAX); DEC_CONSTS(BLEND_RGB_ADD, PYGAME_BLEND_RGB_ADD); DEC_CONSTS(BLEND_RGB_SUB, PYGAME_BLEND_RGB_SUB); DEC_CONSTS(BLEND_RGB_MULT, PYGAME_BLEND_RGB_MULT); DEC_CONSTS(BLEND_RGB_MIN, PYGAME_BLEND_RGB_MIN); DEC_CONSTS(BLEND_RGB_MAX, PYGAME_BLEND_RGB_MAX); DEC_CONSTS(BLEND_RGBA_ADD, PYGAME_BLEND_RGBA_ADD); DEC_CONSTS(BLEND_RGBA_SUB, PYGAME_BLEND_RGBA_SUB); DEC_CONSTS(BLEND_RGBA_MULT, PYGAME_BLEND_RGBA_MULT); DEC_CONSTS(BLEND_RGBA_MIN, PYGAME_BLEND_RGBA_MIN); DEC_CONSTS(BLEND_RGBA_MAX, PYGAME_BLEND_RGBA_MAX); DEC_CONST(NOEVENT); DEC_CONST(ACTIVEEVENT); DEC_CONST(KEYDOWN); DEC_CONST(KEYUP); DEC_CONST(MOUSEMOTION); DEC_CONST(MOUSEBUTTONDOWN); DEC_CONST(MOUSEBUTTONUP); DEC_CONST(JOYAXISMOTION); DEC_CONST(JOYBALLMOTION); DEC_CONST(JOYHATMOTION); DEC_CONST(JOYBUTTONDOWN); DEC_CONST(JOYBUTTONUP); DEC_CONST(VIDEORESIZE); DEC_CONST(VIDEOEXPOSE); DEC_CONST(QUIT); DEC_CONST(SYSWMEVENT); DEC_CONST(USEREVENT); DEC_CONST(NUMEVENTS); DEC_CONST(HAT_CENTERED); DEC_CONST(HAT_UP); DEC_CONST(HAT_RIGHTUP); DEC_CONST(HAT_RIGHT); DEC_CONST(HAT_RIGHTDOWN); DEC_CONST(HAT_DOWN); DEC_CONST(HAT_LEFTDOWN); DEC_CONST(HAT_LEFT); DEC_CONST(HAT_LEFTUP); DEC_CONSTK(K_UNKNOWN); DEC_CONSTK(K_FIRST); DEC_CONSTK(K_BACKSPACE); DEC_CONSTK(K_TAB); DEC_CONSTK(K_CLEAR); DEC_CONSTK(K_RETURN); DEC_CONSTK(K_PAUSE); DEC_CONSTK(K_ESCAPE); DEC_CONSTK(K_SPACE); DEC_CONSTK(K_EXCLAIM); DEC_CONSTK(K_QUOTEDBL); DEC_CONSTK(K_HASH); DEC_CONSTK(K_DOLLAR); DEC_CONSTK(K_AMPERSAND); DEC_CONSTK(K_QUOTE); DEC_CONSTK(K_LEFTPAREN); DEC_CONSTK(K_RIGHTPAREN); DEC_CONSTK(K_ASTERISK); DEC_CONSTK(K_PLUS); DEC_CONSTK(K_COMMA); DEC_CONSTK(K_MINUS); DEC_CONSTK(K_PERIOD); DEC_CONSTK(K_SLASH); DEC_CONSTK(K_0); DEC_CONSTK(K_1); DEC_CONSTK(K_2); DEC_CONSTK(K_3); DEC_CONSTK(K_4); DEC_CONSTK(K_5); DEC_CONSTK(K_6); DEC_CONSTK(K_7); DEC_CONSTK(K_8); DEC_CONSTK(K_9); DEC_CONSTK(K_COLON); DEC_CONSTK(K_SEMICOLON); DEC_CONSTK(K_LESS); DEC_CONSTK(K_EQUALS); DEC_CONSTK(K_GREATER); DEC_CONSTK(K_QUESTION); DEC_CONSTK(K_AT); DEC_CONSTK(K_LEFTBRACKET); DEC_CONSTK(K_BACKSLASH); DEC_CONSTK(K_RIGHTBRACKET); DEC_CONSTK(K_CARET); DEC_CONSTK(K_UNDERSCORE); DEC_CONSTK(K_BACKQUOTE); DEC_CONSTK(K_a); DEC_CONSTK(K_b); DEC_CONSTK(K_c); DEC_CONSTK(K_d); DEC_CONSTK(K_e); DEC_CONSTK(K_f); DEC_CONSTK(K_g); DEC_CONSTK(K_h); DEC_CONSTK(K_i); DEC_CONSTK(K_j); DEC_CONSTK(K_k); DEC_CONSTK(K_l); DEC_CONSTK(K_m); DEC_CONSTK(K_n); DEC_CONSTK(K_o); DEC_CONSTK(K_p); DEC_CONSTK(K_q); DEC_CONSTK(K_r); DEC_CONSTK(K_s); DEC_CONSTK(K_t); DEC_CONSTK(K_u); DEC_CONSTK(K_v); DEC_CONSTK(K_w); DEC_CONSTK(K_x); DEC_CONSTK(K_y); DEC_CONSTK(K_z); DEC_CONSTK(K_DELETE); DEC_CONSTK(K_KP0); DEC_CONSTK(K_KP1); DEC_CONSTK(K_KP2); DEC_CONSTK(K_KP3); DEC_CONSTK(K_KP4); DEC_CONSTK(K_KP5); DEC_CONSTK(K_KP6); DEC_CONSTK(K_KP7); DEC_CONSTK(K_KP8); DEC_CONSTK(K_KP9); DEC_CONSTK(K_KP_PERIOD); DEC_CONSTK(K_KP_DIVIDE); DEC_CONSTK(K_KP_MULTIPLY); DEC_CONSTK(K_KP_MINUS); DEC_CONSTK(K_KP_PLUS); DEC_CONSTK(K_KP_ENTER); DEC_CONSTK(K_KP_EQUALS); DEC_CONSTK(K_UP); DEC_CONSTK(K_DOWN); DEC_CONSTK(K_RIGHT); DEC_CONSTK(K_LEFT); DEC_CONSTK(K_INSERT); DEC_CONSTK(K_HOME); DEC_CONSTK(K_END); DEC_CONSTK(K_PAGEUP); DEC_CONSTK(K_PAGEDOWN); DEC_CONSTK(K_F1); DEC_CONSTK(K_F2); DEC_CONSTK(K_F3); DEC_CONSTK(K_F4); DEC_CONSTK(K_F5); DEC_CONSTK(K_F6); DEC_CONSTK(K_F7); DEC_CONSTK(K_F8); DEC_CONSTK(K_F9); DEC_CONSTK(K_F10); DEC_CONSTK(K_F11); DEC_CONSTK(K_F12); DEC_CONSTK(K_F13); DEC_CONSTK(K_F14); DEC_CONSTK(K_F15); DEC_CONSTK(K_NUMLOCK); DEC_CONSTK(K_CAPSLOCK); DEC_CONSTK(K_SCROLLOCK); DEC_CONSTK(K_RSHIFT); DEC_CONSTK(K_LSHIFT); DEC_CONSTK(K_RCTRL); DEC_CONSTK(K_LCTRL); DEC_CONSTK(K_RALT); DEC_CONSTK(K_LALT); DEC_CONSTK(K_RMETA); DEC_CONSTK(K_LMETA); DEC_CONSTK(K_LSUPER); DEC_CONSTK(K_RSUPER); DEC_CONSTK(K_MODE); DEC_CONSTK(K_HELP); DEC_CONSTK(K_PRINT); DEC_CONSTK(K_SYSREQ); DEC_CONSTK(K_BREAK); DEC_CONSTK(K_MENU); DEC_CONSTK(K_POWER); DEC_CONSTK(K_EURO); DEC_CONSTK(K_LAST); DEC_CONSTN(KMOD_NONE); DEC_CONSTN(KMOD_LSHIFT); DEC_CONSTN(KMOD_RSHIFT); DEC_CONSTN(KMOD_LCTRL); DEC_CONSTN(KMOD_RCTRL); DEC_CONSTN(KMOD_LALT); DEC_CONSTN(KMOD_RALT); DEC_CONSTN(KMOD_LMETA); DEC_CONSTN(KMOD_RMETA); DEC_CONSTN(KMOD_NUM); DEC_CONSTN(KMOD_CAPS); DEC_CONSTN(KMOD_MODE); DEC_CONSTN(KMOD_CTRL); DEC_CONSTN(KMOD_SHIFT); DEC_CONSTN(KMOD_ALT); DEC_CONSTN(KMOD_META); MODINIT_RETURN (module); } pygame-1.9.1release/src/color.doc0000644000175000017500000000767011216627051016652 0ustar vincentvincentpygame.Color pygame object for color representations pygame.Color(name): Return Color pygame.Color(r, g, b, a): Return Color pygame.Color(rgbvalue): Return Color The Color class represents RGBA color values using a value range of 0-255. It allows basic arithmetic operations to create new colors, supports conversions to other color spaces such as HSV or HSL and lets you adjust single color channels. Alpha defaults to 255 when not given. 'rgbvalue' can be either a color name, an HTML color format string, a hex number string, or an integer pixel value. The HTML format is '#rrggbbaa', where rr, gg, bb, and aa are 2 digit hex numbers. The alpha aa is optional. A hex number string has the form '0xrrggbbaa', where aa is optional. Color objects support equality comparison with other color objects and 3 or 4 element tuples of integers (New in 1.9.0). There was a bug in pygame 1.8.1 where the default alpha was 0, not 255 like previously. New implementation of Color was done in pygame 1.8.1.
    r Gets or sets the red value of the Color. Color.r: Return int The red value of the Color. g Gets or sets the green value of the Color. Color.g: Return int The green value of the Color. b Gets or sets the blue value of the Color. Color.b: Return int The blue value of the Color. a Gets or sets the alpha value of the Color. Color.a: Return int The alpha value of the Color. cmy Gets or sets the CMY representation of the Color. Color.cmy: Return tuple The CMY representation of the Color. The CMY components are in the ranges C = [0, 1], M = [0, 1], Y = [0, 1]. Note that this will not return the absolutely exact CMY values for the set RGB values in all cases. Due to the RGB mapping from 0-255 and the CMY mapping from 0-1 rounding errors may cause the CMY values to differ slightly from what you might expect. hsva Gets or sets the HSVA representation of the Color. Color.hsva: Return tuple The HSVA representation of the Color. The HSVA components are in the ranges H = [0, 360], S = [0, 100], V = [0, 100], A = [0, 100]. Note that this will not return the absolutely exact HSV values for the set RGB values in all cases. Due to the RGB mapping from 0-255 and the HSV mapping from 0-100 and 0-360 rounding errors may cause the HSV values to differ slightly from what you might expect. hsla Gets or sets the HSLA representation of the Color. Color.hsla: Return tuple The HSLA representation of the Color. The HSLA components are in the ranges H = [0, 360], S = [0, 100], V = [0, 100], A = [0, 100]. Note that this will not return the absolutely exact HSL values for the set RGB values in all cases. Due to the RGB mapping from 0-255 and the HSL mapping from 0-100 and 0-360 rounding errors may cause the HSL values to differ slightly from what you might expect. i1i2i3 Gets or sets the I1I2I3 representation of the Color. Color.i1i2i3: Return tuple The I1I2I3 representation of the Color. The I1I2I3 components are in the ranges I1 = [0, 1], I2 = [-0.5, 0.5], I3 = [-0.5, 0.5]. Note that this will not return the absolutely exact I1I2I3 values for the set RGB values in all cases. Due to the RGB mapping from 0-255 and the I1I2I3 mapping from 0-1 rounding errors may cause the I1I2I3 values to differ slightly from what you might expect. normalize Returns the normalized RGBA values of the Color. Color.normalize(): Return tuple Returns the normalized RGBA values of the Color as floating point values. correct_gamma Applies a certain gamma value to the Color. Color.correct_gamma (gamma): Return Color Applies a certain gamma value to the Color and returns a new Color with the adjusted RGBA values. set_length Set the number of elements in the Color to 1,2,3, or 4. Color.set_length(len) The default Color length is 4. Colors can have lengths 1,2,3 or 4. This is useful if you want to unpack to r,g,b and not r,g,b,a. If you want to get the length of a Color do len(acolor). New in pygame 1.9.0. pygame-1.9.1release/src/color.c0000644000175000017500000013437011225024577016331 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2008 Marcus von Appen This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define PYGAMEAPI_COLOR_INTERNAL #include "pygamedocs.h" #include "pygame.h" #include "pgcompat.h" #include typedef struct { PyObject_HEAD /* RGBA */ Uint8 r; Uint8 g; Uint8 b; Uint8 a; Uint8 len; } PyColor; typedef enum { TRISTATE_SUCCESS, TRISTATE_FAIL, TRISTATE_ERROR } tristate; static PyObject *_COLORDICT = NULL; static int _get_double (PyObject *obj, double *val); static int _get_color (PyObject *val, Uint32 *color); static int _hextoint (char *hex, Uint8 *val); static tristate _hexcolor (PyObject *color, Uint8 rgba[]); static int _coerce_obj(PyObject *obj, Uint8 rgba[]); static PyColor* _color_new_internal (PyTypeObject *type, Uint8 rgba[]); static PyColor* _color_new_internal_length (PyTypeObject *type, Uint8 rgba[], Uint8 length); static PyObject* _color_new (PyTypeObject *type, PyObject *args, PyObject *kwds); static void _color_dealloc (PyColor *color); static PyObject* _color_repr (PyColor *color); static PyObject* _color_normalize (PyColor *color); static PyObject* _color_correct_gamma (PyColor *color, PyObject *args); static PyObject* _color_set_length (PyColor *color, PyObject *args); /* Getters/setters */ static PyObject* _color_get_r (PyColor *color, void *closure); static int _color_set_r (PyColor *color, PyObject *value, void *closure); static PyObject* _color_get_g (PyColor *color, void *closure); static int _color_set_g (PyColor *color, PyObject *value, void *closure); static PyObject* _color_get_b (PyColor *color, void *closure); static int _color_set_b (PyColor *color, PyObject *value, void *closure); static PyObject* _color_get_a (PyColor *color, void *closure); static int _color_set_a (PyColor *color, PyObject *value, void *closure); static PyObject* _color_get_hsva (PyColor *color, void *closure); static int _color_set_hsva (PyColor *color, PyObject *value, void *closure); static PyObject* _color_get_hsla (PyColor *color, void *closure); static int _color_set_hsla (PyColor *color, PyObject *value, void *closure); static PyObject* _color_get_i1i2i3 (PyColor *color, void *closure); static int _color_set_i1i2i3 (PyColor *color, PyObject *value, void *closure); static PyObject* _color_get_cmy (PyColor *color, void *closure); static int _color_set_cmy (PyColor *color, PyObject *value, void *closure); /* Number protocol methods */ static PyObject* _color_add (PyColor *color1, PyColor *color2); static PyObject* _color_sub (PyColor *color1, PyColor *color2); static PyObject* _color_mul (PyColor *color1, PyColor *color2); static PyObject* _color_div (PyColor *color1, PyColor *color2); static PyObject* _color_mod (PyColor *color1, PyColor *color2); static PyObject* _color_inv (PyColor *color); #if !PY3 static int _color_coerce (PyObject **pv, PyObject **pw); #endif static PyObject* _color_int (PyColor *color); static PyObject* _color_long (PyColor *color); static PyObject* _color_float (PyColor *color); #if !PY3 static PyObject* _color_oct (PyColor *color); static PyObject* _color_hex (PyColor *color); #endif /* Sequence protocol methods */ static Py_ssize_t _color_length (PyColor *color); static PyObject* _color_item (PyColor *color, Py_ssize_t _index); static int _color_ass_item (PyColor *color, Py_ssize_t _index, PyObject *value); static PyObject * _color_slice(register PyColor *a, register Py_ssize_t ilow, register Py_ssize_t ihigh); /* Mapping protocol methods. */ static PyObject * _color_subscript(PyColor* self, PyObject* item); /* Comparison */ static PyObject* _color_richcompare(PyObject *o1, PyObject *o2, int opid); /* C API interfaces */ static PyObject* PyColor_New (Uint8 rgba[]); static PyObject* PyColor_NewLength (Uint8 rgba[], Uint8 length); static int RGBAFromColorObj (PyObject *color, Uint8 rgba[]); /** * Methods, which are bound to the PyColor type. */ static PyMethodDef _color_methods[] = { { "normalize", (PyCFunction) _color_normalize, METH_NOARGS, DOC_COLORNORMALIZE }, { "correct_gamma", (PyCFunction) _color_correct_gamma, METH_VARARGS, DOC_COLORCORRECTGAMMA }, { "set_length", (PyCFunction) _color_set_length, METH_VARARGS, DOC_COLORSETLENGTH }, { NULL, NULL, 0, NULL } }; /** * Getters and setters for the PyColor. */ static PyGetSetDef _color_getsets[] = { { "r", (getter) _color_get_r, (setter) _color_set_r, DOC_COLORR, NULL }, { "g", (getter) _color_get_g, (setter) _color_set_g, DOC_COLORG, NULL }, { "b", (getter) _color_get_b, (setter) _color_set_b, DOC_COLORB, NULL }, { "a", (getter) _color_get_a, (setter) _color_set_a, DOC_COLORA, NULL }, { "hsva", (getter) _color_get_hsva, (setter) _color_set_hsva, DOC_COLORHSVA, NULL }, { "hsla", (getter) _color_get_hsla, (setter) _color_set_hsla, DOC_COLORHSLA, NULL }, { "i1i2i3", (getter) _color_get_i1i2i3, (setter) _color_set_i1i2i3, DOC_COLORI1I2I3, NULL }, { "cmy", (getter) _color_get_cmy, (setter) _color_set_cmy, DOC_COLORCMY, NULL }, { NULL, NULL, NULL, NULL, NULL } }; static PyNumberMethods _color_as_number = { (binaryfunc) _color_add, /* nb_add */ (binaryfunc) _color_sub, /* nb_subtract */ (binaryfunc) _color_mul, /* nb_multiply */ #if !PY3 (binaryfunc) _color_div, /* nb_divide */ #endif (binaryfunc) _color_mod, /* nb_remainder */ 0, /* nb_divmod */ 0, /* nb_power */ 0, /* nb_negative */ 0, /* nb_positive */ 0, /* nb_absolute */ 0, /* nb_nonzero / nb_bool*/ (unaryfunc) _color_inv, /* nb_invert */ 0, /* nb_lshift */ 0, /* nb_rshift */ 0, /* nb_and */ 0, /* nb_xor */ 0, /* nb_or */ #if !PY3 _color_coerce, /* nb_coerce */ #endif (unaryfunc) _color_int, /* nb_int */ (unaryfunc) _color_long, /* nb_long */ (unaryfunc) _color_float,/* nb_float */ #if !PY3 (unaryfunc) _color_oct, /* nb_oct */ (unaryfunc) _color_hex, /* nb_hex */ #endif 0, /* nb_inplace_add */ 0, /* nb_inplace_subtract */ 0, /* nb_inplace_multiply */ #if !PY3 0, /* nb_inplace_divide */ #endif 0, /* nb_inplace_remainder */ 0, /* nb_inplace_power */ 0, /* nb_inplace_lshift */ 0, /* nb_inplace_rshift */ 0, /* nb_inplace_and */ 0, /* nb_inplace_xor */ 0, /* nb_inplace_or */ (binaryfunc) _color_div, /* nb_floor_divide */ 0, /* nb_true_divide */ 0, /* nb_inplace_floor_divide */ 0, /* nb_inplace_true_divide */ #if PY_VERSION_HEX >= 0x02050000 (unaryfunc) _color_int, /* nb_index */ #endif }; /** * Sequence interface support for PyColor. */ static PySequenceMethods _color_as_sequence = { (lenfunc) _color_length, /* sq_length */ NULL, /* sq_concat */ NULL, /* sq_repeat */ (ssizeargfunc) _color_item, /* sq_item */ (ssizessizeargfunc)_color_slice, /* sq_slice */ (ssizeobjargproc) _color_ass_item, /* sq_ass_item */ NULL, /* sq_ass_slice */ NULL, /* sq_contains */ NULL, /* sq_inplace_concat */ NULL, /* sq_inplace_repeat */ }; static PyMappingMethods _color_as_mapping = { (lenfunc) _color_length, (binaryfunc)_color_subscript, NULL }; #define DEFERRED_ADDRESS(ADDR) 0 static PyTypeObject PyColor_Type = { TYPE_HEAD (NULL, 0) "pygame.Color", /* tp_name */ sizeof (PyColor), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor) _color_dealloc,/* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_compare */ (reprfunc) _color_repr, /* tp_repr */ &_color_as_number, /* tp_as_number */ &_color_as_sequence, /* tp_as_sequence */ #if PY_VERSION_HEX < 0x02050000 0, #else &_color_as_mapping, /* tp_as_mapping */ #endif 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, DOC_PYGAMECOLOR, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ _color_richcompare, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ _color_methods, /* tp_methods */ 0, /* tp_members */ _color_getsets, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ _color_new, /* tp_new */ #ifndef __SYMBIAN32__ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ 0 /* tp_del */ #endif }; #define PyColor_Check(o) \ ((o)->ob_type == (PyTypeObject *) &PyColor_Type) #define RGB_EQUALS(x,y) \ ((((PyColor *)x)->r == ((PyColor *)y)->r) && \ (((PyColor *)x)->g == ((PyColor *)y)->g) && \ (((PyColor *)x)->b == ((PyColor *)y)->b) && \ (((PyColor *)x)->a == ((PyColor *)y)->a)) static int _get_double (PyObject *obj, double *val) { PyObject *floatobj; if (!(floatobj = PyNumber_Float (obj))) return 0; *val = PyFloat_AsDouble (floatobj); Py_DECREF (floatobj); return 1; } static int _get_color (PyObject *val, Uint32 *color) { if (!val || !color) return 0; #if !PY3 if (PyInt_Check (val)) { long intval = PyInt_AsLong (val); if (intval == -1 && PyErr_Occurred ()) { PyErr_SetString (PyExc_ValueError, "invalid color argument"); return 0; } *color = (Uint32) intval; return 1; } #endif if (PyLong_Check (val)) { unsigned long longval = PyLong_AsUnsignedLong (val); if (PyErr_Occurred ()) { PyErr_SetString (PyExc_ValueError, "invalid color argument"); return 0; } *color = (Uint32) longval; return 1; } /* Failed */ PyErr_SetString (PyExc_ValueError, "invalid color argument"); return 0; } static int _hextoint (char *hex, Uint8 *val) { /* 'hex' is a two digit hexadecimal number, no spaces, no signs. * This algorithm is brute force, but it is character system agnostic. * It is definitely not a general purpose solution. */ Uint8 temp = 0; switch (toupper(hex[0])) { case '0': break; case '1': temp += 0x10; break; case '2': temp += 0x20; break; case '3': temp += 0x30; break; case '4': temp += 0x40; break; case '5': temp += 0x50; break; case '6': temp += 0x60; break; case '7': temp += 0x70; break; case '8': temp += 0x80; break; case '9': temp += 0x90; break; case 'A': temp += 0xA0; break; case 'B': temp += 0xB0; break; case 'C': temp += 0xC0; break; case 'D': temp += 0xD0; break; case 'E': temp += 0xE0; break; case 'F': temp += 0xF0; break; default: return 0; } switch (toupper(hex[1])) { case '0': break; case '1': temp += 0x01; break; case '2': temp += 0x02; break; case '3': temp += 0x03; break; case '4': temp += 0x04; break; case '5': temp += 0x05; break; case '6': temp += 0x06; break; case '7': temp += 0x07; break; case '8': temp += 0x08; break; case '9': temp += 0x09; break; case 'A': temp += 0x0A; break; case 'B': temp += 0x0B; break; case 'C': temp += 0x0C; break; case 'D': temp += 0x0D; break; case 'E': temp += 0x0E; break; case 'F': temp += 0x0F; break; default: return 0; } *val = temp; return 1; } static tristate _hexcolor (PyObject *color, Uint8 rgba[]) { size_t len; tristate rcode = TRISTATE_FAIL; char *name; #if PY3 PyObject* ascii = PyUnicode_AsASCIIString (color); if (ascii == NULL) { rcode = TRISTATE_ERROR; goto Fail; } name = PyBytes_AsString (ascii); #else name = PyString_AsString (color); #endif if (name == NULL) { goto Fail; } len = strlen (name); /* hex colors can be * #RRGGBB * #RRGGBBAA * 0xRRGGBB * 0xRRGGBBAA */ if (len < 7) { goto Fail; } if (name[0] == '#') { if (len != 7 && len != 9) goto Fail; if (!_hextoint (name + 1, &rgba[0])) goto Fail; if (!_hextoint (name + 3, &rgba[1])) goto Fail; if (!_hextoint (name + 5, &rgba[2])) goto Fail; rgba[3] = 255; if (len == 9 && !_hextoint (name + 7, &rgba[3])) goto Fail; goto Success; } else if (name[0] == '0' && name[1] == 'x') { if (len != 8 && len != 10) goto Fail; if (!_hextoint (name + 2, &rgba[0])) goto Fail; if (!_hextoint (name + 4, &rgba[1])) goto Fail; if (!_hextoint (name + 6, &rgba[2])) goto Fail; rgba[3] = 255; if (len == 10 && !_hextoint (name + 8, &rgba[3])) goto Fail; goto Success; } goto Fail; Success: rcode = TRISTATE_SUCCESS; Fail: #if PY3 Py_XDECREF (ascii); #endif return rcode; } static int _coerce_obj (PyObject *obj, Uint8 rgba[]) { if (PyType_IsSubtype (obj->ob_type, &PyColor_Type)) { rgba[0] = ((PyColor *) obj)->r; rgba[1] = ((PyColor *) obj)->g; rgba[2] = ((PyColor *) obj)->b; rgba[3] = ((PyColor *) obj)->a; return 1; } else if (PyType_IsSubtype (obj->ob_type, &PyTuple_Type)) { if (RGBAFromObj (obj, rgba)) { return 1; } else if (PyErr_Occurred ()) { return -1; } } return 0; } static PyColor* _color_new_internal (PyTypeObject *type, Uint8 rgba[]) { /* default length of 4 - r,g,b,a. */ return _color_new_internal_length(type, rgba, 4); } static PyColor* _color_new_internal_length (PyTypeObject *type, Uint8 rgba[], Uint8 length) { PyColor *color = (PyColor *) type->tp_alloc (type, 0); if (!color) return NULL; color->r = rgba[0]; color->g = rgba[1]; color->b = rgba[2]; color->a = rgba[3]; color->len = length; return color; } /** * Creates a new PyColor. */ static PyObject* _color_new (PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *obj = NULL, *obj1 = NULL, *obj2 = NULL, *obj3 = NULL; Uint8 rgba[4]; if (!PyArg_ParseTuple (args, "O|OOO", &obj, &obj1, &obj2, &obj3)) return NULL; if (Text_Check (obj)) { /* Named color */ PyObject *color = NULL; PyObject *name1 = NULL, *name2 = NULL; if (obj1 || obj2 || obj3) return RAISE (PyExc_ValueError, "invalid arguments"); name1 = PyObject_CallMethod(obj, "replace", "(ss)", " ", ""); if (!name1) { return NULL; } name2 = PyObject_CallMethod(name1, "lower", NULL); Py_DECREF(name1); if (!name2) { return NULL; } color = PyDict_GetItem (_COLORDICT, name2); Py_DECREF(name2); if (!color) { switch (_hexcolor (obj, rgba)) { case TRISTATE_FAIL: return RAISE (PyExc_ValueError, "invalid color name"); case TRISTATE_ERROR: return NULL; default: break; } } else if (!RGBAFromObj (color, rgba)) { return RAISE (PyExc_ValueError, "invalid color"); } return (PyObject *) _color_new_internal (type, rgba); } else if (!obj1) { /* Single integer color value or tuple */ Uint32 color; if (_get_color (obj, &color)) { rgba[0] = (Uint8) (color >> 24); rgba[1] = (Uint8) (color >> 16); rgba[2] = (Uint8) (color >> 8); rgba[3] = (Uint8) color; } else if (!RGBAFromObj (obj, rgba)) return RAISE (PyExc_ValueError, "invalid argument"); else return RAISE (PyExc_ValueError, "invalid argument"); return (PyObject *) _color_new_internal (type, rgba); } else { Uint32 color = 0; /* Color (R,G,B[,A]) */ if (!_get_color (obj, &color) || color > 255) return RAISE (PyExc_ValueError, "invalid color argument"); rgba[0] = (Uint8) color; if (!_get_color (obj1, &color) || color > 255) return RAISE (PyExc_ValueError, "invalid color argument"); rgba[1] = (Uint8) color; if (!obj2 || !_get_color (obj2, &color) || color > 255) return RAISE (PyExc_ValueError, "invalid color argument"); rgba[2] = (Uint8) color; if (obj3) { if (!_get_color (obj3, &color) || color > 255) return RAISE (PyExc_ValueError, "invalid color argument"); rgba[3] = (Uint8) color; } else /* No alpha */ rgba[3] = 255; return (PyObject *) _color_new_internal (type, rgba); } } /** * Deallocates the PyColor. */ static void _color_dealloc (PyColor *color) { Py_TYPE(color)->tp_free ((PyObject *) color); } /** * repr(color) */ static PyObject* _color_repr (PyColor *color) { /* Max. would be (255, 255, 255, 255) */ char buf[21]; PyOS_snprintf (buf, sizeof (buf), "(%d, %d, %d, %d)", color->r, color->g, color->b, color->a); return Text_FromUTF8 (buf); } /** * color.normalize () */ static PyObject* _color_normalize (PyColor *color) { double rgba[4]; rgba[0] = color->r / 255.0; rgba[1] = color->g / 255.0; rgba[2] = color->b / 255.0; rgba[3] = color->a / 255.0; return Py_BuildValue ("(ffff)", rgba[0], rgba[1], rgba[2], rgba[3]); } /** * color.correct_gamma (x) */ static PyObject* _color_correct_gamma (PyColor *color, PyObject *args) { double frgba[4]; Uint8 rgba[4]; double _gamma; if (!PyArg_ParseTuple (args, "d", &_gamma)) return NULL; frgba[0] = pow (color->r / 255.0, _gamma); frgba[1] = pow (color->g / 255.0, _gamma); frgba[2] = pow (color->b / 255.0, _gamma); frgba[3] = pow (color->a / 255.0, _gamma); /* visual studio doesn't have a round func, so doing it with +.5 and * truncaction */ rgba[0] = (frgba[0] > 1.0) ? 255 : ((frgba[0] < 0.0) ? 0 : (Uint8) (frgba[0] * 255 + .5)); rgba[1] = (frgba[1] > 1.0) ? 255 : ((frgba[1] < 0.0) ? 0 : (Uint8) (frgba[1] * 255 + .5)); rgba[2] = (frgba[2] > 1.0) ? 255 : ((frgba[2] < 0.0) ? 0 : (Uint8) (frgba[2] * 255 + .5)); rgba[3] = (frgba[3] > 1.0) ? 255 : ((frgba[3] < 0.0) ? 0 : (Uint8) (frgba[3] * 255 + .5)); return (PyObject *) _color_new_internal (&PyColor_Type, rgba); } /** * color.r */ static PyObject* _color_get_r (PyColor *color, void *closure) { return PyInt_FromLong (color->r); } /** * color.r = x */ static int _color_set_r (PyColor *color, PyObject *value, void *closure) { Uint32 c; if (!_get_color (value, &c)) return -1; if (c > 255) { PyErr_SetString (PyExc_ValueError, "color exceeds allowed range"); return -1; } color->r = c; return 0; } /** * color.g */ static PyObject* _color_get_g (PyColor *color, void *closure) { return PyInt_FromLong (color->g); } /** * color.g = x */ static int _color_set_g (PyColor *color, PyObject *value, void *closure) { Uint32 c; if (!_get_color (value, &c)) return -1; if (c > 255) { PyErr_SetString (PyExc_ValueError, "color exceeds allowed range"); return -1; } color->g = c; return 0; } /** * color.b */ static PyObject* _color_get_b (PyColor *color, void *closure) { return PyInt_FromLong (color->b); } /** * color.b = x */ static int _color_set_b (PyColor *color, PyObject *value, void *closure) { Uint32 c; if (!_get_color (value, &c)) return -1; if (c > 255) { PyErr_SetString (PyExc_ValueError, "color exceeds allowed range"); return -1; } color->b = c; return 0; } /** * color.a */ static PyObject* _color_get_a (PyColor *color, void *closure) { return PyInt_FromLong (color->a); } /** * color.a = x */ static int _color_set_a (PyColor *color, PyObject *value, void *closure) { Uint32 c; if (!_get_color (value, &c)) return -1; if (c > 255) { PyErr_SetString (PyExc_ValueError, "color exceeds allowed range"); return -1; } color->a = c; return 0; } /** * color.hsva */ static PyObject* _color_get_hsva (PyColor *color, void *closure) { double hsv[3] = { 0, 0, 0 }; double frgb[4]; double minv, maxv, diff; /* Normalize */ frgb[0] = color->r / 255.0; frgb[1] = color->g / 255.0; frgb[2] = color->b / 255.0; frgb[3] = color->a / 255.0; maxv = MAX (MAX (frgb[0], frgb[1]), frgb[2]); minv = MIN (MIN (frgb[0], frgb[1]), frgb[2]); diff = maxv - minv; /* Calculate V */ hsv[2] = 100. * maxv; if (maxv == minv) { hsv[0] = 0; hsv[1] = 0; return Py_BuildValue ("(ffff)", hsv[0], hsv[1], hsv[2], frgb[3] * 100); } /* Calculate S */ hsv[1] = 100. * (maxv - minv) / maxv; /* Calculate H */ if (maxv == frgb[0]) hsv[0] = fmod ((60 * ((frgb[1] - frgb[2]) / diff)), 360.f); else if (maxv == frgb[1]) hsv[0] = (60 * ((frgb[2] - frgb[0]) / diff)) + 120.f; else hsv[0] = (60 * ((frgb[0] - frgb[1]) / diff)) + 240.f; if (hsv[0] < 0) hsv[0] += 360.f; /* H,S,V,A */ return Py_BuildValue ("(ffff)", hsv[0], hsv[1], hsv[2], frgb[3] * 100); } static int _color_set_hsva (PyColor *color, PyObject *value, void *closure) { PyObject *item; double hsva[4] = { 0, 0, 0, 0 }; double f, p, q, t, v, s; int hi; if (!PySequence_Check (value) || PySequence_Size (value) < 3) { PyErr_SetString (PyExc_ValueError, "invalid HSVA value"); return -1; } /* H */ item = PySequence_GetItem (value, 0); if (!item || !_get_double (item, &(hsva[0])) || hsva[0] < 0 || hsva[0] > 360) { Py_XDECREF (item); PyErr_SetString (PyExc_ValueError, "invalid HSVA value"); return -1; } Py_DECREF (item); /* S */ item = PySequence_GetItem (value, 1); if (!item || !_get_double (item, &(hsva[1])) || hsva[1] < 0 || hsva[1] > 100) { Py_XDECREF (item); PyErr_SetString (PyExc_ValueError, "invalid HSVA value"); return -1; } Py_DECREF (item); /* V */ item = PySequence_GetItem (value, 2); if (!item || !_get_double (item, &(hsva[2])) || hsva[2] < 0 || hsva[2] > 100) { Py_XDECREF (item); PyErr_SetString (PyExc_ValueError, "invalid HSVA value"); return -1; } Py_DECREF (item); /* A */ if (PySequence_Size (value) > 3) { item = PySequence_GetItem (value, 3); if (!item || !_get_double (item, &(hsva[3])) || hsva[3] < 0 || hsva[3] > 100) { Py_DECREF (item); PyErr_SetString (PyExc_ValueError, "invalid HSVA value"); return -1; } Py_DECREF (item); } color->a = (Uint8) ((hsva[3] / 100.0f) * 255); s = hsva[1] / 100.f; v = hsva[2] / 100.f; hi = (int) floor (hsva[0] / 60.f); f = (hsva[0] / 60.f) - hi; p = v * (1 - s); q = v * (1 - s * f); t = v * (1 - s * (1 - f)); switch (hi) { case 0: color->r = (Uint8) (v * 255); color->g = (Uint8) (t * 255); color->b = (Uint8) (p * 255); break; case 1: color->r = (Uint8) (q * 255); color->g = (Uint8) (v * 255); color->b = (Uint8) (p * 255); break; case 2: color->r = (Uint8) (p * 255); color->g = (Uint8) (v * 255); color->b = (Uint8) (t * 255); break; case 3: color->r = (Uint8) (p * 255); color->g = (Uint8) (q * 255); color->b = (Uint8) (v * 255); break; case 4: color->r = (Uint8) (t * 255); color->g = (Uint8) (p * 255); color->b = (Uint8) (v * 255); break; case 5: color->r = (Uint8) (v * 255); color->g = (Uint8) (p * 255); color->b = (Uint8) (q * 255); break; default: PyErr_SetString (PyExc_OverflowError, "this is not allowed to happen ever"); return -1; } return 0; } /** * color.hsla */ static PyObject* _color_get_hsla (PyColor *color, void *closure) { double hsl[3] = { 0, 0, 0 }; double frgb[4]; double minv, maxv, diff; /* Normalize */ frgb[0] = color->r / 255.0; frgb[1] = color->g / 255.0; frgb[2] = color->b / 255.0; frgb[3] = color->a / 255.0; maxv = MAX (MAX (frgb[0], frgb[1]), frgb[2]); minv = MIN (MIN (frgb[0], frgb[1]), frgb[2]); diff = maxv - minv; /* Calculate L */ hsl[2] = 50.f * (maxv + minv); /* 1/2 (max + min) */ if (maxv == minv) { hsl[1] = 0; hsl[0] = 0; return Py_BuildValue ("(ffff)", hsl[0], hsl[1], hsl[2], frgb[3] * 100); } /* Calculate S */ if (hsl[2] <= 50) hsl[1] = diff / (maxv + minv); else hsl[1] = diff / (2 - maxv - minv); hsl[1] *= 100.f; /* Calculate H */ if (maxv == frgb[0]) hsl[0] = fmod ((60 * ((frgb[1] - frgb[2]) / diff)), 360.f); else if (maxv == frgb[1]) hsl[0] = (60 * ((frgb[2] - frgb[0]) / diff)) + 120.f; else hsl[0] = (60 * ((frgb[0] - frgb[1]) / diff)) + 240.f; if (hsl[0] < 0) hsl[0] += 360.f; /* H,S,L,A */ return Py_BuildValue ("(ffff)", hsl[0], hsl[1], hsl[2], frgb[3] * 100); } /** * color.hsla = x */ static int _color_set_hsla (PyColor *color, PyObject *value, void *closure) { PyObject *item; double hsla[4] = { 0, 0, 0, 0 }; double ht, h, q, p = 0, s, l = 0; static double onethird = 1.0 / 3.0f; if (!PySequence_Check (value) || PySequence_Size (value) < 3) { PyErr_SetString (PyExc_ValueError, "invalid HSLA value"); return -1; } /* H */ item = PySequence_GetItem (value, 0); if (!item || !_get_double (item, &(hsla[0])) || hsla[0] < 0 || hsla[0] > 360) { Py_XDECREF (item); PyErr_SetString (PyExc_ValueError, "invalid HSLA value"); return -1; } Py_DECREF (item); /* S */ item = PySequence_GetItem (value, 1); if (!item || !_get_double (item, &(hsla[1])) || hsla[1] < 0 || hsla[1] > 100) { Py_XDECREF (item); PyErr_SetString (PyExc_ValueError, "invalid HSLA value"); return -1; } Py_DECREF (item); /* L */ item = PySequence_GetItem (value, 2); if (!item || !_get_double (item, &(hsla[2])) || hsla[2] < 0 || hsla[2] > 100) { Py_XDECREF (item); PyErr_SetString (PyExc_ValueError, "invalid HSLA value"); return -1; } Py_DECREF (item); /* A */ if (PySequence_Size (value) > 3) { item = PySequence_GetItem (value, 3); if (!item || !_get_double (item, &(hsla[3])) || hsla[3] < 0 || hsla[3] > 100) { Py_DECREF (item); PyErr_SetString (PyExc_ValueError, "invalid HSLA value"); return -1; } Py_DECREF (item); } color->a = (Uint8) ((hsla[3] / 100.f) * 255); s = hsla[1] / 100.f; l = hsla[2] / 100.f; if (s == 0) { color->r = (Uint8) (l * 255); color->g = (Uint8) (l * 255); color->b = (Uint8) (l * 255); return 0; } if (l < 0.5f) q = l * (1 + s); else q = l + s - (l * s); p = 2 * l - q; ht = hsla[0] / 360.f; /* Calulate R */ h = ht + onethird; if (h < 0) h += 1; else if (h > 1) h -= 1; if (h < 1./6.f) color->r = (Uint8) ((p + ((q - p) * 6 * h)) * 255); else if (h < 0.5f) color->r = (Uint8) (q * 255); else if (h < 2./3.f) color->r = (Uint8) ((p + ((q - p) * 6 * (2./3.f - h))) * 255); else color->r = (Uint8) (p * 255); /* Calculate G */ h = ht; if (h < 0) h += 1; else if (h > 1) h -= 1; if (h < 1./6.f) color->g = (Uint8) ((p + ((q - p) * 6 * h)) * 255); else if (h < 0.5f) color->g = (Uint8) (q * 255); else if (h < 2./3.f) color->g = (Uint8) ((p + ((q - p) * 6 * (2./3.f - h))) * 255); else color->g = (Uint8) (p * 255); /* Calculate B */ h = ht - onethird; if (h < 0) h += 1; else if (h > 1) h -= 1; if (h < 1./6.f) color->b = (Uint8) ((p + ((q - p) * 6 * h)) * 255); else if (h < 0.5f) color->b = (Uint8) (q * 255); else if (h < 2./3.f) color->b = (Uint8) ((p + ((q - p) * 6 * (2./3.f - h))) * 255); else color->b = (Uint8) (p * 255); return 0; } static PyObject* _color_get_i1i2i3 (PyColor *color, void *closure) { double i1i2i3[3] = { 0, 0, 0 }; double frgb[3]; /* Normalize */ frgb[0] = color->r / 255.0; frgb[1] = color->g / 255.0; frgb[2] = color->b / 255.0; i1i2i3[0] = (frgb[0] + frgb[1] + frgb[2]) / 3.0f; i1i2i3[1] = (frgb[0] - frgb[2]) / 2.0f; i1i2i3[2] = (2 * frgb[1] - frgb[0] - frgb[2]) / 4.0f; return Py_BuildValue ("(fff)", i1i2i3[0], i1i2i3[1], i1i2i3[2]); } static int _color_set_i1i2i3 (PyColor *color, PyObject *value, void *closure) { PyObject *item; double i1i2i3[3] = { 0, 0, 0 }; double ar, ag, ab; /* I1 */ item = PySequence_GetItem (value, 0); if (!item || !_get_double (item, &(i1i2i3[0])) || i1i2i3[0] < 0 || i1i2i3[0] > 1) { Py_XDECREF (item); PyErr_SetString (PyExc_ValueError, "invalid I1I2I3 value"); return -1; } Py_DECREF (item); /* I2 */ item = PySequence_GetItem (value, 1); if (!item || !_get_double (item, &(i1i2i3[1])) || i1i2i3[1] < -0.5f || i1i2i3[1] > 0.5f) { Py_XDECREF (item); PyErr_SetString (PyExc_ValueError, "invalid I1I2I3 value"); return -1; } Py_DECREF (item); /* I3 */ item = PySequence_GetItem (value, 2); if (!item || !_get_double (item, &(i1i2i3[2])) || i1i2i3[2] < -0.5f || i1i2i3[2] > 0.5f) { Py_XDECREF (item); PyErr_SetString (PyExc_ValueError, "invalid I1I2I3 value"); return -1; } Py_DECREF (item); ab = i1i2i3[0] - i1i2i3[1] - 2 * i1i2i3[2] / 3.f; ar = 2 * i1i2i3[1] + ab; ag = 3 * i1i2i3[0] - ar - ab; color->r = (Uint8) (ar * 255); color->g = (Uint8) (ag * 255); color->b = (Uint8) (ab * 255); return 0; } static PyObject* _color_get_cmy (PyColor *color, void *closure) { double cmy[3] = { 0, 0, 0 }; double frgb[3]; /* Normalize */ frgb[0] = color->r / 255.0; frgb[1] = color->g / 255.0; frgb[2] = color->b / 255.0; cmy[0] = 1.0 - frgb[0]; cmy[1] = 1.0 - frgb[1]; cmy[2] = 1.0 - frgb[2]; return Py_BuildValue ("(fff)", cmy[0], cmy[1], cmy[2]); } static int _color_set_cmy (PyColor *color, PyObject *value, void *closure) { PyObject *item; double cmy[3] = { 0, 0, 0 }; /* I1 */ item = PySequence_GetItem (value, 0); if (!item || !_get_double (item, &(cmy[0])) || cmy[0] < 0 || cmy[0] > 1) { Py_XDECREF (item); PyErr_SetString (PyExc_ValueError, "invalid CMY value"); return -1; } Py_DECREF (item); /* I2 */ item = PySequence_GetItem (value, 1); if (!item || !_get_double (item, &(cmy[1])) || cmy[1] < 0 || cmy[1] > 1) { Py_XDECREF (item); PyErr_SetString (PyExc_ValueError, "invalid CMY value"); return -1; } Py_DECREF (item); /* I2 */ item = PySequence_GetItem (value, 2); if (!item || !_get_double (item, &(cmy[2])) || cmy[2] < 0 || cmy[2] > 1) { Py_XDECREF (item); PyErr_SetString (PyExc_ValueError, "invalid CMY value"); return -1; } Py_DECREF (item); color->r = (Uint8) ((1.0 - cmy[0]) * 255); color->g = (Uint8) ((1.0 - cmy[1]) * 255); color->b = (Uint8) ((1.0 - cmy[2]) * 255); return 0; } /* Number protocol methods */ /** * color1 + color2 */ static PyObject* _color_add (PyColor *color1, PyColor *color2) { Uint8 rgba[4]; rgba[0] = MIN (color1->r + color2->r, 255); rgba[1] = MIN (color1->g + color2->g, 255); rgba[2] = MIN (color1->b + color2->b, 255); rgba[3] = MIN (color1->a + color2->a, 255); return (PyObject*) _color_new_internal (&PyColor_Type, rgba); } /** * color1 - color2 */ static PyObject* _color_sub (PyColor *color1, PyColor *color2) { Uint8 rgba[4]; rgba[0] = MAX (color1->r - color2->r, 0); rgba[1] = MAX (color1->g - color2->g, 0); rgba[2] = MAX (color1->b - color2->b, 0); rgba[3] = MAX (color1->a - color2->a, 0); return (PyObject*) _color_new_internal (&PyColor_Type, rgba); } /** * color1 * color2 */ static PyObject* _color_mul (PyColor *color1, PyColor *color2) { Uint8 rgba[4]; rgba[0] = MIN (color1->r * color2->r, 255); rgba[1] = MIN (color1->g * color2->g, 255); rgba[2] = MIN (color1->b * color2->b, 255); rgba[3] = MIN (color1->a * color2->a, 255); return (PyObject*) _color_new_internal (&PyColor_Type, rgba); } /** * color1 / color2 */ static PyObject* _color_div (PyColor *color1, PyColor *color2) { Uint8 rgba[4] = { 0, 0, 0, 0 }; if (color2->r != 0) rgba[0] = color1->r / color2->r; if (color2->g != 0) rgba[1] = color1->g / color2->g; if (color2->b) rgba[2] = color1->b / color2->b; if (color2->a) rgba[3] = color1->a / color2->a; return (PyObject*) _color_new_internal (&PyColor_Type, rgba); } /** * color1 % color2 */ static PyObject* _color_mod (PyColor *color1, PyColor *color2) { Uint8 rgba[4]; rgba[0] = color1->r % color2->r; rgba[1] = color1->g % color2->g; rgba[2] = color1->b % color2->b; rgba[3] = color1->a % color2->a; return (PyObject*) _color_new_internal (&PyColor_Type, rgba); } /** * ~color */ static PyObject* _color_inv (PyColor *color) { Uint8 rgba[4]; rgba[0] = 255 - color->r; rgba[1] = 255 - color->g; rgba[2] = 255 - color->b; rgba[3] = 255 - color->a; return (PyObject*) _color_new_internal (&PyColor_Type, rgba); } #if !PY3 /** * coerce (color1, color2) */ static int _color_coerce (PyObject **pv, PyObject **pw) { if (PyColor_Check (*pw)) { Py_INCREF (*pv); Py_INCREF (*pw); return 0; } return 1; } #endif /** * int(color) */ static PyObject* _color_int (PyColor *color) { Uint32 tmp = (color->r << 24) + (color->g << 16) + (color->b << 8) + color->a; #if !PY3 if (tmp < LONG_MAX) return PyInt_FromLong ((long) tmp); #endif return PyLong_FromUnsignedLong (tmp); } /** * long(color) */ static PyObject* _color_long (PyColor *color) { Uint32 tmp = (color->r << 24) + (color->g << 16) + (color->b << 8) + color->a; return PyLong_FromUnsignedLong (tmp); } /** * float(color) */ static PyObject* _color_float (PyColor *color) { Uint32 tmp = (color->r << 24) + (color->g << 16) + (color->b << 8) + color->a; return PyFloat_FromDouble ((double) tmp); } #if !PY3 /** * oct(color) */ static PyObject* _color_oct (PyColor *color) { char buf[100]; Uint32 tmp = (color->r << 24) + (color->g << 16) + (color->b << 8) + color->a; if (tmp < LONG_MAX) PyOS_snprintf (buf, sizeof (buf), "0%lo", (unsigned long) tmp); else PyOS_snprintf (buf, sizeof (buf), "0%loL", (unsigned long) tmp); return PyString_FromString (buf); } /** * hex(color) */ static PyObject* _color_hex (PyColor *color) { char buf[100]; Uint32 tmp = (color->r << 24) + (color->g << 16) + (color->b << 8) + color->a; if (tmp < LONG_MAX) PyOS_snprintf (buf, sizeof (buf), "0x%lx", (unsigned long) tmp); else { #if PY_VERSION_HEX >= 0x02050000 PyOS_snprintf (buf, sizeof (buf), "0x%lxL", (unsigned long) tmp); #else /* <= 2.4 uses capitalised hex chars. */ PyOS_snprintf (buf, sizeof (buf), "0x%lXL", (unsigned long) tmp); #endif } return Text_FromUTF8 (buf); } #endif /* Sequence protocol methods */ /** * len (color) */ static Py_ssize_t _color_length (PyColor *color) { return color->len; } /** * color.set_length(3) */ static PyObject* _color_set_length (PyColor *color, PyObject *args) { Py_ssize_t clength; if (!PyArg_ParseTuple (args, "k", &clength)) return NULL; if (clength > 4 || clength < 1) { return RAISE (PyExc_ValueError, "Length needs to be 1,2,3, or 4."); } color->len = clength; Py_RETURN_NONE; } /** * color[x] */ static PyObject* _color_item (PyColor *color, Py_ssize_t _index) { if((_index > (color->len-1)) ) { return RAISE (PyExc_IndexError, "invalid index"); } switch (_index) { case 0: return PyInt_FromLong (color->r); case 1: return PyInt_FromLong (color->g); case 2: return PyInt_FromLong (color->b); case 3: return PyInt_FromLong (color->a); default: return RAISE (PyExc_IndexError, "invalid index"); } } static PyObject * _color_subscript(PyColor* self, PyObject* item) { #if PY_VERSION_HEX < 0x02050000 if (PyInt_Check(item)) { Py_ssize_t i; i = 0; #else if (PyIndex_Check(item)) { Py_ssize_t i; i = PyNumber_AsSsize_t(item, PyExc_IndexError); #endif if (i == -1 && PyErr_Occurred()) return NULL; /* if (i < 0) i += PyList_GET_SIZE(self); */ return _color_item(self, i); } if (PySlice_Check(item)) { int len= 4; Py_ssize_t start, stop, step, slicelength; if (PySlice_GetIndicesEx((PySliceObject*)item, len, &start, &stop, &step, &slicelength) < 0) return NULL; if (slicelength <= 0) { return PyTuple_New(0); } else if (step == 1) { return _color_slice(self, start, stop); } else { PyErr_SetString(PyExc_TypeError, "slice steps not supported"); return NULL; } } else { PyErr_Format(PyExc_TypeError, "Color indices must be integers, not %.200s", item->ob_type->tp_name); return NULL; } } /** * color[x] = y */ static int _color_ass_item (PyColor *color, Py_ssize_t _index, PyObject *value) { switch (_index) { case 0: return _color_set_r (color, value, NULL); case 1: return _color_set_g (color, value, NULL); case 2: return _color_set_b (color, value, NULL); case 3: return _color_set_a (color, value, NULL); default: PyErr_SetString (PyExc_IndexError, "invalid index"); break; } return -1; } static PyObject * _color_slice(register PyColor *a, register Py_ssize_t ilow, register Py_ssize_t ihigh) { Py_ssize_t len; Py_ssize_t c1, c2, c3, c4; c1=0;c2=0;c3=0;c4=0; /* printf("ilow :%d:, ihigh:%d:\n", ilow, ihigh); */ if (ilow < 0) ilow = 0; if (ihigh > 3) ihigh = 4; if (ihigh < ilow) ihigh = ilow; len = ihigh - ilow; /* printf("2 ilow :%d:, ihigh:%d: len:%d:\n", ilow, ihigh, len); */ if(ilow == 0) { c1 = a->r; c2 = a->g; c3 = a->b; c4 = a->a; } else if(ilow == 1) { c1 = a->g; c2 = a->b; c3 = a->a; } else if(ilow == 2) { c1 = a->b; c2 = a->a; } else if(ilow == 3) { c1 = a->a; } /* return a tuple depending on which elements are wanted. */ if(len == 4) { return Py_BuildValue ("(iiii)",c1,c2,c3,c4); } else if(len == 3) { return Py_BuildValue ("(iii)",c1,c2,c3); } else if(len == 2) { return Py_BuildValue ("(ii)",c1,c2); } else if(len == 1) { return Py_BuildValue ("(i)",c1); } else { return Py_BuildValue ("()"); } } /* * colorA == colorB * colorA != colorB */ static PyObject* _color_richcompare(PyObject *o1, PyObject *o2, int opid) { Uint8 rgba1[4], rgba2[4]; switch (_coerce_obj (o1, rgba1)) { case -1: return 0; case 0: goto Unimplemented; default: break; } switch (_coerce_obj (o2, rgba2)) { case -1: return 0; case 0: goto Unimplemented; default: break; } switch (opid) { case Py_EQ: return PyBool_FromLong (*((Uint32 *) rgba1) == *((Uint32 *) rgba2)); case Py_NE: return PyBool_FromLong (*((Uint32 *) rgba1) != *((Uint32 *) rgba2)); default: break; } Unimplemented: Py_INCREF (Py_NotImplemented); return Py_NotImplemented; } /**** C API interfaces ****/ static PyObject* PyColor_New (Uint8 rgba[]) { return (PyObject *) _color_new_internal (&PyColor_Type, rgba); } static PyObject* PyColor_NewLength (Uint8 rgba[], Uint8 length) { if(length < 1 || length > 4) { return NULL; } return (PyObject *) _color_new_internal_length (&PyColor_Type, rgba, length); } static int RGBAFromColorObj (PyObject *color, Uint8 rgba[]) { if (PyColor_Check (color)) { rgba[0] = ((PyColor *) color)->r; rgba[1] = ((PyColor *) color)->g; rgba[2] = ((PyColor *) color)->b; rgba[3] = ((PyColor *) color)->a; return 1; } else return RGBAFromObj (color, rgba); } /*DOC*/ static char _color_doc[] = /*DOC*/ "color module for pygame"; MODINIT_DEFINE (color) { PyObject *colordict; PyObject *module; PyObject *apiobj; static void* c_api[PYGAMEAPI_COLOR_NUMSLOTS]; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "color", _color_doc, -1, _color_methods, NULL, NULL, NULL, NULL }; #endif /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } colordict = PyImport_ImportModule ("pygame.colordict"); if (colordict) { PyObject *_dict = PyModule_GetDict (colordict); PyObject *colors = PyDict_GetItemString (_dict, "THECOLORS"); Py_INCREF (colors); _COLORDICT = colors; Py_DECREF (colordict); } else { MODINIT_ERROR; } /* type preparation */ if (PyType_Ready (&PyColor_Type) < 0) { Py_DECREF (_COLORDICT); MODINIT_ERROR; } /* create the module */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 ( MODPREFIX "color", NULL, _color_doc); #endif if (module == NULL) { Py_DECREF (_COLORDICT); MODINIT_ERROR; } PyColor_Type.tp_getattro = PyObject_GenericGetAttr; Py_INCREF (&PyColor_Type); if (PyModule_AddObject (module, "Color", (PyObject *) &PyColor_Type)) { Py_DECREF (&PyColor_Type); Py_DECREF (_COLORDICT); DECREF_MOD(module); MODINIT_ERROR; } Py_INCREF (_COLORDICT); if (PyModule_AddObject (module, "THECOLORS", _COLORDICT)) { Py_DECREF (_COLORDICT); Py_DECREF (_COLORDICT); DECREF_MOD(module); MODINIT_ERROR; } c_api[0] = &PyColor_Type; c_api[1] = PyColor_New; c_api[2] = RGBAFromColorObj; c_api[3] = PyColor_NewLength; apiobj = PyCObject_FromVoidPtr (c_api, NULL); if (apiobj == NULL) { Py_DECREF (_COLORDICT); DECREF_MOD(module); MODINIT_ERROR; } if (PyModule_AddObject (module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_DECREF (apiobj); Py_DECREF (_COLORDICT); DECREF_MOD(module); MODINIT_ERROR; } MODINIT_RETURN (module); } pygame-1.9.1release/src/cdrom.doc0000644000175000017500000001521111016225570016624 0ustar vincentvincentpygame.cdrom pygame module for audio cdrom control The cdrom module manages the CD and DVD drives on a computer. It can also control the playback of audio cd's. This module needs to be initialized before it can do anything. Each CD object you create represents a cdrom drive and must also be initialized individually before it can do most things.
    init initialize the cdrom module pygame.cdrom.init(): return None Initialize the cdrom module. This will scan the system for all CD devices. The module must be initialized before any other functions will work. This automatically happens when you call pygame.init(). It is safe to call this function more than once. quit uninitialize the cdrom module pygame.cdrom.quit(): return None Uninitialize the cdrom module. After you call this any existing CD objects will no longer work. It is safe to call this function more than once. get_init true if the cdrom module is initialized pygame.cdrom.get_init(): return bool Test if the cdrom module is initialized or not. This is different than the CD.init() since each drive must also be initialized individually. get_count number of cd drives on the system pygame.cdrom.get_count(): return count Return the number of cd drives on the system. When you create CD objects you need to pass an integer id that must be lower than this count. The count will be 0 if there are no drives on the system. CD class to manage a cdrom drive pygame.cdrom.CD(id): return CD You can create a CD object for each cdrom on the system. Use pygame.cdrom.get_count() to determine how many drives actually exist. The id argument is an integer of the drive, starting at zero. The CD object is not initialized, you can only call CD.get_id() and CD.get_name() on an uninitialized drive. It is safe to create multiple CD objects for the same drive, they will all cooperate normally.
    init initialize a cdrom drive for use CD.init(): return None Initialize the cdrom drive for use. The drive must be initialized for most CD methods to work. Even if the rest of pygame has been initialized. There may be a brief pause while the drive is initialized. Avoid CD.init() if the program should not stop for a second or two. quit uninitialize a cdrom drive for use CD.quit(): return None Uninitialize a drive for use. Call this when your program will not be accessing the drive for awhile. get_init true if this cd device initialized CD.get_init(): return bool Test if this CDROM device is initialized. This is different than the pygame.cdrom.init() since each drive must also be initialized individually. play start playing audio CD.play(track, start=None, end=None): return None Playback audio from an audio cdrom in the drive. Besides the track number argument, you can also pass a starting and ending time for playback. The start and end time are in seconds, and can limit the section of an audio track played. If you pass a start time but no end, the audio will play to the end of the track. If you pass a start time and 'None' for the end time, the audio will play to the end of the entire disc. See the CD.get_numtracks() and CD.get_track_audio() to find tracks to playback. Note, track 0 is the first track on the CD. Track numbers start at zero. stop stop audio playback CD.stop(): return None Stops playback of audio from the cdrom. This will also lose the current playback position. This method does nothing if the drive isn't already playing audio. pause temporarily stop audio playback CD.pause(): return None Temporarily stop audio playback on the CD. The playback can be resumed at the same point with the CD.resume() method. If the CD is not playing this method does nothing. Note, track 0 is the first track on the CD. Track numbers start at zero. resume unpause audio playback CD.resume(): return None Unpause a paused CD. If the CD is not paused or already playing, this method does nothing. eject eject or open the cdrom drive CD.eject(): return None This will open the cdrom drive and eject the cdrom. If the drive is playing or paused it will be stopped. get_id the index of the cdrom drive CD.get_id(): return id Returns the integer id that was used to create the CD instance. This method can work on an uninitialized CD. get_name the system name of the cdrom drive CD.get_name(): return name Return the string name of the drive. This is the system name used to represent the drive. It is often the drive letter or device name. This method can work on an uninitialized CD. get_busy true if the drive is playing audio CD.get_busy(): return bool Returns True if the drive busy playing back audio. get_paused true if the drive is paused CD.get_paused(): return bool Returns True if the drive is currently paused. get_current the current audio playback position CD.get_current(): return track, seconds Returns both the current track and time of that track. This method works when the drive is either playing or paused. Note, track 0 is the first track on the CD. Track numbers start at zero. get_empty False if a cdrom is in the drive CD.get_empty(): return bool Return False if there is a cdrom currently in the drive. If the drive is empty this will return True. get_numtracks the number of tracks on the cdrom CD.get_numtracks(): return count Return the number of tracks on the cdrom in the drive. This will return zero of the drive is empty or has no tracks. get_track_audio true if the cdrom track has audio data CD.get_track_audio(track): return bool Determine if a track on a cdrom contains audio data. You can also call CD.num_tracks() and CD.get_all() to determine more information about the cdrom. Note, track 0 is the first track on the CD. Track numbers start at zero. get_all get all track information CD.get_all(): return [(audio, start, end, lenth), ...] Return a list with information for every track on the cdrom. The information consists of a tuple with four values. The audio value is True if the track contains audio data. The start, end, and length values are floating point numbers in seconds. Start and end represent absolute times on the entire disc. get_track_start start time of a cdrom track CD.get_track_start(track): return seconds Return the absolute time in seconds where at start of the cdrom track. Note, track 0 is the first track on the CD. Track numbers start at zero. get_track_length length of a cdrom track CD.get_track_length(track): return seconds Return a floating point value in seconds of the length of the cdrom track. Note, track 0 is the first track on the CD. Track numbers start at zero. pygame-1.9.1release/src/cdrom.c0000644000175000017500000004200111207055754016305 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ #define PYGAMEAPI_CDROM_INTERNAL #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" #define CDROM_MAXDRIVES 32 static SDL_CD* cdrom_drivedata[CDROM_MAXDRIVES] = {NULL}; static PyTypeObject PyCD_Type; static PyObject* PyCD_New(int id); #define PyCD_Check(x) ((x)->ob_type == &PyCD_Type) static void cdrom_autoquit (void) { int loop; for (loop = 0; loop < CDROM_MAXDRIVES; ++loop) { if (cdrom_drivedata[loop]) { SDL_CDClose (cdrom_drivedata[loop]); cdrom_drivedata[loop] = NULL; } } if (SDL_WasInit (SDL_INIT_CDROM)) { SDL_QuitSubSystem (SDL_INIT_CDROM); } } static PyObject* cdrom_autoinit (PyObject* self) { if (!SDL_WasInit (SDL_INIT_CDROM)) { if (SDL_InitSubSystem (SDL_INIT_CDROM)) { return PyInt_FromLong (0); } PyGame_RegisterQuit (cdrom_autoquit); } return PyInt_FromLong (1); } static PyObject* cdrom_quit (PyObject* self) { cdrom_autoquit (); Py_RETURN_NONE; } static PyObject* cdrom_init (PyObject* self) { PyObject* result; int istrue; result = cdrom_autoinit (self); istrue = PyObject_IsTrue (result); Py_DECREF (result); if (!istrue) { return RAISE (PyExc_SDLError, SDL_GetError ()); } Py_RETURN_NONE; } static PyObject* get_init (PyObject* self) { return PyInt_FromLong (SDL_WasInit (SDL_INIT_CDROM) != 0); } static void cd_dealloc (PyObject* self) { PyObject_DEL (self); } static PyObject* CD (PyObject* self, PyObject* args) { int id; if (!PyArg_ParseTuple (args, "i", &id)) { return NULL; } CDROM_INIT_CHECK (); return PyCD_New (id); } static PyObject* get_count (PyObject* self) { CDROM_INIT_CHECK (); return PyInt_FromLong (SDL_CDNumDrives ()); } static PyObject* cd_init (PyObject* self) { int cd_id = PyCD_AsID (self); CDROM_INIT_CHECK (); if (!cdrom_drivedata[cd_id]) { cdrom_drivedata[cd_id] = SDL_CDOpen (cd_id); if (!cdrom_drivedata[cd_id]) { return RAISE (PyExc_SDLError, "Cannot initialize device"); } } Py_RETURN_NONE; } static PyObject* cd_quit (PyObject* self) { int cd_id = PyCD_AsID (self); CDROM_INIT_CHECK (); if (cdrom_drivedata[cd_id]) { SDL_CDClose (cdrom_drivedata[cd_id]); cdrom_drivedata[cd_id] = NULL; } Py_RETURN_NONE; } static PyObject* cd_get_init (PyObject* self) { int cd_id = PyCD_AsID (self); return PyInt_FromLong (cdrom_drivedata[cd_id] != NULL); } static PyObject* cd_play (PyObject* self, PyObject* args) { int cd_id = PyCD_AsID (self); SDL_CD* cdrom = cdrom_drivedata[cd_id]; int result, track, startframe, numframes, playforever=0; float start=0.0f, end=0.0f; PyObject *endobject=NULL; if (!PyArg_ParseTuple (args, "i|fO", &track, &start, &endobject)) { return NULL; } if (endobject == Py_None) { playforever = 1; } else if (!PyArg_ParseTuple (args, "i|ff", &track, &start, &end)) { return NULL; } CDROM_INIT_CHECK (); if (!cdrom) { return RAISE (PyExc_SDLError, "CD drive not initialized"); } SDL_CDStatus (cdrom); if (track < 0 || track >= cdrom->numtracks) { return RAISE (PyExc_IndexError, "Invalid track number"); } if (cdrom->track[track].type != SDL_AUDIO_TRACK) { return RAISE (PyExc_SDLError, "CD track type is not audio"); } /*validate times*/ if (playforever) { end = start; } else if (start == end && start != 0.0f) { Py_RETURN_NONE; } startframe = (int)(start * CD_FPS); numframes = 0; if (startframe < 0) { startframe = 0; } if (end) { numframes = (int) ((end-start) * CD_FPS); } else { numframes = cdrom->track[track].length - startframe; } if (numframes < 0 || startframe > (int) (cdrom->track[track].length * CD_FPS)) { Py_RETURN_NONE; } result = SDL_CDPlayTracks (cdrom, track, startframe, 0, numframes); if (result == -1) { return RAISE (PyExc_SDLError, SDL_GetError ()); } Py_RETURN_NONE; } static PyObject* cd_pause (PyObject* self) { int cd_id = PyCD_AsID (self); SDL_CD* cdrom = cdrom_drivedata[cd_id]; int result; CDROM_INIT_CHECK (); if (!cdrom) { return RAISE (PyExc_SDLError, "CD drive not initialized"); } result = SDL_CDPause (cdrom); if (result == -1) { return RAISE (PyExc_SDLError, SDL_GetError ()); } Py_RETURN_NONE; } static PyObject* cd_resume (PyObject* self) { int cd_id = PyCD_AsID (self); SDL_CD* cdrom = cdrom_drivedata[cd_id]; int result; CDROM_INIT_CHECK (); if (!cdrom) { return RAISE (PyExc_SDLError, "CD drive not initialized"); } result = SDL_CDResume (cdrom); if (result == -1) { return RAISE (PyExc_SDLError, SDL_GetError ()); } Py_RETURN_NONE; } static PyObject* cd_stop (PyObject* self) { int cd_id = PyCD_AsID (self); SDL_CD* cdrom = cdrom_drivedata[cd_id]; int result; CDROM_INIT_CHECK (); if (!cdrom) { return RAISE (PyExc_SDLError, "CD drive not initialized"); } result = SDL_CDStop (cdrom); if (result == -1) { return RAISE (PyExc_SDLError, SDL_GetError ()); } Py_RETURN_NONE; } static PyObject* cd_eject (PyObject* self) { int cd_id = PyCD_AsID (self); SDL_CD* cdrom = cdrom_drivedata[cd_id]; int result; CDROM_INIT_CHECK (); if (!cdrom) { return RAISE (PyExc_SDLError, "CD drive not initialized"); } result = SDL_CDEject (cdrom); if (result == -1) { return RAISE (PyExc_SDLError, SDL_GetError ()); } Py_RETURN_NONE; } static PyObject* cd_get_empty (PyObject* self) { int cd_id = PyCD_AsID (self); SDL_CD* cdrom = cdrom_drivedata[cd_id]; int status; CDROM_INIT_CHECK (); if (!cdrom) { return RAISE (PyExc_SDLError, "CD drive not initialized"); } status = SDL_CDStatus (cdrom); return PyInt_FromLong (status == CD_TRAYEMPTY); } static PyObject* cd_get_busy (PyObject* self) { int cd_id = PyCD_AsID (self); SDL_CD* cdrom = cdrom_drivedata[cd_id]; int status; CDROM_INIT_CHECK (); if (!cdrom) { return RAISE (PyExc_SDLError, "CD drive not initialized"); } status = SDL_CDStatus (cdrom); return PyInt_FromLong (status == CD_PLAYING); } static PyObject* cd_get_paused (PyObject* self) { int cd_id = PyCD_AsID (self); SDL_CD* cdrom = cdrom_drivedata[cd_id]; int status; CDROM_INIT_CHECK (); if (!cdrom) { return RAISE (PyExc_SDLError, "CD drive not initialized"); } status = SDL_CDStatus (cdrom); return PyInt_FromLong (status == CD_PAUSED); } static PyObject* cd_get_current (PyObject* self) { int cd_id = PyCD_AsID (self); SDL_CD* cdrom = cdrom_drivedata[cd_id]; int track; float seconds; CDROM_INIT_CHECK (); if (!cdrom) { return RAISE (PyExc_SDLError, "CD drive not initialized"); } SDL_CDStatus (cdrom); track = cdrom->cur_track; seconds = cdrom->cur_frame / (float) CD_FPS; return Py_BuildValue ("(if)", track, seconds); } static PyObject* cd_get_numtracks (PyObject* self) { int cd_id = PyCD_AsID (self); SDL_CD* cdrom = cdrom_drivedata[cd_id]; CDROM_INIT_CHECK (); if (!cdrom) { return RAISE (PyExc_SDLError, "CD drive not initialized"); } SDL_CDStatus (cdrom); return PyInt_FromLong (cdrom->numtracks); } static PyObject* cd_get_id (PyObject* self) { int cd_id = PyCD_AsID (self); return PyInt_FromLong (cd_id); } static PyObject* cd_get_name (PyObject* self) { int cd_id = PyCD_AsID (self); CDROM_INIT_CHECK (); return Text_FromUTF8 (SDL_CDName (cd_id)); } static PyObject* cd_get_track_audio (PyObject* self, PyObject* args) { int cd_id = PyCD_AsID (self); SDL_CD* cdrom = cdrom_drivedata[cd_id]; int track; if (!PyArg_ParseTuple (args, "i", &track)) { return NULL; } CDROM_INIT_CHECK (); if (!cdrom) { return RAISE (PyExc_SDLError, "CD drive not initialized"); } SDL_CDStatus (cdrom); if (track < 0 || track >= cdrom->numtracks) { return RAISE (PyExc_IndexError, "Invalid track number"); } return PyInt_FromLong (cdrom->track[track].type == SDL_AUDIO_TRACK); } static PyObject* cd_get_track_length (PyObject* self, PyObject* args) { int cd_id = PyCD_AsID (self); SDL_CD* cdrom = cdrom_drivedata[cd_id]; int track; if (!PyArg_ParseTuple (args, "i", &track)) { return NULL; } CDROM_INIT_CHECK (); if (!cdrom) { return RAISE (PyExc_SDLError, "CD drive not initialized"); } SDL_CDStatus (cdrom); if (track < 0 || track >= cdrom->numtracks) { return RAISE (PyExc_IndexError, "Invalid track number"); } if (cdrom->track[track].type != SDL_AUDIO_TRACK) { return PyFloat_FromDouble (0.0); } return PyFloat_FromDouble (cdrom->track[track].length / (double) CD_FPS); } static PyObject* cd_get_track_start (PyObject* self, PyObject* args) { int cd_id = PyCD_AsID (self); SDL_CD* cdrom = cdrom_drivedata[cd_id]; int track; if (!PyArg_ParseTuple (args, "i", &track)) { return NULL; } CDROM_INIT_CHECK (); if (!cdrom) { return RAISE (PyExc_SDLError, "CD drive not initialized"); } SDL_CDStatus (cdrom); if (track < 0 || track >= cdrom->numtracks) { return RAISE (PyExc_IndexError, "Invalid track number"); } return PyFloat_FromDouble (cdrom->track[track].offset / (double) CD_FPS); } static PyObject* cd_get_all (PyObject* self, PyObject* args) { int cd_id = PyCD_AsID (self); SDL_CD* cdrom = cdrom_drivedata[cd_id]; int track; PyObject *tuple, *item; CDROM_INIT_CHECK (); if (!cdrom) { return RAISE (PyExc_SDLError, "CD drive not initialized"); } SDL_CDStatus (cdrom); tuple = PyTuple_New (cdrom->numtracks); if (!tuple) { return NULL; } for (track=0; track < cdrom->numtracks; track++) { int audio = cdrom->track[track].type == SDL_AUDIO_TRACK; double start = cdrom->track[track].offset / (double) CD_FPS; double length = cdrom->track[track].length / (double) CD_FPS; double end = start + length; item = PyTuple_New (4); if (!item) { Py_DECREF (tuple); return NULL; } PyTuple_SET_ITEM (item, 0, PyInt_FromLong (audio)); PyTuple_SET_ITEM (item, 1, PyFloat_FromDouble (start)); PyTuple_SET_ITEM (item, 2, PyFloat_FromDouble (end)); PyTuple_SET_ITEM (item, 3, PyFloat_FromDouble (length)); PyTuple_SET_ITEM (tuple, track, item); } return tuple; } static PyMethodDef cd_methods[] = { { "init", (PyCFunction) cd_init, METH_NOARGS, DOC_CDINIT }, { "quit", (PyCFunction) cd_quit, METH_NOARGS, DOC_CDQUIT }, { "get_init", (PyCFunction) cd_get_init, METH_NOARGS, DOC_CDGETINIT }, { "play", cd_play, METH_VARARGS, DOC_CDINIT }, { "pause", (PyCFunction) cd_pause, METH_NOARGS, DOC_CDPAUSE }, { "resume", (PyCFunction) cd_resume, METH_NOARGS, DOC_CDRESUME }, { "stop", (PyCFunction) cd_stop, METH_NOARGS, DOC_CDSTOP }, { "eject", (PyCFunction) cd_eject, METH_NOARGS, DOC_CDEJECT }, { "get_empty", (PyCFunction) cd_get_empty, METH_NOARGS, DOC_CDGETEMPTY }, { "get_busy", (PyCFunction) cd_get_busy, METH_NOARGS, DOC_CDGETBUSY }, { "get_paused", (PyCFunction) cd_get_paused, METH_NOARGS, DOC_CDGETPAUSED }, { "get_current", (PyCFunction) cd_get_current, METH_NOARGS, DOC_CDGETCURRENT }, { "get_numtracks", (PyCFunction) cd_get_numtracks, METH_NOARGS, DOC_CDGETNUMTRACKS }, { "get_id", (PyCFunction) cd_get_id, METH_NOARGS, DOC_CDGETINIT }, { "get_name", (PyCFunction) cd_get_name, METH_NOARGS, DOC_CDGETNAME }, { "get_all", (PyCFunction) cd_get_all, METH_NOARGS, DOC_CDGETALL }, { "get_track_audio", cd_get_track_audio, METH_VARARGS, DOC_CDGETTRACKAUDIO }, { "get_track_length", cd_get_track_length, METH_VARARGS, DOC_CDGETTRACKLENGTH }, { "get_track_start", cd_get_track_start, METH_VARARGS, DOC_CDGETTRACKSTART }, { NULL, NULL, 0, NULL } }; static PyTypeObject PyCD_Type = { TYPE_HEAD (NULL, 0) "CD", /* name */ sizeof(PyCDObject), /* basic size */ 0, /* itemsize */ cd_dealloc, /* dealloc */ 0, /* print */ 0, /* getattr */ 0, /* setattr */ 0, /* compare */ 0, /* repr */ 0, /* as_number */ 0, /* as_sequence */ 0, /* as_mapping */ 0, /* hash */ 0, /* call */ 0, /* str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* flags */ DOC_PYGAMECDROMCD, /* Documentation string */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ cd_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ }; static PyObject* PyCD_New (int id) { PyCDObject* cd; if (id < 0 || id >= CDROM_MAXDRIVES || id >= SDL_CDNumDrives ()) { return RAISE (PyExc_SDLError, "Invalid cdrom device number"); } cd = PyObject_NEW (PyCDObject, &PyCD_Type); if(!cd) { return NULL; } cd->id = id; return (PyObject*)cd; } static PyMethodDef _cdrom_methods[] = { { "__PYGAMEinit__", (PyCFunction) cdrom_autoinit, METH_NOARGS, "auto initialize function" }, { "init", (PyCFunction) cdrom_init, METH_NOARGS, DOC_PYGAMECDROMINIT }, { "quit", (PyCFunction) cdrom_quit, METH_NOARGS, DOC_PYGAMECDROMQUIT }, { "get_init", (PyCFunction) get_init, METH_NOARGS, DOC_PYGAMECDROMGETINIT }, { "get_count", (PyCFunction) get_count, METH_NOARGS, DOC_PYGAMECDROMGETCOUNT }, { "CD", CD, METH_VARARGS, DOC_PYGAMECDROMCD }, { NULL, NULL, 0, NULL } }; MODINIT_DEFINE (cdrom) { PyObject *module, *dict, *apiobj; int ecode; static void* c_api[PYGAMEAPI_CDROM_NUMSLOTS]; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "cdrom", DOC_PYGAMECDROM, -1, _cdrom_methods, NULL, NULL, NULL, NULL }; #endif /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { MODINIT_ERROR; } /* type preparation */ if (PyType_Ready (&PyCD_Type) == -1) { MODINIT_ERROR; } /* create the module */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "cdrom", _cdrom_methods, DOC_PYGAMECDROM); #endif if (module == NULL) { MODINIT_ERROR; } dict = PyModule_GetDict (module); if (PyDict_SetItemString (dict, "CDType", (PyObject *)&PyCD_Type) == -1) { DECREF_MOD (module); MODINIT_ERROR; } /* export the c api */ c_api[0] = &PyCD_Type; c_api[1] = PyCD_New; apiobj = PyCObject_FromVoidPtr (c_api, NULL); if (apiobj == NULL) { DECREF_MOD (module); MODINIT_ERROR; } ecode = PyDict_SetItemString (dict, PYGAMEAPI_LOCAL_ENTRY, apiobj); Py_DECREF (apiobj); if (ecode == -1) { DECREF_MOD (module); MODINIT_ERROR; } MODINIT_RETURN (module); } pygame-1.9.1release/src/camera_v4l2.c0000644000175000017500000004615011067604256017312 0ustar vincentvincent/* pygame - Python Game Library This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #if defined(__unix__) #include "camera.h" int v4l2_pixelformat (int fd, struct v4l2_format* fmt, unsigned long pixelformat); char** v4l2_list_cameras (int* num_devices) { char** devices; char* device; int num, i, fd; num = *num_devices; devices = (char**) malloc(sizeof(char *)*65); device = (char*) malloc(sizeof(char)*13); strcpy(device,"/dev/video"); fd = open(device, O_RDONLY); if (fd != -1) { devices[num] = device; num++; device = (char*) malloc(sizeof(char)*13); } close(fd); /* v4l2 cameras can be /dev/video and /dev/video0 to /dev/video63 */ for (i = 0; i < 64; i++) { sprintf(device,"/dev/video%d",i); fd = open(device, O_RDONLY); if (fd != -1) { devices[num] = device; num++; device = (char*) malloc(sizeof(char)*13); } close(fd); } if (num == *num_devices) { free(device); } else { *num_devices = num; } return devices; } /* A wrapper around a VIDIOC_S_FMT ioctl to check for format compatibility */ int v4l2_pixelformat (int fd, struct v4l2_format* fmt, unsigned long pixelformat) { fmt->fmt.pix.pixelformat = pixelformat; if (-1 == v4l2_xioctl (fd, VIDIOC_S_FMT, fmt)) { return 0; } if (fmt->fmt.pix.pixelformat == pixelformat) { return 1; } else { return 0; } } /* gets the value of a specific camera control if available */ int v4l2_get_control (int fd, int id, int *value) { struct v4l2_control control; CLEAR(control); control.id = id; if (-1 == v4l2_xioctl (fd, VIDIOC_G_CTRL, &control)) { return 0; } *value = control.value; return 1; } /* sets a control if supported. the camera may round the value */ int v4l2_set_control (int fd, int id, int value) { struct v4l2_control control; CLEAR(control); control.id = id; control.value = value; if (-1 == v4l2_xioctl (fd, VIDIOC_S_CTRL, &control)) { return 0; } return 1; } /* returns a string of the buffer from the camera */ /* TODO: fold this into the regular read_frame. lots of duplicate code */ PyObject* v4l2_read_raw (PyCameraObject* self) { struct v4l2_buffer buf; PyObject* raw; CLEAR (buf); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; if (-1 == v4l2_xioctl (self->fd, VIDIOC_DQBUF, &buf)) { PyErr_Format(PyExc_SystemError, "ioctl(VIDIOC_DQBUF) failure : %d, %s", errno, strerror (errno)); return NULL; } assert (buf.index < self->n_buffers); raw = PyString_FromStringAndSize(self->buffers[buf.index].start, self->buffers[buf.index].length); if (-1 == v4l2_xioctl (self->fd, VIDIOC_QBUF, &buf)) { PyErr_Format(PyExc_SystemError, "ioctl(VIDIOC_QBUF) failure : %d, %s", errno, strerror (errno)); return NULL; } return raw; } /* * Functions for v4l2 cameras. * This code is based partly on pyvideograb by Laurent Pointal at * http://laurent.pointal.org/python/projets/pyvideograb * the v4l2 capture example at * http://www.linuxtv.org/download/video4linux/API/V4L2_API/spec/ * and the HighGUI library in OpenCV. */ int v4l2_xioctl (int fd, int request, void *arg) { int r; do r = ioctl (fd, request, arg); while (-1 == r && EINTR == errno); return r; } /* sends the image to the conversion function based on input format and desired output format. Note that some of the less common conversions are currently two step processes. */ /* TODO: Write single step conversions where they may actually be useful */ int v4l2_process_image (PyCameraObject* self, const void *image, unsigned int buffer_size, SDL_Surface* surf) { if (!surf) return 0; SDL_LockSurface (surf); switch (self->pixelformat) { case V4L2_PIX_FMT_RGB24: if (buffer_size >= self->size * 3) { switch (self->color_out) { case RGB_OUT: rgb24_to_rgb(image, surf->pixels, self->size, surf->format); break; case HSV_OUT: rgb_to_hsv(image, surf->pixels, self->size, V4L2_PIX_FMT_RGB24, surf->format); break; case YUV_OUT: rgb_to_yuv(image, surf->pixels, self->size, V4L2_PIX_FMT_RGB24, surf->format); break; } } else { SDL_UnlockSurface (surf); return 0; } break; case V4L2_PIX_FMT_RGB444: if (buffer_size >= self->size * 2) { switch (self->color_out) { case RGB_OUT: rgb444_to_rgb(image, surf->pixels, self->size, surf->format); break; case HSV_OUT: rgb_to_hsv(image, surf->pixels, self->size, V4L2_PIX_FMT_RGB444, surf->format); break; case YUV_OUT: rgb_to_yuv(image, surf->pixels, self->size, V4L2_PIX_FMT_RGB444, surf->format); break; } } else { SDL_UnlockSurface (surf); return 0; } break; case V4L2_PIX_FMT_YUYV: if (buffer_size >= self->size * 2) { switch (self->color_out) { case YUV_OUT: yuyv_to_yuv(image, surf->pixels, self->size, surf->format); break; case RGB_OUT: yuyv_to_rgb(image, surf->pixels, self->size, surf->format); break; case HSV_OUT: yuyv_to_rgb(image, surf->pixels, self->size, surf->format); rgb_to_hsv(surf->pixels, surf->pixels, self->size, V4L2_PIX_FMT_YUYV, surf->format); break; } } else { SDL_UnlockSurface (surf); return 0; } break; case V4L2_PIX_FMT_SBGGR8: if (buffer_size >= self->size) { switch (self->color_out) { case RGB_OUT: sbggr8_to_rgb(image, surf->pixels, self->width, self->height, surf->format); break; case HSV_OUT: sbggr8_to_rgb(image, surf->pixels, self->width, self->height, surf->format); rgb_to_hsv(surf->pixels, surf->pixels, self->size, V4L2_PIX_FMT_SBGGR8, surf->format); break; case YUV_OUT: sbggr8_to_rgb(image, surf->pixels, self->width, self->height, surf->format); rgb_to_yuv(surf->pixels, surf->pixels, self->size, V4L2_PIX_FMT_SBGGR8, surf->format); break; } } else { SDL_UnlockSurface (surf); return 0; } break; case V4L2_PIX_FMT_YUV420: if (buffer_size >= (self->size * 3) / 2) { switch (self->color_out) { case YUV_OUT: yuv420_to_yuv(image, surf->pixels, self->width, self->height, surf->format); break; case RGB_OUT: yuv420_to_rgb(image, surf->pixels, self->width, self->height, surf->format); break; case HSV_OUT: yuv420_to_rgb(image, surf->pixels, self->width, self->height, surf->format); rgb_to_hsv(surf->pixels, surf->pixels, self->size, V4L2_PIX_FMT_YUV420, surf->format); break; } } else { SDL_UnlockSurface (surf); return 0; } break; } SDL_UnlockSurface (surf); return 1; } /* query each buffer to see if it contains a frame ready to take */ /* FIXME: There needs to be a better way to implement non-blocking frame grabbing than only doing a get_image if query_image returns true. Many cameras will always return false, and will only respond to blocking calls. */ int v4l2_query_buffer (PyCameraObject* self) { int i; for (i = 0; i < self->n_buffers; ++i) { struct v4l2_buffer buf; CLEAR (buf); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; buf.index = i; if (-1 == v4l2_xioctl (self->fd, VIDIOC_QUERYBUF, &buf)) { PyErr_Format(PyExc_MemoryError, "ioctl(VIDIOC_QUERYBUF) failure : %d, %s", errno, strerror (errno)); return 0; } /* is there a buffer on outgoing queue ready for us to take? */ if (buf.flags & V4L2_BUF_FLAG_DONE) return 1; } /* no buffer ready to take */ return 0; } int v4l2_read_frame (PyCameraObject* self, SDL_Surface* surf) { struct v4l2_buffer buf; CLEAR (buf); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; if (-1 == v4l2_xioctl (self->fd, VIDIOC_DQBUF, &buf)) { PyErr_Format(PyExc_SystemError, "ioctl(VIDIOC_DQBUF) failure : %d, %s", errno, strerror (errno)); return 0; } assert (buf.index < self->n_buffers); if (!v4l2_process_image (self, self->buffers[buf.index].start, self->buffers[buf.index].length, surf)) { PyErr_Format(PyExc_SystemError, "image processing error"); return 0; } if (-1 == v4l2_xioctl (self->fd, VIDIOC_QBUF, &buf)) { PyErr_Format(PyExc_SystemError, "ioctl(VIDIOC_QBUF) failure : %d, %s", errno, strerror (errno)); return 0; } return 1; } int v4l2_stop_capturing (PyCameraObject* self) { enum v4l2_buf_type type; type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if (-1 == v4l2_xioctl (self->fd, VIDIOC_STREAMOFF, &type)) { PyErr_Format(PyExc_SystemError, "ioctl(VIDIOC_STREAMOFF) failure : %d, %s", errno, strerror (errno)); return 0; } return 1; } int v4l2_start_capturing (PyCameraObject* self) { unsigned int i; enum v4l2_buf_type type; for (i = 0; i < self->n_buffers; ++i) { struct v4l2_buffer buf; CLEAR (buf); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; buf.index = i; if (-1 == v4l2_xioctl (self->fd, VIDIOC_QBUF, &buf)) { PyErr_Format(PyExc_EnvironmentError, "ioctl(VIDIOC_QBUF) failure : %d, %s", errno, strerror (errno)); return 0; } } type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if (-1 == v4l2_xioctl (self->fd, VIDIOC_STREAMON, &type)) { PyErr_Format(PyExc_EnvironmentError, "ioctl(VIDIOC_STREAMON) failure : %d, %s", errno, strerror (errno)); return 0; } return 1; } int v4l2_uninit_device (PyCameraObject* self) { unsigned int i; for (i = 0; i < self->n_buffers; ++i) { if (-1 == munmap (self->buffers[i].start, self->buffers[i].length)) { PyErr_Format(PyExc_MemoryError, "munmap failure: %d, %s", errno, strerror (errno)); return 0; } } free (self->buffers); return 1; } int v4l2_init_mmap (PyCameraObject* self) { struct v4l2_requestbuffers req; CLEAR (req); /* 2 is the minimum possible, and some drivers will force a higher count. It will likely result in buffer overruns, but for purposes of gaming, it is probably better to drop frames than get old frames. */ req.count = 2; req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory = V4L2_MEMORY_MMAP; if (-1 == v4l2_xioctl (self->fd, VIDIOC_REQBUFS, &req)) { if (EINVAL == errno) { PyErr_Format(PyExc_MemoryError, "%s does not support memory mapping", self->device_name); return 0; } else { PyErr_Format(PyExc_MemoryError, "ioctl(VIDIOC_REQBUFS) failure : %d, %s", errno, strerror (errno)); return 0; } } if (req.count < 2) { PyErr_Format(PyExc_MemoryError, "Insufficient buffer memory on %s\n", self->device_name); return 0; } self->buffers = calloc (req.count, sizeof (*self->buffers)); if (!self->buffers) { PyErr_Format(PyExc_MemoryError, "Out of memory"); return 0; } for (self->n_buffers = 0; self->n_buffers < req.count; ++self->n_buffers) { struct v4l2_buffer buf; CLEAR (buf); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; buf.index = self->n_buffers; if (-1 == v4l2_xioctl (self->fd, VIDIOC_QUERYBUF, &buf)) { PyErr_Format(PyExc_MemoryError, "ioctl(VIDIOC_QUERYBUF) failure : %d, %s", errno, strerror (errno)); return 0; } self->buffers[self->n_buffers].length = buf.length; self->buffers[self->n_buffers].start = mmap (NULL /* start anywhere */, buf.length, PROT_READ | PROT_WRITE /* required */, MAP_SHARED /* recommended */, self->fd, buf.m.offset); if (MAP_FAILED == self->buffers[self->n_buffers].start) { PyErr_Format(PyExc_MemoryError, "mmap failure : %d, %s", errno, strerror (errno)); return 0; } } return 1; } int v4l2_init_device (PyCameraObject* self) { struct v4l2_capability cap; struct v4l2_format fmt; unsigned int min; if (-1 == v4l2_xioctl (self->fd, VIDIOC_QUERYCAP, &cap)) { if (EINVAL == errno) { PyErr_Format(PyExc_SystemError, "%s is not a V4L2 device", self->device_name); return 0; } else { PyErr_Format(PyExc_SystemError, "ioctl(VIDIOC_QUERYCAP) failure : %d, %s", errno, strerror (errno)); return 0; } } if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) { PyErr_Format(PyExc_SystemError, "%s is not a video capture device", self->device_name); return 0; } if (!(cap.capabilities & V4L2_CAP_STREAMING)) { PyErr_Format(PyExc_SystemError, "%s does not support streaming i/o", self->device_name); return 0; } CLEAR (fmt); fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; fmt.fmt.pix.width = self->width; fmt.fmt.pix.height = self->height; fmt.fmt.pix.field = V4L2_FIELD_ANY; /* Find the pixelformat supported by the camera that will take the least processing power to convert to the desired output. Thus, for YUV out, YUYVand YUV420 are first, while for RGB and HSV, the packed RGB formats are first. */ switch (self->color_out) { case YUV_OUT: if (v4l2_pixelformat(self->fd, &fmt, V4L2_PIX_FMT_YUYV)) { self->pixelformat = V4L2_PIX_FMT_YUYV; } else if (v4l2_pixelformat(self->fd, &fmt, V4L2_PIX_FMT_YUV420)) { self->pixelformat = V4L2_PIX_FMT_YUV420; } else if (v4l2_pixelformat(self->fd, &fmt, V4L2_PIX_FMT_RGB24)) { self->pixelformat = V4L2_PIX_FMT_RGB24; } else if (v4l2_pixelformat(self->fd, &fmt, V4L2_PIX_FMT_RGB444)) { self->pixelformat = V4L2_PIX_FMT_RGB444; } else if (v4l2_pixelformat(self->fd, &fmt, V4L2_PIX_FMT_SBGGR8)) { self->pixelformat = V4L2_PIX_FMT_SBGGR8; } else { PyErr_Format(PyExc_SystemError, "ioctl(VIDIOC_S_FMT) failure: no supported formats"); return 0; } break; default: if (v4l2_pixelformat(self->fd, &fmt, V4L2_PIX_FMT_RGB24)) { self->pixelformat = V4L2_PIX_FMT_RGB24; } else if (v4l2_pixelformat(self->fd, &fmt, V4L2_PIX_FMT_RGB444)) { self->pixelformat = V4L2_PIX_FMT_RGB444; } else if (v4l2_pixelformat(self->fd, &fmt, V4L2_PIX_FMT_YUYV)) { self->pixelformat = V4L2_PIX_FMT_YUYV; } else if (v4l2_pixelformat(self->fd, &fmt, V4L2_PIX_FMT_SBGGR8)) { self->pixelformat = V4L2_PIX_FMT_SBGGR8; } else if (v4l2_pixelformat(self->fd, &fmt, V4L2_PIX_FMT_YUV420)) { self->pixelformat = V4L2_PIX_FMT_YUV420; } else { PyErr_Format(PyExc_SystemError, "ioctl(VIDIOC_S_FMT) failure: no supported formats"); return 0; } break; } /* Note VIDIOC_S_FMT may change width and height. */ self->width = fmt.fmt.pix.width; self->height = fmt.fmt.pix.height; self->size = self->width * self->height; self->pixelformat = fmt.fmt.pix.pixelformat; /* Buggy driver paranoia. */ min = fmt.fmt.pix.width * 2; if (fmt.fmt.pix.bytesperline < min) fmt.fmt.pix.bytesperline = min; min = fmt.fmt.pix.bytesperline * fmt.fmt.pix.height; if (fmt.fmt.pix.sizeimage < min) fmt.fmt.pix.sizeimage = min; v4l2_init_mmap (self); return 1; } int v4l2_close_device (PyCameraObject* self) { if (self->fd==-1) return 1; if (-1 == close (self->fd)) { PyErr_Format(PyExc_SystemError, "Cannot close '%s': %d, %s", self->device_name, errno, strerror (errno)); return 0; } self->fd = -1; return 1; } int v4l2_open_device (PyCameraObject* self) { struct stat st; if (-1 == stat (self->device_name, &st)) { PyErr_Format(PyExc_SystemError, "Cannot identify '%s': %d, %s", self->device_name, errno, strerror (errno)); return 0; } if (!S_ISCHR (st.st_mode)) { PyErr_Format(PyExc_SystemError, "%s is no device",self->device_name); return 0; } self->fd = open (self->device_name, O_RDWR /* required | O_NONBLOCK */, 0); if (-1 == self->fd) { PyErr_Format(PyExc_SystemError, "Cannot open '%s': %d, %s", self->device_name, errno, strerror (errno)); return 0; } return 1; } #endif pygame-1.9.1release/src/camera_v4l.c0000644000175000017500000000430111067604256017220 0ustar vincentvincent/* pygame - Python Game Library This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #if defined(__unix__) #include "camera.h" /* * V4L functions */ int v4l_open_device (PyCameraObject* self) { struct stat st; struct video_capability cap; struct video_mbuf buf; if (-1 == stat (self->device_name, &st)) { PyErr_Format(PyExc_SystemError, "Cannot identify '%s': %d, %s", self->device_name, errno, strerror (errno)); return 0; } if (!S_ISCHR (st.st_mode)) { PyErr_Format(PyExc_SystemError, "%s is no device",self->device_name); return 0; } self->fd = open (self->device_name, O_RDWR /* required | O_NONBLOCK */, 0); if (-1 == self->fd) { PyErr_Format(PyExc_SystemError, "Cannot open '%s': %d, %s", self->device_name, errno, strerror (errno)); return 0; } if(ioctl(self->fd, VIDIOCGCAP, cap) == -1) { PyErr_Format(PyExc_SystemError, "%s is not a V4L device", self->device_name); return 0; } if(!(cap.type & VID_TYPE_CAPTURE)) { PyErr_Format(PyExc_SystemError, "%s is not a video capture device", self->device_name); return 0; } if( ioctl(self->fd , VIDIOCGMBUF , buf ) == -1 ) { PyErr_Format(PyExc_SystemError, "%s does not support streaming i/o", self->device_name); return 0; } return 1; } int v4l_init_device(PyCameraObject* self) { return 0; } int v4l_start_capturing(PyCameraObject* self) { return 0; } #endif pygame-1.9.1release/src/camera.h0000644000175000017500000001000411073537726016441 0ustar vincentvincent/* pygame - Python Game Library This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "pygame.h" #include "pygamedocs.h" #if defined(__unix__) #include #include #include #include #include #include #include /* low-level i/o */ #include #include #include #include #include #include #include #include /* for videodev2.h */ #include #include #endif #define CLEAR(x) memset (&(x), 0, sizeof (x)) #define SAT(c) if (c & (~255)) { if (c < 0) c = 0; else c = 255; } #define SAT2(c) ((c) & (~255) ? ((c) < 0 ? 0 : 255) : (c)) #define DEFAULT_WIDTH 640 #define DEFAULT_HEIGHT 480 #define RGB_OUT 1 #define YUV_OUT 2 #define HSV_OUT 4 #define CAM_V4L 1 #define CAM_V4L2 2 struct buffer { void * start; size_t length; }; typedef struct { PyObject_HEAD char* device_name; int camera_type; unsigned long pixelformat; unsigned int color_out; struct buffer* buffers; unsigned int n_buffers; int width; int height; int size; int hflip; int vflip; int brightness; int fd; } PyCameraObject; /* internal functions for colorspace conversion */ void colorspace (SDL_Surface *src, SDL_Surface *dst, int cspace); void rgb24_to_rgb (const void* src, void* dst, int length, SDL_PixelFormat* format); void rgb444_to_rgb (const void* src, void* dst, int length, SDL_PixelFormat* format); void rgb_to_yuv (const void* src, void* dst, int length, unsigned long source, SDL_PixelFormat* format); void rgb_to_hsv (const void* src, void* dst, int length, unsigned long source, SDL_PixelFormat* format); void yuyv_to_rgb (const void* src, void* dst, int length, SDL_PixelFormat* format); void yuyv_to_yuv (const void* src, void* dst, int length, SDL_PixelFormat* format); void sbggr8_to_rgb (const void* src, void* dst, int width, int height, SDL_PixelFormat* format); void yuv420_to_rgb (const void* src, void* dst, int width, int height, SDL_PixelFormat* format); void yuv420_to_yuv (const void* src, void* dst, int width, int height, SDL_PixelFormat* format); #if defined(__unix__) /* internal functions specific to v4l2 */ char** v4l2_list_cameras (int* num_devices); int v4l2_get_control (int fd, int id, int *value); int v4l2_set_control (int fd, int id, int value); PyObject* v4l2_read_raw (PyCameraObject* self); int v4l2_xioctl (int fd, int request, void *arg); int v4l2_process_image (PyCameraObject* self, const void *image, unsigned int buffer_size, SDL_Surface* surf); int v4l2_query_buffer (PyCameraObject* self); int v4l2_read_frame (PyCameraObject* self, SDL_Surface* surf); int v4l2_stop_capturing (PyCameraObject* self); int v4l2_start_capturing (PyCameraObject* self); int v4l2_uninit_device (PyCameraObject* self); int v4l2_init_mmap (PyCameraObject* self); int v4l2_init_device (PyCameraObject* self); int v4l2_close_device (PyCameraObject* self); int v4l2_open_device (PyCameraObject* self); /* internal functions specific to v4l */ int v4l_open_device (PyCameraObject* self); int v4l_init_device(PyCameraObject* self); int v4l_start_capturing(PyCameraObject* self); #endif pygame-1.9.1release/src/camera.doc0000644000175000017500000001307111206601410016742 0ustar vincentvincentpygame.camera pygame module for camera use Pygame currently supports only Linux and v4l2 cameras. EXPERIMENTAL!: This api may change or disappear in later pygame releases. If you use this, your code will very likely break with the next pygame release. The Bayer to RGB function is based on: Sonix SN9C101 based webcam basic I/F routines Copyright (C) 2004 Takafumi Mizuno 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. THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. New in pygame 1.9.0.
    colorspace Surface colorspace conversion pygame.camera.colorspace(Surface, format, DestSurface = None): return Surface Allows for conversion from "RGB" to a destination colorspace of "HSV" or "YUV". The source and destination surfaces must be the same size and pixel depth. This is useful for computer vision on devices with limited processing power. Capture as small of an image as possible, transform.scale() it even smaller, and then convert the colorspace to YUV or HSV before doing any processing on it. list_cameras returns a list of available cameras pygame.camera.list_cameras(): return [cameras] Checks the computer for available cameras and returns a list of strings of camera names, ready to be fed into pygame.camera.Camera. Camera load a camera pygame.camera.Camera(device, (width, height), format): return Camera Loads a v4l2 camera. The device is typically something like "/dev/video0". Default width and height are 640 by 480. Format is the desired colorspace of the output. This is useful for computer vision purposes. The default is RGB. The following are supported: * RGB - Red, Green, Blue * YUV - Luma, Blue Chrominance, Red Chrominance * HSV - Hue, Saturation, Value
    start opens, initializes, and starts capturing Camera.start(): return None Opens the camera device, attempts to initialize it, and begins recording images to a buffer. The camera must be started before any of the below functions can be used. stop stops, uninitializes, and closes the camera Camera.stop(): return None Stops recording, uninitializes the camera, and closes it. Once a camera is stopped, the below functions cannot be used until it is started again. get_controls gets current values of user controls Camera.get_controls(): return (hflip = bool, vflip = bool, brightness) If the camera supports it, get_controls will return the current settings for horizontal and vertical image flip as bools and brightness as an int. If unsupported, it will return the default values of (0, 0, 0). Note that the return values here may be different than those returned by set_controls, though these are more likely to be correct. set_controls changes camera settings if supported by the camera Camera.set_controls(hflip = bool, vflip = bool, brightness): return (hflip = bool, vflip = bool, brightness) Allows you to change camera settings if the camera supports it. The return values will be the input values if the camera claims it succeeded or the values previously in use if not. Each argument is optional, and the desired one can be chosen by supplying the keyword, like hflip. Note that the actual settings being used by the camera may not be the same as those returned by set_controls. get_size returns the dimensions of the images being recorded Camera.get_size(): return (width, height) Returns the current dimensions of the images being captured by the camera. This will return the actual size, which may be different than the one specified during initialization if the camera did not support that size. query_image checks if a frame is ready Camera.query_image(): return bool If an image is ready to get, it returns true. Otherwise it returns false. Note that some webcams will always return False and will only queue a frame when called with a blocking function like get_image(). This is useful to separate the framerate of the game from that of the camera without having to use threading. get_image captures an image as a Surface Camera.get_image(Surface = None): return Surface Pulls an image off of the buffer as an RGB Surface. It can optionally reuse an existing Surface to save time. The bit depth of the surface is either 24bits or the same as the optionally supplied Surface. get_raw returns an unmodified image as a string Camera.get_raw(): return string Gets an image from a camera as a string in the native pixelformat of the camera. Useful for integration with other libraries. pygame-1.9.1release/src/bufferproxy.c0000644000175000017500000002766411207055754017576 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2007 Marcus von Appen This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define PYGAMEAPI_BUFFERPROXY_INTERNAL #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" static PyObject* _bufferproxy_new (PyTypeObject *type, PyObject *args, PyObject *kwds); static void _bufferproxy_dealloc (PyBufferProxy *self); static PyObject* _bufferproxy_get_dict (PyBufferProxy *self, void *closure); static PyObject* _bufferproxy_get_raw (PyBufferProxy *self, void *closure); static PyObject* _bufferproxy_get_length (PyBufferProxy *self, void *closure); static PyObject* _bufferproxy_repr (PyBufferProxy *self); static PyObject* _bufferproxy_write (PyBufferProxy *buffer, PyObject *args); /* Buffer methods */ #if PY3 static int _bufferproxy_getbuffer (PyBufferProxy *self, Py_buffer *view, int flags); static void _bufferproxy_releasebuffer (PyBufferProxy *self, Py_buffer *view); #else static Py_ssize_t _bufferproxy_getreadbuf (PyBufferProxy *buffer, Py_ssize_t _index, const void **ptr); static Py_ssize_t _bufferproxy_getwritebuf (PyBufferProxy *buffer, Py_ssize_t _index, const void **ptr); static Py_ssize_t _bufferproxy_getsegcount (PyBufferProxy *buffer, Py_ssize_t *lenp); #endif /* C API interfaces */ static PyObject* PyBufferProxy_New (PyObject *parent, void *buffer, Py_ssize_t length, PyObject *lock); /** * Methods, which are bound to the PyBufferProxy type. */ static PyMethodDef _bufferproxy_methods[] = { { "write", (PyCFunction) _bufferproxy_write, METH_VARARGS, "B.write (bufferproxy, buffer, offset) -> None\n\n" \ "Writes raw data to the bufferproxy.\n\n" \ "Writes the raw data from buffer to the BufferProxy object, starting\n" \ "at the specified offset within the BufferProxy.\n" \ "If the length of the passed buffer exceeds the length of the\n" \ "BufferProxy (reduced by the offset), an IndexError will be raised." }, { NULL, NULL, 0, NULL } }; /** * Getters and setters for the PyBufferProxy. */ static PyGetSetDef _bufferproxy_getsets[] = { { "__dict__", (getter) _bufferproxy_get_dict, NULL, NULL, NULL }, { "raw", (getter) _bufferproxy_get_raw, NULL, "The raw buffer data as string. The string may contain NUL bytes.", NULL }, { "length", (getter) _bufferproxy_get_length, NULL, "The size of the buffer data in bytes.", NULL }, { NULL, NULL, NULL, NULL, NULL } }; /** * Buffer interface support for the PyBufferProxy. */ #if PY3 static PyBufferProcs _bufferproxy_as_buffer = { (getbufferproc) _bufferproxy_getbuffer, (releasebufferproc) _bufferproxy_releasebuffer }; #else static PyBufferProcs _bufferproxy_as_buffer = { (readbufferproc) _bufferproxy_getreadbuf, (writebufferproc) _bufferproxy_getwritebuf, (segcountproc) _bufferproxy_getsegcount, NULL, #if PY_VERSION_HEX >= 0x02060000 NULL, NULL #endif }; #endif static PyTypeObject PyBufferProxy_Type = { TYPE_HEAD (NULL, 0) "pygame.bufferproxy.BufferProxy", /* tp_name */ sizeof (PyBufferProxy), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor) _bufferproxy_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_compare */ (reprfunc) &_bufferproxy_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ &_bufferproxy_as_buffer, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, "BufferProxy () -> BufferProxy\n\n" \ "Creates a new, empty BufferProxy.\n\n" \ "A BufferProxy usually should be constructed from C code, not Python.", 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ offsetof (PyBufferProxy, weakrefs), /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ _bufferproxy_methods, /* tp_methods */ 0, /* tp_members */ _bufferproxy_getsets, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ offsetof (PyBufferProxy, dict), /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ _bufferproxy_new, /* tp_new */ #ifndef __SYMBIAN32__ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ 0 /* tp_del */ #endif }; /** * Creates a new PyBufferProxy. */ static PyObject* _bufferproxy_new (PyTypeObject *type, PyObject *args, PyObject *kwds) { PyBufferProxy *self = (PyBufferProxy *) type->tp_alloc (type, 0); if (!self) return NULL; self->weakrefs = NULL; self->dict = NULL; self->parent = NULL; self->buffer = NULL; self->lock = NULL; return (PyObject *) self; } /** * Deallocates the PyBufferProxy and its members. */ static void _bufferproxy_dealloc (PyBufferProxy *self) { if (self->weakrefs) PyObject_ClearWeakRefs ((PyObject *) self); Py_XDECREF (self->lock); Py_XDECREF (self->dict); Py_TYPE(self)->tp_free ((PyObject *) self); } /**** Getter and setter access ****/ /** * Getter for PyBufferProxy.__dict__. */ static PyObject* _bufferproxy_get_dict (PyBufferProxy *self, void *closure) { if (!self->dict) { self->dict = PyDict_New (); if (!self->dict) return NULL; } Py_INCREF (self->dict); return self->dict; } /** * Getter for PyBufferProxy.raw. */ static PyObject* _bufferproxy_get_raw (PyBufferProxy *self, void *closure) { return Bytes_FromStringAndSize (self->buffer, self->length); } /** * Getter for PyBufferProxy.length */ static PyObject* _bufferproxy_get_length (PyBufferProxy *self, void *closure) { return PyInt_FromLong (self->length); } /**** Methods ****/ /** * Representation method. */ static PyObject* _bufferproxy_repr (PyBufferProxy *self) { /* zd is for Py_size_t which python < 2.5 doesn't have. */ #if PY_VERSION_HEX < 0x02050000 return PyString_FromFormat("", self->length); #else return Text_FromFormat("", self->length); #endif } /** * Writes raw data to the buffer. */ static PyObject* _bufferproxy_write (PyBufferProxy *buffer, PyObject *args) { Py_ssize_t offset; Py_ssize_t length; char *buf; if (!PyArg_ParseTuple (args, "s#i", &buf, &length, &offset)) return NULL; if (offset + length > buffer->length) { return RAISE (PyExc_IndexError, "bytes to write exceed buffer size"); } memcpy (((Uint8 *)buffer->buffer) + offset, buf, (size_t) length); Py_RETURN_NONE; } /**** Buffer interfaces ****/ #if PY3 static int _bufferproxy_getbuffer (PyBufferProxy *self, Py_buffer *view, int flags) { if (!view) return 0; Py_INCREF (self); /* Guarantee that the object does not get destroyed */ return PyBuffer_FillInfo (view, (PyObject*)self, self->buffer, self->length, 0, flags); } static void _bufferproxy_releasebuffer (PyBufferProxy *self, Py_buffer *view) { Py_DECREF (self); } #else /* PY3 */ static Py_ssize_t _bufferproxy_getreadbuf (PyBufferProxy *buffer, Py_ssize_t _index, const void **ptr) { if (_index != 0) { PyErr_SetString (PyExc_SystemError, "Accessing non-existent buffer segment"); return -1; } if (!buffer->parent) { *ptr = NULL; return 0; } *ptr = buffer->buffer; return buffer->length; } static Py_ssize_t _bufferproxy_getwritebuf (PyBufferProxy *buffer, Py_ssize_t _index, const void **ptr) { if (_index != 0) { PyErr_SetString (PyExc_SystemError, "Accessing non-existent array segment"); return -1; } if (!buffer->parent) { *ptr = NULL; return 0; } *ptr = buffer->buffer; return buffer->length; } static Py_ssize_t _bufferproxy_getsegcount (PyBufferProxy *buffer, Py_ssize_t *lenp) { if (!buffer->parent) { *lenp = 0; return 0; } if (lenp) *lenp = buffer->length; return 1; } #endif /* PY3 */ static PyObject* PyBufferProxy_New (PyObject *parent, void *buffer, Py_ssize_t length, PyObject *lock) { PyBufferProxy *buf; buf = (PyBufferProxy *) _bufferproxy_new (&PyBufferProxy_Type, NULL, NULL); if (!buf) return NULL; buf->buffer = buffer; buf->length = length; buf->lock = lock; buf->parent = parent; return (PyObject *) buf; } /*DOC*/ static char _bufferproxy_doc[] = /*DOC*/ "A generic proxy module that can spend arbitrary " \ /*DOC*/ "objects a buffer interface"; MODINIT_DEFINE (bufferproxy) { PyObject *module; PyObject *dict; PyObject *apiobj; int ecode; static void* c_api[PYGAMEAPI_BUFFERPROXY_NUMSLOTS]; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "bufferproxy", _bufferproxy_doc, -1, _bufferproxy_methods, NULL, NULL, NULL, NULL }; #endif if (PyType_Ready (&PyBufferProxy_Type) < 0) MODINIT_ERROR; /* create the module */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "bufferproxy", NULL, _bufferproxy_doc); #endif PyBufferProxy_Type.tp_getattro = PyObject_GenericGetAttr; Py_INCREF (&PyBufferProxy_Type); if (PyModule_AddObject (module, "BufferProxy", (PyObject *)&PyBufferProxy_Type) == -1) { Py_DECREF ((PyObject *)&PyBufferProxy_Type); DECREF_MOD (module); MODINIT_ERROR; } dict = PyModule_GetDict (module); c_api[0] = &PyBufferProxy_Type; c_api[1] = PyBufferProxy_New; apiobj = PyCObject_FromVoidPtr (c_api, NULL); if (apiobj == NULL) { DECREF_MOD (module); MODINIT_ERROR; } ecode = PyDict_SetItemString (dict, PYGAMEAPI_LOCAL_ENTRY, apiobj); Py_DECREF (apiobj); if (ecode == -1) { DECREF_MOD (module); MODINIT_ERROR; } MODINIT_RETURN (module); } pygame-1.9.1release/src/bitmask.h0000644000175000017500000001124611130232622016631 0ustar vincentvincent/* Bitmask 1.7 - A pixel-perfect collision detection library. Copyright (C) 2002-2005 Ulf Ekstrom except for the bitcount function which is copyright (C) Donald W. Gillies, 1992. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef BITMASK_H #define BITMASK_H #ifdef __cplusplus extern "C" { #endif #include /* Define INLINE for different compilers. If your compiler does not support inlining then there might be a performance hit in bitmask_overlap_area(). */ #ifndef INLINE # ifdef __GNUC__ # define INLINE inline # else # ifdef _MSC_VER # define INLINE __inline # else # define INLINE # endif # endif #endif #define BITMASK_W unsigned long int #define BITMASK_W_LEN (sizeof(BITMASK_W)*CHAR_BIT) #define BITMASK_W_MASK (BITMASK_W_LEN - 1) #define BITMASK_N(n) ((BITMASK_W)1 << (n)) typedef struct bitmask { int w,h; BITMASK_W bits[1]; } bitmask_t; /* Creates a bitmask of width w and height h, where w and h must both be greater than 0. The mask is automatically cleared when created. */ bitmask_t *bitmask_create(int w, int h); /* Frees all the memory allocated by bitmask_create for m. */ void bitmask_free(bitmask_t *m); /* Clears all bits in the mask */ void bitmask_clear(bitmask_t *m); /* Sets all bits in the mask */ void bitmask_fill(bitmask_t *m); /* Flips all bits in the mask */ void bitmask_invert(bitmask_t *m); /* Counts the bits in the mask */ unsigned int bitmask_count(bitmask_t *m); /* Returns nonzero if the bit at (x,y) is set. Coordinates start at (0,0) */ static INLINE int bitmask_getbit(const bitmask_t *m, int x, int y) { return (m->bits[x/BITMASK_W_LEN*m->h + y] & BITMASK_N(x & BITMASK_W_MASK)) != 0; } /* Sets the bit at (x,y) */ static INLINE void bitmask_setbit(bitmask_t *m, int x, int y) { m->bits[x/BITMASK_W_LEN*m->h + y] |= BITMASK_N(x & BITMASK_W_MASK); } /* Clears the bit at (x,y) */ static INLINE void bitmask_clearbit(bitmask_t *m, int x, int y) { m->bits[x/BITMASK_W_LEN*m->h + y] &= ~BITMASK_N(x & BITMASK_W_MASK); } /* Returns nonzero if the masks overlap with the given offset. The overlap tests uses the following offsets (which may be negative): +----+----------.. |A | yoffset | +-+----------.. +--|B |xoffset | | : : */ int bitmask_overlap(const bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset); /* Like bitmask_overlap(), but will also give a point of intersection. x and y are given in the coordinates of mask a, and are untouched if there is no overlap. */ int bitmask_overlap_pos(const bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset, int *x, int *y); /* Returns the number of overlapping 'pixels' */ int bitmask_overlap_area(const bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset); /* Fills a mask with the overlap of two other masks. A bitwise AND. */ void bitmask_overlap_mask (const bitmask_t *a, const bitmask_t *b, bitmask_t *c, int xoffset, int yoffset); /* Draws mask b onto mask a (bitwise OR). Can be used to compose large (game background?) mask from several submasks, which may speed up the testing. */ void bitmask_draw(bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset); void bitmask_erase(bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset); /* Return a new scaled bitmask, with dimensions w*h. The quality of the scaling may not be perfect for all circumstances, but it should be reasonable. If either w or h is 0 a clear 1x1 mask is returned. */ bitmask_t *bitmask_scale(const bitmask_t *m, int w, int h); /* Convolve b into a, drawing the output into o, shifted by offset. If offset * is 0, then the (x,y) bit will be set if and only if * bitmask_overlap(a, b, x - b->w - 1, y - b->h - 1) returns true. * * Modifies bits o[xoffset ... xoffset + a->w + b->w - 1) * [yoffset ... yoffset + a->h + b->h - 1). */ void bitmask_convolve(const bitmask_t *a, const bitmask_t *b, bitmask_t *o, int xoffset, int yoffset); #ifdef __cplusplus } /* End of extern "C" { */ #endif #endif pygame-1.9.1release/src/bitmask.c0000644000175000017500000006332111207055754016643 0ustar vincentvincent/* Bitmask Collision Detection Library 1.5 Copyright (C) 2002-2005 Ulf Ekstrom except for the bitcount function which is copyright (C) Donald W. Gillies, 1992, and the other bitcount function which was taken from Jorg Arndt's excellent "Algorithms for Programmers" text. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include "bitmask.h" #ifndef INLINE #warning No INLINE definition in bitmask.h, performance may suffer. #endif #define MIN(a,b) ((a) <= (b) ? (a) : (b)) #define MAX(a,b) ((a) >= (b) ? (a) : (b)) /* The code by Gillies is slightly (1-3%) faster than the more readable code below */ #define GILLIES static INLINE unsigned int bitcount(BITMASK_W n) { if (BITMASK_W_LEN == 32) { #ifdef GILLIES /* (C) Donald W. Gillies, 1992. All rights reserved. You may reuse this bitcount() function anywhere you please as long as you retain this Copyright Notice. */ register unsigned long tmp; return (tmp = (n) - (((n) >> 1) & 033333333333) - (((n) >> 2) & 011111111111), tmp = ((tmp + (tmp >> 3)) & 030707070707), tmp = (tmp + (tmp >> 6)), tmp = (tmp + (tmp >> 12) + (tmp >> 24)) & 077); /* End of Donald W. Gillies bitcount code */ #else /* This piece taken from Jorg Arndt's "Algorithms for Programmers" */ n = ((n>>1) & 0x55555555) + (n & 0x55555555); // 0-2 in 2 bits n = ((n>>2) & 0x33333333) + (n & 0x33333333); // 0-4 in 4 bits n = ((n>>4) + n) & 0x0f0f0f0f; // 0-8 in 4 bits n += n>> 8; // 0-16 in 8 bits n += n>>16; // 0-32 in 8 bits return n & 0xff; #endif } else if (BITMASK_W_LEN == 64) { n = ((n>>1) & 0x5555555555555555) + (n & 0x5555555555555555); n = ((n>>2) & 0x3333333333333333) + (n & 0x3333333333333333); n = ((n>>4) + n) & 0x0f0f0f0f0f0f0f0f; n += n>> 8; n += n>>16; n += n>>32; return n & 0xff; } else { /* Handle non-32 or 64 bit case the slow way */ unsigned int nbits = 0; while (n) { if (n & 1) nbits++; n = n >> 1; } return nbits; } } bitmask_t *bitmask_create(int w, int h) { bitmask_t *temp; temp = malloc(offsetof(bitmask_t,bits) + h*((w - 1)/BITMASK_W_LEN + 1)*sizeof(BITMASK_W)); if (!temp) return 0; temp->w = w; temp->h = h; bitmask_clear(temp); return temp; } void bitmask_free(bitmask_t *m) { free(m); } void bitmask_clear(bitmask_t *m) { memset(m->bits,0,m->h*((m->w - 1)/BITMASK_W_LEN + 1)*sizeof(BITMASK_W)); } void bitmask_fill(bitmask_t *m) { int len, shift; BITMASK_W *pixels, cmask, full; len = m->h*((m->w - 1)/BITMASK_W_LEN); shift = BITMASK_W_LEN - (m->w % BITMASK_W_LEN); full = ~(BITMASK_W)0; cmask = (~(BITMASK_W)0) >> shift; /* fill all the pixels that aren't in the rightmost BITMASK_Ws */ for (pixels = m->bits; pixels < (m->bits + len); pixels++) { *pixels = full; } /* for the rightmost BITMASK_Ws, use cmask to ensure we aren't setting bits that are outside of the mask */ for (pixels = m->bits + len; pixels < (m->bits + len + m->h); pixels++) { *pixels = cmask; } } void bitmask_invert(bitmask_t *m) { int len, shift; BITMASK_W *pixels, cmask; len = m->h*((m->w - 1)/BITMASK_W_LEN); shift = BITMASK_W_LEN - (m->w % BITMASK_W_LEN); cmask = (~(BITMASK_W)0) >> shift; /* flip all the pixels that aren't in the rightmost BITMASK_Ws */ for (pixels = m->bits; pixels < (m->bits + len); pixels++) { *pixels = ~(*pixels); } /* for the rightmost BITMASK_Ws, & with cmask to ensure we aren't setting bits that are outside of the mask */ for (pixels = m->bits + len; pixels < (m->bits + len + m->h); pixels++) { *pixels = cmask & ~(*pixels); } } unsigned int bitmask_count(bitmask_t *m) { BITMASK_W *pixels; unsigned int tot = 0; for (pixels=m->bits; pixels<(m->bits+m->h*((m->w-1)/BITMASK_W_LEN + 1)); pixels++) { tot += bitcount(*pixels); } return tot; } int bitmask_overlap(const bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset) { const BITMASK_W *a_entry,*a_end; const BITMASK_W *b_entry; const BITMASK_W *ap,*app,*bp; unsigned int shift,rshift,i,astripes,bstripes; if ((xoffset >= a->w) || (yoffset >= a->h) || (b->h + yoffset <= 0) || (b->w + xoffset <= 0)) return 0; if (xoffset >= 0) { swapentry: if (yoffset >= 0) { a_entry = a->bits + a->h*((unsigned int)xoffset/BITMASK_W_LEN) + yoffset; a_end = a_entry + MIN(b->h,a->h - yoffset); b_entry = b->bits; } else { a_entry = a->bits + a->h*((unsigned int)xoffset/BITMASK_W_LEN); a_end = a_entry + MIN(b->h + yoffset,a->h); b_entry = b->bits - yoffset; } shift = xoffset & BITMASK_W_MASK; if (shift) { rshift = BITMASK_W_LEN - shift; astripes = ((unsigned int)(a->w - 1))/BITMASK_W_LEN - (unsigned int)xoffset/BITMASK_W_LEN; bstripes = ((unsigned int)(b->w - 1))/BITMASK_W_LEN + 1; if (bstripes > astripes) /* zig-zag .. zig*/ { for (i=0;ih, bp = b_entry;ap < a_end;) if ((*ap++ >> shift) & *bp || (*app++ << rshift) & *bp++) return 1; a_entry += a->h; a_end += a->h; b_entry += b->h; } for (ap = a_entry,bp = b_entry;ap < a_end;) if ((*ap++ >> shift) & *bp++) return 1; return 0; } else /* zig-zag */ { for (i=0;ih, bp = b_entry;ap < a_end;) if ((*ap++ >> shift) & *bp || (*app++ << rshift) & *bp++) return 1; a_entry += a->h; a_end += a->h; b_entry += b->h; } return 0; } } else /* xoffset is a multiple of the stripe width, and the above routines wont work */ { astripes = (MIN(b->w,a->w - xoffset) - 1)/BITMASK_W_LEN + 1; for (i=0;ih; a_end += a->h; b_entry += b->h; } return 0; } } else { const bitmask_t *c = a; a = b; b = c; xoffset *= -1; yoffset *= -1; goto swapentry; } } /* Will hang if there are no bits set in w! */ static INLINE int firstsetbit(BITMASK_W w) { int i = 0; while ((w & 1) == 0) { i++; w/=2; } return i; } /* x and y are given in the coordinates of mask a, and are untouched if there is no overlap */ int bitmask_overlap_pos(const bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset, int *x, int *y) { const BITMASK_W *a_entry,*a_end, *b_entry, *ap, *bp; unsigned int shift,rshift,i,astripes,bstripes,xbase; if ((xoffset >= a->w) || (yoffset >= a->h) || (yoffset <= - b->h)) return 0; if (xoffset >= 0) { xbase = xoffset/BITMASK_W_LEN; /* first stripe from mask a */ if (yoffset >= 0) { a_entry = a->bits + a->h*xbase + yoffset; a_end = a_entry + MIN(b->h,a->h - yoffset); b_entry = b->bits; } else { a_entry = a->bits + a->h*xbase; a_end = a_entry + MIN(b->h + yoffset,a->h); b_entry = b->bits - yoffset; yoffset = 0; /* relied on below */ } shift = xoffset & BITMASK_W_MASK; if (shift) { rshift = BITMASK_W_LEN - shift; astripes = (a->w - 1)/BITMASK_W_LEN - xoffset/BITMASK_W_LEN; bstripes = (b->w - 1)/BITMASK_W_LEN + 1; if (bstripes > astripes) /* zig-zag .. zig*/ { for (i=0;ih; a_end += a->h; for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++) if (*ap & (*bp >> rshift)) { *y = ap - a_entry + yoffset; *x = (xbase + i + 1)*BITMASK_W_LEN + firstsetbit(*ap & (*bp >> rshift)); return 1; } b_entry += b->h; } for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++) if (*ap & (*bp << shift)) { *y = ap - a_entry + yoffset; *x = (xbase + astripes)*BITMASK_W_LEN + firstsetbit(*ap & (*bp << shift)); return 1; } return 0; } else /* zig-zag */ { for (i=0;ih; a_end += a->h; for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++) if (*ap & (*bp >> rshift)) { *y = ap - a_entry + yoffset; *x = (xbase + i + 1)*BITMASK_W_LEN + firstsetbit(*ap & (*bp >> rshift)); return 1; } b_entry += b->h; } return 0; } } else /* xoffset is a multiple of the stripe width, and the above routines won't work. This way is also slightly faster. */ { astripes = (MIN(b->w,a->w - xoffset) - 1)/BITMASK_W_LEN + 1; for (i=0;ih; a_end += a->h; b_entry += b->h; } return 0; } } else { if (bitmask_overlap_pos(b,a,-xoffset,-yoffset,x,y)) { *x += xoffset; *y += yoffset; return 1; } else return 0; } } int bitmask_overlap_area(const bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset) { const BITMASK_W *a_entry,*a_end, *b_entry, *ap,*bp; unsigned int shift,rshift,i,astripes,bstripes; unsigned int count = 0; if ((xoffset >= a->w) || (yoffset >= a->h) || (b->h + yoffset <= 0) || (b->w + xoffset <= 0)) return 0; if (xoffset >= 0) { swapentry: if (yoffset >= 0) { a_entry = a->bits + a->h*(xoffset/BITMASK_W_LEN) + yoffset; a_end = a_entry + MIN(b->h,a->h - yoffset); b_entry = b->bits; } else { a_entry = a->bits + a->h*(xoffset/BITMASK_W_LEN); a_end = a_entry + MIN(b->h + yoffset,a->h); b_entry = b->bits - yoffset; } shift = xoffset & BITMASK_W_MASK; if (shift) { rshift = BITMASK_W_LEN - shift; astripes = (a->w - 1)/BITMASK_W_LEN - xoffset/BITMASK_W_LEN; bstripes = (b->w - 1)/BITMASK_W_LEN + 1; if (bstripes > astripes) /* zig-zag .. zig*/ { for (i=0;i> shift) | (*(ap + a->h) << rshift)) & *bp); a_entry += a->h; a_end += a->h; b_entry += b->h; } for (ap = a_entry,bp = b_entry;ap < a_end;) count += bitcount((*ap++ >> shift) & *bp++); return count; } else /* zig-zag */ { for (i=0;i> shift) | (*(ap + a->h) << rshift)) & *bp); a_entry += a->h; a_end += a->h; b_entry += b->h; } return count; } } else /* xoffset is a multiple of the stripe width, and the above routines wont work */ { astripes = (MIN(b->w,a->w - xoffset) - 1)/BITMASK_W_LEN + 1; for (i=0;ih; a_end += a->h; b_entry += b->h; } return count; } } else { const bitmask_t *c = a; a = b; b = c; xoffset *= -1; yoffset *= -1; goto swapentry; } } /* Makes a mask of the overlap of two other masks */ void bitmask_overlap_mask(const bitmask_t *a, const bitmask_t *b, bitmask_t *c, int xoffset, int yoffset) { const BITMASK_W *a_entry,*a_end, *ap; const BITMASK_W *b_entry, *b_end, *bp; BITMASK_W *c_entry, *c_end, *cp; int shift,rshift,i,astripes,bstripes; if ((xoffset >= a->w) || (yoffset >= a->h) || (yoffset <= - b->h)) return; if (xoffset >= 0) { if (yoffset >= 0) { a_entry = a->bits + a->h*(xoffset/BITMASK_W_LEN) + yoffset; c_entry = c->bits + c->h*(xoffset/BITMASK_W_LEN) + yoffset; a_end = a_entry + MIN(b->h,a->h - yoffset); b_entry = b->bits; } else { a_entry = a->bits + a->h*(xoffset/BITMASK_W_LEN); c_entry = c->bits + c->h*(xoffset/BITMASK_W_LEN); a_end = a_entry + MIN(b->h + yoffset,a->h); b_entry = b->bits - yoffset; } shift = xoffset & BITMASK_W_MASK; if (shift) { rshift = BITMASK_W_LEN - shift; astripes = (a->w - 1)/BITMASK_W_LEN - xoffset/BITMASK_W_LEN; bstripes = (b->w - 1)/BITMASK_W_LEN + 1; if (bstripes > astripes) /* zig-zag .. zig*/ { for (i=0;ih; c_entry += c->h; a_end += a->h; for (ap = a_entry,bp = b_entry,cp = c_entry;ap < a_end;ap++,bp++,cp++) *cp = *ap & (*bp >> rshift); b_entry += b->h; } for (ap = a_entry,bp = b_entry,cp = c_entry;ap < a_end;ap++,bp++,cp++) *cp = *ap & (*bp << shift); } else /* zig-zag */ { for (i=0;ih; c_entry += c->h; a_end += a->h; for (ap = a_entry,bp = b_entry,cp = c_entry;ap < a_end;ap++,bp++,cp++) *cp = *ap & (*bp >> rshift); b_entry += b->h; } } } else /* xoffset is a multiple of the stripe width, and the above routines won't work. */ { astripes = (MIN(b->w,a->w - xoffset) - 1)/BITMASK_W_LEN + 1; for (i=0;ih; c_entry += c->h; a_end += a->h; b_entry += b->h; } } } else { xoffset *= -1; yoffset *= -1; if (yoffset >= 0) { b_entry = b->bits + b->h*(xoffset/BITMASK_W_LEN) + yoffset; b_end = b_entry + MIN(a->h,b->h - yoffset); a_entry = a->bits; c_entry = c->bits; } else { b_entry = b->bits + b->h*(xoffset/BITMASK_W_LEN); b_end = b_entry + MIN(a->h + yoffset,b->h); a_entry = a->bits - yoffset; c_entry = c->bits - yoffset; } shift = xoffset & BITMASK_W_MASK; if (shift) { rshift = BITMASK_W_LEN - shift; astripes = (b->w - 1)/BITMASK_W_LEN - xoffset/BITMASK_W_LEN; bstripes = (a->w - 1)/BITMASK_W_LEN + 1; if (bstripes > astripes) /* zig-zag .. zig*/ { for (i=0;i> shift); b_entry += b->h; b_end += b->h; for (bp = b_entry,ap = a_entry,cp = c_entry;bp < b_end;bp++,ap++,cp++) *cp = *ap & (*bp <h; c_entry += c->h; } for (bp = b_entry,ap = a_entry,cp = c_entry;bp < b_end;bp++,ap++,cp++) *cp = *ap & (*bp >> shift); } else /* zig-zag */ { for (i=0;i> shift); b_entry += b->h; b_end += b->h; for (bp = b_entry,ap = a_entry,cp = c_entry;bp < b_end;bp++,ap++,cp++) *cp = *ap & (*bp << rshift); a_entry += a->h; c_entry += c->h; } } } else /* xoffset is a multiple of the stripe width, and the above routines won't work. */ { astripes = (MIN(a->w,b->w - xoffset) - 1)/BITMASK_W_LEN + 1; for (i=0;ih; b_end += b->h; a_entry += a->h; c_entry += c->h; } } xoffset *= -1; yoffset *= -1; } /* Zero out bits outside the mask rectangle (to the right), if there is a chance we were drawing there. */ if (xoffset + b->w > c->w) { BITMASK_W edgemask; int n = c->w/BITMASK_W_LEN; shift = (n + 1)*BITMASK_W_LEN - c->w; edgemask = (~(BITMASK_W)0) >> shift; c_end = c->bits + n*c->h + MIN(c->h,b->h + yoffset); for (cp = c->bits + n*c->h + MAX(yoffset,0);cp= a->w) || (yoffset >= a->h) || (yoffset <= - b->h)) return; if (xoffset >= 0) { if (yoffset >= 0) { a_entry = a->bits + a->h*(xoffset/BITMASK_W_LEN) + yoffset; a_end = a_entry + MIN(b->h,a->h - yoffset); b_entry = b->bits; } else { a_entry = a->bits + a->h*(xoffset/BITMASK_W_LEN); a_end = a_entry + MIN(b->h + yoffset,a->h); b_entry = b->bits - yoffset; } shift = xoffset & BITMASK_W_MASK; if (shift) { rshift = BITMASK_W_LEN - shift; astripes = (a->w - 1)/BITMASK_W_LEN - xoffset/BITMASK_W_LEN; bstripes = (b->w - 1)/BITMASK_W_LEN + 1; if (bstripes > astripes) /* zig-zag .. zig*/ { for (i=0;ih; a_end += a->h; for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++) *ap |= (*bp >> rshift); b_entry += b->h; } for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++) *ap |= (*bp << shift); } else /* zig-zag */ { for (i=0;ih; a_end += a->h; for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++) *ap |= (*bp >> rshift); b_entry += b->h; } } } else /* xoffset is a multiple of the stripe width, and the above routines won't work. */ { astripes = (MIN(b->w,a->w - xoffset) - 1)/BITMASK_W_LEN + 1; for (i=0;ih; a_end += a->h; b_entry += b->h; } } } else { xoffset *= -1; yoffset *= -1; if (yoffset >= 0) { b_entry = b->bits + b->h*(xoffset/BITMASK_W_LEN) + yoffset; b_end = b_entry + MIN(a->h,b->h - yoffset); a_entry = a->bits; } else { b_entry = b->bits + b->h*(xoffset/BITMASK_W_LEN); b_end = b_entry + MIN(a->h + yoffset,b->h); a_entry = a->bits - yoffset; } shift = xoffset & BITMASK_W_MASK; if (shift) { rshift = BITMASK_W_LEN - shift; astripes = (b->w - 1)/BITMASK_W_LEN - xoffset/BITMASK_W_LEN; bstripes = (a->w - 1)/BITMASK_W_LEN + 1; if (bstripes > astripes) /* zig-zag .. zig*/ { for (i=0;i> shift); b_entry += b->h; b_end += b->h; for (bp = b_entry,ap = a_entry;bp < b_end;bp++,ap++) *ap |= (*bp <h; } for (bp = b_entry,ap = a_entry;bp < b_end;bp++,ap++) *ap |= (*bp >> shift); } else /* zig-zag */ { for (i=0;i> shift); b_entry += b->h; b_end += b->h; for (bp = b_entry,ap = a_entry;bp < b_end;bp++,ap++) *ap |= (*bp << rshift); a_entry += a->h; } } } else /* xoffset is a multiple of the stripe width, and the above routines won't work. */ { astripes = (MIN(a->w,b->w - xoffset) - 1)/BITMASK_W_LEN + 1; for (i=0;ih; b_end += b->h; a_entry += a->h; } } xoffset *= -1; yoffset *= -1; } /* Zero out bits outside the mask rectangle (to the right), if there is a chance we were drawing there. */ if (xoffset + b->w > a->w) { BITMASK_W edgemask; int n = a->w/BITMASK_W_LEN; shift = (n + 1)*BITMASK_W_LEN - a->w; edgemask = (~(BITMASK_W)0) >> shift; a_end = a->bits + n*a->h + MIN(a->h,b->h + yoffset); for (ap = a->bits + n*a->h + MAX(yoffset,0);ap= a->w) || (yoffset >= a->h) || (yoffset <= - b->h)) return; if (xoffset >= 0) { if (yoffset >= 0) { a_entry = a->bits + a->h*(xoffset/BITMASK_W_LEN) + yoffset; a_end = a_entry + MIN(b->h,a->h - yoffset); b_entry = b->bits; } else { a_entry = a->bits + a->h*(xoffset/BITMASK_W_LEN); a_end = a_entry + MIN(b->h + yoffset,a->h); b_entry = b->bits - yoffset; } shift = xoffset & BITMASK_W_MASK; if (shift) { rshift = BITMASK_W_LEN - shift; astripes = (a->w - 1)/BITMASK_W_LEN - xoffset/BITMASK_W_LEN; bstripes = (b->w - 1)/BITMASK_W_LEN + 1; if (bstripes > astripes) /* zig-zag .. zig*/ { for (i=0;ih; a_end += a->h; for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++) *ap &= ~(*bp >> rshift); b_entry += b->h; } for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++) *ap &= ~(*bp << shift); } else /* zig-zag */ { for (i=0;ih; a_end += a->h; for (ap = a_entry,bp = b_entry;ap < a_end;ap++,bp++) *ap &= ~(*bp >> rshift); b_entry += b->h; } } } else /* xoffset is a multiple of the stripe width, and the above routines won't work. */ { astripes = (MIN(b->w,a->w - xoffset) - 1)/BITMASK_W_LEN + 1; for (i=0;ih; a_end += a->h; b_entry += b->h; } } } else { xoffset *= -1; yoffset *= -1; if (yoffset >= 0) { b_entry = b->bits + b->h*(xoffset/BITMASK_W_LEN) + yoffset; b_end = b_entry + MIN(a->h,b->h - yoffset); a_entry = a->bits; } else { b_entry = b->bits + b->h*(xoffset/BITMASK_W_LEN); b_end = b_entry + MIN(a->h + yoffset,b->h); a_entry = a->bits - yoffset; } shift = xoffset & BITMASK_W_MASK; if (shift) { rshift = BITMASK_W_LEN - shift; astripes = (b->w - 1)/BITMASK_W_LEN - xoffset/BITMASK_W_LEN; bstripes = (a->w - 1)/BITMASK_W_LEN + 1; if (bstripes > astripes) /* zig-zag .. zig*/ { for (i=0;i> shift); b_entry += b->h; b_end += b->h; for (bp = b_entry,ap = a_entry;bp < b_end;bp++,ap++) *ap &= ~(*bp <h; } for (bp = b_entry,ap = a_entry;bp < b_end;bp++,ap++) *ap |= (*bp >> shift); } else /* zig-zag */ { for (i=0;i> shift); b_entry += b->h; b_end += b->h; for (bp = b_entry,ap = a_entry;bp < b_end;bp++,ap++) *ap &= ~(*bp << rshift); a_entry += a->h; } } } else /* xoffset is a multiple of the stripe width, and the above routines won't work. */ { astripes = (MIN(a->w,b->w - xoffset) - 1)/BITMASK_W_LEN + 1; for (i=0;ih; b_end += b->h; a_entry += a->h; } } } } bitmask_t *bitmask_scale(const bitmask_t *m, int w, int h) { bitmask_t *nm; int x,y,nx,ny,dx,dy,dnx,dny; if (w < 1 || h < 1) { nm = bitmask_create(1,1); return nm; } nm = bitmask_create(w,h); if (!nm) return NULL; ny = dny = 0; for (y=0,dy=h; yh; y++,dy+=h) { while (dny < dy) { nx = dnx = 0; for (x=0,dx=w; x < m->w; x++, dx+=w) { if (bitmask_getbit(m,x,y)) { while (dnx < dx) { bitmask_setbit(nm,nx,ny); nx++; dnx += m->w; } } else { while (dnx < dx) { nx++; dnx += m->w; } } } ny++; dny+=m->h; } } return nm; } void bitmask_convolve(const bitmask_t *a, const bitmask_t *b, bitmask_t *o, int xoffset, int yoffset) { int x, y; xoffset += b->w - 1; yoffset += b->h - 1; for (y = 0; y < b->h; y++) for (x = 0; x < b->w; x++) if (bitmask_getbit(b, x, y)) bitmask_draw(o, a, xoffset - x, yoffset - y); } pygame-1.9.1release/src/base.c0000644000175000017500000004154411224767753016136 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ #define NO_PYGAME_C_API #define PYGAMEAPI_BASE_INTERNAL #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" #include /* This file controls all the initialization of * the module and the various SDL subsystems */ /*platform specific init stuff*/ #ifdef MS_WIN32 /*python gives us MS_WIN32*/ #define WIN32_LEAN_AND_MEAN #define VC_EXTRALEAN #include extern int SDL_RegisterApp (char*, Uint32, void*); #endif #if defined(macintosh) #if(!defined(__MWERKS__) && !TARGET_API_MAC_CARBON) QDGlobals qd; #endif #endif /* Only one instance of the state per process. */ static PyObject* quitfunctions = NULL; static int sdl_was_init = 0; static void install_parachute (void); static void uninstall_parachute (void); static void _quit (void); static void atexit_quit (void); static int PyGame_Video_AutoInit (void); static void PyGame_Video_AutoQuit (void); static int CheckSDLVersions (void) /*compare compiled to linked*/ { SDL_version compiled; const SDL_version* linked; SDL_VERSION (&compiled); linked = SDL_Linked_Version (); /*only check the major and minor version numbers. we will relax any differences in 'patch' version.*/ if (compiled.major != linked->major || compiled.minor != linked->minor) { PyErr_Format(PyExc_RuntimeError, "SDL compiled with version %d.%d.%d, linked to %d.%d.%d", compiled.major, compiled.minor, compiled.patch, linked->major, linked->minor, linked->patch); return 0; } return 1; } void PyGame_RegisterQuit (void(*func)(void)) { PyObject* obj; if (!quitfunctions) { quitfunctions = PyList_New (0); if (!quitfunctions) return; } if (func) { obj = PyCObject_FromVoidPtr (func, NULL); PyList_Append (quitfunctions, obj); Py_DECREF (obj); } } static PyObject* register_quit (PyObject* self, PyObject* value) { if (!quitfunctions) { quitfunctions = PyList_New (0); if (!quitfunctions) return NULL; } PyList_Append (quitfunctions, value); Py_RETURN_NONE; } static PyObject* init (PyObject* self) { PyObject *allmodules, *moduleslist, *dict, *func, *result, *mod; int loop, num; int success=0, fail=0; if (!CheckSDLVersions ()) return NULL; /*nice to initialize timer, so startup time will reflec init() time*/ sdl_was_init = SDL_Init ( #if defined(WITH_THREAD) && !defined(MS_WIN32) && defined(SDL_INIT_EVENTTHREAD) SDL_INIT_EVENTTHREAD | #endif SDL_INIT_TIMER | SDL_INIT_NOPARACHUTE) == 0; /* initialize all pygame modules */ allmodules = PyImport_GetModuleDict (); moduleslist = PyDict_Values (allmodules); if (!allmodules || !moduleslist) return Py_BuildValue ("(ii)", 0, 0); if (PyGame_Video_AutoInit ()) ++success; else ++fail; num = PyList_Size (moduleslist); for (loop = 0; loop < num; ++loop) { mod = PyList_GET_ITEM (moduleslist, loop); if (!mod || !PyModule_Check (mod)) continue; dict = PyModule_GetDict (mod); func = PyDict_GetItemString (dict, "__PYGAMEinit__"); if(func && PyCallable_Check (func)) { result = PyObject_CallObject (func, NULL); if (result && PyObject_IsTrue (result)) ++success; else { PyErr_Clear (); ++fail; } Py_XDECREF (result); } } Py_DECREF (moduleslist); return Py_BuildValue ("(ii)", success, fail); } static void atexit_quit (void) { PyGame_Video_AutoQuit (); /* Maybe it is safe to call SDL_quit more than once after an SDL_Init, but this is undocumented. So play it safe and only call after a successful SDL_Init. */ if (sdl_was_init) { sdl_was_init = 0; SDL_Quit (); } } static PyObject* get_sdl_version (PyObject* self) { const SDL_version *v; v = SDL_Linked_Version (); return Py_BuildValue ("iii", v->major, v->minor, v->patch); } static PyObject* get_sdl_byteorder (PyObject *self) { return PyLong_FromLong (SDL_BYTEORDER); } static PyObject* quit (PyObject* self) { _quit (); Py_RETURN_NONE; } static void _quit (void) { PyObject* quit; PyObject* privatefuncs; int num; if (!quitfunctions) { return; } privatefuncs = quitfunctions; quitfunctions = NULL; uninstall_parachute (); num = PyList_Size (privatefuncs); while (num--) /*quit in reverse order*/ { quit = PyList_GET_ITEM (privatefuncs, num); if (PyCallable_Check (quit)) PyObject_CallObject (quit, NULL); else if (PyCObject_Check (quit)) { void* ptr = PyCObject_AsVoidPtr (quit); (*(void(*)(void)) ptr) (); } } Py_DECREF (privatefuncs); atexit_quit (); } /* internal C API utility functions */ static int IntFromObj (PyObject* obj, int* val) { int tmp_val; tmp_val = PyInt_AsLong (obj); if (tmp_val == -1 && PyErr_Occurred ()) { PyErr_Clear (); return 0; } *val = tmp_val; return 1; } static int IntFromObjIndex (PyObject* obj, int _index, int* val) { int result = 0; PyObject* item; item = PySequence_GetItem (obj, _index); if (item) { result = IntFromObj (item, val); Py_DECREF (item); } return result; } static int TwoIntsFromObj (PyObject* obj, int* val1, int* val2) { if (PyTuple_Check (obj) && PyTuple_Size (obj) == 1) return TwoIntsFromObj (PyTuple_GET_ITEM (obj, 0), val1, val2); if (!PySequence_Check (obj) || PySequence_Length (obj) != 2) return 0; if (!IntFromObjIndex (obj, 0, val1) || !IntFromObjIndex (obj, 1, val2)) return 0; return 1; } static int FloatFromObj (PyObject* obj, float* val) { float f= (float)PyFloat_AsDouble (obj); if (f==-1 && PyErr_Occurred()) { PyErr_Clear (); return 0; } *val = f; return 1; } static int FloatFromObjIndex (PyObject* obj, int _index, float* val) { int result = 0; PyObject* item; item = PySequence_GetItem (obj, _index); if (item) { result = FloatFromObj (item, val); Py_DECREF (item); } return result; } static int TwoFloatsFromObj (PyObject* obj, float* val1, float* val2) { if (PyTuple_Check (obj) && PyTuple_Size (obj) == 1) return TwoFloatsFromObj (PyTuple_GET_ITEM (obj, 0), val1, val2); if (!PySequence_Check (obj) || PySequence_Length (obj) != 2) return 0; if (!FloatFromObjIndex (obj, 0, val1) || !FloatFromObjIndex (obj, 1, val2)) return 0; return 1; } static int UintFromObj (PyObject* obj, Uint32* val) { PyObject* longobj; if (PyNumber_Check (obj)) { if (!(longobj = PyNumber_Long (obj))) return 0; *val = (Uint32) PyLong_AsUnsignedLong (longobj); Py_DECREF (longobj); return 1; } return 0; } static int UintFromObjIndex (PyObject* obj, int _index, Uint32* val) { int result = 0; PyObject* item; item = PySequence_GetItem (obj, _index); if (item) { result = UintFromObj (item, val); Py_DECREF (item); } return result; } static int RGBAFromObj (PyObject* obj, Uint8* RGBA) { int length; Uint32 val; if (PyTuple_Check (obj) && PyTuple_Size (obj) == 1) return RGBAFromObj (PyTuple_GET_ITEM (obj, 0), RGBA); if (!PySequence_Check (obj)) return 0; length = PySequence_Length (obj); if (length < 3 || length > 4) return 0; if (!UintFromObjIndex (obj, 0, &val) || val > 255) return 0; RGBA[0] = (Uint8) val; if (!UintFromObjIndex (obj, 1, &val) || val > 255) return 0; RGBA[1] = (Uint8) val; if (!UintFromObjIndex (obj, 2, &val) || val > 255) return 0; RGBA[2] = (Uint8) val; if (length == 4) { if (!UintFromObjIndex (obj, 3, &val) || val > 255) return 0; RGBA[3] = (Uint8) val; } else RGBA[3] = (Uint8) 255; return 1; } static PyObject* get_error (PyObject* self) { return Text_FromUTF8 (SDL_GetError ()); } static PyObject* set_error (PyObject *s, PyObject *args) { char *errstring = NULL; if (!PyArg_ParseTuple (args, "s", &errstring)) return NULL; SDL_SetError(errstring); Py_RETURN_NONE; } /*video init needs to be here, because of it's *important init order priority */ static void PyGame_Video_AutoQuit (void) { if (SDL_WasInit (SDL_INIT_VIDEO)) SDL_QuitSubSystem (SDL_INIT_VIDEO); } static int PyGame_Video_AutoInit (void) { if (!SDL_WasInit (SDL_INIT_VIDEO)) { int status; #if defined(__APPLE__) && defined(darwin) PyObject *module; PyObject *rval; module = PyImport_ImportModule ("pygame.macosx"); if (!module) { printf("ERROR: pygame.macosx import FAILED\n"); return -1; } rval = PyObject_CallMethod (module, "Video_AutoInit", ""); Py_DECREF (module); if (!rval) { printf("ERROR: pygame.macosx.Video_AutoInit() call FAILED\n"); return -1; } status = PyObject_IsTrue (rval); Py_DECREF (rval); if (status != 1) return 0; #endif status = SDL_InitSubSystem (SDL_INIT_VIDEO); if (status) return 0; SDL_EnableUNICODE (1); /*we special case the video quit to last now*/ /*PyGame_RegisterQuit(PyGame_Video_AutoQuit);*/ } return 1; } /*error signal handlers (replacing SDL parachute)*/ static void pygame_parachute (int sig) { #ifdef HAVE_SIGNAL_H char* signaltype; signal (sig, SIG_DFL); switch (sig) { case SIGSEGV: signaltype = "(pygame parachute) Segmentation Fault"; break; #ifdef SIGBUS #if SIGBUS != SIGSEGV case SIGBUS: signaltype = "(pygame parachute) Bus Error"; break; #endif #endif #ifdef SIGFPE case SIGFPE: signaltype = "(pygame parachute) Floating Point Exception"; break; #endif #ifdef SIGQUIT case SIGQUIT: signaltype = "(pygame parachute) Keyboard Abort"; break; #endif default: signaltype = "(pygame parachute) Unknown Signal"; break; } _quit (); Py_FatalError (signaltype); #endif } static int fatal_signals[] = { SIGSEGV, #ifdef SIGBUS SIGBUS, #endif #ifdef SIGFPE SIGFPE, #endif #ifdef SIGQUIT SIGQUIT, #endif 0 /*end of list*/ }; static int parachute_installed = 0; static void install_parachute (void) { #ifdef HAVE_SIGNAL_H int i; void (*ohandler)(int); if (parachute_installed) return; parachute_installed = 1; /* Set a handler for any fatal signal not already handled */ for (i = 0; fatal_signals[i]; ++i) { ohandler = (void(*)(int))signal (fatal_signals[i], pygame_parachute); if (ohandler != SIG_DFL) signal (fatal_signals[i], ohandler); } #if defined(SIGALRM) && defined(HAVE_SIGACTION) {/* Set SIGALRM to be ignored -- necessary on Solaris */ struct sigaction action, oaction; /* Set SIG_IGN action */ memset (&action, 0, (sizeof action)); action.sa_handler = SIG_IGN; sigaction (SIGALRM, &action, &oaction); /* Reset original action if it was already being handled */ if (oaction.sa_handler != SIG_DFL) sigaction (SIGALRM, &oaction, NULL); } #endif #endif return; } static void uninstall_parachute (void) { #ifdef HAVE_SIGNAL_H int i; void (*ohandler)(int); if (!parachute_installed) return; parachute_installed = 0; /* Remove a handler for any fatal signal handled */ for (i = 0; fatal_signals[i]; ++i) { ohandler = (void(*)(int))signal (fatal_signals[i], SIG_DFL); if (ohandler != pygame_parachute) signal (fatal_signals[i], ohandler); } #endif } /* bind functions to python */ static PyObject* do_segfault (PyObject* self) { //force crash *((int*)1) = 45; memcpy ((char*)2, (char*)3, 10); Py_RETURN_NONE; } static PyMethodDef _base_methods[] = { { "init", (PyCFunction) init, METH_NOARGS, DOC_PYGAMEINIT }, { "quit", (PyCFunction) quit, METH_NOARGS, DOC_PYGAMEQUIT }, { "register_quit", register_quit, METH_O, DOC_PYGAMEREGISTERQUIT }, { "get_error", (PyCFunction) get_error, METH_NOARGS, DOC_PYGAMEGETERROR }, { "set_error", (PyCFunction) set_error, METH_VARARGS, DOC_PYGAMESETERROR }, { "get_sdl_version", (PyCFunction) get_sdl_version, METH_NOARGS, DOC_PYGAMEGETSDLVERSION }, { "get_sdl_byteorder", (PyCFunction) get_sdl_byteorder, METH_NOARGS, DOC_PYGAMEGETSDLBYTEORDER }, { "segfault", (PyCFunction) do_segfault, METH_NOARGS, "crash" }, { NULL, NULL, 0, NULL } }; MODINIT_DEFINE(base) { static int is_loaded = 0; PyObject *module, *dict, *apiobj; PyObject *atexit, *atexit_register = NULL, *quit, *rval; PyObject *PyExc_SDLError; int ecode; static void* c_api[PYGAMEAPI_BASE_NUMSLOTS]; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "base", "", -1, _base_methods, NULL, NULL, NULL, NULL }; #endif if (!is_loaded) { /* import need modules. Do this first so if there is an error the module is not loaded. */ atexit = PyImport_ImportModule ("atexit"); if (!atexit) { MODINIT_ERROR; } atexit_register = PyObject_GetAttrString (atexit, "register"); Py_DECREF (atexit); if (!atexit_register) { MODINIT_ERROR; } } /* create the module */ #if PY3 module = PyModule_Create (&_module); #else module = Py_InitModule3 (MODPREFIX "base", _base_methods, DOC_PYGAME); #endif if (module == NULL) { MODINIT_ERROR; } dict = PyModule_GetDict (module); /* create the exceptions */ PyExc_SDLError = PyErr_NewException ("pygame.error", PyExc_RuntimeError, NULL); if (PyExc_SDLError == NULL) { Py_XDECREF (atexit_register); DECREF_MOD (module); MODINIT_ERROR; } ecode = PyDict_SetItemString (dict, "error", PyExc_SDLError); Py_DECREF (PyExc_SDLError); if (ecode) { Py_XDECREF (atexit_register); DECREF_MOD (module); MODINIT_ERROR; } /* export the c api */ c_api[0] = PyExc_SDLError; c_api[1] = PyGame_RegisterQuit; c_api[2] = IntFromObj; c_api[3] = IntFromObjIndex; c_api[4] = TwoIntsFromObj; c_api[5] = FloatFromObj; c_api[6] = FloatFromObjIndex; c_api[7] = TwoFloatsFromObj; c_api[8] = UintFromObj; c_api[9] = UintFromObjIndex; c_api[10] = PyGame_Video_AutoQuit; c_api[11] = PyGame_Video_AutoInit; c_api[12] = RGBAFromObj; apiobj = PyCObject_FromVoidPtr (c_api, NULL); if (apiobj == NULL) { Py_XDECREF (atexit_register); DECREF_MOD (module); MODINIT_ERROR; } ecode = PyDict_SetItemString (dict, PYGAMEAPI_LOCAL_ENTRY, apiobj); Py_DECREF (apiobj); if (ecode) { Py_XDECREF (atexit_register); DECREF_MOD (module); MODINIT_ERROR; } if (!is_loaded) { /*some intialization*/ quit = PyObject_GetAttrString (module, "quit"); if (quit == NULL) { /* assertion */ Py_DECREF (atexit_register); DECREF_MOD (module); MODINIT_ERROR; } rval = PyObject_CallFunctionObjArgs (atexit_register, quit, NULL); Py_DECREF (atexit_register); Py_DECREF (quit); if (rval == NULL) { DECREF_MOD (module); MODINIT_ERROR; } Py_DECREF (rval); Py_AtExit (atexit_quit); #ifdef HAVE_SIGNAL_H install_parachute (); #endif #ifdef MS_WIN32 SDL_RegisterApp ("pygame", 0, GetModuleHandle (NULL)); #endif #if defined(macintosh) #if(!defined(__MWERKS__) && !TARGET_API_MAC_CARBON) SDL_InitQuickDraw (&qd); #endif #endif } is_loaded = 1; MODINIT_RETURN (module); } pygame-1.9.1release/src/alphablit.c0000644000175000017500000021654711207055754017163 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners Copyright (C) 2006 Rene Dudfield Copyright (C) 2007 Marcus von Appen This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ #include "surface.h" /* The structure passed to the low level blit functions */ typedef struct { int width; int height; Uint8 *s_pixels; int s_pxskip; int s_skip; Uint8 *d_pixels; int d_pxskip; int d_skip; SDL_PixelFormat *src; SDL_PixelFormat *dst; Uint32 src_flags; Uint32 dst_flags; } SDL_BlitInfo; static void alphablit_alpha (SDL_BlitInfo * info); static void alphablit_colorkey (SDL_BlitInfo * info); static void alphablit_solid (SDL_BlitInfo * info); static void blit_blend_add (SDL_BlitInfo * info); static void blit_blend_sub (SDL_BlitInfo * info); static void blit_blend_mul (SDL_BlitInfo * info); static void blit_blend_min (SDL_BlitInfo * info); static void blit_blend_max (SDL_BlitInfo * info); static void blit_blend_rgba_add (SDL_BlitInfo * info); static void blit_blend_rgba_sub (SDL_BlitInfo * info); static void blit_blend_rgba_mul (SDL_BlitInfo * info); static void blit_blend_rgba_min (SDL_BlitInfo * info); static void blit_blend_rgba_max (SDL_BlitInfo * info); static int SoftBlitPyGame (SDL_Surface * src, SDL_Rect * srcrect, SDL_Surface * dst, SDL_Rect * dstrect, int the_args); extern int SDL_RLESurface (SDL_Surface * surface); extern void SDL_UnRLESurface (SDL_Surface * surface, int recode); static int SoftBlitPyGame (SDL_Surface * src, SDL_Rect * srcrect, SDL_Surface * dst, SDL_Rect * dstrect, int the_args) { int okay; int src_locked; int dst_locked; /* Everything is okay at the beginning... */ okay = 1; /* Lock the destination if it's in hardware */ dst_locked = 0; if (SDL_MUSTLOCK (dst)) { if (SDL_LockSurface (dst) < 0) okay = 0; else dst_locked = 1; } /* Lock the source if it's in hardware */ src_locked = 0; if (SDL_MUSTLOCK (src)) { if (SDL_LockSurface (src) < 0) okay = 0; else src_locked = 1; } /* Set up source and destination buffer pointers, and BLIT! */ if (okay && srcrect->w && srcrect->h) { SDL_BlitInfo info; /* Set up the blit information */ info.width = srcrect->w; info.height = srcrect->h; info.s_pixels = (Uint8 *) src->pixels + src->offset + (Uint16) srcrect->y * src->pitch + (Uint16) srcrect->x * src->format->BytesPerPixel; info.s_pxskip = src->format->BytesPerPixel; info.s_skip = src->pitch - info.width * src->format->BytesPerPixel; info.d_pixels = (Uint8 *) dst->pixels + dst->offset + (Uint16) dstrect->y * dst->pitch + (Uint16) dstrect->x * dst->format->BytesPerPixel; info.d_pxskip = dst->format->BytesPerPixel; info.d_skip = dst->pitch - info.width * dst->format->BytesPerPixel; info.src = src->format; info.dst = dst->format; info.src_flags = src->flags; info.dst_flags = dst->flags; if (info.d_pixels > info.s_pixels) { int span = info.width * info.src->BytesPerPixel; Uint8 *srcpixend = info.s_pixels + (info.height - 1) * src->pitch + span; if (info.d_pixels < srcpixend) { int dstoffset = (info.d_pixels - info.s_pixels) % src->pitch; if (dstoffset < span || dstoffset > src->pitch - span) { /* Overlapping Self blit with positive destination offset. Reverse direction of the blit. */ info.s_pixels = srcpixend - info.s_pxskip; info.s_pxskip = -info.s_pxskip; info.s_skip = -info.s_skip; info.d_pixels = (info.d_pixels + (info.height - 1) * dst->pitch + span - info.d_pxskip); info.d_pxskip = -info.d_pxskip; info.d_skip = -info.d_skip; } } } switch (the_args) { case 0: { if (src->flags & SDL_SRCALPHA && src->format->Amask) alphablit_alpha (&info); else if (src->flags & SDL_SRCCOLORKEY) alphablit_colorkey (&info); else alphablit_solid (&info); break; } case PYGAME_BLEND_ADD: { blit_blend_add (&info); break; } case PYGAME_BLEND_SUB: { blit_blend_sub (&info); break; } case PYGAME_BLEND_MULT: { blit_blend_mul (&info); break; } case PYGAME_BLEND_MIN: { blit_blend_min (&info); break; } case PYGAME_BLEND_MAX: { blit_blend_max (&info); break; } case PYGAME_BLEND_RGBA_ADD: { blit_blend_rgba_add (&info); break; } case PYGAME_BLEND_RGBA_SUB: { blit_blend_rgba_sub (&info); break; } case PYGAME_BLEND_RGBA_MULT: { blit_blend_rgba_mul (&info); break; } case PYGAME_BLEND_RGBA_MIN: { blit_blend_rgba_min (&info); break; } case PYGAME_BLEND_RGBA_MAX: { blit_blend_rgba_max (&info); break; } default: { SDL_SetError ("Invalid argument passed to blit."); okay = 0; break; } } } /* We need to unlock the surfaces if they're locked */ if (dst_locked) SDL_UnlockSurface (dst); if (src_locked) SDL_UnlockSurface (src); /* Blit is done! */ return (okay ? 0 : -1); } /* --------------------------------------------------------- */ static void blit_blend_rgba_add (SDL_BlitInfo * info) { int n; int width = info->width; int height = info->height; Uint8 *src = info->s_pixels; int srcpxskip = info->s_pxskip; int srcskip = info->s_skip; Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; int srcbpp = srcfmt->BytesPerPixel; int dstbpp = dstfmt->BytesPerPixel; Uint8 dR, dG, dB, dA, sR, sG, sB, sA; Uint32 pixel; Uint32 tmp; int srcppa = (info->src_flags & SDL_SRCALPHA && srcfmt->Amask); int dstppa = (info->dst_flags & SDL_SRCALPHA && dstfmt->Amask); if (!dstppa) { blit_blend_add (info); return; } if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && srcfmt->Gmask == dstfmt->Gmask && srcfmt->Bmask == dstfmt->Bmask && srcfmt->Amask == dstfmt->Amask && info->src_flags & SDL_SRCALPHA) { int incr = srcpxskip > 0 ? 1 : -1; if (incr < 0) { src += 3; dst += 3; } while (height--) { LOOP_UNROLLED4( { REPEAT_4( { tmp = (*dst) + (*src); (*dst) = (tmp <= 255 ? tmp : 255); src += incr; dst += incr; }); }, n, width); src += srcskip; dst += dstskip; } return; } if (srcbpp == 1) { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_RGBA_ADD (tmp, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* dstbpp > 1 */ { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_RGBA_ADD (tmp, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } else /* srcbpp > 1 */ { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_RGBA_ADD (tmp, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* dstbpp > 1 */ { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_RGBA_ADD (tmp, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } } static void blit_blend_rgba_sub (SDL_BlitInfo * info) { int n; int width = info->width; int height = info->height; Uint8 *src = info->s_pixels; int srcpxskip = info->s_pxskip; int srcskip = info->s_skip; Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; int srcbpp = srcfmt->BytesPerPixel; int dstbpp = dstfmt->BytesPerPixel; Uint8 dR, dG, dB, dA, sR, sG, sB, sA; Uint32 pixel; Sint32 tmp2; int srcppa = (info->src_flags & SDL_SRCALPHA && srcfmt->Amask); int dstppa = (info->dst_flags & SDL_SRCALPHA && dstfmt->Amask); if (!dstppa) { blit_blend_sub (info); return; } if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && srcfmt->Gmask == dstfmt->Gmask && srcfmt->Bmask == dstfmt->Bmask && srcfmt->Amask == dstfmt->Amask && info->src_flags & SDL_SRCALPHA) { int incr = srcpxskip > 0 ? 1 : -1; if (incr < 0) { src += 3; dst += 3; } while (height--) { LOOP_UNROLLED4( { REPEAT_4( { tmp2 = (*dst) - (*src); (*dst) = (tmp2 >= 0 ? tmp2 : 0); src += incr; dst += incr; }); }, n, width); src += srcskip; dst += dstskip; } return; } if (srcbpp == 1) { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_RGBA_SUB (tmp2, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* dstbpp > 1 */ { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_RGBA_SUB (tmp2, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } else /* srcbpp > 1 */ { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_RGBA_SUB (tmp2, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* dstbpp > 1 */ { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_RGBA_SUB (tmp2, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } } static void blit_blend_rgba_mul (SDL_BlitInfo * info) { int n; int width = info->width; int height = info->height; Uint8 *src = info->s_pixels; int srcpxskip = info->s_pxskip; int srcskip = info->s_skip; Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; int srcbpp = srcfmt->BytesPerPixel; int dstbpp = dstfmt->BytesPerPixel; Uint8 dR, dG, dB, dA, sR, sG, sB, sA; Uint32 pixel; Uint32 tmp; int srcppa = (info->src_flags & SDL_SRCALPHA && srcfmt->Amask); int dstppa = (info->dst_flags & SDL_SRCALPHA && dstfmt->Amask); if (!dstppa) { blit_blend_mul (info); return; } if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && srcfmt->Gmask == dstfmt->Gmask && srcfmt->Bmask == dstfmt->Bmask && srcfmt->Amask == dstfmt->Amask && info->src_flags & SDL_SRCALPHA) { int incr = srcpxskip > 0 ? 1 : -1; if (incr < 0) { src += 3; dst += 3; } while (height--) { LOOP_UNROLLED4( { REPEAT_4( { tmp = ((*dst) && (*src)) ? ((*dst) * (*src)) >> 8 : 0; (*dst) = (tmp <= 255 ? tmp : 255); src += incr; dst += incr; }); }, n, width); src += srcskip; dst += dstskip; } return; } if (srcbpp == 1) { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_RGBA_MULT (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* dstbpp > 1 */ { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_RGBA_MULT (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } else /* srcbpp > 1 */ { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_RGBA_MULT (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* dstbpp > 1 */ { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_RGBA_MULT (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } } static void blit_blend_rgba_min (SDL_BlitInfo * info) { int n; int width = info->width; int height = info->height; Uint8 *src = info->s_pixels; int srcpxskip = info->s_pxskip; int srcskip = info->s_skip; Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; int srcbpp = srcfmt->BytesPerPixel; int dstbpp = dstfmt->BytesPerPixel; Uint8 dR, dG, dB, dA, sR, sG, sB, sA; Uint32 pixel; int srcppa = (info->src_flags & SDL_SRCALPHA && srcfmt->Amask); int dstppa = (info->dst_flags & SDL_SRCALPHA && dstfmt->Amask); if (!dstppa) { blit_blend_min (info); return; } if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && srcfmt->Gmask == dstfmt->Gmask && srcfmt->Bmask == dstfmt->Bmask && srcfmt->Amask == dstfmt->Amask && info->src_flags & SDL_SRCALPHA) { int incr = srcpxskip > 0 ? 1 : -1; if (incr < 0) { src += 3; dst += 3; } while (height--) { LOOP_UNROLLED4( { REPEAT_4( { if ((*src) < (*dst)) (*dst) = (*src); src += incr; dst += incr; }); }, n, width); src += srcskip; dst += dstskip; } return; } if (srcbpp == 1) { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_RGBA_MIN (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* dstbpp > 1 */ { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_RGBA_MIN (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } else /* srcbpp > 1 */ { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_RGBA_MIN (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* dstbpp > 1 */ { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_RGBA_MIN (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } } static void blit_blend_rgba_max (SDL_BlitInfo * info) { int n; int width = info->width; int height = info->height; Uint8 *src = info->s_pixels; int srcpxskip = info->s_pxskip; int srcskip = info->s_skip; Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; int srcbpp = srcfmt->BytesPerPixel; int dstbpp = dstfmt->BytesPerPixel; Uint8 dR, dG, dB, dA, sR, sG, sB, sA; Uint32 pixel; int srcppa = (info->src_flags & SDL_SRCALPHA && srcfmt->Amask); int dstppa = (info->dst_flags & SDL_SRCALPHA && dstfmt->Amask); if (!dstppa) { blit_blend_max (info); return; } if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && srcfmt->Gmask == dstfmt->Gmask && srcfmt->Bmask == dstfmt->Bmask && srcfmt->Amask == dstfmt->Amask && info->src_flags & SDL_SRCALPHA) { int incr = srcpxskip > 0 ? 1 : -1; if (incr < 0) { src += 3; dst += 3; } while (height--) { LOOP_UNROLLED4( { REPEAT_4( { if ((*src) > (*dst)) (*dst) = (*src); src += incr; dst += incr; }); }, n, width); src += srcskip; dst += dstskip; } return; } if (srcbpp == 1) { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_RGBA_MAX (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* dstbpp > 1 */ { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_RGBA_MAX (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } else /* srcbpp > 1 */ { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_RGBA_MAX (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* dstbpp > 1 */ { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_RGBA_MAX (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } } /* --------------------------------------------------------- */ static void blit_blend_add (SDL_BlitInfo * info) { int n; int width = info->width; int height = info->height; Uint8 *src = info->s_pixels; int srcpxskip = info->s_pxskip; int srcskip = info->s_skip; Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; int srcbpp = srcfmt->BytesPerPixel; int dstbpp = dstfmt->BytesPerPixel; Uint8 dR, dG, dB, dA, sR, sG, sB, sA; Uint32 pixel; Uint32 tmp; int srcppa = (info->src_flags & SDL_SRCALPHA && srcfmt->Amask); int dstppa = (info->dst_flags & SDL_SRCALPHA && dstfmt->Amask); if (srcbpp >= 3 && dstbpp >= 3 && !(info->src_flags & SDL_SRCALPHA)) { size_t srcoffsetR, srcoffsetG, srcoffsetB; size_t dstoffsetR, dstoffsetG, dstoffsetB; if (srcbpp == 3) { SET_OFFSETS_24 (srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); } else { SET_OFFSETS_32 (srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); } if (dstbpp == 3) { SET_OFFSETS_24 (dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); } else { SET_OFFSETS_32 (dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); } while (height--) { LOOP_UNROLLED4( { tmp = dst[dstoffsetR] + src[srcoffsetR]; dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); tmp = dst[dstoffsetG] + src[srcoffsetG]; dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); tmp = dst[dstoffsetB] + src[srcoffsetB]; dst[dstoffsetB] = (tmp <= 255 ? tmp : 255); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } return; } if (srcbpp == 1) { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_ADD (tmp, sR, sG, sB, sA, dR, dG, dB, dA); *dst = (Uint8) SDL_MapRGB (dstfmt, dR, dG, dB); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else if (dstbpp == 3) { size_t offsetR, offsetG, offsetB; SET_OFFSETS_24 (offsetR, offsetG, offsetB, dstfmt); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_ADD (tmp, sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; dst[offsetB] = dB; src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* even dstbpp */ { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_ADD (tmp, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } else /* srcbpp > 1 */ { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_ADD (tmp, sR, sG, sB, sA, dR, dG, dB, dA); *dst = (Uint8) SDL_MapRGB (dstfmt, dR, dG, dB); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else if (dstbpp == 3) { size_t offsetR, offsetG, offsetB; SET_OFFSETS_24 (offsetR, offsetG, offsetB, dstfmt); while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_ADD (tmp, sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; dst[offsetB] = dB; src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* even dstbpp */ { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_ADD (tmp, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } } static void blit_blend_sub (SDL_BlitInfo * info) { int n; int width = info->width; int height = info->height; Uint8 *src = info->s_pixels; int srcpxskip = info->s_pxskip; int srcskip = info->s_skip; Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; int srcbpp = srcfmt->BytesPerPixel; int dstbpp = dstfmt->BytesPerPixel; Uint8 dR, dG, dB, dA, sR, sG, sB, sA; Uint32 pixel; Sint32 tmp2; int srcppa = (info->src_flags & SDL_SRCALPHA && srcfmt->Amask); int dstppa = (info->dst_flags & SDL_SRCALPHA && dstfmt->Amask); if (srcbpp >= 3 && dstbpp >= 3 && !(info->src_flags & SDL_SRCALPHA)) { size_t srcoffsetR, srcoffsetG, srcoffsetB; size_t dstoffsetR, dstoffsetG, dstoffsetB; if (srcbpp == 3) { SET_OFFSETS_24 (srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); } else { SET_OFFSETS_32 (srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); } if (dstbpp == 3) { SET_OFFSETS_24 (dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); } else { SET_OFFSETS_32 (dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); } while (height--) { LOOP_UNROLLED4( { tmp2 = dst[dstoffsetR] - src[srcoffsetR]; dst[dstoffsetR] = (tmp2 >= 0 ? tmp2 : 0); tmp2 = dst[dstoffsetG] - src[srcoffsetG]; dst[dstoffsetG] = (tmp2 >= 0 ? tmp2 : 0); tmp2 = dst[dstoffsetB] - src[srcoffsetB]; dst[dstoffsetB] = (tmp2 >= 0 ? tmp2 : 0); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } return; } if (srcbpp == 1) { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_SUB (tmp2, sR, sG, sB, sA, dR, dG, dB, dA); *dst = (Uint8) SDL_MapRGB (dstfmt, dR, dG, dB); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else if (dstbpp == 3) { size_t offsetR, offsetG, offsetB; SET_OFFSETS_24 (offsetR, offsetG, offsetB, dstfmt); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstfmt); BLEND_SUB (tmp2, sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; dst[offsetB] = dB; src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* even dstbpp */ { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_SUB (tmp2, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } else /* srcbpp > 1 */ { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_SUB (tmp2, sR, sG, sB, sA, dR, dG, dB, dA); *dst = (Uint8) SDL_MapRGB (dstfmt, dR, dG, dB); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else if (dstbpp == 3) { size_t offsetR, offsetG, offsetB; SET_OFFSETS_24 (offsetR, offsetG, offsetB, dstfmt); while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_SUB (tmp2, sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; dst[offsetB] = dB; src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* even dstbpp */ { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_SUB (tmp2, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } } static void blit_blend_mul (SDL_BlitInfo * info) { int n; int width = info->width; int height = info->height; Uint8 *src = info->s_pixels; int srcpxskip = info->s_pxskip; int srcskip = info->s_skip; Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; int srcbpp = srcfmt->BytesPerPixel; int dstbpp = dstfmt->BytesPerPixel; Uint8 dR, dG, dB, dA, sR, sG, sB, sA; Uint32 pixel; Uint32 tmp; int srcppa = (info->src_flags & SDL_SRCALPHA && srcfmt->Amask); int dstppa = (info->dst_flags & SDL_SRCALPHA && dstfmt->Amask); if (srcbpp >= 3 && dstbpp >= 3 && !(info->src_flags & SDL_SRCALPHA)) { size_t srcoffsetR, srcoffsetG, srcoffsetB; size_t dstoffsetR, dstoffsetG, dstoffsetB; if (srcbpp == 3) { SET_OFFSETS_24 (srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); } else { SET_OFFSETS_32 (srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); } if (dstbpp == 3) { SET_OFFSETS_24 (dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); } else { SET_OFFSETS_32 (dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); } while (height--) { LOOP_UNROLLED4( { tmp = ((dst[dstoffsetR] && src[srcoffsetR]) ? (dst[dstoffsetR] * src[srcoffsetR]) >> 8 : 0); dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); tmp = ((dst[dstoffsetG] && src[srcoffsetG]) ? (dst[dstoffsetG] * src[srcoffsetG]) >> 8 : 0); dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); tmp = ((dst[dstoffsetB] && src[srcoffsetB]) ? (dst[dstoffsetB] * src[srcoffsetB]) >> 8 : 0); dst[dstoffsetB] = (tmp <= 255 ? tmp : 255); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } return; } if (srcbpp == 1) { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_MULT (sR, sG, sB, sA, dR, dG, dB, dA); *dst = (Uint8) SDL_MapRGB (dstfmt, dR, dG, dB); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else if (dstbpp == 3) { size_t offsetR, offsetG, offsetB; SET_OFFSETS_24 (offsetR, offsetG, offsetB, dstfmt); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_MULT (sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; dst[offsetB] = dB; src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* even dstbpp */ { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_MULT (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } else /* srcbpp > 1 */ { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_MULT (sR, sG, sB, sA, dR, dG, dB, dA); *dst = (Uint8) SDL_MapRGB (dstfmt, dR, dG, dB); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else if (dstbpp == 3) { size_t offsetR, offsetG, offsetB; SET_OFFSETS_24 (offsetR, offsetG, offsetB, dstfmt); while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_MULT (sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; dst[offsetB] = dB; src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* even dstbpp */ { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_MULT (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } } static void blit_blend_min (SDL_BlitInfo * info) { int n; int width = info->width; int height = info->height; Uint8 *src = info->s_pixels; int srcpxskip = info->s_pxskip; int srcskip = info->s_skip; Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; int srcbpp = srcfmt->BytesPerPixel; int dstbpp = dstfmt->BytesPerPixel; Uint8 dR, dG, dB, dA, sR, sG, sB, sA; Uint32 pixel; int srcppa = (info->src_flags & SDL_SRCALPHA && srcfmt->Amask); int dstppa = (info->dst_flags & SDL_SRCALPHA && dstfmt->Amask); if (srcbpp >= 3 && dstbpp >= 3 && !(info->src_flags & SDL_SRCALPHA)) { size_t srcoffsetR, srcoffsetG, srcoffsetB; size_t dstoffsetR, dstoffsetG, dstoffsetB; if (srcbpp == 3) { SET_OFFSETS_24 (srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); } else { SET_OFFSETS_32 (srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); } if (dstbpp == 3) { SET_OFFSETS_24 (dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); } else { SET_OFFSETS_32 (dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); } while (height--) { LOOP_UNROLLED4( { if (src[srcoffsetR] < dst[dstoffsetR]) { dst[dstoffsetR] = src[srcoffsetR]; } if (src[srcoffsetG] < dst[dstoffsetG]) { dst[dstoffsetG] = src[srcoffsetG]; } if (src[srcoffsetB] < dst[dstoffsetB]) { dst[dstoffsetB] = src[srcoffsetB]; } src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } return; } if (srcbpp == 1) { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_MIN (sR, sG, sB, sA, dR, dG, dB, dA); *dst = (Uint8) SDL_MapRGB (dstfmt, dR, dG, dB); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else if (dstbpp == 3) { size_t offsetR, offsetG, offsetB; SET_OFFSETS_24 (offsetR, offsetG, offsetB, dstfmt); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_MIN (sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; dst[offsetB] = dB; src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* even dstbpp */ { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_MIN (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } else /* srcbpp > 1 */ { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_MIN (sR, sG, sB, sA, dR, dG, dB, dA); *dst = (Uint8) SDL_MapRGB (dstfmt, dR, dG, dB); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else if (dstbpp == 3) { size_t offsetR, offsetG, offsetB; SET_OFFSETS_24 (offsetR, offsetG, offsetB, dstfmt); while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_MIN (sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; dst[offsetB] = dB; src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* even dstbpp */ { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_MIN (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } } static void blit_blend_max (SDL_BlitInfo * info) { int n; int width = info->width; int height = info->height; Uint8 *src = info->s_pixels; int srcpxskip = info->s_pxskip; int srcskip = info->s_skip; Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; int srcbpp = srcfmt->BytesPerPixel; int dstbpp = dstfmt->BytesPerPixel; Uint8 dR, dG, dB, dA, sR, sG, sB, sA; Uint32 pixel; int srcppa = (info->src_flags & SDL_SRCALPHA && srcfmt->Amask); int dstppa = (info->dst_flags & SDL_SRCALPHA && dstfmt->Amask); if (srcbpp >= 3 && dstbpp >= 3 && !(info->src_flags & SDL_SRCALPHA)) { size_t srcoffsetR, srcoffsetG, srcoffsetB; size_t dstoffsetR, dstoffsetG, dstoffsetB; if (srcbpp == 3) { SET_OFFSETS_24 (srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); } else { SET_OFFSETS_32 (srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); } if (dstbpp == 3) { SET_OFFSETS_24 (dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); } else { SET_OFFSETS_32 (dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); } while (height--) { LOOP_UNROLLED4( { if (src[srcoffsetR] > dst[dstoffsetR]) { dst[dstoffsetR] = src[srcoffsetR]; } if (src[srcoffsetG] > dst[dstoffsetG]) { dst[dstoffsetG] = src[srcoffsetG]; } if (src[srcoffsetB] > dst[dstoffsetB]) { dst[dstoffsetB] = src[srcoffsetB]; } src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } return; } if (srcbpp == 1) { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_MAX (sR, sG, sB, sA, dR, dG, dB, dA); *dst = (Uint8) SDL_MapRGB (dstfmt, dR, dG, dB); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else if (dstbpp == 3) { size_t offsetR, offsetG, offsetB; SET_OFFSETS_24 (offsetR, offsetG, offsetB, dstfmt); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_MAX (sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; dst[offsetB] = dB; src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* even dstbpp */ { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_MAX (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } else /* srcbpp > 1 */ { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_MAX (sR, sG, sB, sA, dR, dG, dB, dA); *dst = (Uint8) SDL_MapRGB (dstfmt, dR, dG, dB); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else if (dstbpp == 3) { size_t offsetR, offsetG, offsetB; SET_OFFSETS_24 (offsetR, offsetG, offsetB, dstfmt); while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_MAX (sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; dst[offsetB] = dB; src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* even dstbpp */ { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); BLEND_MAX (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } } /* --------------------------------------------------------- */ static void alphablit_alpha (SDL_BlitInfo * info) { int n; int width = info->width; int height = info->height; Uint8 *src = info->s_pixels; int srcpxskip = info->s_pxskip; int srcskip = info->s_skip; Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; int srcbpp = srcfmt->BytesPerPixel; int dstbpp = dstfmt->BytesPerPixel; int dR, dG, dB, dA, sR, sG, sB, sA; Uint32 pixel; int srcppa = (info->src_flags & SDL_SRCALPHA && srcfmt->Amask); int dstppa = (info->dst_flags & SDL_SRCALPHA && dstfmt->Amask); /* printf ("Alpha blit with %d and %d\n", srcbpp, dstbpp); */ if (srcbpp == 1) { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); ALPHA_BLEND (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* dstbpp > 1 */ { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); ALPHA_BLEND (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } else /* srcbpp > 1 */ { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); ALPHA_BLEND (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* dstbpp > 1 */ { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); ALPHA_BLEND (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } } static void alphablit_colorkey (SDL_BlitInfo * info) { int n; int width = info->width; int height = info->height; Uint8 *src = info->s_pixels; int srcpxskip = info->s_pxskip; int srcskip = info->s_skip; Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; int srcbpp = srcfmt->BytesPerPixel; int dstbpp = dstfmt->BytesPerPixel; int dR, dG, dB, dA, sR, sG, sB, sA; int alpha = srcfmt->alpha; Uint32 colorkey = srcfmt->colorkey; Uint32 pixel; int srcppa = (info->src_flags & SDL_SRCALPHA && srcfmt->Amask); int dstppa = (info->dst_flags & SDL_SRCALPHA && dstfmt->Amask); /* printf ("Colorkey blit with %d and %d\n", srcbpp, dstbpp); */ if (srcbpp == 1) { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); sA = (*src == colorkey) ? 0 : alpha; GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); ALPHA_BLEND (sR, sG, sB, sA, dR, dG, dB, dA); *dst = (Uint8) SDL_MapRGB (dstfmt, dR, dG, dB); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* dstbpp > 1 */ { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); sA = (*src == colorkey) ? 0 : alpha; GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); ALPHA_BLEND (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } else /* srcbpp > 1 */ { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); sA = (pixel == colorkey) ? 0 : alpha; GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); ALPHA_BLEND (sR, sG, sB, sA, dR, dG, dB, dA); *dst = (Uint8) SDL_MapRGB (dstfmt, dR, dG, dB); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else if (dstbpp == 3) { /* This is interim code until SDL can properly handle self blits of surfaces with blanket alpha. */ size_t offsetR, offsetG, offsetB; SET_OFFSETS_24 (offsetR, offsetG, offsetB, dstfmt); while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); sA = (pixel == colorkey) ? 0 : alpha; GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); ALPHA_BLEND (sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; dst[offsetB] = dB; src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* even dstbpp */ { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); sA = (pixel == colorkey) ? 0 : alpha; GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); ALPHA_BLEND (sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } } static void alphablit_solid (SDL_BlitInfo * info) { int n; int width = info->width; int height = info->height; Uint8 *src = info->s_pixels; int srcpxskip = info->s_pxskip; int srcskip = info->s_skip; Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; int srcbpp = srcfmt->BytesPerPixel; int dstbpp = dstfmt->BytesPerPixel; int dR, dG, dB, dA, sR, sG, sB, sA; int alpha = srcfmt->alpha; int pixel; int srcppa = (info->src_flags & SDL_SRCALPHA && srcfmt->Amask); int dstppa = (info->dst_flags & SDL_SRCALPHA && dstfmt->Amask); /* printf ("Solid blit with %d and %d\n", srcbpp, dstbpp); */ if (srcbpp == 1) { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); ALPHA_BLEND (sR, sG, sB, alpha, dR, dG, dB, dA); *dst = (Uint8) SDL_MapRGB (dstfmt, dR, dG, dB); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* dstbpp > 1 */ { while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); ALPHA_BLEND (sR, sG, sB, alpha, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } } else /* srcbpp > 1 */ { if (dstbpp == 1) { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); ALPHA_BLEND (sR, sG, sB, alpha, dR, dG, dB, dA); *dst = (Uint8) SDL_MapRGB (dstfmt, dR, dG, dB); src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else if (dstbpp == 3) { /* This is interim code until SDL can properly handle self blits of surfaces with blanket alpha. */ size_t offsetR, offsetG, offsetB; SET_OFFSETS_24 (offsetR, offsetG, offsetB, dstfmt); while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); ALPHA_BLEND (sR, sG, sB, alpha, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; dst[offsetB] = dB; src += srcpxskip; dst += dstpxskip; }, n, width); src += srcskip; dst += dstskip; } } else /* even dstbpp */ { while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); GET_PIXELVALS (sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXEL (pixel, dstbpp, dst); GET_PIXELVALS (dR, dG, dB, dA, pixel, dstfmt, dstppa); ALPHA_BLEND (sR, sG, sB, alpha, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; }, n ,width); src += srcskip; dst += dstskip; } } } } /*we assume the "dst" has pixel alpha*/ int pygame_Blit (SDL_Surface * src, SDL_Rect * srcrect, SDL_Surface * dst, SDL_Rect * dstrect, int the_args) { SDL_Rect fulldst; int srcx, srcy, w, h; /* Make sure the surfaces aren't locked */ if (!src || !dst) { SDL_SetError ("SDL_UpperBlit: passed a NULL surface"); return (-1); } if (src->locked || dst->locked) { SDL_SetError ("Surfaces must not be locked during blit"); return (-1); } /* If the destination rectangle is NULL, use the entire dest surface */ if (dstrect == NULL) { fulldst.x = fulldst.y = 0; dstrect = &fulldst; } /* clip the source rectangle to the source surface */ if (srcrect) { int maxw, maxh; srcx = srcrect->x; w = srcrect->w; if (srcx < 0) { w += srcx; dstrect->x -= srcx; srcx = 0; } maxw = src->w - srcx; if (maxw < w) w = maxw; srcy = srcrect->y; h = srcrect->h; if (srcy < 0) { h += srcy; dstrect->y -= srcy; srcy = 0; } maxh = src->h - srcy; if (maxh < h) h = maxh; } else { srcx = srcy = 0; w = src->w; h = src->h; } /* clip the destination rectangle against the clip rectangle */ { SDL_Rect *clip = &dst->clip_rect; int dx, dy; dx = clip->x - dstrect->x; if (dx > 0) { w -= dx; dstrect->x += dx; srcx += dx; } dx = dstrect->x + w - clip->x - clip->w; if (dx > 0) w -= dx; dy = clip->y - dstrect->y; if (dy > 0) { h -= dy; dstrect->y += dy; srcy += dy; } dy = dstrect->y + h - clip->y - clip->h; if (dy > 0) h -= dy; } if (w > 0 && h > 0) { SDL_Rect sr; sr.x = srcx; sr.y = srcy; sr.w = dstrect->w = w; sr.h = dstrect->h = h; return SoftBlitPyGame (src, &sr, dst, dstrect, the_args); } dstrect->w = dstrect->h = 0; return 0; } int pygame_AlphaBlit (SDL_Surface * src, SDL_Rect * srcrect, SDL_Surface * dst, SDL_Rect * dstrect, int the_args) { return pygame_Blit (src, srcrect, dst, dstrect, the_args); } pygame-1.9.1release/src/_numericsurfarray.c0000644000175000017500000011261211143210052020726 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ #include "pygame.h" #include "pygamedocs.h" #include "numeric_arrayobject.h" #include static PyObject* pixels3d (PyObject* self, PyObject* arg) { int dim[3]; PyObject* array, *surfobj; SDL_Surface* surf; char* startpixel; int pixelstep; const int lilendian = (SDL_BYTEORDER == SDL_LIL_ENDIAN); PyObject* lifelock; int rgb = 0; if (!PyArg_ParseTuple (arg, "O!", &PySurface_Type, &surfobj)) return NULL; surf = PySurface_AsSurface (surfobj); if (surf->format->BytesPerPixel <= 2 || surf->format->BytesPerPixel > 4) return RAISE (PyExc_ValueError, "unsupport bit depth for 3D reference array"); /*must discover information about how data is packed*/ if (surf->format->Rmask == 0xff<<16 && surf->format->Gmask == 0xff<<8 && surf->format->Bmask == 0xff) { pixelstep = (lilendian ? -1 : 1); rgb = 1; } else if (surf->format->Bmask == 0xff<<16 && surf->format->Gmask == 0xff<<8 && surf->format->Rmask == 0xff) { pixelstep = (lilendian ? 1 : -1); rgb = 0; } else return RAISE (PyExc_ValueError, "unsupport colormasks for 3D reference array"); /*create the referenced array*/ dim[0] = surf->w; dim[1] = surf->h; dim[2] = 3; /*could be 4 if alpha in the house*/ /* Pass a dummy string and set it correctly later */ array = PyArray_FromDimsAndData (3, dim, PyArray_UBYTE, ""); if (array) { lifelock = PySurface_LockLifetime (surfobj, array); if (!lifelock) { Py_DECREF (array); return NULL; } if (rgb) startpixel = ((char*) surf->pixels) + (lilendian ? 2 : 0); else startpixel = ((char*) surf->pixels) + (lilendian ? 0 : 2); if (!lilendian && surf->format->BytesPerPixel == 4) ++startpixel; ((PyArrayObject*) array)->flags = OWN_DIMENSIONS|OWN_STRIDES|SAVESPACE; ((PyArrayObject*) array)->strides[2] = pixelstep; ((PyArrayObject*) array)->strides[1] = surf->pitch; ((PyArrayObject*) array)->strides[0] = surf->format->BytesPerPixel; ((PyArrayObject*) array)->base = lifelock; ((PyArrayObject*) array)->data = startpixel; } return array; } static PyObject* pixels2d (PyObject* self, PyObject* arg) { int types[] = { PyArray_UBYTE, PyArray_SHORT, 0, PyArray_INT }; int dim[3]; int type; PyObject *array, *surfobj; SDL_Surface* surf; PyObject* lifelock; if (!PyArg_ParseTuple (arg, "O!", &PySurface_Type, &surfobj)) return NULL; surf = PySurface_AsSurface (surfobj); if (surf->format->BytesPerPixel == 3 || surf->format->BytesPerPixel < 1 || surf->format->BytesPerPixel > 4) return RAISE (PyExc_ValueError, "unsupport bit depth for 2D reference array"); dim[0] = surf->w; dim[1] = surf->h; type = types[surf->format->BytesPerPixel-1]; array = PyArray_FromDimsAndData (2, dim, type, ""); if (array) { lifelock = PySurface_LockLifetime (surfobj, array); if (!lifelock) { Py_DECREF (array); return NULL; } ((PyArrayObject*) array)->strides[1] = surf->pitch; ((PyArrayObject*) array)->strides[0] = surf->format->BytesPerPixel; ((PyArrayObject*) array)->flags = OWN_DIMENSIONS|OWN_STRIDES; ((PyArrayObject*) array)->base = lifelock; ((PyArrayObject*) array)->data = (char*) surf->pixels; } return array; } static PyObject* pixels_alpha (PyObject* self, PyObject* arg) { int dim[3]; PyObject *array, *surfobj; PyObject* lifelock; SDL_Surface* surf; char* startpixel; int startoffset; const int lilendian = (SDL_BYTEORDER == SDL_LIL_ENDIAN); if (!PyArg_ParseTuple(arg, "O!", &PySurface_Type, &surfobj)) return NULL; surf = PySurface_AsSurface (surfobj); if (surf->format->BytesPerPixel != 4) return RAISE (PyExc_ValueError, "unsupport bit depth for alpha array"); /*must discover information about how data is packed*/ if (surf->format->Amask == 0xff << 24) startoffset = (lilendian ? 3 : 0); else if (surf->format->Amask == 0xff) startoffset = (lilendian ? 0 : 3); else return RAISE (PyExc_ValueError, "unsupport colormasks for alpha reference array"); dim[0] = surf->w; dim[1] = surf->h; array = PyArray_FromDimsAndData (2, dim, PyArray_UBYTE, ""); if(array) { lifelock = PySurface_LockLifetime (surfobj, array); if (!lifelock) { Py_DECREF (array); return NULL; } startpixel = ((char*) surf->pixels) + startoffset; ((PyArrayObject*) array)->strides[1] = surf->pitch; ((PyArrayObject*) array)->strides[0] = surf->format->BytesPerPixel; ((PyArrayObject*) array)->flags = OWN_DIMENSIONS|OWN_STRIDES; ((PyArrayObject*) array)->base = lifelock; ((PyArrayObject*) array)->data = startpixel; } return array; } static PyObject* array2d (PyObject* self, PyObject* arg) { int dim[2], loopy; Uint8* data; PyObject *surfobj, *array; SDL_Surface* surf; int stridex, stridey; if (!PyArg_ParseTuple (arg, "O!", &PySurface_Type, &surfobj)) return NULL; surf = PySurface_AsSurface (surfobj); dim[0] = surf->w; dim[1] = surf->h; if (surf->format->BytesPerPixel <= 0 || surf->format->BytesPerPixel > 4) return RAISE (PyExc_ValueError, "unsupport bit depth for surface array"); array = PyArray_FromDims (2, dim, PyArray_INT); if (!array) return NULL; stridex = ((PyArrayObject*) array)->strides[0]; stridey = ((PyArrayObject*) array)->strides[1]; if (!PySurface_LockBy (surfobj, array)) { Py_DECREF (array); return NULL; } switch (surf->format->BytesPerPixel) { case 1: for (loopy = 0; loopy < surf->h; ++loopy) { Uint8* pix = (Uint8*)(((char*) surf->pixels) + loopy * surf->pitch); Uint8* end = (Uint8*)(((char*) pix) + surf->w); data = ((Uint8*)((PyArrayObject*) array)->data) + stridey*loopy; while (pix < end) { *(Uint32*)data = *pix++; data += stridex; } } break; case 2: for (loopy = 0; loopy < surf->h; ++loopy) { Uint16* pix = (Uint16*)(((char*)surf->pixels) + loopy *surf->pitch); Uint16* end = (Uint16*)(((char*) pix) + surf->w * 2); data = ((Uint8*)((PyArrayObject*) array)->data) + stridey * loopy; while (pix < end) { *(Uint32*)data = *pix++; data += stridex; } } break; case 3: for (loopy = 0; loopy < surf->h; ++loopy) { Uint8* pix = (Uint8*)(((char*)surf->pixels)+loopy*surf->pitch); Uint8* end = pix+surf->w*3; data = ((Uint8*)((PyArrayObject*)array)->data) + stridey*loopy; while (pix < end) { #if SDL_BYTEORDER == SDL_LIL_ENDIAN *(Uint32*)data = pix[0] + (pix[1]<<8) + (pix[2]<<16); #else *(Uint32*)data = pix[2] + (pix[1]<<8) + (pix[0]<<16); #endif pix += 3; data += stridex; } } break; default: /*case 4*/ for (loopy = 0; loopy < surf->h; ++loopy) { Uint32* pix = (Uint32*)(((char*)surf->pixels)+loopy*surf->pitch); Uint32* end = (Uint32*)(((char*)pix)+surf->w*4); data = ((Uint8*)((PyArrayObject*)array)->data) + stridey*loopy; while (pix < end) { *(Uint32*)data = *pix++; data += stridex; } } break; } if (!PySurface_UnlockBy (surfobj, array)) { Py_DECREF (array); return NULL; } return array; } static PyObject* array3d (PyObject* self, PyObject* arg) { int dim[3], loopy; Uint8* data; PyObject *array, *surfobj; SDL_Surface* surf; SDL_PixelFormat* format; int Rmask, Gmask, Bmask, Rshift, Gshift, Bshift, Rloss, Gloss, Bloss; int stridex, stridey; SDL_Color* palette; if (!PyArg_ParseTuple (arg, "O!", &PySurface_Type, &surfobj)) return NULL; surf = PySurface_AsSurface (surfobj); format = surf->format; dim[0] = surf->w; dim[1] = surf->h; dim[2] = 3; Rmask = format->Rmask; Gmask = format->Gmask; Bmask = format->Bmask; Rshift = format->Rshift; Gshift = format->Gshift; Bshift = format->Bshift; Rloss = format->Rloss; Gloss = format->Gloss; Bloss = format->Bloss; if (surf->format->BytesPerPixel <= 0 || surf->format->BytesPerPixel > 4) return RAISE (PyExc_ValueError, "unsupport bit depth for surface array"); array = PyArray_FromDims (3, dim, PyArray_UBYTE); if (!array) return NULL; stridex = ((PyArrayObject*) array)->strides[0]; stridey = ((PyArrayObject*) array)->strides[1]; if (!PySurface_LockBy (surfobj, array)) { Py_DECREF (array); return NULL; } switch (surf->format->BytesPerPixel) { case 1: if (!format->palette) { Py_DECREF (array); if (!PySurface_UnlockBy (surfobj, array)) return NULL; return RAISE (PyExc_RuntimeError, "8bit surface has no palette"); } palette = format->palette->colors; for (loopy = 0; loopy < surf->h; ++loopy) { Uint8* pix = (Uint8*)(((char*) surf->pixels) + loopy * surf->pitch); Uint8* end = (Uint8*)(((char*)pix) + surf->w * surf->format->BytesPerPixel); data = ((Uint8*)((PyArrayObject*)array)->data) + stridey * loopy; while (pix < end) { SDL_Color* c = palette + (*pix++); data[0] = c->r; data[1] = c->g; data[2] = c->b; data += stridex; } } break; case 2: for (loopy = 0; loopy < surf->h; ++loopy) { Uint16* pix = (Uint16*)(((char*)surf->pixels) + loopy *surf->pitch); Uint16* end = (Uint16*)(((char*)pix) + surf->w * surf->format->BytesPerPixel); data = ((Uint8*)((PyArrayObject*)array)->data) + stridey * loopy; while (pix < end) { Uint32 color = *pix++; data[0] = ((color&Rmask)>>Rshift)<>Gshift)<>Bshift)<h; ++loopy) { Uint8* pix = (Uint8*)(((char*)surf->pixels)+loopy*surf->pitch); Uint8* end = (Uint8*)(((char*)pix)+surf->w*surf->format->BytesPerPixel); data = ((Uint8*)((PyArrayObject*)array)->data) + stridey*loopy; while (pix < end) { #if SDL_BYTEORDER == SDL_LIL_ENDIAN Uint32 color = (pix[0]) + (pix[1]<<8) + (pix[2]<<16); pix += 3; #else Uint32 color = (pix[2]) + (pix[1]<<8) + (pix[0]<<16); pix += 3; #endif /*assume no loss on 24bit*/ data[0] = ((color&Rmask)>>Rshift)/*<>Gshift)/*<>Bshift)/*<h; ++loopy) { Uint32* pix = (Uint32*)(((char*)surf->pixels)+loopy*surf->pitch); Uint32* end = (Uint32*)(((char*)pix)+surf->w*surf->format->BytesPerPixel); data = ((Uint8*)((PyArrayObject*)array)->data) + stridey*loopy; while (pix < end) { Uint32 color = *pix++; /*assume no loss on 32bit*/ data[0] = ((color&Rmask)>>Rshift)/*<>Gshift)/*<>Bshift)/*<w; dim[1] = surf->h; if (surf->format->BytesPerPixel <= 0 || surf->format->BytesPerPixel > 4) return RAISE (PyExc_ValueError, "unsupport bit depth for alpha array"); array = PyArray_FromDims (2, dim, PyArray_UBYTE); if (!array) return NULL; Amask = surf->format->Amask; Ashift = surf->format->Ashift; Aloss = surf->format->Aloss; if (!Amask || surf->format->BytesPerPixel==1) /*no pixel alpha*/ { memset (((PyArrayObject*) array)->data, 255, (size_t) surf->w * surf->h); return array; } stridex = ((PyArrayObject*) array)->strides[0]; stridey = ((PyArrayObject*) array)->strides[1]; if (!PySurface_LockBy (surfobj, array)) { Py_DECREF (array); return NULL; } switch (surf->format->BytesPerPixel) { case 2: for (loopy = 0; loopy < surf->h; ++loopy) { Uint16* pix = (Uint16*)(((char*)surf->pixels)+loopy*surf->pitch); Uint16* end = (Uint16*)(((char*)pix)+surf->w*2); data = ((Uint8*)((PyArrayObject*)array)->data) + stridey*loopy; while (pix < end) { color = *pix++; *data = (color & Amask) >> Ashift << Aloss; data += stridex; } } break; case 3: for (loopy = 0; loopy < surf->h; ++loopy) { Uint8* pix = (Uint8*)(((char*)surf->pixels)+loopy*surf->pitch); Uint8* end = pix+surf->w*3; data = ((Uint8*)((PyArrayObject*)array)->data) + stridey*loopy; while (pix < end) { #if SDL_BYTEORDER == SDL_LIL_ENDIAN color = pix[0] + (pix[1]<<8) + (pix[2]<<16); #else color = pix[2] + (pix[1]<<8) + (pix[0]<<16); #endif *data = (color & Amask) >> Ashift << Aloss; pix += 3; data += stridex; } } break; default: /*case 4*/ for (loopy = 0; loopy < surf->h; ++loopy) { Uint32* pix = (Uint32*)(((char*)surf->pixels)+loopy*surf->pitch); Uint32* end = (Uint32*)(((char*)pix)+surf->w*4); data = ((Uint8*)((PyArrayObject*)array)->data) + stridey*loopy; while (pix < end) { color = *pix++; /*assume no loss in 32bit*/ *data = (color & Amask) >> Ashift /*<< Aloss*/; data += stridex; } } break; } if (!PySurface_UnlockBy (surfobj, array)) { Py_DECREF (array); return NULL; } return array; } static PyObject* array_colorkey (PyObject* self, PyObject* arg) { int dim[2], loopy; Uint8* data; Uint32 color, colorkey; PyObject *array, *surfobj; SDL_Surface* surf; int stridex, stridey; if (!PyArg_ParseTuple (arg, "O!", &PySurface_Type, &surfobj)) return NULL; surf = PySurface_AsSurface (surfobj); dim[0] = surf->w; dim[1] = surf->h; if (surf->format->BytesPerPixel <= 0 || surf->format->BytesPerPixel > 4) return RAISE (PyExc_ValueError, "unsupport bit depth for colorkey array"); array = PyArray_FromDims (2, dim, PyArray_UBYTE); if(!array) return NULL; colorkey = surf->format->colorkey; if (!(surf->flags & SDL_SRCCOLORKEY)) /*no pixel alpha*/ { memset (((PyArrayObject*)array)->data, 255, (size_t) surf->w * surf->h); return array; } stridex = ((PyArrayObject*) array)->strides[0]; stridey = ((PyArrayObject*) array)->strides[1]; if (!PySurface_LockBy (surfobj, array)) { Py_DECREF (array); return NULL; } switch (surf->format->BytesPerPixel) { case 1: for (loopy = 0; loopy < surf->h; ++loopy) { Uint8* pix = (Uint8*)(((char*)surf->pixels)+loopy*surf->pitch); Uint8* end = (Uint8*)(((char*)pix)+surf->w); data = ((Uint8*)((PyArrayObject*)array)->data) + stridey*loopy; while (pix < end) { color = *pix++; *data = (color != colorkey) * 255; data += stridex; } } break; case 2: for (loopy = 0; loopy < surf->h; ++loopy) { Uint16* pix = (Uint16*)(((char*)surf->pixels)+loopy*surf->pitch); Uint16* end = (Uint16*)(((char*)pix)+surf->w*2); data = ((Uint8*)((PyArrayObject*)array)->data) + stridey*loopy; while (pix < end) { color = *pix++; *data = (color != colorkey) * 255; data += stridex; } } break; case 3: for (loopy = 0; loopy < surf->h; ++loopy) { Uint8* pix = (Uint8*)(((char*)surf->pixels)+loopy*surf->pitch); Uint8* end = pix+surf->w*3; data = ((Uint8*)((PyArrayObject*)array)->data) + stridey*loopy; while (pix < end) { #if SDL_BYTEORDER == SDL_LIL_ENDIAN color = pix[0] + (pix[1]<<8) + (pix[2]<<16); #else color = pix[2] + (pix[1]<<8) + (pix[0]<<16); #endif *data = (color != colorkey) * 255; pix += 3; data += stridex; } } break; default: /*case 4*/ for (loopy = 0; loopy < surf->h; ++loopy) { Uint32* pix = (Uint32*)(((char*)surf->pixels)+loopy*surf->pitch); Uint32* end = (Uint32*)(((char*)pix)+surf->w*4); data = ((Uint8*)((PyArrayObject*)array)->data) + stridey*loopy; while (pix < end) { color = *pix++; *data = (color != colorkey) * 255; data += stridex; } } break; } if (!PySurface_UnlockBy (surfobj, array)) { Py_DECREF (array); return NULL; } return array; } static PyObject* map_array (PyObject* self, PyObject* arg) { int* data; PyObject *surfobj, *arrayobj, *newarray; SDL_Surface* surf; SDL_PixelFormat* format; PyArrayObject* array; int loopx, loopy; int stridex, stridey, stridez, stridez2, sizex, sizey; int dims[2]; if (!PyArg_ParseTuple (arg, "O!O!", &PySurface_Type, &surfobj, &PyArray_Type, &arrayobj)) return NULL; surf = PySurface_AsSurface (surfobj); format = surf->format; array = (PyArrayObject*) arrayobj; if (!array->nd || array->dimensions[array->nd - 1] != 3) return RAISE (PyExc_ValueError, "array must be a 3d array of 3-value color data\n"); if (surf->format->BytesPerPixel <= 0 || surf->format->BytesPerPixel > 4) return RAISE (PyExc_ValueError, "unsupport bit depth for surface array"); switch (array->nd) { case 3: /*image of colors*/ dims[0] = array->dimensions[0]; dims[1] = array->dimensions[1]; newarray = PyArray_FromDims (2, dims, PyArray_INT); if (!newarray) return NULL; data = (int*)((PyArrayObject*) newarray)->data; stridex = array->strides[0]; stridey = array->strides[1]; stridez = array->strides[2]; sizex = array->dimensions[0]; sizey = array->dimensions[1]; break; case 2: /*list of colors*/ dims[0] = array->dimensions[0]; newarray = PyArray_FromDims (1, dims, PyArray_INT); if (!newarray) return NULL; data = (int*)((PyArrayObject*) newarray)->data; stridex = 0; stridey = array->strides[0]; stridez = array->strides[1]; sizex = 1; sizey = array->dimensions[0]; break; #if 1 /*kinda like a scalar here, use normal map_rgb*/ case 1: /*single color*/ dims[0] = 1; newarray = PyArray_FromDims (1, dims, PyArray_INT); if (!newarray) return NULL; data = (int*)((PyArrayObject*) newarray)->data; stridex = 0; stridey = 0; stridez = array->strides[0]; sizex = 1; sizey = 1; break; #endif default: return RAISE (PyExc_ValueError, "unsupported array shape"); } stridez2 = stridez * 2; switch (array->descr->elsize) { case sizeof (char): for (loopx = 0; loopx < sizex; ++loopx) { char* col = array->data + stridex * loopx; for (loopy = 0; loopy < sizey; ++loopy) { char* pix = col + stridey * loopy; *data++ = (*((unsigned char*)(pix)) >> format->Rloss << format->Rshift) | (*((unsigned char*)(pix+stridez)) >> format->Gloss << format->Gshift) | (*((unsigned char*)(pix+stridez2)) >> format->Bloss << format->Bshift); } } break; case sizeof (short): for (loopx = 0; loopx < sizex; ++loopx) { char* col = array->data + stridex * loopx; for (loopy = 0; loopy < sizey; ++loopy) { char* pix = col + stridey * loopy; *data++ = (*((unsigned short*)(pix)) >> format->Rloss << format->Rshift) | (*((unsigned short*)(pix+stridez)) >> format->Gloss << format->Gshift) | (*((unsigned short*)(pix+stridez2)) >> format->Bloss << format->Bshift); } } break; case sizeof(int): for (loopx = 0; loopx < sizex; ++loopx) { char* col = array->data + stridex * loopx; for (loopy = 0; loopy < sizey; ++loopy) { char* pix = col + stridey * loopy; *data++ = (*((int*)(pix)) >> format->Rloss << format->Rshift) | (*((int*)(pix+stridez)) >> format->Gloss << format->Gshift) | (*((int*)(pix+stridez2)) >> format->Bloss << format->Bshift); } } break; default: Py_DECREF (newarray); return RAISE (PyExc_ValueError, "unsupported bytesperpixel for array\n"); } return newarray; } /*macros used to blit arrays*/ #define COPYMACRO_2D(DST, SRC) \ for (loopy = 0; loopy < sizey; ++loopy) \ { \ DST* imgrow = (DST*)(((char*)surf->pixels)+loopy*surf->pitch); \ Uint8* datarow = (Uint8*)array->data + stridey * loopy; \ for (loopx = 0; loopx < sizex; ++loopx) \ *(imgrow + loopx) = (DST)*(SRC*)(datarow + stridex * loopx); \ } #define COPYMACRO_2D_24(SRC) \ for (loopy = 0; loopy < sizey-1; ++loopy) \ { \ Uint8* imgrow = ((Uint8*)surf->pixels)+loopy*surf->pitch; \ Uint8* datarow = (Uint8*)array->data + stridey * loopy; \ for (loopx = 0; loopx < sizex; ++loopx) \ *(int*)(imgrow + loopx*3) = \ (int)*(SRC*)(datarow + stridex * loopx)<<8; \ } \ { \ char* imgrow = ((char*)surf->pixels)+loopy*surf->pitch; \ char* datarow = array->data + stridey * loopy; \ for (loopx = 0; loopx < sizex-1; ++loopx) \ *(int*)(imgrow + loopx*3) = \ ((int)*(SRC*)(datarow + stridex * loopx))<<8; \ } #define COPYMACRO_3D(DST, SRC) \ for (loopy = 0; loopy < sizey; ++loopy) \ { \ DST* data = (DST*)(((char*)surf->pixels) + surf->pitch * loopy); \ char* pix = array->data + stridey * loopy; \ for (loopx = 0; loopx < sizex; ++loopx) { \ *data++ = (DST)(*(SRC*)(pix) >> Rloss << Rshift) | \ (*(SRC*)(pix+stridez) >> Gloss << Gshift) | \ (*(SRC*)(pix+stridez2) >> Bloss << Bshift); \ pix += stridex; \ } \ } #define COPYMACRO_3D_24(SRC) \ for (loopy = 0; loopy < sizey; ++loopy) \ { \ Uint8* data = ((Uint8*)surf->pixels) + surf->pitch * loopy; \ Uint8* pix = (Uint8*)array->data + stridey * loopy; \ for (loopx = 0; loopx < sizex; ++loopx) { \ *data++ = (Uint8)*(SRC*)(pix+stridez2); \ *data++ = (Uint8)*(SRC*)(pix+stridez); \ *data++ = (Uint8)*(SRC*)(pix); \ pix += stridex; \ } \ } static PyObject* blit_array (PyObject* self, PyObject* arg) { PyObject *surfobj, *arrayobj; SDL_Surface* surf; SDL_PixelFormat* format; PyArrayObject* array; int loopx, loopy; int stridex, stridey, stridez=0, stridez2=0, sizex, sizey; int Rloss, Gloss, Bloss, Rshift, Gshift, Bshift; if (!PyArg_ParseTuple(arg, "O!O!", &PySurface_Type, &surfobj, &PyArray_Type, &arrayobj)) return NULL; surf = PySurface_AsSurface (surfobj); format = surf->format; array = (PyArrayObject*) arrayobj; if (!(array->nd == 2 || (array->nd == 3 && array->dimensions[2] == 3))) return RAISE (PyExc_ValueError, "must be a valid 2d or 3d array\n"); if (surf->format->BytesPerPixel <= 0 || surf->format->BytesPerPixel > 4) return RAISE (PyExc_ValueError, "unsupport bit depth for surface"); stridex = array->strides[0]; stridey = array->strides[1]; if (array->nd == 3) { stridez = array->strides[2]; stridez2 = stridez*2; } sizex = array->dimensions[0]; sizey = array->dimensions[1]; Rloss = format->Rloss; Gloss = format->Gloss; Bloss = format->Bloss; Rshift = format->Rshift; Gshift = format->Gshift; Bshift = format->Bshift; if (sizex != surf->w || sizey != surf->h) return RAISE (PyExc_ValueError, "array must match surface dimensions"); if (!PySurface_LockBy (surfobj, (PyObject *) array)) return NULL; switch (surf->format->BytesPerPixel) { case 1: if (array->nd == 2) { switch (array->descr->elsize) { case sizeof (Uint8): COPYMACRO_2D(Uint8, Uint8); break; case sizeof (Uint16): COPYMACRO_2D(Uint8, Uint16); break; case sizeof (Uint32): COPYMACRO_2D(Uint8, Uint32); break; case sizeof (Uint64): COPYMACRO_2D(Uint8, Uint64); break; default: if (!PySurface_UnlockBy (surfobj, (PyObject *) array)) return NULL; return RAISE (PyExc_ValueError, "unsupported datatype for array\n"); } } break; case 2: if (array->nd == 2) { switch (array->descr->elsize) { case sizeof (Uint8): COPYMACRO_2D(Uint16, Uint8); break; case sizeof (Uint16): COPYMACRO_2D(Uint16, Uint16); break; case sizeof (Uint32): COPYMACRO_2D(Uint16, Uint32); break; case sizeof (Uint64): COPYMACRO_2D(Uint16, Uint64); break; default: if (!PySurface_UnlockBy (surfobj, (PyObject *) array)) return NULL; return RAISE (PyExc_ValueError, "unsupported datatype for array\n"); } } else { switch (array->descr->elsize) { case sizeof (Uint8): COPYMACRO_3D(Uint16, Uint8); break; case sizeof (Uint16): COPYMACRO_3D(Uint16, Uint16); break; case sizeof (Uint32): COPYMACRO_3D(Uint16, Uint32); break; case sizeof (Uint64): COPYMACRO_3D(Uint16, Uint64); break; default: if (!PySurface_UnlockBy (surfobj, (PyObject *) array)) return NULL; return RAISE (PyExc_ValueError, "unsupported datatype for array\n"); } } break; case 3: if (array->nd == 2) { switch (array->descr->elsize) { case sizeof (Uint8): COPYMACRO_2D_24(Uint8); break; case sizeof (Uint16): COPYMACRO_2D_24(Uint16); break; case sizeof (Uint32): COPYMACRO_2D_24(Uint32); break; case sizeof (Uint64): COPYMACRO_2D_24(Uint64); break; default: if (!PySurface_UnlockBy (surfobj, (PyObject *) array)) return NULL; return RAISE (PyExc_ValueError, "unsupported datatype for array\n"); } } else { switch (array->descr->elsize) { case sizeof (Uint8): COPYMACRO_3D_24(Uint8); break; case sizeof (Uint16): COPYMACRO_3D_24(Uint16); break; case sizeof (Uint32): COPYMACRO_3D_24(Uint32); break; case sizeof (Uint64): COPYMACRO_3D_24(Uint64); break; default: if (!PySurface_UnlockBy (surfobj, (PyObject *) array)) return NULL; return RAISE (PyExc_ValueError, "unsupported datatype for array\n"); } } break; case 4: if (array->nd == 2) { switch (array->descr->elsize) { case sizeof (Uint8): COPYMACRO_2D(Uint32, Uint8); break; case sizeof (Uint16): COPYMACRO_2D(Uint32, Uint16); break; case sizeof (Uint32): COPYMACRO_2D(Uint32, Uint32); break; case sizeof (Uint64): COPYMACRO_2D(Uint32, Uint64); break; default: if (!PySurface_UnlockBy (surfobj, (PyObject *) array)) return NULL; return RAISE (PyExc_ValueError, "unsupported datatype for array\n"); } } else { switch (array->descr->elsize) { case sizeof (Uint8): COPYMACRO_3D(Uint32, Uint8); break; case sizeof (Uint16): COPYMACRO_3D(Uint32, Uint16); break; case sizeof (Uint32): COPYMACRO_3D(Uint32, Uint32); break; case sizeof (Uint64): COPYMACRO_3D(Uint32, Uint64); break; default: if (!PySurface_UnlockBy (surfobj, (PyObject *) array)) return NULL; return RAISE (PyExc_ValueError, "unsupported datatype for array\n"); } } break; default: if (!PySurface_UnlockBy (surfobj, (PyObject *) array)) return NULL; return RAISE (PyExc_RuntimeError, "unsupported bit depth for image"); } if (!PySurface_UnlockBy (surfobj, (PyObject *) array)) return NULL; Py_RETURN_NONE; } static PyObject* make_surface (PyObject* self, PyObject* arg) { PyObject *arrayobj, *surfobj, *args; SDL_Surface* surf; PyArrayObject* array; int sizex, sizey, bitsperpixel; Uint32 rmask, gmask, bmask; if (!PyArg_ParseTuple (arg, "O!", &PyArray_Type, &arrayobj)) return NULL; array = (PyArrayObject*) arrayobj; if (!(array->nd == 2 || (array->nd == 3 && array->dimensions[2] == 3))) return RAISE (PyExc_ValueError, "must be a valid 2d or 3d array\n"); if (array->descr->type_num > PyArray_LONG) return RAISE (PyExc_ValueError, "Invalid array datatype for surface"); if (array->nd == 2) { bitsperpixel = 8; rmask = 0xFF >> 6 << 5; gmask = 0xFF >> 5 << 2; bmask = 0xFF >> 6; } else { bitsperpixel = 32; rmask = 0xFF<<16; gmask = 0xFF<<8; bmask = 0xFF; } sizex = array->dimensions[0]; sizey = array->dimensions[1]; surf = SDL_CreateRGBSurface (0, sizex, sizey, bitsperpixel, rmask, gmask, bmask, 0); if (!surf) return RAISE (PyExc_SDLError, SDL_GetError ()); surfobj = PySurface_New (surf); if (!surfobj) { SDL_FreeSurface (surf); return NULL; } args = Py_BuildValue ("(OO)", surfobj, array); if (!args) { Py_DECREF (surfobj); return NULL; } blit_array (NULL, args); Py_DECREF (args); if (PyErr_Occurred ()) { Py_DECREF (surfobj); return NULL; } return surfobj; } static PyMethodDef surfarray_builtins[] = { { "pixels2d", pixels2d, METH_VARARGS, DOC_PYGAMESURFARRAYPIXELS2D }, { "pixels3d", pixels3d, METH_VARARGS, DOC_PYGAMESURFARRAYPIXELS3D }, { "pixels_alpha", pixels_alpha, METH_VARARGS, DOC_PYGAMESURFARRAYPIXELSALPHA }, { "array2d", array2d, METH_VARARGS, DOC_PYGAMESURFARRAYARRAY2D }, { "array3d", array3d, METH_VARARGS, DOC_PYGAMESURFARRAYARRAY3D }, { "array_alpha", array_alpha, METH_VARARGS, DOC_PYGAMESURFARRAYARRAYALPHA }, { "array_colorkey", array_colorkey, METH_VARARGS, DOC_PYGAMESURFARRAYARRAYCOLORKEY }, { "map_array", map_array, METH_VARARGS, DOC_PYGAMESURFARRAYMAPARRAY }, /* { "unmap_array", unmap_array, METH_VARARGS, doc_unmap_array },*/ { "blit_array", blit_array, METH_VARARGS, DOC_PYGAMESURFARRAYBLITARRAY }, /* { "clamp_array", clamp_array, METH_VARARGS, doc_clamp_array }, not quick * enough to be worthwhile :[ */ { "make_surface", make_surface, METH_VARARGS, DOC_PYGAMESURFARRAYMAKESURFACE }, { NULL, NULL, 0, NULL} }; PYGAME_EXPORT void init_numericsurfarray (void) { /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { return; } import_pygame_surface (); if (PyErr_Occurred ()) { return; } import_array (); if (PyErr_Occurred ()) { return; } /* create the module */ Py_InitModule3 ("_numericsurfarray", surfarray_builtins, DOC_PYGAMESURFARRAY); } pygame-1.9.1release/src/_numericsndarray.c0000644000175000017500000001643611143210052020542 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ #include "pygame.h" #include "pygamedocs.h" #include "mixer.h" #include "numeric_arrayobject.h" #include static PyObject* sndarray_samples (PyObject* self, PyObject* arg) { int dim[2], numdims, type, formatbytes; PyObject *array, *chunkobj; Mix_Chunk* chunk; Uint16 format; int numchannels; if (!PyArg_ParseTuple (arg, "O!", &PySound_Type, &chunkobj)) return NULL; chunk = PySound_AsChunk (chunkobj); if (!Mix_QuerySpec (NULL, &format, &numchannels)) return RAISE (PyExc_SDLError, "Mixer not initialized"); formatbytes = (abs (format) & 0xff) / 8; switch (format) { case AUDIO_S8: type = PyArray_CHAR; break; case AUDIO_U8: type = PyArray_UBYTE; break; case AUDIO_S16SYS: type = PyArray_SHORT; break; case AUDIO_U16SYS: type = PyArray_USHORT; break; default: return RAISE (PyExc_TypeError, "Unpresentable audio format"); } numdims = (numchannels > 1) ? 2 : 1; dim[0] = chunk->alen / (numchannels*formatbytes); dim[1] = numchannels; array = PyArray_FromDimsAndData (numdims, dim, type, (char*)chunk->abuf); if(array) { Py_INCREF (chunkobj); ((PyArrayObject*) array)->base = chunkobj; ((PyArrayObject*) array)->flags |= SAVESPACE; } return array; } PyObject* sndarray_array (PyObject* self, PyObject* arg) { PyObject *array, *arraycopy=NULL; /*we'll let numeric do the copying for us*/ array = sndarray_samples (self, arg); if(array) { arraycopy = PyArray_Copy ((PyArrayObject*) array); Py_DECREF (array); } return arraycopy; } PyObject* sndarray_make_sound (PyObject* self, PyObject* arg) { PyObject *arrayobj; PyArrayObject *array; Mix_Chunk *chunk; Uint16 format; int numchannels, mixerbytes; int loop1, loop2, step1, step2, length, length2=0; Uint8 *src, *dst; if (!PyArg_ParseTuple (arg, "O!", &PyArray_Type, &arrayobj)) return NULL; array = (PyArrayObject*) arrayobj; if (!Mix_QuerySpec (NULL, &format, &numchannels)) return RAISE (PyExc_SDLError, "Mixer not initialized"); if (array->descr->type_num > PyArray_LONG) return RAISE (PyExc_ValueError, "Invalid array datatype for sound"); if (format==AUDIO_S8 || format==AUDIO_U8) mixerbytes = 1; else mixerbytes = 2; /*test array dimensions*/ if (numchannels == 1) { if (array->nd != 1) return RAISE (PyExc_ValueError, "Array must be 1-dimensional for mono mixer"); } else { if (array->nd != 2) return RAISE (PyExc_ValueError, "Array must be 2-dimensional for stereo mixer"); if (array->dimensions[1] != numchannels) return RAISE (PyExc_ValueError, "Array depth must match number of mixer channels"); } length = array->dimensions[0]; step1 = array->strides[0]; if (array->nd == 2) { length2 = array->dimensions[1]; step2 = array->strides[1]; } else { length2 = 1; /*since length2 == 1, this won't be used for looping*/ step2 = mixerbytes; } /*create chunk, we are screwed if SDL_mixer ever does more than * malloc/free*/ chunk = (Mix_Chunk *)malloc (sizeof (Mix_Chunk)); if (chunk == NULL) return RAISE (PyExc_MemoryError, "Cannot allocate chunk\n"); /*let's hope Mix_Chunk never changes also*/ chunk->alen = length * numchannels * mixerbytes; chunk->abuf = (Uint8*) malloc (chunk->alen); chunk->allocated = 1; chunk->volume = 128; if (step1 == mixerbytes * numchannels && step2 == mixerbytes) { /*OPTIMIZATION: in these cases, we don't need to loop through *the samples individually, because the bytes are already layed *out correctly*/ memcpy (chunk->abuf, array->data, chunk->alen); } else { dst = (Uint8*) chunk->abuf; if (mixerbytes == 1) { for (loop1 = 0; loop1 < length; loop1++) { src = (Uint8*) array->data + loop1*step1; switch (array->descr->elsize) { case 1: for (loop2=0; loop2data + loop1*step1; switch (array->descr->elsize) { case 1: for (loop2=0; loop2cameratype and depending * on the result, call v4l, v4l2, vfw, or other functions. */ /* colorspace() - Surface colorspace conversion */ PyObject* surf_colorspace (PyObject* self, PyObject* arg) { PyObject *surfobj, *surfobj2; SDL_Surface* surf, *newsurf; char* color; int cspace; surfobj2 = NULL; /*get all the arguments*/ if (!PyArg_ParseTuple (arg, "O!s|O!", &PySurface_Type, &surfobj, &color, &PySurface_Type, &surfobj2)) return NULL; if (!strcmp(color, "YUV")) { cspace = YUV_OUT; } else if (!strcmp(color, "HSV")) { cspace = HSV_OUT; } else { return RAISE (PyExc_ValueError, "Incorrect colorspace value"); } surf = PySurface_AsSurface (surfobj); if (!surfobj2) { newsurf = SDL_CreateRGBSurface (0, surf->w, surf->h, surf->format->BitsPerPixel, surf->format->Rmask, surf->format->Gmask, surf->format->Bmask, surf->format->Amask); if (!newsurf) { return NULL; } } else { newsurf = PySurface_AsSurface (surfobj2); } /* check to see if the size is the same. */ if (newsurf->w != surf->w || newsurf->h != surf->h) return RAISE (PyExc_ValueError, "Surfaces not the same width and height."); /* check to see if the format of the surface is the same. */ if (surf->format->BitsPerPixel != newsurf->format->BitsPerPixel) return RAISE (PyExc_ValueError, "Surfaces not the same depth"); SDL_LockSurface (newsurf); PySurface_Lock (surfobj); Py_BEGIN_ALLOW_THREADS; colorspace (surf, newsurf, cspace); Py_END_ALLOW_THREADS; PySurface_Unlock (surfobj); SDL_UnlockSurface (newsurf); if (surfobj2) { Py_INCREF (surfobj2); return surfobj2; } else return PySurface_New (newsurf); } /* list_cameras() - lists cameras available on the computer */ PyObject* list_cameras (PyObject* self, PyObject* arg) { #if defined(__unix__) PyObject* ret_list; PyObject* string; char** devices; int num_devices, i; num_devices = 0; ret_list = NULL; ret_list = PyList_New (0); if (!ret_list) return NULL; devices = v4l2_list_cameras(&num_devices); for(i = 0; i < num_devices; i++) { string = PyString_FromString(devices[i]); PyList_Append(ret_list, string); Py_DECREF(string); free(devices[i]); } free(devices); return ret_list; #else Py_RETURN_NONE; #endif } /* start() - opens, inits, and starts capturing on the camera */ PyObject* camera_start (PyCameraObject* self) { #if defined(__unix__) if (v4l2_open_device(self) == 0) { if (v4l_open_device(self) == 0) { v4l2_close_device(self); return NULL; } else { self->camera_type = CAM_V4L; if (v4l_init_device(self) == 0) { v4l2_close_device(self); return NULL; } if (v4l_start_capturing(self) == 0) { v4l2_close_device(self); return NULL; } } } else { self->camera_type = CAM_V4L2; if (v4l2_init_device(self) == 0) { v4l2_close_device(self); return NULL; } if (v4l2_start_capturing(self) == 0) { v4l2_close_device(self); return NULL; } } #endif Py_RETURN_NONE; } /* stop() - stops capturing, uninits, and closes the camera */ PyObject* camera_stop (PyCameraObject* self) { #if defined(__unix__) if (v4l2_stop_capturing(self) == 0) return NULL; if (v4l2_uninit_device(self) == 0) return NULL; if (v4l2_close_device(self) == 0) return NULL; #endif Py_RETURN_NONE; } /* get_controls() - gets current values of user controls */ /* TODO: Support brightness, contrast, and other common controls */ PyObject* camera_get_controls (PyCameraObject* self) { int value; #if defined(__unix__) if (v4l2_get_control(self->fd, V4L2_CID_HFLIP, &value)) self->hflip = value; if (v4l2_get_control(self->fd, V4L2_CID_VFLIP, &value)) self->vflip = value; if (v4l2_get_control(self->fd, V4L2_CID_BRIGHTNESS, &value)) self->brightness = value; #endif return Py_BuildValue ("(NNN)", PyBool_FromLong(self->hflip), PyBool_FromLong(self->vflip), PyInt_FromLong(self->brightness)); } /* set_controls() - changes camera settings if supported by the camera */ PyObject* camera_set_controls (PyCameraObject* self, PyObject* arg, PyObject *kwds) { int hflip = 0, vflip = 0, brightness = 0; char *kwids[] = {"hflip", "vflip", "brightness", NULL}; camera_get_controls(self); hflip = self->hflip; vflip = self->vflip; brightness = self->brightness; if (!PyArg_ParseTupleAndKeywords(arg, kwds, "|iii", kwids, &hflip, &vflip, &brightness)) return NULL; #if defined(__unix__) if (v4l2_set_control(self->fd, V4L2_CID_HFLIP, hflip)) self->hflip = hflip; if (v4l2_set_control(self->fd, V4L2_CID_VFLIP, vflip)) self->vflip = vflip; if (v4l2_set_control(self->fd, V4L2_CID_BRIGHTNESS, brightness)) self->brightness = brightness; #endif return Py_BuildValue ("(NNN)", PyBool_FromLong(self->hflip), PyBool_FromLong(self->vflip), PyInt_FromLong(self->brightness)); } /* get_size() - returns the dimensions of the images being recorded */ PyObject* camera_get_size (PyCameraObject* self) { return Py_BuildValue ("(ii)", self->width, self->height); } /* query_image() - checks if a frame is ready */ PyObject* camera_query_image (PyCameraObject* self) { #if defined(__unix__) return PyBool_FromLong(v4l2_query_buffer(self)); #endif Py_RETURN_NONE; } /* get_image() - returns an RGB Surface */ /* code to reuse Surface from René Dudfield */ PyObject* camera_get_image (PyCameraObject* self, PyObject* arg) { SDL_Surface* surf = NULL; PyObject *surfobj = NULL; if (!PyArg_ParseTuple (arg, "|O!", &PySurface_Type, &surfobj)) return NULL; if (!surfobj) { surf = SDL_CreateRGBSurface (0, self->width, self->height, 24, 0xFF<<16, 0xFF<<8, 0xFF, 0); } else { surf = PySurface_AsSurface (surfobj); } if (!surf) return NULL; if (surf->w != self->width || surf->h != self->height) { return RAISE (PyExc_ValueError, "Destination surface not the correct width or height."); } #if defined(__unix__) Py_BEGIN_ALLOW_THREADS; if (!v4l2_read_frame(self, surf)) return NULL; Py_END_ALLOW_THREADS; #endif if (!surf) return NULL; if (surfobj) { Py_INCREF (surfobj); return surfobj; } else { return PySurface_New (surf); } } /* get_raw() - returns an unmodified image as a string from the buffer */ PyObject* camera_get_raw(PyCameraObject* self) { #if defined(__unix__) return v4l2_read_raw(self); #endif Py_RETURN_NONE; } /* * Pixelformat conversion functions */ /* converts from rgb Surface to yuv or hsv */ /* TODO: Allow for conversion from yuv and hsv to all */ void colorspace (SDL_Surface *src, SDL_Surface *dst, int cspace) { switch (cspace) { case YUV_OUT: rgb_to_yuv (src->pixels, dst->pixels, src->h * src->w, 0, src->format); break; case HSV_OUT: rgb_to_hsv (src->pixels, dst->pixels, src->h * src->w, 0, src->format); break; } } /* converts pretty directly if its already RGB24 */ void rgb24_to_rgb (const void* src, void* dst, int length, SDL_PixelFormat* format) { Uint8 *s = (Uint8 *) src; Uint8 *d8; Uint16 *d16; Uint32 *d32; Uint8 r, g, b; int rshift, gshift, bshift, rloss, gloss, bloss; rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; rloss = format->Rloss; gloss = format->Gloss; bloss = format->Bloss; switch (format->BytesPerPixel) { case 1: d8 = (Uint8 *) dst; while (length--) { r = *s++; g = *s++; b = *s++; *d8++ = ((r >> rloss) << rshift) | ((g >> gloss) << gshift) | ((b >> bloss) << bshift); } break; case 2: d16 = (Uint16 *) dst; while (length--) { r = *s++; g = *s++; b = *s++; *d16++ = ((r >> rloss) << rshift) | ((g >> gloss) << gshift) | ((b >> bloss) << bshift); } break; case 3: d8 = (Uint8 *) dst; while (length--) { *d8++ = *(s+2); /* blue */ *d8++ = *(s+1); /* green */ *d8++ = *s; /* red */ s += 3; } break; default: d32 = (Uint32 *) dst; while (length--) { r = *s++; g = *s++; b = *s++; *d32++ = ((r >> rloss) << rshift) | ((g >> gloss) << gshift) | ((b >> bloss) << bshift); } break; } } /* converts packed rgb to packed hsv. formulas modified from wikipedia */ void rgb_to_hsv (const void* src, void* dst, int length, unsigned long source, SDL_PixelFormat* format) { Uint8 *s8, *d8; Uint16 *s16, *d16; Uint32 *s32, *d32; Uint8 r, g, b, p1, p2, h, s, v, max, min, delta; int rshift, gshift, bshift, rloss, gloss, bloss; s8 = (Uint8 *) src; s16 = (Uint16 *) src; s32 = (Uint32 *) src; d8 = (Uint8 *) dst; d16 = (Uint16 *) dst; d32 = (Uint32 *) dst; rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; rloss = format->Rloss; gloss = format->Gloss; bloss = format->Bloss; /* you could stick the if statement inside the loop, but I'm sacrificing a a few hundred bytes for a little performance */ if (source == V4L2_PIX_FMT_RGB444) { while (length--) { p1 = *s8++; p2 = *s8++; b = p2 << 4; g = p1 & 0xF0; r = p1 << 4; max = MAX(MAX(r, g), b); min = MIN(MIN(r, g), b); delta = max - min; v = max; /* value (similar to luminosity) */ if (!delta) { /* grey, zero hue and saturation */ s = 0; h = 0; } else { s = 255*delta/max; /* saturation */ if (r == max) { /* set hue based on max color */ h = 43*(g - b)/delta; } else if (g == max) { h = 85 + 43*(b - r)/delta; } else { h = 170 + 43*(r - g)/delta; } } switch (format->BytesPerPixel) { case 1: *d8++ = ((h >> rloss) << rshift) | ((s >> gloss) << gshift) | ((v >> bloss) << bshift); break; case 2: *d16++ = ((h >> rloss) << rshift) | ((s >> gloss) << gshift) | ((v >> bloss) << bshift); break; case 3: *d8++ = v; *d8++ = s; *d8++ = h; break; default: *d32++ = ((h >> rloss) << rshift) | ((s >> gloss) << gshift) | ((v >> bloss) << bshift); break; } } } else if (source == V4L2_PIX_FMT_RGB24) { while (length--) { r = *s8++; g = *s8++; b = *s8++; max = MAX(MAX(r, g), b); min = MIN(MIN(r, g), b); delta = max - min; v = max; /* value (similar to luminosity) */ if (!delta) { /* grey, zero hue and saturation */ s = 0; h = 0; } else { s = 255*delta/max; /* saturation */ if (r == max) { /* set hue based on max color */ h = 43*(g - b)/delta; } else if (g == max) { h = 85 + 43*(b - r)/delta; } else { h = 170 + 43*(r - g)/delta; } } switch (format->BytesPerPixel) { case 1: *d8++ = ((h >> rloss) << rshift) | ((s >> gloss) << gshift) | ((v >> bloss) << bshift); break; case 2: *d16++ = ((h >> rloss) << rshift) | ((s >> gloss) << gshift) | ((v >> bloss) << bshift); break; case 3: *d8++ = v; *d8++ = s; *d8++ = h; break; default: *d32++ = ((h >> rloss) << rshift) | ((s >> gloss) << gshift) | ((v >> bloss) << bshift); break; } } } else { /* for use as stage 2 in yuv or bayer to hsv, r and b switched */ while (length--) { switch (format->BytesPerPixel) { case 1: r = *s8 >> rshift << rloss; g = *s8 >> gshift << gloss; b = *s8++ >> bshift << bloss; break; case 2: r = *s16 >> rshift << rloss; g = *s16 >> gshift << gloss; b = *s16++ >> bshift << bloss; break; case 3: b = *s8++; g = *s8++; r = *s8++; break; default: r = *s32 >> rshift << rloss; g = *s32 >> gshift << gloss; b = *s32++ >> bshift << bloss; break; } max = MAX(MAX(r, g), b); min = MIN(MIN(r, g), b); delta = max - min; v = max; /* value (similar to luminosity) */ if (!delta) { /* grey, zero hue and saturation */ s = 0; h = 0; } else { s = 255*delta/max; /* saturation */ if (r == max) { /* set hue based on max color */ h = 43*(g - b)/delta; } else if (g == max) { h = 85 + 43*(b - r)/delta; } else { h = 170 + 43*(r - g)/delta; } } switch (format->BytesPerPixel) { case 1: *d8++ = ((h >> rloss) << rshift) | ((s >> gloss) << gshift) | ((v >> bloss) << bshift); break; case 2: *d16++ = ((h >> rloss) << rshift) + ((s >> gloss) << gshift) + ((v >> bloss) << bshift); break; case 3: *d8++ = v; *d8++ = s; *d8++ = h; break; default: *d32++ = ((h >> rloss) << rshift) | ((s >> gloss) << gshift) | ((v >> bloss) << bshift); break; } } } } /* convert packed rgb to yuv. Note that unlike many implementations of YUV, this has a full range of 0-255 for Y, not 16-235. Formulas from wikipedia */ void rgb_to_yuv (const void* src, void* dst, int length, unsigned long source, SDL_PixelFormat* format) { Uint8 *s8, *d8; Uint16 *s16, *d16; Uint32 *s32, *d32; Uint8 r, g, b, y, u, v; Uint8 p1, p2; int rshift, gshift, bshift, rloss, gloss, bloss; s8 = (Uint8 *) src; s16 = (Uint16 *) src; s32 = (Uint32 *) src; d8 = (Uint8 *) dst; d16 = (Uint16 *) dst; d32 = (Uint32 *) dst; rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; rloss = format->Rloss; gloss = format->Gloss; bloss = format->Bloss; if (source == V4L2_PIX_FMT_RGB444) { while (length--) { p1 = *s8++; p2 = *s8++; b = p2 << 4; g = p1 & 0xF0; r = p1 << 4; v = ((112*r-94*g-18*b + 128) >> 8) + 128; /* V */ u = ((-38*r-74*g+112*b + 128) >> 8) + 128; /* U */ y = (77*r+150*g+29*b + 128) >> 8; /* Y */ switch (format->BytesPerPixel) { case 1: *d8++ = ((y >> rloss) << rshift) | ((u >> gloss) << gshift) | ((v >> bloss) << bshift); break; case 2: *d16++ = ((y >> rloss) << rshift) | ((u >> gloss) << gshift) | ((v >> bloss) << bshift); break; case 3: *d8++ = v; *d8++ = u; *d8++ = y; break; default: *d32++ = ((y >> rloss) << rshift) | ((u >> gloss) << gshift) | ((v >> bloss) << bshift); break; } } } else if (source == V4L2_PIX_FMT_RGB24) { while (length--) { r = *s8++; g = *s8++; b = *s8++; v = ((112*r-94*g-18*b + 128) >> 8) + 128; /* V */ u = ((-38*r-74*g+112*b + 128) >> 8) + 128; /* U */ y = (77*r+150*g+29*b + 128) >> 8; /* Y */ switch (format->BytesPerPixel) { case 1: *d8++ = ((y >> rloss) << rshift) | ((u >> gloss) << gshift) | ((v >> bloss) << bshift); break; case 2: *d16++ = ((y >> rloss) << rshift) | ((u >> gloss) << gshift) | ((v >> bloss) << bshift); break; case 3: *d8++ = v; *d8++ = u; *d8++ = y; break; default: *d32++ = ((y >> rloss) << rshift) | ((u >> gloss) << gshift) | ((v >> bloss) << bshift); break; } } } else { /* for use as stage 2 in bayer to yuv, r and b switched */ switch (format->BytesPerPixel) { case 1: while (length--) { r = *s8 >> rshift << rloss; g = *s8 >> gshift << gloss; b = *s8++ >> bshift << bloss; *d8++ = ((((77*r+150*g+29*b + 128) >> 8) >> rloss) << rshift) | (((((-38*r-74*g+112*b + 128) >> 8) + 128) >> gloss) << gshift) | (((((112*r-94*g-18*b + 128) >> 8) + 128) >> bloss) << bshift); } break; case 2: while (length--) { r = *s16 >> rshift << rloss; g = *s16 >> gshift << gloss; b = *s16++ >> bshift << bloss; *d16++ = ((((77*r+150*g+29*b + 128) >> 8) >> rloss) << rshift) | (((((-38*r-74*g+112*b + 128) >> 8) + 128) >> gloss) << gshift) | (((((112*r-94*g-18*b + 128) >> 8) + 128) >> bloss) << bshift); } break; case 3: while (length--) { b = *s8++; g = *s8++; r = *s8++; *d8++ = ((112*r-94*g-18*b + 128) >> 8) + 128; *d8++ = ((-38*r-74*g+112*b + 128) >> 8) + 128; *d8++ = (77*r+150*g+29*b + 128) >> 8; } break; default: while (length--) { r = *s32 >> rshift << rloss; g = *s32 >> gshift << gloss; b = *s32++ >> bshift << bloss; *d32++ = ((((77*r+150*g+29*b + 128) >> 8) >> rloss) << rshift) | (((((-38*r-74*g+112*b + 128) >> 8) + 128) >> gloss) << gshift) | (((((112*r-94*g-18*b + 128) >> 8) + 128) >> bloss) << bshift); } break; } } } /* Converts from rgb444 (R444) to rgb24 (RGB3) */ void rgb444_to_rgb (const void* src, void* dst, int length, SDL_PixelFormat* format) { Uint8 *s, *d8; Uint16 *d16; Uint32 *d32; Uint8 p1, p2, r, g, b; int rshift, gshift, bshift, rloss, gloss, bloss; s = (Uint8 *) src; rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; rloss = format->Rloss; gloss = format->Gloss; bloss = format->Bloss; switch (format->BytesPerPixel) { case 1: d8 = (Uint8 *) dst; while (length--) { r = *s << 4; g = *s++ & 0xF0; b = *s++ << 4; *d8++ = ((r >> rloss) << rshift) | ((g >> gloss) << gshift) | ((b >> bloss) << bshift); } break; case 2: d16 = (Uint16 *) dst; while (length--) { r = *s << 4; g = *s++ & 0xF0; b = *s++ << 4; *d16++ = ((r >> rloss) << rshift) | ((g >> gloss) << gshift) | ((b >> bloss) << bshift); } break; case 3: d8 = (Uint8 *) dst; while (length--) { p1 = *s++; p2 = *s++; *d8++ = p2 << 4; /* blue */ *d8++ = p1 & 0xF0; /* green */ *d8++ = p1 << 4; /* red */ } break; default: d32 = (Uint32 *) dst; while (length--) { r = *s << 4; g = *s++ & 0xF0; b = *s++ << 4; *d32++ = ((r >> rloss) << rshift) | ((g >> gloss) << gshift) | ((b >> bloss) << bshift); } break; } } /* convert from 4:2:2 YUYV interlaced to RGB */ /* colorspace conversion routine from libv4l. Licensed LGPL 2.1 (C) 2008 Hans de Goede */ void yuyv_to_rgb (const void* src, void* dst, int length, SDL_PixelFormat* format) { Uint8 *s, *d8; Uint16 *d16; Uint32 *d32; int i; int r1, g1, b1, r2, b2, g2; int rshift, gshift, bshift, rloss, gloss, bloss, y1, y2, u, v, u1, rg, v1; rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; rloss = format->Rloss; gloss = format->Gloss; bloss = format->Bloss; d8 = (Uint8 *) dst; d16 = (Uint16 *) dst; d32 = (Uint32 *) dst; i = length >> 1; s = (Uint8 *) src; /* yuyv packs 2 pixels into every 4 bytes, sharing the u and v color terms between the 2, with each pixel having a unique y luminance term. Thus, we will operate on 2 pixels at a time. */ while (i--) { y1 = *s++; u = *s++; y2 = *s++; v = *s++; /* The lines from here to the switch statement are from libv4l */ u1 = (((u - 128) << 7) + (u - 128)) >> 6; rg = (((u - 128) << 1) + (u - 128) + ((v - 128) << 2) + ((v - 128) << 1)) >> 3; v1 = (((v - 128) << 1) + (v - 128)) >> 1; r1 = SAT2(y1 + v1); g1 = SAT2(y1 - rg); b1 = SAT2(y1 + u1); r2 = SAT2(y2 + v1); g2 = SAT2(y2 - rg); b2 = SAT2(y2 + u1); /* choose the right pixel packing for the destination surface depth */ switch (format->BytesPerPixel) { case 1: *d8++ = ((r1 >> rloss) << rshift) | ((g1 >> gloss) << gshift) | ((b1 >> bloss) << bshift); *d8++ = ((r2 >> rloss) << rshift) | ((g2 >> gloss) << gshift) | ((b2 >> bloss) << bshift); break; case 2: *d16++ = ((r1 >> rloss) << rshift) | ((g1 >> gloss) << gshift) | ((b1 >> bloss) << bshift); *d16++ = ((r2 >> rloss) << rshift) | ((g2 >> gloss) << gshift) | ((b2 >> bloss) << bshift); break; case 3: *d8++ = b1; *d8++ = g1; *d8++ = r1; *d8++ = b2; *d8++ = g2; *d8++ = r2; break; default: *d32++ = ((r1 >> rloss) << rshift) | ((g1 >> gloss) << gshift) | ((b1 >> bloss) << bshift); *d32++ = ((r2 >> rloss) << rshift) | ((g2 >> gloss) << gshift) | ((b2 >> bloss) << bshift); break; } } } /* turn yuyv into packed yuv. */ void yuyv_to_yuv (const void* src, void* dst, int length, SDL_PixelFormat* format) { Uint8 *s, *d8; Uint8 y1, u, y2, v; Uint16 *d16; Uint32 *d32; int i = length >> 1; int rshift, gshift, bshift, rloss, gloss, bloss; rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; rloss = format->Rloss; gloss = format->Gloss; bloss = format->Bloss; s = (Uint8 *) src; switch (format->BytesPerPixel) { case 1: d8 = (Uint8 *) dst; while (i--) { y1 = *s++; u = *s++; y2 = *s++; v = *s++; *d8++ = ((y1 >> rloss) << rshift) | ((u >> gloss) << gshift) | ((v >> bloss) << bshift); *d8++ = ((y2 >> rloss) << rshift) | ((u >> gloss) << gshift) | ((v >> bloss) << bshift); } break; case 2: d16 = (Uint16 *) dst; while (i--) { y1 = *s++; u = *s++; y2 = *s++; v = *s++; *d16++ = ((y1 >> rloss) << rshift) | ((u >> gloss) << gshift) | ((v >> bloss) << bshift); *d16++ = ((y2 >> rloss) << rshift) | ((u >> gloss) << gshift) | ((v >> bloss) << bshift); } break; case 3: d8 = (Uint8 *) dst; while (i--) { *d8++ = *(s+3); /* v */ *d8++ = *(s+1); /* u */ *d8++ = *s; /* y1 */ *d8++ = *(s+3); /* v */ *d8++ = *(s+1); /* u */ *d8++ = *(s+2); /* y2 */ s += 4; } break; default: d32 = (Uint32 *) dst; while (i--) { y1 = *s++; u = *s++; y2 = *s++; v = *s++; *d32++ = ((y1 >> rloss) << rshift) | ((u >> gloss) << gshift) | ((v >> bloss) << bshift); *d32++ = ((y2 >> rloss) << rshift) | ((u >> gloss) << gshift) | ((v >> bloss) << bshift); } break; } } /* Converts from 8 bit Bayer (BA81) to rgb24 (RGB3), based on: * Sonix SN9C101 based webcam basic I/F routines * Copyright (C) 2004 Takafumi Mizuno * * 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. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* FIXME: Seems to be grayscale and kind of dark on the OLPC XO Maybe the result of a different Bayer color order on the screen? */ /* TODO: Certainly not the most efficient way of doing this conversion. */ void sbggr8_to_rgb (const void* src, void* dst, int width, int height, SDL_PixelFormat* format) { Uint8 *rawpt, *d8; Uint16 *d16; Uint32 *d32; Uint8 r, g, b; int rshift, gshift, bshift, rloss, gloss, bloss; int i = width * height; rawpt = (Uint8*) src; rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; rloss = format->Rloss; gloss = format->Gloss; bloss = format->Bloss; d8 = (Uint8 *) dst; d16 = (Uint16 *) dst; d32 = (Uint32 *) dst; while (i--) { if ( (i/width) % 2 == 0 ) { /* even row (BGBGBGBG)*/ if ( (i % 2) == 0 ) { /* B */ if ( (i > width) && ((i % width) > 0) ) { b = *rawpt; /* B */ g = (*(rawpt-1)+*(rawpt+1)+ *(rawpt+width)+*(rawpt-width))/4; /* G */ r = (*(rawpt-width-1)+*(rawpt-width+1)+ *(rawpt+width-1)+*(rawpt+width+1))/4; /* R */ } else { /* first line or left column */ b = *rawpt; /* B */ g = (*(rawpt+1)+*(rawpt+width))/2; /* G */ r = *(rawpt+width+1); /* R */ } } else { /* (B)G */ if ( (i > width) && ((i % width) < (width-1)) ) { b = (*(rawpt-1)+*(rawpt+1))/2; /* B */ g = *rawpt; /* G */ r = (*(rawpt+width)+*(rawpt-width))/2; /* R */ } else { /* first line or right column */ b = *(rawpt-1); /* B */ g = *rawpt; /* G */ r = *(rawpt+width); /* R */ } } } else { /* odd row (GRGRGRGR) */ if ( (i % 2) == 0 ) { /* G(R) */ if ( (i < (width*(height-1))) && ((i % width) > 0) ) { b = (*(rawpt+width)+*(rawpt-width))/2; /* B */ g = *rawpt; /* G */ r = (*(rawpt-1)+*(rawpt+1))/2; /* R */ } else { /* bottom line or left column */ b = *(rawpt-width); /* B */ g = *rawpt; /* G */ r = *(rawpt+1); /* R */ } } else { /* R */ if ( i < (width*(height-1)) && ((i % width) < (width-1)) ) { b = (*(rawpt-width-1)+*(rawpt-width+1)+ *(rawpt+width-1)+*(rawpt+width+1))/4; /* B */ g = (*(rawpt-1)+*(rawpt+1)+ *(rawpt-width)+*(rawpt+width))/4; /* G */ r = *rawpt; /* R */ } else { /* bottom line or right column */ b = *(rawpt-width-1); /* B */ g = (*(rawpt-1)+*(rawpt-width))/2; /* G */ r = *rawpt; /* R */ } } } rawpt++; switch (format->BytesPerPixel) { case 1: *d8++ = ((r >> rloss) << rshift) | ((g >> gloss) << gshift) | ((b >> bloss) << bshift); break; case 2: *d16++ = ((r >> rloss) << rshift) | ((g >> gloss) << gshift) | ((b >> bloss) << bshift); break; case 3: *d8++ = b; *d8++ = g; *d8++ = r; break; default: *d32++ = ((r >> rloss) << rshift) | ((g >> gloss) << gshift) | ((b >> bloss) << bshift); break; } } } /* convert from YUV 4:2:0 (YU12) to RGB24 */ /* based on v4lconvert_yuv420_to_rgb24 in libv4l (C) 2008 Hans de Goede. LGPL */ void yuv420_to_rgb (const void* src, void* dst, int width, int height, SDL_PixelFormat* format) { int rshift, gshift, bshift, rloss, gloss, bloss, i, j, u1, v1, rg, y; const Uint8 *y1, *y2, *u, *v; Uint8 *d8_1, *d8_2; Uint16 *d16_1, *d16_2; Uint32 *d32_1, *d32_2; rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; rloss = format->Rloss; gloss = format->Gloss; bloss = format->Bloss; /* see http://en.wikipedia.org/wiki/YUV for an explanation of YUV420 */ y1 = (Uint8*) src; y2 = y1 + width; u = y1 + width * height; v = u + (width * height)/4; j = height/2; /* prepare the destination pointers for different surface depths. */ d8_1 = (Uint8 *) dst; /* the following is because d8 used for both 8 and 24 bit surfaces */ d8_2 = d8_1 + (format->BytesPerPixel == 3 ? width*3 : 3); d16_1 = (Uint16 *) dst; d16_2 = d16_1 + width; d32_1 = (Uint32 *) dst; d32_2 = d32_1 + width; /* for the sake of speed, the nested while loops are inside of the switch statement for the different surface bit depths */ switch(format->BytesPerPixel) { case 1: while(j--) { i = width/2; while(i--) { /* These formulas are from libv4l */ u1 = (((*u - 128) << 7) + (*u - 128)) >> 6; rg = (((*u - 128) << 1) + (*u - 128) + ((*v - 128) << 2) + ((*v - 128) << 1)) >> 3; v1 = (((*v - 128) << 1) + (*v - 128)) >> 1; u++; v++; /* do the pixels on row 1 */ y = *y1++; *d8_1++ = ((SAT2(y + v1) >> rloss) << rshift) | ((SAT2(y - rg) >> gloss) << gshift) | ((SAT2(y + u1) >> bloss) << bshift); y = *y1++; *d8_1++ = ((SAT2(y + v1) >> rloss) << rshift) | ((SAT2(y - rg) >> gloss) << gshift) | ((SAT2(y + u1) >> bloss) << bshift); /* do the pixels on row 2 */ y = *y2++; *d8_2++ = ((SAT2(y + v1) >> rloss) << rshift) | ((SAT2(y - rg) >> gloss) << gshift) | ((SAT2(y + u1) >> bloss) << bshift); y = *y2++; *d8_2++ = ((SAT2(y + v1) >> rloss) << rshift) | ((SAT2(y - rg) >> gloss) << gshift) | ((SAT2(y + u1) >> bloss) << bshift); } /* y2 is at the beginning of a new row, make it the new row 1 */ y1 = y2; /* and make row 2 one row further */ y2 += width; d8_1 = d8_2; d8_2 += width; } break; case 2: while(j--) { i = width/2; while(i--) { /* These formulas are from libv4l */ u1 = (((*u - 128) << 7) + (*u - 128)) >> 6; rg = (((*u - 128) << 1) + (*u - 128) + ((*v - 128) << 2) + ((*v - 128) << 1)) >> 3; v1 = (((*v - 128) << 1) + (*v - 128)) >> 1; u++; v++; /* do the pixels on row 1 */ y = *y1++; *d16_1++ = ((SAT2(y + v1) >> rloss) << rshift) | ((SAT2(y - rg) >> gloss) << gshift) | ((SAT2(y + u1) >> bloss) << bshift); y = *y1++; *d16_1++ = ((SAT2(y + v1) >> rloss) << rshift) | ((SAT2(y - rg) >> gloss) << gshift) | ((SAT2(y + u1) >> bloss) << bshift); /* do the pixels on row 2 */ y = *y2++; *d16_2++ = ((SAT2(y + v1) >> rloss) << rshift) | ((SAT2(y - rg) >> gloss) << gshift) | ((SAT2(y + u1) >> bloss) << bshift); y = *y2++; *d16_2++ = ((SAT2(y + v1) >> rloss) << rshift) | ((SAT2(y - rg) >> gloss) << gshift) | ((SAT2(y + u1) >> bloss) << bshift); } /* y2 is at the beginning of a new row, make it the new row 1 */ y1 = y2; /* and make row 2 one row further */ y2 += width; d16_1 = d16_2; d16_2 += width; } break; case 3: while(j--) { i = width/2; while(i--) { /* These formulas are from libv4l */ u1 = (((*u - 128) << 7) + (*u - 128)) >> 6; rg = (((*u - 128) << 1) + (*u - 128) + ((*v - 128) << 2) + ((*v - 128) << 1)) >> 3; v1 = (((*v - 128) << 1) + (*v - 128)) >> 1; u++; v++; /* do the pixels on row 1 */ y = *y1++; *d8_1++ = SAT2(y + u1); *d8_1++ = SAT2(y - rg); *d8_1++ = SAT2(y + v1); y = *y1++; *d8_1++ = SAT2(y + u1); *d8_1++ = SAT2(y - rg); *d8_1++ = SAT2(y + v1); /* do the pixels on row 2 */ y = *y2++; *d8_2++ = SAT2(y + u1); *d8_2++ = SAT2(y - rg); *d8_2++ = SAT2(y + v1); y = *y2++; *d8_2++ = SAT2(y + u1); *d8_2++ = SAT2(y - rg); *d8_2++ = SAT2(y + v1); } /* y2 is at the beginning of a new row, make it the new row 1 */ y1 = y2; /* and make row 2 one row further */ y2 += width; d8_1 = d8_2; /* since it is 3 bytes per pixel */ d8_2 += width*3; } break; default: while(j--) { i = width/2; while(i--) { /* These formulas are from libv4l */ u1 = (((*u - 128) << 7) + (*u - 128)) >> 6; rg = (((*u - 128) << 1) + (*u - 128) + ((*v - 128) << 2) + ((*v - 128) << 1)) >> 3; v1 = (((*v - 128) << 1) + (*v - 128)) >> 1; u++; v++; /* do the pixels on row 1 */ y = *y1++; *d32_1++ = ((SAT2(y + v1) >> rloss) << rshift) | ((SAT2(y - rg) >> gloss) << gshift) | ((SAT2(y + u1) >> bloss) << bshift); y = *y1++; *d32_1++ = ((SAT2(y + v1) >> rloss) << rshift) | ((SAT2(y - rg) >> gloss) << gshift) | ((SAT2(y + u1) >> bloss) << bshift); /* do the pixels on row 2 */ y = *y2++; *d32_2++ = ((SAT2(y + v1) >> rloss) << rshift) | ((SAT2(y - rg) >> gloss) << gshift) | ((SAT2(y + u1) >> bloss) << bshift); y = *y2++; *d32_2++ = ((SAT2(y + v1) >> rloss) << rshift) | ((SAT2(y - rg) >> gloss) << gshift) | ((SAT2(y + u1) >> bloss) << bshift); } /* y2 is at the beginning of a new row, make it the new row 1 */ y1 = y2; /* and make row 2 one row further */ y2 += width; d32_1 = d32_2; d32_2 += width; } break; } } /* turn yuv420 into packed yuv. */ void yuv420_to_yuv (const void* src, void* dst, int width, int height, SDL_PixelFormat* format) { const Uint8 *y1, *y2, *u, *v; Uint8 *d8_1, *d8_2; Uint16 *d16_1, *d16_2; Uint32 *d32_1, *d32_2; int rshift, gshift, bshift, rloss, gloss, bloss, j, i; rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; rloss = format->Rloss; gloss = format->Gloss; bloss = format->Bloss; d8_1 = (Uint8 *) dst; d8_2 = d8_1 + (format->BytesPerPixel == 3 ? width*3 : 3); d16_1 = (Uint16 *) dst; d16_2 = d16_1 + width; d32_1 = (Uint32 *) dst; d32_2 = d32_1 + width; y1 = (Uint8 *) src; y2 = y1 + width; u = y1 + width * height; v = u + (width * height) / 4; j = height / 2; switch (format->BytesPerPixel) { case 1: while (j--) { i = width/2; while (i--) { *d8_1++ = ((*y1++ >> rloss) << rshift) | ((*u >> gloss) << gshift) | ((*v >> bloss) << bshift); *d8_1++ = ((*y1++ >> rloss) << rshift) | ((*u >> gloss) << gshift) | ((*v >> bloss) << bshift); *d8_2++ = ((*y2++ >> rloss) << rshift) | ((*u >> gloss) << gshift) | ((*v >> bloss) << bshift); *d8_2++ = ((*y2++ >> rloss) << rshift) | ((*u++ >> gloss) << gshift) | ((*v++ >> bloss) << bshift); } y1 = y2; y2 += width; d8_1 = d8_2; d8_2 += width; } break; case 2: while (j--) { i = width/2; while (i--) { *d16_1++ = ((*y1++ >> rloss) << rshift) | ((*u >> gloss) << gshift) | ((*v >> bloss) << bshift); *d16_1++ = ((*y1++ >> rloss) << rshift) | ((*u >> gloss) << gshift) | ((*v >> bloss) << bshift); *d16_2++ = ((*y2++ >> rloss) << rshift) | ((*u >> gloss) << gshift) | ((*v >> bloss) << bshift); *d16_2++ = ((*y2++ >> rloss) << rshift) | ((*u++ >> gloss) << gshift) | ((*v++ >> bloss) << bshift); } y1 = y2; y2 += width; d16_1 = d16_2; d16_2 += width; } break; case 3: while (j--) { i = width/2; while (i--) { *d8_1++ = *v; *d8_1++ = *u; *d8_1++ = *y1++; *d8_1++ = *v; *d8_1++ = *u; *d8_1++ = *y1++; *d8_2++ = *v; *d8_2++ = *u; *d8_2++ = *y2++; *d8_2++ = *v++; *d8_2++ = *u++; *d8_2++ = *y2++; } y1 = y2; y2 += width; d8_1 = d8_2; d8_2 += width*3; } break; default: while (j--) { i = width/2; while (i--) { *d32_1++ = ((*y1++ >> rloss) << rshift) | ((*u >> gloss) << gshift) | ((*v >> bloss) << bshift); *d32_1++ = ((*y1++ >> rloss) << rshift) | ((*u >> gloss) << gshift) | ((*v >> bloss) << bshift); *d32_2++ = ((*y2++ >> rloss) << rshift) | ((*u >> gloss) << gshift) | ((*v >> bloss) << bshift); *d32_2++ = ((*y2++ >> rloss) << rshift) | ((*u++ >> gloss) << gshift) | ((*v++ >> bloss) << bshift); } y1 = y2; y2 += width; d32_1 = d32_2; d32_2 += width; } break; } } /* * Python API stuff */ PyMethodDef cameraobj_builtins[] = { { "start", (PyCFunction) camera_start, METH_NOARGS, DOC_CAMERASTART }, { "stop", (PyCFunction) camera_stop, METH_NOARGS, DOC_CAMERASTOP }, { "get_controls", (PyCFunction) camera_get_controls, METH_NOARGS, DOC_CAMERAGETCONTROLS }, { "set_controls", (PyCFunction) camera_set_controls, METH_KEYWORDS, DOC_CAMERASETCONTROLS }, { "get_size", (PyCFunction) camera_get_size, METH_NOARGS, DOC_CAMERAGETSIZE }, { "query_image", (PyCFunction) camera_query_image, METH_NOARGS, DOC_CAMERAQUERYIMAGE }, { "get_image", (PyCFunction) camera_get_image, METH_VARARGS, DOC_CAMERAGETIMAGE }, { "get_raw", (PyCFunction) camera_get_raw, METH_NOARGS, DOC_CAMERAGETRAW }, { NULL, NULL, 0, NULL } }; void camera_dealloc (PyObject* self) { free(((PyCameraObject*) self)->device_name); PyObject_DEL (self); } PyObject* camera_getattr(PyObject* self, char* attrname) { return Py_FindMethod(cameraobj_builtins, self, attrname); } PyTypeObject PyCamera_Type = { PyObject_HEAD_INIT(NULL) 0, "Camera", sizeof(PyCameraObject), 0, camera_dealloc, 0, camera_getattr, NULL, /*setattr*/ NULL, /*compare*/ NULL, /*repr*/ NULL, /*as_number*/ NULL, /*as_sequence*/ NULL, /*as_mapping*/ (hashfunc)NULL, /*hash*/ (ternaryfunc)NULL, /*call*/ (reprfunc)NULL, /*str*/ 0L,0L,0L,0L, DOC_PYGAMECAMERACAMERA /* Documentation string */ }; PyObject* Camera (PyCameraObject* self, PyObject* arg) { int w, h; char* dev_name = NULL; char* color = NULL; PyCameraObject *cameraobj; w = DEFAULT_WIDTH; h = DEFAULT_HEIGHT; if (!PyArg_ParseTuple(arg, "s|(ii)s", &dev_name, &w, &h, &color)) return NULL; cameraobj = PyObject_NEW (PyCameraObject, &PyCamera_Type); if (cameraobj) { cameraobj->device_name = (char*) malloc((strlen(dev_name)+1)*sizeof(char)); strcpy(cameraobj->device_name, dev_name); cameraobj->camera_type = 0; cameraobj->pixelformat = 0; if (color) { if (!strcmp(color, "YUV")) { cameraobj->color_out = YUV_OUT; } else if (!strcmp(color, "HSV")) { cameraobj->color_out = HSV_OUT; } else { cameraobj->color_out = RGB_OUT; } } else { cameraobj->color_out = RGB_OUT; } cameraobj->buffers = NULL; cameraobj->n_buffers = 0; cameraobj->width = w; cameraobj->height = h; cameraobj->size = 0; cameraobj->hflip = 0; cameraobj->vflip = 0; cameraobj->brightness = 0; cameraobj->fd = -1; } return (PyObject*)cameraobj; } PyMethodDef camera_builtins[] = { { "colorspace", surf_colorspace, METH_VARARGS, DOC_PYGAMECAMERACOLORSPACE }, { "list_cameras", list_cameras, METH_NOARGS, DOC_PYGAMECAMERALISTCAMERAS }, { "Camera", (PyCFunction) Camera, METH_VARARGS, DOC_PYGAMECAMERACAMERA }, { NULL, NULL, 0, NULL } }; void init_camera(void) { PyObject *module, *dict; /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base (); if (PyErr_Occurred ()) { return; } import_pygame_surface (); if (PyErr_Occurred ()) { return; } /* type preparation */ PyType_Init(PyCamera_Type); /* create the module */ module = Py_InitModule3("_camera", camera_builtins, DOC_PYGAMECAMERA); dict = PyModule_GetDict(module); PyDict_SetItemString(dict, "CameraType", (PyObject *)&PyCamera_Type); } pygame-1.9.1release/src/_arraysurfarray.c0000644000175000017500000003511311207055754020423 0ustar vincentvincent/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pete Shinners pete@shinners.org */ #include #include "pygame.h" #include "pgcompat.h" #include "pygamedocs.h" #include "pgarrinter.h" #include static int _get_array_interface(PyObject *obj, PyObject **cobj_p, PyArrayInterface **inter_p) { if (!(*cobj_p = PyObject_GetAttrString(obj, "__array_struct__"))) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); PyErr_SetString(PyExc_ValueError, "no C-struct array interface"); } return 0; } if (!PyCObject_Check(*cobj_p) || /* conditional 'or's */ !(*inter_p = PyCObject_AsVoidPtr(*cobj_p)) || (*inter_p)->two != 2) { Py_DECREF(*cobj_p); PyErr_SetString(PyExc_ValueError, "invalid array interface"); return 0; } return 1; } /*macros used to blit arrays*/ #define COPYMACRO_2D(DST, SRC) \ for (loopy = 0; loopy < sizey; ++loopy) \ { \ DST* imgrow = (DST*)(((char*)surf->pixels)+loopy*surf->pitch); \ Uint8* datarow = (Uint8*)array_data + stridey * loopy; \ for (loopx = 0; loopx < sizex; ++loopx) \ *(imgrow + loopx) = (DST)*(SRC*)(datarow + stridex * loopx); \ } #if SDL_BYTEORDER == SDL_LIL_ENDIAN #define COPYMACRO_2D_24_PIXEL(pix, data, SRC) \ *pix++ = *data; \ *pix++ = *(data + 1); \ *pix++ = *(data + 2); #else #define COPYMACRO_2D_24_PIXEL(pix, data, SRC) \ *pix++ = *(data + sizeof (SRC) - 1); \ *pix++ = *(data + sizeof (SRC) - 2); \ *pix++ = *(data + sizeof (SRC) - 3); #endif #define COPYMACRO_2D_24(SRC) \ for (loopy = 0; loopy < sizey; ++loopy) \ { \ Uint8 *pix = ((Uint8 *)surf->pixels) + loopy * surf->pitch; \ Uint8 *data = (Uint8 *)array_data + stridey * loopy; \ Uint8 *end = pix + 3 * sizex; \ while (pix != end) { \ COPYMACRO_2D_24_PIXEL(pix, data, SRC) \ data += stridex; \ } \ } #define COPYMACRO_3D(DST, SRC) \ for (loopy = 0; loopy < sizey; ++loopy) \ { \ DST *pix = (DST *)(((char *)surf->pixels) + surf->pitch * loopy); \ char *data = array_data + stridey * loopy; \ for (loopx = 0; loopx < sizex; ++loopx) { \ *pix++ = (DST)(*(SRC *)(data) >> Rloss << Rshift) | \ (*(SRC *)(data+stridez) >> Gloss << Gshift) | \ (*(SRC *)(data+stridez2) >> Bloss << Bshift) | \ alpha; \ data += stridex; \ } \ } #define COPYMACRO_3D_24(SRC) \ for (loopy = 0; loopy < sizey; ++loopy) \ { \ Uint8 *pix = ((Uint8*)surf->pixels) + surf->pitch * loopy; \ Uint8 *data = (Uint8*)array_data + stridey * loopy; \ Uint8 *end = pix + 3 * sizex; \ while (pix != end) { \ *pix++ = (Uint8)*(SRC*)(data + stridez_0); \ *pix++ = (Uint8)*(SRC*)(data + stridez_1); \ *pix++ = (Uint8)*(SRC*)(data + stridez_2); \ data += stridex; \ } \ } static PyObject* blit_array(PyObject* self, PyObject* arg) { PyObject *surfobj, *arrayobj; PyObject *cobj; PyArrayInterface *inter; char *array_data; SDL_Surface* surf; SDL_PixelFormat* format; int loopx, loopy; int stridex, stridey, stridez=0, stridez2=0, sizex, sizey; int Rloss, Gloss, Bloss, Rshift, Gshift, Bshift; if (!PyArg_ParseTuple(arg, "O!O", &PySurface_Type, &surfobj, &arrayobj)) { return NULL; } surf = PySurface_AsSurface(surfobj); format = surf->format; if (!_get_array_interface(arrayobj, &cobj, &inter)) { return 0; } switch (inter->typekind) { case 'i': /* integer */ break; case 'u': /* unsigned integer */ break; case 'S': /* fixed length character field */ break; case 'V': /* structured element: record */ break; default: Py_DECREF(cobj); PyErr_Format(PyExc_ValueError, "unsupported array type '%c'", inter->typekind); return NULL; } if (!(inter->nd == 2 || (inter->nd == 3 && inter->shape[2] == 3))) return RAISE(PyExc_ValueError, "must be a valid 2d or 3d array\n"); if (surf->format->BytesPerPixel <= 0 || surf->format->BytesPerPixel > 4) return RAISE(PyExc_ValueError, "unsupport bit depth for surface"); stridex = inter->strides[0]; stridey = inter->strides[1]; if (inter->nd == 3) { stridez = inter->strides[2]; stridez2 = stridez*2; } sizex = inter->shape[0]; sizey = inter->shape[1]; Rloss = format->Rloss; Gloss = format->Gloss; Bloss = format->Bloss; Rshift = format->Rshift; Gshift = format->Gshift; Bshift = format->Bshift; if (sizex != surf->w || sizey != surf->h) { Py_DECREF(cobj); return RAISE(PyExc_ValueError, "array must match surface dimensions"); } if (!PySurface_LockBy(surfobj, (PyObject *) arrayobj)) { Py_DECREF(cobj); return NULL; } array_data = (char *)inter->data; switch (surf->format->BytesPerPixel) { case 1: if (inter->nd == 2) { switch (inter->itemsize) { case sizeof (Uint8): COPYMACRO_2D(Uint8, Uint8); break; case sizeof (Uint16): COPYMACRO_2D(Uint8, Uint16); break; case sizeof (Uint32): COPYMACRO_2D(Uint8, Uint32); break; case sizeof (Uint64): COPYMACRO_2D(Uint8, Uint64); break; default: Py_DECREF(cobj); if (!PySurface_UnlockBy(surfobj, (PyObject *) arrayobj)) { return NULL; } return RAISE(PyExc_ValueError, "unsupported datatype for array\n"); } } else { Py_DECREF(cobj); if (!PySurface_UnlockBy(surfobj, (PyObject *) arrayobj)) { return NULL; } return RAISE(PyExc_ValueError, "unsupported datatype for array\n"); } break; case 2: if (inter->nd == 2) { switch (inter->itemsize) { case sizeof (Uint16): COPYMACRO_2D(Uint16, Uint16); break; case sizeof (Uint32): COPYMACRO_2D(Uint16, Uint32); break; case sizeof (Uint64): COPYMACRO_2D(Uint16, Uint64); break; default: Py_DECREF(cobj); if (!PySurface_UnlockBy(surfobj, (PyObject *) arrayobj)) { return NULL; } return RAISE(PyExc_ValueError, "unsupported datatype for array\n"); } } else { Uint16 alpha = 0; if (format->Amask) { alpha = 255 >> format->Aloss << format->Ashift; } switch (inter->itemsize) { case sizeof (Uint8): COPYMACRO_3D(Uint16, Uint8); break; case sizeof (Uint16): COPYMACRO_3D(Uint16, Uint16); break; case sizeof (Uint32): COPYMACRO_3D(Uint16, Uint32); break; case sizeof (Uint64): COPYMACRO_3D(Uint16, Uint64); break; default: Py_DECREF(cobj); if (!PySurface_UnlockBy(surfobj, (PyObject *) arrayobj)) { return NULL; } return RAISE(PyExc_ValueError, "unsupported datatype for array\n"); } } break; case 3: /* Assumption: The rgb components of a 24 bit pixel are in separate bytes. */ if (inter->nd == 2) { switch (inter->itemsize) { case sizeof (Uint32): COPYMACRO_2D_24(Uint32); break; case sizeof (Uint64): COPYMACRO_2D_24(Uint64); break; default: Py_DECREF(cobj); if (!PySurface_UnlockBy(surfobj, (PyObject *) arrayobj)) { return NULL; } return RAISE(PyExc_ValueError, "unsupported datatype for array\n"); } } else { #if SDL_BYTEORDER == SDL_LIL_ENDIAN size_t stridez_0 = (Rshift == 0 ? 0 : Gshift == 0 ? stridez : stridez2 ); size_t stridez_1 = (Rshift == 8 ? 0 : Gshift == 8 ? stridez : stridez2 ); size_t stridez_2 = (Rshift == 16 ? 0 : Gshift == 16 ? stridez : stridez2 ); #else size_t stridez_2 = (Rshift == 0 ? 0 : Gshift == 0 ? stridez : stridez2 ); size_t stridez_1 = (Rshift == 8 ? 0 : Gshift == 8 ? stridez : stridez2 ); size_t stridez_0 = (Rshift == 16 ? 0 : Gshift == 16 ? stridez : stridez2 ); #endif switch (inter->itemsize) { case sizeof (Uint8): COPYMACRO_3D_24(Uint8); break; case sizeof (Uint16): COPYMACRO_3D_24(Uint16); break; case sizeof (Uint32): COPYMACRO_3D_24(Uint32); break; case sizeof (Uint64): COPYMACRO_3D_24(Uint64); break; default: Py_DECREF(cobj); if (!PySurface_UnlockBy(surfobj, (PyObject *) arrayobj)) { return NULL; } return RAISE(PyExc_ValueError, "unsupported datatype for array\n"); } } break; case 4: if (inter->nd == 2) { switch (inter->itemsize) { case sizeof (Uint32): COPYMACRO_2D(Uint32, Uint32); break; case sizeof (Uint64): COPYMACRO_2D(Uint32, Uint64); break; default: Py_DECREF(cobj); if (!PySurface_UnlockBy(surfobj, (PyObject *) arrayobj)) { return NULL; } return RAISE(PyExc_ValueError, "unsupported datatype for array\n"); } } else { Uint32 alpha = 0; if (format->Amask) { alpha = 255 >> format->Aloss << format->Ashift; } switch (inter->itemsize) { case sizeof (Uint8): COPYMACRO_3D(Uint32, Uint8); break; case sizeof (Uint16): COPYMACRO_3D(Uint32, Uint16); break; case sizeof (Uint32): COPYMACRO_3D(Uint32, Uint32); break; case sizeof (Uint64): COPYMACRO_3D(Uint32, Uint64); break; default: Py_DECREF(cobj); if (!PySurface_UnlockBy(surfobj, (PyObject *) arrayobj)) { return NULL; } return RAISE(PyExc_ValueError, "unsupported datatype for array\n"); } } break; default: Py_DECREF(cobj); if (!PySurface_UnlockBy(surfobj, (PyObject *) arrayobj)) { return NULL; } return RAISE(PyExc_RuntimeError, "unsupported bit depth for image"); } Py_DECREF(cobj); if (!PySurface_UnlockBy(surfobj, (PyObject *) arrayobj)) { return NULL; } Py_RETURN_NONE; } static PyMethodDef _arraysurfarray_methods[] = { { "blit_array", blit_array, METH_VARARGS, DOC_PYGAMESURFARRAYBLITARRAY }, { NULL, NULL, 0, NULL} }; MODINIT_DEFINE (_arraysurfarray) { PyObject *module; #if PY3 static struct PyModuleDef _module = { PyModuleDef_HEAD_INIT, "_arraysurfarray", DOC_PYGAMESURFARRAY, -1, _arraysurfarray_methods, NULL, NULL, NULL, NULL }; #endif /* imported needed apis; Do this first so if there is an error the module is not loaded. */ import_pygame_base(); if (PyErr_Occurred ()) { MODINIT_ERROR; } import_pygame_surface(); if (PyErr_Occurred ()) { MODINIT_ERROR; } #if PY3 module = PyModule_Create(&_module); #else module = Py_InitModule3("_arraysurfarray", _arraysurfarray_methods, DOC_PYGAMESURFARRAY); #endif MODINIT_RETURN(module); } pygame-1.9.1release/pygame.egg-info/top_level.txt0000644000175000017500000000000711236514371021751 0ustar vincentvincentpygame pygame-1.9.1release/pygame.egg-info/SOURCES.txt0000644000175000017500000002777311236514371021126 0ustar vincentvincentLGPL MANIFEST.in README.txt Setup.in Setup_Darwin.in Setup_Win_Common.in WHATSNEW bdist_mpkg_support.py bundle_docs.py check_test.py config.py config_darwin.py config_msys.py config_unix.py config_win.py distutils_mods.py dll.py install.html make_prebuilt.py makeref.py mingw32ccompiler.py mingw32distutils.py mingwcfg.py msys.py msys_build_deps.py msys_link_VC_2008_dlls.py msysio.py readme.html readme.txt run_tests.py setup.py setup_win_common.py docs/LGPL docs/__init__.py docs/__main__.py docs/howto_release_pygame.txt docs/index.html docs/logos.html docs/pygame_logo.gif docs/pygame_powered.gif docs/pygame_small.gif docs/pygame_tiny.gif docs/ref/camera.html docs/ref/cdrom.html docs/ref/color.html docs/ref/cursors.html docs/ref/display.html docs/ref/draw.html docs/ref/event.html docs/ref/examples.html docs/ref/font.html docs/ref/gfxdraw.html docs/ref/image.html docs/ref/index.html docs/ref/joystick.html docs/ref/key.html docs/ref/locals.html docs/ref/mask.html docs/ref/midi.html docs/ref/mixer.html docs/ref/mouse.html docs/ref/movie.html docs/ref/music.html docs/ref/overlay.html docs/ref/pixelarray.html docs/ref/pygame.html docs/ref/pygame_cursor.html docs/ref/rect.html docs/ref/scrap.html docs/ref/sndarray.html docs/ref/sprite.html docs/ref/surface.html docs/ref/surfarray.html docs/ref/tests.html docs/ref/time.html docs/ref/transform.html docs/tut/DisplayModes.html docs/tut/ImportInit.html docs/tut/MoveIt.html docs/tut/SpriteIntro.html docs/tut/newbieguide.html docs/tut/camera/CameraIntro.html docs/tut/camera/average.jpg docs/tut/camera/background.jpg docs/tut/camera/green.jpg docs/tut/camera/hsv.jpg docs/tut/camera/mask.jpg docs/tut/camera/rgb.jpg docs/tut/camera/thresh.jpg docs/tut/camera/thresholded.jpg docs/tut/camera/yuv.jpg docs/tut/chimp/ChimpLineByLine.html docs/tut/chimp/chimp.py.html docs/tut/chimp/chimpshot.gif docs/tut/intro/ball.gif docs/tut/intro/blade.jpg docs/tut/intro/freedom.jpg docs/tut/intro/intro.html docs/tut/surfarray/SurfarrayIntro.html docs/tut/surfarray/allblack.jpg docs/tut/surfarray/flipped.jpg docs/tut/surfarray/imgarray.jpg docs/tut/surfarray/redimg.jpg docs/tut/surfarray/scaledown.jpg docs/tut/surfarray/scaleup.jpg docs/tut/surfarray/soften.jpg docs/tut/surfarray/striped.jpg docs/tut/surfarray/xfade.jpg docs/tut/tom/MakeGames.html docs/tut/tom/basic.png docs/tut/tom/event-flowchart.png docs/tut/tom/formulae.png docs/tut/tom/games2.html docs/tut/tom/games3.html docs/tut/tom/games4.html docs/tut/tom/games5.html docs/tut/tom/games6.html docs/tut/tom/radians.png examples/__init__.py examples/aacircle.py examples/aliens.py examples/arraydemo.py examples/blend_fill.py examples/blit_blends.py examples/camera.py examples/chimp.py examples/cursors.py examples/eventlist.py examples/fastevents.py examples/fonty.py examples/glcube.py examples/headless_no_windows_needed.py examples/liquid.py examples/mask.py examples/midi.py examples/moveit.py examples/movieplayer.py examples/oldalien.py examples/overlay.py examples/pixelarray.py examples/readme.txt examples/scaletest.py examples/scrap_clipboard.py examples/scroll.py examples/sound.py examples/sound_array_demos.py examples/stars.py examples/testsprite.py examples/vgrade.py examples/data/alien1.gif examples/data/alien1.jpg examples/data/alien1.png examples/data/alien2.gif examples/data/alien2.png examples/data/alien3.gif examples/data/alien3.png examples/data/arraydemo.bmp examples/data/asprite.bmp examples/data/background.gif examples/data/blue.mpg examples/data/bomb.gif examples/data/boom.wav examples/data/car_door.wav examples/data/chimp.bmp examples/data/danger.gif examples/data/explosion1.gif examples/data/fist.bmp examples/data/house_lo.mp3 examples/data/house_lo.ogg examples/data/house_lo.wav examples/data/liquid.bmp examples/data/midikeys.png examples/data/oldplayer.gif examples/data/player1.gif examples/data/punch.wav examples/data/secosmic_lo.wav examples/data/shot.gif examples/data/static.png examples/data/whiff.wav examples/data/yuv_1.pgm examples/macosx/macfont.py examples/macosx/aliens_app_example/README.txt examples/macosx/aliens_app_example/aliens.py examples/macosx/aliens_app_example/setup.py examples/macosx/aliens_app_example/English.lproj/aliens.icns examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/JavaCompiling.plist examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/_MainMenu_EOArchive_English.java examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/classes.nib examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/info.nib examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/keyedobjects.nib lib/__init__.py lib/_camera_opencv_highgui.py lib/_camera_vidcapture.py lib/_numpysndarray.py lib/_numpysurfarray.py lib/camera.py lib/colordict.py lib/compat.py lib/cursors.doc lib/cursors.py lib/examples.doc lib/freesansbold.ttf lib/locals.doc lib/locals.py lib/mac_scrap.py lib/macosx.py lib/midi.doc lib/midi.py lib/pkgdata.py lib/pygame.ico lib/pygame_icon.bmp lib/pygame_icon.icns lib/pygame_icon.svg lib/pygame_icon.tiff lib/sndarray.doc lib/sndarray.py lib/sprite.doc lib/sprite.py lib/surfarray.doc lib/surfarray.py lib/sysfont.py lib/tests.doc lib/version.py lib/gp2x/__init__.py lib/gp2x/constants.py lib/gp2x/locals.py lib/threads/Py25Queue.py lib/threads/__init__.py pygame.egg-info/PKG-INFO pygame.egg-info/SOURCES.txt pygame.egg-info/dependency_links.txt pygame.egg-info/top_level.txt src/_arraysurfarray.c src/_camera.c src/_numericsndarray.c src/_numericsurfarray.c src/alphablit.c src/base.c src/bitmask.c src/bitmask.h src/bufferproxy.c src/camera.doc src/camera.h src/camera_v4l.c src/camera_v4l2.c src/cdrom.c src/cdrom.doc src/color.c src/color.doc src/constants.c src/display.c src/display.doc src/draw.c src/draw.doc src/event.c src/event.doc src/fastevent.c src/fastevents.c src/fastevents.h src/ffmovie.c src/ffmovie.h src/font.c src/font.doc src/font.h src/gfxdraw.c src/gfxdraw.doc src/image.c src/image.doc src/imageext.c src/joystick.c src/joystick.doc src/key.c src/key.doc src/mask.c src/mask.doc src/mask.h src/mixer.c src/mixer.doc src/mixer.h src/mouse.c src/mouse.doc src/movie.c src/movie.doc src/music.c src/music.doc src/numeric_arrayobject.h src/overlay.c src/overlay.doc src/pgarrinter.h src/pgcompat.h src/pgopengl.h src/pixelarray.c src/pixelarray.doc src/pixelarray_methods.c src/pygame.doc src/pygame.h src/pygamedocs.h src/pypm.c src/pypm.pyx src/rect.c src/rect.doc src/rotozoom.c src/rwobject.c src/scale.h src/scale2x.c src/scale_mmx.c src/scale_mmx32.c src/scale_mmx64.c src/scrap.c src/scrap.doc src/scrap.h src/scrap_mac.c src/scrap_qnx.c src/scrap_win.c src/scrap_x11.c src/sdlmain_osx.m src/surface.c src/surface.doc src/surface.h src/surface_fill.c src/surflock.c src/time.c src/time.doc src/transform.c src/transform.doc src/SDL_gfx/SDL_gfxPrimitives.c src/SDL_gfx/SDL_gfxPrimitives.h src/SDL_gfx/SDL_gfxPrimitives_font.h test/README.TXT test/__init__.py test/__main__.py test/base_test.py test/blit_test.py test/bufferproxy_test.py test/cdrom_tags.py test/cdrom_test.py test/color_test.py test/cursors_test.py test/display_test.py test/draw_test.py test/event_test.py test/fastevent_test.py test/font_test.py test/gfxdraw_test.py test/image__save_gl_surface_test.py test/image_test.py test/joystick_test.py test/key_test.py test/mask_test.py test/midi_test.py test/mixer_music_test.py test/mixer_test.py test/mouse_test.py test/movie_tags.py test/movie_test.py test/overlay_test.py test/pixelarray_test.py test/rect_test.py test/scrap_tags.py test/scrap_test.py test/sndarray_tags.py test/sndarray_test.py test/sprite_test.py test/surface_test.py test/surfarray_tags.py test/surfarray_test.py test/surflock_test.py test/sysfont_test.py test/test_test_.py test/threads_tags.py test/threads_test.py test/time_test.py test/transform_test.py test/fixtures/xbm_cursors/white_sizing.xbm test/fixtures/xbm_cursors/white_sizing_mask.xbm test/run_tests__tests/__init__.py test/run_tests__tests/run_tests__test.py test/run_tests__tests/all_ok/__init__.py test/run_tests__tests/all_ok/fake_2_test.py test/run_tests__tests/all_ok/fake_3_test.py test/run_tests__tests/all_ok/fake_4_test.py test/run_tests__tests/all_ok/fake_5_test.py test/run_tests__tests/all_ok/fake_6_test.py test/run_tests__tests/all_ok/no_assertions__ret_code_of_1__test.py test/run_tests__tests/all_ok/zero_tests_test.py test/run_tests__tests/everything/__init__.py test/run_tests__tests/everything/fake_2_test.py test/run_tests__tests/everything/incomplete_todo_test.py test/run_tests__tests/everything/magic_tag_test.py test/run_tests__tests/everything/sleep_test.py test/run_tests__tests/exclude/__init__.py test/run_tests__tests/exclude/fake_2_test.py test/run_tests__tests/exclude/invisible_tag_test.py test/run_tests__tests/exclude/magic_tag_test.py test/run_tests__tests/failures1/__init__.py test/run_tests__tests/failures1/fake_2_test.py test/run_tests__tests/failures1/fake_3_test.py test/run_tests__tests/failures1/fake_4_test.py test/run_tests__tests/incomplete/__init__.py test/run_tests__tests/incomplete/fake_2_test.py test/run_tests__tests/incomplete/fake_3_test.py test/run_tests__tests/incomplete_todo/__init__.py test/run_tests__tests/incomplete_todo/fake_2_test.py test/run_tests__tests/incomplete_todo/fake_3_test.py test/run_tests__tests/infinite_loop/__init__.py test/run_tests__tests/infinite_loop/fake_1_test.py test/run_tests__tests/infinite_loop/fake_2_test.py test/run_tests__tests/print_stderr/__init__.py test/run_tests__tests/print_stderr/fake_2_test.py test/run_tests__tests/print_stderr/fake_3_test.py test/run_tests__tests/print_stderr/fake_4_test.py test/run_tests__tests/print_stdout/__init__.py test/run_tests__tests/print_stdout/fake_2_test.py test/run_tests__tests/print_stdout/fake_3_test.py test/run_tests__tests/print_stdout/fake_4_test.py test/run_tests__tests/timeout/__init__.py test/run_tests__tests/timeout/fake_2_test.py test/run_tests__tests/timeout/sleep_test.py test/test_utils/__init__.py test/test_utils/async_sub.py test/test_utils/run_tests.py test/test_utils/test_runner.py test/test_utils/unittest.py test/test_utils/unittest_patch.py test/util/compare_docs.py test/util/create_doc_from_py.py test/util/gen_stubs.py test/util/gen_stubs_test.py test/util/relative_indentation.py test/util/svn_log_to_whatsnew.py test/util/build_page/.htaccess test/util/build_page/index.php test/util/build_page/remote_push.bat test/util/build_page/warnings.php test/util/build_page/libs/helpers.py test/util/build_page/libs/process_results.py test/util/build_page/libs/safe_eval.py test/util/build_page/libs/build_client/__init__.py test/util/build_page/libs/build_client/callproc.py test/util/build_page/libs/build_client/config.py test/util/build_page/libs/build_client/helpers.py test/util/build_page/libs/build_client/mocks.py test/util/build_page/libs/build_client/multi_part.py test/util/build_page/libs/build_client/regexes.py test/util/build_page/libs/build_client/update.py test/util/build_page/libs/build_client/update_test.py test/util/build_page/libs/build_client/upload_results.py test/util/build_page/libs/build_client/config/auth.txt test/util/build_page/libs/build_client/config/build_config.template test/util/build_page/libs/build_client/config/build_py25_exe.template test/util/build_page/libs/build_client/test_fixtures/BUILD_FAILED test/util/build_page/libs/build_client/test_fixtures/BUILD_FAILED_EXCEPTION test/util/build_page/libs/build_client/test_fixtures/BUILD_FAILED_UNKNOWN test/util/build_page/libs/build_client/test_fixtures/BUILD_FAILED_UNPARSEABLE test/util/build_page/libs/build_client/test_fixtures/BUILD_LINK_FAILED test/util/build_page/libs/build_client/test_fixtures/BUILD_SUCCESSFUL test/util/build_page/libs/build_client/test_fixtures/TESTS_FAILED test/util/build_page/libs/build_client/test_fixtures/TESTS_INVALID test/util/build_page/libs/build_client/test_fixtures/TESTS_PASSED test/util/build_page/libs/pywebsite/__init__.py test/util/build_page/libs/pywebsite/escape.py test/util/build_page/libs/pywebsite/helpers.py test/util/build_page/libs/pywebsite/zdb.py test/util/build_page/results/.htaccess test/util/build_page/results/index.py test/util/build_page/results/results.css test/util/build_page/upload_results/.htaccess test/util/build_page/upload_results/index.pypygame-1.9.1release/pygame.egg-info/PKG-INFO0000644000175000017500000000102711236514371020317 0ustar vincentvincentMetadata-Version: 1.0 Name: pygame Version: 1.9.1release Summary: Python Game Development Home-page: http://www.pygame.org Author: Pete Shinners, Rene Dudfield, Marcus von Appen, Bob Pendleton, others... Author-email: pygame@seul.org License: LGPL Description: Pygame is a Python wrapper module for the SDL multimedia library. It contains python functions and classes that will allow you to use SDL's support for playing cdroms, audio and video output, and keyboard, mouse and joystick input. Platform: UNKNOWN pygame-1.9.1release/pygame.egg-info/dependency_links.txt0000644000175000017500000000000111236514371023270 0ustar vincentvincent pygame-1.9.1release/lib/version.py0000644000175000017500000000247211236512106017052 0ustar vincentvincent## pygame - Python Game Library ## Copyright (C) 2000-2003 Pete Shinners ## ## This library is free software; you can redistribute it and/or ## modify it under the terms of the GNU Library General Public ## License as published by the Free Software Foundation; either ## version 2 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 ## Library General Public License for more details. ## ## You should have received a copy of the GNU Library General Public ## License along with this library; if not, write to the Free ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## ## Pete Shinners ## pete@shinners.org """Simply the current installed pygame version. The version information is stored in the regular pygame module as 'pygame.ver'. Keeping the version information also available in a separate module allows you to test the pygame version without importing the main pygame module. The python version information should always compare greater than any previous releases. (hmm, until we get to versions > 10) """ ver = '1.9.1release' vernum = 1,9,1 pygame-1.9.1release/lib/tests.doc0000644000175000017500000001014311202735002016631 0ustar vincentvincentpygame.tests Pygame unit test suite package A quick way to run the test suite package from the command line is to import the go submodule with the Python -m option: python -m pygame.tests [<test options>] Command line option --help displays a usage message. Available options correspond to the pygame.tests.run arguments. The xxxx_test submodules of the tests package are unit test suites for individual parts of Pygame. Each can also be run as a main program. This is useful if the test, such as cdrom_test, is interactive. For Pygame development the test suite can be run from a Pygame distribution root directory. Program run_tests.py is provided for convenience, though test/go.py can be run directly. Module level tags control which modules are included in a unit test run. Tags are assigned to a unit test module with a corresponding <name>_tags.py module. The tags module has the global __tags__, a list of tag names. For example, cdrom_test.py has a tag file cdrom_tags.py containing a tags list that has the 'interactive' string. The 'interactive' tag indicates cdrom_test.py expects user input. It is excluded from a run_tests.py or pygame.tests.go run. Two other tags that are excluded are 'ignore' and 'subprocess_ignore'. These two tags indicate unit tests that will not run on a particular platform, or for which no corresponding Pygame module is available. The test runner will list each excluded module along with the tag responsible.
    run Run the Pygame unit test suite pygame.tests.run(*args, **kwds): return tuple Positional arguments (optional): The names of tests to include. If omitted then all tests are run. Test names need not include the trailing '_test'. Keyword arguments: incomplete - fail incomplete tests (default False) nosubprocess - run all test suites in the current process (default False, use separate subprocesses) dump - dump failures/errors as dict ready to eval (default False) file - if provided, the name of a file into which to dump failures/errors timings - if provided, the number of times to run each individual test to get an average run time (default is run each test once) exclude - A list of TAG names to exclude from the run show_output - show silenced stderr/stdout on errors (default False) all - dump all results, not just errors (default False) randomize - randomize order of tests (default False) seed - if provided, a seed randomizer integer multi_thread - if provided, the number of THREADS in which to run subprocessed tests time_out - if subprocess is True then the time limit in seconds before killing a test (default 30) fake - if provided, the name of the fake tests package in the run_tests__tests subpackage to run instead of the normal Pygame tests python - the path to a python executable to run subprocessed tests (default sys.executable) Return value: A tuple of total number of tests run, dictionary of error information. The dictionary is empty if no errors were recorded. By default individual test modules are run in separate subprocesses. This recreates normal Pygame usage where pygame.init() and pygame.quit() are called only once per program execution, and avoids unfortunate interactions between test modules. Also, a time limit is placed on test execution, so frozen tests are killed when there time allotment expired. Use the single process option if threading is not working properly or if tests are taking too long. It is not guaranteed that all tests will pass in single process mode. Tests are run in a randomized order if the randomize argument is True or a seed argument is provided. If no seed integer is provided then the system time is used. Individual test modules may have a __tags__ attribute, a list of tag strings used to selectively omit modules from a run. By default only 'interactive' modules such as cdrom_test are ignored. An interactive module must be run from the console as a Python program. This function can only be called once per Python session. It is not reentrant. pygame-1.9.1release/lib/sysfont.py0000644000175000017500000006074311227711410017076 0ustar vincentvincent## pygame - Python Game Library ## Copyright (C) 2000-2003 Pete Shinners ## ## This library is free software; you can redistribute it and/or ## modify it under the terms of the GNU Library General Public ## License as published by the Free Software Foundation; either ## version 2 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 ## Library General Public License for more details. ## ## You should have received a copy of the GNU Library General Public ## License along with this library; if not, write to the Free ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## ## Pete Shinners ## pete@shinners.org "sysfont, used in the font module to find system fonts" import os, sys #Python 3 compatibility try: bytes except NameError: def toascii(raw): return raw.decode('ascii', 'ignore').encode('ascii') else: def toascii(raw): return raw.decode('ascii', 'ignore') #create simple version of the font name def _simplename(name): return ''.join([c.lower() for c in name if c.isalnum()]) #insert a font and style into the font dictionary def _addfont(name, bold, italic, font, fontdict): if name not in fontdict: fontdict[name] = {} fontdict[name][bold, italic] = font #read the fonts on windows # Info taken from: # http://www.microsoft.com/typography/fonts/winxp.htm # with extra files added from: # http://www.ampsoft.net/webdesign-l/windows-fonts-by-version.html # File name, family, (Bold, Italic) _XP_default_font_files = [ ('ahronbd.ttf', 'Aharoni', True, False), ('andlso.ttf', 'Andalus', False, False), ('angsa.ttf', 'Angsana New', False, False), ('angsab.ttf', 'Angsana New', True, False), ('angsai.ttf', 'Angsana New', False, True), ('angsaz.ttf', 'Angsana New', True, True), ('angsau.ttf', 'AngsanaUPC', False, False), ('angsaub.ttf', 'AngsanaUPC', True, False), ('angsaui.ttf', 'AngsanaUPC', False, True), ('angsauz.ttf', 'AngsanaUPC', True, True), ('artro.ttf', 'Arabic Transparent', False, False), ('artrbdo.ttf', 'Arabic Transparent', True, False), ('agatha.ttf', 'Agatha', False, False), ('arial.ttf', 'Arial', False, False), ('arialbd.ttf', 'Arial', True, False), ('ariali.ttf', 'Arial', False, True), ('arialbi.ttf', 'Arial', True, True), ('ariblk.ttf', 'Arial Black', False, False), ('browa.ttf', 'Browallia New', False, False), ('browab.ttf', 'Browallia New', True, False), ('browai.ttf', 'Browallia New', False, True), ('browaz.ttf', 'Browallia New', True, True), ('browau.ttf', 'BrowalliaUPC', False, False), ('browaub.ttf', 'BrowalliaUPC', True, False), ('browaui.ttf', 'BrowalliaUPC', False, True), ('browauz.ttf', 'BrowalliaUPC', True, True), ('comic.ttf', 'Comic Sans MS', False, False), ('comicbd.ttf', 'Comic Sans MS', True, False), ('cordia.ttf', 'Cordia New', False, False), ('cordiab.ttf', 'Cordia New', True, False), ('cordiai.ttf', 'Cordia New', False, True), ('cordiaz.ttf', 'Cordia New', True, True), ('cordiau.ttf', 'CordiaUPC', False, False), ('cordiaub.ttf', 'CordiaUPC', True, False), ('cordiaui.ttf', 'CordiaUPC', False, True), ('cordiauz.ttf', 'CordiaUPC', True, True), ('cour.ttf', 'Courier New', False, False), ('courbd.ttf', 'Courier New', True, False), ('couri.ttf', 'Courier New', False, True), ('courbi.ttf', 'Courier New', True, True), ('david.ttf', 'David', False, False), ('davidbd.ttf', 'David', True, False), ('davidtr.ttf', 'David Transparent', False, False), ('upcdl.ttf', 'DilleniaUPC', False, False), ('upcdb.ttf', 'DilleniaUPC', True, False), ('upcdi.ttf', 'DilleniaUPC', False, True), ('upcdbi.ttf', 'DilleniaUPC', True, True), ('estre.ttf', 'Estrangelo Edessa', False, False), ('upcel.ttf', 'EucrosialUPC', False, False), ('upceb.ttf', 'EucrosialUPC', True, False), ('upcei.ttf', 'EucrosialUPC', False, True), ('upcebi.ttf', 'EucrosialUPC', True, True), ('mriamfx.ttf', 'Fixed Miriam Transparent', False, False), ('framd.ttf', 'Franklin Gothic Medium', False, False), ('framdit.ttf', 'Franklin Gothic Medium', False, True), ('frank.ttf', 'FrankRuehl', False, False), ('upcfl.ttf', 'FreesialUPC', False, False), ('upcfb.ttf', 'FreesialUPC', True, False), ('upcfi.ttf', 'FreesialUPC', False, True), ('upcfbi.ttf', 'FreesialUPC', True, True), ('gautami.ttf', 'Gautami', False, False), ('georgia.ttf', 'Georgia', False, False), ('georgiab.ttf', 'Georgia', True, False), ('georgiai.ttf', 'Georgia', False, True), ('georgiaz.ttf', 'Georgia', True, True), ('impact.ttf', 'Impact', False, False), ('upcil.ttf', 'IrisUPC', False, False), ('upcib.ttf', 'IrisUPC', True, False), ('upcii.ttf', 'IrisUPC', False, True), ('upcibi.ttf', 'IrisUPC', True, True), ('upcjl.ttf', 'JasmineUPC', False, False), ('upcjb.ttf', 'JasmineUPC', True, False), ('upcji.ttf', 'JasmineUPC', False, True), ('upcjbi.ttf', 'JasmineUPC', True, True), ('upckl.ttf', 'KodchiangUPC', False, False), ('upckb.ttf', 'KodchiangUPC', True, False), ('upcki.ttf', 'KodchiangUPC', False, True), ('upckbi.ttf', 'KodchiangUPC', True, True), ('latha.ttf', 'Latha', False, False), ('lvnm.ttf', 'Levenim MT', False, False), ('lvnmbd.ttf', 'Levenim MT', True, False), ('upcll.ttf', 'LilyUPC', False, False), ('upclb.ttf', 'LilyUPC', True, False), ('upcli.ttf', 'LilyUPC', False, True), ('upclbi.ttf', 'LilyUPC', True, True), ('lucon.ttf', 'Lucida Console', False, False), ('l_10646.ttf', 'Lucida Sans Unicode', False, False), ('mangal.ttf', 'Mangal', False, False), ('marlett.ttf', 'Marlett', False, False), ('micross.ttf', 'Microsoft Sans Serif', False, False), ('mriam.ttf', 'Miriam', False, False), ('mriamc.ttf', 'Miriam Fixed', False, False), ('mriamtr.ttf', 'Miriam Transparent', False, False), ('mvboli.ttf', 'MV Boli', False, False), ('nrkis.ttf', 'Narkisim', False, False), ('pala.ttf', 'Falatino Linotype', False, False), ('palab.ttf', 'Falatino Linotype', True, False), ('palai.ttf', 'Falatino Linotype', False, True), ('palabi.ttf', 'Falatino Linotype', True, True), ('raavi.ttf', 'Raavi', False, False), ('rod.ttf', 'Rod', False, False), ('rodtr.ttf', 'Rod Transparent', False, False), ('shruti.ttf', 'Shruti', False, False), ('simpo.ttf', 'Simplified Arabic', False, False), ('simpbdo.ttf', 'Simplified Arabic', True, False), ('simpfxo.ttf', 'Simplified Arabic Fixed', False, False), ('sylfaen.ttf', 'Sylfaen', False, False), ('symbol.ttf', 'Symbol', False, False), ('tahoma.ttf', 'Tahoma', False, False), ('tahomabd.ttf', 'Tahoma', True, False), ('times.ttf', 'Times New Roman', False, False), ('timesbd.ttf', 'Times New Roman', True, False), ('timesi.ttf', 'Times New Roman', False, True), ('timesbi.ttf', 'Times New Roman', True, True), ('trado.ttf', 'Traditional Arabic', False, False), ('tradbdo.ttf', 'Traditional Arabic', True, False), ('Trebuc.ttf', 'Trebuchet MS', False, False), ('Trebucbd.ttf', 'Trebuchet MS', True, False), ('Trebucit.ttf', 'Trebuchet MS', False, True), ('Trebucbi.ttf', 'Trebuchet MS', True, True), ('tunga.ttf', 'Tunga', False, False), ('verdana.ttf', 'Verdana', False, False), ('verdanab.ttf', 'Verdana', True, False), ('verdanai.ttf', 'Verdana', False, True), ('verdanaz.ttf', 'Verdana', True, True), ('webdings.ttf', 'Webdings', False, False), ('wingding.ttf', 'Wingdings', False, False), ('simhei.ttf', 'SimHei', False, False), ('simfang.ttf', 'FangSong_GB2312', False, False), ('kaiu.ttf', 'DFKai-SB', False, False), ('simkai.ttf', 'KaiTi_GB2312', False, False), ('msgothic.ttc', 'MS Gothic', False, False), ('msmincho.ttc', 'MS Mincho', False, False), ('gulim.ttc', 'Gulim', False, False), ('mingliu.ttc', 'Mingliu', False, False), ('simsun.ttc', 'Simsun', False, False), ('batang.ttc', 'Batang', False, False), ] def initsysfonts_win32(): try: import _winreg except ImportError: import winreg as _winreg if 'WINDIR' in os.environ: windir = os.environ['WINDIR'] elif 'windir' in os.environ: windir = os.environ['windir'] else: windir = "C:\\Windows\\" fonts = {} mods = 'demibold', 'narrow', 'light', 'unicode', 'bt', 'mt' fontdir = os.path.join(windir, "Fonts") #this is a list of registry keys containing information #about fonts installed on the system. keys = [] #add recognized fonts from the fonts directory because the default #fonts may not be entered in the registry. win_font_files_mapping = dict( [(file_name.lower(), (_simplename(name), bold, italic)) for file_name, name, bold, italic in _XP_default_font_files]) font_dir_path = os.path.join(windir, 'fonts') try: font_file_paths = glob.glob(os.path.join(font_dir_path, '*.tt?')) except Exception: pass else: for font in font_file_paths: file_name = os.path.basename(font) try: name, bold, italic = win_font_file_mapping[file_name] except KeyError: pass else: _addfont(name, bold, italic, font, fonts) #add additional fonts entered in the registry. #find valid registry keys containing font information. possible_keys = [ r"SOFTWARE\Microsoft\Windows\CurrentVersion\Fonts", r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", r"SOFTWARE\Microsoft\Windows[NT]\CurrentVersion\Fonts", ] for key_name in possible_keys: try: key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, key_name) keys.append(key) except WindowsError: pass for key in keys: fontdict = {} for i in range(_winreg.QueryInfoKey(key)[1]): try: name, font, t = _winreg.EnumValue(key,i) except EnvironmentError: break # try and handle windows unicode strings for some file names. # here are two documents with some information about it: # http://www.python.org/peps/pep-0277.html # https://www.microsoft.com/technet/archive/interopmigration/linux/mvc/lintowin.mspx#ECAA try: font = str(font) except UnicodeEncodeError: # MBCS is the windows encoding for unicode file names. try: font = font.encode('MBCS') except: # no goodness with str or MBCS encoding... skip this font. continue if font[-4:].lower() not in [".ttf", ".ttc"]: continue if os.sep not in font: font = os.path.join(fontdir, font) if name[-10:] == '(TrueType)': name = name[:-11] name = name.lower().split() bold = italic = 0 for m in mods: if m in name: name.remove(m) if 'bold' in name: name.remove('bold') bold = 1 if 'italic' in name: name.remove('italic') italic = 1 name = ''.join(name) name=_simplename(name) _addfont(name, bold, italic, font, fonts) return fonts _OSX_default_font_files = { 'albayan': {(False, False): '/Library/Fonts/AlBayan.ttf', (True, False): '/Library/Fonts/AlBayanBold.ttf'}, 'andalemono': {(False, False): '/Library/Fonts/Andale Mono.ttf'}, 'applebraille': {(False, False): '/System/Library/Fonts/Apple Braille Outline 6 Dot.ttf'}, 'applegothic': {(False, False): '/System/Library/Fonts/AppleGothic.ttf'}, 'applesymbols': {(False, False): '/System/Library/Fonts/Apple Symbols.ttf'}, 'arial': {(False, False): '/Library/Fonts/Arial.ttf', (False, True): '/Library/Fonts/Arial Italic.ttf', (True, False): '/Library/Fonts/Arial Bold.ttf', (True, True): '/Library/Fonts/Arial Bold Italic.ttf'}, 'arialblack': {(False, False): '/Library/Fonts/Arial Black.ttf'}, 'arialhebrew': {(False, False): '/Library/Fonts/ArialHB.ttf', (True, False): '/Library/Fonts/ArialHBBold.ttf'}, 'arialnarrow': {(False, False): '/Library/Fonts/Arial Narrow.ttf', (False, True): '/Library/Fonts/Arial Narrow Italic.ttf', (True, False): '/Library/Fonts/Arial Narrow Bold.ttf', (True, True): '/Library/Fonts/Arial Narrow Bold Italic.ttf'}, 'arialroundedmtbold': {(False, False): '/Library/Fonts/Arial Rounded Bold.ttf'}, 'arialunicodems': {(False, False): '/Library/Fonts/Arial Unicode.ttf'}, 'ayuthaya': {(False, False): '/Library/Fonts/Ayuthaya.ttf'}, 'baghdad': {(False, False): '/Library/Fonts/Baghdad.ttf'}, 'brushscriptmt': {(False, True): '/Library/Fonts/Brush Script.ttf'}, 'chalkboard': {(False, False): '/Library/Fonts/Chalkboard.ttf', (True, False): '/Library/Fonts/ChalkboardBold.ttf'}, 'comicsansms': {(False, False): '/Library/Fonts/Comic Sans MS.ttf', (True, False): '/Library/Fonts/Comic Sans MS Bold.ttf'}, 'corsivahebrew': {(False, False): '/Library/Fonts/Corsiva.ttf', (True, False): '/Library/Fonts/CorsivaBold.ttf'}, 'couriernew': {(False, False): '/Library/Fonts/Courier New.ttf', (False, True): '/Library/Fonts/Courier New Italic.ttf', (True, False): '/Library/Fonts/Courier New Bold.ttf', (True, True): '/Library/Fonts/Courier New Bold Italic.ttf'}, 'decotypenaskh': {(False, False): '/Library/Fonts/DecoTypeNaskh.ttf'}, 'devanagarimt': {(False, False): '/Library/Fonts/DevanagariMT.ttf', (True, False): '/Library/Fonts/DevanagariMTBold.ttf'}, 'euphemiaucas': {(False, False): '/Library/Fonts/EuphemiaCASRegular.ttf', (False, True): '/Library/Fonts/EuphemiaCASItalic.ttf', (True, False): '/Library/Fonts/EuphemiaCASBold.ttf'}, 'gb18030bitmap': {(False, False): '/Library/Fonts/NISC18030.ttf'}, 'geezapro': {(False, False): '/System/Library/Fonts/Geeza Pro.ttf', (True, False): '/System/Library/Fonts/Geeza Pro Bold.ttf'}, 'georgia': {(False, False): '/Library/Fonts/Georgia.ttf', (False, True): '/Library/Fonts/Georgia Italic.ttf', (True, False): '/Library/Fonts/Georgia Bold.ttf', (True, True): '/Library/Fonts/Georgia Bold Italic.ttf'}, 'gujaratimt': {(False, False): '/Library/Fonts/GujaratiMT.ttf', (True, False): '/Library/Fonts/GujaratiMTBold.ttf'}, 'gurmukhimt': {(False, False): '/Library/Fonts/Gurmukhi.ttf'}, 'impact': {(False, False): '/Library/Fonts/Impact.ttf'}, 'inaimathi': {(False, False): '/Library/Fonts/InaiMathi.ttf'}, 'kailasa': {(False, False): '/Library/Fonts/Kailasa.ttf'}, 'kokonor': {(False, False): '/Library/Fonts/Kokonor.ttf'}, 'krungthep': {(False, False): '/Library/Fonts/Krungthep.ttf'}, 'kufistandardgk': {(False, False): '/Library/Fonts/KufiStandardGK.ttf'}, 'liheipro': {(False, False): '/System/Library/Fonts/ Pro.ttf'}, 'lisongpro': {(False, False): '/Library/Fonts/ Pro.ttf'}, 'microsoftsansserif': {(False, False): '/Library/Fonts/Microsoft Sans Serif.ttf'}, 'mshtakan': {(False, False): '/Library/Fonts/MshtakanRegular.ttf', (False, True): '/Library/Fonts/MshtakanOblique.ttf', (True, False): '/Library/Fonts/MshtakanBold.ttf', (True, True): '/Library/Fonts/MshtakanBoldOblique.ttf'}, 'nadeem': {(False, False): '/Library/Fonts/Nadeem.ttf'}, 'newpeninimmt': {(False, False): '/Library/Fonts/NewPeninimMT.ttf', (True, False): '/Library/Fonts/NewPeninimMTBoldInclined.ttf'}, 'plantagenetcherokee': {(False, False): '/Library/Fonts/PlantagenetCherokee.ttf'}, 'raanana': {(False, False): '/Library/Fonts/Raanana.ttf', (True, False): '/Library/Fonts/RaananaBold.ttf'}, 'sathu': {(False, False): '/Library/Fonts/Sathu.ttf'}, 'silom': {(False, False): '/Library/Fonts/Silom.ttf'}, 'stfangsong': {(False, False): '/Library/Fonts/.ttf'}, 'stheiti': {(False, False): '/System/Library/Fonts/.ttf'}, 'stkaiti': {(False, False): '/Library/Fonts/.ttf'}, 'stsong': {(False, False): '/Library/Fonts/.ttf'}, 'tahoma': {(False, False): '/Library/Fonts/Tahoma.ttf', (True, False): '/Library/Fonts/Tahoma Bold.ttf'}, 'thonburi': {(False, False): '/System/Library/Fonts/Thonburi.ttf', (True, False): '/System/Library/Fonts/ThonburiBold.ttf'}, 'timesnewroman': {(False, False): '/Library/Fonts/Times New Roman.ttf', (False, True): '/Library/Fonts/Times New Roman Italic.ttf', (True, False): '/Library/Fonts/Times New Roman Bold.ttf', (True, True): '/Library/Fonts/Times New Roman Bold Italic.ttf'}, 'trebuchetms': {(False, False): '/Library/Fonts/Trebuchet MS.ttf', (False, True): '/Library/Fonts/Trebuchet MS Italic.ttf', (True, False): '/Library/Fonts/Trebuchet MS Bold.ttf', (True, True): '/Library/Fonts/Trebuchet MS Bold Italic.ttf'}, 'verdana': {(False, False): '/Library/Fonts/Verdana.ttf', (False, True): '/Library/Fonts/Verdana Italic.ttf', (True, False): '/Library/Fonts/Verdana Bold.ttf', (True, True): '/Library/Fonts/Verdana Bold Italic.ttf'}, 'webdings': {(False, False): '/Library/Fonts/Webdings.ttf'}, 'wingdings': {(False, False): '/Library/Fonts/Wingdings.ttf'}, 'wingdings2': {(False, False): '/Library/Fonts/Wingdings 2.ttf'}, 'wingdings3': {(False, False): '/Library/Fonts/Wingdings 3.ttf'}} def _search_osx_font_paths(fonts): for name, details in _OSX_default_font_files.items(): for k, apath in details.items(): if os.path.exists(apath): bold, italic = k _addfont(name, bold, italic, apath, fonts) def initsysfonts_darwin(): """ read the fonts on OSX. """ # if the X11 binary exists... try and use that. # Not likely to be there on pre 10.4.x ... # so still need to do other OSX specific method below. if os.path.exists("/usr/X11/bin/fc-list"): fonts = initsysfonts_unix() # we look for the default paths. _search_osx_font_paths(fonts) return fonts paths = ['/Library/Fonts', '~/Library/Fonts', '/Local/Library/Fonts', '/Network/Library/Fonts'] fonts = {} for p in paths: if os.path.isdir(p): pass #os.path.walk(p, _fontwalk, fonts) return fonts #read the fonts on unix def initsysfonts_unix(): import subprocess fonts = {} # we use the fc-list from fontconfig to get a list of fonts. try: # note, we capture stderr so if fc-list isn't there to stop stderr printing. flout, flerr = subprocess.Popen('fc-list : file family style', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True).communicate() except Exception: return fonts entries = toascii(flout) try: for line in entries.split('\n'): try: filename, family, style = line.split(':', 2) if filename[-4:].lower() in ['.ttf', '.ttc']: bold = style.find('Bold') >= 0 italic = style.find('Italic') >= 0 oblique = style.find('Oblique') >= 0 for name in family.split(','): if name: break else: name = os.path.splitext(os.path.basename(filename))[0] _addfont(_simplename(name), bold, italic or oblique, filename, fonts) except Exception: # try the next one. pass except Exception: pass return fonts #create alias entries def create_aliases(): aliases = ( ('monospace', 'misc-fixed', 'courier', 'couriernew', 'console', 'fixed', 'mono', 'freemono', 'bitstreamverasansmono', 'verasansmono', 'monotype', 'lucidaconsole'), ('sans', 'arial', 'helvetica', 'swiss', 'freesans', 'bitstreamverasans', 'verasans', 'verdana', 'tahoma'), ('serif', 'times', 'freeserif', 'bitstreamveraserif', 'roman', 'timesroman', 'timesnewroman', 'dutch', 'veraserif', 'georgia'), ('wingdings', 'wingbats'), ) for set in aliases: found = None fname = None for name in set: if name in Sysfonts: found = Sysfonts[name] fname = name break if not found: continue for name in set: if name not in Sysfonts: Sysalias[name] = found Sysfonts = {} Sysalias = {} #initialize it all, called once def initsysfonts(): if sys.platform == 'win32': fonts = initsysfonts_win32() elif sys.platform == 'darwin': fonts = initsysfonts_darwin() else: fonts = initsysfonts_unix() Sysfonts.update(fonts) create_aliases() if not Sysfonts: #dummy so we don't try to reinit Sysfonts[None] = None #the exported functions def SysFont(name, size, bold=False, italic=False): """pygame.font.SysFont(name, size, bold=False, italic=False) -> Font create a pygame Font from system font resources This will search the system fonts for the given font name. You can also enable bold or italic styles, and the appropriate system font will be selected if available. This will always return a valid Font object, and will fallback on the builtin pygame font if the given font is not found. Name can also be a comma separated list of names, in which case set of names will be searched in order. Pygame uses a small set of common font aliases, if the specific font you ask for is not available, a reasonable alternative may be used. """ import pygame.font if not Sysfonts: initsysfonts() gotbold = gotitalic = False fontname = None if name: allnames = name for name in allnames.split(','): name = _simplename(name) styles = Sysfonts.get(name) if not styles: styles = Sysalias.get(name) if styles: while not fontname: plainname = styles.get((False, False)) fontname = styles.get((bold, italic)) if not fontname: fontname = plainname elif plainname != fontname: gotbold = bold gotitalic = italic if fontname: break font = pygame.font.Font(fontname, size) if bold and not gotbold: font.set_bold(1) if italic and not gotitalic: font.set_italic(1) return font def get_fonts(): """pygame.font.get_fonts() -> list get a list of system font names Returns the list of all found system fonts. Note that the names of the fonts will be all lowercase with spaces removed. This is how pygame internally stores the font names for matching. """ if not Sysfonts: initsysfonts() return list(Sysfonts.keys()) def match_font(name, bold=0, italic=0): """pygame.font.match_font(name, bold=0, italic=0) -> name find the filename for the named system font This performs the same font search as the SysFont() function, only it returns the path to the TTF file that would be loaded. The font name can be a comma separated list of font names to try. If no match is found, None is returned. """ if not Sysfonts: initsysfonts() fontname = None allnames = name for name in allnames.split(','): name = _simplename(name) styles = Sysfonts.get(name) if not styles: styles = Sysalias.get(name) if styles: while not fontname: fontname = styles.get((bold, italic)) if italic: italic = 0 elif bold: bold = 0 elif not fontname: fontname = list(styles.values())[0] if fontname: break return fontname pygame-1.9.1release/lib/surfarray.py0000644000175000017500000002725611207055754017423 0ustar vincentvincent## pygame - Python Game Library ## Copyright (C) 2007 Marcus von Appen ## ## This library is free software; you can redistribute it and/or ## modify it under the terms of the GNU Library General Public ## License as published by the Free Software Foundation; either ## version 2 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 ## Library General Public License for more details. ## ## You should have received a copy of the GNU Library General Public ## License along with this library; if not, write to the Free ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## ## Marcus von Appen ## mva@sysfault.org """pygame module for accessing surface pixel data using array interfaces Functions to convert pixel data between pygame Surfaces and arrays. This module will only be functional when pygame can use the external Numpy or Numeric packages. Every pixel is stored as a single integer value to represent the red, green, and blue colors. The 8bit images use a value that looks into a colormap. Pixels with higher depth use a bit packing process to place three or four values into a single number. The arrays are indexed by the X axis first, followed by the Y axis. Arrays that treat the pixels as a single integer are referred to as 2D arrays. This module can also separate the red, green, and blue color values into separate indices. These types of arrays are referred to as 3D arrays, and the last index is 0 for red, 1 for green, and 2 for blue. Supported array types are numpy numeric The default will be numpy, if installed. Otherwise, Numeric will be set as default if installed. If neither numpy nor Numeric are installed, the module will raise an ImportError. The array type to use can be changed at runtime using the use_arraytype() method, which requires one of the above types as string. Note: numpy and Numeric are not completely compatible. Certain array manipulations, which work for one type, might behave differently or even completely break for the other. Additionally, in contrast to Numeric numpy does use unsigned 16-bit integers. Images with 16-bit data will be treated as unsigned integers. Numeric instead uses signed integers for the representation, which is important to keep in mind, if you use the module's functions and wonder about the values. """ import pygame # Global array type setting. See use_arraytype(). __arraytype = None # Try to import the necessary modules. try: import pygame._numpysurfarray as numpysf __hasnumpy = True __arraytype = "numpy" except ImportError: __hasnumpy = False try: import pygame._numericsurfarray as numericsf __hasnumeric = True if not __hasnumpy: __arraytype = "numeric" except ImportError: __hasnumeric = False if not __hasnumpy and not __hasnumeric: raise ImportError("no module named numpy or Numeric found") from _arraysurfarray import blit_array def array2d (surface): """pygame.surfarray.array2d (Surface): return array Copy pixels into a 2d array. Copy the pixels from a Surface into a 2D array. The bit depth of the surface will control the size of the integer values, and will work for any type of pixel format. This function will temporarily lock the Surface as pixels are copied (see the Surface.lock - lock the Surface memory for pixel access method). """ if __arraytype == "numeric": return numericsf.array2d (surface) elif __arraytype == "numpy": return numpysf.array2d (surface) raise NotImplementedError("surface arrays are not supported") def pixels2d (surface): """pygame.surfarray.pixels2d (Surface): return array Reference pixels into a 2d array. Create a new 2D array that directly references the pixel values in a Surface. Any changes to the array will affect the pixels in the Surface. This is a fast operation since no data is copied. Pixels from a 24-bit Surface cannot be referenced, but all other Surface bit depths can. The Surface this references will remain locked for the lifetime of the array (see the Surface.lock - lock the Surface memory for pixel access method). """ if __arraytype == "numeric": return numericsf.pixels2d (surface) elif __arraytype == "numpy": return numpysf.pixels2d (surface) raise NotImplementedError("surface arrays are not supported") def array3d (surface): """pygame.surfarray.array3d (Surface): return array Copy pixels into a 3d array. Copy the pixels from a Surface into a 3D array. The bit depth of the surface will control the size of the integer values, and will work for any type of pixel format. This function will temporarily lock the Surface as pixels are copied (see the Surface.lock - lock the Surface memory for pixel access method). """ if __arraytype == "numeric": return numericsf.array3d (surface) elif __arraytype == "numpy": return numpysf.array3d (surface) raise NotImplementedError("surface arrays are not supported") def pixels3d (surface): """pygame.surfarray.pixels3d (Surface): return array Reference pixels into a 3d array. Create a new 3D array that directly references the pixel values in a Surface. Any changes to the array will affect the pixels in the Surface. This is a fast operation since no data is copied. This will only work on Surfaces that have 24-bit or 32-bit formats. Lower pixel formats cannot be referenced. The Surface this references will remain locked for the lifetime of the array (see the Surface.lock - lock the Surface memory for pixel access method). """ if __arraytype == "numeric": return numericsf.pixels3d (surface) elif __arraytype == "numpy": return numpysf.pixels3d (surface) raise NotImplementedError("surface arrays are not supported") def array_alpha (surface): """pygame.surfarray.array_alpha (Surface): return array Copy pixel alphas into a 2d array. Copy the pixel alpha values (degree of transparency) from a Surface into a 2D array. This will work for any type of Surface format. Surfaces without a pixel alpha will return an array with all opaque values. This function will temporarily lock the Surface as pixels are copied (see the Surface.lock - lock the Surface memory for pixel access method). """ if __arraytype == "numeric": return numericsf.array_alpha (surface) elif __arraytype == "numpy": return numpysf.array_alpha (surface) raise NotImplementedError("surface arrays are not supported") def pixels_alpha (surface): """pygame.surfarray.pixels_alpha (Surface): return array Reference pixel alphas into a 2d array. Create a new 2D array that directly references the alpha values (degree of transparency) in a Surface. Any changes to the array will affect the pixels in the Surface. This is a fast operation since no data is copied. This can only work on 32-bit Surfaces with a per-pixel alpha value. The Surface this array references will remain locked for the lifetime of the array. """ if __arraytype == "numeric": return numericsf.pixels_alpha (surface) elif __arraytype == "numpy": return numpysf.pixels_alpha (surface) raise NotImplementedError("surface arrays are not supported") def array_colorkey (surface): """pygame.surfarray.array_colorkey (Surface): return array Copy the colorkey values into a 2d array. Create a new array with the colorkey transparency value from each pixel. If the pixel matches the colorkey it will be fully tranparent; otherwise it will be fully opaque. This will work on any type of Surface format. If the image has no colorkey a solid opaque array will be returned. This function will temporarily lock the Surface as pixels are copied. """ if __arraytype == "numeric": return numericsf.array_colorkey (surface) elif __arraytype == "numpy": return numpysf.array_colorkey (surface) raise NotImplementedError("surface arrays are not supported") def make_surface (array): """pygame.surfarray.make_surface (array): return Surface Copy an array to a new surface. Create a new Surface that best resembles the data and format on the array. The array can be 2D or 3D with any sized integer values. """ if __arraytype == "numeric": return numericsf.make_surface (array) elif __arraytype == "numpy": return numpysf.make_surface (array) raise NotImplementedError("surface arrays are not supported") ##def blit_array (surface, array): ## """pygame.surfarray.blit_array (Surface, array): return None ## ## Blit directly from a array values. ## ## Directly copy values from an array into a Surface. This is faster ## than converting the array into a Surface and blitting. The array ## must be the same dimensions as the Surface and will completely ## replace all pixel values. ## ## This function will temporarily lock the Surface as the new values ## are copied. ## """ ## if __arraytype == "numeric": ## return numericsf.blit_array (surface, array) ## elif __arraytype == "numpy": ## return numpysf.blit_array (surface, array) ## raise NotImplementedError("surface arrays are not supported") def map_array (surface, array): """pygame.surfarray.map_array (Surface, array3d): return array2d Map a 3D array into a 2D array. Convert a 3D array into a 2D array. This will use the given Surface format to control the conversion. Palette surface formats are not supported. """ if __arraytype == "numeric": return numericsf.map_array (surface, array) elif __arraytype == "numpy": return numpysf.map_array (surface, array) raise NotImplementedError("surface arrays are not supported") def use_arraytype (arraytype): """pygame.surfarray.use_arraytype (arraytype): return None Sets the array system to be used for surface arrays. Uses the requested array type for the module functions. Currently supported array types are: numeric numpy If the requested type is not available, a ValueError will be raised. """ global __arraytype arraytype = arraytype.lower () if arraytype == "numeric": if __hasnumeric: __arraytype = arraytype else: raise ValueError("Numeric arrays are not available") elif arraytype == "numpy": if __hasnumpy: __arraytype = arraytype else: raise ValueError("numpy arrays are not available") else: raise ValueError("invalid array type") def get_arraytype (): """pygame.surfarray.get_arraytype (): return str Gets the currently active array type. Returns the currently active array type. This will be a value of the get_arraytypes() tuple and indicates which type of array module is used for the array creation. """ return __arraytype def get_arraytypes (): """pygame.surfarray.get_arraytypes (): return tuple Gets the array system types currently supported. Checks, which array system types are available and returns them as a tuple of strings. The values of the tuple can be used directly in the use_arraytype () method. If no supported array system could be found, None will be returned. """ vals = [] if __hasnumeric: vals.append ("numeric") if __hasnumpy: vals.append ("numpy") if len (vals) == 0: return None return tuple (vals) pygame-1.9.1release/lib/surfarray.doc0000644000175000017500000001557411136240306017526 0ustar vincentvincentpygame.surfarray pygame module for accessing surface pixel data using array interfaces Functions to convert pixel data between pygame Surfaces and arrays. This module will only be functional when pygame can use the external Numpy or Numeric packages. Every pixel is stored as a single integer value to represent the red, green, and blue colors. The 8bit images use a value that looks into a colormap. Pixels with higher depth use a bit packing process to place three or four values into a single number. The arrays are indexed by the X axis first, followed by the Y axis. Arrays that treat the pixels as a single integer are referred to as 2D arrays. This module can also separate the red, green, and blue color values into separate indices. These types of arrays are referred to as 3D arrays, and the last index is 0 for red, 1 for green, and 2 for blue. Supported array systems are numpy numeric The default will be numpy, if installed. Otherwise, Numeric will be set as default if installed. If neither numpy nor Numeric are installed, the module will raise an ImportError. The array type to use can be changed at runtime using the use_arraytype () method, which requires one of the above types as string. Note: numpy and Numeric are not completely compatible. Certain array manipulations, which work for one type, might behave differently or even completely break for the other. Additionally, in contrast to Numeric numpy does use unsigned 16-bit integers. Images with 16-bit data will be treated as unsigned integers. Numeric instead uses signed integers for the representation, which is important to keep in mind, if you use the module's functions and wonder about the values. The support of numpy is new in pygame 1.8.
    array2d Copy pixels into a 2d array pygame.surfarray.array2d(Surface): return array Copy the pixels from a Surface into a 2D array. The bit depth of the surface will control the size of the integer values, and will work for any type of pixel format. This function will temporarily lock the Surface as pixels are copied (see the Surface.lock - lock the Surface memory for pixel access method). pixels2d Reference pixels into a 2d array pygame.surfarray.pixels2d(Surface): return array Create a new 2D array that directly references the pixel values in a Surface. Any changes to the array will affect the pixels in the Surface. This is a fast operation since no data is copied. Pixels from a 24-bit Surface cannot be referenced, but all other Surface bit depths can. The Surface this references will remain locked for the lifetime of the array (see the Surface.lock - lock the Surface memory for pixel access method). array3d Copy pixels into a 3d array pygame.surfarray.array3d(Surface): return array Copy the pixels from a Surface into a 3D array. The bit depth of the surface will control the size of the integer values, and will work for any type of pixel format. This function will temporarily lock the Surface as pixels are copied (see the Surface.lock - lock the Surface memory for pixel access method). pixels3d Reference pixels into a 3d array pygame.surfarray.pixels3d(Surface): return array Create a new 3D array that directly references the pixel values in a Surface. Any changes to the array will affect the pixels in the Surface. This is a fast operation since no data is copied. This will only work on Surfaces that have 24-bit or 32-bit formats. Lower pixel formats cannot be referenced. The Surface this references will remain locked for the lifetime of the array (see the Surface.lock - lock the Surface memory for pixel access method). array_alpha Copy pixel alphas into a 2d array pygame.surfarray.array_alpha(Surface): return array Copy the pixel alpha values (degree of transparency) from a Surface into a 2D array. This will work for any type of Surface format. Surfaces without a pixel alpha will return an array with all opaque values. This function will temporarily lock the Surface as pixels are copied (see the Surface.lock - lock the Surface memory for pixel access method). pixels_alpha Reference pixel alphas into a 2d array pygame.surfarray.pixels_alpha(Surface): return array Create a new 2D array that directly references the alpha values (degree of transparency) in a Surface. Any changes to the array will affect the pixels in the Surface. This is a fast operation since no data is copied. This can only work on 32-bit Surfaces with a per-pixel alpha value. The Surface this array references will remain locked for the lifetime of the array. array_colorkey Copy the colorkey values into a 2d array pygame.surfarray.array_colorkey(Surface): return array Create a new array with the colorkey transparency value from each pixel. If the pixel matches the colorkey it will be fully tranparent; otherwise it will be fully opaque. This will work on any type of Surface format. If the image has no colorkey a solid opaque array will be returned. This function will temporarily lock the Surface as pixels are copied. make_surface Copy an array to a new surface pygame.surfarray.make_surface(array): return Surface Create a new Surface that best resembles the data and format on the array. The array can be 2D or 3D with any sized integer values. blit_array Blit directly from a array values pygame.surfarray.blit_array(Surface, array): return None Directly copy values from an array into a Surface. This is faster than converting the array into a Surface and blitting. The array must be the same dimensions as the Surface and will completely replace all pixel values. Only integer, ascii character and record arrays are accepted. This function will temporarily lock the Surface as the new values are copied. map_array Map a 3d array into a 2d array pygame.surfarray.map_array(Surface, array3d): return array2d Convert a 3D array into a 2D array. This will use the given Surface format to control the conversion. Palette surface formats are not supported. use_arraytype Sets the array system to be used for surface arrays pygame.surfarray.use_arraytype (arraytype): return None Uses the requested array type for the module functions. Currently supported array types are: numeric numpy If the requested type is not available, a ValueError will be raised. New in pygame 1.8. get_arraytype Gets the currently active array type. pygame.surfarray.get_arraytype (): return str Returns the currently active array type. This will be a value of the get_arraytypes() tuple and indicates which type of array module is used for the array creation. New in pygame 1.8 get_arraytypes Gets the array system types currently supported. pygame.surfarray.get_arraytypes (): return tuple Checks, which array systems are available and returns them as a tuple of strings. The values of the tuple can be used directly in the pygame.surfarray.use_arraytype () method. If no supported array system could be found, None will be returned. New in pygame 1.8. pygame-1.9.1release/lib/sprite.py0000644000175000017500000014751611207055754016715 0ustar vincentvincent## pygame - Python Game Library ## Copyright (C) 2000-2003, 2007 Pete Shinners ## (C) 2004 Joe Wreschnig ## This library is free software; you can redistribute it and/or ## modify it under the terms of the GNU Library General Public ## License as published by the Free Software Foundation; either ## version 2 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 ## Library General Public License for more details. ## ## You should have received a copy of the GNU Library General Public ## License along with this library; if not, write to the Free ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## ## Pete Shinners ## pete@shinners.org """pygame module with basic game object classes This module contains several simple classes to be used within games. There is the main Sprite class and several Group classes that contain Sprites. The use of these classes is entirely optional when using Pygame. The classes are fairly lightweight and only provide a starting place for the code that is common to most games. The Sprite class is intended to be used as a base class for the different types of objects in the game. There is also a base Group class that simply stores sprites. A game could create new types of Group classes that operate on specially customized Sprite instances they contain. The basic Sprite class can draw the Sprites it contains to a Surface. The Group.draw() method requires that each Sprite have a Surface.image attribute and a Surface.rect. The Group.clear() method requires these same attributes, and can be used to erase all the Sprites with background. There are also more advanced Groups: pygame.sprite.RenderUpdates() and pygame.sprite.OrderedUpdates(). Lastly, this module contains several collision functions. These help find sprites inside multiple groups that have intersecting bounding rectangles. To find the collisions, the Sprites are required to have a Surface.rect attribute assigned. The groups are designed for high efficiency in removing and adding Sprites to them. They also allow cheap testing to see if a Sprite already exists in a Group. A given Sprite can exist in any number of groups. A game could use some groups to control object rendering, and a completely separate set of groups to control interaction or player movement. Instead of adding type attributes or bools to a derived Sprite class, consider keeping the Sprites inside organized Groups. This will allow for easier lookup later in the game. Sprites and Groups manage their relationships with the add() and remove() methods. These methods can accept a single or multiple targets for membership. The default initializers for these classes also takes a single or list of targets for initial membership. It is safe to repeatedly add and remove the same Sprite from a Group. While it is possible to design sprite and group classes that don't derive from the Sprite and AbstractGroup classes below, it is strongly recommended that you extend those when you add a Sprite or Group class. Sprites are not thread safe. So lock them yourself if using threads. """ ##todo ## a group that holds only the 'n' most recent elements. ## sort of like the GroupSingle class, but holding more ## than one sprite ## ## drawing groups that can 'automatically' store the area ## underneath, so the can "clear" without needing a background ## function. obviously a little slower than normal, but nice ## to use in many situations. (also remember it must "clear" ## in the reverse order that it draws :]) ## ## the drawing groups should also be able to take a background ## function, instead of just a background surface. the function ## would take a surface and a rectangle on that surface to erase. ## ## perhaps more types of collision functions? the current two ## should handle just about every need, but perhaps more optimized ## specific ones that aren't quite so general but fit into common ## specialized cases. import pygame from pygame import Rect from pygame.time import get_ticks # Don't depend on pygame.mask if it's not there... try: from pygame.mask import from_surface except: pass class Sprite(object): """simple base class for visible game objects pygame.sprite.Sprite(*groups): return Sprite The base class for visible game objects. Derived classes will want to override the Sprite.update() and assign a Sprite.image and Sprite.rect attributes. The initializer can accept any number of Group instances to be added to. When subclassing the Sprite, be sure to call the base initializer before adding the Sprite to Groups. """ def __init__(self, *groups): self.__g = {} # The groups the sprite is in if groups: self.add(groups) def add(self, *groups): """add the sprite to groups Sprite.add(*groups): return None Any number of Group instances can be passed as arguments. The Sprite will be added to the Groups it is not already a member of. """ has = self.__g.__contains__ for group in groups: if hasattr(group, '_spritegroup'): if not has(group): group.add_internal(self) self.add_internal(group) else: self.add(*group) def remove(self, *groups): """remove the sprite from groups Sprite.remove(*groups): return None Any number of Group instances can be passed as arguments. The Sprite will be removed from the Groups it is currently a member of. """ has = self.__g.__contains__ for group in groups: if hasattr(group, '_spritegroup'): if has(group): group.remove_internal(self) self.remove_internal(group) else: self.remove(*group) def add_internal(self, group): self.__g[group] = 0 def remove_internal(self, group): del self.__g[group] def update(self, *args): """method to control sprite behavior Sprite.update(*args): The default implementation of this method does nothing; it's just a convenient "hook" that you can override. This method is called by Group.update() with whatever arguments you give it. There is no need to use this method if not using the convenience method by the same name in the Group class. """ pass def kill(self): """remove the Sprite from all Groups Sprite.kill(): return None The Sprite is removed from all the Groups that contain it. This won't change anything about the state of the Sprite. It is possible to continue to use the Sprite after this method has been called, including adding it to Groups. """ for c in self.__g.keys(): c.remove_internal(self) self.__g.clear() def groups(self): """list of Groups that contain this Sprite Sprite.groups(): return group_list Return a list of all the Groups that contain this Sprite. """ return self.__g.keys() def alive(self): """does the sprite belong to any groups Sprite.alive(): return bool Returns True when the Sprite belongs to one or more Groups. """ return (len(self.__g) != 0) def __repr__(self): return "<%s sprite(in %d groups)>" % (self.__class__.__name__, len(self.__g)) class DirtySprite(Sprite): """a more featureful subclass of Sprite with more attributes pygame.sprite.DirtySprite(*groups): return DirtySprite Extra DirtySprite attributes with their default values: dirty = 1 if set to 1, it is repainted and then set to 0 again if set to 2 then it is always dirty ( repainted each frame, flag is not reset) 0 means that it is not dirty and therefor not repainted again blendmode = 0 its the special_flags argument of blit, blendmodes source_rect = None source rect to use, remember that it is relative to topleft (0,0) of self.image visible = 1 normally 1, if set to 0 it will not be repainted (you must set it dirty too to be erased from screen) layer = 0 (READONLY value, it is read when adding it to the LayeredUpdates, for details see doc of LayeredUpdates) """ def __init__(self, *groups): self.dirty = 1 self.blendmode = 0 # pygame 1.8, reffered as special_flags in # the documentation of blit self._visible = 1 self._layer = 0 # READ ONLY by LayeredUpdates or LayeredDirty self.source_rect = None Sprite.__init__(self, *groups) def _set_visible(self, val): """set the visible value (0 or 1) and makes the sprite dirty""" self._visible = val if self.dirty < 2: self.dirty = 1 def _get_visible(self): """returns the visible value of that sprite""" return self._visible visible = property(lambda self: self._get_visible(),\ lambda self, value:self._set_visible(value), \ doc="you can make this sprite disappear without removing it from the group,\n"+ "values 0 for invisible and 1 for visible") def __repr__(self): return "<%s DirtySprite(in %d groups)>" % (self.__class__.__name__, len(self.groups())) class AbstractGroup(object): """A base for containers for sprites. It does everything needed to behave as a normal group. You can easily inherit a new group class from this, or the other groups below, if you want to add more features. Any AbstractGroup-derived sprite groups act like sequences, and support iteration, len, and so on.""" # dummy val to identify sprite groups, and avoid infinite recursion. _spritegroup = True def __init__(self): self.spritedict = {} self.lostsprites = [] def sprites(self): """sprites() get a list of sprites in the group Returns an object that can be looped over with a 'for' loop. (For now it is always a list, but newer version of Python could return different iterators.) You can also iterate directly over the sprite group.""" return list(self.spritedict.keys()) def add_internal(self, sprite): self.spritedict[sprite] = 0 def remove_internal(self, sprite): r = self.spritedict[sprite] if r is not 0: self.lostsprites.append(r) del(self.spritedict[sprite]) def has_internal(self, sprite): return sprite in self.spritedict def copy(self): """copy() copy a group with all the same sprites Returns a copy of the group that is the same class type, and has the same sprites in it.""" return self.__class__(self.sprites()) def __iter__(self): return iter(self.sprites()) def __contains__(self, sprite): return self.has(sprite) def add(self, *sprites): """add(sprite, list, or group, ...) add sprite to group Add a sprite or sequence of sprites to a group.""" for sprite in sprites: # It's possible that some sprite is also an iterator. # If this is the case, we should add the sprite itself, # and not the objects it iterates over. if isinstance(sprite, Sprite): if not self.has_internal(sprite): self.add_internal(sprite) sprite.add_internal(self) else: try: # See if sprite is an iterator, like a list or sprite # group. for spr in sprite: self.add(spr) except (TypeError, AttributeError): # Not iterable, this is probably a sprite that happens # to not subclass Sprite. Alternately, it could be an # old-style sprite group. if hasattr(sprite, '_spritegroup'): for spr in sprite.sprites(): if not self.has_internal(spr): self.add_internal(spr) spr.add_internal(self) elif not self.has_internal(sprite): self.add_internal(sprite) sprite.add_internal(self) def remove(self, *sprites): """remove(sprite, list, or group, ...) remove sprite from group Remove a sprite or sequence of sprites from a group.""" # This function behaves essentially the same as Group.add. # Check for Spritehood, check for iterability, check for # old-style sprite group, and fall back to assuming # spritehood. for sprite in sprites: if isinstance(sprite, Sprite): if self.has_internal(sprite): self.remove_internal(sprite) sprite.remove_internal(self) else: try: for spr in sprite: self.remove(spr) except (TypeError, AttributeError): if hasattr(sprite, '_spritegroup'): for spr in sprite.sprites(): if self.has_internal(spr): self.remove_internal(spr) spr.remove_internal(self) elif self.has_internal(sprite): self.remove_internal(sprite) sprite.remove_internal(self) def has(self, *sprites): """has(sprite or group, ...) ask if group has a sprite or sprites Returns true if the given sprite or sprites are contained in the group. You can also use 'sprite in group' or 'subgroup in group'.""" # Again, this follows the basic pattern of Group.add and # Group.remove. for sprite in sprites: if isinstance(sprite, Sprite): return self.has_internal(sprite) try: for spr in sprite: if not self.has(spr): return False return True except (TypeError, AttributeError): if hasattr(sprite, '_spritegroup'): for spr in sprite.sprites(): if not self.has_internal(spr): return False return True else: return self.has_internal(sprite) def update(self, *args): """update(*args) call update for all member sprites calls the update method for all sprites in the group. Passes all arguments on to the Sprite update function.""" for s in self.sprites(): s.update(*args) def draw(self, surface): """draw(surface) draw all sprites onto the surface Draws all the sprites onto the given surface.""" sprites = self.sprites() surface_blit = surface.blit for spr in sprites: self.spritedict[spr] = surface_blit(spr.image, spr.rect) self.lostsprites = [] def clear(self, surface, bgd): """clear(surface, bgd) erase the previous position of all sprites Clears the area of all drawn sprites. the bgd argument should be Surface which is the same dimensions as the surface. The bgd can also be a function which gets called with the passed surface and the area to be cleared.""" try: bgd.__call__ except AttributeError: pass else: for r in self.lostsprites: bgd(surface, r) for r in self.spritedict.values(): if r is not 0: bgd(surface, r) return surface_blit = surface.blit for r in self.lostsprites: surface_blit(bgd, r, r) for r in self.spritedict.values(): if r is not 0: surface_blit(bgd, r, r) def empty(self): """empty() remove all sprites Removes all the sprites from the group.""" for s in self.sprites(): self.remove_internal(s) s.remove_internal(self) def __nonzero__(self): return (len(self.sprites()) != 0) def __len__(self): """len(group) number of sprites in group Returns the number of sprites contained in the group.""" return len(self.sprites()) def __repr__(self): return "<%s(%d sprites)>" % (self.__class__.__name__, len(self)) class Group(AbstractGroup): """container class for many Sprites pygame.sprite.Group(*sprites): return Group A simple container for Sprite objects. This class can be inherited to create containers with more specific behaviors. The constructor takes any number of Sprite arguments to add to the Group. The group supports the following standard Python operations: in test if a Sprite is contained len the number of Sprites contained bool test if any Sprites are contained iter iterate through all the Sprites The Sprites in the Group are not ordered, so drawing and iterating the Sprites is in no particular order. """ def __init__(self, *sprites): AbstractGroup.__init__(self) self.add(*sprites) RenderPlain = Group RenderClear = Group class RenderUpdates(Group): """Group class that tracks dirty updates pygame.sprite.RenderUpdates(*sprites): return RenderUpdates This class is derived from pygame.sprite.Group(). It has an extended draw() method that tracks the changed areas of the screen. """ def draw(self, surface): spritedict = self.spritedict surface_blit = surface.blit dirty = self.lostsprites self.lostsprites = [] dirty_append = dirty.append for s in self.sprites(): r = spritedict[s] newrect = surface_blit(s.image, s.rect) if r is 0: dirty_append(newrect) else: if newrect.colliderect(r): dirty_append(newrect.union(r)) else: dirty_append(newrect) dirty_append(r) spritedict[s] = newrect return dirty class OrderedUpdates(RenderUpdates): """RenderUpdates class that draws Sprites in order of addition pygame.sprite.OrderedUpdates(*spites): return OrderedUpdates This class derives from pygame.sprite.RenderUpdates(). It maintains the order in which the Sprites were added to the Group for rendering. This makes adding and removing Sprites from the Group a little slower than regular Groups. """ def __init__(self, *sprites): self._spritelist = [] RenderUpdates.__init__(self, *sprites) def sprites(self): return list(self._spritelist) def add_internal(self, sprite): RenderUpdates.add_internal(self, sprite) self._spritelist.append(sprite) def remove_internal(self, sprite): RenderUpdates.remove_internal(self, sprite) self._spritelist.remove(sprite) class LayeredUpdates(AbstractGroup): """LayeredUpdates Group handles layers, that draws like OrderedUpdates. pygame.sprite.LayeredUpdates(*spites, **kwargs): return LayeredUpdates This group is fully compatible with pygame.sprite.Sprite. New in pygame 1.8.0 """ def __init__(self, *sprites, **kwargs): """ You can set the default layer through kwargs using 'default_layer' and an integer for the layer. The default layer is 0. If the sprite you add has an attribute layer then that layer will be used. If the **kwarg contains 'layer' then the sprites passed will be added to that layer (overriding the sprite.layer attribute). If neither sprite has attribute layer nor kwarg then the default layer is used to add the sprites. """ self._spritelayers = {} self._spritelist = [] AbstractGroup.__init__(self) self._default_layer = kwargs.get('default_layer', 0) self.add(*sprites, **kwargs) def add_internal(self, sprite, layer=None): """ Do not use this method directly. It is used by the group to add a sprite internally. """ self.spritedict[sprite] = Rect(0, 0, 0, 0) # add a old rect if layer is None: try: layer = sprite._layer except AttributeError: layer = self._default_layer self._spritelayers[sprite] = layer if hasattr(sprite, '_layer'): sprite._layer = layer # add the sprite at the right position # bisect algorithmus sprites = self._spritelist # speedup sprites_layers = self._spritelayers leng = len(sprites) low = 0 high = leng-1 mid = low while(low<=high): mid = low + (high-low)//2 if(sprites_layers[sprites[mid]]<=layer): low = mid+1 else: high = mid-1 # linear search to find final position while(midlayer:# break after because no other will # follow with same layer break return sprites def switch_layer(self, layer1_nr, layer2_nr): """switches the sprites from layer1 to layer2 LayeredUpdates.switch_layer(layer1_nr, layer2_nr): return None The layers number must exist, it is not checked. """ sprites1 = self.remove_sprites_of_layer(layer1_nr) for spr in self.get_sprites_from_layer(layer2_nr): self.change_layer(spr, layer1_nr) self.add(sprites1, layer=layer2_nr) class LayeredDirty(LayeredUpdates): """LayeredDirty Group is for DirtySprites. Subclasses LayeredUpdates. pygame.sprite.LayeredDirty(*spites, **kwargs): return LayeredDirty This group requires pygame.sprite.DirtySprite or any sprite that has the following attributes: image, rect, dirty, visible, blendmode (see doc of DirtySprite). It uses the dirty flag technique and is therefore faster than the pygame.sprite.RenderUpdates if you have many static sprites. It also switches automatically between dirty rect update and full screen drawing, so you do no have to worry what would be faster. Same as for the pygame.sprite.Group. You can specify some additional attributes through kwargs: _use_update: True/False default is False _default_layer: default layer where sprites without a layer are added. _time_threshold: treshold time for switching between dirty rect mode and fullscreen mode, defaults to 1000./80 == 1000./fps New in pygame 1.8.0 """ def __init__(self, *sprites, **kwargs): """Same as for the pygame.sprite.Group. pygame.sprite.LayeredDirty(*spites, **kwargs): return LayeredDirty You can specify some additional attributes through kwargs: _use_update: True/False default is False _default_layer: the default layer where the sprites without a layer are added. _time_threshold: treshold time for switching between dirty rect mode and fullscreen mode, defaults to 1000./80 == 1000./fps """ LayeredUpdates.__init__(self, *sprites, **kwargs) self._clip = None self._use_update = False self._time_threshold = 1000./80. # 1000./ fps self._bgd = None for key, val in kwargs.items(): if key in ['_use_update', '_time_threshold', '_default_layer']: if hasattr(self, key): setattr(self, key, val) def add_internal(self, sprite, layer=None): """Do not use this method directly. It is used by the group to add a sprite internally. """ # check if all attributes needed are set if not hasattr(sprite, 'dirty'): raise AttributeError() if not hasattr(sprite, "visible"): raise AttributeError() if not hasattr(sprite, "blendmode"): raise AttributeError() if not isinstance(sprite, DirtySprite): raise TypeError() if sprite.dirty == 0: # set it dirty if it is not sprite.dirty = 1 LayeredUpdates.add_internal(self, sprite, layer) def draw(self, surface, bgd=None): """draw all sprites in the right order onto the passed surface. LayeredDirty.draw(surface, bgd=None): return Rect_list You can pass the background too. If a background is already set, then the bgd argument has no effect. """ # speedups _orig_clip = surface.get_clip() _clip = self._clip if _clip is None: _clip = _orig_clip _surf = surface _sprites = self._spritelist _old_rect = self.spritedict _update = self.lostsprites _update_append = _update.append _ret = None _surf_blit = _surf.blit _rect = Rect if bgd is not None: self._bgd = bgd _bgd = self._bgd _surf.set_clip(_clip) # ------- # 0. deside if normal render of flip start_time = get_ticks() if self._use_update: # dirty rects mode # 1. find dirty area on screen and put the rects into _update # still not happy with that part for spr in _sprites: if 0 < spr.dirty: # chose the right rect if spr.source_rect: _union_rect = _rect(spr.rect.topleft, spr.source_rect.size) else: _union_rect = _rect(spr.rect) _union_rect_collidelist = _union_rect.collidelist _union_rect_union_ip = _union_rect.union_ip i = _union_rect_collidelist(_update) while -1 < i: _union_rect_union_ip(_update[i]) del _update[i] i = _union_rect_collidelist(_update) _update_append(_union_rect.clip(_clip)) _union_rect = _rect(_old_rect[spr]) _union_rect_collidelist = _union_rect.collidelist _union_rect_union_ip = _union_rect.union_ip i = _union_rect_collidelist(_update) while -1 < i: _union_rect_union_ip(_update[i]) del _update[i] i = _union_rect_collidelist(_update) _update_append(_union_rect.clip(_clip)) # can it be done better? because that is an O(n**2) algorithm in # worst case # clear using background if _bgd is not None: for rec in _update: _surf_blit(_bgd, rec, rec) # 2. draw for spr in _sprites: if 1 > spr.dirty: if spr._visible: # sprite not dirty, blit only the intersecting part _spr_rect = spr.rect if spr.source_rect is not None: _spr_rect = Rect(spr.rect.topleft, spr.source_rect.size) _spr_rect_clip = _spr_rect.clip for idx in _spr_rect.collidelistall(_update): # clip clip = _spr_rect_clip(_update[idx]) _surf_blit(spr.image, clip, \ (clip[0]-_spr_rect[0], \ clip[1]-_spr_rect[1], \ clip[2], \ clip[3]), spr.blendmode) else: # dirty sprite if spr._visible: _old_rect[spr] = _surf_blit(spr.image, spr.rect, \ spr.source_rect, spr.blendmode) if spr.dirty == 1: spr.dirty = 0 _ret = list(_update) else: # flip, full screen mode if _bgd is not None: _surf_blit(_bgd, (0, 0)) for spr in _sprites: if spr._visible: _old_rect[spr] = _surf_blit(spr.image, spr.rect, spr.source_rect,spr.blendmode) _ret = [_rect(_clip)] # return only the part of the screen changed # timing for switching modes # how to find a good treshold? it depends on the hardware it runs on end_time = get_ticks() if end_time-start_time > self._time_threshold: self._use_update = False else: self._use_update = True ## # debug ## print " check: using dirty rects:", self._use_update # emtpy dirty reas list _update[:] = [] # ------- # restore original clip _surf.set_clip(_orig_clip) return _ret def clear(self, surface, bgd): """used to set background Group.clear(surface, bgd): return None """ self._bgd = bgd def repaint_rect(self, screen_rect): """repaints the given area LayeredDirty.repaint_rect(screen_rect): return None screen_rect is in screencoordinates. """ self.lostsprites.append(screen_rect.clip(self._clip)) def set_clip(self, screen_rect=None): """ clip the area where to draw. Just pass None (default) to reset the clip LayeredDirty.set_clip(screen_rect=None): return None """ if screen_rect is None: self._clip = pygame.display.get_surface().get_rect() else: self._clip = screen_rect self._use_update = False def get_clip(self): """clip the area where to draw. Just pass None (default) to reset the clip LayeredDirty.get_clip(): return Rect """ return self._clip def change_layer(self, sprite, new_layer): """changes the layer of the sprite change_layer(sprite, new_layer): return None sprite must have been added to the renderer. It is not checked. """ LayeredUpdates.change_layer(self, sprite, new_layer) if sprite.dirty == 0: sprite.dirty = 1 def set_timing_treshold(self, time_ms): """sets the treshold in milliseconds set_timing_treshold(time_ms): return None Default is 1000./80 where 80 is the fps I want to switch to full screen mode. """ self._time_threshold = time_ms class GroupSingle(AbstractGroup): """A group container that holds a single most recent item. This class works just like a regular group, but it only keeps a single sprite in the group. Whatever sprite has been added to the group last, will be the only sprite in the group. You can access its one sprite as the .sprite attribute. Assigning to this attribute will properly remove the old sprite and then add the new one.""" def __init__(self, sprite = None): AbstractGroup.__init__(self) self.__sprite = None if sprite is not None: self.add(sprite) def copy(self): return GroupSingle(self.__sprite) def sprites(self): if self.__sprite is not None: return [self.__sprite] else: return [] def add_internal(self, sprite): if self.__sprite is not None: self.__sprite.remove_internal(self) self.__sprite = sprite def __nonzero__(self): return (self.__sprite is not None) def _get_sprite(self): return self.__sprite def _set_sprite(self, sprite): self.add_internal(sprite) sprite.add_internal(self) return sprite sprite = property(_get_sprite, _set_sprite, None, "The sprite contained in this group") def remove_internal(self, sprite): if sprite is self.__sprite: self.__sprite = None def has_internal(self, sprite): return (self.__sprite is sprite) # Optimizations... def __contains__(self, sprite): return (self.__sprite is sprite) # some different collision detection functions that could be used. def collide_rect(left, right): """collision detection between two sprites, using rects. pygame.sprite.collide_rect(left, right): return bool Tests for collision between two sprites. Uses the pygame rect colliderect function to calculate the collision. Intended to be passed as a collided callback function to the *collide functions. Sprites must have a "rect" attributes. New in pygame 1.8.0 """ return left.rect.colliderect(right.rect) class collide_rect_ratio: """A callable class that checks for collisions between two sprites, using a scaled version of the sprites rects. Is created with a ratio, the instance is then intended to be passed as a collided callback function to the *collide functions. New in pygame 1.8.1 """ def __init__( self, ratio ): """Creates a new collide_rect_ratio callable. ratio is expected to be a floating point value used to scale the underlying sprite rect before checking for collisions. """ self.ratio = ratio def __call__( self, left, right ): """pygame.sprite.collide_rect_ratio(ratio)(left, right): bool collision detection between two sprites, using scaled rects. Tests for collision between two sprites. Uses the pygame rect colliderect function to calculate the collision, after scaling the rects by the stored ratio. Sprites must have a "rect" attributes. """ ratio = self.ratio leftrect = left.rect width = leftrect.width height = leftrect.height leftrect = leftrect.inflate( width * ratio - width, height * ratio - height ) rightrect = right.rect width = rightrect.width height = rightrect.height rightrect = rightrect.inflate( width * ratio - width, height * ratio - height ) return leftrect.colliderect( rightrect ) def collide_circle( left, right ): """collision detection between two sprites, using circles. pygame.sprite.collide_circle(left, right): return bool Tests for collision between two sprites, by testing to see if two circles centered on the sprites overlap. If the sprites have a "radius" attribute, that is used to create the circle, otherwise a circle is created that is big enough to completely enclose the sprites rect as given by the "rect" attribute. Intended to be passed as a collided callback function to the *collide functions. Sprites must have a "rect" and an optional "radius" attribute. New in pygame 1.8.0 """ xdistance = left.rect.centerx - right.rect.centerx ydistance = left.rect.centery - right.rect.centery distancesquared = xdistance ** 2 + ydistance ** 2 try: leftradiussquared = left.radius ** 2 except AttributeError: leftrect = left.rect leftradiussquared = ( leftrect.width ** 2 + leftrect.height ** 2 ) / 4 try: rightradiussquared = right.radius ** 2 except AttributeError: rightrect = right.rect rightradiussquared = ( rightrect.width ** 2 + rightrect.height ** 2 ) / 4 return distancesquared < leftradiussquared + rightradiussquared class collide_circle_ratio( object ): """A callable class that checks for collisions between two sprites, using a scaled version of the sprites radius. Is created with a ratio, the instance is then intended to be passed as a collided callback function to the *collide functions. New in pygame 1.8.1 """ def __init__( self, ratio ): """Creates a new collide_circle_ratio callable. ratio is expected to be a floating point value used to scale the underlying sprite radius before checking for collisions. """ self.ratio = ratio # Constant value that folds in division for diameter to radius, # when calculating from a rect. self.halfratio = ratio ** 2 / 4.0 def __call__( self, left, right ): """pygame.sprite.collide_circle_radio(ratio)(left, right): return bool collision detection between two sprites, using scaled circles. Tests for collision between two sprites, by testing to see if two circles centered on the sprites overlap, after scaling the circles radius by the stored ratio. If the sprites have a "radius" attribute, that is used to create the circle, otherwise a circle is created that is big enough to completely enclose the sprites rect as given by the "rect" attribute. Intended to be passed as a collided callback function to the *collide functions. Sprites must have a "rect" and an optional "radius" attribute. """ ratio = self.ratio xdistance = left.rect.centerx - right.rect.centerx ydistance = left.rect.centery - right.rect.centery distancesquared = xdistance ** 2 + ydistance ** 2 # Optimize for not containing radius attribute, as if radius was # set consistently, would probably be using collide_circle instead. if hasattr( left, "radius" ): leftradiussquared = (left.radius * ratio) ** 2 if hasattr( right, "radius" ): rightradiussquared = (right.radius * ratio) ** 2 else: halfratio = self.halfratio rightrect = right.rect rightradiussquared = (rightrect.width ** 2 + rightrect.height ** 2) * halfratio else: halfratio = self.halfratio leftrect = left.rect leftradiussquared = (leftrect.width ** 2 + leftrect.height ** 2) * halfratio if hasattr( right, "radius" ): rightradiussquared = (right.radius * ratio) ** 2 else: rightrect = right.rect rightradiussquared = (rightrect.width ** 2 + rightrect.height ** 2) * halfratio return distancesquared < leftradiussquared + rightradiussquared def collide_mask(left, right): """collision detection between two sprites, using masks. pygame.sprite.collide_mask(SpriteLeft, SpriteRight): bool Tests for collision between two sprites, by testing if thier bitmasks overlap. If the sprites have a "mask" attribute, that is used as the mask, otherwise a mask is created from the sprite image. Intended to be passed as a collided callback function to the *collide functions. Sprites must have a "rect" and an optional "mask" attribute. New in pygame 1.8.0 """ xoffset = right.rect[0] - left.rect[0] yoffset = right.rect[1] - left.rect[1] try: leftmask = left.mask except AttributeError: leftmask = from_surface(left.image) try: rightmask = right.mask except AttributeError: rightmask = from_surface(right.image) return leftmask.overlap(rightmask, (xoffset, yoffset)) def spritecollide(sprite, group, dokill, collided = None): """find Sprites in a Group that intersect another Sprite pygame.sprite.spritecollide(sprite, group, dokill, collided = None): return Sprite_list Return a list containing all Sprites in a Group that intersect with another Sprite. Intersection is determined by comparing the Sprite.rect attribute of each Sprite. The dokill argument is a bool. If set to True, all Sprites that collide will be removed from the Group. The collided argument is a callback function used to calculate if two sprites are colliding. it should take two sprites as values, and return a bool value indicating if they are colliding. If collided is not passed, all sprites must have a "rect" value, which is a rectangle of the sprite area, which will be used to calculate the collision. """ crashed = [] if collided is None: # Special case old behaviour for speed. spritecollide = sprite.rect.colliderect if dokill: for s in group.sprites(): if spritecollide(s.rect): s.kill() crashed.append(s) else: for s in group: if spritecollide(s.rect): crashed.append(s) else: if dokill: for s in group.sprites(): if collided(sprite, s): s.kill() crashed.append(s) else: for s in group: if collided(sprite, s): crashed.append(s) return crashed def groupcollide(groupa, groupb, dokilla, dokillb, collided = None): """pygame.sprite.groupcollide(groupa, groupb, dokilla, dokillb) -> dict collision detection between group and group given two groups, this will find the intersections between all sprites in each group. it returns a dictionary of all sprites in the first group that collide. the value for each item in the dictionary is a list of the sprites in the second group it collides with. the two dokill arguments control if the sprites from either group will be automatically removed from all groups. collided is a callback function used to calculate if two sprites are colliding. it should take two sprites as values, and return a bool value indicating if they are colliding. if collided is not passed, all sprites must have a "rect" value, which is a rectangle of the sprite area, which will be used to calculate the collision.""" crashed = {} SC = spritecollide if dokilla: for s in groupa.sprites(): c = SC(s, groupb, dokillb, collided) if c: crashed[s] = c s.kill() else: for s in groupa: c = SC(s, groupb, dokillb, collided) if c: crashed[s] = c return crashed def spritecollideany(sprite, group, collided = None): """pygame.sprite.spritecollideany(sprite, group) -> sprite finds any sprites that collide given a sprite and a group of sprites, this will return return any single sprite that collides with with the given sprite. If there are no collisions this returns None. if you don't need all the features of the spritecollide function, this function will be a bit quicker. collided is a callback function used to calculate if two sprites are colliding. it should take two sprites as values, and return a bool value indicating if they are colliding. if collided is not passed, all sprites must have a "rect" value, which is a rectangle of the sprite area, which will be used to calculate the collision.""" if collided is None: # Special case old behaviour for speed. spritecollide = sprite.rect.colliderect for s in group: if spritecollide(s.rect): return s else: for s in group: if collided(sprite, s): return s return None pygame-1.9.1release/lib/sprite.doc0000644000175000017500000005063211020214753017007 0ustar vincentvincentpygame.sprite pygame module with basic game object classes This module contains several simple classes to be used within games. There is the main Sprite class and several Group classes that contain Sprites. The use of these classes is entirely optional when using Pygame. The classes are fairly lightweight and only provide a starting place for the code that is common to most games. The Sprite class is intended to be used as a base class for the different types of objects in the game. There is also a base Group class that simply stores sprites. A game could create new types of Group classes that operate on specially customized Sprite instances they contain. The basic Sprite class can draw the Sprites it contains to a Surface. The Group.draw() method requires that each Sprite have a Surface.image attribute and a Surface.rect. The Group.clear() method requires these same attributes, and can be used to erase all the Sprites with background. There are also more advanced Groups: pygame.sprite.RenderUpdates() and pygame.sprite.OrderedUpdates(). Lastly, this module contains several collision functions. These help find sprites inside multiple groups that have intersecting bounding rectangles. To find the collisions, the Sprites are required to have a Surface.rect attribute assigned. The groups are designed for high efficiency in removing and adding Sprites to them. They also allow cheap testing to see if a Sprite already exists in a Group. A given Sprite can exist in any number of groups. A game could use some groups to control object rendering, and a completely separate set of groups to control interaction or player movement. Instead of adding type attributes or bools to a derived Sprite class, consider keeping the Sprites inside organized Groups. This will allow for easier lookup later in the game. Sprites and Groups manage their relationships with the add() and remove() methods. These methods can accept a single or multiple targets for membership. The default initializers for these classes also takes a single or list of targets for initial membership. It is safe to repeatedly add and remove the same Sprite from a Group. While it is possible to design sprite and group classes that don't derive from the Sprite and AbstractGroup classes below, it is strongly recommended that you extend those when you add a Sprite or Group class. Sprites are not thread safe. So lock them yourself if using threads.
    Sprite simple base class for visible game objects pygame.sprite.Sprite(*groups): return Sprite The base class for visible game objects. Derived classes will want to override the Sprite.update() and assign a Sprite.image and Sprite.rect attributes. The initializer can accept any number of Group instances to be added to. When subclassing the Sprite, be sure to call the base initializer before adding the Sprite to Groups.
    update method to control sprite behavior Sprite.update(*args): The default implementation of this method does nothing; it's just a convenient "hook" that you can override. This method is called by Group.update() with whatever arguments you give it. There is no need to use this method if not using the convenience method by the same name in the Group class. add add the sprite to groups Sprite.add(*groups): return None Any number of Group instances can be passed as arguments. The Sprite will be added to the Groups it is not already a member of. remove remove the sprite from groups Sprite.remove(*groups): return None Any number of Group instances can be passed as arguments. The Sprite will be removed from the Groups it is currently a member of. kill remove the Sprite from all Groups Sprite.kill(): return None The Sprite is removed from all the Groups that contain it. This won't change anything about the state of the Sprite. It is possible to continue to use the Sprite after this method has been called, including adding it to Groups. alive does the sprite belong to any groups Sprite.alive(): return bool Returns True when the Sprite belongs to one or more Groups. groups list of Groups that contain this Sprite Sprite.groups(): return group_list Return a list of all the Groups that contain this Sprite. DirtySprite a more featureful subclass of Sprite with more attributes pygame.sprite.DirtySprite(*groups): return DirtySprite Extra DirtySprite attributes with their default values: dirty = 1 if set to 1, it is repainted and then set to 0 again if set to 2 then it is always dirty ( repainted each frame, flag is not reset) 0 means that it is not dirty and therefor not repainted again blendmode = 0 its the special_flags argument of blit, blendmodes source_rect = None source rect to use, remember that it is relative to topleft (0,0) of self.image visible = 1 normally 1, if set to 0 it will not be repainted (you must set it dirty too to be erased from screen) layer = 0 (READONLY value, it is read when adding it to the LayeredRenderGroup, for details see doc of LayeredRenderGroup)
    Group container class for many Sprites pygame.sprite.Group(*sprites): return Group A simple container for Sprite objects. This class can be inherited to create containers with more specific behaviors. The constructor takes any number of Sprite arguments to add to the Group. The group supports the following standard Python operations: in test if a Sprite is contained len the number of Sprites contained bool test if any Sprites are contained iter iterate through all the Sprites The Sprites in the Group are not ordered, so drawing and iterating the Sprites is in no particular order.
    sprites list of the Sprites this Group contains Group.sprites(): return sprite_list Return a list of all the Sprites this group contains. You can also get an iterator from the group, but you cannot iterator over a Group while modifying it. copy duplicate the Group Group.copy(): return Group Creates a new Group with all the same Sprites as the original. If you have subclassed Group, the new object will have the same (sub-)class as the original. This only works if the derived class's constructor takes the same arguments as the Group class's. add add Sprites to this Group Group.add(*sprites): return None Add any number of Sprites to this Group. This will only add Sprites that are not already members of the Group. Each sprite argument can also be a iterator containing Sprites. remove remove Sprites from the Group Group.remove(*sprites): return None Remove any number of Sprites from the Group. This will only remove Sprites that are already members of the Group. Each sprite argument can also be a iterator containing Sprites. has test if a Group contains Sprites Group.has(*sprites): return None Return True if the Group contains all of the given sprites. This is similar to using the "in" operator on the Group ("if sprite in group: ..."), which tests if a single Sprite belongs to a Group. Each sprite argument can also be a iterator containing Sprites. update call the update method on contained Sprites Group.update(*args): return None Calls the update() method on all Sprites in the Group. The base Sprite class has an update method that takes any number of arguments and does nothing. The arguments passed to Group.update() will be passed to each Sprite. There is no way to get the return value from the Sprite.update() methods. draw blit the Sprite images Group.draw(Surface): return None Draws the contained Sprites to the Surface argument. This uses the Sprite.image attribute for the source surface, and Sprite.rect for the position. The Group does not keep sprites in any order, so the draw order is arbitrary. clear draw a background over the Sprites Group.clear(Surface_dest, background): return None Erases the Sprites used in the last Group.draw() call. The destination Surface is cleared by filling the drawn Sprite positions with the background. The background is usually a Surface image the same dimensions as the destination Surface. However, it can also be a callback function that takes two arguments; the destination Surface and an area to clear. The background callback function will be called several times each clear. Here is an example callback that will clear the Sprites with solid red: def clear_callback(surf, rect): color = 255, 0, 0 surf.fill(color, rect) empty remove all Sprites Group.empty(): return None Removes all Sprites from this Group. RenderUpdates Group class that tracks dirty updates pygame.sprite.RenderUpdates(*sprites): return RenderUpdates This class is derived from pygame.sprite.Group(). It has an extended draw() method that tracks the changed areas of the screen.
    draw blit the Sprite images and track changed areas RenderUpdates.draw(surface): return Rect_list Draws all the Sprites to the surface, the same as Group.draw(). This method also returns a list of Rectangular areas on the screen that have been changed. The returned changes include areas of the screen that have been affected by previous Group.clear() calls. The returned Rect list should be passed to pygame.display.update(). This will help performance on software driven display modes. This type of updating is usually only helpful on destinations with non-animating backgrounds. OrderedUpdates RenderUpdates class that draws Sprites in order of addition pygame.sprite.OrderedUpdates(*spites): return OrderedUpdates This class derives from pygame.sprite.RenderUpdates(). It maintains the order in which the Sprites were added to the Group for rendering. This makes adding and removing Sprites from the Group a little slower than regular Groups. LayeredUpdates LayeredUpdates Group handles layers, that draws like OrderedUpdates. pygame.sprite.LayeredUpdates(*spites, **kwargs): return LayeredUpdates This group is fully compatible with pygame.sprite.Sprite. You can set the default layer through kwargs using 'default_layer' and an integer for the layer. The default layer is 0. If the sprite you add has an attribute layer then that layer will be used. If the **kwarg contains 'layer' then the sprites passed will be added to that layer (overriding the sprite.layer attribute). If neither sprite has attribute layer nor **kwarg then the default layer is used to add the sprites. New in pygame 1.8.0
    add add a sprite or sequence of sprites to a group LayeredUpdates.add(*sprites, **kwargs): return None If the sprite(s) have an attribute layer then that is used for the layer. If **kwargs contains 'layer' then the sprite(s) will be added to that argument (overriding the sprite layer attribute). If neither is passed then the sprite(s) will be added to the default layer. sprites returns a ordered list of sprites (first back, last top). LayeredUpdates.sprites(): return sprites draw draw all sprites in the right order onto the passed surface. LayeredUpdates.draw(surface): return Rect_list get_sprites_at returns a list with all sprites at that position. LayeredUpdates.get_sprites_at(pos): return colliding_sprites Bottom sprites first, top last. get_sprite returns the sprite at the index idx from the groups sprites LayeredUpdates.get_sprite(idx): return sprite Raises IndexOutOfBounds if the idx is not within range. remove_sprites_of_layer removes all sprites from a layer and returns them as a list. LayeredUpdates.remove_sprites_of_layer(layer_nr): return sprites layers returns a list of layers defined (unique), sorted from botton up. LayeredUpdates.layers(): return layers change_layer changes the layer of the sprite LayeredUpdates.change_layer(sprite, new_layer): return None sprite must have been added to the renderer. It is not checked. get_layer_of_sprite returns the layer that sprite is currently in. LayeredUpdates.get_layer_of_sprite(sprite): return layer If the sprite is not found then it will return the default layer. get_top_layer returns the top layer LayeredUpdates.get_top_layer(): return layer get_bottom_layer returns the bottom layer LayeredUpdates.get_bottom_layer(): return layer move_to_front brings the sprite to front layer LayeredUpdates.move_to_front(sprite): return None Brings the sprite to front, changing sprite layer to topmost layer (added at the end of that layer). move_to_back moves the sprite to the bottom layer LayeredUpdates.move_to_back(sprite): return None Moves the sprite to the bottom layer, moving it behind all other layers and adding one additional layer. get_top_sprite returns the topmost sprite LayeredUpdates.get_top_sprite(): return Sprite get_sprites_from_layer returns all sprites from a layer, ordered by how they where added LayeredUpdates.get_sprites_from_layer(layer): return sprites Returns all sprites from a layer, ordered by how they where added. It uses linear search and the sprites are not removed from layer. switch_layer switches the sprites from layer1 to layer2 LayeredUpdates.switch_layer(layer1_nr, layer2_nr): return None The layers number must exist, it is not checked. LayeredDirty LayeredDirty Group is for DirtySprites. Subclasses LayeredUpdates. pygame.sprite.LayeredDirty(*spites, **kwargs): return LayeredDirty This group requires pygame.sprite.DirtySprite or any sprite that has the following attributes: image, rect, dirty, visible, blendmode (see doc of DirtySprite). It uses the dirty flag technique and is therefore faster than the pygame.sprite.RenderUpdates if you have many static sprites. It also switches automatically between dirty rect update and full screen drawing, so you do no have to worry what would be faster. Same as for the pygame.sprite.Group. You can specify some additional attributes through kwargs: _use_update: True/False default is False _default_layer: default layer where sprites without a layer are added. _time_threshold: treshold time for switching between dirty rect mode and fullscreen mode, defaults to 1000./80 == 1000./fps New in pygame 1.8.0
    draw draw all sprites in the right order onto the passed surface. LayeredDirty.draw(surface, bgd=None): return Rect_list You can pass the background too. If a background is already set, then the bgd argument has no effect. clear used to set background LayeredDirty.clear(surface, bgd): return None repaint_rect repaints the given area LayeredDirty.repaint_rect(screen_rect): return None screen_rect is in screencoordinates. set_clip clip the area where to draw. Just pass None (default) to reset the clip LayeredDirty.set_clip(screen_rect=None): return None get_clip clip the area where to draw. Just pass None (default) to reset the clip LayeredDirty.get_clip(): return Rect change_layer changes the layer of the sprite change_layer(sprite, new_layer): return None sprite must have been added to the renderer. It is not checked. set_timing_treshold sets the treshold in milliseconds set_timing_treshold(time_ms): return None Default is 1000./80 where 80 is the fps I want to switch to full screen mode. GroupSingle Group container that holds a single Sprite pygame.sprite.GroupSingle(sprite=None): return GroupSingle The GroupSingle container only holds a single Sprite. When a new Sprite is added, the old one is removed. There is a special property, GroupSingle.sprite, that accesses the Sprite that this Group contains. It can be None when the Group is empty. The property can also be assigned to add a Sprite into the GroupSingle container. spritecollide find Sprites in a Group that intersect another Sprite pygame.sprite.spritecollide(sprite, group, dokill, collided = None): return Sprite_list Return a list containing all Sprites in a Group that intersect with another Sprite. Intersection is determined by comparing the Sprite.rect attribute of each Sprite. The dokill argument is a bool. If set to True, all Sprites that collide will be removed from the Group. The collided argument is a callback function used to calculate if two sprites are colliding. it should take two sprites as values, and return a bool value indicating if they are colliding. If collided is not passed, all sprites must have a "rect" value, which is a rectangle of the sprite area, which will be used to calculate the collision. collided callables: collide_rect, collide_rect_ratio, collide_circle, collide_circle_ratio, collide_mask collide_rect collision detection between two sprites, using rects. pygame.sprite.collide_rect(left, right): return bool Tests for collision between two sprites. Uses the pygame rect colliderect function to calculate the collision. Intended to be passed as a collided callback function to the *collide functions. Sprites must have a "rect" attributes. New in pygame 1.8.0 collide_rect_ratio collision detection between two sprites, using rects scaled to a ratio. pygame.sprite.collide_rect_ratio(ratio): return collided_callable A callable class that checks for collisions between two sprites, using a scaled version of the sprites rects. Is created with a ratio, the instance is then intended to be passed as a collided callback function to the *collide functions. A ratio is a floating point number - 1.0 is the same size, 2.0 is twice as big, and 0.5 is half the size. New in pygame 1.8.1 collide_circle collision detection between two sprites, using circles. pygame.sprite.collide_circle(left, right): return bool Tests for collision between two sprites, by testing to see if two circles centered on the sprites overlap. If the sprites have a "radius" attribute, that is used to create the circle, otherwise a circle is created that is big enough to completely enclose the sprites rect as given by the "rect" attribute. Intended to be passed as a collided callback function to the *collide functions. Sprites must have a "rect" and an optional "radius" attribute. New in pygame 1.8.1 collide_circle_ratio collision detection between two sprites, using circles scaled to a ratio. pygame.sprite.collide_circle_ratio(ratio): return collided_callable A callable class that checks for collisions between two sprites, using a scaled version of the sprites radius. Is created with a floating point ratio, the instance is then intended to be passed as a collided callback function to the *collide functions. A ratio is a floating point number - 1.0 is the same size, 2.0 is twice as big, and 0.5 is half the size. The created callable tests for collision between two sprites, by testing to see if two circles centered on the sprites overlap, after scaling the circles radius by the stored ratio. If the sprites have a "radius" attribute, that is used to create the circle, otherwise a circle is created that is big enough to completely enclose the sprites rect as given by the "rect" attribute. Intended to be passed as a collided callback function to the *collide functions. Sprites must have a "rect" and an optional "radius" attribute. New in pygame 1.8.1 collide_mask collision detection between two sprites, using masks. pygame.sprite.collide_mask(SpriteLeft, SpriteRight): return bool Tests for collision between two sprites, by testing if thier bitmasks overlap. If the sprites have a "mask" attribute, that is used as the mask, otherwise a mask is created from the sprite image. Intended to be passed as a collided callback function to the *collide functions. Sprites must have a "rect" and an optional "mask" attribute. New in pygame 1.8.0 groupcollide find all Sprites that collide between two Groups pygame.sprite.groupcollide(group1, group2, dokill1, dokill2): return Sprite_dict This will find intersections between all the Sprites in two groups. Intersection is determined by comparing the Sprite.rect attribute of each Sprite. Every Sprite inside group1 is added to the return dictionary. The value for each item is the list of Sprites in group2 that intersect. If either dokill argument is True, the intersecting Sprites will be removed from their respective Group. spritecollideany simple test if a Sprite intersects anything in a Group pygame.sprite.spritecollideany(sprite, group): return bool Test if the given Sprite intersects with any Sprites in a Group. Intersection is determined by comparing of the Sprite.rect attribute of each Sprite. This collision test can be faster than pygame.sprite.spritecollide() since it has less work to do. pygame-1.9.1release/lib/sndarray.py0000644000175000017500000001411311207055754017214 0ustar vincentvincent## pygame - Python Game Library ## Copyright (C) 2008 Marcus von Appen ## ## This library is free software; you can redistribute it and/or ## modify it under the terms of the GNU Library General Public ## License as published by the Free Software Foundation; either ## version 2 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 ## Library General Public License for more details. ## ## You should have received a copy of the GNU Library General Public ## License along with this library; if not, write to the Free ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## ## Marcus von Appen ## mva@sysfault.org """pygame module for accessing sound sample data Functions to convert between Numeric or numpy arrays and Sound objects. This module will only be available when pygame can use the external numpy or Numeric package. Sound data is made of thousands of samples per second, and each sample is the amplitude of the wave at a particular moment in time. For example, in 22-kHz format, element number 5 of the array is the amplitude of the wave after 5/22000 seconds. Each sample is an 8-bit or 16-bit integer, depending on the data format. A stereo sound file has two values per sample, while a mono sound file only has one. Supported array systems are numpy numeric The default will be numpy, if installed. Otherwise, Numeric will be set as default if installed. If neither numpy nor Numeric are installed, the module will raise an ImportError. The array type to use can be changed at runtime using the use_arraytype() method, which requires one of the above types as string. Note: numpy and Numeric are not completely compatible. Certain array manipulations, which work for one type, might behave differently or even completely break for the other. Additionally, in contrast to Numeric numpy can use unsigned 16-bit integers. Sounds with 16-bit data will be treated as unsigned integers, if the sound sample type requests this. Numeric instead always uses signed integers for the representation, which is important to keep in mind, if you use the module's functions and wonder about the values. """ import pygame # Global array type setting. See use_arraytype(). __arraytype = None # Try to import the necessary modules. try: import pygame._numpysndarray as numpysnd __hasnumpy = True __arraytype = "numpy" except ImportError: __hasnumpy = False try: import pygame._numericsndarray as numericsnd __hasnumeric = True if not __hasnumpy: __arraytype = "numeric" except ImportError: __hasnumeric = False if not __hasnumpy and not __hasnumeric: raise ImportError("no module named numpy or Numeric found") def array (sound): """pygame.sndarray.array(Sound): return array Copy Sound samples into an array. Creates a new array for the sound data and copies the samples. The array will always be in the format returned from pygame.mixer.get_init(). """ if __arraytype == "numeric": return numericsnd.array (sound) elif __arraytype == "numpy": return numpysnd.array (sound) raise NotImplementedError("sound arrays are not supported") def samples (sound): """pygame.sndarray.samples(Sound): return array Reference Sound samples into an array. Creates a new array that directly references the samples in a Sound object. Modifying the array will change the Sound. The array will always be in the format returned from pygame.mixer.get_init(). """ if __arraytype == "numeric": return numericsnd.samples (sound) elif __arraytype == "numpy": return numpysnd.samples (sound) raise NotImplementedError("sound arrays are not supported") def make_sound (array): """pygame.sndarray.make_sound(array): return Sound Convert an array into a Sound object. Create a new playable Sound object from an array. The mixer module must be initialized and the array format must be similar to the mixer audio format. """ if __arraytype == "numeric": return numericsnd.make_sound (array) elif __arraytype == "numpy": return numpysnd.make_sound (array) raise NotImplementedError("sound arrays are not supported") def use_arraytype (arraytype): """pygame.sndarray.use_arraytype (arraytype): return None Sets the array system to be used for sound arrays. Uses the requested array type for the module functions. Currently supported array types are: numeric numpy If the requested type is not available, a ValueError will be raised. """ global __arraytype arraytype = arraytype.lower () if arraytype == "numeric": if __hasnumeric: __arraytype = arraytype else: raise ValueError("Numeric arrays are not available") elif arraytype == "numpy": if __hasnumpy: __arraytype = arraytype else: raise ValueError("numpy arrays are not available") else: raise ValueError("invalid array type") def get_arraytype (): """pygame.sndarray.get_arraytype (): return str Gets the currently active array type. Returns the currently active array type. This will be a value of the get_arraytypes() tuple and indicates which type of array module is used for the array creation. """ return __arraytype def get_arraytypes (): """pygame.sndarray.get_arraytypes (): return tuple Gets the array system types currently supported. Checks, which array system types are available and returns them as a tuple of strings. The values of the tuple can be used directly in the use_arraytype () method. If no supported array system could be found, None will be returned. """ vals = [] if __hasnumeric: vals.append ("numeric") if __hasnumpy: vals.append ("numpy") if len (vals) == 0: return None return tuple (vals) pygame-1.9.1release/lib/sndarray.doc0000644000175000017500000000636411136240306017330 0ustar vincentvincentpygame.sndarray pygame module for accessing sound sample data Functions to convert between Numeric or numpy arrays and Sound objects. This module will only be available when pygame can use the external numpy or Numeric package. Sound data is made of thousands of samples per second, and each sample is the amplitude of the wave at a particular moment in time. For example, in 22-kHz format, element number 5 of the array is the amplitude of the wave after 5/22000 seconds. Each sample is an 8-bit or 16-bit integer, depending on the data format. A stereo sound file has two values per sample, while a mono sound file only has one. Supported array systems are numpy numeric The default will be numpy, if installed. Otherwise, Numeric will be set as default if installed. If neither numpy nor Numeric are installed, the module will raise an ImportError. The array type to use can be changed at runtime using the use_arraytype() method, which requires one of the above types as string. Note: numpy and Numeric are not completely compatible. Certain array manipulations, which work for one type, might behave differently or even completely break for the other. Additionally, in contrast to Numeric numpy can use unsigned 16-bit integers. Sounds with 16-bit data will be treated as unsigned integers, if the sound sample type requests this. Numeric instead always uses signed integers for the representation, which is important to keep in mind, if you use the module's functions and wonder about the values.
    array copy Sound samples into an array pygame.sndarray.array(Sound): return array Creates a new array for the sound data and copies the samples. The array will always be in the format returned from pygame.mixer.get_init(). samples reference Sound samples into an array pygame.sndarray.samples(Sound): return array Creates a new array that directly references the samples in a Sound object. Modifying the array will change the Sound. The array will always be in the format returned from pygame.mixer.get_init(). make_sound convert an array into a Sound object pygame.sndarray.make_sound(array): return Sound Create a new playable Sound object from an array. The mixer module must be initialized and the array format must be similar to the mixer audio format. use_arraytype Sets the array system to be used for sound arrays pygame.sndarray.use_arraytype (arraytype): return None Uses the requested array type for the module functions. Currently supported array types are: numeric numpy If the requested type is not available, a ValueError will be raised. New in pygame 1.8. get_arraytype Gets the currently active array type. pygame.sndarray.get_arraytype (): return str Returns the currently active array type. This will be a value of the get_arraytypes() tuple and indicates which type of array module is used for the array creation. New in pygame 1.8 get_arraytypes Gets the array system types currently supported. pygame.sndarray.get_arraytypes (): return tuple Checks, which array systems are available and returns them as a tuple of strings. The values of the tuple can be used directly in the pygame.sndarray.use_arraytype () method. If no supported array system could be found, None will be returned. New in pygame 1.8. pygame-1.9.1release/lib/pygame_icon.tiff0000644000175000017500000017024407416131205020164 0ustar vincentvincentMM*€€æ€î.6(1>2N< bRp Z5âP(p=X°vИêˆF    " HHQuickTime 5.0.52001:12:21 04:34:56MacOS 10.1.2þÿþÿþÿþÿþÿþÿþÿþÿþÿløøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöúúùþþþþþþþÿÈÇÂØØÔïïìõôô¿¾ºììëÆÅÃ<ª©§T´´°KÅÄÀ=´²ªQ˜–‹n¢¡š`··²KÉÉÆ9ÚÚØ+ììëííëÁÀ¹ôóòÚÙÕééçîîìÉÉě𔅄}ððîúùö¥¤œ«©šííéÛÚÒçæßøøõþÿøøõòñìééâüüûüüûÞÝÔþþüëêæööôóòíõôñúúùïîéáßÕÕÓÈòòïÎÍÄÛÚÔééåÿÿþ¹·­Š‡tÁ¾°÷öôóóñ±°«åäßùøöìëæúúøëêäëêä8ÞÝÕßßÙüüûþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿløøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöúúùþþþÿþÿþÿÅÄ¿¿¿ºØØÖ-œ—g][Sš++'Û&&#óöõ óõ ø÷"" õ00/ô@@=÷POIÒ’‘‹s¶µ¯÷öõÝÜØééæîîìÉÉě𔅄}ððîúùö¥¤œ«©šííéÛÚÒçæßøøõþÿøøõòñìééâüüûüüûÞÝÔþþüëêæööôóòíõôñúúùïîéáßÕÕÓÈòòïÎÍÄÛÚÔééåÿÿþ¹·­Š‡tÁ¾°÷öôóóñ±°«åäßùøöìëæúúøëêäëêä8ÞÝÕßßÙüüûþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿxøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöûûúýýþúùùüüûþÿ½»·EVUQ§þ6|Ëô+( ýF<ÿqbÿ†tÿ’ÿ”€ÿyÿoÿqb ÿ]R ÿGA ÿ4/ ÿÿþLKH´ëêèÍÌÇîîìïïìÉÈě𔅄}ððîúùö¥¤œ«©šííéÛÚÒçæßøøõþÿøøõòñìééâüüûüüûÞÝÔþþüëêæööôóòíõôñúúùïîéáßÕÕÓÈòòïÎÍÄÛÚÔééåÿÿþ¹·­Š‡tÁ¾°÷öôóóñ±°«åäßùøöìëæúúøëêäëêä8ÞÝÕßßÙüüûþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿløøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöüüûþ÷¶¶®ÄüÆÆÁD665ê"ÿD:ÿ…u ÿÁ©ÿèÈ ÿõÒÿñÎÿïÌÿõÐÿú×ÿúÛ ÿøÙ ÿñÑÿãÈÿϺ$ÿ§–ÿ^T ÿ ü232Ì Ÿš^ææäîîëÌËÇš™”…„}ððîúùö¥¤œ«©šííéÛÚÒçæßøøõþÿøøõòñìééâüüûüüûÞÝÔþþüëêæööôóòíõôñúúùïîéáßÕÕÓÈòòïÎÍÄÛÚÔééåÿÿþ¹·­Š‡tÁ¾°÷öôóóñ±°«åäßùøöìëæúúøëêäëêä8ÞÝÕßßÙüüûþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿløøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøõüüûþù±°©¡ ™Y))-ÕLBÿ¶ÿãÃÿïÎÿúÖÿøÓÿñÍÿïËÿðÌÿôÒ ÿúÛÿþâ%ÿÿä)ÿÿä(ÿÿä*ÿÿæ-ÿüç-ÿéÖ)ÿŸÿ(#ÿ öIIH¹ÎÎË1þŸž˜…„}ððîúùö¥¤œ«©šííéÛÚÒçæßøøõþÿLøøõòñìééâüüûüüûÞÝÔþþüëêæööôóòíõõñúúùïîéáßÕÖÔÊöõòÑÐÇÞÝ×ìëèþÿh¼»²‰†sÁ¾°ööôôôò±°«åäßùøöìëæúúøëêäëêäÞÝÕßßÙüüûþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöüüûööõ ——‘h&&#Ý81ÿгTÿüØÿóÏÿñÎÿðÌÿíÉÿïÌÿôÔÿûÝÿþã)ÿÿå.ÿÿå0ÿÿä0ÿÿå/ÿÿä.ÿÿã-ÿÿå-ÿÿë.ÿúä-ÿï"ÿcYÿÿþ&,Ù››—k––‘/„„}ñðîúùö¥¤œ«©šííéÛÚÒçæßøøõþÿøøõòñìééâüüûüüûÞÝÔþþüëêæööôóòíõõñþþýòñìæäÚËɼääáúEÑÐÊ6ááÝ%ïï쟜zÄÁ³úúø÷÷ö±°ªåäßùøöìëæúúøëêäëêä8ÞÝÕßßÙüüûþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùüüúýýûññî’‘ŒvñD;ÿ¾¤ÿ÷ÒÿðÍÿíËÿîËÿîÊÿðÎÿüã"ÿÿï1ÿþì2ÿüç/ÿýí/ÿÿó1ÿÿô1ÿÿð0ÿÿê/ÿÿå-ÿþã-ÿÿã-ÿÿç.ÿÿí/ÿïØ+ÿ›Œÿ3-þÿ@?;·“‘…ôôòúú÷¥¤œ«©šííéÛÚÒçæßøøõþÿøøõòñìééâüüûüüûÞÝÔþýüëêæøø÷ûúöÙØÎÝÜÖ çæã!Ù×Ð/£¡”dDC:Ç(($ó:93õLKBîa^R¯mjZ—‰†wµ³§Uêêç¶µ­¬«¥éèäúúøììæúúøëêäëêä8ÞÝÕßßÙüüûþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùûûùúúøõõò ‘‘ŒvòOEÿ˰ÿóÐÿðÍÿíÊÿíÉÿðÍÿõÕÿÿæ&ÿõã.ÿÕÂ%ÿ°Ÿÿ¥’ÿ¬šÿ¼© ÿѾ#ÿêÓ(ÿùæ-ÿþî/ÿÿê-ÿþä-ÿþã-ÿÿæ-ÿÿë.ÿüë/ÿÊ·$ÿVM ÿ0,÷zxo‰ìëèúùõª©¡ª¨šííéÛÚÒçæßøøõþÿøøõòñìééâüüûüüûÞÝÔÿÿþêêæëêæìë迾µEywjŒLKDÑ$#÷ ÷*%ÿ<5 ÿ>7 ÿ5/ ÿ&#ý ü ûóLKD»sqfŠŸŸ™aÝÞÙ+ððëíìçûûúëêäëêä8ÞÝÕßßÙüüûþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿóòïóòïóòïóòïóòïóòïóòïóòïóòïóòïóòïóòïóòïóòïóòïóòïóòïóòïóòïóòïóòïóòïôóðòñîÔÓÌ¡¡šc ñUJÿÓ· ÿøÔÿïÌÿíÊ(ÿïËÿòÏÿþßÿòÜ&ÿ͹#ÿ[P ÿ#ÿÿ$# ÿ !&ÿþXÿ ÿ0*ÿn` ÿ½«ÿòà+ÿÿê/ÿÿå.ÿþã-ÿþä-ÿÿè.ÿýì/ÿî×+ÿ˜ˆÿ øfd\¥ÖÕÏ,Љ²°¡ððìÜÜÓçæßøøõþÿøøõòñìêéâüüûþþýâà×öõðåäá™–‹s+)ðö.) û^Qþq`ÿ“~ÿÑ´ÿÙ¼ ÿÕ¹ÿ̱ÿ»§ÿ§–ÿ€ÿf[ÿ?9 þ  úùIH?都œdåäßööóíìæìëå8ÞÝÕßßÙüüûþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿñðíñðíñðíñðíñðíñðíñðíñðíñðíñðíñðíñðíñðíñðíñðíñðíñðíñðíñðíñðíñðíñðíòñîöõòÐÐË#775ÍJ@ ÿͰ ÿùÕÿïËÿíÉÿïËÿùÞÿýì ÿÒ¿"ÿsfÿÿ,-3ÿnotÿ¢£©ÿ·¹¿ÿÄÅÊÿÈÈËÿ§¨¬ÿhhmÿ$#&ÿÿqc ÿØÄ%ÿÿë/ÿÿä-ÿþã-ÿþã-ÿÿå-ÿÿñ0ÿíÙ+ÿf[ÿü*)(×RQK¦ª©_äâÞ×ÖÌëêãúú÷þÿþýûöõðëêâûú÷ÛÚÔ¾»¯¨¦›fKIAÌ" þ@8ÿgZÿ¶ÿèÆÿñÍÿ÷Òÿü×ÿ÷Óÿ÷Öÿýà!ÿþæ+ÿýê/ÿûé/ÿ÷â-ÿåÎ(ÿ¸¥ÿylÿ?9 ÿ ýCA<˱¯¦Véèâîíç8ßÝ×ßßÙüüûþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøù÷õôòðïìø÷ô¥¤ b)"ÿ·ž ÿöÒÿðÍÿîÊÿîÈÿýãÿÛË"ÿ¨™ÿ0+ÿ $ÿkmwÿÚÛÝÿúûüÿûûüôÿýþýÿüüýÿÓÓÕÿkkpÿÿA7ÿð ÿÿî0ÿþä-ÿþã-ÿþã-ÿþä-ÿÿé.ÿî×+ÿ’‚ÿ:4ÿþõUTM´·¶®OÞÞÙ)ííëïïî °¯§ âáÜÞÝØ*ÎÍÃ<–“„p<9.Ç ø4/ÿ‹y ÿèÇÿóÑÿ÷ÓÿñÍÿòÍÿóÏÿùÛÿÿä,ÿÿä.ÿÿå/ÿÿä-ÿÿæ-ÿÿç.ÿÿè/ÿÿê.ÿþê/ÿ÷â-ÿâË(ÿ~oÿ!ÿ'&!ÞZYO°×ÖÐ,ÝÜÔàßÙüüûþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ?øø÷÷÷ôÌÌÆ$_^U³„rÿóÏÿñÎÿîÉÿîÈÿÿâÿÖÂÿG? ÿÿDELÿ¸¸½ÿ÷÷øÜÿøùùÿ©«¯ÿ$%/ÿ81ÿöá,ÿÿî0ÿþã-ÿþã-ÿþã-ÿþä-ÿÿë.ÿúç-ÿÞÃÿ¹œÿgWÿþ##ö<:1öPN@ÔWUG²@?5µ144Í458ðô ø81þp ÿͲ ÿñÏÿøÔÿóÎÿîÊÿñÍÿ÷Ôÿýãÿÿø3ÿÿú4ÿÿ÷3ÿÿó2ÿÿì/ÿÿç.ÿÿä-ÿþâ-ÿþã-ÿÿä-ÿÿæ.ÿÿê/ÿôÛ ÿ¶Ÿÿ@7ÿþ554ÊÇÆ¾<îîéûûúþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿ7ûûú×ÖÏ.pqvŒA: úîÌÿôÑÿíÊÿîËÿüáÿáÏ ÿ<7ÿ[]gÿ­®´ÿêëìÌÿÜÞàÿnooÿB:ÿÜË%ÿÿí.ÿÿä-ÿþã.ÿþã0ÿþã,ÿÿç.ÿÿå)ÿüÝÿìÌ ÿÕ¸ ÿ¾§ÿ»¥ÿº¤ÿ´ þŸ‹þŠx ÿ’ ÿ¢ ÿ¿¦ ÿáÁÿòÎÿòÏÿðÍÿíÊÿôÓÿÿäÿøÝÿàÈÿO¼«ÿÿ†xÿ ÿ¡‘ÿųÿêÔ)ÿûè/ÿÿï0ÿþå-ÿþâ-ÿþâ+ÿþç1ÿÿú•ÿÿø‰ÿÚË2ÿ°žÿI@ ÿ.,%ÛÄüBþÿ,þýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿ3ùù÷èèä]]Z¶-,%å}kÿÿßÿîËÿíÊÿúÚÿñÜ&ÿ\RÿNOWÿÖÖÜÀÿÎÏÔÿÿj_ ÿñß+ÿÿè.ÿþä.ÿþæAÿþå@ÿþâ)ÿþã,ÿþã+ÿüÝÿÿáÿÿé*ÿÿê-ÿÿê+ÿÿé'ÿÿáÿýÚÿùÖÿû×ÿþÚÿøÔÿïÌÿìÉÿñÏÿÿãÿüãÿϼ ÿ}p ÿH?ÿ.)ÿ2*(%ÿ521ÿ?;4ÿ<8%ÿ<4ÿXMÿ‘ÿéØ*ÿÿò0ÿÿé.ÿþâ+ÿþã)ÿÿô}þÿÅÿÿþŠÿÿ÷DÿÁ­ÿ&"ÿ\[T¬ñðìþÿ(þýýþýýþýýþýýþýýþýýþýýþýýþýýþýýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþýþýþýþýþýþýþýþýþýþýþýþýþýþýþýþýþýþýþýþÿ/ûûúŸ•i øJ@ÿÕ¶ÿ÷ÓÿìÉÿóÑÿûä!ÿ”„ÿ ÿµ¶»¼ÿùùúÿ€…ÿÿ¯ÿþë.ÿÿä,ÿþèVÿÿïˆÿþçPÿþä2ÿþã-ÿýâ,ÿþã-ÿþã-ÿþã-ÿýâ*ÿûß%ÿôÓ ÿñÍÿðÌÿïÌÿîËÿíÊÿíÈÿõÒÿö×ÿį!ÿ‰yÿ/)ÿ##!ÿIKZÿz|Œÿ:³µ¼ÿÂÃÆÿÂÂÇÿ¦§±ÿsuƒÿ?ALÿ&$ÿOEÿ¶¦ÿüì.ÿÿì.ÿÿâ*ÿþä$ÿþòtÿÿþ¾þÿ=´ÿûðKÿ’‚ÿ ÷§§¢dÿþûýüüþýýþýýþýýþýýþýýþýýþýýþýýþýýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþüþüþüþüþüþüþüþüþüþüþüþüþüþüþüþüþüþü7ýýþõõóàÞÜ"=;7Ð2-ÿš…ÿÿÚÿíÊÿîÊÿýáÿι!ÿ% ÿNO\ÿîîð¸ÿwßßáÿ00:ÿF> ÿñÞ,ÿÿé+ÿÿéQÿÿö¼ÿÿõ¯ÿÿìpÿþä:ÿþã.ÿþã-ÿþã-ÿþä.ÿüß&ÿøÚÿðÎÿîËÿîËÿîËÿîËÿíÉÿöÓÿÿâÿ±žÿ ÿ! ÿWYdÿ¯±µÿããæÿþúðÿ*øùøÿÖ×Üÿ”– ÿ')8ÿ#ÿŒÿûé/ÿÿí/ÿþá#ÿþä'ÿÿõˆþÿÏÿÿþÿêÕ,ÿB8ÿUTO°çæßþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ{ûûúûûúûûúûûúûûúûûúûûúûûúûûúûûúûûúûûúûûúûûúûûúûûúûûúûûúþþýôôò‚€z„"ú¢ŒÿÝ¿ÿû×ÿìÈÿ÷Ô ÿóÜ"ÿh]ÿ$%0ÿ¿ÀÅ´ÿþühÿ™™žÿ ÿ³¡ÿþî-ÿÿì<ÿÿï‘ÿÿøÊÿÿò ÿþçJÿþã/ÿþã-ÿþã-ÿÿä.ÿùÜÿóÒÿîÌÿîËÿîËÿîÊÿîÊÿõÑÿõØÿ©˜ÿ@<ÿTUhÿ–—ŸÿþíÜÿþþ`ÿÃÅÈÿSU`ÿ"ÿ‘ÿòá,ÿÿç/ÿþß!ÿþé@ÿþõsÿÿü°ÿÿóBÿ¨—ÿ/+ò—•‘uòñéèçáéèâéèâéèâéèâéèâéèâéèâéèâþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿLûûúûûúûûúûûúûûúûûúûûúûûúûûúûûúûûúûûúûûúûûúûûúûûúûûúûûúþþýþò+<<9Æ7/ÿܽÿöÒÿôÐÿíÈÿþÜÿçÏ%ÿ,'ÿKLXÿíîî°ÿfÕÖÖÿÿ€rÿúï-ÿÿï3ÿþécÿÿô¨ÿÿò–ÿþçJÿþã/ÿþã-ÿþã-ÿþä.ÿ÷ÙÿðÎÿîËÿîËÿîËÿíÊÿðËÿÿàÿâÌ!ÿLBÿ)ÿÎÎÒÿîîïÔÿþþ\ÿ¸¹»ÿ)ÿ+$ÿØÆ%ÿÿë0ÿþà)ÿþå-ÿþìAÿÿú”ÿÿõIÿÞÉ#ÿ("ÿZYZ¨çæÙûûùøøöøøõøøõøøõøøõøøõøøõøøõþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿDúúùúúùúúùúúùúúùúúùúúùúúùúúùúúùúúùúúùúúùúúùúúùúúùúúùþýþò,ihb71ù·œÿúÕÿöÑÿîÊÿóÑÿñÖ ÿqdÿ*+0ÿ»¼Àÿþý°ÿ^òòóÿfgmÿ.(ÿн#ÿòÜ,ÿÿæ6ÿþæCÿþæBÿþä3ÿþã-ÿþã-ÿþã.ÿýâ*ÿõÕÿîÌÿîÌÿîËÿíÉÿñÍÿþÞÿÀ«ÿ=6ÿ??Aÿ¸¹ºüÿþþÐÿþú8ÿÍÎÏÿVVZÿ3, ÿÜË'ÿÿî/ÿþâ-ÿþä1ÿÿê@ÿÿè5ÿÿê.ÿ“ƒÿ*&÷—–“uüû÷þþþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿwüüûüüûüüûüüûüüûüüûüüûüüûüüûüüûüüûüüûüüûüüûüüûüüûüüûûúùÏÎË! õ|jÿõÑÿöÒÿðÌÿïÌÿúÝÿ˸!ÿ& ÿopzÿóôõ¬ÿþþÿ¬¬²ÿþOÿœˆÿÚÄ&ÿÿè,ÿþâ*ÿþã+ÿþã-ÿþã-ÿþã-ÿþä.ÿüß%ÿóÒ ÿíËÿîÌÿîËÿîËÿþÝÿÝÆÿG?ÿ#%2ÿ·¸À¼ÿ3ÑÒÕÿ2ÿ™Œÿÿñ/ÿÿå.ÿþâ,ÿþâ(ÿþã,ÿÿí/ÿØÅ'ÿC:ÿaa\¥ñðéþÿþþþþþþþþþþþþþþþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿ+®­¨O'!ÿÂ¥ÿúÕÿðÌÿíÉÿóÑÿúâ)ÿ‹}ÿ!ÿ¼¼Â¤ÿRÚÛÝÿ'(0ÿ^R ÿº«ÿÿí/ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿä/ÿùÜ ÿðÏÿîËÿîËÿíÊÿø× ÿöÜ ÿxj ÿÿ—˜ ¸ÿþü0ÿŽ™ÿVMÿÝÍ$ÿÿñ0ÿÿã-ÿþã-ÿþã-ÿÿç.ÿùá-ÿuh ÿRO@À×ÕÍ/þÿþþþþþþþþþþþþþþþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ+ŽŒ†}TGÿåÃÿôÐÿîËÿîÊÿøØÿêÖ,ÿOEÿLMSÿëëí¤ÿRóóôÿLKPÿ$ÿ™ÿÿó0ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿä/ÿøÙÿïÌÿîËÿîËÿíÊÿÿãÿ¶£ÿ"ÿ_`kÿððñ´ÿ3æçëÿ42(ÿƒÿÿí/ÿÿå-ÿþã-ÿþã-ÿÿä.ÿÿñ0ÿ¦˜ÿIC&çji^VßÞ×þþþþÿþþþþþþþþþþþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ@ùùøùùøùùøùùøùùøùùøùùøùùøùùøùùøùùøùùøùùøùùøùùøùùøþÿ,ÙÙ×I_]NÖ“}ÿïÍÿðÌÿîËÿðÍÿùàÿʼ#ÿ+& ÿ‡ˆŒÿþú¤ÿNøøùÿvvwÿ ÿtÿÿ÷2ÿþä-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã.ÿö×ÿîËÿîËÿîÊÿôÑÿêÓÿYNÿ++1ÿÂÂŬÿ3EFTÿLBÿêÓ)ÿÿí0ÿþâ-ÿþã-ÿÿâ-ÿÿó0ÿÐÁ$ÿA9 ÿdcb„ÙÖÇûûúþÿþþþþþþþþþþþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿoîîëîîëîîëîîëîîëîîëîîëîîëîîëîîëîîëîîëîîëîîëîîëííêùùöžŸ¢ŠJBÿÖ¶ÿñÎÿîËÿíÊÿóÑ ÿùæ'ÿ¢—ÿÿ¾¾Â ÿJûûüÿ“”™ÿÿpeÿÿô0ÿÿä-ÿþã-ÿþã-ÿþã-ÿþã.ÿýâ+ÿôÕÿíÊÿîËÿîÊÿÿàÿª™ÿ! ÿ~ˆ¨ÿ/{}‹ÿ%! ÿ·¦ÿÿõ1ÿÿä-ÿþã-ÿþâ-ÿÿë/ÿñÜ,ÿ`S ÿLKF¿ÜÛÓ.þÿþþþþþþþþþþþþþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿoóóñóóñóóñóóñóóñóóñóóñóóñóóñóóñóóñóóñóóñóóñòòðêéäÕÔÎaad­ƒpÿùÓÿîÊÿíÊÿîÌÿøÖÿ÷ç+ÿtkÿ(*2ÿììî ÿJýýþÿ¨¨¯ÿ ÿj^ÿÿð/ÿÿä-ÿþã-ÿþã-ÿþã-ÿþä.ÿüß%ÿóÑ ÿíÊÿîÊÿïÍÿÿíÿ[Pÿ;;GÿØØÚ¨ÿ/ÄÅÉÿ/.4ÿre ÿñÜ+ÿýë/ÿÿä-ÿþã-ÿÿæ-ÿÿé.ÿ™‰ÿ?;!ÿ®­¨vþÿøøöøøöøøöøøöøøöøøöþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿoùù÷ùù÷ùù÷ùù÷ùù÷ùù÷ùù÷ùù÷ùù÷ùù÷ùù÷ùù÷ùù÷ùù÷úûùôóŒt51îÁ¤ÿõÑÿíÊÿíÊÿïÎÿüÛÿõã,ÿRK ÿEGXÿóóö ÿFýýþÿ¯°´ÿÿj_ÿÿô/ÿÿä-ÿþã-ÿþã-ÿþã-ÿÿä/ÿùÛÿðÍÿîÉÿîÊÿõÒÿ÷áÿ0, ÿ~¤ÿþöHÿ\]fÿC:ÿ² ÿùé.ÿÿæ.ÿþã-ÿÿä-ÿÿï/ÿÍ»%ÿD< ÿ…„‚‹ÿþúñðëñðëñðëñðëñðëñðëþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿoööóööóööóööóööóööóööóööóööóööóööóööóööóõõòýýú³³±P,+*Øl]ÿðÍÿîËÿíÊÿíÉÿïÎÿþà$ÿïÜ+ÿC= ÿ`bpÿööø ÿFþþÿÿ¹¹¼ÿÿf\ÿÿû1ÿÿä-ÿþã-ÿþã-ÿþã-ÿÿä/ÿøÚÿïÌÿíÉÿîÊÿüØÿؽÿEC6ÿµ·Â¤ÿKþþýÿwx†ÿ82ÿ‚sÿóÞ,ÿÿå.ÿþã-ÿþâ-ÿÿî/ÿé×+ÿVLÿrrn”óóëåäÜåäÜåäÜåäÜåäÜåäÜþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿoÐÏÈÐÏÈÐÏÈÐÏÈÐÏÈÐÏÈÐÏÈÐÏÈÐÏÈÐÏÈÐÏÈÐÏÈÑÐÈÔÓ̹¸±,OOQº<2ÿÈ«ÿøÔÿíÊÿíÊÿìÉÿðÏÿÿã%ÿæÔ(ÿ<5ÿtuÿøøúœÿBÁÀÂÿ ÿe\ÿÿþ2ÿÿä-ÿþã-ÿþã-ÿþã-ÿÿä/ÿöØÿîËÿíÉÿîËÿüØÿ©”ÿggcÿáâè ÿG˜š¥ÿ84ÿZOÿíÙ*ÿÿç.ÿþã-ÿþâ-ÿÿé.ÿÿè.ÿvi ÿYXNº·´¤(­ªš­ªš­ªš­ªš­ªš­ªšþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿoæåáæåáæåáæåáæåáæåáæåáæåáæåáæåáæåáæåáåäàåäÝ€€ ö™‚ÿýØÿïËÿíÊÿíÊÿìÉÿñÏ ÿÿè)ÿâÐ(ÿ4.ÿ€€ˆÿöö÷œÿBÁÁÂÿ ÿjaÿÿþ3ÿÿä-ÿþã-ÿþã-ÿþã-ÿÿä/ÿõÕÿîÊÿíÊÿðÌÿ÷Õÿ}nÿ}}ÿøøú ÿG®¯¸ÿ41'ÿ:2ÿòâ-ÿÿç.ÿþã-ÿþã-ÿÿå.ÿÿí/ÿŒ~ÿZZLÁ¡ “/•”…•”…•”…•”…•”…•”…þÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ0ÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþþÿ;ÍËÊ4FFE¼KAÿѳÿü×ÿìÉÿíÊÿíÊÿìÉÿòÑ ÿÿê,ÿãÑ(ÿ2+ÿ‚ˆÿ÷÷ø ÿþþÿþ·;ÿÿphÿÿü3ÿÿå-ÿþã-ÿþã-ÿÿã.ÿþã.ÿóÓÿíÊÿíÊÿðÍÿðÑ ÿdWÿŽ‘œÿGº»Âÿ640ÿ%ÿðÜ,ÿÿé/ÿþã-ÿþã-ÿÿä.ÿÿê.ÿ”ƒÿ^[H쪡2ÇÆ¿ÆÅ¾ÆÅ¾ÆÅ¾ÆÅ¾ÆÅ¾þÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿløøöøøöøøöøøöøøöøøöøøöøøöøøöøøöøøöýþüááÜ[[\§6-ÿǬÿÿÞÿðÌÿíÊÿíÊÿíÊÿìÉÿôÓÿÿì/ÿéÕ*ÿ+%ÿxy}ÿþù ÿBôõöÿƒƒ‡ÿ ÿ‰}ÿÿõ1ÿþä-ÿþã-ÿþã-ÿÿä/ÿýà(ÿñÏÿíÊÿðÍÿõÒÿÞà ÿ81ÿ°°³œÿ/ÍÎÒÿCB?ÿÿÝÈ&ÿÿî/ÿþä-ÿþã-ÿÿæ.ÿÿè.ÿ–†ÿD@*Û°°¬Oþÿøøöøøöøøöøøöøøöþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿo÷÷õ÷÷õ÷÷õ÷÷õ÷÷õ÷÷õ÷÷õ÷÷õ÷÷õ÷÷õööôÿÿý‹ŒŽsü¡‹ÿÿÝÿôÐÿìÉÿíÊÿíÊÿíÊÿìÉÿóÓÿÿç-ÿñÝ,ÿ0+ÿYZbÿöö÷ÄÿþþÿþöÿþïÿþôÿþýðÿBãâæÿHIPÿL@ÿ©›ÿÿï0ÿþã-ÿþã-ÿþã-ÿÿå0ÿüÞ%ÿðÍÿíÊÿôÑÿüÚÿжÿ!ÿÇÇÊœÿ/ÐÑÖÿMKDÿÿξ#ÿÿí/ÿÿä-ÿþâ-ÿÿç.ÿÿë.ÿŠ|ÿ97&Û¶¶±Nþÿùø÷ùø÷ùø÷ùø÷ùø÷þÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿoððìððìððìððìððìððìððìððìððìññíòòîÅļ+FGH¼K@ÿãÆÿüÚÿíÊÿíÊÿíÊÿíÊÿíÊÿìÉÿòÑ ÿÿâ'ÿõß-ÿOG ÿGGRÿððòÈÿþñÿþµÿþvÿþgÿþ‡ÿþÆÿþöôÿBÇÈÍÿ++.ÿ~mÿÈ·"ÿÿë/ÿþã-ÿþã-ÿþã-ÿÿå0ÿûÝ!ÿïÍÿëÈÿöÓÿÿßÿȰÿÿÎÎÑœÿ/ËÌÓÿJHCÿ#ÿÐÂ#ÿÿé/ÿÿä-ÿþâ-ÿÿç.ÿÿò0ÿ—‡ÿ74â²°ªQþÿø÷õø÷õø÷õø÷õø÷õþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿoîîêîîêîîêîîêîîêîîêîîêîîêîîêííéõõðŽt'# ö ‰ÿÿÛÿòÏÿíÊÿíÊÿíÊÿíÊÿíÊÿìÉÿñÏÿþà$ÿöß-ÿnbÿ14<ÿÙÚÝÌÿþìÿþ…ÿþÿþÿþÿþ ÿþ:ÿþ«ÿþüüÿFüüýÿšœ¥ÿ&#ÿ´ŸÿåÑ(ÿÿç.ÿþã-ÿþã-ÿþã.ÿÿå/ÿùÛÿîÌÿìÈÿöÓÿÿàÿÅ®ÿ ÿÏÏÓœÿGÁÃÍÿC@;ÿ,%ÿÛÎ'ÿÿç-ÿþã-ÿþã-ÿÿã-ÿÿó1ÿö#ÿ:3 ÿ‡††vÿÿü÷öóöõòöõòöõòöõòþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿoæåáæåáæåáæåáæåáæåáæåáæåáçæâéèäµ´«5FE@ÅUHÿâÂÿûÖÿìÊÿíËÿíÊÿíÊÿíÊÿíÊÿíÊÿïÌÿûÞ"ÿûå/ÿ€ÿÿÃÄÇÌÿþ¥ÿþÿþÿþÿþÿþÿþÿþGÿþÓüÿFôõöÿVXfÿ60 ÿäÏ(ÿüæ.ÿÿä-ÿþã-ÿþã-ÿþã-ÿÿä.ÿ÷ÙÿïËÿìÉÿöÒÿÿÝ ÿÄ­ÿÿÊËÏœÿG°²¿ÿ96.ÿ=4ÿìß+ÿÿæ.ÿþã-ÿþã-ÿþâ-ÿÿë.ÿóÞ,ÿcW ÿZYU§ñïêùøõöõòöõòöõòöõòþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿpçæâçæâçæâçæâçæâçæâçæâçæâæåáïî댌‹w+' ö¡‹ÿùÕÿïÌÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿìÉÿøÙÿÿë2ÿ·§ÿ ÿœœ ÿþüÔÿþêÿþeÿþÿþÿþÿþÿþÿþÿþÿþ üÿFÒÒÖÿ'ÿqfÿøñ0ÿÿð0ÿþâ-ÿþã-ÿþã-ÿþã-ÿþâ,ÿõÖÿîËÿìÉÿôÑÿüÚ ÿ¿©ÿ" ÿÇÈÍôÿþþÿþòÿþéÿþøÿþü¼ÿ/™œ«ÿ3/ÿ]Sÿôî/ÿÿæ.ÿþâ-ÿþã-ÿþã-ÿÿä-ÿÿí/ÿ›ŒÿQM7Îþðúùö÷öó÷öó÷öó÷öóþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿsòñïòñïòñïòñïòñïòñïòñïóòðø÷õÅÄ¿,KJH½VHÿÞ¾ÿôÐÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿìÉÿõÖÿÿê/ÿêÙ+ÿ>8ÿLMSÿóóõÔÿþÞÿþTÿþÿþÿþÿþÿþÿþÿþ ÿ’’‘üÿFrrxÿÿȶ ÿÿô1ÿÿë/ÿþâ-ÿþã-ÿþã-ÿþä/ÿüß(ÿòÑ ÿîËÿíÉÿóÑÿúÙÿűÿÿÀÀÆüÿþüÿþÉÿþyÿþHÿþDÿþfÿþ“ÿþäÀÿG}~Œÿ81 ÿŽ€ÿ÷ô0ÿÿå.ÿþâ-ÿþã-ÿþã-ÿþâ-ÿÿí/ÿßÌ&ÿmb"òÁÁ¼GØ×ÊÍÌ¿ÍÌ¿ÍÌ¿ÍÌ¿þÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿsóóñóóñóóñóóñóóñóóñóóñññïéèä ‚‚„‚3- ùª‘ÿöÒÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿìÉÿôÓÿÿä+ÿüê0ÿ–†ÿÿ¶¶»þÿþØÿþôÿþ„ÿþÿþÿþÿþÿþÿþÿþ*ÿþ·KÿÉÊÌÿÿyl ÿùê/ÿÿè/ÿþä-ÿþã-ÿþã-ÿþä.ÿþä-ÿ÷ØÿîÌÿîËÿíÉÿóÒÿûÝÿØÂ ÿ'!ÿµµ¹üÿþ¾ÿþ@ÿþÿþÿþÿþÿþÿþoÿþäÈÿKééëÿRSZÿRJÿĵÿúñ/ÿÿå.ÿþã-ÿþã-ÿþã-ÿþã-ÿÿæ.ÿÿò/ÿ’"øpmf ˆ…wF»¹«¿¼®¾»­¾»­þÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿwôôòôôòôôòôôòôôòôôòôôòúúøÉÈÅ4DB?ÁWJÿß¿ÿóÏÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿìÉÿñÐ ÿüà'ÿÿé0ÿÚÄ$ÿ-'ÿXX`ÿììíÔÿþÓÿþZÿþÿþÿþÿþÿþÿþPÿÞßßÿPQUÿ.'ÿÕÃ#ÿÿñ0ÿÿä-ÿþã-ÿþã-ÿþã-ÿþã.ÿþá,ÿôÔÿîËÿîËÿíÊÿðÎÿøØ ÿíÖ!ÿ5.ÿ¦¥¨ÿþþÿþvÿþÿþÿþÿþÿþÿþÿþ%ÿþ¬ÈÿK¼¾Ãÿ210ÿ{m ÿíÙ)ÿýê.ÿÿä-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿâ-ÿÿö0ÿ¼²%ýì{yr|äâ×ÜÚÐÜÚÐÜÚÐþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿwññîññîññîññîññîññîññîûûø±±®T76*Ù|kÿíËÿïÌÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÉÿïÍÿûÞ#ÿÿé0ÿñÛ)ÿTIÿ))1ÿ××ÙÔÿþùÿþÿþ(ÿþÿþÿþ ÿþQÿþÔPÿãäåÿÿ`Uÿöå,ÿÿï/ÿÿç.ÿÿæ.ÿÿå-ÿÿä-ÿþä-ÿþâ,ÿöÖÿîÌÿîËÿíÊÿîËÿôÓÿôã#ÿD;ÿ››œÿþôÿþ_ÿþÿþÿþÿþÿþÿþÿþÿþ’ÿþûÌÿ3¢¤¬ÿ(%ÿ”„ÿÿè-ÿþè.ÿþä-ÿþã-ÿþã-ÿþã-ÿþã-ÿþâ-ÿÿñ0ÿ˼&ÿþÿjidŸîìãûûúúúùúúùþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿxýýýýýýýÑÐÊkln¡%" ÿ«• ÿùÕÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿùÛÿÿç0ÿüì/ÿ©˜ÿ ÿ‹Œ‘ÿþûÔÿþóÿþ¼ÿþ‚ÿþyÿþ ÿþÝüÿO˜™›ÿ#ÿõ ÿùö1ÿùî/ÿùé/ÿúè/ÿýæ.ÿÿè.ÿÿë.ÿÿí0ÿÿç)ÿø× ÿñÎÿïÌÿîÊÿñÎÿøâÿpdÿ„…†ÿþëÿþbÿþÿþÿþÿþÿþÿþÿþÿþ‹ÿþúÌÿ?pq|ÿ/)ÿðÿÿñ0ÿÿä-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿê.ÿâÎ)ÿ.(ÿDA-Ö¿¾¹Hþÿüüûüüûþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ{««§««§««§««§««§««§©©¥®®¨$NPV¶:2ÿÒ¶ ÿü×ÿìÉÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÉÿ÷Øÿÿæ1ÿÿê/ÿîÝ+ÿWL ÿ"",ÿÒÒÕØÿwþþÿÿúûýÿððôÿããèÿÓÔÙÿÄÅÍÿ±²¾ÿ~ÿ++1ÿ;4ÿ‹}ÿ„zÿ~sÿƒvÿ‹|ÿ¨–ÿį$ÿÙÂ'ÿêÓ,ÿîÜ,ÿñØÿ÷Ôÿ÷ÔÿöÐÿ÷Òÿþãÿ­™ÿaa^ÿÚÜßÿ‚‚ÿþÿþÿþÿþÿþÿþÿþÿþ¦ÌÿOþþÿÿEEKÿaVÿóÝ)ÿÿë/ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿå-ÿõß,ÿ…wÿ;4ÿ~~|öõïèçáèçáþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþùþùþùþùþùþúþû®®ªþ9\:Êk]ÿôÓ ÿôÐÿìÉÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿìÉÿõÕÿÿå0ÿÿä.ÿÿè.ÿÔÂ%ÿ?7 ÿ23AÿÙÚÞìÿñòôÿÖ×Üÿ¼½Äÿ–— ÿklyÿQS_ÿHILÿ>=4ÿ73!ÿ:7ÿ>:ÿC<ÿODÿXKÿVIÿjZÿtcÿn_ÿeWÿNDÿA8ÿ=4ÿD:ÿI?ÿF=ÿaU ÿ‚q ÿ¤ÿ¹žÿàÅÿ×Å ÿD?'ÿ±²ºÿÞÞÜÿþOÿþÿþÿþÿþÿþ ÿþtÿþçÌÿOÁÃÌÿB>$ÿ¯Ÿÿÿì/ÿÿä-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿã-ÿüå-ÿäÐ)ÿnb ÿdbY­Êɺ·µ¦·µ¦þÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿööôööôööôööôööôööôþÿhŸ ¡n,*ù¤ ÿÿßÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿìÉÿôÕÿÿå/ÿþã-ÿÿä-ÿÿê/ÿо#ÿC9ÿYZ]ÿÔÔÖÿþþÿþ÷ÿÐÐÑÿ˜˜¢ÿMP\ÿ443ÿ51ÿH@ ÿh[ ÿ‚qÿ‘}ÿ¥ÿ»¦ÿιÿßÃÿåÈÿèÊÿïÓÿõÚÿúÜÿùÛÿô×ÿïÓÿãÌÿÚÉÿÕÅÿÑÁÿÄ´ÿ¬Ÿÿsÿ`TÿMCÿH? ÿE< ÿH@ ÿÿNPXÿÙÙÛÿÛÛÚÿ‘‘ÿRRQÿþEÿþmÿþ›ÿþèÌÿSæçèÿJM^ÿ~pÿøá+ÿÿé.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿå.ÿÿô0ÿ¦•ÿ]X<ÐŒ‹>ÃÁ·ÇÅ»þÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿôôòôôòôôòôôòôôòôôòóóïvwy”2+ÿè ÿÿÜÿìÉÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿìÉÿö×ÿÿä/ÿþã-ÿþã-ÿÿä-ÿÿí/ÿÚÊ$ÿ@9ÿEFOÿ}„ÿkluÿ66?ÿÿJB ÿ}mÿ©• ÿ×½ ÿóÒÿøÕÿú×ÿþàÿÿéÿÿêÿÿåÿÿã#ÿÿå&ÿÿé)ÿÿê,ÿÿç-ÿÿç/ÿÿç0ÿÿç/ÿÿë-ÿÿð-ÿÿò.ÿÿò.ÿÿô.ÿÿõ/ÿúä-ÿäÎ)(ÿò$ÿ±¢!ÿŽ‚ÿcXÿ3,ÿÿ7:Jÿ„‡—ÿµ·¾ÿËÌÍÿþÞÿþôÿþúÌÿWûûüÿ‘“šÿ ÿÀ± ÿÿó0ÿÿã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿó0ÿ°ÿWN"ç™™˜\ÿÿû÷öòþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþþþþþþþþþþþÿhìëè\[\¥<3ÿÑ´ÿü×ÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿìÉÿðÎÿúÞ$ÿÿä/ÿþã-ÿÿá-ÿÿè.ÿÿï/ÿÿó0ÿQIÿþÿÿ*&ÿ\PÿŒÿßÅÿúÚÿÿß ÿþÜÿúØ ÿ÷ÖÿúÛÿüß$ÿüß)ÿüà,ÿþã/ÿÿä0ÿÿä/ÿþã.ÿþã/ÿÿã/ÿþä.ÿþã.ÿþã.ÿþã-ÿþâ.ÿþâ.ÿÿâ/ÿÿâ/ÿÿã.ÿÿè.ÿÿì.ÿÿñ0(ÿÿô0ÿÿö1ÿûê.ÿ;&ÿ–ˆÿVK ÿ0+ÿ101ÿ^_mÿ¯°·ÿþýÿþþÌÿWÊÊÎÿ'(8ÿF>ÿïÜ+ÿÿê.ÿýá,ÿýâ,ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿï/ÿØÄ&ÿRGÿƒ‚úøñìêãþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþýþýþýþýþýþÿßÞÛ$KKL´KAÿÚ¼ÿ÷ÒÿîËÿíÊÿíÊÿîËÿîËÿíÊÿíÊÿíÊÿíÊÿíÊÿíÉÿîËÿøÛÿþä.ÿþâ-ÿÿã-ÿÿð0ÿýï0ÿó#ÿh]ÿ)& ÿXOÿ‚tÿ½¦ÿòÖÿÿåÿ÷ÔÿòÎÿóÒ ÿö×ÿúÝ%ÿýâ-ÿÿä0ÿÿä0ÿþä/ÿÿä/ÿÿä-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿã.ÿÿä.ÿÿç.ÿÿî/ÿÿô1ÿÿô0ÿïÚ*ÿ¹©ÿvjÿ:1ÿ+)"ÿ]_kÿŽ”ÿþáÔÿ[ÛÛÜÿMNZÿ ÿ½¬ ÿÿé.ÿÿã-ÿýâ,ÿýâ,ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþä-ÿÿï0ÿðÜ+ÿcXÿa`U®ÇÅ·³±¢þÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿÔÓÑ.BBD¾ZMÿãÃÿóÏÿîËÿîËÿîËÿîËÿîËÿíÊÿíÊÿíÊÿíÊÿíÊÿíÉÿõ×ÿþä,ÿÿã/ÿÿå-ÿÿô0ÿóæ.ÿŽ„ÿ*& ÿÿ–‡ÿçÌÿ÷ØÿþÜÿùÖÿîÊÿñÐ ÿøÚÿüà(ÿþã.ÿÿä0ÿÿä/ÿþä-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþâ-ÿþâ-ÿÿã-ÿÿå-'ÿÿê/ÿÿï0ÿûå,ÿÕÁ!ÿƒvÿ'!ÿ#ÿCCLÿ”•›ÿääåàÿ_ååçÿWYhÿ ÿžÿüë.ÿÿæ.ÿþâ-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþä-ÿÿí/ÿÿë.ÿ†xÿHE4Õ‰ˆxDöþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿÃÿÃÿÃÿÃÿÃÿÄÄÀ©¨¡3??EÄVIÿåÄÿöÑÿíÊÿîËÿîËÿîËÿíÊÿíÊÿíÊÿíÊÿíÊÿíÉÿïÍÿýâ+ÿÿã.ÿÿä-ÿøã-ÿʽ&ÿpfÿ+&ÿSH ÿ°š ÿûÛ ÿû×ÿòÍÿîËÿîËÿôÔÿüá'ÿÿå0ÿÿä/ÿþã.ÿþã.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-Dÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþâ-ÿÿâ-ÿÿæ.ÿÿï0ÿöä-ÿʸ ÿŽÿOEÿ1-ÿXYXÿ§¨«ÿþøðÿcúúûÿÓÓ×ÿeenÿ'$ÿŠ~ÿúê.ÿÿì/ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿç-ÿÿò0ÿ¤•ÿ@@Hÿ?@@ÿ>9ÿ`V ÿªÿÿé.ÿÿé/ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã,ÿÿë.ÿåÎ(ÿ]Q ÿnmg¦×ÕÉþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿýýüýýüýýüýýüýýüýýüþÿ«ª¥bñ-&ÿ¾¢ÿü×ÿïÌÿîËÿîËÿíÊÿíÊÿíÊÿíÊÿíÉÿòÑÿÿæ/ÿÿü3ÿ˽&ÿA9 ÿxh ÿùØÿúÖÿíÊÿîÊÿíÈÿôÖÿýã-ÿÿå2ÿþä.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþâ-ÿÿã-ÿÿï0ÿîß'ÿ“‚ÿÿÿ{mÿôç,ÿÿö1ÿÿæ.ÿþâ-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-$ÿþã-ÿþã-ÿþã-ÿþã-ÿÿì/ÿóÞ,ÿeYÿed[ªÒÐÃþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþþýþþýþþýþþýþþýþþýþÿêéã[[W©þÿ^PÿãÂÿýØÿîÌÿíÊÿíÊÿíÊÿíÊÿíÊÿíÊÿöØÿýñ1ÿëØ,ÿmdÿ'"ÿëÎ ÿüØÿíÊÿîËÿîÊÿïÌÿüà'ÿÿå1ÿþä.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþâ+ÿÿæ3ÿÿùKÿýó>ÿ± ÿ6.ÿ94 ÿ¼²#ÿñå.ÿÿé/ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã/ÿþê>ÿÿó>ÿùç2ÿm` ÿ_]U±Åµ þÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿýýüýýüýýüýýüýýüýýüûûúòñí´³­G012Ï ÿo_ÿ׸ÿõÒÿðÍÿíÊÿíÊÿíÊÿíÊÿîËÿýàÿóå.ÿujÿ5/ ÿvfÿÿãÿðÌÿîËÿîËÿïÌÿøÙÿÿä.ÿÿä.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-Gÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã+ÿþæ2ÿþóoþÿu›ÿþýqÿ¿´,ÿB:ÿ2+ÿ“…ÿýê.ÿÿç-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã,ÿþã-ÿÿð^ÿÿúbÿÿïBÿzk ÿ<;4×xwmEþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþüþüþüþüþüþüþüúúùþÿËËÈ8996Éþÿ@8ÿ̯ÿúÕÿîËÿíÊÿíÊÿíÉÿðÍÿýæ"ÿµ¢"ÿÿOCÿÞÃÿôÑÿîËÿîËÿíËÿõÖÿþä/ÿþã.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþä-ÿþä-ÿþä-ÿþä-ÿþä.ÿþä.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã+ÿþå2ÿÿõþÿàþÿm›ÿöã3ÿpbÿ$ÿšŒÿüë.ÿÿæ-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþâ+ÿþã,ÿÿô~ÿÿý—ÿÿõ`ÿ‡uÿEC9Ó}}tBþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþûþûþûþûþûþûþûþüþýððïzzy–ÿÿOEÿË®ÿ÷ÒÿîËÿíÊÿíÊÿðÍÿõÛÿthÿ'"ÿ‡vÿøÕÿïÌÿîËÿîËÿñÏ ÿüÞ%ÿÿä/ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿæ.ÿÿç/ÿÿå.ÿýä-ÿýä-ÿÿæ/ÿÿç0ÿÿæ0ÿÿå/ÿÿä-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-+ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþâ)ÿþæ4ÿþø›þÿâþÿT‘ÿùè4ÿ{nÿÿ˺%ÿÿð/ÿÿä-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã.ÿþá&ÿþå1ÿÿü¨þÿµÿÿï`ÿ€oÿTRF¾ÈÇÁ-þÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþóþóþóþóþóþóþóþóþòþýþ¨]þæþÿþÿ?7ÿ¿¤ÿôÐÿðÌÿíÊÿðÍÿáà ÿC< ÿXL ÿ°˜ ÿýÙÿîËÿîËÿíÊÿõÕÿþâ,ÿþã.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã.ÿÿä/ÿúà,ÿðÕ"ÿèÌÿæÉÿæÊÿëÐÿòØ$ÿùß)ÿýä-ÿÿç/ÿÿå.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã,ÿþã'ÿþëHÿÿýÀþÿàþÿLtÿÝÎ3ÿ+%ÿPHÿíØ+ÿÿç.ÿþâ-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþàÿþêGþÿáþÿ±ÿöåAÿl\ÿVUM´ãâÝ#þÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþðþðþðþðþðþðþðþðþñþòþ¤;þ8Ìþÿÿþÿ/(ÿ¥Ž ÿïÍÿõÑÿòÏÿÇ­ ÿ*&ÿŒ{ÿβ ÿùÕÿíÊÿíÊÿïÍÿøÛÿþä-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿä0ÿþã/ÿ÷Ü&ÿؼÿÉ«ÿÆ©ÿħÿÂ¥ÿÁ¤ÿÆ©ÿÏ´ÿÝÂÿîÔ!ÿüâ-ÿÿå.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã+ÿþâ&ÿÿògþÿÙþÿL½ÿüðRÿ—†ÿÿŸÿüå,ÿÿá,ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã.ÿþâ*ÿþáÿÿñsþÿçþÿ‹ÿåÑ ÿOAÿ\ZX§ðïéþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÑþÑþÑþÑþÑþÑþÑþÑþÑþÏþÓ nno‘þÿD:ÿm^ÿ"ÿÿp ÿêÊÿÿÛÿ´ÿ&"ÿ¯™ÿÜ¿ ÿôÐÿîÊÿíÉÿðÏÿûß%ÿþã-ÿþã-ÿþã.ÿþã.ÿþã.ÿûß'ÿ÷ØÿéÊ ÿÞ½ÿÜ»ÿÕµÿίÿʬÿȪÿħÿ¦ÿħÿË­ÿáÅÿúß*ÿÿå.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿä-ÿÿä-ÿÿä.ÿÿæ/ÿÿç/ÿÿç/ÿÿæ/ÿÿä.ÿÿä.ÿþä-ÿþã-ÿþã-ÿþã-#ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþâ(ÿþå/ÿþû¨þÿeÒÿÿò^ÿçÒÿC; ÿ<4 ÿäË(ÿÿâ,ÿþâ-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþá ÿþé9ÿÿú©ÿÿþÌÿÿþrÿϾÿ1)ÿkkm”þþùþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþçþçþçþçþçþçþçþçþçþçþòþ³B().Ó&ÿ˜ÿ ˆÿE:ÿÿYNÿäÊÿ»¤ ÿ0)ÿ²ÿà ÿõÑÿíÊÿíÉÿòÑ ÿýâ+ÿþã.ÿþã-ÿþã.ÿýá*ÿûß%ÿùÜ ÿùÜ ÿøÛÿûÞ"ÿúÝ!ÿ÷ÙÿòÒÿíÍ ÿçÇÿà¿ÿÔµÿÉ«ÿĦÿÆ©ÿÞÂÿùß*ÿÿä.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿä-ÿÿä/ÿþã.ÿýâ,ÿùà+ÿõÛ'ÿóØ$ÿóØ%ÿõÛ'ÿùß*ÿüâ,ÿþä.ÿÿå/ÿþã-sÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã,ÿþã+ÿþíQÿþðdÿÿé;ÿþî*ÿ±¡ ÿÿ’€ÿûç.ÿÿå-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþâ,ÿþâ'ÿÿé@ÿÿùžþÿÎÿÿúmÿÿöEÿ¦•ÿÿƒƒ…uþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþáNOS¯ ÿ€mÿǪÿ¢‰ÿ=3ÿÿƒr ÿÀ©ÿ60ÿ ŒÿÚ½ ÿùÖÿíÉÿíÈÿòÒ ÿþã-ÿþã.ÿþã-ÿþã-ÿýâ+ÿýá*ÿþâ-ÿÿä.ÿþå/ÿÿæ2ÿÿæ3ÿÿæ0ÿþã,ÿüÞ#ÿ÷×ÿóÏÿêÇÿÕ¶ÿÇ©ÿÂ¥ÿͱÿðÕ#ÿÿæ/ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿä/ÿþä0ÿ÷Ü)ÿñÕ#ÿåÉÿØ»ÿÕ¸ ÿÕ¸ ÿÚ¾ÿäÈÿïÒ!ÿùÞ*ÿÿå/ÿþä-oÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþâ'ÿþâ)ÿþä,ÿÿî0ÿëÙ,ÿ.* ÿKB ÿóá-ÿÿç.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã.ÿþá&ÿþå-ÿÿõþÿæÿÿüÁÿÿù4ÿùè+ÿvhÿ÷BB=e””þÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþýþýþýþýþýþýþýþýþýþýþýþð‚ƒ„’ ÿ`Rÿ¿¢ÿ¹žÿ¥ÿI>ÿÿWN ÿ/*ÿ€p ÿ˲ ÿþÛÿíÉÿíÉÿòÒ ÿýâ,ÿþã/ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã.ÿþã.ÿþã.ÿÿä.ÿÿä.ÿýã+ÿøÚÿóÐÿçÅÿϱÿÁ¤ÿαÿðÔ"ÿÿç0ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþä.ÿô×!ÿÝÀ ÿÒ´ÿÊ«ÿƧÿŧÿÂ¥ÿÁ¤ÿÂ¥ÿÈ«ÿÓ· ÿêÎÿÿæ0kÿþä.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã,ÿþã,ÿþã-ÿÿæ.ÿøç.ÿqdÿ% ÿÕ¾%ÿÿç.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþâ,ÿþâ$ÿþñ^þÿÕþÿîÿÿù‰ÿÿñ(ÿ¾­ ÿ*$ÿþ(ãbaTRPOCþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþüþüþüþüþüþüþüþüþüþüþüþÿ°±±Q"ßOBÿ»Ÿÿ¹žÿȪÿ˜€ÿÿÿÿbVÿº ÿÿÚÿíÊÿíËÿòÓ ÿýã+ÿþä.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþä/ÿþã-ÿøØÿîÊÿÓ´ÿæÿÜÁÿùß*ÿÿä.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã.ÿüá*ÿõ×ÿîÎ ÿéÈÿçÆÿèÇÿãÃÿظÿÒ²ÿͯÿÆ©ÿÁ¥ÿÀ£ÿʬÿêÏÿöÜ(ÿÿæ/ÿÿã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿå-ÿýè-ÿ£’ÿÿ¬šÿýä-ÿÿä-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþâ+ÿþã)ÿþòhÿÿýºÿÿýšÿøìEÿ«™ÿOE ÿÿxwo£ÖÔÇÊȼþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþóþóþóþóþóþóþóþóþóþóþóþýþ¼<,-1Î:/ÿ±—ÿÅ©ÿ´™ÿp]ÿþÿþÿÿ$!ÿ‹y ÿ÷ÓÿïÌÿîËÿòÐ ÿýà)ÿÿä/ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿå1ÿûÝ!ÿëÊÿÛ¼ÿâÅÿ÷Ü(ÿÿä.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã.ÿýâ+ÿúÝ"ÿúÝ#ÿûà&ÿüá&ÿýâ&ÿýá&ÿûß"ÿ÷ØÿñÏÿëÈÿâÁÿÒ³ÿƨÿħÿɬÿáÅÿýã-ÿÿå/ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-dÿþã-ÿþã-ÿþã-ÿÿä-ÿÿê.ÿÀ°#ÿÿ“€ÿûà,ÿÿå-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã,ÿþç6ÿÿîEÿÿø<ÿɺ"ÿÿ ÿONEÃÓÓÉ7þÿýýûþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþëþëþëþëþëþëþëþëþêþçþèþîÌÌÍ8EEH½-%ÿ“}ÿ€mÿ,%ÿÿÿ!ÿ ÿÿSH ÿÞ¿ ÿóÐÿíÊÿðÎÿúÞ$ÿþä.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿä-ÿûÞ!ÿóÕÿöÚ#ÿýã.ÿÿä.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã,ÿþâ+ÿÿã/ÿÿä/ÿþä.ÿþä.ÿÿä/ÿÿä/ÿÿä.ÿüá'ÿ÷ØÿðÏÿèÆÿÕ¶ÿÆ©ÿÁ¤xÿÔ¸ ÿöÝ(ÿÿç0ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿä-ÿÿî/ÿÖÄ'ÿ+% ÿ‚sÿøà,ÿÿä-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿä-ÿÿç,ÿÿî,ÿÕÂ#ÿUKÿþÿ?>7ÉÌËÂ?þÿÿÿþÿÿþþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþùþùþùþùþùþúþúþúþüþßþÒþÛþ´‘889ÿþÿÿ ÿ &ÿV[RÿbyLÿl‡SÿRcBÿ ÿ ÿ¬˜ÿþÙÿíÊÿíËÿøÚÿþã.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿýá+ÿüà'ÿþâ*ÿÿä.ÿÿä.ÿþä-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿã.ÿÿå0ÿÿå/ÿùÚÿóÐÿåÂÿɪÿÁ¤ÿÙ¼ÿùß)ÿÿæ/xÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþä-ÿÿí/ÿêÕ*ÿ)$ÿwkÿøä-ÿÿã-ÿþã-ÿþã-ÿþâ-ÿþâ-ÿÿä-ÿÿï0ÿÿù2ÿüî0ÿ¼ª ÿ<3ÿ ønm`¡·¶¬TüûùþÿþþýþþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþúþúþúþúþúþûþûþûþÿþîþöþË+þN¼ ÿ563ÿ|}ÿ«²´ÿÉÍÒÿÝàâÿÎÞØÿ¾ÇÀÿ­²ªÿAH3ÿÿJ@ÿÿÝÿóÏÿíÉÿòÑ ÿýâ,ÿÿã.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã.ÿþã.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã.ÿÿä.ÿÿä.ÿøÙÿæÄÿÙº ÿéÍÿõÙ%ÿÿä.ÿÿä.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿë/ÿëÕ*ÿÿ…{ÿúè.ÿÿâ-ÿÿã-ÿÿâ-ÿÿè.ÿÿí/ÿÿë.ÿÒÀ&ÿŽ‚ÿICÿû@>8͉†}jííè öõòôóï ýýüþþýþþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþúþúþúþúþúþûþûþûþÿþúÉÉÊ'ffe897òtwrÿÃÇÂÿäéèÿâëîÿàçíÿÝãèÿÓáæÿŸ¤ÿu~hÿ^pMÿ,7&ÿÿÀªÿüÚ ÿïÌÿïÌÿúÝ!ÿÿå0ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿùÛÿñÒÿõÙ$ÿÿä/ÿÿä.ÿÿä.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿã-ÿÿé/ÿů$ÿÿ¢—ÿüè.ÿÿã-ÿÿì/ÿÿó0ÿþð/ÿæÕ*ÿ¡’ÿA9 ÿÿ ða`\¦½º°BÇĶòñîøøõóòîýýüþþýþþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþúþúþúþúþúþûþÿþÿþùþµSNONÄGHEùœ¢œÿáèãÿêðñÿÛßâÿÔÚÛÿÑÛÛÿÒÜÙÿÔÛÙÿ°»°ÿiƒhÿh†dÿXlNÿ!$ÿKB ÿáÆÿüÙÿïËÿôÕÿþã-ÿþã.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿýâ)ÿüà&ÿþã+hÿÿæ/ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿå.ÿøä.ÿ…vÿ&!ÿŵ#ÿÿì/ÿÿí0ÿïÞ,ÿ×É(ÿÿVOÿÿþ,ÿ ñyxtŽäãÛéèá½»¯ððì÷÷ôóòîýýüþþýþþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþúþúþúþúþûþöþÏþÖþ˜j;::Þ\^Zÿ·»´ÿàæáÿÝäâÿÕÚÚÿÕÙØÿÒÚÙÿÑØÚÿÒØÙÿÖÙÜÿÏ××ÿ—¨œÿfgÿkƒgÿ@J6ÿÿtgÿìÏÿûÖÿðÍÿùÜ!ÿþã.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã,ÿþä.lÿþä/ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿä-ÿÿè-ÿÜÊ(ÿ=6 ÿNFÿïá-ÿ÷á,ÿ½©"ÿg]ÿ;4 ÿÿ1*ÿ)"ÿþÿþ`¡þç$ÿÿþâáÚ¾»¯ðïì÷÷ôóòîýýüþþýþþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþúþúþúþúþüþñþ«þ{e++*âghdÿÏÓËÿãèáÿ×ÝÚÿÒÙØÿÓÙØÿÓØÙÿÒÙ×ÿÓØ×ÿÒÚÚÿÓÛÜÿ×ÜßÿÉÎÏÿŽŸ‘ÿx‘ƒÿ[m\ÿÿ ÿxj ÿêÊ ÿúÔÿòÒ ÿýâ+ÿþä/ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-xÿþä.ÿþä.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿæ-ÿüè-ÿ—‡ÿÿ§–ÿíÜ,ÿ}pÿ% ÿÿ5,ÿvdÿ¡‰ÿ@5ÿ++-Ô±±²Dþö$õõôáàØ¹·ªïïë÷÷ôóòîýýüþþýþþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþûþûþûþûþÿþûþzdþ=ÙijeÿÌÑÌÿäèçÿÔÚØÿÎØÕÿÐרÿÏØÙÿÐ×ÙÿÓÙ×ÿÓÛØÿÓÛÛÿÓÜÞÿÖÝÞÿÚààÿÆÒËÿš¯©ÿq‡ƒÿ;FEÿ ÿ&%ÿpÿèÈ ÿü×ÿúÜÿþä0ÿþä/ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-tÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿä-ÿÿì/ÿÕÃ'ÿ?8 ÿ>6 ÿ¤“ÿdYÿ ÿ.&ÿŒvÿ¹žÿĦÿq`ÿþ††ˆ~þåþð$ùùøïîëÜÛÕóóðööóóòîýýüþþýþþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþöþöþöþõççæÓÒÓ'BCAÙuytÿÕ×ÒÿßãâÿÕÚÜÿÏרÿÐ×ÖÿÒÖÕÿÏÖ×ÿÐØÙÿÒÚÙÿÒÛÛÿÒÚÞÿÓÛßÿÔÚÞÿÕÞÜÿÛáéÿµÃÁÿz‘‹ÿ=@@ÿ;99ÿ†‡Žÿ<=7ÿk] ÿÝ¿ÿüÚ ÿýß$ÿýä0ÿþä.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿê.ÿõâ-ÿylÿ ÿ4-ÿ)%ÿÿTGÿŸ†ÿÍ®ÿбÿsaÿÿEEHºþÛ%þÿþûþúþüþþÿúúùöõòóòîýýüþþýþþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþðþðþñþî\ááà [[\—moküÙÞØÿäéæÿ×ÛÙÿÔÙ×ÿÓØÙÿÕ×ÖÿÔ×ÕÿÒ×ÖÿÑÙÙÿÓÚÜÿÔÚÝÿÑÚÞÿÐÙÜÿÒØÜÿÒÛßÿ×ÞçÿºÄÄÿ‹ÿ'-/ÿQPOÿþÞÿ™šŸÿþ<ÿ[QÿÝÀÿÿâÿÿãÿÿä+ÿþã.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-lÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþâ-ÿÿé.ÿÿì/ÿ²¢ÿÿþ$ÿÿ ÿÿ¥ŒÿȪÿµšÿ˜ÿÿ #áþ¹Fþõþùþúþúþúþúþúööóóòîýýüþþýþþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþñþñþóþò\®®­Q(&%ï±²¬ÿèíçÿ×ÝÛÿÕÛÚÿÕÛÛÿרÚÿר×ÿÔÚ×ÿÕÚØÿÓÙÙÿÓØÛÿÕÙÜÿÑÙÛÿÏÖØÿÉÐÒÿÁÌÍÿÀÉÊÿ— šÿLVKÿÿKLKÿþÕÿþêÿ½½ÁÿMNSÿh]ÿŬÿòÔÿþç#ÿÿè.ÿÿã.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿí/ÿûæ.ÿ¯žÿC; ÿ ÿ78;ÿquwÿimnÿÿzfÿÌ­ÿ›„ÿXKÿ ûpprþéþñþûþüþüþüþüþüøøõõôïþþþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþóþôþïþÝ\!NMMÅTSNÿÒÕËÿßãÛÿÖÛ×ÿ×ÛÙÿÖÛÙÿÕÚØÿ×ÙÖÿÖÚÕÿÕÚÖÿÔÙØÿÑØØÿÑÖ×ÿÎÕÕÿËÕÔÿÇÍÏÿ¿ÈÈÿÉÐÔÿ¢­§ÿN_NÿÿEECÿþÒÿþôÿþùÿ€ÿÿ70ÿtg ÿįÿùã+ÿÿí0ÿÿä-ÿþâ-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþâ-ÿÿä-ÿÿî/ÿüé.ÿ£‘ÿ( ÿ../ÿ„†Œÿº¿ÂÿÛÞäÿÍÓÙÿ7=Hÿ-&ÿ˜ÿ€mÿ4-ÿ''#õ³³´HþÓþäþèþèþèþèþèþèææäääâêêèêêéêêéþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþöþ÷þó`Ÿ  \&'%ö•–ŒÿÚÞÖÿØÜÙÿ×ÚÕÿÖÙÖÿÓÚÙÿÔÛÖÿÖÚÔÿÕÙÔÿÔ×ÕÿÑÖÔÿÌÔÒÿÊÓÒÿËÔÕÿÌÖÕÿÓÙÙÿáéèÿðôûÿÝëéÿ™±¦ÿ  ÿ<:8ÿþÚüÿþôÿEEFÿ&(*ÿÿÿ4-ÿ†xÿÒ¾%ÿþë.ÿÿì/ÿÿå.ÿÿâ.ÿþâ-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþâ-ÿÿã-ÿÿì.ÿÿë.ÿæÑ(ÿ‹yÿ!ÿÿUcgÿÈÒÏÿäêëÿæèëÿâêõÿ˜ž£ÿ ÿ%ÿ0'ÿÿ]]\ñææçþíþèþçþçþçþçþçþçççèþèþçþçþçþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿö÷öþáþO\ÄORKÿÍÏÅÿÛßÛÿÖÚØÿÖØÕÿÔÙÖÿÔØØÿÔÙØÿÓÙÖÿÒ×ÓÿÑÔÒÿÌÒÏÿÈÒÎÿÊÒÕÿÍÕÙÿÓÙÙÿÒÙÚÿ°º·ÿœ¥¤ÿ” œÿo|zÿ ÿ<;;ÿþäüÿÒÑÒÿÿ[jgÿoxwÿJMLÿ"ÿ ÿ?6 ÿ«›ÿìÕ)ÿÿê/ÿÿî0ÿÿë/ÿÿç-ÿÿä-ÿÿã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿã-ÿÿä-ÿÿç-ÿÿê-ÿçÕ&ÿ®ÿ\Pÿÿ%/ÿ6MTÿIeiÿfz{ÿ‹™™ÿºÃ¿ÿØÝâÿÜàæÿTZ^ÿ ÿþÿþÿþ‚ðþùþþþüþüþüþüþüþüþüþüþüþüþüþüþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ`øùù‹ŒŒu&&$ùœž–ÿÝâÙÿ×Û×ÿÖØÕÿÖ×ÕÿÕ×ÔÿÖ×ÔÿÔÖ×ÿÒÔÔÿÏÓÍÿËÑÎÿÊÐÒÿËÑÓÿÍÒÕÿÍÔÖÿÑÜÚÿ›¤¢ÿ2<9ÿ,:;ÿ )(ÿ ÿþÿþVÿþðÿþüÿ††…ÿ "$ÿTk\ÿh…pÿ~›ÿt‹ÿTc]ÿ%ÿÿ@7 ÿ~rÿÀ°#ÿì×+ÿûé.ÿþï/ÿÿë/ÿÿç/ÿÿå-ÿÿã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿä-ÿÿæ.ÿÿé.ÿÿë/ÿúå/ÿóÞ1ÿ¼¬(ÿ]V ÿ98-ÿ ÿ(=IÿGeoÿEhnÿ>`iÿ9Taÿ8V\ÿPhiÿ{Š‹ÿ¿ÒÕÿÌÞáÿ‰Œÿ./1ÿÿþ8ñþæþÿþüþüþüþüþüþüþüþüþüþüþüþüþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþóþäþ7Xî;;8ÿÎÑÇÿÝáÛÿÖ×ÒÿÕØÓÿÕØÑÿÔ×ÐÿÒÖÒÿÒÔÒÿÏÒÏÿÉÒÍÿÊÐÎÿÍÐÐÿÌÑÐÿËÑÎÿÊÐÐÿÐØÔÿsysÿÿ1;9ÿ',)ÿÿþÿssrÿþöÿþóÿþ:ÿVX]ÿ¶ÂÁÿŽ›‹ÿ€{ÿ¥ ÿˆ›¨ÿtŒrÿ7FEÿÿÿÿ3+ÿ}pÿ¹« ÿáÐ(ÿ÷ã-ÿþè.ÿÿç.ÿÿå.ÿÿä.ÿÿä-ÿþä-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿã-ÿÿå.ÿÿç.ÿÿç-ÿÿê.ÿüö2ÿõç*ÿÛÉ-ÿ¤˜1ÿVO%ÿ99:ÿ‡Š–ÿ‹Ž–ÿÿ9QXÿJdtÿDalÿC`lÿE_gÿ@]fÿ8Wcÿ4RbÿHmwÿÀËËÿèêðÿÅÍÖÿ¡¬´ÿ5:9úþ{…þó þýþûþûþûþûþûþûþûþûþûþûþûþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿd¡¢¡ ”•”[!"øŒŒ„ÿßåØÿÛÝÔÿÕØÕÿÓÚÖÿÓÚÓÿ×ÕÑÿÕÓÒÿÒÒÏÿÎÐÎÿÌÐÏÿÍÓÒÿÍÔÐÿËÒÎÿÈÐÏÿÉÏÐÿÐ×Õÿ`g`ÿ ÿ,53ÿ',(ÿ ÿþÿ{{zÿþ÷ÿÔÓÓÿÿƒˆÿâèïÿÏ×Ùÿ¿ÈÆÿÅÏÎÿ²ºÀÿ‰ ˜ÿx‹„ÿgvvÿ>MOÿ$ ÿ ÿ ÿÿ=5ÿwhÿ³¢ÿÜÌ(ÿòß,ÿüé.ÿÿï/ÿÿí/ÿÿë/ÿÿè.ÿÿç.ÿÿæ.ÿÿä-ÿÿä-ÿÿä-ÿÿä-ÿÿå-ÿÿä-ÿÿä-ÿÿä-ÿÿä.ÿÿå.ÿÿç.ÿÿç-ÿÿç-ÿÿé.ÿÿî/ÿþð0ÿ÷æ-ÿëØ*ÿÒ¾&ÿ˜‰ÿj`ÿ1, ÿ**'ÿTV]ÿ´µ·ÿûûüÿ–••ÿ ÿ:U`ÿGfqÿB`mÿE_iÿEixÿ;nÿKo{ÿB`jÿ5RZÿt‚ÿËÐÒÿäìñÿÞåíÿ‘šœÿ&))óþµ?þîþíþìþìþìþìþìþìþìþìþìþìþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿlefeYZYg/1,ýÃżÿãèàÿØÙÑÿÖ×ÔÿÖÖÔÿÒÙÔÿÑØÒÿÒÔÏÿÏÑÏÿËÐÏÿËÑÍÿÎÔÒÿÌÒÐÿÊÑÐÿÎרÿÒÜÚÿØáÝÿOWQÿ ÿ043ÿ)-*ÿ ÿÿ~~}ÿþõÿ”•”ÿ#%%ÿ¦¬®ÿÙÞåÿÓÙÞÿÎÕÚÿËÕÑÿÖÚÜÿÌÒÕÿ¤²¦ÿ…“•ÿk„…ÿh‚rÿcweÿ;K3ÿ!ÿÿ ÿÿ81ÿ`Vÿ‘ƒÿ͹$ÿèÑ)ÿòß,ÿõå-ÿ÷ã-ÿøâ-ÿúä-ÿûé.ÿüì.ÿûí/Dÿûë/ÿûç-ÿûä-ÿûè.ÿûï0ÿúñ0ÿùë.ÿ÷ä-ÿïÛ+ÿíÕ*ÿÕÁ&ÿ©›ÿ~qÿVKÿ% ÿÿÿþÿ'(*ÿ¬¬«ÿþúÿþ÷Dÿedcÿ ÿ;X_ÿGfnÿCdkÿ@_gÿJ}šÿy§Áÿ]xÿD^fÿF`iÿZgÿDbdÿ™ª£ÿ×ÜÙÿÞèíÿ§´ºÿGIIↅ…<þ¬þÀþÁþÁþÁþÁþÁþÁþÁþÁþÁþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿd-.,-.,YDE@ÿËÌÂÿßâÛÿÓÚÖÿÒØÓÿÒÖÓÿÑÔÕÿÒÔÓÿÐÔÑÿÊÑÎÿÆÎËÿÎ×Òÿ«²®ÿTYZÿ29:ÿ=FEÿIPMÿT_Xÿ")$ÿÿ285ÿ',&ÿ ÿþÿ€ÿäååÿHGGÿUYZÿÂÍËÿÕÞßÿÐØÚÿËÔ×ÿËÒÑÿÌÔÎÿÏØØÿÏØÛÿÆÑÑÿ·ÅÁÿ¥³®ÿ ÿ‚•‘ÿ}Œÿtˆrÿdw_ÿMW?ÿ;B?ÿ/65ÿ)/+ÿ ++ÿ%("ÿ-,ÿ83ÿC=ÿKCÿYNÿ_U<ÿaXÿdXÿi_ÿkbÿdYÿ_TÿYOÿTLÿNFÿ@8 ÿ-(ÿÿÿÿÿþÿþÿÿÿþÿþ+ÿþ¥ÿþóÿþßÿþ*DÿAGNÿ‹¢¬ÿPrÿ=^kÿC`kÿYpwÿ_w~ÿMisÿD`jÿHdlÿCalÿ<\bÿq†„ÿ§³¯ÿÛäæÿËÚßÿPUUøþ…jþäþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿdu[^WÿÍÓÈÿØÞÙÿÔØÕÿÓØÔÿÑ×ÔÿÑÕÔÿÒÕÑÿÐÔÓÿÊÐÒÿÉÎÎÿÐÕÒÿ|~ÿÿ !ÿ/98ÿ*33ÿ,31ÿ)40ÿ./0ÿ/20ÿ ÿÿþ ÿŽÿþ¾ÿþÿ8A=ÿanfÿ’š˜ÿÅÌÌÿÑÙØÿËÐÑÿÇÑÍÿËÓÐÿÍÕØÿÑØÙÿÓÚÝÿÒÙÛÿÊÓÕÿÁÆÉÿ²·´ÿš¦šÿ†œ‹ÿÿ|…€ÿt†‡ÿwŒ„ÿ‘‰ÿx‰…ÿo}mÿ`ghÿVWbÿGR^ÿ8CEÿ2;>ÿ(34ÿ .+ÿ$(ÿÿ -3ÿ.ÿÿþÿþÿþÿþ(ÿÿÿÿÿÿ ÿ!*1ÿ-9@ÿÿ)('ÿþ¨Xÿóóôÿ´´³ÿ ÿ)ÿhqÿ†œ§ÿD]eÿBZeÿ@[dÿ=ZbÿD_gÿH_jÿFbkÿHdmÿB`lÿ?\bÿKebÿ¬¶²ÿæîõÿ–šÿKLLÈÆÅÅ8þÿþúþúþúþúþúþúþúþúþúþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþþX¯rumÿÎÔÌÿÑØÓÿÓÖÐÿÐ×ÓÿÏ×ÐÿÐÖÑÿÑÖÐÿÐÓÒÿËÎÐÿÊÒÎÿÊÒÐÿillÿÿ&0*ÿ154ÿ-./ÿ/-,ÿ-10ÿ-0/ÿ0/)ÿÿþÿþÿ™ššÿyxxÿÿ%;:ÿ/0ÿ**ÿ‰“—ÿÏÜáÿÈÐÓÿÄÏÎÿÆÒÑÿÉÕÖÿËÕÖÿÍÔØÿÍÕ×ÿÏ×ÚÿÐÙßÿÒÜáÿÓÝãÿÊÕßÿ¿ÊÊÿ¶ÆÁÿ­¿Èÿ«¸¼ÿª²µÿ¡¬¯ÿ”§¢ÿŠž¡ÿ‰“ƒÿƒ’‰ÿ‚ˆÿ|’Šÿ{ŽˆÿsŒÿj€„ÿayŠÿe{~ÿ0=Aÿÿþ4ÿÿÿÿÿÿÿÿ>C>ÿ~ƒÿx‹•ÿ\wtÿ( ÿÿþ ÿþùTÿ„‚ÿÿ§ÿ­ ÿ“– ÿe‚…ÿG^hÿAYeÿD]dÿF]dÿG]fÿF^hÿDaiÿGbnÿ=[fÿ4U[ÿcqjÿÕÚáÿÉÑÙÿ7;=ÿqqp“þåþßþáþáþáþáþáþáþáþáþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿP¿a`UÿÄËÁÿÌ×ÐÿÐÓÐÿÐÓÐÿÎÕÏÿËÕÒÿÐÔÏÿÐÒÐÿÉÎÍÿÐÖÐÿÈÑËÿVYYÿÿ.=5ÿ/<8ÿ/42ÿ.1/ÿþ1 ÿ.44ÿ,22ÿÿþÿþÿþÿ<=<ÿÿ)1/ÿ(01ÿ +-ÿŽÿÇÕ×ÿÃÍÎÿÆÌÊÿÇÏÏÿÇÑ×ÿÈÓ×ÿÈÔÕÿÈÔØÿÇÕÙÿÈÕØÿÈÔÚÿËÖÛÿÍ×ÛÿÎ×ÜÿÑØÞÿÓÙÝÿÑØÜÿÏÙàÿÒÕÜÿÍÔÙÿÇÑÒÿÁÉÇÿºÄ¿ÿ®´­ÿ˜¨©ÿˆ˜•Tÿ…•‹ÿz–‹ÿ—ÿ^rpÿ$#ÿ ÿ ÿ  ÿÿÿÿ!ÿ:EAÿ‚ŽÿÏØÝÿÖßëÿ{ŒœÿYmgÿ ÿ ÿ¢¢£ÿþýTÿTXTÿÿ»ÿÄ ÿÁ¼ºÿ˜¯­ÿTjnÿ@W_ÿH\bÿE]eÿF_eÿE\iÿD]fÿE]eÿD^fÿ@\dÿF[]ÿ©²²ÿÛäçÿ]bdÿBDCÂþ´1þýþýþüþüþüþüþüþüþüþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþþ\Ï@B>ÿÃÉÀÿÐ×ÓÿÑÑÍÿÎÓÐÿÌÔÏÿËÔÑÿÌÒÒÿËÒÒÿÆÏÐÿÑÖÓÿÈÐÇÿNSPÿÿ3<6ÿ0B9ÿ2;6ÿ394ÿ5::ÿ1=Cÿ(<>ÿ!ÿÿþÿþqÿþÿÿ-30ÿ&(&ÿ-46ÿ–¡¤ÿÌÙÜÿÃÊÊÿÃÎÌÿÄÒÓÿÇÑÓÿÉÒÔÿÉÓÖÿÈÓÖÿÆÒÔÿÆÑÔÿÈÑÖÿÏØÛÿÓÜàÿÍ×ÚÿÊÔ×ÿÎÖÛÿÏÙÚÿÏÚÞÿÓÙßÿÒÛßÿÖÚãÿÔÞáÿÓÝßÿÌÚØÿÊÔ×ÿÆËÏÿÃÊÎÿÁÌÌÿÎ×Õÿ…››ÿ;TVÿ4HNÿ5KQÿ6LMÿ6LQÿ6LOÿ?WUÿƒ‘‘ÿËÓ×ÿÜìïÿßéìÿÍÑÚÿg…uÿVqVÿ$1!ÿÿ«©«ÿòòðÿ-0/ÿÿ¹ÿÁÿÉÄÀÿœ±¯ÿVmqÿ@Z`ÿF^cÿE^gÿG^d,ÿE]fÿD]eÿD[fÿE\eÿC\bÿ?W_ÿrƒ„ÿÞãåÿ’–™ÿ)++ðœœaþÿþýþýþýþýþýþýþýþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿd ÎFGAÿÈÅÀÿÒÕ×ÿÎÓÏÿÎÓÍÿÌÔÎÿÊÓÍÿÊÒÎÿËÒÐÿËÑÐÿÊÑÍÿÎÖÑÿ‡ŽŒÿ$(&ÿÿÿÿ%,.ÿ3?Dÿ1ADÿ0B:ÿ%ÿÿþÿ@??ÿþÿ&0+ÿ-;7ÿ"-(ÿ5?Aÿ¦°³ÿÔÝáÿÀÊÌÿÅÍÏÿÆÑÒÿÉÒÒÿÊÓÕÿÊÒÖÿÊÒÔÿÊÔÔÿÍÕ×ÿÃÐØÿ°ÄÆÿ¶ÃÄÿÊÓÕÿËÖØÿÉÒÙÿÊÕÙÿËÖØÿËÔßÿÊÔÚÿÎÔÙÿÎØÝÿÏÚÜÿÌÙ×ÿÌÖÜÿÍØÜÿÎÙÝÿÑØÝÿáçìÿ’šÿ>Z`ÿE`fÿGahÿDakÿ9Y`ÿi}ÿ±°¶ÿÏÇÐÿÁ¾ÆÿÉÉÒÿØÞçÿÍØÝÿuŽ|ÿ[r^ÿ","ÿÿ°®¯ÿÞáàÿÿŒÿÄÿÄTTÿ¿Â¿ÿZuwÿE^cÿC[dÿE]`ÿE[fÿE]e,ÿC_fÿE]fÿE\fÿC]eÿA\gÿ=T^ÿUllÿÎÕÕÿµ»¾ÿ145ÿssr“þéþÚþÚþÚþÚþÚþÚþÚþÚþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿd Ð0/+ÿ³µ¬ÿÔ×ÓÿËÔÏÿÏÓÏÿÏÓÏÿÎÑÍÿËÑÐÿÉÓÑÿÌÓÓÿËÑÑÿËÓÐÿÄËÊÿ™—ÿ`jiÿQWWÿFLNÿ&*3ÿ+-,ÿ6D9ÿ5D8ÿ#,#ÿ  ÿþÿþ ÿþÿÿ ÿÿ;CDÿ±¾Àÿ×ãáÿÃÌËÿÅÏÐÿÈÐÔÿÇÒÒÿÇÑÒÿÍÕÕÿÙâàÿÚæéÿ³ÂÅÿhxyÿ 1.ÿ(4/ÿ‹—”ÿÌ×ÙÿÊÔ×ÿÈÒÖÿÊÓÖÿÈÔØÿËÕØÿÕáäÿÚçìÿÒßâÿÎØÛÿÍØáÿÈÓÙÿÉÔÖÿËÕÛÿÕáæÿi€†ÿ7U\ÿC_hÿC]eÿ4T^ÿQjnÿª¦ÿ\Rÿ¯ÿ§ÿ§ÿ¶y{ÿËØáÿ—©¥ÿixkÿÿÿ­­®ÿÆÊÉÿÿ¹ ÿÎCCÿȽÿ¦µ³ÿH`fÿ:U[ÿ:W^ÿDbeÿA`bÿ=V],ÿ7Q[ÿC[dÿC\cÿIefÿRmoÿEbgÿAZ^ÿºÄÃÿ¸¿Áÿ9:<ÿfgf þÓþËþËþËþËþËþËþËþËþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿŸÿ“ŒÿÉÒÉÿËÑÌÿÊÑÏÿÈÒÏÿÉÑÍÿÈÐÍÿÈÒÐÿÌÒÐÿÌÒÓÿÉÏÐÿÈÎÊÿÀÊÆÿ·ÁÀÿ¶½½ÿ•£Ÿÿ'.#ÿÿ4;6ÿ9:5ÿ684ÿ*/,ÿÿ ÿHPNÿ^fdÿOVTÿCHFÿ•–ÿÌÖÔÿÌÕÑÿÈÏÈÿËÐÌÿÈÑÐÿÇÏÑÿËÖÔÿ»ÇÅÿ€‹ŒÿENOÿ$-,ÿ!!ÿ)'ÿÿ@DBÿ®´¸ÿÏØÜÿÇÎÏÿÎÕÙÿÏÛÞÿ¿ÊËÿŠ™˜ÿXa`ÿ@JHÿIQPÿ§±¯ÿÌ×ÙÿÇÓÓÿÎÕÙÿÎÕÜÿVquÿ;UZÿ@[aÿW[ÿ‰•’ÿº¿¸ÿ¯ ÿÆÿÆÿÇÿÇÿÊÿ¦$ÿ—›–ÿyŽzÿ)C+ÿÿ¤¡¢ÿ’““ÿ/78ÿy‘’ÿKefÿAX_ÿhvuÿ¥«¥ÿ½£™ÿÏ\SÿÕ7/ÿÍ3,ÿÔP>ÿÑ“~ÿw‚…ÿH^eÿ`swÿlƒÿq„ŠÿG^eÿšÿÙßÞÿWY[ÿRRT¬þäþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ r9h4d  ÿRQNÿÁÄ»ÿÎÔÐÿËÒÌÿÊÒÎÿÈÒÏÿÆÐÌÿÆÍÍÿÇÎËÿÂÒÉÿ½ÓÉÿ½ÑÅÿÁÎÅÿÄËÅÿÈÏËÿ”‹ÿÿ!ÿ/=4ÿ2<7ÿ3@9ÿ)6.ÿÿJQTÿ´ÁÃÿ½ËÆÿÁÊÆÿÇÑÌÿÈÐÎÿÉÏÍÿÌÐÎÿÌÐÎÿËÐÊÿÍÒÎÿÅÎËÿ\cdÿ ÿ$#ÿ#7:ÿ$#ÿ ÿÿghiÿ·¾½ÿÇÒÓÿÄÍÑÿ·ÃÅÿcqtÿ$20ÿ ÿÿ+55ÿ$-,ÿÿuzwÿÆÎÓÿÉÒÖÿÊÕÖÿ³ÂÉÿLhoÿ[aÿ>Y\ÿyŒŒÿ¬®¨ÿ¹ ÿÇÿÆÿÅÿÆÿÊÿ¡$ÿƒ‰ÿx†pÿ1B*ÿ  ÿ„„ÿprrÿ,3ÿ3OWÿTdeÿ“ÿÀÀ½ÿÓµ­ÿÂQLÿÆÿÏÿÌÿÊÿÃÿª•ÿ]x}ÿY`ÿ9U]ÿ‚Ž’ÿÕÝáÿlqtÿ??=Ñþu @klkklkklkklkklkklkklkklkþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿT-èf/Ýd5P<‡ úƒƒuÿÒØÏÿÍÓÏÿÊÑÍÿÉÒËÿÊÐÍÿÊÏÎÿÃÏÉÿ¾ÑÁÿÆÑÊÿÎÑÔÿËÐÎÿÊÏËÿÒÖÔÿ‘‰ÿ ÿÿþÿ#"ÿ-+)ÿ ÿ!ÿ ª¦ÿ¿ÉÊÿ½ÆÇÿ¿ÈÊÿÃËÌÿÈÏÒÿÊÐÎÿÉÐÉÿÄÐÌÿÅÍÇÿÁÍÈÿÏØÛÿŒ•–ÿ ÿ ÿ ÿ<=<ÿ› ŸÿÌ×ÒÿÉÒÎÿÃËÈÿÇÏÑÿÆÓÕÿ`mjÿ ÿ-75ÿ,35ÿÿÿ&)&ÿª³·ÿÌÑÔÿÃÏÏÿÃÐÎÿÎÔÕÿµ¾ÂÿRhiÿ=\_ÿ@^bÿB]^ÿh{}ÿ«¾¸ÿ @6ÿÂÿÉÿÈÿÇÿÇÿ·=8ÿ²Éµÿ|‡qÿÿ ÿFDEÿBDFÿptrÿÄÁ¼ÿÝßÛÿÓÙØÿý¶Dÿ³;3ÿÁ ÿÇÿÄÿÇÿÈÿÍÿ±MIÿy…†ÿBZ_ÿAU[ÿBZbÿ8R\ÿ€’ÿÓÛàÿmqsÿ452ÜþaJþ]þ]þ]þ]þ]þ]þ]þ]þÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ-ãe.åf.ÁX  ×IAAÿ¸º®ÿÌÓÍÿËÏËÿÊÐÉÿÊÎËÿÍÎÍÿÆÐÆÿÂϾÿÅÏÇÿÊÑÐÿÌÐÎÿËÏÌÿÐÔÑÿ«­§ÿPN@ÿ96)ÿ;>;ÿ10/ÿ(&%ÿÿkpnÿ½ÉÇÿ¿ÇÇÿÁÈÈÿÂËÉÿÇÎÎÿÊÒÍÿÉÏÈÿÈÍÅÿÇÊÈÿÄÊÆÿÃËÆÿÇÑÏÿ¿ÊÌÿƒ‰ŠÿTcmÿt‡’ÿ³¼¸ÿÉÑÏÿÀÈÍÿÁÉËÿÃÉÊÿÆÌÎÿÍÖÛÿu€‚ÿ ÿ ÿ ÿÿVZ\ÿ‹‘’ÿÊÓÕÿÂËÍÿÆËÌÿÈÎËÿÎÔØÿ¹ÃÉÿSjnÿB\b4ÿC[bÿ>W[ÿD]bÿ˜«ªÿ¦qdÿª ÿÅÿÁÿÆ ÿÃ;8ÿ¾‰ÿ·Ä½ÿTYUÿþÿþ `ÿÿGIIÿÔÏÌÿáÛÛÿÓÒÒÿÐÕÔÿ¿¶¯ÿ®,)ÿÁÿÅÿÂÿÆÿÅÿÌÿ¹OJÿ}‹Šÿ>\`ÿVWÿ>W]ÿBYbÿB\\ÿB\[ÿEZ_ÿB\]ÿ?Z\ÿ?UZÿ:QSÿE_^ÿ›•ÿÀ¢„ÿÅR8ÿÝ$ÿ_ÿ.ÿ™3ÿÌÿ¿O ÿÃùÿÌÓÏÿÎÏÉÿÄÃÀÿ­¸¯ÿ‘ —ÿ•†ÿŸ•‹ÿ²µ±ÿ“¥¤ÿOadÿ:OUÿ@X[ÿ@XWÿ=PQÿhpsÿÃÌÈÿjrmÿ553éµµ´[þÿþúþúþúþúþúþúþúþúþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ  4  §'$"ÿ†‰ÿÇÍÅÿËÐÌÿÊÎÊÿËÏÌÿËÏÌÿËÏÌÿËÏÌÿÊÎËÿÊÎËÿËÏÌÿËÏÌÿÊÎËÿËÏÌÿËÏÌÿËÏÌÿÊÏÊÿÈÎÊÿÉÍÊÿÉÎÊÿÍÒÏÿÐÔÑÿ®±°ÿ\^_ÿ;:/ÿ54$ÿ''$ÿ/05ÿ]^aÿ›žœÿ·º¸ÿÄÈÆÿÌÐÎÿÏÒÏÿÍÑÎÿËÏÌÿËÏÌÿËÏÌÿËÏÌÿËÏÌÿËÏÌÿËÏÌÿËÏÌÿËÏÌÿËÏÌÿËÏÌÿËÏÌÿËÏÌÿÊÎËÿÉÎËÿËÏÌÿËÏÌÿÊÎÍÿËÔÔÿšªªÿJbeÿ>TYÿGZ_ÿEZYÿEZYÿEY_ÿD[[ÿB[YÿAVYÿW[ÿ>W]ÿA?ÿRQQ¦éèæþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ    *e: þ™*,%ÿ…‰ÿÈÏÉÿÔÙÕÿÍÐÎÿËÏÌÿËÏÌÿËÏÌÿÊÎËÿÊÎËÿËÏÌÿËÏÌÿËÏÌÿËÏÌÿËÏÌÿËÏÌÿÉÎÊÿÈÏÊÿÌÐÍÿÏÓÐÿÁÅÄÿƒ†‹ÿ69BÿaXÿŠy ÿ˜… ÿ‡sÿPFÿÿ"+ÿFIRÿjovÿ•—ÿ±µ´ÿÈÌËÿÔØÕÿÖÚ×ÿÓ×ÔÿÑÕÒÿÏÓÐÿÎÒÏÿÎÒÏÿÍÑÎÿÍÑÎÿÍÑÎÿÌÑÍÿÌÐÍÿËÏÌÿÉÎÊÿÈÎÊÿËÐÌÿÍÑÎÿÊÏÍÿÇÍÍÿ»ÃÆÿi~‚ÿ9RRÿDYXÿEZ[ÿEY^ÿDZ\ÿCZXÿCY\ÿAX]xÿ>SVÿJ_`ÿŽŽ‹ÿÎ)ÿÈ ÿÇÿË#ÿÎBÿÌÿÆÿ°ÿ™“ŽÿÊÓÎÿÒØÓÿÒ×ÓÿÑÖÑÿ›§¦ÿo‚‡ÿOekÿ1KQÿ;QUÿ=WVÿ?WZÿYZÿ=VZÿ?TYÿG[^ÿ•˜ÿÆÐÒÿs|{ÿBCAÆ¿¿½7þÿ$úúùúúùúúùúúùúúùúúùúúùúúùúúùþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ '_7 þC !¾üOQNÿ¢›ÿ¿ÄÀÿÉÍÊÿËÏÌÿËÏÌÿËÏÌÿËÏÌÿÉÍÊÿÉÍÊÿËÏÌÿÊÏËÿÊÏÌÿÈÌÊÿ–š™ÿ8:5ÿVM ÿÕ»ÿüØÿóÏÿîËÿíÊÿíÊÿñÍÿùÕÿõÒÿñÎÿìÉÿ×·ÿ¦ÿ_Sÿ% ÿ ÿÿ ÿþ ÿþÿ898ÿ[]Yÿjmiÿuwtÿy|zÿ}}ÿ|~|ÿ~€~ÿ‰‹‰ÿ‰‹ˆÿ}€}ÿ|~~ÿ•›ÿ»ÄÄÿÉÒÔÿ”£¦ÿ]qsÿBWWÿ@[_ÿC\]ÿAZZÿH_aÿRegÿN__ÿTRÿ8OPÿ9PPÿ@XVÿAXWÿ>X^ÿ?W^ÿBXZÿ;PVÿ^lnÿ‰“ÿ¿ÈÉÿ£¬®ÿ132ó§§¥Zþÿ(÷÷öøø÷øø÷øø÷øø÷øø÷øø÷øø÷øø÷øø÷þÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ '_7 egg_^^‡þ ÿOQNÿ¦©¦ÿÐÔÑÿÒÖÓÿÍÑÎÿËÏÌÿËÏÌÿËÏÌÿËÏÌÿÊÏÌÿÈÎÌÿ´»¹ÿPSSÿ" ÿ³žÿðÐÿîËÿíÊ<ÿíÊÿíÊÿíÊÿíÊÿíÉÿîÊÿñÎÿñÎÿïËÿðÏ ÿäÊÿÀ¬%ÿ~ÿVJ ÿÿþÿþÿÿÿ ÿ ÿÿÿ ÿ ÿ ÿ ÿÿ ÿ"$(ÿ•›œÿÉÐÐÿ¿ÆÆÿ©²³ÿOc^ÿ>W_ÿE[^ÿ=TRÿVhjÿ€“ÿ‹™ÿbt{ÿI_cÿ²¾·ÿ°³­ÿ¡h^ÿ¤>!ÿ§' ÿ¹.'HÿÔÆÂÿ±·²ÿeuqÿC\Xÿ=VTÿ?XVÿ@YWÿ>VTÿCWWÿAX\ÿ=Y[ÿAY\ÿ9QSÿGYZÿ’˜™ÿÃÆÃÿÂÊÌÿ\bbÿþB0ÇÔÔÓøø÷ôôóôôóôôóôôóôôóôôóôôóôôóôôóôôóþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ '_7 hiiqppnnlŒ&&%òÿKMJÿz|yÿ¬¯¬ÿÈËÉÿ×Ú×ÿ×ÛØÿØÜÙÿ×ÜÙÿ×ÝÚÿÒÛÚÿš¢¢ÿ/0.ÿcXÿؽÿïÌÿíÊÿíÊÿíÊÿíÊÿíÉÿíÊÿòÒÿö×ÿøÙÿ÷ÙÿöØÿôÔÿïÏÿçÐ$ÿÓÆ(ÿ¶¯#ÿš“ÿƒxÿocÿdYÿbWÿdXÿdXÿ]Sÿ_VÿYPÿ>7ÿ,&ÿJB ÿ`VÿXPÿ40ÿdhiÿ²¹»ÿÆÎÏÿ¾ÅÅÿx……ÿWUÿ@YWÿ@YWÿ@YWÿ>UTÿBVXÿAYYÿ=Y^ÿ>X^ÿ;ÿainÿ¶ÀÀÿÉÑÑÿ¸»¼ÿfxxÿ@ZWÿXVÿ@YWÿ@YWÿ@YWÿ>WWÿ=TWÿ@WWÿ@YYÿ=X_ÿ2MUÿestÿ¬³¶ÿÃËÐÿ±»½ÿNRRÿA?>ÅþÌ0'åæåããâããâããâããâããâããâããâããâããâããâããâþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ( '_7 þfuut¹¹¸þØËÌÌJ¬«©¨§¤‘JIJÓ ÿ('(ÿ ÿ ÿ ÿ ÿ ÿÿÿäÉÿñÎÿíÊÿíÊÿíÊÿíÊÿíÊÿøÚÿÿä/ÿþä.ÿþã-ÿþã-ÿþã-ÿþã-ÿÿä/ÿÿå0ÿÿã.ÿþâ-ÿþá-ÿþá-ÿÿã-ÿÿæ-ÿÿì/ÿÿð0ÿÿî/ÿÿë.ÿÿæ.ÿÿæ.ÿÿë/ÿÿõ1ÿÿø2ÿÿð0ÿÿç/ÿÿç1ÿÿï-ÿ‘‚ÿ,-ÿnvxÿ²»¶ÿÍÑÍÿ¹¿ÀÿVqmÿ6QNÿWVÿ@YWÿ@YWÿ@YWÿ@YWÿ@YWÿ>VUÿ?VYÿ?WYÿ?TYÿ4MOÿBTSÿ¨®°ÿÎÚÝÿŒ—˜ÿQTQÿ"!é·¶µJþþþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ( '_7 þfuut¹¹¸þÐûûüþÿþÿ ……„’ÿ20 ÿcUÿl\ÿl\ÿqa ÿYN ÿþÿOEÿéÉÿïÌÿíÊÿíÊÿíÊÿíÊÿôÔÿÿä.ÿþã.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþâ-ÿþâ-ÿþã-ÿþã-ÿÿä-ÿÿã-ÿþâ-ÿþá-ÿþã6ÿþê_ÿÿî€ÿÿò`ÿñâ3ÿ{qÿ..$ÿHMLÿ”ÿ¸ÀÀÿ‘¦¥ÿevvÿO_aÿVXÿ?YWÿ@YWÿ@YWÿ@YWÿ@YWÿ@YWÿ@YWÿ@YWÿ@YWÿ@YWÿ@YWÿ@XWÿ?VTÿ>STÿ@TU$ÿK\\ÿeonÿ”˜–ÿ¹ÀÁÿŠ•”ÿLPNê@?>ÍŒpííîþùþþþýþýþýþýþýþýþýþýþýþýþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ4 '_7 ddennm»»ºþÔþûþ÷þÿþ“‰þÿ#ÿ¢‹ÿ·œÿµšÿ¼ ÿ‡sÿÿ¯—ÿóÏÿíÊÿíÊÿíÊÿíÉÿîÌÿüá)ÿÿä.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-8ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã,ÿþæ@ÿÿô§ÿÿþøÿÿùÖÿÿñPÿöá(ÿdYÿþ|ÿ ÿ9CBÿ–­³ÿÅÑÔÿ®¸¶ÿ|ŒŠÿPc_ÿ:PRÿ:QVÿ?YVÿ?WUÿ>VTÿ?XVÿ?YWÿ?YWÿ?XVÿ?XVÿ?XVÿ?XVÿ>WUÿ=UTÿ7PSÿFVUÿoztÿ®´°ÿÇÎÎÿÂÎÉÿbdbÿ31/Ûš™™_ææçþèþåþöþþþýþýþýþýþýþýþýþýþýþýþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ '_7 üþiþþðþöþøþ÷þÿ±±²‚&&%ÿ(!ÿ‡ÿ®”ÿ¬“ÿ³™ÿ€mÿÿ̰ÿóÏÿíÊÿíÊÿíÊÿìÉÿñÐ ÿþâ,ÿþã.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã,ÿþã1ÿþëhÿÿúÓÿÿüêÿÿê_ÿÿè(ÿ‡yÿÿÿ ÿD\eÿ”©«ÿ¾ËÉÿÅÏÎÿ¯¶±ÿ„ŽÿgwwÿbusÿTjhÿD\ZÿB[Yÿ@YWÿAZX8ÿC\ZÿC\YÿB[YÿD\ZÿE][ÿF][ÿZwÿ ¨¨ÿÄËÆÿÉÐËÿ¢¨¨ÿ^`]ÿECAÁª¨§Qþïþèþßþäþ÷þþþýþýþýþýþýþýþýþýþýþýþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ    %^5 üþ?Ÿ  þñþýþÿþþþýþýþÿááâ7þTÆÿ˜‚ÿ­”ÿ¬“ÿ²˜ÿˆuÿÿȬ ÿòÎÿíÊÿíÊÿíÊÿìÉÿòÒ ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã,ÿþä7ÿþðŽÿÿüåÿÿíoÿÿé+ÿ¿«!ÿtgÿÿF:ÿÿ1?Dÿy„ÿ¥®«ÿ¾ÄÄÿÈÎÍÿÄÉÆÿÀÅÃÿº¿¼ÿ ª¦ÿ|Œ‰ÿfyvÿp€}ÿ‡–’ÿ}Š4ÿ|Œ‰ÿ›˜ÿ¤®«ÿ®·´ÿ¿ÈÅÿÆÍÉÿ·¿ºÿrywÿ;=>ùLKJ‰‡…6´³±ööôþåþßþäþ÷þþþýþýþýþýþýþýþýþýþýþýþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþþþþ  .c=(üþ„þÿþúþøþöþúþýþüþüùùúwxy˜ÿ†rÿ«’ÿ¬“ÿ°–ÿ™ƒÿ% ÿ‹yÿíÊÿîËÿíÊÿíÊÿìÉÿñÏ ÿýâ*ÿþã.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã,ÿþã,ÿþèTÿÿùÑÿÿî„ÿÿò5ÿɺ$ÿ}oÿÿI?ÿD:ÿÿÿFMLÿ}„‚ÿª°®ÿÃÈÅÿÈÍÉÿÈÍÉÿÆËÇÿÄÉÅÿÂÇÄÿÃÈÅ<ÿÅÊÆÿÁÇÃÿÁÆÂÿ¿ÄÀÿÂÇÃÿÈÍÈÿ¼Â½ÿ\ecÿÿñzxxŠÓÓÒ'®¬«²±¯óóòþåþßþäþ÷þþþýþýþýþýþýþýþýþýþýþýþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿŽŽŽŽŽŽŽŽŽ“‘Žþþ–þžþþþ—þÄþôþîþîþû€þÿvdÿ«’ÿ­”ÿ®•ÿ¤ŒÿC9ÿ3-ÿèÈ ÿñÍÿíÊÿíÊÿíÉÿðÎÿýá*ÿþã.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã+ÿþä6ÿÿñ›ÿþì~ÿÿû;ÿ´®!ÿSJÿÿK?ÿxÿŠuÿJ@ÿ#! ÿ! ÿÿ9:9ÿ„‡ÿ~ƒ†ÿ‚‡ŠÿŽ’“ÿ”—”ÿ’•’ÿŠŽ‹ÿx{xÿjljÿGHFÿ?A@ÿ@CAÿ+.,þþð ͤ¥¥Uïïîííì°¯®°¯®óóòþåþßþäþ÷þþþýþýþýþýþýþýþýþýþýþýþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþ™þ™þ™þ™þ™™˜™þšþšþ˜þ•þ•þ•þ”þšþÝþîþìþû€þÿfXÿ©ÿ­”ÿ­”ÿ«’ÿ~lÿ0)ÿ©“ÿõÒÿïËÿíÊÿíÊÿîÌÿøÚÿþã.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-xÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã,ÿþã.ÿþçMÿþåMÿÿþ6ÿš—ÿ ÿ ÿŒyÿÒ´ÿÛ»ÿΰÿÁ¤ÿ±—ÿ”~ÿk[ÿKAÿH?ÿF> ÿ/* ÿÿ*+,ÿYZYûþ/¼YYXºOOMÃTSSÀ\]\¿þzþÈ*_`` ª««þùþï ®­¬°¯®óóòþåþßþäþ÷þþþýþýþýþýþýþýþýþýþýþýþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþ—þ—þ—þ—þ—þ—þ—þ—þ—þ—þ—þ—þ—þÊÊÉþúþîþþ„„…þÿVIÿ§ÿ­”ÿ¬“ÿ­”ÿ¨ÿo_ÿ<4ÿ´œÿïÍÿîËÿíÊÿíÊÿðÎÿüà(ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-4ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã.ÿÿä0ÿÿñ0ÿ~uÿþ4ÿÿÆ« ÿà¿ÿÞ¾ÿß¿ÿß¿ÿß¿ÿß¾ÿܼÿ×·ÿظÿË­ÿbTÿþÿUUWÕþü wñòòóôóááßþé óòòþûþùŠ‹‹¢££öö÷ïï¬°¯®óóòþåþßþäþ÷þþþýþýþýþýþýþýþýþýþýþýþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþ—þ—þ—þ—þ—þ—þ—þ—þ—þ—þ—þ—þ—þŽÈÈÇþÿþðþÿ……†þÿOBÿ§Žÿ®”ÿ¬“ÿ¬“ÿ®•ÿ—ÿ4,ÿk^ÿåÅ ÿòÍÿîÊÿíÊÿïÌÿùÜ!ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-4ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã,ÿÿæ-ÿÿç.ÿqdÿþ4ÿ1*ÿÓµÿß¿ÿܼÿܼÿܼÿݼÿݼÿÞ½ÿÞ¾ÿãÂÿË®ÿSGÿþÿ__` þÿþÿþüããáþëþôþûþõþ„¢££öö÷ïï¬°¯®óóòþåþßþäþ÷þþþýþýþýþýþýþýþýþýþýþýþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþþþþþþþþþþþþþŽþ–ããâþÿõõôþÿ††‡‹þÿ=4ÿ£Šÿ®”ÿ¬“ÿ¬“ÿ­”ÿª‘ÿ}kÿ.(ÿl`ÿßÁÿðÍÿîËÿíÊÿðÏÿûÞ$ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-4ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿê.ÿæÎ)ÿXNÿþ8ÿhXÿÖ·ÿÞ¾ÿܼÿܼÿܼÿܼÿܼÿܼÿܼÿãÂÿ«“ÿ/(ÿÿþƒŽþÿþÿþüááßþéþòþúþôþ„¢££öö÷ïï¬°¯®óóòþåþßþäþ÷þþþýþýþýþýþýþýþýþýþýþýþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ8ÊÉÉÊÉÉÊÉÉÊÉÉÊÉÉÊÉÉÊÉÉÊÉÉÊÉÉÊÉÉÊÉÉÊÉÉÇÆÆáààþÿÿÿý÷÷öþþ†‡‡þÿ("ÿœ…ÿ®”ÿ¬“ÿ¬“ÿ­“ÿ¯–ÿ©ÿqaÿ-'ÿSJ ÿÓ¸ÿóÑÿðÍÿîÊÿïÍÿøÚÿþâ,ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-pÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿÿç.ÿöá,ÿžÿ70ÿ)#ÿ©ÿܼÿݽÿܼÿܼÿܼÿܼÿܼÿܼÿݽÿáÀÿnÿÿ"ÿþ­„þÿþýýýüááàþéþòþúþôþ„¢££öö÷ïï¬°¯®óóòþåþßþäþ÷þþþýþýþýþýþýþýþýþýþýþýþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ@ýüûýüûýüûýüûýüûýüûýüûýüûýüûýüûýüûýüûýüûúùøòòð÷÷ô þüþÿþŒ‹þÿÿ™ƒÿ®”ÿ¬“ÿ¬“ÿ­”ÿ¯–ÿ®•ÿ§ÿwfÿ-'ÿYPÿ»§ÿãÉ ÿóÐÿöÓÿóÐÿøÚÿþâ+ÿþä-ÿÿä.ÿÿä.ÿþã.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-hÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþâ-ÿÿæ-ÿÿù1ÿÁ±#ÿ6/ ÿ@7ÿ‡tÿÒ³ÿݽÿܼÿܼÿܼÿܼÿܼÿܼÿܼÿß¿ÿѳÿ\OÿþÿGGHÿþÕzþÿþýþþþôþêþñþúþôþ„¢££öö÷ïï¬°¯®óóòþåþßþäþ÷þþþýþýþýþýþýþýþýþýþýþýþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþ·þ·þ·þ·þ·þ·þ·þ·þ·þ·þ·þ·þ·þ·þ´þÞþþþûþ‚þÿÿš„ÿ®•ÿ¬“ÿ¬“ÿ­“ÿ¯–ÿ¬“ÿ­”ÿ©‘ÿŽzÿA7ÿ)$ÿ93 ÿ‹{ÿ½¨ÿغ ÿõÔ ÿùØÿ÷ØÿùÛ ÿüß&ÿþâ+ÿÿä.ÿÿä.ÿþã.ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-ÿþã-lÿþã-ÿþã-ÿþâ-ÿþâ-ÿÿä-ÿÿå-ÿÿç-ÿÿñ0ÿÿï/ÿÝÒ*ÿWNÿC:ÿ…ÿϰÿÛ»ÿܼÿܼÿܼÿܼÿܼÿܼÿܼÿܼÿãÂÿ¶›ÿ8/ÿÿþ{žþõ þÿþþþþþÿþøþñþùþôþ„¢££öö÷ïï¬°¯®óóòþåþßþäþ÷þþþýþýþýþýþýþýþýþýþýþýþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþ²þ²þ²þ²þ²þ²þ²þ²þ²þ²þ²þ²þ²þ±þ³þåþñþÝ__`«þÿÿžˆÿ®•ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ­”ÿ¯–ÿ›„ÿn^ÿQEÿ("ÿÿ:4 ÿª—ÿàÄÿøÜÿÿäÿÿÞ ÿÿÞÿÿáÿþâ ÿþã)ÿþã.ÿþá-ÿÿâ-ÿÿä-ÿÿå-ÿÿä-pÿþã-ÿÿå.ÿÿì/ÿÿï/ÿÿé.ÿÿå-ÿöÜ,ÿ¾°#ÿŒ~ÿG> ÿ^Pÿ¦ŽÿÓµÿÞ¾ÿܼÿܼÿܼÿܼÿܼÿܼÿܼÿܼÿÛ»ÿ×·ÿ‹wÿ ÿ$$'ÿ²³³ƒþÿþüþüþüþüþýþôþùþôþ„¢££öö÷ïï¬°¯®óóòþåþßþäþ÷þþþýþýþýþýþýþýþýþýþýþýþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþ®þ®þ®þ®þ®þ®þ®þ®þ®þ®þ®þ®þ®þ­þ°þæþÑþ¼/þNÇþÿ%ÿ¢‹ÿ®•ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ±—ÿ®•ÿ§ŽÿƒpÿUHÿ'!ÿ61 ÿTKÿocÿƒuÿ™† ÿ´ ÿζÿéÏÿûæ+ÿÿö2ÿÿü2ÿÿù2ÿÿð0ÿÿæ-ÿÿê.dÿÿô1ÿþï0ÿïÛ+ÿâÐ*ÿʵ%ÿ“„ÿeZÿA9 ÿ<3ÿXKÿ¦ŽÿÍ®ÿÚºÿܼÿܼÿܼÿܼÿܼÿܼÿܼÿܼÿݽÿÙ¹ÿ²˜ÿ_QÿþÿIIKÿþØþÿþüþüþüþüþüþüþûþóþ| ¡¡þ÷ïï¬°¯®óóòþåþßþäþ÷þþþýþýþýþýþýþýþýþýþýþýþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÙþÙþÙþÙþÙþÙþÙþÙþÙþÙþÙþÙþÙþÙþÚþñþØþ²?þDÚþÿ-'ÿ¤Œÿ®•ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ­“ÿ®”ÿ°–ÿ©‘ÿ{ÿSGÿ(!ÿ ÿÿ ÿ$ ÿ@9ÿYPÿpdÿƒzÿ˜“ÿ°¨!ÿÅ´$ÿÁ«#ÿœ‹hÿ‹ÿ“‚ÿviÿ\RÿD> ÿ-(ÿ*$ÿ\Nÿ†rÿ¦ŽÿŨÿ×·ÿܼÿܼÿܼÿܼÿܼÿܼÿܼÿܼÿܼÿÞ¾ÿÓ´ÿsaÿ/(ÿ ÿþÏþô?þÿþþþþþþþþþþþþþþþúþ¿±²²þôïï¬°¯®óóòþåþßþäþ÷þþþýþýþýþýþýþýþýþýþýþýþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÐI889åþdÿ5.ÿ¥Œÿ®•ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ®”ÿ±—ÿ£Œÿzÿxfÿ\Nÿ?5ÿ& ÿ ÿÿþÿþ|ÿ ÿ& ÿ>6 ÿ<5 ÿÿ ÿ% ÿ3,ÿ5-ÿMAÿtbÿ’}ÿ¨ÿ°–ÿ±˜ÿвÿݾÿܼÿܼÿܼÿܼÿܼÿܼÿܼÿܼÿܼÿàÀÿƪÿ.'ÿÿ779ÿþÄþÿþÿþþþþþþþþþþþþþþþÿþÿÙÚÚþîïï¬°¯®óóòþåþßþäþ÷þþþýþýþýþýþýþýþýþýþýþýþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþüþüþüþüþüþüþüþüþüþüþüþüþüþüþüþüþÿþÂp334ÿþÿ=5ÿ£Šÿ®”ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ¬“ÿ®•ÿ±—ÿ´™ÿ°–ÿ£‹ÿ{ÿ{iÿl\ÿdUÿZKÿNBÿI>ÿH=ÿNBÿ\OhÿhXÿraÿ„qÿzÿ¦Žÿ²˜ÿ°–ÿ¯•ÿ­”ÿ¶›ÿÖ¶ÿݽÿܼÿܼÿܼÿܼÿܼÿܼÿܼÿܼÿܼÿâÁÿ®•ÿÿÿppqÑþñAþÿþþþþþþþþþþþþþþþþþþþÿþîóôôîîí¯­¬°¯®óóòþåþßþäþ÷þþþýþýþýþýþýþýþýþýþýþýþýþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþôþôþôþôþôþôþôþôþôþôþôþôþôþôþôþõþúž…##$ÿþðPDð£Œð­”ð¬“ð¬“ð¬“ð¬“ð¬“ð¬“ð¬“ð¬“ð¬“ð¬“ð¬“ð¬“ð¬“ð¬“ð¬“ð¬“ð¬“ð­“ð¯•ð±—ð´™ð¶›ð·ð³˜ð¨ð¡‰ð ‰ð©ð³™\ð¯•ð­”ð²˜ð±—ð®•ð¬“ð­”ð­“ð®”ð¾¢ðÙ¹ðݽðܼðܼðܼðܼðܼðܼðܼðܼðݽðáÀð†sðþð##$ÿþ®yþÿþÿþþþþþþþþþþþþþþþþþþþþþÿþüíí쯭¬°¯®óóòþåþßþäþ÷þþþýþýþýþýþýþýþýþýþýþýþýþÿþÿþÿþÿþÿþÿþÿpygame-1.9.1release/lib/pygame_icon.svg0000644000175000017500000003600311201212700020010 0ustar vincentvincent image/svg+xml pygame-1.9.1release/lib/pygame_icon.icns0000644000175000017500000015057307416131205020173 0ustar vincentvincenticnsÑ{ics#Hüüü?ü?þ?þþü?øüü?üüðàüüü?ü?þ?þþü?øüü?üüðàis32š‚Ìü0‰ ñ¹ÿÅäjòÄþ`‚J‚€ KÉ\I˿ɖ¨†¿mÅËDZ€ËAžÆ ‹‚ At÷üññ©=>ÿÏÀÿÿàÿÿðÿÿðÿÿøÿÿøÿÿøÿÿøÿÿüÿÿüÿÿüÿÿüÿÿüÿÿüÿÿøÿÿðÿÿàÿÿàÿÿà?ÿÿð?ÿÿðÿÿðÿÿðÿÿðÿÿàÿÿàÿÿ€ÿþÿüÿü>ÿÏÀÿÿàÿÿðÿÿðÿÿøÿÿøÿÿøÿÿøÿÿüÿÿüÿÿüÿÿüÿÿüÿÿüÿÿøÿÿðÿÿàÿÿàÿÿà?ÿÿð?ÿÿðÿÿðÿÿðÿÿðÿÿàÿÿàÿÿ€ÿþÿüÿüil32£‡TBWB†±ÜÜß&‡‡T;K8<—5ÐÑçéæ;ÿªf_­ŒHÍÌdß—¦ãpNÿÌ;§Õäàaw‰¥µÇõ€ÿ ñÔèàåÑÌ‘ac­ç䧈MÍV‚ÿ EêãÒËaûÿÿìªíF‡ÉËÓù‚ÿªìãÌ©üÿ—åЇGÊ‘ƒÿÙîãÉj‚ÿü·èx…{ÍÊ}ƒÿÌîâÎσÿuä_…lÊʪ€ÿä°RäßÙæƒÿ‚âP„jÍÊÊæ¾ÿÿÓ”ÃãÑÕÕ(€ÿéÚãÉ„DÉÊÊÞZÿûÀŠKkp³Œ(€ÿ‘åããsƒy€Êâß3ÂÛáä€ãëËJÛÿÿö¬€ãYƒ`ËÊÒÐÏä†ãíBž®ãƒ4ÌÊäËäˆãîTç㨄 ¾uÐÞã׸Îä…ãûA€ãç•„ -yTÑãâåâÄ€ãɰŀãåÛãâý2„b/FÀà€ãÝä€ã ääÃÌããé¨âìP¿ƒjÕÚ¯,Ñ‹ãßÙi„xà×ÚÛd[â‰ãä#–Þ€ã柪¼¼SÿŒÂ_“ i-49r—¼¼¿&‡‡T 8—$ ./.ÿª_W£Œ8câ™-FÿÌ( *-o‰¥÷€ÿ ó(P%(_Z „ * .,/*€- --+.+-)È„c ''€-".--,.---."-/¯ƒjÐÚ£‡-,-+„xÝÖÛÝaG"Š-ª„ oÕÔÒÔLñ7.†-+³}6„sØÒÎÑ1iÕ¦B"--./,éh˜iÕªƒÔÑÐ-0*ÈÔØº£†eU<ÈzdjvVƒÒÎÏ9< #ÍÒÝzØÛÜãg‹’?o¡bcg|ƒ>¼ÍÇËÇÎÍ*u½"lÍ` JR¾@`¥„$ÈÅÌÄÆÐÈÊÒḬ̀Ëч‰C{ÉQZ…zÌËËÊ»KºÑÎÍÊÏX[YеY^C†!²ÓÀ  ÃY”Œ€VVXÆÌ‡„‚-,¬ ©V\¡`ˆÿƒ-}T§ª‚*ÌŒ „- €lŒª€)€-ÿŒÂ„‚%‡l8mkmóùúÍÿÿÿÿÿõPu”ÿÿÿÿÿÿÿþ‰Êÿÿÿÿþ>"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿH>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇ`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿö¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýgÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿä3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥sÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ GÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿî ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿKÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿóich#HüþÿxÿÃþÿÿÿ€ÿÿÿ€ÿÿÿÀ?ÿÿÿÀ?ÿÿÿÀÿÿÿàÿÿÿàÿÿÿÿàÿÿÿÿàÿÿÿÿàÿÿÿÿðÿÿÿÿðÿÿÿÿøÿÿÿÿøÿÿÿÿøÿÿÿÿøÿÿÿÿøÿÿÿÿøÿÿÿÿøÿÿÿÿøÿÿÿÿðÿÿÿÿàÿÿÿÿÀÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿ€ÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀÿÿÿÿ€ÿÿÿ€?ÿÿþ?ÿÿü?ÿÿð?ÿÿÀ?ÿÿ€?ÿÿ€?ÿÿ€üþÿxÿÃþÿÿÿ€ÿÿÿ€ÿÿÿÀ?ÿÿÿÀ?ÿÿÿÀÿÿÿàÿÿÿàÿÿÿÿàÿÿÿÿàÿÿÿÿàÿÿÿÿðÿÿÿÿðÿÿÿÿøÿÿÿÿøÿÿÿÿøÿÿÿÿøÿÿÿÿøÿÿÿÿøÿÿÿÿøÿÿÿÿøÿÿÿÿðÿÿÿÿàÿÿÿÿÀÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿ€ÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀÿÿÿÿ€ÿÿÿ€?ÿÿþ?ÿÿü?ÿÿð?ÿÿÀ?ÿÿ€?ÿÿ€?ÿÿ€ih32Œªt$-¥ ›lÌóõûñ£/¿¢˜Dðîüü€ÿ÷1U„ªž/^´“Ì‹ïù¢,··$Øÿÿf9×€ ¥0¶÷÷þ÷˜Ö‘JñõQ¹ÿ€Åþÿäxˆk^ºòöÝÅâþÿùZ]›ÕÿJþÿþþýòïíÝ/zÂsOýþÿV޶7ôòK„ÿ ê€þÿþ÷îíâuÿþ"ÿþïX8øñgù…ÿÿþþòíú]ƒÿóxþþ\zðùY†ÿvÿþþîñY…ÿEÿþÐŒ†Ûíõœ†ÿ¯ÿþÿîö~…ÿö²ÿÿ‚Šjðì丆ÿÁÿþÿíÆí†ÿJÿÿWŠXÿíì鸆ÿƒÿþýð‹‡ÿÿÿB‰ˆ ííìö…‚ÿ Q«þ&ÿþùöm‡ÿ,ÿÿ:‰M÷€íÿOÿäÑþþôóqÿ»£òƒÿvÿþ½¸‡¿›íüƒìÿ 1?ÿþþîð‘þ%‚ÿ¼íÿþÿ:‡Kçí÷÷"ÿ õÓ~c~¨âñöÕÚ‚ÿEÿþþÿ`‡-öíõþ猚LÂÝòùüñéÕˆ_1£¡óÿÜŸþÚŽ†KóíþÿÃXØ÷ö…þ€ÿvDáÿ7ÿý€þø_† 7õîííõù&ÿíøÿŠþÿÿãÌ?ÿƒþH† éîííþpÝîúþÿïB\ÿ„þa† ¯<õíîóvïïÿþÿBýƒþÿz‡@ôïCýí€þúæïý‹þÿ+ö‚þÿl‡„5+Ê+ôïþýùìàÕÆì‚þÿûùƒþór‚þÿ'ˆ ¹)/þðþÿûçÎÿþÝÈÂÈôþÿKÿ€þÿß&ˆC€ÞïƒþóÿƒþÿüèÃö€þÿ€øþþÿÕˆˆ@Çב0óüŒþøîÿþyûÿâI[ÿ‡•‰ÝÒÔ—@°ð’þÿF÷;-]ˆÊÕÒÕzaký‘þy.TÐ ˆ Æ=×ÖÕÒÎÀMŽÛ~ïþÏD SFˆ]ÍÖÔÒÈаoÒo«ÿÿ‰þÿÿ…fÉTÿ‡qVÛÓÔÌËÍ ¹ϼxwò…ÿ ÷µ1´PGEGtÞAˆ$…ÓÑÍÌNs µKÐÍÍvXP›¡Žr'ô?HbK@¿‚ˆ% ÓÐÍÊ&.-‰%‰ÆÉÍÑÊ­¥Š‚wa{ù\“AFD4Ïo‡%‡ÎÊËÎ1$-¦ÂÉÊȶÉËÎÌÎáE>±É¡"Þ¨¿CEEA’1‡%KËÉÉÇ»]1-IËËÈH ˾P(ÊÉ@•ÁŨ'ž†U¹¿]mU‡%ÒÇÈÀÉM%&›¿ËÇÈ0ÁÈ&fį@ÆÆ¢,N—ÒÊ̲E^l‡%"iÈÆÈËÄ»¯ÄÊÇÄùÃÃËE›ÄÅÇvH³°T UÓÂÊÄÄ=iDˆÊÆÊËÈȰ°ÎËËÊÉËÊËËÎBB>5ŸÒ‘Å̃ iAŒ+‰#*ÎËÊËËÉ̓ŠlÎÓÎÍÌÉÌÇ9EC>®Ç̤қ@=8±{Š![ÐÌËÈ9ðííîïÒV "¿G=‹~¡¹‹=>?9ÃNŒ ˆ[@<‡kŽ·‡Ñíîÿ†þ ÿd"ÅP<>??>FºbÖ.«™¼íñ‡þ ÿÉ1}ÆÆÃÁÂ\9‘-¨¬aïíˆþ Œ^ÝÈšˆ;BX¶’.£¬“lîõ‡þXŸ€Ü«•.𬮩)¤õù‚þÿÿÝ€Üß8ו£€¬ ­ŒDBy¶Ø×ȇKۀܴ–£‚¬ ®°…dIUr¦¯¶ÜZmŒŒªr$-¥ •]±ÏÑßÖ•-¿¢ ˜;ÍËãçôêãã+U„ªž/[±“ÌxËÞ“-¹¸#Äãå[8×€ ¥+ÒÕæâ‰Ö‘GÎÔN¹ÿ‚µäçÈi{`RŸÎ×ǺÏèäëP]™¶Í„„ÿJëïããâÐÌÈÃ)|ÃuEìäÿM޶/ÐÕL„ÿ ëréìãÙËÊÌuÿþ ëìßV7ÓÎ\ù…ÿêããÐËÝ_ƒÿólâçQlÌàW†ÿv÷ããËÍN…ÿFíãÁŒ†ºÊã†ÿ°ôãäÉÙ…ÿö äZÍÉÒ¹†ÿÀþãäÊ«í†ÿAåçWŠXÞÊÉÕ¹†ÿƒõãàÍz‡ÿéæ=‰ˆ‰ÊÊÉ߇‚ÿ Q«þ#çãÛÓ`‡ÿ%åã3‰FÓ€ÊëMÿäÑŽâäÓÑeÿ»£òƒÿjä㬸‡¿„Êàuìÿ 1<ñãâË΂þ%‚ÿ¾Ùããö8‡NÆÊØã"ÿ öÔXs–ÊØÐ¾Ü‚ÿEëããåV‡)ÓÊÖãÕšI~§ÇÕàáÛÛÊ{V2¤¡óÿÝãËŽ†AÎ€Ê Éäê³O¾Ô×ãä„ãëôjDáÿ4éâ€ãæ]† .ÑËÊÊ×ä!áÉÛäŠãêõãÌ8ï‚ãçA† ÇËÊÉãe¿ËÝŽãà>SèƒãèU† ¬4ÒÊÊåfËÌäŽãæþ:êƒãõk‡ @ÐË<ÙËâããàÉÔäŠãçÿ%ßãàÿ\‡„,%¯%ÐÍãâÜÎÁµ©Ñƒãáà‚ãôàeãñû!ˆ ž"*ÛÎãäßűåãÀ©¥«ÚãæBçããâÿÏ&ˆCm ¿ÌäãäÕäãâääáÆ§Ý€ãätàãã䈈AÎà˜*ÐߌãÚÑäãlèêÐCZÿ‡•ŒäÚØ¨J›ÍŒãä‚ãè>á4&]ˆ ÊרÖÚÚÞ‘`]ß‘ãl)G± ˆ Æ;ÜÚÚØÖÊZŽÛnØäãæ»E¥F<ˆ]ÏØØ×Ò׺|Ñx›îæŠãêw%zÐZÿ‡qWÝÚÓÐÒÓ ¹×Å‹$hßîèä ç鿣,µQfihåFˆ$…ÚÔÒÖU} µN×Ô×¢ŒjF•€f#ôAfye]Ç‹ˆ%¥ÖÖÑÒ0-0‰;“ÏÕÕÛÕ¿¯žy†(ù–Y]aUÕo‡%†ÓÓÑÖ A$;°ËÒÒÓÃÒÕÔÙØç`]°É³,áÂ[\]\ 4‡%LÑÑÐÐÅe;5N‡ÔÏÑP'ÓË[1ÔÐZ¢q;Ÿ‘j}jn‘W‡%#ØÒÎÒÎL**¦ÇÑÏÑ%3ÇÓ+iн^žk/QÏhXrq‡%UiÑÐÍÏÈÀ´ÌÐÍËÍÌÌËÓM£ËÍÒŠ_°¡f VÖÄSwIˆ ÑÎÏÐÎε´ÓÏ€ÎÐÎÏÏÕ[]YNŸI7žÌfkzY–,‰#,ÔÏÎÏÏÎцy]"•Ò×ÒÑÑÎÐÍRYZS[RاXWS¸{ŠXÔÐÏÎ:ЀÊË»J $Æ]T™h.–VVXQÆRŒ ˆ[@=CgÊÊÙääáíæáÞÙÜÄ›°TpPnpWYUU‘ˆhŽœs³Ê̆ãíùY'ÑcUVYXWVÁdÖ.’ƒ¢Êχã ùº+„ÊËÈÇÇe9‘-“TÌËâ†ã å†R½«„u=BU¶’.Š“~`ËׇãN‡€¼“•.„“”‘$’ÔÛ‚ãäìÒ…€¼¿/וŒ€“ ”x<;k¥ÑÁ¹zBm»€¼š–Š‚“ •–rU>HaŽ•›¼NmŒŒªj!,‡¥ $"¿¢ "/1/--U„ª‘)P¥?“½ 3¿¼&%--5Í€ › +- Ö‘( 8½ÿˆ --* !&/-ZW‘„ÿG.ˆ/-*ŒÆƒ.$´Ž¶X„ÿ ëcp-!~ÿþ0A6X$ú…ÿ#-,- iƒÿô,-"K†ÿw2--…ÿT0-$Œˆ,§†ÿ´/-/…ÿö-/~Š(¿†ÿÂ2-/ñ†ÿ-.JŠZ*»†ÿ‡1-(‡ÿ..(‰ˆ€-Œ‚ÿ Q«þ..‡ÿ-- ‰%€0AÿäÓ-.ÿ»£òƒÿ --¸‡¿'íÿ 1-0--þ%‚ÿÃ)--03‡T-,ÿ ùÙ *ß‚ÿK/€-‡ -)’Ÿ2 #$""3§¡óÿß-%‹‡./#//ƒ-..0Fáÿ1.,-U‹- 0Š-/0äÎ0‚-.†€,"Ž-,.„- † ¨..Ž-2†.‚-,` ‡ @ ,-.,!‹-8à‚-Ɉ„.,! ‚-.+*-,|#-l{ˆ /--..#.- '€- ,. .--$î$&ˆF .‚-.-+./'(-,€-#ˆˆ>Ñâ‰&Œ-.-./)Rÿ‡•‡âÙÛœ6Œ-.ƒ- , ]ˆ ÊÒÚÕÙÞÜ‹d $‘-ˆ Æ8ÙÙÖÚ×ËMŽÝ &Ž-.#K¨„ˆ]ÅÕØÓÎÙ·zÒw0Œ-/{Ñ^ÿ‡qQÔÓÐÏÎÒ ¸ÙÇ„ ,/.€- .-.-! ·Rqxs‚íFˆ$~ÖÔÏÑUvµPÚÑÚ›‚\ôDs€pjÄŽˆ%ÐÑÑÐ*./‰:—ÑÖ×àßȲ¡ˆ„ŠŒ ù eei[Ým‡%ÏÍÐÑD$7³ÍÒÔØÄÙÛÙ×Üìff¶Ò­"à¿defg 5‡%HÌÍÏÐÁZ5/N„ÑËÑQ%×ÎZ/ÕØaŸm%Ÿjs]r•Y‡%ÒÎËÈÌC((¦ÈÏÊÑ%2ÅÔ*iÓÃd`RœÊa_xt‡%.cÇÊÅÌĽ±ËÎÇÄËÒÉÌÖO¢ËÎДe¤–bZÒ¾ˆUyJˆÈÆÍËÌÌÍË˳³ÏÌÍËÌ΀ÌÔ_\YP•{Ç\f{W–+‰#%ÏÌËÌÌÊÏ‹ +—ÐÔÏÎÍÊÍÍR]XVSKÓ¦^VW¸{ŠX ÑÍÌÌ0" (Æ^R^'‘TT[SÃRŒ ˆWA9A./'/--,+,#œ°QvRknUWXX’‡hކ-sÖ%Ô_VTWVUU¿bÖ+ †- ,Ñ$‚ÇÇÅÃÃc9‘-,†- >>BU¶’.€‡-•. -.-/*ƒ×•ƒ  )&%ƒ–’oŒh8mk óó÷ôs.ÿÿÿÿÿÿÿÈCÿÿÿÿÿÿÿÿÿþ dô¯U#ÿÿÿÿÿÿÿÿÿÿÿÿ¿fþÿÿÿÿÿÿý×ÿÿÿÿÿÿÿÿÿÿÿÿÿþéàùÿÿÿÿÿÿÿÿÿþWiÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛ:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿã½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿä<ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝ ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~Kÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿã6ÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿNÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾Æÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿê`eÅÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑit32cz¨ªÝ¿ª­À°”œ°ÀÏáÌìªÑ™[($ -=M§ê¸S3)Fq†’”q]G4IØçªÃ4"D…Áèõñïõúúøñãϧ^2šÖäª'L¶ãïúøñïðôúþÿüéŸ(FÅâ Æ“#8Ðüóñðíïôûþ…ÿúÃc$˜•ªÌ¼ËÕÔmf¿ߎD¾÷ðíîîðüÿþüý‚ÿþ€ÿï›1=U‘ªØÎžB&8K^j†´Ü™ªº ׎OËóðííðõÿõÕ°¥¬¼ÑêùþÿþþÿÿüÊV.wܶٸvJ"*<>5$Kp›ÕÌ·$UÓøïíïòþòÍ[#$ 0n½òÿÿþþÿýî˜ fÊ_ª‰Ý™),\q“ÑÙÕÌ»§f=G£Õµ%Ì5JÍùïíïùýÒs,n¢·Äȧh$qØÿÿþþÿÿíf(O¦×†³¥K @g¶èñ÷ü÷÷ýþýû÷å¸y?A«Ö´¡)·öðîîýÛ¨0 kÚúû€ÿýüÓkAÃÿþÿî’:U±ÓÜÌ‹ÏÔÌ‘94‹èó÷ñòóù…ÿþ÷â~!$Xв ¿\„óñîîÿÖGD¸÷†ÿø©$8öÿþÿúÞ¹g!:NT=/36Íñøóîñ÷ý„ÿþþ€ÿô¶@2¿¯ Ím?îôíîüá<[­êŠÿÜnBÜÿÿ€þÿÿüìÕ¾»º²Š’¢¿áòòðíôÿøà¼†¡ÅêûÿþÿÿÚ°I,½® Ù[+}ÿîíúñ\NÖÿÎjñÿƒþüƒÿýùûþøïìñÿüÏ}H.*5?<LóˆÿÞTƒ ’ÿrÈÿÿþüòîíóúÅÀÿüÉyHDf“äÿ}8Ž÷ÿþÿßkºÉ™Æ1ªö†íìôÿü–¶ˆÿô„‚*·Éyùÿ‚þ ÷îîíóûØ'µÿ¾@€oä‹ÿéRRÄúÿþÿÿ›mƒ™¿BWßó†íìñüÿÚ-XìˆÿÓZ€ÞP.Õÿÿ‚þ ôîîíðøí5¦þv‚%¬‹ÿ¼2{íýÿþÿÿºw™­4|íï‡íïûÿñT)׈ÿ ù( QÔã`ö‚ÿ þþöîîíîôôD›ô_ƒ’ûŠÿ¢(”ÿ„þÿËhÔ—»h%«ù‰íùÿü©‹ûˆÿ ó¼‚y Ýÿ˜#Àùúýÿ øñïîñøp„ëbƒ‹úŠÿp/Ãÿÿƒþÿâ.B¸—ªK:Òüìˆí÷ÿÿîW"Ò‡ÿþúðãÓı~+;‹„~ƒ‹¨ÄÙêîñ÷÷ö÷þ­aÚ‚‚¦ŠÿþEaóÿ„þÿõ…;{—ª7kôôì‡íìõ€ÿÔ?2Ù‚ÿ#ñÖ¼–kQH>7:>COXVjtneNA=DIFa‚¤¹à×D±ÞO€ tçŠÿÁB¯ÿÿ„þÿüäna¿–›)¤ÿ‰í6ìôÿþÿÿÐCYÔþ÷ИM45Hh‚‘¥»ÎßåèïõúùôïãÚÕÑĬ`MHEHNÙÛ‘REm›èŠÿæJ~øÿ†þÿÿ¦Z‡•ªs2ÃÿìˆíìöÿþþÿÿÚ@E}k6J}©×óøúþŽÿúäñŽc37„µËÞôúŠÿû‘ Àÿÿ‡þÿÂU••ØY<Ñüˆíìðúÿþÿ Q*\ßúÿþú÷ú€üþÿÿþþÿƒþ…ÿ ûÍ–V01^¯ýþŠÿÊ'Fïÿýý†þÿØR€• ÔHKÚ÷îííîîƒíîøþþÿÿýÃh)X‚½òÿ÷òóöúýÿÿþÿÿþƒÿï¹v:+]ŽáˆÿÛM ½ÿÿýý†þÿðc_¸”Í@Zãó‚îƒíõþ€ÿóŽ*–ç÷þùîñøüþÿÿ–þÿûÕƒ'#C”ä…ÿåWžüÿ‰þÿÿ†F‡”¥=Våöí€îƒíïýÿÿøÊp+S°ûûòîîôüÿÿœþ€ÿöÊO1X§øÿúÓe'ŠúÿŠþÿÿ¤>£”†87Ðþí€îƒíõÿÿù<Ëÿþïíîôüÿÿ þ‚ÿ ÛoUÎù÷Ìw(?ÐÿÿŒþÿÈH„”®O¨ÿð€î‚íîüÿÿÒ 1Õÿñîíñöý¦þÿ °&Š)RëÿÿþÿÚVxÆ“ÌiôõíîîíìðþÿÿŸôøîíï÷ü¨þ€ÿ àa>?>`ªÿÿŽþÿå]kÌ”¦-¾üïîî‚í òÿÿËAxùúíîíôýÿªþ ÿÿî“{ôÿÿþÿóec¿”×Y^ãýîƒí öýëm'ëüíîîïüÿ¬þÿÿý±69¼ñÿþÿùm\·•¯- o×õðí îýóu5vÿðîîïøÿÿ®þÿþ¿B2“ýÿþ€ÿz:r–Ã6@Ìúî€í ðýµOÞôîîíõ±þ€ÿöp$šüÿŒþ€ÿ‡Cw–¶wOË÷îííðõt'‡øïîîñüÿƒþ€ÿýý‚ÿ¢þÿÿù{Ëÿÿ‹þ€ÿ€QÀ—¤?¿ôðíðáCX°ýîîíõ„þ ÿúðèææëòùýÿÿ¡þ€ÿÝ+Píÿ‹þÿÿölUÚ—›7/¥ïõòÇ*ŒÎùííïø‚þÿþ÷ØÉÆÄÂÁÆÏÝîüÿ þ€ÿü—Ÿüÿ‰þ€ÿåOZÜ—¹kDm"êÿ´&¯Üôîíðû‚þû÷éÞÜÕÎÊÈÄÂÄËáúÿ‹þ†ÿŠþÿÿçC<äÿ‰þ€ÿÏ1iª˜­&&˜ EYä»0²àõííòý€þýûùùøûú÷òíçàÔÉÄÆÞùÿˆþ ÿÿþýùõóóõùüþÿ‰þÿþ±’ûÿ†þ‚ÿ¦€™ÕK€Ç¢=ƒÀ6 Úùííòþýýþÿþ€ÿ þü÷óêÕÇÂÍðÿˆþ ÿþ÷ñåØÕÕÚäïùÿŠþÿë.Kóÿ†þÿùv?™ `¿¹¥IW/€Ëþííòýˆþ ÿÿýøóçÏÁÎðÿ‰þ ôÝÒÊÆÅÂÁÂÈÓêÿ‰þÿøq%Õÿ†þÿ¾*&]šªO»¹È˜bºÿííòýŒþøîÓÃÜùÿ‡þüõîéçèãØÒÍÆÁÀÊêöÿÿ†þÿý£¬ýÿ…þÿÿø«Ouš»*:±Å´p$‹÷ïîòýÿŠþÿûëÛâ÷ÿ‡þýúúûüýýû÷ñëâÒÆÄÉáýÿ†þÿÿÀ“ûÿ…þÿÿÉ MÌšÃC-“€,SÞóíðú‹þÿûóöýÿŠþÿÿþþ€ÿ ü÷ðèÕÆÁÔöÿ†þÿÿÖ+‚øÿƒþ€ÿÕU<Æ›ª±8 VblR¬þííø‹þýüþÿÿ‘þ€ÿùóåÉÁÙùÿ‡þÿê)wøÿþ€ÿü¼<k³œÃK 5|«ÉÝξ­AJÿóíòýÿ¤þÿÿøæÙéõÿÿ‡þÿë…úƒÿÒŽI>„ÌÌ›½c6tÃäâàÝÓŸu^,Àüïïúÿ¦þùñõ€ÿ‡þÿÿÅ¢ü€ÿþæ¡A _µ‘›̯KEœáêÛÔÑÒÔ°ihX!Káüïô¦þýüþÿŠþÿø…&Åÿÿï×V vÕœ¶•9\·àÝÕÕÒÑÒÖÏ—fk@tìûðùµþÿÿÜ=Nï÷½g;1)]Ùœªv)gÏã×ÒÓÓÒÓÒÓ×ÉŽx[ xêúòý´þÿü—§í}%5v¡@(¬ u:iÌäÔÎÐÏÐÓ ÖÚÆšq; &èüú³þÿÿÕ?>¤d .Œ¹Äqƒ¶œ Ê@uÕßÕÏÐÒÏЀÒÓÔÕÛµz=;†98P{¿Ì.5Ù›-Ý5;ÎÝÖÕÕÔÒÒÏÉÊÍÌËÊÐs1'söó:V¶Ž€ˆt73}¹á÷þÿþ‚ÿüõÛ¤V9‡‹9JDCE@84HÀèÅ¡3xÆ™1qŽŒßÛÕÓÓ×ÕÒÎÌÍÍËÈÉÐ`,' {÷ÔâϿŲ‰xg> =w³Üòü’ÿþ÷ëÒ˜j1*T´û– :GBEE;KB5tËäÞ‘$®š9T-ÃãØÖÖÒÑÒÏËËÎÌÊÎÒØO 0) ~õ”#¦ÙÓÎËÖ̤…khc; 8`‘Íèòõ÷øúûüƒû#úù÷ïíÕ©~V%'¬ú÷e ;GC@Jy]DF<‚ÔßÍSg¿™c9:ÊâÓÒÓÒÐÏÌÆÊÇ—iq¡32) ~ðcA¾ÓÐÎÌÒÕ˳•|lipoL D™×Þ§D™c(DËßÓÒÒÑÒÐÊÆÎ«T2=IT"2' äHUÂÕÐËËÌÏÏÆ·¥‚}tdM;/) %-8CKY_adikd_YTN@-+¥óß*A‹P=CY_MDHC[ÍØÔÓÑÑÒÐÊÉÐ|/*,)./ ޾8a’ÅÑËÇËÍÑÓÒÊÁ²š†|twxo`VG82(  ‚ !-)¨ó´ h†DB@=DHFHB?K¬æH¿˜erÎÑÓÐÏÐÑÐËÊÊi&1-/--0™y%‰ÏÈÄÆÉËÍÍÏÐÒÓÊ¿¶­«ª¡”Љƒ‚|{sjae0>~x\ ù§­“eGADFGFDG=4cÕÉ7oª—$aÄÌÐÐÎËÐÐÉÐÈV.//.1.,<)( ÇÃÆÇÇ€È=ÇÈÈËÍÎÑÓÑÏÒÍÇÁº®˜ˆ…z^ :‚ÏÖ{Y ¢ýT»ÄÁ˜T@HEFEDED@F©Û]@«—@ @ÃÐÑÎÌËÌËÆÑÈN302351(q-&-–ÌÃÃÄÇÉÉÈÆÆÈÏÓÍÊÎÏÏÓÒÖÔÓÌÊÆÃÁÎ…;45€6!?ƒËÜßÍgV$«ò-¹ÁÉœV@FEGEDDEC?rÞ’'˜—$FÈÒÎÎÌÊÊËËÊ·$%310@&-"5¦ÔÀÅÆÉÊ.Íð¶ÊËÉÊËËÊÎÎÏÌÌÍÎÑá>EGD9i±ÏÁÉØÍu["°ÞŒÄÄ¿ZEC€E CEECA=Uε1pª–f0³ÔËÏÏÎËÉÌËËÄ`QF&+65#  ;±×ÃÅÈÇÇÍÙÚ³h (‹ÌÊÈÊÈËÕÚÒÎÍÈÉËÕi7CC4Q¯§§¶Ë—i­Æ¹ÎȦH::DA=7CCIREAº¸9fÌ–fÉËÊÈÉÈÈÌÌÉÈÀ·¶•'496* H^OCÌÌÈËÈÇË»€E$@®ÏÇÎÏ¿ŠX@I§ÌÇÎÎV;@‰º¯ÆÆÇÇʦ—y)¤’/yKAh¥½ÏÕÍÔÑwH`lqGÙWPÙ–f RÁÎËÊÈÆÆÇ½½ÁÄÈ/23)J´½ÁÇÈÉÌÌËÍÅ\#g·ÇÄ·c$ +$uÆÉʳL<>>y¬¹ÇÆÅÆÊ¡ƒx1 „p3T“ÀÓÂÆÏÌÊê]9‚Õl=o—e3 ƒÒÍÊÉÊÊþÆÎËÊÒ#-  ¿½¿ÃÈÊÉÄÅÁÏŒ <›ÌÉÃÇÆ` -,&ªÌÃÃεR=@Bh« ÂÉÈÇÇ·²| FBpÄÝÓóÁÇÄÇÈͱyBAB8€Óm3]—e" I¸ÌËÊÊÍÆÂÅÊÌËЫP9;1(k½¿ÁÂÇÊÉÈÇÄÃÇ¿ƒTt³ÉÀÁÃÆÍu  V‹ÊÂÆÈιSBC>D˜¦ªÅÁÆÃ¾·T GÔáÓп®ÁÅÂÆÅ̹}>>€B"EB??:EÀÅÝ_™Ì¿ÃÌÎÄ­‘•Ÿ²“O:@@=hÃj3°œ'†ÇËÊËÊÊËËÊ€ËÊÈÉÉÍЮ\;5'/]›·ÄÌÏÍŠË ÊÉËËÊËšJ>G€E!DBA><@ŒÄ>OØž*…ÈÔÍ€ËÊʃËÉÈÌÏÁƒ6aŠ˜‡PFj±ÈÔÖÓÑÏÎ΀Í0ÌÌËÉÈËÍÊÇ»i9DEEDCCA>JŽÎÈÇËÎÌÆ°™ÊÒÒÑ›oO1;=?<8Z¶¬&{Ÿ#Z—ÈÌÍÌËÊÊËËÊËÇ©nHrÒòúûÝ–YRTKMbv‡˜ªºÁ€Å0ÈÈÇÆÇÈÇÇÂË N8CDEDDBA@†´¸ÈËËÈÆ´§ÈÁª‰F/8;?>=?GÆs@¹  O¿ÉËPÉÉËÊÊÈ–8VÕüóîííñùõñìצ_%  8[juy}|~‰‰}|•»É”]B@CAHRN89@A>?B;^‰¿£/¡¢O\O¦ÐÒÍËÊÈ´P"³ðîƒí?îññïðäÀV "•É¿©O>E=V€‹bI²°¡¤§¹Ô±eC=?@>CA=A9G’ÃÂ\@Å£fk$Kz¬È×ר××Òš/cØïƒí0òöø÷öôïçÓ¶šƒodbdd]_Y>,J`X4d²Æ¾x€@ >BA=>a¶É¸f@€@ >=@@=2e¬Ã±N?ħĪ¥H ( äñ‚íøÿ‚þ€ÿ€þŒÿ‘,n²Í¹V6<@C??A=8>‚@>€?4B¨ÎŒQ ³ª ÿ‚2cllqYOéïíôÿþÿÿþÿÿñ{.H¸‘eO<:=>?ˆ@ ?>@Ke”¹ŠJ>ˆª« #¢·µ¼‡¯óíîüÿ•þÿöd 9–Å®|P::??>„? >=7Fo®ÇÂb0™Ö­ ®&(®¬³€Ìó€íìñ˜þÿ‡ D”¾Å¯„gbTDB@ACCBDEFZ ÄÉ¢^CªÌ® ÙR˜­¬²ˆÈò€íìò™þ€ÿ¿tF1y¥¾ÈÄÀº |fp‡}|¤®¿Æ·r9I„°¶s†«¬°™%‹íîííìñý˜þ€ÿÉ}IDF}ªÃÈÈÆÄÂÃÅÁÁ¿Âȼ\xʲ |v«­®¤C3èñ€íðý˜þÿþÿ´SKŠJ#!9~‚Ž”’ŠxjG?@)¢Ï³|f©­­«~0©õïííîøšþÿš ŒÒÛÎÁ±”kKHF/*W,VMRYw¼Uµ€V§­¬­¨o<´ïîííðü˜þÿÿ~ÆàÞß ÜרËbUø¶Ý̪¸‚O§®¬¬®—4kåòîíïù˜þÿÿq1Ó߀ÜÝÝÞÞãËS\¾„=£®¬¬­ª}.lßðîíðû—þÿæXhÖÞ„Üã«/ºÿÿ„(œ®¬¬­¯©q-SÓóðîïø•þÿöž7)©Ü݃ÜÝ᪺ªÐ‰™®¬¬­¯®§w-Y»ãóöóøþþÿÿþÿÿÁ6@‡ÒÝ„ÜßÑ\GѺªÆ𮬬­¯¬­©ŽA)9‹½Øõù÷ùüþÿÿˆþ‚ÿÝWCÏÛ…Üã¶8y×½Ð\ž®ƒ¬ ­¯›nQ(:ªàøÿþÿþ‚ÿö¾ŒG^¦ÓÞ…ÜÛ׋$¯¾³K%¢®…¬±®§ƒU'6Toƒ™´Îéû„ÿ þïâÊ“eA< %35Mt’¨°±Ð݆ÜàÆ.7Àÿ½¿3=£®‹¬®±´°£{ldZNIHN\hr„¦²°¯­¶Ö݆Üâ®më¿™#N¡«Žª«­¯²´µ±¦Ÿž§±­«°¯¬ª««¬¼×Ý…ÚÝß„#ªÿ¤¨ªÝ¿£­¼­’œ°ÀÏáÌìªÑ™W($ -=M§êµR3&«Ö´¡"žÒÍÊÈãË™+ mÛûû€ÿ6þüÓk7°îäããäéׂ4R±ÓÜÌ‹ÏÔÌ7/yÇÑÓÍÍÏÛääåäæçèêêâËo$Vʲ ¿[rÏÎÉÈâÂ?E¸÷†ÿù«%1áî€ã+äëçÜW!7KS<33/p²ÏÔÎÊÍÔãøú÷óìçäâãäæêÛŸ72¿¯ Ío8ÌÑÊËáÏ7]®ëŠÿÞo:Ëíä€ã*çåÝ̸§¥¤ž‰x¦ÁÎÏÍÊÓäÝÈ«x‘³ÔèïåââçúøËž@)½® Ù[*kßËÊÚÜROÖÿ3Ï_ßèäæåâããÝáéêêéáÚÖ×ÚÔÌÉÏãã¼p?)(2;84MØòéâãôÿþ÷­"XÖ¬ ª™ @¶ÓÉÑä„ ¶Žÿ ùëäèïçäãâ€ã$âßÓÍÌÌËÊÈÒׯy)#K|µÃ§uA$E¦ììâäòþÿð‚£¬ Ò9-…ÚÊÊá¹ Oîÿ ß0>Þééöõìä€ãäßÚÎË ÉÓâž Y±ãúÿù×–)ŒéíáäõÿþÕ8QÕª ¶}Œ¿×ÈÔÜ]%Àÿ ü™¡îìïøòç€ãäÜÒÌËËÊÊÑØ˜Ÿìä…ãåÐb_¿–(߉Ê6ÉÕåãäê¾9ZÔþ÷ИP41@[q}¦¹ÃÈÊÓÚÜÛ×ÓÌÉÅÁ´ŸsTC?<@PÙÛ‘REm›èŠÿçMpáé†ãåô•Uƒ•ªu+¨ÜɈÊÉ×äããäíÊ9Fl6Bm•½ÒÕ×àéêåãåéêçëðòòôõäβ¢‚X,:‡·ÌÞôúŠÿû“ ±óˆãó°L••ØX3´×ˆÊÉÎÞäãáèïóI&PŒÅÚßÜØÖÛßßàãää€ãä€ãâãèìñôö꾈K+0_°ýþŠÿÊ(>Üêáâ†ãïÄG~• ÔHA¼ÒËÊÊËË‚ÊÉËÛäâãðï³]&Ot¦ÖåÔÎÒ×Ýâ‚äŽã äçîôôÚ©j1)_áˆÿÛN¬éãââ…ãäïÜX]¸”Í@MÃς˂ÊÉ×äãåôæ„&‡ÌØÜÖÊÐÚàã€ä“ã ââãåêïåÁv!C•ä…ÿåYëæâ‡ãäíëxC‡”¥=IÄÑʀ˂ÊÉÍâãäã½f&HšÛ×ÍËËÔáåä›ã ââæï与E-Y¨øÿúÓe$~êìŠãçò•9£”†9.´Úɀ˃Ê×äæä 5³áÚËÉÌÕáåä¡ãæïõõÈcUÎù÷Ìw(8¿öèâŠãâí¶A†”®O Ú̀˂ÊËÝáôÆ ,»àÏËÉÏ×â§ã æñó)‹+HÕîæãìÄLxÆ“ÌinÐÑÊËËÊÉÎßëð’|ÔÕËÉÌ×ßä§ã äéóÒX@@9VééŽãëÎQiÌ”¦&¢×ÌËËÊÉÑæü½9hØÖÊÊÈÖãåä¨ã âãïß‚mçöæâŽãìÞYc¿”×YPÂØÌƒÊ ØñØd"ÎØÊËÊÌàåäªã âæùó .4²åéŽãêóç`Z·•¬. _¸ÒÍÊ Ëàåj/fãÌËËÌÙää¬ã æóÿý´:+…êçãðúïk8r–Ã68¯ÕËÊÊÉÍæ¢CÃÑ€ËÖä„ãƒä¢ã åõÿÿãbŒëæŠãâãôýõuAw–¶wE®ÒËÊÊÍÛh"vÕÌËËÏÞäƒã æçåääæçæåäŸã âæøÿÿènºðä‰ãáåüÿïoPÀ—¤7¤ÐÌÊÍÃN*p²ÛÉÉÒâˆã ääãÚÐű¤±Ôçˆãä×À´«§§¥¤¥«·Îæäˆãæçd ¾çƒã ââñÿÿùñ­$&]š­BŸžª€V ÚÊËÓãä‰ãäãØÊ´¦Áßä‡ãá×ÎÈÆÇø²¯©¥£¬ÏÜæ‡ãåè’šää‚ã âãòýýì™Euš»+/—©™]!yÓÌËÐàäŠãåÝʼÅÜä‡ãâÝÝàáâáߨÏÈÁ³¨§¬Åãå†ãäê°€àå„ãçîøº KÌšÃC%}m%! H¿ÐÊÎÞäŠãäÞÕÚãä‰ãâãƒä áØÏƶ©¤¸Ýç†ãäîÄ%sàäƒãäçîÂK;Æ›ª±8 [y‡c˜ÙÊËÚ‹ãáàâ€ä‘ã ååÚЪ¤¼ßæ†ãäíÕ$kä€ã ââäïùîª3j°œÃK 6²ÍàÞDzH@ÝÏÉÑâ¥ãääÙĺÍÙää‡ãëÕ{èâãâèíëÀ‚C;ÌÌ›½c7wÇéëçãá¤~p7ªÚÌÌÝå¦ãÛÒÙ€äˆã鯗èãìóðÕ’9 ]µ‘›̯LF¢èðßÚÛÜÛ»ƒ†l$BÆÙËÕ¦ãâàãæŠãåäv!µìíÞÉO tÕœ¶•8^»æäÚÙÚØØÙרƒJgÏÖÍܦãääŠãäèÊ6Fáá©]4*"]Ùœªv)hÓèÝÙÙØÙØÚÛÜΟ‘m jÊÔÒâä¤ãääŠãæè‡–Üp ,d‰5(¬u:jÑèÚØ×Ø×ÙÛÛÜÝàÒ¯‡F %pÈ×Üää±ãäìÃ86“Y &vž¦`ƒ¶œÊAy×ãÚ××ÖÖØÚÛÚÛÚÞáÑ@9‡=]¿Úßää°ãêâl -%G†®±aCΜ¿WmÞéÛÙØ€×Ù€ÚÙØÛÞÄ-PÞš^ÓÞØØ×ÕÕÔÐÎÕ 9334/2  ¾AnšÌÙÐÑÓÕØÚÙÓÆ·¦œ…†Œ‘‰}gWRC;3.$-„ *9(¨ó´ qœ]Z[Z__bd`\e¶î–I¿˜WuÔØÖ××ÖÖÓÎÒÒl05.-10/šx;/*“ÜÐÏÒÕÕÔÕ×ÙÜÝÕÊÆ¿¸²¬§ž“’’ŽŒ€y{=C‹w( ù„ –‚^Y€] ^ab[UqÚÑ;oª—e`Ë×ÓÓÕÕÔÒÎÖÑY=<41142=10+ŽÕÍÌÏÑÓÔÔÕÕÔÖ××ØÙØÙÕÔÑÉÄ´¨˜•–—r$ !EØßŒm ¢ýX ¼¯jW\]_\]]^\[²äbA«—@ BÉ×ÑÓÔÔÒÒÏÖÐS0&pÉÇÈËÎÒÏÍÊÊËÑʉc‡¼ÑÈÉÉÌÖ€ Z‘ÓËËÎÔÃj\[W]«q  ;ÄY IÏÛÒÕ¶,‚ O‹\QYO•Ôb7l˜ U iËÒÑÐÐÑÏÍÍ€Ï ÍúÀ¼¶´ÉÍË΀Ð7ÍÍËÊËÍÐÐÌÎÍÊÊËËÉÓ¼RIt£ÆÌËÊÌÎÓÒmsŠ}`^¤°˜€¡²‰B) VæÙÒÐÄI‚ QSXN ÆID”˜Ÿ­ÜÐÏÏ€ÐÏÎÏÏÐÑ‚ÒÑÎÐÑÐÐ΂Í2ÏÌÍÏÎÍÎÐÏÌÊÊÎËÎØÏÍÍÎÎÍÏÐÕsgƒy]Vq‹’Š~f\|›j VËÍÓÏÌš5 #ž~NWVQ­»2V¸™ ‚nÒÖÍÍÏÐÏÐ…ÏÐÎÐÎÎÒÒÎÎÒÑÏÍÌÎÏÎÏÎÍÎÎÍÍÒÔÐ΃Ï*ÐÔ~U_\]\VVTOLT‚¿«m'.Æ·u\VXYVWXYYQY˜ÆÊb@Å£fk$M|¯ËÚÛÜÜÝÛ¢0X½ÌÊ2ÉÊÒ×ÙÙØÔÏÐÆ¯“xcYWXXSVP7&BVP0h¹ÎÅ…VZUk—¨W—™ˆz}¥‰bW€Y UVYYXQp¶Õ°1m™¤£Œ@3I\sorttvC²Ñ‚Ê1ÌØáååäæÞØæôúûôæÚÒÒÕÕÑ̾¶ÄÖÍ™;iÀÑ»xZXcx‰sQE`‰Ž`SX€Y WTWYXMs³Ë»R<ħǪ£G '  É΂ÊÚääã#äåãâááãæìðîëææëõøðççï‚-v»Ñ¿qQSUWVUUT€RSW‚Y VVWTMT®Ú—T¯ª ÿ‚0U\\aNEÉÌÊÔäŒãââããäãâáãêîòâq.M”À¦v_UPPVˆY XVST\o˜À•N<ˆª« ‹œš s—Ï€ÊÉÌáä”ãæôþùñáY C­Ñ¸ŒcPQYWVXYYX WUPVz´ÎÎd/™Ö­ ®&!‡”“™m°Ï€ÊÉÐâ–ã$ëúüêèy \©Ë϶wuj\[YZ\\[\]]w¨ËШ`@£Ì® ÙR‚”“˜u¬Î€ÊÉÒ—ã"äðüíé«g:?„®ÄÎÉÅ¿ªŒy€–Œ›®·ÈÍ¿y;I°¶ur’“–ƒ yÊËÊÊÉÏâ—ã èùîòºo?:M„°ÈÍÍËÉÇÈÊÇÆÄÇÍÂetʲ|d’”•Œ9-ÈÍÊÊÉÎá—ãäñìû®J?xu@!:„ƒ‡’—•Ž{lHAC,¥Ï³|X””’l)“ÒËÊÊÌÚ˜ãçåþ— y´»°¤—~[A?>*+X,VMQZw¼Uµ€I”“”_4œÍËÊÊÎà˜ãäñu«¿¾€¿ ¾¼·¸­TUø¶Ý̪¸‚BŽ”““•,^ÅÍÊÊÌܘãæçd*µ¿‚¼½¾Â®G\¾„4Š”““”‘k(`ÁÍËÊÏÞ—ãêÎNX·¾„¼“(ºÿÿ„"…”€“ –a'J¸ÑÍÊÍÚâ”ãçá0#¼½ƒ¼½ÀnªºªÐ‰ƒ”““”–•f'P§ÉÐÓÐÚâ€äŽãâæù±/7t³½„¼¿³OGѺªÆ„•€“–“”‘z7$3{¨ºÔØØÛßâää†ã ââäåçñïÒN:…°»…¼›/y×½Ð\ˆ•ƒ“$”–„^E"4—ÄÜäÞÞáâããáâäåäãåìïéåܰ~>P޵¾…¼»·w $¯¾³K‹•…“!—•ŽpH!1Kcu†¶ÏæöüùðæêôïÛе„Z93KŽ®º…¼½¹˜QIÕ¾ªB'Œ•‡“”–‘{G! 9Pdz“¨´«‹‚iR>($Nrލ·†¼¾´a(~î¾Ê6.Œ•‰“”—ŒzfN5 € 65 ,-Ab}–˜²¾†¼Àª'7Àÿ½¿35Š”‹“•—™–‹{i\UKB>=BOXaqzŽ˜–•”›¶½†¼Á•më¿™#DŠ’‘“•™™›–ˆˆŽ™“’–•“‘’‘’ ·‡»¾q#ªÿ¤¨ªÝ»£ª·ª†”­ÀÏ×ÌìªÌ’Q%! ,;G‡žê±O3  EØçª»3   $ 2•ÖäU”+ %)(*--) FÅâÆŽ!).00/.--.-"$“‡•ªÌµÁÕÔHf¿ψ "12//110/€-./+9U‘ªØÈ‘8"3@PWt¥Ð™Uº׈€ &.% #(-/-./$ kܶ٭gA Ac•ÏÌ·$• &#  &  +/.--./+YÅ_U‰݇   =™Õµ½3 € "3t©¿Êˬm& %/-0+%H™Í†ª›A!+//-( 9 Ö´œ €"$wÝüü€ÿýýÕp 0-.+K§ÍÜÌ‹Ïλ+  €,./--././-(LŲ¸R€ L½ø†ÿù¯/,0-.-/>D236 €3432/.-./ 2»¯ Çr  g´ìŠÿ3ào%.-.0,.)   )/0--+1•‰2 "µ® ÙX#&WÜÿ3Ô +..A@),+*-+' %14%*0.+)}ÅŠDQÖ¬ ª‘! »Žÿ ú….,VˆP2-,€-*% ƒ!!ZŒ¼ÆÇ±ƒL..*$t¾´K ž¬ Ò4!\ðÿá: ,+Q¼¯p:.--.&‚dµæúÿøÜ 8//#'ˆÏ,LÕª ¶w "0Åÿüž -<‘Ê J/--.hŸí†ÿþÈ`,/!@s°B© Ú7%Xî‘ÿÖ-3c¨–J/--.!)Òïˆÿþ»)%0)-A”I#XǨ¿_ 0Àý‘ÿ óm#,6CB3--.*€Aºÿþ‰ÿ úÏZ '/-1@5.¨Á !zõ’ÿþ²&,*+€-.% 2ÀŽÿ Õ2/.,(,/'Yا¤‚)”ÿÝ0 /‚-/ €  ÿü™$0€-.- >ç‚‚,Sí”ÿôP0‚-/€kñÿë(/€-.0$X¦ÑL# Œú”ÿùw2‚-.€1Å’ÿT)0€-0$ ^¦ž '•ÿü™0-.+€ ˆ“ÿ‹ 1€-/, Dͤ¿a€+2î•ÿþ¯/- .% GÚ“ÿÉ4 +/€-.!¤£¶ˆ, Xö•ÿþ´/-/ ”ÿ öf..--/% ~£¬(€$+ pø–ÿ¼1-/6”ÿ ý†,.--/+jª¡¨O%(ú–ÿ 2-/cè•ÿ ¥*.--.. K™ Ÿ~ )(ˆ÷–ÿ 3-/€ú•ÿ ¸'-.--./I ÄB ,(ˆø•ÿþ·3€-.. ‘–ÿ Â0,/--..F™ŸÑZ‚/*}ù•ÿö‡1€-/( ³–ÿ Ò?&/--..(§Ÿ‹ƒ-,b÷ŒÿþöïôýÿæP0€-0%Ê–ÿ ÖD#/--..$­ž±Fƒ '- Rò‹ÿñµvg‡Æö€ÿÍ."/€-0!Ñ–ÿ ÓC#/--.0ªžŠ„$-<ÝŠÿì… :«üÿý¥(.--./ Ó–ÿÍ;'-1# ƒ£>…"/ÇŠÿ¥‚GÓÿöf (.-. Ï–ÿ¿.+.€-., R‡†2  üˆÿêeƒ ÿÖ'00-, Í€ÿþòéøüŽÿ«/.-/5𪚳F‡/+SõˆÿÞTƒ ‘ÿx 1/€-/( ÆÿüÉyHDf“äÿŒ 0.-/& ·¿™Æ ‡+0»þ‡ÿô„‚*·Ì //€-.- ¹ÿ¾@€oä‹ÿëZ/.-./ fp™¿<ˆ '0$`íˆÿÓZ€ßU#0-.,€ !¨þv‚%¬‹ÿÃ0 ).ƒ-0#o™ª'ˆ#0)1Ùˆÿù( QÔå,/..€- ,#œô_ƒ’ûŠÿ¬-.ƒ-0&aÔ—»k ‰0/ ‘ûˆÿ ó¼‚y Ýÿ› 1€/€.0) €†ëbƒ‹úŠÿ|0„-.)*´—›T ‰1/+ ,Õˆÿ ýôèÙ;1€$',,^ß‚¦‹ÿK)/…-,y—ª7 Š0..% AÞ‚ÿôÜÄ y_L4!ƒ  'ºÜO€ tçŠÿÌ$/‡-) V­– Š/--/#]Öþ÷Ñ¢\3 € XÛÚQEm›èŠÿè^+.†-.09{•ªv Š/€-/$O„u?  #&),-/0/--€./-)$!J—¾ÍÞôúŠÿüš 0ˆ-0 ’•ØY‰$/--./0  $),/0/.//€.-..//€. 001.& 1m·ýþŠÿÎ8+.,,†-/&~•ÍIˆ.--00#  %-00//Ž-€. /10*"k”áˆÿÜZ .-,,†-0+U§”ÇA‰,/-0.  (.0/˜- /0,!L›å…ÿçh ..‰-/.2x” Cˆ+.--& '0/..›- .0- X«øÿû×n./‹-0”}=ˆ0.-  '00¡-.010#ZÏù÷Î{+"1.Œ-/!ˆ”§O‡$/2(€ ,.¦- .105ž9 )0Ž-/%wª“Ìg€…)00 '..§- .0(H@ ./-,.( e²”¡†/3& -2.ª-0',1.-/,Z´”×T„1, €'1.ª- +3K> #./-/>>2 U§•¨0‚. €..«- +2o›q,.Œ-,-^bB 3g–¿4""€/.‡-..¡- +2à›3.‹-+,~—`7p–¶w€€ %/ƒ-./.--/00/ - )4›â‘4%/‰-.&1¨µ`D»—¤ ,.- ./,"$)-/.ž- ,'HÀàt3+.‰-Gá±AKÓ—›7   ‚-0/&€!-.ž- +&gÙ½R,,†- .*sç‹ UÜ—¹m  €%--€.' …*.-./..‡- (/¨Ò^ (,‡- 9©Ìrjª˜­,  € +.-.*% "! €*.‰- /.,+'$%'*,./…- ,+Qd;* .…- ,'@žÎmE‚™ÕP‚   -.--+*-./230,##/ˆ- /0)# !*/‡-'),0, -.ƒ- .&-æÁ4+:™ ‚    ,/„-‚.+€"0ˆ-.! € 0.…-,,-..%.ƒ- ,$^Õî‰( &Pš­ ƒ  +.‰-/-*.†-.* ‚(/‰-„- +)hºšE k¶š»/…  )/Š-1!(.†-.+"#&"‚-/‡-.#,„-,6E<"DšÈF  $.‹-!#..ˆ- ,+//..//.' (0‡-/' ,…-,,#5º›ª±9&RLSB .Š-+'*..‘-.0/€)/‡-/*„-020 ]ªœÃK 3}´ÒâØÀª3 ,.Š-..”-€. %..‡-/*.€- ./.&6xÌÌ›½c5rÂèîíèæhM& !0¦-$/..ˆ-/$.-/0/* Yªm›̯KCœãñâÛÛÙÙ°hdN -.¤-)&+/Š-..#/0,( qÍœ¶•8Z´áâÚØÙÚÙÜלgg6!.¤-,./Œ-( -," €]Ùœªv(dËáÚØØÙ××ÚÜßÏ‘ƒ\  +/¤-..Œ-,+¬u:eÌçØÕØÙÙרÛÞÞàË©ƒE 0/²-/' ‚…¶œÊ?tÒâÜØÖÕ×ÙÙÛÞßÞÜéÁ‹@9Ž7  $0.°-.-„EΜ¿YiØæÙ×ÙÖÕÖÙÜÝÞÜÜßçÄ‹/OÞŸ<+.®-./ ‚"²œ!ªª#¬çÛÚÛÚ×רÙÛÜÛØÒÍÊšKKÕêÁS#..¬-/. ;wnp¶œ!ÐKNËÛ×ÙÙØÖÕÖØØ×ÕÔÏÈÔ§NCÒôù +0«- /./ŒÂäÙH€!­œ&Ì›#ŒÖÙÕÖÙÖÔÔÕÔÒÒÕÕÙèûé¦ 8ÚÿôF*%./..¥-..(gÏëëõ£YÞœ'ÑLKÅÛØÕÖØØÖÓÒÏÎÕÙÙÚ·¤œz;äÿÒgwL" )/0/¤-&/Ti{™¿âæ^€ß›)ª‰"–Ù×ÕÕÔÔ×ÔÍÎÒÓÕÖÚ¢9;( Vðü…$\p‹] #+.€/š-..//1( -Ionia\i‹ÕáŒ15Ù›,Ý58ÇÛÒÓÑÐÒÒÏÍÎÐÐÎÐÔs9)röó:]Á‹{ ¨rE (-.’-..-.2*-1%:––XtllgfcbwËðÖ´7xÆ™1qŽ„ØÔÕÖÓÑÒÏÎÏÒÐÎÏÐÕ` 3(z÷ÓˆïÙÆÎÀ˜„vO (,.€/€.…-€. --./0-*& ']·ü•`qmix{jZ‚Òñíœ'®šT*¼àÑ€ÔÒ€Ï'ÍÒÐÐØÚÝQ 3* }õ”%®åÞÚÑÜÕ¦•…re3$),-+..//--.00.-+*&*«ú÷c_nkgšÁfi\”áðÙ\g¿™/68ÀÝÖÒÒÔÒÏÍÌÏÌžov¤33) }ïbFÅØÚÝÑÒáÙÀ¡ˆ~€y}Z  !%'&'(&$#! ‚%¢öïAU†eolŠ ~hjgd£ÙíºG™8(@ÂÛÖÓÓÕÓÑÎËÒ®Z:EMX$5&€åGZËßÚ×ÑÎØÛÑÁ®‘r_??5++"‚ ƒ+¥óß*N¬kkw~sjllb„¯æßS™WÈÙÕ€Ô ÑÓÒÎÒ~!831€0) ¾=f˜ÌØÑÍÐØÙÝÛÕÉ´š‹€‡„‰…mhb^E>4+(3.† 1@'¨ô³ )§eedbgjkmlbb²õšI¿˜?mÌÓÐÓÐÑÐÒÐÎÐl*4/,0/)šx:0*—áÓÎÑÖÖØ×ÚßáãßÊÁȼµ¯¢¡ƒ‰ˆŠˆ„Š~Aƒ>ƒ•t  ù‚ …heddfhinf[jáÙ=mª—UÁ€Ð_ÏÒÏÐÍÐËY582/142</1-×ÎÊÏ××ÕØÙØÚÛÛÜÞÝÜàÜÙÒÇ¿­©•‹‹p# AŽÝëœg £ýT º­n_beeifefd]²çd@«—e >ÀÓÍÐÏÑÒÒÐÓÇP6964:C>q0&6¤ÜÊÌÓÓÔÖÖÔÔÖÛàÚ×ÛÚÞßßãáߨ×ÏÎÌÕ›VNQMQOU‘×ïìÚuV!«ð/À¯q`cgdfefeb_„å™)˜—ZAÀ×ÏÍÎÍÎÐÐÍÑŒ&.DD:?+7(A³áÌÏÒÒÕÖÔÔרÆÄÕØÙÙØßÚÙÝÜ×ÜÜÝÝìš`fhk`¶ÐÆÒçÝ|^"¯àT¿wcd`fe€feg^lÕ¾5oª–+¬Ó€Ï_ÍÐÑÓÑÐÊ—iWN3,98#  DÀáËÐÔÒÒÕàéÅy./”Ù×ÖÖØØäìâÛáÙÖÛæ†\he^n¦R{á¥k®É C½³f[^eb][dcfog^ÃÁ~…ewƒŠešÞ[QÙ– 3 N»ÐÌÎÏÌÍËÉÉ€Å3Ë‹479.TÃÆÆÌÎÍÎÎÊÎËd #:#i½ÓÑÅt05,wÓÖÖÉoaa\Œ¨ ‚ p* „r3We½­L }V]db–ÝbO§–^#’Ò€Î;ÌÍÉÃÈÍËÌÒ… (+4( „ÈÆÈÈÏÏÍÍÇÊÑi%$GŽÅÑÍÔŠ1*i¼ÔÒÔÃkad_а‚ )—p YRQ„´ÕÊR‚ a‹]_`]’át:o–CU8 uÏÏÍËÍÎÉÁÊÔÎËÔ‰)¦ÊÇÊÌÒÎÉÌÇÈÛ– <ŸÒÎÈÑÕj55&·ÔÏÎÕÂi_b^}¸6‚ 8µq EFr¼Ûض3 ‚ I†_[b\’às0]—UU A®ÍËÉËÍÆ¾ÇÐÎÌѧ@);/%nÇÇÈÉÎÍÈÅÈÆÆÏÌŠm’¸ÏÍËÊÎÛ‚ \’ÕÍÌËØÉnbb[bªd 8‰½U IÌÛÒÔ¯)‚ JŠ`S_W”Ôb6l˜ 0 cÆÍÇËÌÈÀÅÌʾµ½¹³±ÈÊÍÐÎÏÌÇ€Ä3ÇËÏÌÒÖÊÉËÌÌËÖ¿RL{¢ÆËËÌÏÍÓÐnz”…gcŸ¤‰n–¯…?$ZéÖÎоD‚ ˆžVU^TŸÈJD”˜¤ÓÇÊÊÆÃÉÎËÌÌÍ΂ÏÎÍÑÐÏËÈÉÊÉÈËÌÊÊÐÏÊÍÍËËÊËÏÉÍ×ÌËÍÌÎÔtjˆ{^Zq††|f^w”O&„ÀÏÌÉ•1 œPY\U®½5V¸™ AfÆÌÈÇÂÆÍÍ˄̂ÍÊÊËÎÎÌËÏÍÌÊÉÌÍÍÌËËÍÌËËÐÓÌ˃ÌÍÔUa^]\YUUSNR€¼5€ YËÌŽm"?‘‘\VXV`¼¡(s› €ÄËÆÆÉÌÌËË€ÌËÌÌÍÍËÊÈËÌÒ»˜‰‹§ÉÓÏÍÌÊÊÌÍ€ÌË…ÌÍÕ“W]b\[_]\ZS^•„8€ ¹ÏÉÀ¯—†‹±¤dU[WQsÈm1°œ"ÅÌÊÌËËÌÌË€ÌÊÏѰ_/$$5aœ¸ÆÎÏΊÌ.ËËÌÌÍÔªeY_YY_[YYS]Œ,  ¦ÐÏÆÎÚË«•bU[]XX’Ê?NØž%ÉÕ΀ÌË˃ÌÊÊÍÐÄ‹B +Rv—´ËÕ×ÔÒÐÏÏ€ÎÍÍÌÊÊÌÎÍÍÆ‚RX[^\X\]V`‹‚ŽÎÓÓѦ‡kQUVZ[Wn¼´%{ !]ÉÌÎÍÌ8ËËÌËÊÌÊ«i%   -D_xŠ›«ºÂÃÆÇÆÉÉÈÇÈÉÈÈÉÓ°gPZb\Y]^WV‰M‚ ›ÌÄ­”^NV\[ZZY^˜Ò{?´ N›ÀÊÌ ÊÊÌËÌÊ™5 ‚@ 8Yitz}|~‰ˆ}~ÄÔ¦sW_]Zag_Oy®e Y½›YRPPVW^^ZVnÉ®0¡¢OZ N¦ÑÓ΃̹S …> %    (œÐƳ^_^Rj“{c·­^! '²qXTVWTW\[\SZ™ÃÌb@Å£fi#Jy¬ÉרÙÙÚÚ¢.ƒ $(#€ i»ÏÅ…[]Snœ¯ˆZ}”’xjw …_U€W TXY^^Sr¸Ö²1k™¤£ŒB/I[rnrttvF‚)€02$'€2$1-+*)**('%$'*(nÀѼxWTf€yTG^…ŽŒ]QVƒW Y_Ut¶Ð½R;ħ Ǧ¡H( ‚/.-/0.‚-/0/€./120/1-x¶ÍÀmNWZ\[WTR€PQV‚WU€YOS°Ý˜Q¯ª ÿ  ‚..“-6_€`3$LÀ¥vaVRUX‰W TTU\n–Á”L;ˆª«ƒ‚).“-,@§øÖP(B³Ô¶Š_RVVUTVWWV UTSUt°ÎÉb-™Ö­®%ƒ‚ ,.“-&,1hÓê_(e«ÉαŽwshZYWXZYYZ[[¨ÆË¨]?£Ì®ÙRƒ ‚ –-#,7Žåo+!D«ÄÍÆÃ¼¦‰v}’Љ˜«´Åɺw”ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿç\¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®.¾ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕD3ÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåV9Ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿš ›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦bñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿª©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ± GÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×E8ÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓB–ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾-]æÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´#;Ìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§ ‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”BÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿu¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷e’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãRQßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£<ÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃ78½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉ?‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø¡T+¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÍj 'òÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð¦BSÄùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñŽjÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡eâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔDdÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ~'Ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿº% —üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáFQïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû!ÅÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõH\öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðuùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú… [øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó?gýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿž Tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâ<YÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøjuÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈ8¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂ1ÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðaÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“Ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬dÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´#.åÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑ@‡úÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜJ×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓBƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½+ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£/Òÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`ýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé[ §ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~œñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆ7C¾üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóZ‡þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇŒòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠ kØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅ'J‘ÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéJ’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêÍp‰ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛ_‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁQ7ÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÂ6˜ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñŠ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþðÍUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû¼ºÃÀ¿* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕw ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„ ‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿzÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿž «ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒ/Çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏ?IåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑA…ÿðððððððððððððððððððððððððððððððððððððððððððððððððððððððððÿypygame-1.9.1release/lib/pygame_icon.bmp0000644000175000017500000000116607421670513020014 0ustar vincentvincentBMvv( Ž ‘“U\#ÚôYYRºÌÈe“Xåôéëè ½npl­±­kx#!§¼ã3ÓÑôþÑDDOÿóàDDDDßAàíßDDHH·{Pã4DHDHWµU²à,!DAÝÛÅ»µU ¶fl&ifUº¦+µ–lÆffÂl»µ¼¥[ fnæfëμº¥²ª»f^îÆÂ–f[u»»²éfîåÉl+µîî%µ%–eâbUDOÅ»À –œVQDD„„„E+àÉi»D„HDDDD3Ðìœ4DDD„„HDA^D„„DDDHADÐÝDDDDDDôDO„ƒñDDDDHDDˆH‡ïODDHDD„„DßDÿDDDHDDrô„AODßDHDOv™ŸDßDA™Âÿ÷뙜„NïOL™n¿DBå™–Dð Dù™nÇDF™™™0ô™™œDL™™™04ù™™œDL™™™ôàù™™œDA™™œO B™™—„D™Ÿÿi™Ÿ„OA'ø€äòbô1DMôDCààãÓàpygame-1.9.1release/lib/pygame.ico0000644000175000017500000000206607421670513017000 0ustar vincentvincent è&(( @€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ33333;033»»³333»»»»3³3»»»»3ˆˆ€;»»»»ˆˆˆˆ‡ƒ»³38xˆˆˆ€‡ww8‡wˆˆˆ÷wwwwxwˆˆ‡ˆwpwp‡ˆˆw€wx÷wˆˆˆˆˆwwˆˆˆˆˆ÷xxˆ;»³3xˆp÷÷‡ƒ»»»»»¸ˆˆ»»»»»»»30÷;»»»»»»»³0€;»»»»»»»³»03»»»»»»;»³»³3»»»»»»»»;»¸³;»»»»»»³»»³3»3»»»»»»ˆ;»³;³»3»»»³‡ÿó»³3»³ÿx338ÿ÷»°³·ÿpƒ»¸ÿ÷»0»?ÿpx»·ÿÿÿ;0;?ÿÿ÷»·ÿÿÿ;0;?ÿÿ÷»·ÿÿÿ;?ÿÿ÷»³ÿÿ÷³¸ÿÿø»»?ÿó³3ÿó»³³ˆ;° 8x;03»³;»³3üÿþÿþÿüüøðàààÀàààðøøøðððððøøüþþÿÿ0?ÿ€ýÿÁÿÿ( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ »» °wpðÿÿÿÿÿÿŸŸøˆððÿ »»€ »»»°€ °»°° »»» » °»»°» °€¸ 0ø ð0°ÿ ð°;»° »° »àÀÀ€€€€ÀÀÀÀÀààðøcpygame-1.9.1release/lib/pkgdata.py0000644000175000017500000000422611207055754017010 0ustar vincentvincent""" pkgdata is a simple, extensible way for a package to acquire data file resources. The getResource function is equivalent to the standard idioms, such as the following minimal implementation: import sys, os def getResource(identifier, pkgname=__name__): pkgpath = os.path.dirname(sys.modules[pkgname].__file__) path = os.path.join(pkgpath, identifier) return file(os.path.normpath(path), mode='rb') When a __loader__ is present on the module given by __name__, it will defer getResource to its get_data implementation and return it as a file-like object (such as StringIO). """ __all__ = ['getResource'] import sys import os from pygame.compat import get_BytesIO BytesIO = get_BytesIO() try: from pkg_resources import resource_stream, resource_exists except ImportError: def resource_exists(package_or_requirement, resource_name): return False def resource_stream(package_of_requirement, resource_name): raise NotImplementedError def getResource(identifier, pkgname=__name__): """ Acquire a readable object for a given package name and identifier. An IOError will be raised if the resource can not be found. For example: mydata = getResource('mypkgdata.jpg').read() Note that the package name must be fully qualified, if given, such that it would be found in sys.modules. In some cases, getResource will return a real file object. In that case, it may be useful to use its name attribute to get the path rather than use it as a file-like object. For example, you may be handing data off to a C API. """ if resource_exists(pkgname, identifier): return resource_stream(pkgname, identifier) mod = sys.modules[pkgname] fn = getattr(mod, '__file__', None) if fn is None: raise IOError("%s has no __file__!" % repr(mod)) path = os.path.join(os.path.dirname(fn), identifier) loader = getattr(mod, '__loader__', None) if loader is not None: try: data = loader.get_data(path) except IOError: pass else: return BytesIO(data) return open(os.path.normpath(path), 'rb') pygame-1.9.1release/lib/midi.py0000644000175000017500000005171711210672261016316 0ustar vincentvincent"""pygame.midi pygame module for interacting with midi input and output. The midi module can send output to midi devices, and get input from midi devices. It can also list midi devices on the system. Including real midi devices, and virtual ones. It uses the portmidi library. Is portable to which ever platforms portmidi supports (currently windows, OSX, and linux). This uses pyportmidi for now, but may use its own bindings at some point in the future. The pyportmidi bindings are included with pygame. New in pygame 1.9.0. """ #TODO: # - finish writing tests. # - likely as interactive tests... so you'd need to plug in a midi device. # - create a background thread version for input threads. # - that can automatically inject input into the event queue # once the input object is running. Like joysticks. import pygame import pygame.locals import atexit # MIDIIN = pygame.locals.USEREVENT + 10 MIDIOUT = pygame.locals.USEREVENT + 11 _init = False _pypm = None __all__ = [ "Input", "MIDIIN", "MIDIOUT", "MidiException", "Output", "get_count", "get_default_input_id", "get_default_output_id", "get_device_info", "init", "midis2events", "quit", "time", ] __theclasses__ = ["Input", "Output"] def init(): """initialize the midi module pygame.midi.init(): return None Call the initialisation function before using the midi module. It is safe to call this more than once. """ global _init, _pypm if not _init: import pygame.pypm _pypm = pygame.pypm _pypm.Initialize() _init = True atexit.register(quit) def quit(): """uninitialize the midi module pygame.midi.quit(): return None Called automatically atexit if you don't call it. It is safe to call this function more than once. """ global _init, _pypm if _init: # TODO: find all Input and Output classes and close them first? _pypm.Terminate() _init = False del _pypm #del pygame._pypm def _check_init(): if not _init: raise RuntimeError("pygame.midi not initialised.") def get_count(): """gets the number of devices. pygame.midi.get_count(): return num_devices Device ids range from 0 to get_count() -1 """ _check_init() return _pypm.CountDevices() def get_default_input_id(): """gets default input device number pygame.midi.get_default_input_id(): return default_id Return the default device ID or -1 if there are no devices. The result can be passed to the Input()/Ouput() class. On the PC, the user can specify a default device by setting an environment variable. For example, to use device #1. set PM_RECOMMENDED_INPUT_DEVICE=1 The user should first determine the available device ID by using the supplied application "testin" or "testout". In general, the registry is a better place for this kind of info, and with USB devices that can come and go, using integers is not very reliable for device identification. Under Windows, if PM_RECOMMENDED_OUTPUT_DEVICE (or PM_RECOMMENDED_INPUT_DEVICE) is *NOT* found in the environment, then the default device is obtained by looking for a string in the registry under: HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Input_Device and HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Output_Device for a string. The number of the first device with a substring that matches the string exactly is returned. For example, if the string in the registry is "USB", and device 1 is named "In USB MidiSport 1x1", then that will be the default input because it contains the string "USB". In addition to the name, get_device_info() returns "interf", which is the interface name. (The "interface" is the underlying software system or API used by PortMidi to access devices. Examples are MMSystem, DirectX (not implemented), ALSA, OSS (not implemented), etc.) At present, the only Win32 interface is "MMSystem", the only Linux interface is "ALSA", and the only Max OS X interface is "CoreMIDI". To specify both the interface and the device name in the registry, separate the two with a comma and a space, e.g.: MMSystem, In USB MidiSport 1x1 In this case, the string before the comma must be a substring of the "interf" string, and the string after the space must be a substring of the "name" name string in order to match the device. Note: in the current release, the default is simply the first device (the input or output device with the lowest PmDeviceID). """ return _pypm.GetDefaultInputDeviceID() def get_default_output_id(): """gets default output device number pygame.midi.get_default_output_id(): return default_id Return the default device ID or -1 if there are no devices. The result can be passed to the Input()/Ouput() class. On the PC, the user can specify a default device by setting an environment variable. For example, to use device #1. set PM_RECOMMENDED_OUTPUT_DEVICE=1 The user should first determine the available device ID by using the supplied application "testin" or "testout". In general, the registry is a better place for this kind of info, and with USB devices that can come and go, using integers is not very reliable for device identification. Under Windows, if PM_RECOMMENDED_OUTPUT_DEVICE (or PM_RECOMMENDED_INPUT_DEVICE) is *NOT* found in the environment, then the default device is obtained by looking for a string in the registry under: HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Input_Device and HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Output_Device for a string. The number of the first device with a substring that matches the string exactly is returned. For example, if the string in the registry is "USB", and device 1 is named "In USB MidiSport 1x1", then that will be the default input because it contains the string "USB". In addition to the name, get_device_info() returns "interf", which is the interface name. (The "interface" is the underlying software system or API used by PortMidi to access devices. Examples are MMSystem, DirectX (not implemented), ALSA, OSS (not implemented), etc.) At present, the only Win32 interface is "MMSystem", the only Linux interface is "ALSA", and the only Max OS X interface is "CoreMIDI". To specify both the interface and the device name in the registry, separate the two with a comma and a space, e.g.: MMSystem, In USB MidiSport 1x1 In this case, the string before the comma must be a substring of the "interf" string, and the string after the space must be a substring of the "name" name string in order to match the device. Note: in the current release, the default is simply the first device (the input or output device with the lowest PmDeviceID). """ _check_init() return _pypm.GetDefaultOutputDeviceID() def get_device_info(an_id): """ returns information about a midi device pygame.midi.get_device_info(an_id): return (interf, name, input, output, opened) interf - a text string describing the device interface, eg 'ALSA'. name - a text string for the name of the device, eg 'Midi Through Port-0' input - 0, or 1 if the device is an input device. output - 0, or 1 if the device is an output device. opened - 0, or 1 if the device is opened. If the id is out of range, the function returns None. """ _check_init() return _pypm.GetDeviceInfo(an_id) class Input(object): """Input is used to get midi input from midi devices. Input(device_id) Input(device_id, buffer_size) buffer_size -the number of input events to be buffered waiting to be read using Input.read() """ def __init__(self, device_id, buffer_size=4096): """ The buffer_size specifies the number of input events to be buffered waiting to be read using Input.read(). """ _check_init() if device_id == -1: raise MidiException("Device id is -1, not a valid output id. -1 usually means there were no default Output devices.") try: r = get_device_info(device_id) except TypeError: raise TypeError("an integer is required") except OverflowError: raise OverflowError("long int too large to convert to int") # and now some nasty looking error checking, to provide nice error # messages to the kind, lovely, midi using people of whereever. if r: interf, name, input, output, opened = r if input: try: self._input = _pypm.Input(device_id, buffer_size) except TypeError: raise TypeError("an integer is required") self.device_id = device_id elif output: raise MidiException("Device id given is not a valid input id, it is an output id.") else: raise MidiException("Device id given is not a valid input id.") else: raise MidiException("Device id invalid, out of range.") def _check_open(self): if self._input is None: raise MidiException("midi not open.") def close(self): """ closes a midi stream, flushing any pending buffers. Input.close(): return None PortMidi attempts to close open streams when the application exits -- this is particularly difficult under Windows. """ _check_init() if not (self._input is None): self._input.Close() self._input = None def read(self, num_events): """reads num_events midi events from the buffer. Input.read(num_events): return midi_event_list Reads from the Input buffer and gives back midi events. [[[status,data1,data2,data3],timestamp], [[status,data1,data2,data3],timestamp],...] """ _check_init() self._check_open() return self._input.Read(num_events) def poll(self): """returns true if there's data, or false if not. Input.poll(): return Bool raises a MidiException on error. """ _check_init() self._check_open() r = self._input.Poll() if r == _pypm.TRUE: return True elif r == _pypm.FALSE: return False else: err_text = GetErrorText(r) raise MidiException( (r, err_text) ) class Output(object): """Output is used to send midi to an output device Output(device_id) Output(device_id, latency = 0) Output(device_id, buffer_size = 4096) Output(device_id, latency, buffer_size) The buffer_size specifies the number of output events to be buffered waiting for output. (In some cases -- see below -- PortMidi does not buffer output at all and merely passes data to a lower-level API, in which case buffersize is ignored.) latency is the delay in milliseconds applied to timestamps to determine when the output should actually occur. (If latency is < 0, 0 is assumed.) If latency is zero, timestamps are ignored and all output is delivered immediately. If latency is greater than zero, output is delayed until the message timestamp plus the latency. (NOTE: time is measured relative to the time source indicated by time_proc. Timestamps are absolute, not relative delays or offsets.) In some cases, PortMidi can obtain better timing than your application by passing timestamps along to the device driver or hardware. Latency may also help you to synchronize midi data to audio data by matching midi latency to the audio buffer latency. """ def __init__(self, device_id, latency = 0, buffer_size = 4096): """Output(device_id) Output(device_id, latency = 0) Output(device_id, buffer_size = 4096) Output(device_id, latency, buffer_size) The buffer_size specifies the number of output events to be buffered waiting for output. (In some cases -- see below -- PortMidi does not buffer output at all and merely passes data to a lower-level API, in which case buffersize is ignored.) latency is the delay in milliseconds applied to timestamps to determine when the output should actually occur. (If latency is < 0, 0 is assumed.) If latency is zero, timestamps are ignored and all output is delivered immediately. If latency is greater than zero, output is delayed until the message timestamp plus the latency. (NOTE: time is measured relative to the time source indicated by time_proc. Timestamps are absolute, not relative delays or offsets.) In some cases, PortMidi can obtain better timing than your application by passing timestamps along to the device driver or hardware. Latency may also help you to synchronize midi data to audio data by matching midi latency to the audio buffer latency. """ _check_init() self._aborted = 0 if device_id == -1: raise MidiException("Device id is -1, not a valid output id. -1 usually means there were no default Output devices.") try: r = get_device_info(device_id) except TypeError: raise TypeError("an integer is required") except OverflowError: raise OverflowError("long int too large to convert to int") # and now some nasty looking error checking, to provide nice error # messages to the kind, lovely, midi using people of whereever. if r: interf, name, input, output, opened = r if output: try: self._output = _pypm.Output(device_id, latency) except TypeError: raise TypeError("an integer is required") self.device_id = device_id elif input: raise MidiException("Device id given is not a valid output id, it is an input id.") else: raise MidiException("Device id given is not a valid output id.") else: raise MidiException("Device id invalid, out of range.") def _check_open(self): if self._output is None: raise MidiException("midi not open.") if self._aborted: raise MidiException("midi aborted.") def close(self): """ closes a midi stream, flushing any pending buffers. Output.close(): return None PortMidi attempts to close open streams when the application exits -- this is particularly difficult under Windows. """ _check_init() if not (self._output is None): self._output.Close() self._output = None def abort(self): """terminates outgoing messages immediately Output.abort(): return None The caller should immediately close the output port; this call may result in transmission of a partial midi message. There is no abort for Midi input because the user can simply ignore messages in the buffer and close an input device at any time. """ _check_init() if self._output: self._output.Abort() self._aborted = 1 def write(self, data): """writes a list of midi data to the Output Output.write(data) writes series of MIDI information in the form of a list: write([[[status <,data1><,data2><,data3>],timestamp], [[status <,data1><,data2><,data3>],timestamp],...]) fields are optional example: choose program change 1 at time 20000 and send note 65 with velocity 100 500 ms later. write([[[0xc0,0,0],20000],[[0x90,60,100],20500]]) notes: 1. timestamps will be ignored if latency = 0. 2. To get a note to play immediately, send MIDI info with timestamp read from function Time. 3. understanding optional data fields: write([[[0xc0,0,0],20000]]) is equivalent to write([[[0xc0],20000]]) Can send up to 1024 elements in your data list, otherwise an IndexError exception is raised. """ _check_init() self._check_open() self._output.Write(data) def write_short(self, status, data1 = 0, data2 = 0): """write_short(status <, data1><, data2>) Output.write_short(status) Output.write_short(status, data1 = 0, data2 = 0) output MIDI information of 3 bytes or less. data fields are optional status byte could be: 0xc0 = program change 0x90 = note on etc. data bytes are optional and assumed 0 if omitted example: note 65 on with velocity 100 write_short(0x90,65,100) """ _check_init() self._check_open() self._output.WriteShort(status, data1, data2) def write_sys_ex(self, when, msg): """writes a timestamped system-exclusive midi message. Output.write_sys_ex(when, msg) msg - can be a *list* or a *string* when - a timestamp in miliseconds example: (assuming o is an onput MIDI stream) o.write_sys_ex(0,'\\xF0\\x7D\\x10\\x11\\x12\\x13\\xF7') is equivalent to o.write_sys_ex(pygame.midi.time(), [0xF0,0x7D,0x10,0x11,0x12,0x13,0xF7]) """ _check_init() self._check_open() self._output.WriteSysEx(when, msg) def note_on(self, note, velocity=None, channel = 0): """turns a midi note on. Note must be off. Output.note_on(note, velocity=None, channel = 0) Turn a note on in the output stream. The note must already be off for this to work correctly. """ if velocity is None: velocity = 0 if not (0 <= channel <= 15): raise ValueError("Channel not between 0 and 15.") self.write_short(0x90+channel, note, velocity) def note_off(self, note, velocity=None, channel = 0): """turns a midi note off. Note must be on. Output.note_off(note, velocity=None, channel = 0) Turn a note off in the output stream. The note must already be on for this to work correctly. """ if velocity is None: velocity = 0 if not (0 <= channel <= 15): raise ValueError("Channel not between 0 and 15.") self.write_short(0x80 + channel, note, velocity) def set_instrument(self, instrument_id, channel = 0): """select an instrument, with a value between 0 and 127 Output.set_instrument(instrument_id, channel = 0) """ if not (0 <= instrument_id <= 127): raise ValueError("Undefined instrument id: %d" % instrument_id) if not (0 <= channel <= 15): raise ValueError("Channel not between 0 and 15.") self.write_short(0xc0+channel, instrument_id) def time(): """returns the current time in ms of the PortMidi timer pygame.midi.time(): return time The time is reset to 0, when the module is inited. """ return _pypm.Time() def midis2events(midis, device_id): """converts midi events to pygame events pygame.midi.midis2events(midis, device_id): return [Event, ...] Takes a sequence of midi events and returns list of pygame events. """ evs = [] for midi in midis: ((status,data1,data2,data3),timestamp) = midi e = pygame.event.Event(MIDIIN, status=status, data1=data1, data2=data2, data3=data3, timestamp=timestamp, vice_id = device_id) evs.append( e ) return evs class MidiException(Exception): """exception that pygame.midi functions and classes can raise MidiException(errno) """ def __init__(self, value): self.parameter = value def __str__(self): return repr(self.parameter) pygame-1.9.1release/lib/midi.doc0000644000175000017500000002532611210672261016430 0ustar vincentvincentpygame.midi pygame module for interacting with midi input and output. The midi module can send output to midi devices, and get input from midi devices. It can also list midi devices on the system. Including real midi devices, and virtual ones. It uses the portmidi library. Is portable to which ever platforms portmidi supports (currently windows, OSX, and linux). This uses pyportmidi for now, but may use its own bindings at some point in the future. The pyportmidi bindings are included with pygame. New in pygame 1.9.0.
    Input Input is used to get midi input from midi devices. Input(device_id) Input(device_id, buffer_size) buffer_size -the number of input events to be buffered waiting to be read using Input.read()
    close closes a midi stream, flushing any pending buffers. Input.close(): return None PortMidi attempts to close open streams when the application exits -- this is particularly difficult under Windows. poll returns true if there's data, or false if not. Input.poll(): return Bool raises a MidiException on error. read reads num_events midi events from the buffer. Input.read(num_events): return midi_event_list Reads from the Input buffer and gives back midi events. [[[status,data1,data2,data3],timestamp], [[status,data1,data2,data3],timestamp],...] MidiException exception that pygame.midi functions and classes can raise MidiException(errno) Output Output is used to send midi to an output device Output(device_id) Output(device_id, latency = 0) Output(device_id, buffer_size = 4096) Output(device_id, latency, buffer_size) The buffer_size specifies the number of output events to be buffered waiting for output. (In some cases -- see below -- PortMidi does not buffer output at all and merely passes data to a lower-level API, in which case buffersize is ignored.) latency is the delay in milliseconds applied to timestamps to determine when the output should actually occur. (If latency is < 0, 0 is assumed.) If latency is zero, timestamps are ignored and all output is delivered immediately. If latency is greater than zero, output is delayed until the message timestamp plus the latency. (NOTE: time is measured relative to the time source indicated by time_proc. Timestamps are absolute, not relative delays or offsets.) In some cases, PortMidi can obtain better timing than your application by passing timestamps along to the device driver or hardware. Latency may also help you to synchronize midi data to audio data by matching midi latency to the audio buffer latency.
    abort terminates outgoing messages immediately Output.abort(): return None The caller should immediately close the output port; this call may result in transmission of a partial midi message. There is no abort for Midi input because the user can simply ignore messages in the buffer and close an input device at any time. close closes a midi stream, flushing any pending buffers. Output.close(): return None PortMidi attempts to close open streams when the application exits -- this is particularly difficult under Windows. note_off turns a midi note off. Note must be on. Output.note_off(note, velocity=None, channel = 0) Turn a note off in the output stream. The note must already be on for this to work correctly. note_on turns a midi note on. Note must be off. Output.note_on(note, velocity=None, channel = 0) Turn a note on in the output stream. The note must already be off for this to work correctly. set_instrument select an instrument, with a value between 0 and 127 Output.set_instrument(instrument_id, channel = 0) write writes a list of midi data to the Output Output.write(data) writes series of MIDI information in the form of a list: write([[[status <,data1><,data2><,data3>],timestamp], [[status <,data1><,data2><,data3>],timestamp],...]) fields are optional example: choose program change 1 at time 20000 and send note 65 with velocity 100 500 ms later. write([[[0xc0,0,0],20000],[[0x90,60,100],20500]]) notes: 1. timestamps will be ignored if latency = 0. 2. To get a note to play immediately, send MIDI info with timestamp read from function Time. 3. understanding optional data fields: write([[[0xc0,0,0],20000]]) is equivalent to write([[[0xc0],20000]]) Can send up to 1024 elements in your data list, otherwise an IndexError exception is raised. write_short write_short(status <, data1><, data2>) Output.write_short(status) Output.write_short(status, data1 = 0, data2 = 0) output MIDI information of 3 bytes or less. data fields are optional status byte could be: 0xc0 = program change 0x90 = note on etc. data bytes are optional and assumed 0 if omitted example: note 65 on with velocity 100 write_short(0x90,65,100) write_sys_ex writes a timestamped system-exclusive midi message. Output.write_sys_ex(when, msg) msg - can be a *list* or a *string* when - a timestamp in miliseconds example: (assuming o is an onput MIDI stream) o.write_sys_ex(0,'\xF0\x7D\x10\x11\x12\x13\xF7') is equivalent to o.write_sys_ex(pygame.midi.time(), [0xF0,0x7D,0x10,0x11,0x12,0x13,0xF7]) get_count gets the number of devices. pygame.midi.get_count(): return num_devices Device ids range from 0 to get_count() -1 get_default_input_id gets default input device number pygame.midi.get_default_input_id(): return default_id Return the default device ID or -1 if there are no devices. The result can be passed to the Input()/Ouput() class. On the PC, the user can specify a default device by setting an environment variable. For example, to use device #1. set PM_RECOMMENDED_INPUT_DEVICE=1 The user should first determine the available device ID by using the supplied application "testin" or "testout". In general, the registry is a better place for this kind of info, and with USB devices that can come and go, using integers is not very reliable for device identification. Under Windows, if PM_RECOMMENDED_OUTPUT_DEVICE (or PM_RECOMMENDED_INPUT_DEVICE) is *NOT* found in the environment, then the default device is obtained by looking for a string in the registry under: HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Input_Device and HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Output_Device for a string. The number of the first device with a substring that matches the string exactly is returned. For example, if the string in the registry is "USB", and device 1 is named "In USB MidiSport 1x1", then that will be the default input because it contains the string "USB". In addition to the name, get_device_info() returns "interf", which is the interface name. (The "interface" is the underlying software system or API used by PortMidi to access devices. Examples are MMSystem, DirectX (not implemented), ALSA, OSS (not implemented), etc.) At present, the only Win32 interface is "MMSystem", the only Linux interface is "ALSA", and the only Max OS X interface is "CoreMIDI". To specify both the interface and the device name in the registry, separate the two with a comma and a space, e.g.: MMSystem, In USB MidiSport 1x1 In this case, the string before the comma must be a substring of the "interf" string, and the string after the space must be a substring of the "name" name string in order to match the device. Note: in the current release, the default is simply the first device (the input or output device with the lowest PmDeviceID). get_default_output_id gets default output device number pygame.midi.get_default_output_id(): return default_id Return the default device ID or -1 if there are no devices. The result can be passed to the Input()/Ouput() class. On the PC, the user can specify a default device by setting an environment variable. For example, to use device #1. set PM_RECOMMENDED_OUTPUT_DEVICE=1 The user should first determine the available device ID by using the supplied application "testin" or "testout". In general, the registry is a better place for this kind of info, and with USB devices that can come and go, using integers is not very reliable for device identification. Under Windows, if PM_RECOMMENDED_OUTPUT_DEVICE (or PM_RECOMMENDED_INPUT_DEVICE) is *NOT* found in the environment, then the default device is obtained by looking for a string in the registry under: HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Input_Device and HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Output_Device for a string. The number of the first device with a substring that matches the string exactly is returned. For example, if the string in the registry is "USB", and device 1 is named "In USB MidiSport 1x1", then that will be the default input because it contains the string "USB". In addition to the name, get_device_info() returns "interf", which is the interface name. (The "interface" is the underlying software system or API used by PortMidi to access devices. Examples are MMSystem, DirectX (not implemented), ALSA, OSS (not implemented), etc.) At present, the only Win32 interface is "MMSystem", the only Linux interface is "ALSA", and the only Max OS X interface is "CoreMIDI". To specify both the interface and the device name in the registry, separate the two with a comma and a space, e.g.: MMSystem, In USB MidiSport 1x1 In this case, the string before the comma must be a substring of the "interf" string, and the string after the space must be a substring of the "name" name string in order to match the device. Note: in the current release, the default is simply the first device (the input or output device with the lowest PmDeviceID). get_device_info returns information about a midi device pygame.midi.get_device_info(an_id): return (interf, name, input, output, opened) interf - a text string describing the device interface, eg 'ALSA'. name - a text string for the name of the device, eg 'Midi Through Port-0' input - 0, or 1 if the device is an input device. output - 0, or 1 if the device is an output device. opened - 0, or 1 if the device is opened. If the id is out of range, the function returns None. init initialize the midi module pygame.midi.init(): return None Call the initialisation function before using the midi module. It is safe to call this more than once. midis2events converts midi events to pygame events pygame.midi.midis2events(midis, device_id): return [Event, ...] Takes a sequence of midi events and returns list of pygame events. quit uninitialize the midi module pygame.midi.quit(): return None Called automatically atexit if you don't call it. It is safe to call this function more than once. time returns the current time in ms of the PortMidi timer pygame.midi.time(): return time The time is reset to 0, when the module is inited. pygame-1.9.1release/lib/macosx.py0000644000175000017500000000156711225305200016654 0ustar vincentvincentimport os, sys try: import MacOS except: MacOS = None from pygame.pkgdata import getResource from pygame import sdlmain_osx __all__ = ['Video_AutoInit'] def Video_AutoInit(): """This is a function that's called from the c extension code just before the display module is initialized""" if MacOS and not MacOS.WMAvailable(): if not sdlmain_osx.WMEnable(): raise ImportError("Can not access the window manager. Use py2app or execute with the pythonw script.") if not sdlmain_osx.RunningFromBundleWithNSApplication(): try: default_icon_data = getResource('pygame_icon.tiff').read() except IOError: default_icon_data = None sdlmain_osx.InstallNSApplication(default_icon_data) if (os.getcwd() == '/') and len(sys.argv) > 1: os.chdir(os.path.dirname(sys.argv[0])) return True pygame-1.9.1release/lib/mac_scrap.py0000644000175000017500000001054311207055754017324 0ustar vincentvincent# # These methods are called internally by pygame.scrap # from AppKit import * from Foundation import * import sys import tempfile import pygame.image from pygame.locals import SCRAP_TEXT, SCRAP_BMP, SCRAP_SELECTION, SCRAP_CLIPBOARD from cStringIO import StringIO from pygame.compat import unicode_ ScrapPboardType = unicode_('org.pygame.scrap') err = "Only text has been implemented for scrap on mac. See lib/mac_scrap.py to debug." def init(): return 1 def get(scrap_type): board = NSPasteboard.generalPasteboard() if 0: print (board.types) print (dir(board.types)) print (dir(board)) print (board.__doc__) if scrap_type == SCRAP_TEXT: return board.stringForType_(NSStringPboardType) elif 1: raise NotImplementedError(err) elif 0 and scrap_type == SCRAP_BMP: # We could try loading directly but I don't trust pygame's TIFF # loading. This is slow and stupid but it does happen to work. if not NSImage.canInitWithPasteboard_(board): return None img = NSImage.alloc().initWithPasteboard_(board) data = img.TIFFRepresentation() rep = NSBitmapImageRep.alloc().initWithData_(data) if rep is None: return None # bug with bmp, out of memory error... so we use png. #data = rep.representationUsingType_properties_(NSBMPFileType, None) data = rep.representationUsingType_properties_(NSPNGFileType, None) bmp = StringIO(data) return pygame.image.load(bmp, "scrap.png") #elif scrap_type in board.types: elif scrap_type == SCRAP_BMP: return board.dataForType_(scrap_type) else: return board.stringForType_(scrap_type) def put(scrap_type, thing): board = NSPasteboard.generalPasteboard() if scrap_type == SCRAP_TEXT: board.declareTypes_owner_([NSStringPboardType, ScrapPboardType], None) if isinstance(thing, unicode): text_thing = thing else: text_thing = unicode(thing, 'utf-8') board.setString_forType_(text_thing, NSStringPboardType) board.setString_forType_(unicode_(''), ScrapPboardType) elif 1: raise NotImplementedError(err) elif 0 and scrap_type == SCRAP_BMP: # Don't use this code... we put the data in as a string. #if type(thing) != type(pygame.Surface((1,1))): # thing = pygame.image.fromstring(thing, len(thing) * 4, "RGBA") # This is pretty silly, we shouldn't have to do this... fh = tempfile.NamedTemporaryFile(suffix='.png') pygame.image.save(thing, fh.name) path = fh.name if not isinstance(path, unicode): path = unicode(path, sys.getfilesystemencoding()) img = NSImage.alloc().initByReferencingFile_(path) tiff = img.TIFFRepresentation() fh.close() board.declareTypes_owner_([NSTIFFPboardType, ScrapPboardType], None) board.setData_forType_(tiff, NSTIFFPboardType) board.setString_forType_(unicode_(''), ScrapPboardType) elif scrap_type == SCRAP_BMP: other_type = scrap_type board.declareTypes_owner_([other_type], None) board.setData_forType_(thing, other_type) else: other_type = scrap_type if 0: board.declareTypes_owner_([NSStringPboardType, other_type], None) board.setString_forType_(text_thing, NSStringPboardType) elif 0: board.declareTypes_owner_([other_type], None) #board.setString_forType_(thing, other_type) board.setData_forType_(thing, other_type) else: board.declareTypes_owner_([NSStringPboardType, other_type], None) board.setString_forType_(thing, NSStringPboardType) #board.setData_forType_(thing, other_type) def set_mode (mode): # No diversion between clipboard and selection modes on MacOS X. if mode not in [SCRAP_SELECTION, SCRAP_CLIPBOARD]: raise ValueError("invalid clipboard mode") def contains (scrap_type): return scrap_type in NSPasteboard.generalPasteboard ().types () def get_types (): typelist = [] types = NSPasteboard.generalPasteboard ().types () for t in types: typelist.append (t) return typelist def lost (): board = NSPasteboard.generalPasteboard () return not board.availableTypeFromArray_ ([ScrapPboardType]) pygame-1.9.1release/lib/locals.py0000644000175000017500000000211611207055754016646 0ustar vincentvincent## pygame - Python Game Library ## Copyright (C) 2000-2003 Pete Shinners ## ## This library is free software; you can redistribute it and/or ## modify it under the terms of the GNU Library General Public ## License as published by the Free Software Foundation; either ## version 2 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 ## Library General Public License for more details. ## ## You should have received a copy of the GNU Library General Public ## License along with this library; if not, write to the Free ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## ## Pete Shinners ## pete@shinners.org """Set of functions from PyGame that are handy to have in the local namespace for your module""" from pygame.constants import * from pygame.rect import Rect import pygame.color as color Color = color.Color pygame-1.9.1release/lib/locals.doc0000644000175000017500000000131511205140452016747 0ustar vincentvincentpygame.locals pygame constants This module contains various constants used by Pygame. It's contents are automatically placed in the pygame module namespace. However, an application can use pygame.locals to include only the Pygame constants with a 'from pygame.locals import *'. Detailed descriptions of the various constants are found throughout the Pygame documentation. pygame.display.set_mode flags like HWSURFACE are found in the Display section. Event types are explained in the Event section. Keyboard K_ constants relating to the key attribute of a KEYDOWN or KEYUP event are listed in the Key section. Also found there are the various MOD_ key modifiers. Finally, TIMER_RESOLUTION is defined in Time. pygame-1.9.1release/lib/examples.doc0000644000175000017500000003100311202634563017315 0ustar vincentvincentpygame.examples module of example programs These examples should help get you started with pygame. Here is a brief rundown of what you get. The source code for these examples is in the public domain. Feel free to use for your own projects. There are several ways to run the examples. First they can be run as stand-alone programs. Second they can be imported and their main() methods called (see below). Finally, the easiest way is to use the python -m option: python -m pygame.examples.<example name> <example arguments> eg: python -m pygame.examples.scaletest someimage.png Resources for the examples are found in the pygame/examples/data subdirectory. We're always on the lookout for more examples and/or example requests. Code like this is probably the best way to start getting involved with python gaming. This page is adapted from the original examples readme.txt by: Pete Shinners shredwheat@mediaone.net Further references pySDL : http://pysdl.sourceforge.net SDL : http://www.libsdl.org aliens.c : http://www.libsdl.org/projects/aliens examples as a package is new to pygame 1.9.0.
    aliens.main play the full aliens example pygame.aliens.main(): return None This started off as a port of the SDL demonstration, Aliens. Now it has evolved into something sort of resembling fun. This demonstrates a lot of different uses of sprites and optimized blitting. Also transparency, colorkeys, fonts, sound, music, joystick, and more. (PS, my high score is 117! goodluck) oldalien.main play the original aliens example pygame.examples.oldalien.main(): return None This more closely resembles a port of the SDL Aliens demo. The code is a lot simpler, so it makes a better starting point for people looking at code for the first times. These blitting routines are not as optimized as they should/could be, but the code is easier to follow, and it plays quick enough. stars.main run a simple starfield example pygame.examples.stars.main(): return None A simple starfield example. You can change the center of perspective by leftclicking the mouse on the screen. chimp.main hit the moving chimp pygame.examples.chimp.main(): return None This simple example is derived from the line-by-line tutorial that comes with pygame. It is based on a 'popular' web banner. Note there are comments here, but for the full explanation, follow along in the tutorial. moveit.main display animated objects on the screen pygame.examples.moveit.main(): return None This is the full and final example from the Pygame Tutorial, "How Do I Make It Move". It creates 10 objects and animates them on the screen. Note it's a bit scant on error checking, but it's easy to read. :] Fortunately, this is python, and we needn't wrestle with a pile of error codes. fonty.main run a font rendering example pygame.examples.fonty.main(): return None Super quick, super simple application demonstrating the different ways to render fonts with the font module vgrade.main display a vertical gradient pygame.examples.vgrade.main(): return None Demonstrates creating a vertical gradient with NumPy python. The app will create a new gradient every half second and report the time needed to create and display the image. If you're not prepared to start working with the NumPy arrays, don't worry about the source for this one :] eventlist.main display pygame events pygame.examples.eventlist.main(): return None Eventlist is a sloppy style of pygame, but is a handy tool for learning about pygame events and input. At the top of the screen are the state of several device values, and a scrolling list of events are displayed on the bottom. This is not quality 'ui' code at all, but you can see how to implement very non-interactive status displays, or even a crude text output control. arraydemo.main show various surfarray effects pygame.examples.arraydemo.main(arraytype=None): return None Another example filled with various surfarray effects. It requires the surfarray and image modules to be installed. This little demo can also make a good starting point for any of your own tests with surfarray If arraytype is provided then use that array package. Valid values are 'numeric' or 'numpy'. Otherwise default to NumPy, or fall back on Numeric if NumPy is not installed. As a program surfarray.py accepts an optional --numeric or --numpy flag. (New pygame 1.9.0) sound.main load and play a sound pygame.examples.sound.main(file_path=None): return None Extremely basic testing of the mixer module. Load a sound and play it. All from the command shell, no graphics. If provided, use the audio file 'file_path', otherwise use a default file. sound.py optional command line argument: an audio file sound_array_demos.main play various sndarray effects pygame.examples.sound_array_demos.main(arraytype=None): return None If arraytype is provided then use that array package. Valid values are 'numeric' or 'numpy'. Otherwise default to NumPy, or fall back on Numeric if NumPy is not installed. Uses sndarray and NumPy ( or Numeric) to create offset faded copies of the original sound. Currently it just uses hardcoded values for the number of echos and the delay. Easy for you to recreate as needed. Run as a program sound_array_demos.py takes an optional command line option, --numpy or --numeric, specifying which array package to use. liquid.main display an animated liquid effect pygame.examples.liquid.main(): return None This example was created in a quick comparison with the BlitzBasic gaming language. Nonetheless, it demonstrates a quick 8-bit setup (with colormap). glcube.main display an animated 3D cube using OpenGL pygame.examples.glcube.main(): return None Using PyOpenGL and pygame, this creates a spinning 3D multicolored cube. scrap_clipboard.main access the clipboard pygame.examples.scrap_clipboard.main(): return None A simple demonstration example for the clipboard support. mask.main display multiple images bounce off each other using collision detection pygame.examples.mask.main(*args): return None Positional arguments: one or more image file names. This pygame.masks demo will display multiple moving sprites bouncing off each other. More than one sprite image can be provided. If run as a program then mask.py takes one or more image files as command line arguments. testsprite.main show lots of sprites moving around pygame.examples.testsprite.main(update_rects = True, use_static = False, use_FastRenderGroup = False, screen_dims = [640, 480], use_alpha = False, flags = 0): return None Optional keyword arguments: update_rects - use the RenderUpdate sprite group class use_static - include non-moving images use_FastRenderGroup - Use the FastRenderGroup sprite group screen_dims - pygame window dimensions use_alpha - use alpha blending flags - additional display mode flags Like the testsprite.c that comes with sdl, this pygame version shows lots of sprites moving around. If run as a stand-alone program then no command line arguments are taken. headless_no_windows_needed.main write an image file that is smoothscaled copy of an input file pygame.examples.headless_no_windows_needed.main(fin, fout, w, h): return None arguments: fin - name of an input image file fout - name of the output file to create/overwrite w, h - size of the rescaled image, as integer width and height How to use pygame with no windowing system, like on headless servers. Thumbnail generation with scaling is an example of what you can do with pygame. NOTE: the pygame scale function uses mmx/sse if available, and can be run in multiple threads. If headless_no_windows_needed.py is run as a program it takes the following command line arguments: -scale inputimage outputimage new_width new_height eg. -scale in.png outpng 50 50 fastevents.main stress test the fastevents module pygame.examples.fastevents.main(): return None This is a stress test for the fastevents module. *Fast events does not appear faster!* So far it looks like normal pygame.event is faster by up to two times. So maybe fastevent isn't fast at all. Tested on windowsXP sp2 athlon, and freebsd. However... on my debian duron 850 machine fastevents is faster. overlay.main play a .pgm video using overlays pygame.examples.overlay.main(fname): return None Play the .pgm video fila a path fname. If run as a program overlay.py takes the file name as a command line argument. blend_fill.main demonstrate the various surface.fill method blend options pygame.examples.blend_fill.main(): return None A interactive demo that lets one choose which BLEND_xxx option to apply to a surface. cursors.main display two different custom cursors pygame.examples.cursors.main(): return None Display an arrow or circle with crossbar cursor. pixelarray.main display various pixelarray generated effects pygame.examples.pixelarray.main(): return None Display various pixelarray generated effects. scaletest.main interactively scale an image using smoothscale pygame.examples.scaletest.main(imagefile, convert_alpha=False, run_speed_test=True): return None arguments: imagefile - file name of source image (required) convert_alpha - use convert_alpha() on the surf (default False) run_speed_test - (default False) A smoothscale example that resized an image on the screen. Vertical and horizontal arrow keys are used to change the width and height of the displayed image. If the convert_alpha option is True then the source image is forced to have source alpha, whether or not the original images does. If run_speed_test is True then a background timing test is performed instead of the interactive scaler. If scaletest.py is run as a program then the command line options are: ImageFile [-t] [-convert_alpha] [-t] = Run Speed Test [-convert_alpha] = Use convert_alpha() on the surf. midi.main run a midi example pygame.examples.midi.main(mode='output', device_id=None): return None Arguments: mode - if 'output' run a midi keyboard output example 'input' run a midi event logger input example 'list' list available midi devices (default 'output') device_id - midi device number; if None then use the default midi input or output device for the system The output example shows how to translate mouse clicks or computer keyboard events into midi notes. It implements a rudimentary button widget and state machine. The input example shows how to translate midi input to pygame events. With the use of a virtual midi patch cord the output and input examples can be run as separate processes and connected so the keyboard output is displayed on a console. new to pygame 1.9.0 scroll.main run a Surface.scroll example that shows a magnified image pygame.examples.scroll.main(image_file=None): return None This example shows a scrollable image that has a zoom factor of eight. It uses the Surface.scroll function to shift the image on the display surface. A clip rectangle protects a margin area. If called as a function, the example accepts an optional image file path. If run as a program it takes an optional file path command line argument. If no file is provided a default image file is used. When running click on a black triangle to move one pixel in the direction the triangle points. Or use the arrow keys. Close the window or press ESC to quit. movieplayer.main play an MPEG movie pygame.examples.moveplayer.main(filepath): return None A simple movie player that plays an MPEG movie in a Pygame window. It showcases the pygame.movie module. The window adjusts to the size of the movie image. It is given a boarder to demonstrate that a movie can play autonomously in a sub- window. Also, the file is copied to a file like object to show that not just Python files can be used as a movie source. The pygame.movie module is problematic and may not work on all systems. It is intended to replace it with an ffmpeg based version. pygame-1.9.1release/lib/cursors.py0000644000175000017500000002325211207055754017075 0ustar vincentvincent## pygame - Python Game Library ## Copyright (C) 2000-2003 Pete Shinners ## ## This library is free software; you can redistribute it and/or ## modify it under the terms of the GNU Library General Public ## License as published by the Free Software Foundation; either ## version 2 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 ## Library General Public License for more details. ## ## You should have received a copy of the GNU Library General Public ## License along with this library; if not, write to the Free ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## ## Pete Shinners ## pete@shinners.org """Set of cursor resources available for use. These cursors come in a sequence of values that are needed as the arguments for pygame.mouse.set_cursor(). to dereference the sequence in place and create the cursor in one step, call like this; pygame.mouse.set_cursor(*pygame.cursors.arrow). Here is a list of available cursors; arrow, diamond, ball, broken_x, tri_left, tri_right There is also a sample string cursor named 'thickarrow_strings'. The compile() function can convert these string cursors into cursor byte data. """ #default pygame black arrow arrow = ((16, 16), (0, 0), (0x00,0x00,0x40,0x00,0x60,0x00,0x70,0x00,0x78,0x00,0x7C,0x00,0x7E,0x00,0x7F,0x00, 0x7F,0x80,0x7C,0x00,0x6C,0x00,0x46,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x00,0x00), (0x40,0x00,0xE0,0x00,0xF0,0x00,0xF8,0x00,0xFC,0x00,0xFE,0x00,0xFF,0x00,0xFF,0x80, 0xFF,0xC0,0xFF,0x80,0xFE,0x00,0xEF,0x00,0x4F,0x00,0x07,0x80,0x07,0x80,0x03,0x00)) diamond = ((16, 16), (7, 7), (0, 0, 1, 0, 3, 128, 7, 192, 14, 224, 28, 112, 56, 56, 112, 28, 56, 56, 28, 112, 14, 224, 7, 192, 3, 128, 1, 0, 0, 0, 0, 0), (1, 0, 3, 128, 7, 192, 15, 224, 31, 240, 62, 248, 124, 124, 248, 62, 124, 124, 62, 248, 31, 240, 15, 224, 7, 192, 3, 128, 1, 0, 0, 0)) ball = ((16, 16), (7, 7), (0, 0, 3, 192, 15, 240, 24, 248, 51, 252, 55, 252, 127, 254, 127, 254, 127, 254, 127, 254, 63, 252, 63, 252, 31, 248, 15, 240, 3, 192, 0, 0), (3, 192, 15, 240, 31, 248, 63, 252, 127, 254, 127, 254, 255, 255, 255, 255, 255, 255, 255, 255, 127, 254, 127, 254, 63, 252, 31, 248, 15, 240, 3, 192)) broken_x = ((16, 16), (7, 7), (0, 0, 96, 6, 112, 14, 56, 28, 28, 56, 12, 48, 0, 0, 0, 0, 0, 0, 0, 0, 12, 48, 28, 56, 56, 28, 112, 14, 96, 6, 0, 0), (224, 7, 240, 15, 248, 31, 124, 62, 62, 124, 30, 120, 14, 112, 0, 0, 0, 0, 14, 112, 30, 120, 62, 124, 124, 62, 248, 31, 240, 15, 224, 7)) tri_left = ((16, 16), (1, 1), (0, 0, 96, 0, 120, 0, 62, 0, 63, 128, 31, 224, 31, 248, 15, 254, 15, 254, 7, 128, 7, 128, 3, 128, 3, 128, 1, 128, 1, 128, 0, 0), (224, 0, 248, 0, 254, 0, 127, 128, 127, 224, 63, 248, 63, 254, 31, 255, 31, 255, 15, 254, 15, 192, 7, 192, 7, 192, 3, 192, 3, 192, 1, 128)) tri_right = ((16, 16), (14, 1), (0, 0, 0, 6, 0, 30, 0, 124, 1, 252, 7, 248, 31, 248, 127, 240, 127, 240, 1, 224, 1, 224, 1, 192, 1, 192, 1, 128, 1, 128, 0, 0), (0, 7, 0, 31, 0, 127, 1, 254, 7, 254, 31, 252, 127, 252, 255, 248, 255, 248, 127, 240, 3, 240, 3, 224, 3, 224, 3, 192, 3, 192, 1, 128)) #here is an example string resource cursor. to use this; # curs, mask = pygame.cursors.compile_cursor(pygame.cursors.thickarrow_strings, 'X', '.') # pygame.mouse.set_cursor((24, 24), (0, 0), curs, mask) thickarrow_strings = ( #sized 24x24 "XX ", "XXX ", "XXXX ", "XX.XX ", "XX..XX ", "XX...XX ", "XX....XX ", "XX.....XX ", "XX......XX ", "XX.......XX ", "XX........XX ", "XX........XXX ", "XX......XXXXX ", "XX.XXX..XX ", "XXXX XX..XX ", "XX XX..XX ", " XX..XX ", " XX..XX ", " XX..XX ", " XXXX ", " XX ", " ", " ", " ", ) sizer_x_strings = ( #sized 24x16 " X X ", " XX XX ", " X.X X.X ", " X..X X..X ", " X...XXXXXXXX...X ", "X................X ", " X...XXXXXXXX...X ", " X..X X..X ", " X.X X.X ", " XX XX ", " X X ", " ", " ", " ", " ", " ", ) sizer_y_strings = ( #sized 16x24 " X ", " X.X ", " X...X ", " X.....X ", " X.......X ", "XXXXX.XXXXX ", " X.X ", " X.X ", " X.X ", " X.X ", " X.X ", " X.X ", " X.X ", "XXXXX.XXXXX ", " X.......X ", " X.....X ", " X...X ", " X.X ", " X ", " ", " ", " ", " ", " ", ) sizer_xy_strings = ( #sized 24x16 "XXXXXXXX ", "X.....X ", "X....X ", "X...X ", "X..X.X ", "X.X X.X ", "XX X.X X ", "X X.X XX ", " X.XX.X ", " X...X ", " X...X ", " X....X ", " X.....X ", " XXXXXXXX ", " ", " ", ) textmarker_strings = ( #sized 8x16 "ooo ooo ", " o ", " o ", " o ", " o ", " o ", " o ", " o ", " o ", " o ", " o ", "ooo ooo ", " ", " ", " ", " ", ) def compile(strings, black='X', white='.',xor='o'): """pygame.cursors.compile(strings, black, white,xor) -> data, mask compile cursor strings into cursor data This takes a set of strings with equal length and computes the binary data for that cursor. The string widths must be divisible by 8. The black and white arguments are single letter strings that tells which characters will represent black pixels, and which characters represent white pixels. All other characters are considered clear. This returns a tuple containing the cursor data and cursor mask data. Both these arguments are used when setting a cursor with pygame.mouse.set_cursor(). """ #first check for consistent lengths size = len(strings[0]), len(strings) if size[0] % 8 or size[1] % 8: raise ValueError("cursor string sizes must be divisible by 8 %s" % size) for s in strings[1:]: if len(s) != size[0]: raise ValueError("Cursor strings are inconsistent lengths") #create the data arrays. #this could stand a little optimizing maskdata = [] filldata = [] maskitem = fillitem = 0 step = 8 for s in strings: for c in s: maskitem = maskitem << 1 fillitem = fillitem << 1 step = step - 1 if c == black: maskitem = maskitem | 1 elif c == white: maskitem = maskitem | 1 fillitem = fillitem | 1 elif c == xor: fillitem = fillitem | 1 if not step: maskdata.append(maskitem) filldata.append(fillitem) maskitem = fillitem = 0 step = 8 return tuple(filldata), tuple(maskdata) def load_xbm(curs, mask): """pygame.cursors.load_xbm(cursorfile, maskfile) -> cursor_args reads a pair of XBM files into set_cursor arguments Arguments can either be filenames or filelike objects with the readlines method. Not largely tested, but should work with typical XBM files. """ def bitswap(num): val = 0 for x in range(8): b = num&(1<>> pygame.mouse.set_cursor(*pygame.cursors.arrow) This module also contains a few cursors as formatted strings. You'll need to pass these to pygame.cursors.compile() function before you can use them. The example call would look like this: >>> cursor = pygame.cursors.compile(pygame.cursors.textmarker_strings) >>> pygame.mouse.set_cursor(*cursor) The following variables are cursor bitmaps that can be used as cursor: * pygame.cursors.arrow * pygame.cursors.diamond * pygame.cursors.broken_x * pygame.cursors.tri_left * pygame.cursors.tri_right The following strings can be converted into cursor bitmaps with pygame.cursors.compile() : * pygame.cursors.thickarrow_strings * pygame.cursors.sizer_x_strings * pygame.cursors.sizer_y_strings * pygame.cursors.sizer_xy_strings
    compile create binary cursor data from simple strings pygame.cursor.compile(strings, black='X', white='.', xor='o'): return data, mask A sequence of strings can be used to create binary cursor data for the system cursor. The return values are the same format needed by pygame.mouse.set_cursor(). If you are creating your own cursor strings, you can use any value represent the black and white pixels. Some system allow you to set a special toggle color for the system color, this is also called the xor color. If the system does not support xor cursors, that color will simply be black. The width of the strings must all be equal and be divisible by 8. An example set of cursor strings looks like this thickarrow_strings = ( #sized 24x24 "XX ", "XXX ", "XXXX ", "XX.XX ", "XX..XX ", "XX...XX ", "XX....XX ", "XX.....XX ", "XX......XX ", "XX.......XX ", "XX........XX ", "XX........XXX ", "XX......XXXXX ", "XX.XXX..XX ", "XXXX XX..XX ", "XX XX..XX ", " XX..XX ", " XX..XX ", " XX..XX ", " XXXX ", " XX ", " ", " ", " ") load_xbm load cursor data from an xbm file pygame.cursors.load_xbm(cursorfile): return cursor_args pygame.cursors.load_xbm(cursorfile, maskfile): return cursor_args This loads cursors for a simple subset of XBM files. XBM files are traditionally used to store cursors on unix systems, they are an ascii format used to represent simple images. Sometimes the black and white color values will be split into two separate XBM files. You can pass a second maskfile argument to load the two images into a single cursor. The cursorfile and maskfile arguments can either be filenames or filelike object with the readlines method. The return value cursor_args can be passed directly to the pygame.mouse.set_cursor() function. pygame-1.9.1release/lib/compat.py0000644000175000017500000000145111207055754016655 0ustar vincentvincent"""Python 2.x/3.x compatibility tools""" import sys __all__ = ['geterror', 'long_', 'xrange_', 'ord_', 'unichr_', 'unicode_', 'raw_input_'] def geterror (): return sys.exc_info()[1] try: long_ = long except NameError: long_ = int try: xrange_ = xrange except NameError: xrange_ = range def get_BytesIO(): try: from cStringIO import StringIO as BytesIO except ImportError: from io import BytesIO return BytesIO def ord_(o): try: return ord(o) except TypeError: return o try: unichr_ = unichr except NameError: unichr_ = chr try: unicode_ = unicode except NameError: unicode_ = str try: raw_input_ = raw_input except NameError: raw_input_ = input pygame-1.9.1release/lib/colordict.py0000644000175000017500000005701511207055754017363 0ustar vincentvincent## pygame - Python Game Library ## Copyright (C) 2000-2003 Pete Shinners ## ## This library is free software; you can redistribute it and/or ## modify it under the terms of the GNU Library General Public ## License as published by the Free Software Foundation; either ## version 2 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 ## Library General Public License for more details. ## ## You should have received a copy of the GNU Library General Public ## License along with this library; if not, write to the Free ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## ## Pete Shinners ## pete@shinners.org THECOLORS = { 'gray17' : (43, 43, 43, 255) , 'gold' : (255, 215, 0, 255) , 'gray10' : (26, 26, 26, 255) , 'yellow' : (255, 255, 0, 255) , 'gray11' : (28, 28, 28, 255) , 'grey61' : (156, 156, 156, 255) , 'grey60' : (153, 153, 153, 255) , 'darkseagreen' : (143, 188, 143, 255) , 'grey62' : (158, 158, 158, 255) , 'grey65' : (166, 166, 166, 255) , 'gray12' : (31, 31, 31, 255) , 'grey67' : (171, 171, 171, 255) , 'grey66' : (168, 168, 168, 255) , 'grey69' : (176, 176, 176, 255) , 'gray21' : (54, 54, 54, 255) , 'lightsalmon4' : (139, 87, 66, 255) , 'lightsalmon2' : (238, 149, 114, 255) , 'lightsalmon3' : (205, 129, 98, 255) , 'lightsalmon1' : (255, 160, 122, 255) , 'gray32' : (82, 82, 82, 255) , 'green4' : (0, 139, 0, 255) , 'gray30' : (77, 77, 77, 255) , 'gray31' : (79, 79, 79, 255) , 'green1' : (0, 255, 0, 255) , 'gray37' : (94, 94, 94, 255) , 'green3' : (0, 205, 0, 255) , 'green2' : (0, 238, 0, 255) , 'darkslategray1' : (151, 255, 255, 255) , 'darkslategray2' : (141, 238, 238, 255) , 'darkslategray3' : (121, 205, 205, 255) , 'aquamarine1' : (127, 255, 212, 255) , 'aquamarine3' : (102, 205, 170, 255) , 'aquamarine2' : (118, 238, 198, 255) , 'papayawhip' : (255, 239, 213, 255) , 'black' : (0, 0, 0, 255) , 'darkorange3' : (205, 102, 0, 255) , 'oldlace' : (253, 245, 230, 255) , 'lightgoldenrod4' : (139, 129, 76, 255) , 'gray90' : (229, 229, 229, 255) , 'orchid1' : (255, 131, 250, 255) , 'orchid2' : (238, 122, 233, 255) , 'orchid3' : (205, 105, 201, 255) , 'grey68' : (173, 173, 173, 255) , 'brown' : (165, 42, 42, 255) , 'purple2' : (145, 44, 238, 255) , 'gray80' : (204, 204, 204, 255) , 'antiquewhite3' : (205, 192, 176, 255) , 'antiquewhite2' : (238, 223, 204, 255) , 'antiquewhite1' : (255, 239, 219, 255) , 'palevioletred3' : (205, 104, 137, 255) , 'hotpink' : (255, 105, 180, 255) , 'lightcyan' : (224, 255, 255, 255) , 'coral3' : (205, 91, 69, 255) , 'gray8' : (20, 20, 20, 255) , 'gray9' : (23, 23, 23, 255) , 'grey32' : (82, 82, 82, 255) , 'bisque4' : (139, 125, 107, 255) , 'cyan' : (0, 255, 255, 255) , 'gray0' : (0, 0, 0, 255) , 'gray1' : (3, 3, 3, 255) , 'gray6' : (15, 15, 15, 255) , 'bisque1' : (255, 228, 196, 255) , 'bisque2' : (238, 213, 183, 255) , 'bisque3' : (205, 183, 158, 255) , 'skyblue' : (135, 206, 235, 255) , 'gray' : (190, 190, 190, 255) , 'darkturquoise' : (0, 206, 209, 255) , 'rosybrown4' : (139, 105, 105, 255) , 'deepskyblue3' : (0, 154, 205, 255) , 'grey63' : (161, 161, 161, 255) , 'indianred1' : (255, 106, 106, 255) , 'grey78' : (199, 199, 199, 255) , 'lightpink' : (255, 182, 193, 255) , 'gray88' : (224, 224, 224, 255) , 'gray22' : (56, 56, 56, 255) , 'red' : (255, 0, 0, 255) , 'grey11' : (28, 28, 28, 255) , 'lemonchiffon3' : (205, 201, 165, 255) , 'lemonchiffon2' : (238, 233, 191, 255) , 'lemonchiffon1' : (255, 250, 205, 255) , 'indianred3' : (205, 85, 85, 255) , 'violetred1' : (255, 62, 150, 255) , 'plum2' : (238, 174, 238, 255) , 'plum1' : (255, 187, 255, 255) , 'lemonchiffon4' : (139, 137, 112, 255) , 'gray99' : (252, 252, 252, 255) , 'grey13' : (33, 33, 33, 255) , 'grey55' : (140, 140, 140, 255) , 'darkcyan' : (0, 139, 139, 255) , 'chocolate4' : (139, 69, 19, 255) , 'lightgoldenrodyellow' : (250, 250, 210, 255) , 'gray54' : (138, 138, 138, 255) , 'lavender' : (230, 230, 250, 255) , 'chartreuse3' : (102, 205, 0, 255) , 'chartreuse2' : (118, 238, 0, 255) , 'chartreuse1' : (127, 255, 0, 255) , 'grey48' : (122, 122, 122, 255) , 'grey16' : (41, 41, 41, 255) , 'thistle' : (216, 191, 216, 255) , 'chartreuse4' : (69, 139, 0, 255) , 'darkorchid4' : (104, 34, 139, 255) , 'grey42' : (107, 107, 107, 255) , 'grey41' : (105, 105, 105, 255) , 'grey17' : (43, 43, 43, 255) , 'dimgrey' : (105, 105, 105, 255) , 'dodgerblue4' : (16, 78, 139, 255) , 'darkorchid2' : (178, 58, 238, 255) , 'darkorchid3' : (154, 50, 205, 255) , 'blue' : (0, 0, 255, 255) , 'rosybrown2' : (238, 180, 180, 255) , 'honeydew' : (240, 255, 240, 255) , 'gray18' : (46, 46, 46, 255) , 'cornflowerblue' : (100, 149, 237, 255) , 'grey91' : (232, 232, 232, 255) , 'gray14' : (36, 36, 36, 255) , 'gray15' : (38, 38, 38, 255) , 'gray16' : (41, 41, 41, 255) , 'maroon4' : (139, 28, 98, 255) , 'maroon3' : (205, 41, 144, 255) , 'maroon2' : (238, 48, 167, 255) , 'maroon1' : (255, 52, 179, 255) , 'gray13' : (33, 33, 33, 255) , 'gold3' : (205, 173, 0, 255) , 'gold2' : (238, 201, 0, 255) , 'gold1' : (255, 215, 0, 255) , 'grey79' : (201, 201, 201, 255) , 'palevioletred1' : (255, 130, 171, 255) , 'palevioletred2' : (238, 121, 159, 255) , 'gold4' : (139, 117, 0, 255) , 'gray41' : (105, 105, 105, 255) , 'gray84' : (214, 214, 214, 255) , 'mediumpurple' : (147, 112, 219, 255) , 'rosybrown1' : (255, 193, 193, 255) , 'lightblue2' : (178, 223, 238, 255) , 'lightblue3' : (154, 192, 205, 255) , 'grey57' : (145, 145, 145, 255) , 'lightblue1' : (191, 239, 255, 255) , 'lightblue4' : (104, 131, 139, 255) , 'gray33' : (84, 84, 84, 255) , 'skyblue4' : (74, 112, 139, 255) , 'grey97' : (247, 247, 247, 255) , 'skyblue1' : (135, 206, 255, 255) , 'gray27' : (69, 69, 69, 255) , 'skyblue3' : (108, 166, 205, 255) , 'skyblue2' : (126, 192, 238, 255) , 'lavenderblush1' : (255, 240, 245, 255) , 'darkgrey' : (169, 169, 169, 255) , 'lavenderblush3' : (205, 193, 197, 255) , 'darkslategrey' : (47, 79, 79, 255) , 'lavenderblush4' : (139, 131, 134, 255) , 'deeppink4' : (139, 10, 80, 255) , 'grey99' : (252, 252, 252, 255) , 'gray36' : (92, 92, 92, 255) , 'coral4' : (139, 62, 47, 255) , 'magenta3' : (205, 0, 205, 255) , 'lightskyblue4' : (96, 123, 139, 255) , 'mediumturquoise' : (72, 209, 204, 255) , 'gray34' : (87, 87, 87, 255) , 'floralwhite' : (255, 250, 240, 255) , 'grey39' : (99, 99, 99, 255) , 'grey36' : (92, 92, 92, 255) , 'grey37' : (94, 94, 94, 255) , 'grey34' : (87, 87, 87, 255) , 'gray26' : (66, 66, 66, 255) , 'royalblue2' : (67, 110, 238, 255) , 'grey33' : (84, 84, 84, 255) , 'turquoise1' : (0, 245, 255, 255) , 'grey31' : (79, 79, 79, 255) , 'steelblue1' : (99, 184, 255, 255) , 'sienna4' : (139, 71, 38, 255) , 'steelblue3' : (79, 148, 205, 255) , 'lavenderblush2' : (238, 224, 229, 255) , 'sienna1' : (255, 130, 71, 255) , 'steelblue4' : (54, 100, 139, 255) , 'sienna3' : (205, 104, 57, 255) , 'aquamarine4' : (69, 139, 116, 255) , 'lightyellow1' : (255, 255, 224, 255) , 'lightyellow2' : (238, 238, 209, 255) , 'lightsteelblue' : (176, 196, 222, 255) , 'lightyellow4' : (139, 139, 122, 255) , 'magenta2' : (238, 0, 238, 255) , 'lightskyblue1' : (176, 226, 255, 255) , 'lightgoldenrod' : (238, 221, 130, 255) , 'magenta4' : (139, 0, 139, 255) , 'gray87' : (222, 222, 222, 255) , 'greenyellow' : (173, 255, 47, 255) , 'navajowhite4' : (139, 121, 94, 255) , 'darkslategray4' : (82, 139, 139, 255) , 'olivedrab' : (107, 142, 35, 255) , 'navajowhite1' : (255, 222, 173, 255) , 'navajowhite2' : (238, 207, 161, 255) , 'darkgoldenrod1' : (255, 185, 15, 255) , 'sienna' : (160, 82, 45, 255) , 'blue1' : (0, 0, 255, 255) , 'yellow1' : (255, 255, 0, 255) , 'gray61' : (156, 156, 156, 255) , 'magenta1' : (255, 0, 255, 255) , 'grey52' : (133, 133, 133, 255) , 'orangered4' : (139, 37, 0, 255) , 'palegreen' : (152, 251, 152, 255) , 'gray86' : (219, 219, 219, 255) , 'grey80' : (204, 204, 204, 255) , 'seashell' : (255, 245, 238, 255) , 'royalblue' : (65, 105, 225, 255) , 'firebrick3' : (205, 38, 38, 255) , 'blue4' : (0, 0, 139, 255) , 'peru' : (205, 133, 63, 255) , 'gray60' : (153, 153, 153, 255) , 'aquamarine' : (127, 255, 212, 255) , 'grey53' : (135, 135, 135, 255) , 'tan4' : (139, 90, 43, 255) , 'darkgoldenrod' : (184, 134, 11, 255) , 'tan2' : (238, 154, 73, 255) , 'tan1' : (255, 165, 79, 255) , 'darkslategray' : (47, 79, 79, 255) , 'royalblue3' : (58, 95, 205, 255) , 'red2' : (238, 0, 0, 255) , 'red1' : (255, 0, 0, 255) , 'dodgerblue' : (30, 144, 255, 255) , 'violetred4' : (139, 34, 82, 255) , 'lightyellow' : (255, 255, 224, 255) , 'paleturquoise1' : (187, 255, 255, 255) , 'firebrick2' : (238, 44, 44, 255) , 'mediumaquamarine' : (102, 205, 170, 255) , 'lemonchiffon' : (255, 250, 205, 255) , 'chocolate' : (210, 105, 30, 255) , 'orchid4' : (139, 71, 137, 255) , 'maroon' : (176, 48, 96, 255) , 'gray38' : (97, 97, 97, 255) , 'darkorange4' : (139, 69, 0, 255) , 'mintcream' : (245, 255, 250, 255) , 'darkorange1' : (255, 127, 0, 255) , 'antiquewhite' : (250, 235, 215, 255) , 'darkorange2' : (238, 118, 0, 255) , 'grey18' : (46, 46, 46, 255) , 'grey19' : (48, 48, 48, 255) , 'grey38' : (97, 97, 97, 255) , 'moccasin' : (255, 228, 181, 255) , 'grey10' : (26, 26, 26, 255) , 'chocolate1' : (255, 127, 36, 255) , 'chocolate2' : (238, 118, 33, 255) , 'chocolate3' : (205, 102, 29, 255) , 'saddlebrown' : (139, 69, 19, 255) , 'grey15' : (38, 38, 38, 255) , 'darkslateblue' : (72, 61, 139, 255) , 'lightskyblue' : (135, 206, 250, 255) , 'gray69' : (176, 176, 176, 255) , 'gray68' : (173, 173, 173, 255) , 'deeppink' : (255, 20, 147, 255) , 'gray65' : (166, 166, 166, 255) , 'gray64' : (163, 163, 163, 255) , 'gray67' : (171, 171, 171, 255) , 'gray66' : (168, 168, 168, 255) , 'gray25' : (64, 64, 64, 255) , 'coral' : (255, 127, 80, 255) , 'gray63' : (161, 161, 161, 255) , 'gray62' : (158, 158, 158, 255) , 'goldenrod4' : (139, 105, 20, 255) , 'grey35' : (89, 89, 89, 255) , 'gray89' : (227, 227, 227, 255) , 'goldenrod1' : (255, 193, 37, 255) , 'goldenrod2' : (238, 180, 34, 255) , 'goldenrod3' : (205, 155, 29, 255) , 'springgreen1' : (0, 255, 127, 255) , 'springgreen2' : (0, 238, 118, 255) , 'springgreen3' : (0, 205, 102, 255) , 'springgreen4' : (0, 139, 69, 255) , 'mistyrose1' : (255, 228, 225, 255) , 'sandybrown' : (244, 164, 96, 255) , 'grey30' : (77, 77, 77, 255) , 'seashell2' : (238, 229, 222, 255) , 'seashell3' : (205, 197, 191, 255) , 'tan' : (210, 180, 140, 255) , 'seashell1' : (255, 245, 238, 255) , 'mistyrose3' : (205, 183, 181, 255) , 'magenta' : (255, 0, 255, 255) , 'pink' : (255, 192, 203, 255) , 'ivory2' : (238, 238, 224, 255) , 'ivory1' : (255, 255, 240, 255) , 'lightcyan2' : (209, 238, 238, 255) , 'mediumseagreen' : (60, 179, 113, 255) , 'ivory4' : (139, 139, 131, 255) , 'darkorange' : (255, 140, 0, 255) , 'powderblue' : (176, 224, 230, 255) , 'dodgerblue1' : (30, 144, 255, 255) , 'gray95' : (242, 242, 242, 255) , 'firebrick1' : (255, 48, 48, 255) , 'gray7' : (18, 18, 18, 255) , 'mistyrose4' : (139, 125, 123, 255) , 'tomato' : (255, 99, 71, 255) , 'indianred2' : (238, 99, 99, 255) , 'steelblue2' : (92, 172, 238, 255) , 'gray100' : (255, 255, 255, 255) , 'seashell4' : (139, 134, 130, 255) , 'grey89' : (227, 227, 227, 255) , 'grey88' : (224, 224, 224, 255) , 'grey87' : (222, 222, 222, 255) , 'grey86' : (219, 219, 219, 255) , 'grey85' : (217, 217, 217, 255) , 'grey84' : (214, 214, 214, 255) , 'midnightblue' : (25, 25, 112, 255) , 'grey82' : (209, 209, 209, 255) , 'grey81' : (207, 207, 207, 255) , 'yellow3' : (205, 205, 0, 255) , 'ivory3' : (205, 205, 193, 255) , 'grey22' : (56, 56, 56, 255) , 'gray85' : (217, 217, 217, 255) , 'violetred3' : (205, 50, 120, 255) , 'dodgerblue2' : (28, 134, 238, 255) , 'gray42' : (107, 107, 107, 255) , 'sienna2' : (238, 121, 66, 255) , 'grey72' : (184, 184, 184, 255) , 'grey73' : (186, 186, 186, 255) , 'grey70' : (179, 179, 179, 255) , 'palevioletred' : (219, 112, 147, 255) , 'lightslategray' : (119, 136, 153, 255) , 'grey77' : (196, 196, 196, 255) , 'grey74' : (189, 189, 189, 255) , 'slategray1' : (198, 226, 255, 255) , 'pink1' : (255, 181, 197, 255) , 'mediumpurple1' : (171, 130, 255, 255) , 'pink3' : (205, 145, 158, 255) , 'antiquewhite4' : (139, 131, 120, 255) , 'lightpink1' : (255, 174, 185, 255) , 'honeydew2' : (224, 238, 224, 255) , 'khaki4' : (139, 134, 78, 255) , 'darkolivegreen4' : (110, 139, 61, 255) , 'gray45' : (115, 115, 115, 255) , 'slategray3' : (159, 182, 205, 255) , 'darkolivegreen1' : (202, 255, 112, 255) , 'khaki1' : (255, 246, 143, 255) , 'khaki2' : (238, 230, 133, 255) , 'khaki3' : (205, 198, 115, 255) , 'lavenderblush' : (255, 240, 245, 255) , 'honeydew4' : (131, 139, 131, 255) , 'salmon3' : (205, 112, 84, 255) , 'salmon2' : (238, 130, 98, 255) , 'gray92' : (235, 235, 235, 255) , 'salmon4' : (139, 76, 57, 255) , 'gray49' : (125, 125, 125, 255) , 'gray48' : (122, 122, 122, 255) , 'linen' : (250, 240, 230, 255) , 'burlywood1' : (255, 211, 155, 255) , 'green' : (0, 255, 0, 255) , 'gray47' : (120, 120, 120, 255) , 'blueviolet' : (138, 43, 226, 255) , 'brown2' : (238, 59, 59, 255) , 'brown3' : (205, 51, 51, 255) , 'peachpuff' : (255, 218, 185, 255) , 'brown4' : (139, 35, 35, 255) , 'firebrick4' : (139, 26, 26, 255) , 'azure1' : (240, 255, 255, 255) , 'azure3' : (193, 205, 205, 255) , 'azure2' : (224, 238, 238, 255) , 'azure4' : (131, 139, 139, 255) , 'tomato4' : (139, 54, 38, 255) , 'orange4' : (139, 90, 0, 255) , 'firebrick' : (178, 34, 34, 255) , 'indianred' : (205, 92, 92, 255) , 'orange1' : (255, 165, 0, 255) , 'orange3' : (205, 133, 0, 255) , 'orange2' : (238, 154, 0, 255) , 'darkolivegreen' : (85, 107, 47, 255) , 'gray2' : (5, 5, 5, 255) , 'slategrey' : (112, 128, 144, 255) , 'gray81' : (207, 207, 207, 255) , 'darkred' : (139, 0, 0, 255) , 'gray3' : (8, 8, 8, 255) , 'lightsteelblue1' : (202, 225, 255, 255) , 'lightsteelblue2' : (188, 210, 238, 255) , 'lightsteelblue3' : (162, 181, 205, 255) , 'lightsteelblue4' : (110, 123, 139, 255) , 'tomato3' : (205, 79, 57, 255) , 'gray43' : (110, 110, 110, 255) , 'darkgoldenrod4' : (139, 101, 8, 255) , 'grey50' : (127, 127, 127, 255) , 'yellow4' : (139, 139, 0, 255) , 'mediumorchid' : (186, 85, 211, 255) , 'yellow2' : (238, 238, 0, 255) , 'darkgoldenrod2' : (238, 173, 14, 255) , 'darkgoldenrod3' : (205, 149, 12, 255) , 'chartreuse' : (127, 255, 0, 255) , 'mediumblue' : (0, 0, 205, 255) , 'gray4' : (10, 10, 10, 255) , 'springgreen' : (0, 255, 127, 255) , 'orange' : (255, 165, 0, 255) , 'gray5' : (13, 13, 13, 255) , 'lightsalmon' : (255, 160, 122, 255) , 'gray19' : (48, 48, 48, 255) , 'turquoise' : (64, 224, 208, 255) , 'lightseagreen' : (32, 178, 170, 255) , 'grey8' : (20, 20, 20, 255) , 'grey9' : (23, 23, 23, 255) , 'grey6' : (15, 15, 15, 255) , 'grey7' : (18, 18, 18, 255) , 'grey4' : (10, 10, 10, 255) , 'grey5' : (13, 13, 13, 255) , 'grey2' : (5, 5, 5, 255) , 'grey3' : (8, 8, 8, 255) , 'grey0' : (0, 0, 0, 255) , 'grey1' : (3, 3, 3, 255) , 'gray50' : (127, 127, 127, 255) , 'goldenrod' : (218, 165, 32, 255) , 'grey58' : (148, 148, 148, 255) , 'grey59' : (150, 150, 150, 255) , 'gray51' : (130, 130, 130, 255) , 'grey54' : (138, 138, 138, 255) , 'mediumorchid4' : (122, 55, 139, 255) , 'grey56' : (143, 143, 143, 255) , 'navajowhite3' : (205, 179, 139, 255) , 'mediumorchid1' : (224, 102, 255, 255) , 'grey51' : (130, 130, 130, 255) , 'mediumorchid3' : (180, 82, 205, 255) , 'mediumorchid2' : (209, 95, 238, 255) , 'cyan2' : (0, 238, 238, 255) , 'cyan3' : (0, 205, 205, 255) , 'gray23' : (59, 59, 59, 255) , 'cyan1' : (0, 255, 255, 255) , 'darkgreen' : (0, 100, 0, 255) , 'gray24' : (61, 61, 61, 255) , 'cyan4' : (0, 139, 139, 255) , 'darkviolet' : (148, 0, 211, 255) , 'peachpuff4' : (139, 119, 101, 255) , 'gray28' : (71, 71, 71, 255) , 'slateblue4' : (71, 60, 139, 255) , 'slateblue3' : (105, 89, 205, 255) , 'peachpuff1' : (255, 218, 185, 255) , 'peachpuff2' : (238, 203, 173, 255) , 'peachpuff3' : (205, 175, 149, 255) , 'gray29' : (74, 74, 74, 255) , 'paleturquoise' : (175, 238, 238, 255) , 'darkgray' : (169, 169, 169, 255) , 'grey25' : (64, 64, 64, 255) , 'darkmagenta' : (139, 0, 139, 255) , 'palegoldenrod' : (238, 232, 170, 255) , 'grey64' : (163, 163, 163, 255) , 'grey12' : (31, 31, 31, 255) , 'deeppink3' : (205, 16, 118, 255) , 'gray79' : (201, 201, 201, 255) , 'gray83' : (212, 212, 212, 255) , 'deeppink2' : (238, 18, 137, 255) , 'burlywood4' : (139, 115, 85, 255) , 'palevioletred4' : (139, 71, 93, 255) , 'deeppink1' : (255, 20, 147, 255) , 'slateblue2' : (122, 103, 238, 255) , 'grey46' : (117, 117, 117, 255) , 'royalblue4' : (39, 64, 139, 255) , 'yellowgreen' : (154, 205, 50, 255) , 'royalblue1' : (72, 118, 255, 255) , 'slateblue1' : (131, 111, 255, 255) , 'lightgoldenrod3' : (205, 190, 112, 255) , 'lightgoldenrod2' : (238, 220, 130, 255) , 'navy' : (0, 0, 128, 255) , 'orchid' : (218, 112, 214, 255) , 'ghostwhite' : (248, 248, 255, 255) , 'purple' : (160, 32, 240, 255) , 'darkkhaki' : (189, 183, 107, 255) , 'grey45' : (115, 115, 115, 255) , 'gray94' : (240, 240, 240, 255) , 'wheat4' : (139, 126, 102, 255) , 'gray96' : (245, 245, 245, 255) , 'gray97' : (247, 247, 247, 255) , 'wheat1' : (255, 231, 186, 255) , 'gray91' : (232, 232, 232, 255) , 'wheat3' : (205, 186, 150, 255) , 'wheat2' : (238, 216, 174, 255) , 'indianred4' : (139, 58, 58, 255) , 'coral2' : (238, 106, 80, 255) , 'coral1' : (255, 114, 86, 255) , 'violetred' : (208, 32, 144, 255) , 'rosybrown3' : (205, 155, 155, 255) , 'deepskyblue2' : (0, 178, 238, 255) , 'deepskyblue1' : (0, 191, 255, 255) , 'bisque' : (255, 228, 196, 255) , 'grey49' : (125, 125, 125, 255) , 'khaki' : (240, 230, 140, 255) , 'wheat' : (245, 222, 179, 255) , 'lightslateblue' : (132, 112, 255, 255) , 'mediumpurple3' : (137, 104, 205, 255) , 'gray55' : (140, 140, 140, 255) , 'deepskyblue' : (0, 191, 255, 255) , 'gray98' : (250, 250, 250, 255) , 'steelblue' : (70, 130, 180, 255) , 'aliceblue' : (240, 248, 255, 255) , 'lightskyblue2' : (164, 211, 238, 255) , 'lightskyblue3' : (141, 182, 205, 255) , 'lightslategrey' : (119, 136, 153, 255) , 'blue3' : (0, 0, 205, 255) , 'blue2' : (0, 0, 238, 255) , 'gainsboro' : (220, 220, 220, 255) , 'grey76' : (194, 194, 194, 255) , 'purple3' : (125, 38, 205, 255) , 'plum4' : (139, 102, 139, 255) , 'gray56' : (143, 143, 143, 255) , 'plum3' : (205, 150, 205, 255) , 'plum' : (221, 160, 221, 255) , 'lightgrey' : (211, 211, 211, 255) , 'mediumslateblue' : (123, 104, 238, 255) , 'mistyrose' : (255, 228, 225, 255) , 'lightcyan1' : (224, 255, 255, 255) , 'grey71' : (181, 181, 181, 255) , 'darksalmon' : (233, 150, 122, 255) , 'beige' : (245, 245, 220, 255) , 'grey24' : (61, 61, 61, 255) , 'azure' : (240, 255, 255, 255) , 'honeydew1' : (240, 255, 240, 255) , 'slategray2' : (185, 211, 238, 255) , 'dodgerblue3' : (24, 116, 205, 255) , 'slategray4' : (108, 123, 139, 255) , 'grey27' : (69, 69, 69, 255) , 'lightcyan3' : (180, 205, 205, 255) , 'cornsilk' : (255, 248, 220, 255) , 'tomato1' : (255, 99, 71, 255) , 'gray57' : (145, 145, 145, 255) , 'mediumvioletred' : (199, 21, 133, 255) , 'tomato2' : (238, 92, 66, 255) , 'snow4' : (139, 137, 137, 255) , 'grey75' : (191, 191, 191, 255) , 'snow2' : (238, 233, 233, 255) , 'snow3' : (205, 201, 201, 255) , 'snow1' : (255, 250, 250, 255) , 'grey23' : (59, 59, 59, 255) , 'cornsilk3' : (205, 200, 177, 255) , 'lightcoral' : (240, 128, 128, 255) , 'orangered' : (255, 69, 0, 255) , 'navajowhite' : (255, 222, 173, 255) , 'mediumpurple2' : (159, 121, 238, 255) , 'slategray' : (112, 128, 144, 255) , 'pink2' : (238, 169, 184, 255) , 'grey29' : (74, 74, 74, 255) , 'grey28' : (71, 71, 71, 255) , 'gray82' : (209, 209, 209, 255) , 'burlywood' : (222, 184, 135, 255) , 'mediumpurple4' : (93, 71, 139, 255) , 'mediumspringgreen' : (0, 250, 154, 255) , 'grey26' : (66, 66, 66, 255) , 'grey21' : (54, 54, 54, 255) , 'grey20' : (51, 51, 51, 255) , 'blanchedalmond' : (255, 235, 205, 255) , 'pink4' : (139, 99, 108, 255) , 'gray78' : (199, 199, 199, 255) , 'tan3' : (205, 133, 63, 255) , 'gray76' : (194, 194, 194, 255) , 'gray77' : (196, 196, 196, 255) , 'white' : (255, 255, 255, 255) , 'gray75' : (191, 191, 191, 255) , 'gray72' : (184, 184, 184, 255) , 'gray73' : (186, 186, 186, 255) , 'gray70' : (179, 179, 179, 255) , 'gray71' : (181, 181, 181, 255) , 'lightgray' : (211, 211, 211, 255) , 'ivory' : (255, 255, 240, 255) , 'gray46' : (117, 117, 117, 255) , 'gray74' : (189, 189, 189, 255) , 'lightyellow3' : (205, 205, 180, 255) , 'lightpink2' : (238, 162, 173, 255) , 'lightpink3' : (205, 140, 149, 255) , 'paleturquoise4' : (102, 139, 139, 255) , 'lightpink4' : (139, 95, 101, 255) , 'paleturquoise3' : (150, 205, 205, 255) , 'seagreen4' : (46, 139, 87, 255) , 'seagreen3' : (67, 205, 128, 255) , 'seagreen2' : (78, 238, 148, 255) , 'seagreen1' : (84, 255, 159, 255) , 'paleturquoise2' : (174, 238, 238, 255) , 'gray52' : (133, 133, 133, 255) , 'cornsilk4' : (139, 136, 120, 255) , 'cornsilk2' : (238, 232, 205, 255) , 'darkolivegreen3' : (162, 205, 90, 255) , 'cornsilk1' : (255, 248, 220, 255) , 'limegreen' : (50, 205, 50, 255) , 'darkolivegreen2' : (188, 238, 104, 255) , 'grey' : (190, 190, 190, 255) , 'violetred2' : (238, 58, 140, 255) , 'salmon1' : (255, 140, 105, 255) , 'grey92' : (235, 235, 235, 255) , 'grey93' : (237, 237, 237, 255) , 'grey94' : (240, 240, 240, 255) , 'grey95' : (242, 242, 242, 255) , 'grey96' : (245, 245, 245, 255) , 'grey83' : (212, 212, 212, 255) , 'grey98' : (250, 250, 250, 255) , 'lightgoldenrod1' : (255, 236, 139, 255) , 'palegreen1' : (154, 255, 154, 255) , 'red3' : (205, 0, 0, 255) , 'palegreen3' : (124, 205, 124, 255) , 'palegreen2' : (144, 238, 144, 255) , 'palegreen4' : (84, 139, 84, 255) , 'cadetblue' : (95, 158, 160, 255) , 'violet' : (238, 130, 238, 255) , 'mistyrose2' : (238, 213, 210, 255) , 'slateblue' : (106, 90, 205, 255) , 'grey43' : (110, 110, 110, 255) , 'grey90' : (229, 229, 229, 255) , 'gray35' : (89, 89, 89, 255) , 'turquoise3' : (0, 197, 205, 255) , 'turquoise2' : (0, 229, 238, 255) , 'burlywood3' : (205, 170, 125, 255) , 'burlywood2' : (238, 197, 145, 255) , 'lightcyan4' : (122, 139, 139, 255) , 'rosybrown' : (188, 143, 143, 255) , 'turquoise4' : (0, 134, 139, 255) , 'whitesmoke' : (245, 245, 245, 255) , 'lightblue' : (173, 216, 230, 255) , 'grey40' : (102, 102, 102, 255) , 'gray40' : (102, 102, 102, 255) , 'honeydew3' : (193, 205, 193, 255) , 'dimgray' : (105, 105, 105, 255) , 'grey47' : (120, 120, 120, 255) , 'seagreen' : (46, 139, 87, 255) , 'red4' : (139, 0, 0, 255) , 'grey14' : (36, 36, 36, 255) , 'snow' : (255, 250, 250, 255) , 'darkorchid1' : (191, 62, 255, 255) , 'gray58' : (148, 148, 148, 255) , 'gray59' : (150, 150, 150, 255) , 'cadetblue4' : (83, 134, 139, 255) , 'cadetblue3' : (122, 197, 205, 255) , 'cadetblue2' : (142, 229, 238, 255) , 'cadetblue1' : (152, 245, 255, 255) , 'olivedrab4' : (105, 139, 34, 255) , 'purple4' : (85, 26, 139, 255) , 'gray20' : (51, 51, 51, 255) , 'grey44' : (112, 112, 112, 255) , 'purple1' : (155, 48, 255, 255) , 'olivedrab1' : (192, 255, 62, 255) , 'olivedrab2' : (179, 238, 58, 255) , 'olivedrab3' : (154, 205, 50, 255) , 'orangered3' : (205, 55, 0, 255) , 'orangered2' : (238, 64, 0, 255) , 'orangered1' : (255, 69, 0, 255) , 'darkorchid' : (153, 50, 204, 255) , 'thistle3' : (205, 181, 205, 255) , 'thistle2' : (238, 210, 238, 255) , 'thistle1' : (255, 225, 255, 255) , 'salmon' : (250, 128, 114, 255) , 'gray93' : (237, 237, 237, 255) , 'thistle4' : (139, 123, 139, 255) , 'gray39' : (99, 99, 99, 255) , 'lawngreen' : (124, 252, 0, 255) , 'hotpink3' : (205, 96, 144, 255) , 'hotpink2' : (238, 106, 167, 255) , 'hotpink1' : (255, 110, 180, 255) , 'lightgreen' : (144, 238, 144, 255) , 'hotpink4' : (139, 58, 98, 255) , 'darkseagreen4' : (105, 139, 105, 255) , 'darkseagreen3' : (155, 205, 155, 255) , 'darkseagreen2' : (180, 238, 180, 255) , 'darkseagreen1' : (193, 255, 193, 255) , 'deepskyblue4' : (0, 104, 139, 255) , 'gray44' : (112, 112, 112, 255) , 'navyblue' : (0, 0, 128, 255) , 'darkblue' : (0, 0, 139, 255) , 'forestgreen' : (34, 139, 34, 255) , 'gray53' : (135, 135, 135, 255) , 'grey100' : (255, 255, 255, 255) , 'brown1' : (255, 64, 64, 255) , } pygame-1.9.1release/lib/camera.py0000644000175000017500000000526211207055754016626 0ustar vincentvincent _is_init = 0 def init(): global list_cameras, Camera, colorspace, _is_init import os,sys use_opencv = False use_vidcapture = False use__camera = True if sys.platform == 'win32': use_vidcapture = True elif "linux" in sys.platform: use__camera = True else: use_opencv = True # see if we have any user specified defaults in environments. camera_env = os.environ.get("PYGAME_CAMERA", "") if camera_env == "opencv": use_opencv = True if camera_env == "vidcapture": use_vidcapture = True # select the camera module to import here. # the _camera module has some code which can be reused by other modules. # it will also be the default one. import _camera colorspace = _camera.colorspace if use__camera: list_cameras = _camera.list_cameras Camera = _camera.Camera if use_opencv: try: import _camera_opencv_highgui except: _camera_opencv_highgui = None if _camera_opencv_highgui: _camera_opencv_highgui.init() list_cameras = _camera_opencv_highgui.list_cameras Camera = _camera_opencv_highgui.Camera if use_vidcapture: try: import _camera_vidcapture except: _camera_vidcapture = None if _camera_vidcapture: _camera_vidcapture.init() list_cameras = _camera_vidcapture.list_cameras Camera = _camera_vidcapture.Camera _is_init = 1 pass def quit(): global _is_init _is_init = 0 pass def _check_init(): global _is_init if not _is_init: raise ValueError("Need to call camera.init() before using.") def list_cameras(): """ """ _check_init() raise NotImplementedError() class Camera: def __init__(self, device =0, size = (320, 200), mode = "RGB"): """ """ _check_init() raise NotImplementedError() def set_resolution(self, width, height): """Sets the capture resolution. (without dialog) """ pass def start(self): """ """ def stop(self): """ """ def get_buffer(self): """ """ def set_controls(self, **kwargs): """ """ def get_image(self, dest_surf = None): """ """ def get_surface(self, dest_surf = None): """ """ if __name__ == "__main__": # try and use this camera stuff with the pygame camera example. import pygame.examples.camera #pygame.camera.Camera = Camera #pygame.camera.list_cameras = list_cameras pygame.examples.camera.main() pygame-1.9.1release/lib/_numpysurfarray.py0000644000175000017500000004203211207055754020640 0ustar vincentvincent## pygame - Python Game Library ## Copyright (C) 2007 Marcus von Appen ## ## This library is free software; you can redistribute it and/or ## modify it under the terms of the GNU Library General Public ## License as published by the Free Software Foundation; either ## version 2 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 ## Library General Public License for more details. ## ## You should have received a copy of the GNU Library General Public ## License along with this library; if not, write to the Free ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## ## Marcus von Appen ## mva@sysfault.org """pygame module for accessing surface pixel data using numpy Functions to convert pixel data between pygame Surfaces and Numpy arrays. This module will only be available when pygame can use the external Numpy package. Note, that numpyarray is an optional module. It requires that Numpy is installed to be used. If not installed, an exception will be raised when it is used. eg. ImportError: no module named numpy Every pixel is stored as a single integer value to represent the red, green, and blue colors. The 8bit images use a value that looks into a colormap. Pixels with higher depth use a bit packing process to place three or four values into a single number. The Numpy arrays are indexed by the X axis first, followed by the Y axis. Arrays that treat the pixels as a single integer are referred to as 2D arrays. This module can also separate the red, green, and blue color values into separate indices. These types of arrays are referred to as 3D arrays, and the last index is 0 for red, 1 for green, and 2 for blue. In contrast to Numeric Numpy does use unsigned 16bit integers, images with 16bit data will be treated as unsigned integers. """ import pygame import numpy import re def array2d (surface): """pygame.numpyarray.array2d (Surface): return array copy pixels into a 2d array Copy the pixels from a Surface into a 2D array. The bit depth of the surface will control the size of the integer values, and will work for any type of pixel format. This function will temporarily lock the Surface as pixels are copied (see the Surface.lock - lock the Surface memory for pixel access method). """ bpp = surface.get_bytesize () if bpp <= 0 or bpp > 4: raise ValueError("unsupported bit depth for 2D array") # Taken from Alex Holkner's pygame-ctypes package. Thanks a lot. data = surface.get_buffer ().raw # Remove extra pitch from each row. width = surface.get_width () pitchdiff = surface.get_pitch () - width * bpp if pitchdiff > 0: pattern = re.compile ('(%s)%s' % ('.' * width * bpp, '.' * pitchdiff), flags=re.DOTALL) data = ''.join (pattern.findall (data)) if bpp == 3: # Pad each triplet of bytes with another zero pattern = re.compile ('...', flags=re.DOTALL) data = '\0'.join (pattern.findall (data)) if pygame.get_sdl_byteorder () == pygame.LIL_ENDIAN: data += '\0' else: data = '\0' + data bpp = 4 typecode = (numpy.uint8, numpy.uint16, None, numpy.int32)[bpp - 1] array = numpy.fromstring (data, typecode) array.shape = (surface.get_height (), width) array = numpy.transpose (array) return array def pixels2d (surface): """pygame.numpyarray.pixels2d (Surface): return array reference pixels into a 2d array Create a new 2D array that directly references the pixel values in a Surface. Any changes to the array will affect the pixels in the Surface. This is a fast operation since no data is copied. Pixels from a 24-bit Surface cannot be referenced, but all other Surface bit depths can. The Surface this references will remain locked for the lifetime of the array (see the Surface.lock - lock the Surface memory for pixel access method). """ bpp = surface.get_bytesize () if bpp == 3 or bpp < 1 or bpp > 4: raise ValueError("unsupported bit depth for 2D reference array") typecode = (numpy.uint8, numpy.uint16, None, numpy.int32)[bpp - 1] array = numpy.frombuffer (surface.get_buffer (), typecode) array.shape = surface.get_height (), surface.get_pitch () / bpp # Padding correction for certain depth due to padding bytes. array = array[:,:surface.get_width ()] array = numpy.transpose (array) return array def array3d (surface): """pygame.numpyarray.array3d (Surface): return array copy pixels into a 3d array Copy the pixels from a Surface into a 3D array. The bit depth of the surface will control the size of the integer values, and will work for any type of pixel format. This function will temporarily lock the Surface as pixels are copied (see the Surface.lock - lock the Surface memory for pixel access method). """ bpp = surface.get_bytesize () array = array2d (surface) # Taken from from Alex Holkner's pygame-ctypes package. Thanks a # lot. if bpp == 1: palette = surface.get_palette () # Resolve the correct values using the color palette pal_r = numpy.array ([c[0] for c in palette]) pal_g = numpy.array ([c[1] for c in palette]) pal_b = numpy.array ([c[2] for c in palette]) planes = [numpy.choose (array, pal_r), numpy.choose (array, pal_g), numpy.choose (array, pal_b)] array = numpy.array (planes, numpy.uint8) array = numpy.transpose (array, (1, 2, 0)) return array elif bpp == 2: # Taken from SDL_GetRGBA. masks = surface.get_masks () shifts = surface.get_shifts () losses = surface.get_losses () vr = (array & masks[0]) >> shifts[0] vg = (array & masks[1]) >> shifts[1] vb = (array & masks[2]) >> shifts[2] planes = [(vr << losses[0]) + (vr >> (8 - (losses[0] << 1))), (vg << losses[1]) + (vg >> (8 - (losses[1] << 1))), (vb << losses[2]) + (vb >> (8 - (losses[2] << 1)))] array = numpy.array (planes, numpy.uint8) return numpy.transpose (array, (1, 2, 0)) else: masks = surface.get_masks () shifts = surface.get_shifts () losses = surface.get_losses () planes = [((array & masks[0]) >> shifts[0]), # << losses[0], Assume 0 ((array & masks[1]) >> shifts[1]), # << losses[1], ((array & masks[2]) >> shifts[2])] # << losses[2]] array = numpy.array (planes, numpy.uint8) return numpy.transpose (array, (1, 2, 0)) def pixels3d (surface): """pygame.numpyarray.pixels3d (Surface): return array reference pixels into a 3d array Create a new 3D array that directly references the pixel values in a Surface. Any changes to the array will affect the pixels in the Surface. This is a fast operation since no data is copied. This will only work on Surfaces that have 24-bit or 32-bit formats. Lower pixel formats cannot be referenced. The Surface this references will remain locked for the lifetime of the array (see the Surface.lock - lock the Surface memory for pixel access method). """ bpp = surface.get_bytesize () if bpp < 3 or bpp > 4: raise ValueError("unsupported bit depth for 3D reference array") lilendian = pygame.get_sdl_byteorder () == pygame.LIL_ENDIAN start = 0 step = 0 # Check for RGB or BGR surface. shifts = surface.get_shifts () if shifts[0] == 16 and shifts[1] == 8 and shifts[2] == 0: # RGB if lilendian: start = 2 step = -1 else: start = 0 step = 1 elif shifts[2] == 16 and shifts[1] == 8 and shifts[0] == 0: # BGR if lilendian: start = 0 step = 1 else: start = 2 step = -1 else: raise ValueError("unsupported colormasks for 3D reference array") if bpp == 4 and not lilendian: start += 1 array = numpy.ndarray \ (shape=(surface.get_width (), surface.get_height (), 3), dtype=numpy.uint8, buffer=surface.get_buffer (), offset=start, strides=(bpp, surface.get_pitch (),step)) return array def array_alpha (surface): """pygame.numpyarray.array_alpha (Surface): return array copy pixel alphas into a 2d array Copy the pixel alpha values (degree of transparency) from a Surface into a 2D array. This will work for any type of Surface format. Surfaces without a pixel alpha will return an array with all opaque values. This function will temporarily lock the Surface as pixels are copied (see the Surface.lock - lock the Surface memory for pixel access method). """ if (surface.get_bytesize () == 1 or surface.get_alpha () is None or surface.get_masks ()[3] == 0): # 1 bpp surfaces and surfaces without per-pixel alpha are always # fully opaque. array = numpy.empty (surface.get_width () * surface.get_height (), numpy.uint8) array.fill (0xff) array.shape = surface.get_width (), surface.get_height () return array array = array2d (surface) if surface.get_bytesize () == 2: # Taken from SDL_GetRGBA. va = (array & surface.get_masks ()[3]) >> surface.get_shifts ()[3] array = ((va << surface.get_losses ()[3]) + (va >> (8 - (surface.get_losses ()[3] << 1)))) else: # Taken from _numericsurfarray.c. array = array >> surface.get_shifts ()[3] << surface.get_losses ()[3] array = array.astype (numpy.uint8) return array def pixels_alpha (surface): """pygame.numpyarray.pixels_alpha (Surface): return array reference pixel alphas into a 2d array Create a new 2D array that directly references the alpha values (degree of transparency) in a Surface. Any changes to the array will affect the pixels in the Surface. This is a fast operation since no data is copied. This can only work on 32-bit Surfaces with a per-pixel alpha value. The Surface this array references will remain locked for the lifetime of the array. """ if surface.get_bytesize () != 4: raise ValueError("unsupported bit depth for alpha reference array") lilendian = pygame.get_sdl_byteorder () == pygame.LIL_ENDIAN # ARGB surface. start = 0 if surface.get_shifts ()[3] == 24 and lilendian: # RGBA surface. start = 3 elif surface.get_shifts ()[3] == 0 and not lilendian: start = 3 else: raise ValueError("unsupported colormasks for alpha reference array") array = numpy.ndarray \ (shape=(surface.get_width (), surface.get_height ()), dtype=numpy.uint8, buffer=surface.get_buffer (), offset=start, strides=(4, surface.get_pitch ())) return array def array_colorkey (surface): """pygame.numpyarray.array_colorkey (Surface): return array copy the colorkey values into a 2d array Create a new array with the colorkey transparency value from each pixel. If the pixel matches the colorkey it will be fully tranparent; otherwise it will be fully opaque. This will work on any type of Surface format. If the image has no colorkey a solid opaque array will be returned. This function will temporarily lock the Surface as pixels are copied. """ colorkey = surface.get_colorkey () if colorkey == None: # No colorkey, return a solid opaque array. array = numpy.empty (surface.get_width () * surface.get_height (), numpy.uint8) array.fill (0xff) array.shape = surface.get_width (), surface.get_height () return array # Taken from from Alex Holkner's pygame-ctypes package. Thanks a # lot. array = array2d (surface) # Check each pixel value for the colorkey and mark it as opaque or # transparent as needed. val = surface.map_rgb (colorkey) array = numpy.choose (numpy.equal (array, val), (numpy.uint8 (0xff), numpy.uint8 (0))) array.shape = surface.get_width (), surface.get_height () return array def make_surface (array): """pygame.numpyarray.make_surface (array): return Surface copy an array to a new surface Create a new Surface that best resembles the data and format on the array. The array can be 2D or 3D with any sized integer values. """ # Taken from from Alex Holkner's pygame-ctypes package. Thanks a # lot. bpp = 0 r = g = b = 0 shape = array.shape if len (shape) == 2: # 2D array bpp = 8 r = 0xFF >> 6 << 5 g = 0xFF >> 5 << 2 b = 0xFF >> 6 elif len (shape) == 3 and shape[2] == 3: bpp = 32 r = 0xff << 16 g = 0xff << 8 b = 0xff else: raise ValueError("must be a valid 2d or 3d array") surface = pygame.Surface ((shape[0], shape[1]), 0, bpp, (r, g, b, 0)) blit_array (surface, array) return surface def blit_array (surface, array): """pygame.numpyarray.blit_array (Surface, array): return None blit directly from a array values Directly copy values from an array into a Surface. This is faster than converting the array into a Surface and blitting. The array must be the same dimensions as the Surface and will completely replace all pixel values. This function will temporarily lock the Surface as the new values are copied. """ bpp = surface.get_bytesize () if bpp <= 0 or bpp > 4: raise ValueError("unsupported bit depth for surface") shape = array.shape width = surface.get_width () typecode = (numpy.uint8, numpy.uint16, None, numpy.uint32)[bpp - 1] array = array.astype (typecode) # Taken from from Alex Holkner's pygame-ctypes package. Thanks a # lot. if len(shape) == 3 and shape[2] == 3: array = numpy.transpose (array, (1, 0, 2)) shifts = surface.get_shifts () losses = surface.get_losses () array = (array[:,:,::3] >> losses[0] << shifts[0]) | \ (array[:,:,1::3] >> losses[1] << shifts[1]) | \ (array[:,:,2::3] >> losses[2] << shifts[2]) elif len (shape) == 2: array = numpy.transpose (array) else: raise ValueError("must be a valid 2d or 3d array") if width != shape[0] or surface.get_height () != shape[1]: raise ValueError("array must match the surface dimensions") itemsize = array.itemsize data = array.tostring () if itemsize > bpp: # Trim bytes from each element, keep least significant byte(s) pattern = '%s(%s)' % ('.' * (itemsize - bpp), '.' * bpp) if pygame.get_sdl_byteorder () == pygame.LIL_ENDIAN: pattern = '(%s)%s' % ('.' * bpp, '.' * (itemsize - bpp)) data = ''.join (re.compile (pattern, flags=re.DOTALL).findall (data)) elif itemsize < bpp: # Add pad bytes to each element, at most significant end pad = '\0' * (bpp - itemsize) pixels = re.compile ('.' * itemsize, flags=re.DOTALL).findall (data) data = pad.join (pixels) if pygame.get_sdl_byteorder () == pygame.LIL_ENDIAN: data = data + pad else: data = pad + data # Add zeros pad for pitch correction pitchdiff = surface.get_pitch () - width * bpp if pitchdiff > 0: pad = '\0' * pitchdiff rows = re.compile ('.' * width * bpp, flags=re.DOTALL).findall (data) data = pad.join (rows) + pad surface.get_buffer ().write (data, 0) def map_array (surface, array): """pygame.numpyarray.map_array (Surface, array3d): return array2d map a 3d array into a 2d array Convert a 3D array into a 2D array. This will use the given Surface format to control the conversion. Palette surface formats are not supported. Note: arrays do not need to be 3D, as long as the minor axis has three elements giving the component colours, any array shape can be used (for example, a single colour can be mapped, or an array of colours). """ # Taken from from Alex Holkner's pygame-ctypes package. Thanks a # lot. bpp = surface.get_bytesize () if bpp <= 1 or bpp > 4: raise ValueError("unsupported bit depth for surface array") shape = array.shape if shape[-1] != 3: raise ValueError("array must be a 3d array of 3-value color data") shifts = surface.get_shifts () losses = surface.get_losses () if array.dtype != numpy.int32: array = array.astype(numpy.int32) out = array[...,0] >> losses[0] << shifts[0] out[...] |= array[...,1] >> losses[1] << shifts[1] out[...] |= array[...,2] >> losses[2] << shifts[2] if surface.get_flags() & pygame.SRCALPHA: out[...] |= numpy.int32(255) >> losses[3] << shifts[3] return out pygame-1.9.1release/lib/_numpysndarray.py0000644000175000017500000001133111207055754020443 0ustar vincentvincent## pygame - Python Game Library ## Copyright (C) 2008 Marcus von Appen ## ## This library is free software; you can redistribute it and/or ## modify it under the terms of the GNU Library General Public ## License as published by the Free Software Foundation; either ## version 2 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 ## Library General Public License for more details. ## ## You should have received a copy of the GNU Library General Public ## License along with this library; if not, write to the Free ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## ## Marcus von Appen ## mva@sysfault.org """pygame module for accessing sound sample data using numpy Functions to convert between numpy arrays and Sound objects. This module will only be available when pygame can use the external numpy package. Sound data is made of thousands of samples per second, and each sample is the amplitude of the wave at a particular moment in time. For example, in 22-kHz format, element number 5 of the array is the amplitude of the wave after 5/22000 seconds. Each sample is an 8-bit or 16-bit integer, depending on the data format. A stereo sound file has two values per sample, while a mono sound file only has one. """ import pygame import pygame.mixer as mixer import numpy def _array_samples(sound, raw): # Info is a (freq, format, stereo) tuple info = mixer.get_init () if not info: raise pygame.error("Mixer not initialized") fmtbytes = (abs (info[1]) & 0xff) >> 3 channels = info[2] if raw: data = sound.get_buffer ().raw else: data = sound.get_buffer () shape = (len (data) // fmtbytes, ) if channels > 1: shape = (shape[0] // channels, channels) # mixer.init () does not support different formats from the ones below, # so MSB/LSB stuff is silently ignored. typecode = { 8 : numpy.uint8, # AUDIO_U8 16 : numpy.uint16, # AUDIO_U16 / AUDIO_U16SYS -8 : numpy.int8, # AUDIO_S8 -16 : numpy.int16 # AUDUI_S16 / AUDIO_S16SYS }[info[1]] array = numpy.fromstring (data, typecode) array.shape = shape return array def array (sound): """pygame._numpysndarray.array(Sound): return array Copy Sound samples into an array. Creates a new array for the sound data and copies the samples. The array will always be in the format returned from pygame.mixer.get_init(). """ return _array_samples(sound, True) def samples (sound): """pygame._numpysndarray.samples(Sound): return array Reference Sound samples into an array. Creates a new array that directly references the samples in a Sound object. Modifying the array will change the Sound. The array will always be in the format returned from pygame.mixer.get_init(). """ # Info is a (freq, format, stereo) tuple info = pygame.mixer.get_init () if not info: raise pygame.error("Mixer not initialized") fmtbytes = (abs (info[1]) & 0xff) >> 3 channels = info[2] data = sound.get_buffer () shape = (data.length // fmtbytes, ) if channels > 1: shape = (shape[0] // channels, channels) # mixer.init () does not support different formats from the ones below, # so MSB/LSB stuff is silently ignored. typecode = { 8 : numpy.uint8, # AUDIO_U8 16 : numpy.uint16, # AUDIO_U16 -8 : numpy.int8, # AUDIO_S8 -16 : numpy.int16 # AUDUI_S16 }[info[1]] array = numpy.frombuffer (data, typecode) array.shape = shape return array def make_sound (array): """pygame._numpysndarray.make_sound(array): return Sound Convert an array into a Sound object. Create a new playable Sound object from an array. The mixer module must be initialized and the array format must be similar to the mixer audio format. """ # Info is a (freq, format, stereo) tuple info = pygame.mixer.get_init () if not info: raise pygame.error("Mixer not initialized") channels = info[2] shape = array.shape if channels == 1: if len (shape) != 1: raise ValueError("Array must be 1-dimensional for mono mixer") else: if len (shape) != 2: raise ValueError("Array must be 2-dimensional for stereo mixer") elif shape[1] != channels: raise ValueError("Array depth must match number of mixer channels") return mixer.Sound (array) pygame-1.9.1release/lib/_camera_vidcapture.py0000644000175000017500000000715611150143174021206 0ustar vincentvincent import pygame def list_cameras(): return [0] # this just cycles through all the cameras trying to open them cameras = [] for x in range(256): try: c = Camera(x) except: break cameras.append(x) return cameras def init(): global vidcap import vidcap as vc vidcap = vc def quit(): global vidcap pass del vidcap class Camera: def __init__(self, device =0, size = (640,480), mode = "RGB", show_video_window=0): """device: VideoCapture enumerates the available video capture devices on your system. If you have more than one device, specify the desired one here. The device number starts from 0. show_video_window: 0 ... do not display a video window (the default) 1 ... display a video window Mainly used for debugging, since the video window can not be closed or moved around. """ self.dev = vidcap.new_Dev(device, show_video_window) width, height = size self.dev.setresolution(width, height) def display_capture_filter_properties(self): """Displays a dialog containing the property page of the capture filter. For VfW drivers you may find the option to select the resolution most likely here. """ self.dev.displaycapturefilterproperties() def display_capture_pin_properties(self): """Displays a dialog containing the property page of the capture pin. For WDM drivers you may find the option to select the resolution most likely here. """ self.dev.displaycapturepinproperties() def set_resolution(self, width, height): """Sets the capture resolution. (without dialog) """ self.dev.setresolution(width, height) def get_buffer(self): """Returns a string containing the raw pixel data. """ return self.dev.getbuffer() def start(self): """ """ def set_controls(self, **kwargs): """ """ def stop(self): """ """ def get_image(self, dest_surf = None): return self.get_surface(dest_surf) def get_surface(self, dest_surf = None): """Returns a pygame Surface. """ abuffer, width, height = self.get_buffer() if abuffer: if 1: surf = pygame.image.frombuffer(abuffer, (width, height), "RGB") # swap it from a BGR surface to an RGB surface. r,g,b,a = surf.get_masks() surf.set_masks((b,g,r,a)) r,g,b,a = surf.get_shifts() surf.set_shifts((b,g,r,a)) surf = pygame.transform.flip(surf, 0,1) # if there is a destination surface given, we blit onto that. if dest_surf: dest_surf.blit(surf, (0,0)) return dest_surf else: # Need to flip the image. surf = pygame.image.fromstring(abuffer, (width, height), "RGB", 1) # swap it from a BGR surface to an RGB surface. r,g,b,a = surf.get_masks() surf.set_masks((b,g,r,a)) r,g,b,a = surf.get_shifts() surf.set_shifts((b,g,r,a)) return surf if __name__ == "__main__": import pygame.examples.camera pygame.camera.Camera = Camera pygame.camera.list_cameras = list_cameras pygame.examples.camera.main() pygame-1.9.1release/lib/_camera_opencv_highgui.py0000644000175000017500000000426511150143174022034 0ustar vincentvincent import pygame import numpy import opencv #this is important for capturing/displaying images from opencv import highgui def list_cameras(): """ """ # -1 for opencv means get any of them. return [-1] def init(): pass def quit(): pass class Camera: def __init__(self, device =0, size = (640,480), mode = "RGB"): """ """ self.camera = highgui.cvCreateCameraCapture(device) if not self.camera: raise ValueError ("Could not open camera. Sorry.") def set_controls(self, **kwargs): """ """ def set_resolution(self, width, height): """Sets the capture resolution. (without dialog) """ # nothing to do here. pass def query_image(self): return True def stop(self): pass def start(self): # do nothing here... since the camera is already open. pass def get_buffer(self): """Returns a string containing the raw pixel data. """ return self.get_surface().get_buffer() def get_image(self, dest_surf = None): return self.get_surface(dest_surf) def get_surface(self, dest_surf = None): camera = self.camera im = highgui.cvQueryFrame(camera) #convert Ipl image to PIL image #print type(im) if im: xx = opencv.adaptors.Ipl2NumPy(im) #print type(xx) #print xx.iscontiguous() #print dir(xx) #print xx.shape xxx = numpy.reshape(xx, (numpy.product(xx.shape),)) if xx.shape[2] != 3: raise ValueError("not sure what to do about this size") pg_img = pygame.image.frombuffer(xxx, (xx.shape[1],xx.shape[0]), "RGB") # if there is a destination surface given, we blit onto that. if dest_surf: dest_surf.blit(pg_img, (0,0)) return dest_surf #return pg_img if __name__ == "__main__": # try and use this camera stuff with the pygame camera example. import pygame.examples.camera pygame.camera.Camera = Camera pygame.camera.list_cameras = list_cameras pygame.examples.camera.main() pygame-1.9.1release/lib/__init__.py0000644000175000017500000002247511220627000017122 0ustar vincentvincent## pygame - Python Game Library ## Copyright (C) 2000-2001 Pete Shinners ## ## This library is free software; you can redistribute it and/or ## modify it under the terms of the GNU Library General Public ## License as published by the Free Software Foundation; either ## version 2 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 ## Library General Public License for more details. ## ## You should have received a copy of the GNU Library General Public ## License along with this library; if not, write to the Free ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## ## Pete Shinners ## pete@shinners.org """Pygame is a set of Python modules designed for writing games. It is written on top of the excellent SDL library. This allows you to create fully featured games and multimedia programs in the python language. The package is highly portable, with games running on Windows, MacOS, OS X, BeOS, FreeBSD, IRIX, and Linux. """ import sys, os, string # check if is old windows... if so use directx video driver by default. # if someone sets this respect their setting... if not 'SDL_VIDEODRIVER' in os.environ: # http://docs.python.org/lib/module-sys.html # 0 (VER_PLATFORM_WIN32s) Win32s on Windows 3.1 # 1 (VER_PLATFORM_WIN32_WINDOWS) Windows 95/98/ME # 2 (VER_PLATFORM_WIN32_NT) Windows NT/2000/XP # 3 (VER_PLATFORM_WIN32_CE) Windows CE if hasattr(sys, "getwindowsversion"): try: if (sys.getwindowsversion()[3] in [1,2] and sys.getwindowsversion()[0] in [0,1,2,3,4,5]): os.environ['SDL_VIDEODRIVER'] = 'directx' except: pass class MissingModule: _NOT_IMPLEMENTED_ = True def __init__(self, name, info='', urgent=0): self.name = name self.info = str(info) try: exc = sys.exc_info() if exc[0] != None: self.reason = "%s: %s" % (exc[0].__name__, str(exc[1])) else: self.reason = "" finally: del exc self.urgent = urgent if urgent: self.warn() def __getattr__(self, var): if not self.urgent: self.warn() self.urgent = 1 MissingPygameModule = "%s module not available" % self.name if self.reason: MissingPygameModule += "\n(%s)" % self.reason raise NotImplementedError(MissingPygameModule) def __nonzero__(self): return 0 def warn(self): if self.urgent: type = 'import' else: type = 'use' message = '%s %s: %s' % (type, self.name, self.info) if self.reason: message += "\n(%s)" % self.reason try: import warnings if self.urgent: level = 4 else: level = 3 warnings.warn(message, RuntimeWarning, level) except ImportError: print (message) #we need to import like this, each at a time. the cleanest way to import #our modules is with the import command (not the __import__ function) #first, the "required" modules from pygame.base import * from pygame.constants import * from pygame.version import * from pygame.rect import Rect from pygame.compat import geterror import pygame.rwobject import pygame.surflock import pygame.color Color = color.Color __version__ = ver #next, the "standard" modules #we still allow them to be missing for stripped down pygame distributions try: import pygame.cdrom except (ImportError,IOError):cdrom=MissingModule("cdrom", geterror(), 1) try: import pygame.cursors except (ImportError,IOError):cursors=MissingModule("cursors", geterror(), 1) try: import pygame.display except (ImportError,IOError):display=MissingModule("display", geterror(), 1) try: import pygame.draw except (ImportError,IOError):draw=MissingModule("draw", geterror(), 1) try: import pygame.event except (ImportError,IOError):event=MissingModule("event", geterror(), 1) try: import pygame.image except (ImportError,IOError):image=MissingModule("image", geterror(), 1) try: import pygame.joystick except (ImportError,IOError):joystick=MissingModule("joystick", geterror(), 1) try: import pygame.key except (ImportError,IOError):key=MissingModule("key", geterror(), 1) try: import pygame.mouse except (ImportError,IOError):mouse=MissingModule("mouse", geterror(), 1) try: import pygame.sprite except (ImportError,IOError):sprite=MissingModule("sprite", geterror(), 1) try: import pygame.threads except (ImportError,IOError):threads=MissingModule("threads", geterror(), 1) def warn_unwanted_files(): """ Used to warn about unneeded old files. """ # a temporary hack to warn about camera.so and camera.pyd. install_path= os.path.split(pygame.base.__file__)[0] extension_ext = os.path.splitext(pygame.base.__file__)[1] # here are the .so/.pyd files we need to ask to remove. ext_to_remove = ["camera"] # here are the .py/.pyo/.pyc files we need to ask to remove. py_to_remove = ["color"] if os.name == "e32": # Don't warn on Symbian. The color.py is used as a wrapper. py_to_remove = [] # See if any of the files are there. extension_files = ["%s%s" % (x, extension_ext) for x in ext_to_remove] py_files = ["%s%s" % (x, py_ext) for py_ext in [".py", ".pyc", ".pyo"] for x in py_to_remove] files = py_files + extension_files unwanted_files = [] for f in files: unwanted_files.append( os.path.join( install_path, f ) ) ask_remove = [] for f in unwanted_files: if os.path.exists(f): ask_remove.append(f) if ask_remove: message = "Detected old file(s). Please remove the old files:\n" for f in ask_remove: message += "%s " % f message += "\nLeaving them there might break pygame. Cheers!\n\n" try: import warnings level = 4 warnings.warn(message, RuntimeWarning, level) except ImportError: print (message) # disable, because we hopefully don't need it. #warn_unwanted_files() try: from pygame.surface import * except (ImportError,IOError):Surface = lambda:Missing_Function try: import pygame.mask from pygame.mask import Mask except (ImportError,IOError):Mask = lambda:Missing_Function try: from pygame.pixelarray import * except (ImportError,IOError): PixelArray = lambda:Missing_Function try: from pygame.overlay import * except (ImportError,IOError):Overlay = lambda:Missing_Function try: import pygame.time except (ImportError,IOError):time=MissingModule("time", geterror(), 1) try: import pygame.transform except (ImportError,IOError):transform=MissingModule("transform", geterror(), 1) #lastly, the "optional" pygame modules try: import pygame.font import pygame.sysfont pygame.font.SysFont = pygame.sysfont.SysFont pygame.font.get_fonts = pygame.sysfont.get_fonts pygame.font.match_font = pygame.sysfont.match_font except (ImportError,IOError):font=MissingModule("font", geterror(), 0) # try and load pygame.mixer_music before mixer, for py2app... try: import pygame.mixer_music #del pygame.mixer_music #print ("NOTE2: failed importing pygame.mixer_music in lib/__init__.py") except (ImportError,IOError): pass try: import pygame.mixer except (ImportError,IOError):mixer=MissingModule("mixer", geterror(), 0) try: import pygame.movie except (ImportError,IOError):movie=MissingModule("movie", geterror(), 0) #try: import pygame.movieext #except (ImportError,IOError):movieext=MissingModule("movieext", geterror(), 0) try: import pygame.scrap except (ImportError,IOError):scrap=MissingModule("scrap", geterror(), 0) try: import pygame.surfarray except (ImportError,IOError):surfarray=MissingModule("surfarray", geterror(), 0) try: import pygame.sndarray except (ImportError,IOError):sndarray=MissingModule("sndarray", geterror(), 0) try: import pygame.fastevent except (ImportError,IOError):fastevent=MissingModule("fastevent", geterror(), 0) #there's also a couple "internal" modules not needed #by users, but putting them here helps "dependency finder" #programs get everything they need (like py2exe) try: import pygame.imageext; del pygame.imageext except (ImportError,IOError):pass def packager_imports(): """ Some additional things that py2app/py2exe will want to see """ import atexit import Numeric import numpy import OpenGL.GL import pygame.macosx import pygame.mac_scrap import pygame.bufferproxy import pygame.colordict #make Rects pickleable try: import copy_reg except ImportError: import copyreg as copy_reg def __rect_constructor(x,y,w,h): return Rect(x,y,w,h) def __rect_reduce(r): assert type(r) == Rect return __rect_constructor, (r.x, r.y, r.w, r.h) copy_reg.pickle(Rect, __rect_reduce, __rect_constructor) #make Colors pickleable def __color_constructor(r,g,b,a): return Color(r,g,b,a) def __color_reduce(c): assert type(c) == Color return __color_constructor, (c.r, c.g, c.b, c.a) copy_reg.pickle(Color, __color_reduce, __color_constructor) #cleanup namespace del pygame, os, sys, rwobject, surflock, MissingModule, copy_reg, geterror pygame-1.9.1release/examples/vgrade.py0000644000175000017500000000566311207055754017723 0ustar vincentvincent#!/usr/bin/env python """This example demonstrates creating an image with Numeric python, and displaying that through SDL. You can look at the method of importing numeric and pygame.surfarray. This method will fail 'gracefully' if it is not available. I've tried mixing in a lot of comments where the code might not be self explanatory, nonetheless it may still seem a bit strange. Learning to use numeric for images like this takes a bit of learning, but the payoff is extremely fast image manipulation in python. Just so you know how this breaks down. For each sampling of time, 30% goes to each creating the gradient and blitting the array. The final 40% goes to flipping/updating the display surface If using an SDL version at least 1.1.8 the window will have no border decorations. The code also demonstrates use of the timer events.""" import os, pygame from pygame.locals import * try: from Numeric import * from RandomArray import * except ImportError: raise SystemExit('This example requires Numeric and the pygame surfarray module') pygame.surfarray.use_arraytype('numeric') timer = 0 def stopwatch(message = None): "simple routine to time python code" global timer if not message: timer = pygame.time.get_ticks() return now = pygame.time.get_ticks() runtime = (now - timer)/1000.0 + .001 print ("%s %s %s" % (message, runtime, ('seconds\t(%.2ffps)'%(1.0/runtime)))) timer = now def VertGrad3D(surf, topcolor, bottomcolor): "creates a new 3d vertical gradient array" topcolor = array(topcolor, copy=0) bottomcolor = array(bottomcolor, copy=0) diff = bottomcolor - topcolor width, height = surf.get_size() # create array from 0.0 to 1.0 triplets column = arange(height, typecode=Float)/height column = repeat(column[:, NewAxis], [3], 1) # create a single column of gradient column = topcolor + (diff * column).astype(Int) # make the column a 3d image column by adding X column = column.astype(UnsignedInt8)[NewAxis,:,:] #3d array into 2d array column = pygame.surfarray.map_array(surf, column) # stretch the column into a full image return resize(column, (width, height)) def DisplayGradient(surf): "choose random colors and show them" stopwatch() colors = randint(0, 255, (2, 3)) grade = VertGrad3D(surf, colors[0], colors[1]) pygame.surfarray.blit_array(surf, grade) pygame.display.flip() stopwatch('Gradient:') def main(): pygame.init() size = 600, 400 os.environ['SDL_VIDEO_CENTERED'] = '1' screen = pygame.display.set_mode(size, NOFRAME, 0) pygame.event.set_blocked(MOUSEMOTION) #keep our queue cleaner pygame.time.set_timer(USEREVENT, 500) while 1: event = pygame.event.wait() if event.type in (QUIT, KEYDOWN, MOUSEBUTTONDOWN): break elif event.type == USEREVENT: DisplayGradient(screen) if __name__ == '__main__': main() pygame-1.9.1release/examples/testsprite.py0000644000175000017500000001537611207055754020663 0ustar vincentvincent#!/usr/bin/env python # like the testsprite.c that comes with sdl, this pygame version shows # lots of sprites moving around. import pygame, sys, os from pygame.locals import * from random import randint from time import time import pygame.joystick from pygame.compat import xrange_ ##import FastRenderGroup as FRG import pygame.sprite as FRG if "-psyco" in sys.argv: try: import psyco psyco.full() except Exception: print ("No psyco for you! psyco failed to import and run.") main_dir = os.path.split(os.path.abspath(__file__))[0] data_dir = os.path.join(main_dir, 'data') # use this to use update rects or not. # If the screen is mostly full, then update rects are not useful. update_rects = True if "-update_rects" in sys.argv: update_rects = True if "-noupdate_rects" in sys.argv: update_rects = False use_static = False if "-static" in sys.argv: use_static = True use_FastRenderGroup = False if "-FastRenderGroup" in sys.argv: update_rects = True use_FastRenderGroup = True flags = 0 if "-flip" in sys.argv: flags ^= DOUBLEBUF if "-fullscreen" in sys.argv: flags ^= FULLSCREEN if "-sw" in sys.argv: flags ^= SWSURFACE use_rle = True if "-hw" in sys.argv: flags ^= HWSURFACE use_rle = False screen_dims = [640, 480] if "-height" in sys.argv: i = sys.argv.index("-height") screen_dims[1] = int(sys.argv[i+1]) if "-width" in sys.argv: i = sys.argv.index("-width") screen_dims[0] = int(sys.argv[i+1]) if "-alpha" in sys.argv: use_alpha = True else: use_alpha = False print (screen_dims) ##class Thingy(pygame.sprite.Sprite): ## images = None ## def __init__(self): ## pygame.sprite.Sprite.__init__(self) ## self.image = Thingy.images[0] ## self.rect = self.image.get_rect() ## self.rect.x = randint(0, screen_dims[0]) ## self.rect.y = randint(0, screen_dims[1]) ## #self.vel = [randint(-10, 10), randint(-10, 10)] ## self.vel = [randint(-1, 1), randint(-1, 1)] ## ## def move(self): ## for i in [0, 1]: ## nv = self.rect[i] + self.vel[i] ## if nv >= screen_dims[i] or nv < 0: ## self.vel[i] = -self.vel[i] ## nv = self.rect[i] + self.vel[i] ## self.rect[i] = nv class Thingy(FRG.DirtySprite): images = None def __init__(self): ## pygame.sprite.Sprite.__init__(self) FRG.DirtySprite.__init__(self) self.image = Thingy.images[0] self.rect = self.image.get_rect() self.rect.x = randint(0, screen_dims[0]) self.rect.y = randint(0, screen_dims[1]) #self.vel = [randint(-10, 10), randint(-10, 10)] self.vel = [randint(-1, 1), randint(-1, 1)] self.dirty = 2 def update(self): for i in [0, 1]: nv = self.rect[i] + self.vel[i] if nv >= screen_dims[i] or nv < 0: self.vel[i] = -self.vel[i] nv = self.rect[i] + self.vel[i] self.rect[i] = nv class Static(FRG.DirtySprite): images = None def __init__(self): FRG.DirtySprite.__init__(self) self.image = Static.images[0] self.rect = self.image.get_rect() self.rect.x = randint(0, 3*screen_dims[0]/4) self.rect.y = randint(0, 3*screen_dims[1]/4) def main(update_rects = True, use_static = False, use_FastRenderGroup = False, screen_dims = [640, 480], use_alpha = False, flags = 0, ): """Show lots of sprites moving around Optional keyword arguments: update_rects - use the RenderUpdate sprite group class (default True) use_static - include non-moving images (default False) use_FastRenderGroup - Use the FastRenderGroup sprite group (default False) screen_dims - Pygame window dimensions (default [640, 480]) use_alpha - use alpha blending (default False) flags - additional display mode flags (default no addiontal flags) """ if use_FastRenderGroup: update_rects = True #pygame.init() pygame.display.init() #if "-fast" in sys.argv: screen = pygame.display.set_mode(screen_dims, flags) # this is mainly for GP2X, so it can quit. pygame.joystick.init() num_joysticks = pygame.joystick.get_count() if num_joysticks > 0: stick = pygame.joystick.Joystick(0) stick.init() # now we will receive events for the joystick screen.fill([0,0,0]) pygame.display.flip() sprite_surface = pygame.image.load(os.path.join(data_dir, "asprite.bmp")) sprite_surface2 = pygame.image.load(os.path.join(data_dir, "static.png")) if use_rle: sprite_surface.set_colorkey([0xFF, 0xFF, 0xFF], SRCCOLORKEY|RLEACCEL) sprite_surface2.set_colorkey([0xFF, 0xFF, 0xFF], SRCCOLORKEY|RLEACCEL) else: sprite_surface.set_colorkey([0xFF, 0xFF, 0xFF], SRCCOLORKEY) sprite_surface2.set_colorkey([0xFF, 0xFF, 0xFF], SRCCOLORKEY) if use_alpha: sprite_surface = sprite_surface.convert_alpha() sprite_surface2 = sprite_surface2.convert_alpha() else: sprite_surface = sprite_surface.convert() sprite_surface2 = sprite_surface2.convert() Thingy.images = [sprite_surface] if use_static: Static.images = [sprite_surface2] if len(sys.argv) > 1: try: numsprites = int(sys.argv[-1]) except Exception: numsprites = 100 else: numsprites = 100 sprites = None if use_FastRenderGroup: ## sprites = FRG.FastRenderGroup() sprites = FRG.LayeredDirty() else: if update_rects: sprites = pygame.sprite.RenderUpdates() else: sprites = pygame.sprite.Group() for i in xrange_(0, numsprites): if use_static and i%2==0: sprites.add(Static()) sprites.add(Thingy()) done = False frames = 0 start = time() background = pygame.Surface(screen.get_size()) background = background.convert() background.fill([0,0,0]) while not done: if not update_rects: screen.fill([0,0,0]) ## for sprite in sprites: ## sprite.move() if update_rects: sprites.clear(screen, background) sprites.update() rects = sprites.draw(screen) if update_rects: pygame.display.update(rects) else: pygame.display.flip() for event in pygame.event.get(): if event.type in [KEYDOWN, QUIT, JOYBUTTONDOWN]: done = True frames += 1 end = time() print ("FPS: %f" % (frames / ((end - start)))) pygame.quit() if __name__ == "__main__": main( update_rects, use_static, use_FastRenderGroup, screen_dims, use_alpha, flags ) pygame-1.9.1release/examples/stars.py0000644000175000017500000000467011207055754017604 0ustar vincentvincent#!/usr/bin/env python """A simple starfield example. Note you can move the 'center' of the starfield by leftclicking in the window. This example show the basics of creating a window, simple pixel plotting, and input event management""" import random, math, pygame from pygame.locals import * #constants WINSIZE = [640, 480] WINCENTER = [320, 240] NUMSTARS = 150 def init_star(): "creates new star values" dir = random.randrange(100000) velmult = random.random()*.6+.4 vel = [math.sin(dir) * velmult, math.cos(dir) * velmult] return vel, WINCENTER[:] def initialize_stars(): "creates a new starfield" stars = [] for x in range(NUMSTARS): star = init_star() vel, pos = star steps = random.randint(0, WINCENTER[0]) pos[0] = pos[0] + (vel[0] * steps) pos[1] = pos[1] + (vel[1] * steps) vel[0] = vel[0] * (steps * .09) vel[1] = vel[1] * (steps * .09) stars.append(star) move_stars(stars) return stars def draw_stars(surface, stars, color): "used to draw (and clear) the stars" for vel, pos in stars: pos = (int(pos[0]), int(pos[1])) surface.set_at(pos, color) def move_stars(stars): "animate the star values" for vel, pos in stars: pos[0] = pos[0] + vel[0] pos[1] = pos[1] + vel[1] if not 0 <= pos[0] <= WINSIZE[0] or not 0 <= pos[1] <= WINSIZE[1]: vel[:], pos[:] = init_star() else: vel[0] = vel[0] * 1.05 vel[1] = vel[1] * 1.05 def main(): "This is the starfield code" #create our starfield random.seed() stars = initialize_stars() clock = pygame.time.Clock() #initialize and prepare screen pygame.init() screen = pygame.display.set_mode(WINSIZE) pygame.display.set_caption('pygame Stars Example') white = 255, 240, 200 black = 20, 20, 40 screen.fill(black) #main game loop done = 0 while not done: draw_stars(screen, stars, black) move_stars(stars) draw_stars(screen, stars, white) pygame.display.update() for e in pygame.event.get(): if e.type == QUIT or (e.type == KEYUP and e.key == K_ESCAPE): done = 1 break elif e.type == MOUSEBUTTONDOWN and e.button == 1: WINCENTER[:] = list(e.pos) clock.tick(50) # if python says run, then we should run if __name__ == '__main__': main() pygame-1.9.1release/examples/sound_array_demos.py0000644000175000017500000001653011224566617022167 0ustar vincentvincent#!/usr/bin/env python """ Creates an echo effect an any Sound object. Uses sndarray and MumPy ( or Numeric) to create offset faded copies of the original sound. Currently it just uses hardcoded values for the number of echos and the delay. Easy for you to recreate as needed. The array packaged used can be specified by an optional --numpy or --numeric command line option. version 2. changes: - Should work with different sample rates now. - put into a function. - Uses NumPy by default, but falls back on Numeric. """ __author__ = "Pete 'ShredWheat' Shinners, Rene Dudfield" __copyright__ = "Copyright (C) 2004 Pete Shinners, Copyright (C) 2005 Rene Dudfield" __license__ = "Public Domain" __version__ = "2.0" import sys import os.path import pygame.mixer, pygame.time, pygame.sndarray, pygame import pygame.surfarray, pygame.transform from pygame import sndarray, mixer import time from math import sin #mixer.init(44100, -16, 0) mixer.init() #mixer.init(11025, -16, 0) #mixer.init(11025) def make_echo(sound, samples_per_second, mydebug = True): """ returns a sound which is echoed of the last one. """ echo_length = 3.5 a1 = sndarray.array(sound) if mydebug: print ('SHAPE1: %s' % (a1.shape,)) length = a1.shape[0] #myarr = zeros(length+12000) myarr = zeros(a1.shape, int32) if len(a1.shape) > 1: mult = a1.shape[1] size = (a1.shape[0] + int(echo_length * a1.shape[0]), a1.shape[1]) #size = (a1.shape[0] + int(a1.shape[0] + (echo_length * 3000)), a1.shape[1]) else: mult = 1 size = (a1.shape[0] + int(echo_length * a1.shape[0]),) #size = (a1.shape[0] + int(a1.shape[0] + (echo_length * 3000)),) if mydebug: print (int(echo_length * a1.shape[0])) myarr = zeros(size, int32) if mydebug: print ("size %s" % (size,)) print (myarr.shape) myarr[:length] = a1 #print (myarr[3000:length+3000]) #print (a1 >> 1) #print ("a1.shape %s" % (a1.shape,)) #c = myarr[3000:length+(3000*mult)] #print ("c.shape %s" % (c.shape,)) incr = int(samples_per_second / echo_length) gap = length myarr[incr:gap+incr] += a1>>1 myarr[incr*2:gap+(incr*2)] += a1>>2 myarr[incr*3:gap+(incr*3)] += a1>>3 myarr[incr*4:gap+(incr*4)] += a1>>4 if mydebug: print ('SHAPE2: %s' % (myarr.shape,)) sound2 = sndarray.make_sound(myarr.astype(int16)) return sound2 def slow_down_sound(sound, rate): """ returns a sound which is a slowed down version of the original. rate - at which the sound should be slowed down. eg. 0.5 would be half speed. """ raise NotImplementedError() grow_rate = 1 / rate # make it 1/rate times longer. a1 = sndarray.array(sound) surf = pygame.surfarray.make_surface(a1) print (a1.shape[0] * grow_rate) scaled_surf = pygame.transform.scale(surf, (int(a1.shape[0] * grow_rate), a1.shape[1])) print (scaled_surf) print (surf) a2 = a1 * rate print (a1.shape) print (a2.shape) print (a2) sound2 = sndarray.make_sound(a2.astype(int16)) return sound2 def sound_from_pos(sound, start_pos, samples_per_second = None, inplace = 1): """ returns a sound which begins at the start_pos. start_pos - in seconds from the begining. samples_per_second - """ # see if we want to reuse the sound data or not. if inplace: a1 = pygame.sndarray.samples(sound) else: a1 = pygame.sndarray.array(sound) # see if samples per second has been given. If not, query the mixer. # eg. it might be set to 22050 if samples_per_second is None: samples_per_second = pygame.mixer.get_init()[0] # figure out the start position in terms of samples. start_pos_in_samples = int(start_pos * samples_per_second) # cut the begining off the sound at the start position. a2 = a1[start_pos_in_samples:] # make the Sound instance from the array. sound2 = pygame.sndarray.make_sound(a2) return sound2 def main(arraytype=None): """play various sndarray effects If arraytype is provided then use that array package. Valid values are 'numeric' or 'numpy'. Otherwise default to NumPy, or fall back on Numeric if NumPy is not installed. """ global zeros, int16, int32 main_dir = os.path.split(os.path.abspath(__file__))[0] if arraytype is None: if 'numpy' in sndarray.get_arraytypes(): sndarray.use_arraytype('numpy') elif 'numeric' in sndarray.get_arraytype(): sndarray.use_arraytype('numeric') else: raise ImportError('No array package is installed') else: sndarray.use_arraytype(arraytype) pygame.surfarray.use_arraytype(sndarray.get_arraytype()) if sndarray.get_arraytype() == 'numpy': from numpy import zeros, int16, int32 else: from Numeric import zeros, Int16 as int16, Int32 as int32 print ("Using %s array package" % sndarray.get_arraytype()) print ("mixer.get_init %s" % (mixer.get_init(),)) inited = mixer.get_init() samples_per_second = pygame.mixer.get_init()[0] print (("-" * 30) + "\n") print ("loading sound") sound = mixer.Sound(os.path.join(main_dir, 'data', 'car_door.wav')) print ("-" * 30) print ("start positions") print ("-" * 30) start_pos = 0.1 sound2 = sound_from_pos(sound, start_pos, samples_per_second) print ("sound.get_length %s" % (sound.get_length(),)) print ("sound2.get_length %s" % (sound2.get_length(),)) sound2.play() while mixer.get_busy(): pygame.time.wait(200) print ("waiting 2 seconds") pygame.time.wait(2000) print ("playing original sound") sound.play() while mixer.get_busy(): pygame.time.wait(200) print ("waiting 2 seconds") pygame.time.wait(2000) if 0: #TODO: this is broken. print (("-" * 30) + "\n") print ("Slow down the original sound.") rate = 0.2 slowed_sound = slow_down_sound(sound, rate) slowed_sound.play() while mixer.get_busy(): pygame.time.wait(200) print ("-" * 30) print ("echoing") print ("-" * 30) t1 = time.time() sound2 = make_echo(sound, samples_per_second) print ("time to make echo %i" % (time.time() - t1,)) print ("original sound") sound.play() while mixer.get_busy(): pygame.time.wait(200) print ("echoed sound") sound2.play() while mixer.get_busy(): pygame.time.wait(200) sound = mixer.Sound(os.path.join(main_dir, 'data', 'secosmic_lo.wav')) t1 = time.time() sound3 = make_echo(sound, samples_per_second) print ("time to make echo %i" % (time.time() - t1,)) print ("original sound") sound.play() while mixer.get_busy(): pygame.time.wait(200) print ("echoed sound") sound3.play() while mixer.get_busy(): pygame.time.wait(200) def usage(): print ("Usage: command line option [--numpy|--numeric]") print (" The default is to use NumPy if installed,") print (" otherwise Numeric") if __name__ == '__main__': if len(sys.argv) == 2: if '--numpy' in sys.argv: main('numpy') elif '--numeric' in sys.argv: main('numeric') else: usage() elif len(sys.argv) == 1: main() else: usage() pygame-1.9.1release/examples/sound.py0000644000175000017500000000251711207055754017576 0ustar vincentvincent#!/usr/bin/env python """extremely simple demonstration playing a soundfile and waiting for it to finish. you'll need the pygame.mixer module for this to work. Note how in this simple example we don't even bother loading all of the pygame package. Just pick the mixer for sound and time for the delay function. Optional command line argument: the name of an audio file. """ import os.path, sys import pygame.mixer, pygame.time mixer = pygame.mixer time = pygame.time main_dir = os.path.split(os.path.abspath(__file__))[0] def main(file_path=None): """Play an audio file as a buffered sound sample Option argument: the name of an audio file (default data/secosmic_low.wav """ if file_path is None: file_path = os.path.join(main_dir, 'data', 'secosmic_lo.wav') #choose a desired audio format mixer.init(11025) #raises exception on fail #load the sound sound = mixer.Sound(file_path) #start playing print ('Playing Sound...') channel = sound.play() #poll until finished while channel.get_busy(): #still playing print (' ...still going...') time.wait(1000) print ('...Finished') if __name__ == '__main__': if len(sys.argv) > 1: main(sys.argv[1]) else: main() pygame-1.9.1release/examples/scroll.py0000644000175000017500000001521011207055754017736 0ustar vincentvincent#!/usr/bin/env python """An zoomed image viewer that demonstrates Surface.scroll This example shows a scrollable image that has a zoom factor of eight. It uses the Surface.scroll function to shift the image on the display surface. A clip rectangle protects a margin area. If called as a function, the example accepts an optional image file path. If run as a program it takes an optional file path command line argument. If no file is provided a default image file is used. When running click on a black triangle to move one pixel in the direction the triangle points. Or use the arrow keys. Close the window or press ESC to quit. """ import sys import os import pygame from pygame.transform import scale from pygame.locals import * main_dir = os.path.dirname(os.path.abspath(__file__)) DIR_UP = 1 DIR_DOWN = 2 DIR_LEFT = 3 DIR_RIGHT = 4 zoom_factor = 8 def draw_arrow(surf, color, posn, direction): x, y = posn if direction == DIR_UP: pointlist = ((x - 29, y + 30), (x + 30, y + 30), (x + 1, y - 29), (x, y - 29)) elif direction == DIR_DOWN: pointlist = ((x - 29, y - 29), (x + 30, y - 29), (x + 1, y + 30), (x, y + 30)) elif direction == DIR_LEFT: pointlist = ((x + 30, y - 29), (x + 30, y + 30), (x - 29, y + 1), (x - 29, y)) else: pointlist = ((x - 29, y - 29), (x - 29, y + 30), (x + 30, y + 1), (x + 30, y)) pygame.draw.polygon(surf, color, pointlist) def add_arrow_button(screen, regions, posn, direction): draw_arrow(screen, Color('black'), posn, direction) draw_arrow(regions, (direction, 0, 0), posn, direction) def scroll_view(screen, image, direction, view_rect): dx = dy = 0 src_rect = None zoom_view_rect = screen.get_clip() image_w, image_h = image.get_size() if direction == DIR_UP: if view_rect.top > 0: screen.scroll(dy=zoom_factor) view_rect.move_ip(0, -1) src_rect = view_rect.copy() src_rect.h = 1 dst_rect = zoom_view_rect.copy() dst_rect.h = zoom_factor elif direction == DIR_DOWN: if view_rect.bottom < image_h: screen.scroll(dy=-zoom_factor) view_rect.move_ip(0, 1) src_rect = view_rect.copy() src_rect.h = 1 src_rect.bottom = view_rect.bottom dst_rect = zoom_view_rect.copy() dst_rect.h = zoom_factor dst_rect.bottom = zoom_view_rect.bottom elif direction == DIR_LEFT: if view_rect.left > 0: screen.scroll(dx=zoom_factor) view_rect.move_ip(-1, 0) src_rect = view_rect.copy() src_rect.w = 1 dst_rect = zoom_view_rect.copy() dst_rect.w = zoom_factor elif direction == DIR_RIGHT: if view_rect.right < image_w: screen.scroll(dx=-zoom_factor) view_rect.move_ip(1, 0) src_rect = view_rect.copy() src_rect.w = 1 src_rect.right = view_rect.right dst_rect = zoom_view_rect.copy() dst_rect.w = zoom_factor dst_rect.right = zoom_view_rect.right if src_rect is not None: scale(image.subsurface(src_rect), dst_rect.size, screen.subsurface(dst_rect)) pygame.display.update(zoom_view_rect) def main(image_file=None): if image_file is None: image_file = os.path.join(main_dir, 'data', 'arraydemo.bmp') margin = 80 view_size = (30, 20) zoom_view_size = (view_size[0] * zoom_factor, view_size[1] * zoom_factor) win_size = (zoom_view_size[0] + 2 * margin, zoom_view_size[1] + 2 * margin) background_color = Color('beige') pygame.init() # set up key repeating so we can hold down the key to scroll. old_k_delay, old_k_interval = pygame.key.get_repeat () pygame.key.set_repeat (500, 30) try: screen = pygame.display.set_mode(win_size) screen.fill(background_color) pygame.display.flip() image = pygame.image.load(image_file).convert() image_w, image_h = image.get_size() if image_w < view_size[0] or image_h < view_size[1]: print ("The source image is too small for this example.") print ("A %i by %i or larger image is required." % zoom_view_size) return regions = pygame.Surface(win_size, 0, 24) add_arrow_button(screen, regions, (40, win_size[1] // 2), DIR_LEFT) add_arrow_button(screen, regions, (win_size[0] - 40, win_size[1] // 2), DIR_RIGHT) add_arrow_button(screen, regions, (win_size[0] // 2, 40), DIR_UP) add_arrow_button(screen, regions, (win_size[0] // 2, win_size[1] - 40), DIR_DOWN) pygame.display.flip() screen.set_clip((margin, margin, zoom_view_size[0], zoom_view_size[1])) view_rect = Rect(0, 0, view_size[0], view_size[1]) scale(image.subsurface(view_rect), zoom_view_size, screen.subsurface(screen.get_clip())) pygame.display.flip() # the direction we will scroll in. direction = None clock = pygame.time.Clock() clock.tick() going = True while going: # wait for events before doing anything. #events = [pygame.event.wait()] + pygame.event.get() events = pygame.event.get() for e in events: if e.type == KEYDOWN: if e.key == K_ESCAPE: going = False elif e.key == K_DOWN: scroll_view(screen, image, DIR_DOWN, view_rect) elif e.key == K_UP: scroll_view(screen, image, DIR_UP, view_rect) elif e.key == K_LEFT: scroll_view(screen, image, DIR_LEFT, view_rect) elif e.key == K_RIGHT: scroll_view(screen, image, DIR_RIGHT, view_rect) elif e.type == QUIT: going = False elif e.type == MOUSEBUTTONDOWN: direction = regions.get_at(e.pos)[0] elif e.type == MOUSEBUTTONUP: direction = None if direction: scroll_view(screen, image, direction, view_rect) clock.tick(30) finally: pygame.key.set_repeat (old_k_delay, old_k_interval) pygame.quit() if __name__ == '__main__': if len(sys.argv) > 1: image_file = sys.argv[1] else: image_file = None main(image_file) pygame-1.9.1release/examples/scrap_clipboard.py0000644000175000017500000000520511207055754021572 0ustar vincentvincent#!/usr/bin/env python """ Demonstrates the clipboard capabilities of pygame. """ import os import pygame from pygame.locals import * import pygame.scrap as scrap import StringIO def usage (): print ("Press the 'g' key to get all of the current clipboard data") print ("Press the 'p' key to put a string into the clipboard") print ("Press the 'a' key to get a list of the currently available types") print ("Press the 'i' key to put an image into the clipboard") main_dir = os.path.split(os.path.abspath(__file__))[0] pygame.init () screen = pygame.display.set_mode ((200, 200)) c = pygame.time.Clock () going = True # Initialize the scrap module and use the clipboard mode. scrap.init () scrap.set_mode (SCRAP_CLIPBOARD) usage () while going: for e in pygame.event.get (): if e.type == QUIT or (e.type == KEYDOWN and e.key == K_ESCAPE): going = False elif e.type == KEYDOWN and e.key == K_g: # This means to look for data. print ("Getting the different clipboard data..") for t in scrap.get_types (): r = scrap.get (t) if r and len (r) > 500: print ("Type %s : (large buffer)" % t) else: print ("Type %s : %s" % (t, r)) if "image" in t: namehint = t.split("/")[1] if namehint in ['bmp', 'png', 'jpg']: f = StringIO.StringIO(r) loaded_surf = pygame.image.load(f, "." + namehint) screen.blit(loaded_surf, (0,0)) elif e.type == KEYDOWN and e.key == K_p: # Place some text into the selection. print ("Placing clipboard text.") scrap.put (SCRAP_TEXT, "Hello. This is a message from scrap.") elif e.type == KEYDOWN and e.key == K_a: # Get all available types. print ("Getting the available types from the clipboard.") types = scrap.get_types () print (types) if len (types) > 0: print ("Contains %s: %s" % (types[0], scrap.contains (types[0]))) print ("Contains _INVALID_: ", scrap.contains ("_INVALID_")) elif e.type == KEYDOWN and e.key == K_i: print ("Putting image into the clipboard.") scrap.set_mode (SCRAP_CLIPBOARD) fp = open (os.path.join(main_dir, 'data', 'liquid.bmp'), 'rb') buf = fp.read () scrap.put ("image/bmp", buf) fp.close () elif e.type in (KEYDOWN, MOUSEBUTTONDOWN): usage () pygame.display.flip() c.tick(40) pygame-1.9.1release/examples/scaletest.py0000644000175000017500000001052611207055754020434 0ustar vincentvincent#!/usr/bin/env python import sys, time import pygame def main(imagefile, convert_alpha=False, run_speed_test=False): """show an interactive image scaler arguemnts: imagefile - name of source image (required) convert_alpha - use convert_alpha() on the surf (default False) run_speed_test - (default False) """ bSpeedTest = run_speed_test # initialize display pygame.display.init() # load background image background = pygame.image.load(imagefile) if convert_alpha: screen = pygame.display.set_mode((1024, 768), pygame.FULLSCREEN) background = background.convert_alpha() if bSpeedTest: SpeedTest(background) return screen = pygame.display.set_mode((1024, 768), pygame.FULLSCREEN) # start fullscreen mode # turn off the mouse pointer pygame.mouse.set_visible(0) # main loop bRunning = True bUp = False bDown = False bLeft = False bRight = False cursize = [background.get_width(), background.get_height()] while(bRunning): image = pygame.transform.smoothscale(background, cursize) imgpos = image.get_rect(centerx=512, centery=384) screen.fill((255,255,255)) screen.blit(image, imgpos) pygame.display.flip() for event in pygame.event.get(): if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE): bRunning = False if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: bUp = True if event.key == pygame.K_DOWN: bDown = True if event.key == pygame.K_LEFT: bLeft = True if event.key == pygame.K_RIGHT: bRight = True if event.type == pygame.KEYUP: if event.key == pygame.K_UP: bUp = False if event.key == pygame.K_DOWN: bDown = False if event.key == pygame.K_LEFT: bLeft = False if event.key == pygame.K_RIGHT: bRight = False if bUp: cursize[1] -= 2 if cursize[1] < 1: cursize[1] = 1 if bDown: cursize[1] += 2 if bLeft: cursize[0] -= 2 if cursize[0] < 1: cursize[0] = 1 if bRight: cursize[0] += 2 def SpeedTest(image): print ("Smoothscale Speed Test - Image Size %s\n" % str(image.get_size())) imgsize = [image.get_width(), image.get_height()] duration = 0.0 for i in range(128): shrinkx = (imgsize[0] * i) / 128 shrinky = (imgsize[1] * i) / 128 start = time.time() tempimg = pygame.transform.smoothscale(image, (shrinkx, shrinky)) duration += (time.time() - start) del tempimg print ("Average smooth shrink time: %i milliseconds." % int((duration / 128) * 1000)) duration = 0 for i in range(128): expandx = (imgsize[0] * (i + 129)) / 128 expandy = (imgsize[1] * (i + 129)) / 128 start = time.time() tempimg = pygame.transform.smoothscale(image, (expandx, expandy)) duration += (time.time() - start) del tempimg print ("Average smooth expand time: %i milliseconds." % int((duration / 128) * 1000)) duration = 0.0 for i in range(128): shrinkx = (imgsize[0] * i) / 128 shrinky = (imgsize[1] * i) / 128 start = time.time() tempimg = pygame.transform.scale(image, (shrinkx, shrinky)) duration += (time.time() - start) del tempimg print ("Average jaggy shrink time: %i milliseconds." % int((duration / 128) * 1000)) duration = 0 for i in range(128): expandx = (imgsize[0] * (i + 129)) / 128 expandy = (imgsize[1] * (i + 129)) / 128 start = time.time() tempimg = pygame.transform.scale(image, (expandx, expandy)) duration += (time.time() - start) del tempimg print ("Average jaggy expand time: %i milliseconds." % int((duration / 128) * 1000)) if __name__ == '__main__': # check input parameters if len(sys.argv) < 2: print ("Usage: %s ImageFile [-t] [-convert_alpha]" % sys.argv[0]) print (" [-t] = Run Speed Test\n") print (" [-convert_alpha] = Use convert_alpha() on the surf.\n") else: main(sys.argv[1], convert_alpha = '-convert_alpha' in sys.argv, run_speed_test = '-t' in sys.argv) pygame-1.9.1release/examples/readme.txt0000644000175000017500000000521410613754672020074 0ustar vincentvincentThese examples should help get you started with pyGame. Here is a brief rundown of what you get. The source code for these examples is in the public domain. Feel free to use for your own projects. uberball.py - This was added for pygame-1.5. It is a more complete game, similar to breakout. Derived from the pygame chimp example it shows how to do menu screens and a more complete game. aliens.py - This started off as a port of the SDL demonstration, Aliens. Now it has evolved into something sort of resembling fun. This demonstrates a lot of different uses of sprites and optimized blitting. Also transparancy, colorkeys, fonts, sound, music, joystick, and more. (PS, my high score is 117! goodluck) oldalien.py - This more closely resembles a port of the SDL Aliens demo. The code is a lot simpler, so it makes a better starting point for people looking at code for the first times. These blitting routines are not as optimized as they should/could be, but the code is easier to follow, and it plays quick enough. stars.py - A simple starfield example. You can change the center of perspective by leftclicking the mouse on the screen. fonty.py - Super quick, super simple application demonstrating the different ways to render fonts with the font module vgrade.py - Demonstrates creating a vertical gradient with Numeric python. The app will create a new gradient every half second and report the time needed to create and display the image. If you're not prepared to start working with the Numeric arrays, don't worry about the source for this one :] arraydemo.py - Another example filled with various surfarray effects. It requires the surfarray and image modules to be installed. This little demo can also make a good starting point for any of your own tests with surfarray sound.py - Extremely basic testing of the mixer module. Load a sound and play it. All from the command shell, no graphics. liquid.py - This example was created in a quick comparison with the BlitzBasic gaming language. Nonetheless, it demonstrates a quick 8-bit setup (with colormap). glcube.py - Using PyOpenGL and Pygame, this creates a spinning 3D multicolored cube. scrap_clipboard.py - A simple demonstration example for the clipboard support. data/ - directory with the resources for the examples We're always on the lookout for more examples and/or example requests. Code like this is probably the best way to start getting involved with python gaming. Pete Shinners shredwheat@mediaone.net pySDL : http://pysdl.sourceforge.net SDL : http://www.libsdl.org aliens.c : http://www.libsdl.org/projects/aliens pygame-1.9.1release/examples/pixelarray.py0000644000175000017500000000572211207055754020627 0ustar vincentvincent#!/usr/bin/env python import os, pygame from pygame.compat import xrange_ main_dir = os.path.split(os.path.abspath(__file__))[0] data_dir = os.path.join(main_dir, 'data') def show (image): screen = pygame.display.get_surface() screen.fill ((255, 255, 255)) screen.blit (image, (0, 0)) pygame.display.flip () while 1: event = pygame.event.wait () if event.type == pygame.QUIT: raise SystemExit if event.type == pygame.MOUSEBUTTONDOWN: break def main(): pygame.init () pygame.display.set_mode ((255, 255)) surface = pygame.Surface ((255, 255)) pygame.display.flip () # Create the PixelArray. ar = pygame.PixelArray (surface) r, g, b = 0, 0, 0 # Do some easy gradient effect. for y in xrange_ (255): r, g, b = y, y, y ar[:,y] = (r, g, b) del ar show (surface) # We have made some gradient effect, now flip it. ar = pygame.PixelArray (surface) ar[:] = ar[:,::-1] del ar show (surface) # Every second column will be made blue ar = pygame.PixelArray (surface) ar[::2] = (0, 0, 255) del ar show (surface) # Every second row will be made green ar = pygame.PixelArray (surface) ar[:,::2] = (0, 255, 0) del ar show (surface) # Manipulate the image. Flip it around the y axis. surface = pygame.image.load (os.path.join (data_dir, 'arraydemo.bmp')) ar = pygame.PixelArray (surface) ar[:] = ar[:,::-1] del ar show (surface) # Flip the image around the x axis. ar = pygame.PixelArray (surface) ar[:] = ar[::-1,:] del ar show (surface) # Every second column will be made white. ar = pygame.PixelArray (surface) ar[::2] = (255, 255, 255) del ar show (surface) # Flip the image around both axes, restoring it's original layout. ar = pygame.PixelArray (surface) ar[:] = ar[::-1,::-1] del ar show (surface) # Scale it by throwing each second pixel away. surface = pygame.image.load (os.path.join (data_dir, 'arraydemo.bmp')) ar = pygame.PixelArray (surface) sf2 = ar[::2,::2].make_surface () del ar show (sf2) # Replace anything looking like the blue color from the text. ar = pygame.PixelArray (surface) ar.replace ((60, 60, 255), (0, 255, 0), 0.06) del ar show (surface) # Extract anything which might be somewhat black. surface = pygame.image.load (os.path.join (data_dir, 'arraydemo.bmp')) ar = pygame.PixelArray (surface) ar2 = ar.extract ((0, 0, 0), 0.07) sf2 = ar2.surface del ar, ar2 show (sf2) # Compare two images. surface = pygame.image.load (os.path.join (data_dir, 'alien1.gif')) surface2 = pygame.image.load (os.path.join (data_dir, 'alien2.gif')) ar1 = pygame.PixelArray (surface) ar2 = pygame.PixelArray (surface2) ar3 = ar1.compare (ar2, 0.07) sf3 = ar3.surface del ar1, ar2, ar3 show (sf3) if __name__ == '__main__': main() pygame-1.9.1release/examples/overlay.py0000644000175000017500000000256511207055754020132 0ustar vincentvincent#!/usr/bin/env python import sys import pygame from pygame.compat import xrange_ SR= (800,600) ovl= None ######################################################################## # Simple video player def vPlayer( fName ): global ovl f= open( fName, 'rb' ) fmt= f.readline().strip() res= f.readline().strip() col= f.readline().strip() if fmt!= "P5": print ('Unknown format( len %d ). Exiting...' % len( fmt )) return w,h= [ int(x) for x in res.split( ' ' ) ] h= ( h* 2 )/ 3 # Read into strings y= f.read( w*h ) u= [] v= [] for i in xrange_( 0, h/2 ): u.append( f.read( w/2 )) v.append( f.read( w/2 )) u= ''.join(u) v= ''.join(v) # Open overlay with the resolution specified ovl= pygame.Overlay(pygame.YV12_OVERLAY, (w,h)) ovl.set_location(0, 0, w, h) ovl.display((y,u,v)) while 1: pygame.time.wait(10) for ev in pygame.event.get(): if ev.type in (pygame.KEYDOWN, pygame.QUIT): return def main(fname): """play video file fname""" pygame.init() try: pygame.display.set_mode(SR) vPlayer(fname) finally: pygame.quit() # Test all modules if __name__== '__main__': if len( sys.argv )!= 2: print ("Usage: play_file ") else: main(sys.argv[1]) pygame-1.9.1release/examples/oldalien.py0000644000175000017500000001507211207055754020235 0ustar vincentvincent#!/usr/bin/env python """This is a much simpler version of the aliens.py example. It makes a good place for beginners to get used to the way pygame works. Gameplay is pretty similar, but there are a lot less object types to worry about, and it makes no attempt at using the optional pygame modules. It does provide a good method for using the updaterects to only update the changed parts of the screen, instead of the entire screen surface. This has large speed benefits and should be used whenever the fullscreen isn't being changed.""" #import import random, os.path, sys import pygame from pygame.locals import * if not pygame.image.get_extended(): raise SystemExit("Requires the extended image loading from SDL_image") #constants FRAMES_PER_SEC = 40 PLAYER_SPEED = 12 MAX_SHOTS = 2 SHOT_SPEED = 10 ALIEN_SPEED = 12 ALIEN_ODDS = 45 EXPLODE_TIME = 6 SCREENRECT = Rect(0, 0, 640, 480) #some globals for friendly access dirtyrects = [] # list of update_rects next_tick = 0 # used for timing class Img: pass # container for images main_dir = os.path.split(os.path.abspath(__file__))[0] # Program's diretory #first, we define some utility functions def load_image(file, transparent): "loads an image, prepares it for play" file = os.path.join(main_dir, 'data', file) try: surface = pygame.image.load(file) except pygame.error: raise SystemExit('Could not load image "%s" %s' % (file, pygame.get_error())) if transparent: corner = surface.get_at((0, 0)) surface.set_colorkey(corner, RLEACCEL) return surface.convert() # The logic for all the different sprite types class Actor: "An enhanced sort of sprite class" def __init__(self, image): self.image = image self.rect = image.get_rect() def update(self): "update the sprite state for this frame" pass def draw(self, screen): "draws the sprite into the screen" r = screen.blit(self.image, self.rect) dirtyrects.append(r) def erase(self, screen, background): "gets the sprite off of the screen" r = screen.blit(background, self.rect, self.rect) dirtyrects.append(r) class Player(Actor): "Cheer for our hero" def __init__(self): Actor.__init__(self, Img.player) self.alive = 1 self.reloading = 0 self.rect.centerx = SCREENRECT.centerx self.rect.bottom = SCREENRECT.bottom - 10 def move(self, direction): self.rect = self.rect.move(direction*PLAYER_SPEED, 0).clamp(SCREENRECT) class Alien(Actor): "Destroy him or suffer" def __init__(self): Actor.__init__(self, Img.alien) self.facing = random.choice((-1,1)) * ALIEN_SPEED if self.facing < 0: self.rect.right = SCREENRECT.right def update(self): global SCREENRECT self.rect[0] = self.rect[0] + self.facing if not SCREENRECT.contains(self.rect): self.facing = -self.facing; self.rect.top = self.rect.bottom + 3 self.rect = self.rect.clamp(SCREENRECT) class Explosion(Actor): "Beware the fury" def __init__(self, actor): Actor.__init__(self, Img.explosion) self.life = EXPLODE_TIME self.rect.center = actor.rect.center def update(self): self.life = self.life - 1 class Shot(Actor): "The big payload" def __init__(self, player): Actor.__init__(self, Img.shot) self.rect.centerx = player.rect.centerx self.rect.top = player.rect.top - 10 def update(self): self.rect.top = self.rect.top - SHOT_SPEED def main(): "Run me for adrenaline" global dirtyrects # Initialize SDL components pygame.init() screen = pygame.display.set_mode(SCREENRECT.size, 0) clock = pygame.time.Clock() # Load the Resources Img.background = load_image('background.gif', 0) Img.shot = load_image('shot.gif', 1) Img.bomb = load_image('bomb.gif', 1) Img.danger = load_image('danger.gif', 1) Img.alien = load_image('alien1.gif', 1) Img.player = load_image('oldplayer.gif', 1) Img.explosion = load_image('explosion1.gif', 1) # Create the background background = pygame.Surface(SCREENRECT.size) for x in range(0, SCREENRECT.width, Img.background.get_width()): background.blit(Img.background, (x, 0)) screen.blit(background, (0,0)) pygame.display.flip() # Initialize Game Actors player = Player() aliens = [Alien()] shots = [] explosions = [] # Main loop while player.alive or explosions: clock.tick(FRAMES_PER_SEC) # Gather Events pygame.event.pump() keystate = pygame.key.get_pressed() if keystate[K_ESCAPE] or pygame.event.peek(QUIT): break # Clear screen and update actors for actor in [player] + aliens + shots + explosions: actor.erase(screen, background) actor.update() # Clean Dead Explosions and Bullets for e in explosions: if e.life <= 0: explosions.remove(e) for s in shots: if s.rect.top <= 0: shots.remove(s) # Move the player direction = keystate[K_RIGHT] - keystate[K_LEFT] player.move(direction) # Create new shots if not player.reloading and keystate[K_SPACE] and len(shots) < MAX_SHOTS: shots.append(Shot(player)) player.reloading = keystate[K_SPACE] # Create new alien if not int(random.random() * ALIEN_ODDS): aliens.append(Alien()) # Detect collisions alienrects = [] for a in aliens: alienrects.append(a.rect) hit = player.rect.collidelist(alienrects) if hit != -1: alien = aliens[hit] explosions.append(Explosion(alien)) explosions.append(Explosion(player)) aliens.remove(alien) player.alive = 0 for shot in shots: hit = shot.rect.collidelist(alienrects) if hit != -1: alien = aliens[hit] explosions.append(Explosion(alien)) shots.remove(shot) aliens.remove(alien) break # Draw everybody for actor in [player] + aliens + shots + explosions: actor.draw(screen) pygame.display.update(dirtyrects) dirtyrects = [] pygame.time.wait(50) #if python says run, let's run! if __name__ == '__main__': main() pygame-1.9.1release/examples/movieplayer.py0000644000175000017500000000274511207055754021005 0ustar vincentvincent#!/usr/bin/env python import pygame from pygame.locals import * import sys try: from cStringIO import StringIO as BytesIO except ImportError: from io import BytesIO from pygame.compat import unicode_ QUIT_CHAR = unicode_('q') usage = """\ python movieplayer.py A simple movie player that plays an MPEG movie in a Pygame window. It showcases the pygame.movie module. The window adjusts to the size of the movie image. It is given a boarder to demonstrate that a movie can play autonomously in a sub- window. Also, the file is copied to a file like object to show that not just Python files can be used as a movie source. """ def main(filepath): pygame.init() pygame.mixer.quit() f = BytesIO(open(filepath, 'rb').read()) movie = pygame.movie.Movie(f) w, h = movie.get_size() w = int(w * 1.3 + 0.5) h = int(h * 1.3 + 0.5) wsize = (w+10, h+10) msize = (w, h) screen = pygame.display.set_mode(wsize) movie.set_display(screen, Rect((5, 5), msize)) pygame.event.set_allowed((QUIT, KEYDOWN)) pygame.time.set_timer(USEREVENT, 1000) movie.play() while movie.get_busy(): evt = pygame.event.wait() if evt.type == QUIT: break if evt.type == KEYDOWN and evt.unicode == QUIT_CHAR: break if movie.get_busy(): movie.stop() pygame.time.set_timer(USEREVENT, 0) if __name__ == '__main__': if len(sys.argv) != 2: print (usage) else: main(sys.argv[1]) pygame-1.9.1release/examples/moveit.py0000644000175000017500000000345511207055754017753 0ustar vincentvincent#!/usr/bin/env python """ This is the full and final example from the Pygame Tutorial, "How Do I Make It Move". It creates 10 objects and animates them on the screen. Note it's a bit scant on error checking, but it's easy to read. :] Fortunately, this is python, and we needn't wrestle with a pile of error codes. """ #import everything import os, pygame from pygame.locals import * main_dir = os.path.split(os.path.abspath(__file__))[0] #our game object class class GameObject: def __init__(self, image, height, speed): self.speed = speed self.image = image self.pos = image.get_rect().move(0, height) def move(self): self.pos = self.pos.move(self.speed, 0) if self.pos.right > 600: self.pos.left = 0 #quick function to load an image def load_image(name): path = os.path.join(main_dir, 'data', name) return pygame.image.load(path).convert() #here's the full code def main(): pygame.init() screen = pygame.display.set_mode((640, 480)) player = load_image('player1.gif') background = load_image('liquid.bmp') # scale the background image so that it fills the window and # successfully overwrites the old sprite position. background = pygame.transform.scale2x(background) background = pygame.transform.scale2x(background) screen.blit(background, (0, 0)) objects = [] for x in range(10): o = GameObject(player, x*40, x) objects.append(o) while 1: for event in pygame.event.get(): if event.type in (QUIT, KEYDOWN): return for o in objects: screen.blit(background, o.pos, o.pos) for o in objects: o.move() screen.blit(o.image, o.pos) pygame.display.update() if __name__ == '__main__': main() pygame-1.9.1release/examples/midi.py0000644000175000017500000007244611210172760017367 0ustar vincentvincent#!/usr/bin/env python """Contains an example of midi input, and a separate example of midi output. By default it runs the output example. python midi.py --output python midi.py --input """ import sys import os import pygame import pygame.midi from pygame.locals import * try: # Ensure set available for output example set except NameError: from sets import Set as set def print_device_info(): pygame.midi.init() _print_device_info() pygame.midi.quit() def _print_device_info(): for i in range( pygame.midi.get_count() ): r = pygame.midi.get_device_info(i) (interf, name, input, output, opened) = r in_out = "" if input: in_out = "(input)" if output: in_out = "(output)" print ("%2i: interface :%s:, name :%s:, opened :%s: %s" % (i, interf, name, opened, in_out)) def input_main(device_id = None): pygame.init() pygame.fastevent.init() event_get = pygame.fastevent.get event_post = pygame.fastevent.post pygame.midi.init() _print_device_info() if device_id is None: input_id = pygame.midi.get_default_input_id() else: input_id = device_id print ("using input_id :%s:" % input_id) i = pygame.midi.Input( input_id ) pygame.display.set_mode((1,1)) going = True while going: events = event_get() for e in events: if e.type in [QUIT]: going = False if e.type in [KEYDOWN]: going = False if e.type in [pygame.midi.MIDIIN]: print (e) if i.poll(): midi_events = i.read(10) # convert them into pygame events. midi_evs = pygame.midi.midis2events(midi_events, i.device_id) for m_e in midi_evs: event_post( m_e ) del i pygame.midi.quit() def output_main(device_id = None): """Execute a musical keyboard example for the Church Organ instrument This is a piano keyboard example, with a two octave keyboard, starting at note F3. Left mouse down over a key starts a note, left up stops it. The notes are also mapped to the computer keyboard keys, assuming an American English PC keyboard (sorry everyone else, but I don't know if I can map to absolute key position instead of value.) The white keys are on the second row, TAB to BACKSLASH, starting with note F3. The black keys map to the top row, '1' to BACKSPACE, starting with F#3. 'r' is middle C. Close the window or press ESCAPE to quit the program. Key velocity (note amplitude) varies vertically on the keyboard image, with minimum velocity at the top of a key and maximum velocity at bottom. Default Midi output, no device_id given, is to the default output device for the computer. """ # A note to new pygamers: # # All the midi module stuff is in this function. It is unnecessary to # understand how the keyboard display works to appreciate how midi # messages are sent. # The keyboard is drawn by a Keyboard instance. This instance maps Midi # notes to musical keyboard keys. A regions surface maps window position # to (Midi note, velocity) pairs. A key_mapping dictionary does the same # for computer keyboard keys. Midi sound is controlled with direct method # calls to a pygame.midi.Output instance. # # Things to consider when using pygame.midi: # # 1) Initialize the midi module with a to pygame.midi.init(). # 2) Create a midi.Output instance for the desired output device port. # 3) Select instruments with set_instrument() method calls. # 4) Play notes with note_on() and note_off() method calls. # 5) Call pygame.midi.Quit() when finished. Though the midi module tries # to ensure that midi is properly shut down, it is best to do it # explicitly. A try/finally statement is the safest way to do this. # GRAND_PIANO = 0 CHURCH_ORGAN = 19 instrument = CHURCH_ORGAN #instrument = GRAND_PIANO start_note = 53 # F3 (white key note), start_note != 0 n_notes = 24 # Two octaves (14 white keys) bg_color = Color('slategray') key_mapping = make_key_mapping([K_TAB, K_1, K_q, K_2, K_w, K_3, K_e, K_r, K_5, K_t, K_6, K_y, K_u, K_8, K_i, K_9, K_o, K_0, K_p, K_LEFTBRACKET, K_EQUALS, K_RIGHTBRACKET, K_BACKSPACE, K_BACKSLASH], start_note) pygame.init() pygame.midi.init() _print_device_info() if device_id is None: port = pygame.midi.get_default_output_id() else: port = device_id print ("using output_id :%s:" % port) midi_out = pygame.midi.Output(port, 0) try: midi_out.set_instrument(instrument) keyboard = Keyboard(start_note, n_notes) screen = pygame.display.set_mode(keyboard.rect.size) screen.fill(bg_color) pygame.display.flip() background = pygame.Surface(screen.get_size()) background.fill(bg_color) dirty_rects = [] keyboard.draw(screen, background, dirty_rects) pygame.display.update(dirty_rects) regions = pygame.Surface(screen.get_size()) # initial color (0,0,0) keyboard.map_regions(regions) pygame.event.set_blocked(MOUSEMOTION) repeat = 1 mouse_note = 0 on_notes = set() while 1: update_rects = None e = pygame.event.wait() if e.type == pygame.MOUSEBUTTONDOWN: mouse_note, velocity, __, __ = regions.get_at(e.pos) if mouse_note and mouse_note not in on_notes: keyboard.key_down(mouse_note) midi_out.note_on(mouse_note, velocity) on_notes.add(mouse_note) else: mouse_note = 0 elif e.type == pygame.MOUSEBUTTONUP: if mouse_note: midi_out.note_off(mouse_note) keyboard.key_up(mouse_note) on_notes.remove(mouse_note) mouse_note = 0 elif e.type == pygame.QUIT: break elif e.type == pygame.KEYDOWN: if e.key == pygame.K_ESCAPE: break try: note, velocity = key_mapping[e.key] except KeyError: pass else: if note not in on_notes: keyboard.key_down(note) midi_out.note_on(note, velocity) on_notes.add(note) elif e.type == pygame.KEYUP: try: note, __ = key_mapping[e.key] except KeyError: pass else: if note in on_notes and note != mouse_note: keyboard.key_up(note) midi_out.note_off(note, 0) on_notes.remove(note) dirty_rects = [] keyboard.draw(screen, background, dirty_rects) pygame.display.update(dirty_rects) finally: del midi_out pygame.midi.quit() def make_key_mapping(key_list, start_note): """Return a dictionary of (note, velocity) by computer keyboard key code""" mapping = {} for i in range(len(key_list)): mapping[key_list[i]] = (start_note + i, 127) return mapping class NullKey(object): """A dummy key that ignores events passed to it by other keys A NullKey instance is the left key instance used by default for the left most keyboard key. """ def _right_white_down(self): pass def _right_white_up(self): pass def _right_black_down(self): pass def _right_black_up(self): pass null_key = NullKey() def key_class(updates, image_strip, image_rects, is_white_key=True): """Return a keyboard key widget class Arguments: updates - a set into which a key instance adds itself if it needs redrawing. image_strip - The surface containing the images of all key states. image_rects - A list of Rects giving the regions within image_strip that are relevant to this key class. is_white_key (default True) - Set false if this is a black key. This function automates the creation of a key widget class for the three basic key types. A key has two basic states, up or down ( depressed). Corresponding up and down images are drawn for each of these two states. But to give the illusion of depth, a key may have shadows cast upon it by the adjacent keys to its right. These shadows change depending on the up/down state of the key and its neighbors. So a key may support multiple images and states depending on the shadows. A key type is determined by the length of image_rects and the value of is_white. """ # Naming convention: Variables used by the Key class as part of a # closure start with 'c_'. # State logic and shadows: # # A key may cast a shadow upon the key to its left. A black key casts a # shadow on an adjacent white key. The shadow changes depending of whether # the black or white key is depressed. A white key casts a shadow on the # white key to its left if it is up and the left key is down. Therefore # a keys state, and image it will draw, is determined entirely by its # itself and the key immediately adjacent to it on the right. A white key # is always assumed to have an adjacent white key. # # There can be up to eight key states, representing all permutations # of the three fundamental states of self up/down, adjacent white # right up/down, adjacent black up/down. # down_state_none = 0 down_state_self = 1 down_state_white = down_state_self << 1 down_state_self_white = down_state_self | down_state_white down_state_black = down_state_white << 1 down_state_self_black = down_state_self | down_state_black down_state_white_black = down_state_white | down_state_black down_state_all = down_state_self | down_state_white_black # Some values used in the class. # c_down_state_initial = down_state_none c_down_state_rect_initial = image_rects[0] c_down_state_self = down_state_self c_updates = updates c_image_strip = image_strip c_width, c_height = image_rects[0].size # A key propagates its up/down state change to the adjacent white key on # the left by calling the adjacent key's _right_black_down or # _right_white_down method. # if is_white_key: key_color = 'white' else: key_color = 'black' c_notify_down_method = "_right_%s_down" % key_color c_notify_up_method = "_right_%s_up" % key_color # Images: # # A black key only needs two images, for the up and down states. Its # appearance is unaffected by the adjacent keys to its right, which cast no # shadows upon it. # # A white key with a no adjacent black to its right only needs three # images, for self up, self down, and both self and adjacent white down. # # A white key with both a black and white key to its right needs six # images: self up, self up and adjacent black down, self down, self and # adjacent white down, self and adjacent black down, and all three down. # # Each 'c_event' dictionary maps the current key state to a new key state, # along with corresponding image, for the related event. If no redrawing # is required for the state change then the image rect is simply None. # c_event_down = {down_state_none: (down_state_self, image_rects[1])} c_event_up = {down_state_self: (down_state_none, image_rects[0])} c_event_right_white_down = { down_state_none: (down_state_none, None), down_state_self: (down_state_self, None)} c_event_right_white_up = c_event_right_white_down.copy() c_event_right_black_down = c_event_right_white_down.copy() c_event_right_black_up = c_event_right_white_down.copy() if len(image_rects) > 2: c_event_down[down_state_white] = ( down_state_self_white, image_rects[2]) c_event_up[down_state_self_white] = (down_state_white, image_rects[0]) c_event_right_white_down[down_state_none] = (down_state_white, None) c_event_right_white_down[down_state_self] = ( down_state_self_white, image_rects[2]) c_event_right_white_up[down_state_white] = (down_state_none, None) c_event_right_white_up[down_state_self_white] = ( down_state_self, image_rects[1]) c_event_right_black_down[down_state_white] = ( down_state_white, None) c_event_right_black_down[down_state_self_white] = ( down_state_self_white, None) c_event_right_black_up[down_state_white] = ( down_state_white, None) c_event_right_black_up[down_state_self_white] = ( down_state_self_white, None) if len(image_rects) > 3: c_event_down[down_state_black] = ( down_state_self_black, image_rects[4]) c_event_down[down_state_white_black] = (down_state_all, image_rects[5]) c_event_up[down_state_self_black] = (down_state_black, image_rects[3]) c_event_up[down_state_all] = (down_state_white_black, image_rects[3]) c_event_right_white_down[down_state_black] = ( down_state_white_black, None) c_event_right_white_down[down_state_self_black] = ( down_state_all, image_rects[5]) c_event_right_white_up[down_state_white_black] = ( down_state_black, None) c_event_right_white_up[down_state_all] = ( down_state_self_black, image_rects[4]) c_event_right_black_down[down_state_none] = ( down_state_black, image_rects[3]) c_event_right_black_down[down_state_self] = ( down_state_self_black, image_rects[4]) c_event_right_black_down[down_state_white] = ( down_state_white_black, image_rects[3]) c_event_right_black_down[down_state_self_white] = ( down_state_all, image_rects[5]) c_event_right_black_up[down_state_black] = ( down_state_none, image_rects[0]) c_event_right_black_up[down_state_self_black] = ( down_state_self, image_rects[1]) c_event_right_black_up[down_state_white_black] = ( down_state_white, image_rects[0]) c_event_right_black_up[down_state_all] = ( down_state_self_white, image_rects[2]) class Key(object): """A key widget, maintains key state and draws the key's image Constructor arguments: ident - A unique key identifier. Any immutable type suitable as a key. posn - The location of the key on the display surface. key_left - Optional, the adjacent white key to the left. Changes in up and down state are propagated to that key. A key has an associated position and state. Related to state is the image drawn. State changes are managed with method calls, one method per event type. The up and down event methods are public. Other internal methods are for passing on state changes to the key_left key instance. """ is_white = is_white_key def __init__(self, ident, posn, key_left = None): """Return a new Key instance The initial state is up, with all adjacent keys to the right also up. """ if key_left is None: key_left = null_key rect = Rect(posn[0], posn[1], c_width, c_height) self.rect = rect self._state = c_down_state_initial self._source_rect = c_down_state_rect_initial self._ident = ident self._hash = hash(ident) self._notify_down = getattr(key_left, c_notify_down_method) self._notify_up = getattr(key_left, c_notify_up_method) self._key_left = key_left self._background_rect = Rect(rect.left, rect.bottom - 10, c_width, 10) c_updates.add(self) def down(self): """Signal that this key has been depressed (is down)""" self._state, source_rect = c_event_down[self._state] if source_rect is not None: self._source_rect = source_rect c_updates.add(self) self._notify_down() def up(self): """Signal that this key has been released (is up)""" self._state, source_rect = c_event_up[self._state] if source_rect is not None: self._source_rect = source_rect c_updates.add(self) self._notify_up() def _right_white_down(self): """Signal that the adjacent white key has been depressed This method is for internal propagation of events between key instances. """ self._state, source_rect = c_event_right_white_down[self._state] if source_rect is not None: self._source_rect = source_rect c_updates.add(self) def _right_white_up(self): """Signal that the adjacent white key has been released This method is for internal propagation of events between key instances. """ self._state, source_rect = c_event_right_white_up[self._state] if source_rect is not None: self._source_rect = source_rect c_updates.add(self) def _right_black_down(self): """Signal that the adjacent black key has been depressed This method is for internal propagation of events between key instances. """ self._state, source_rect = c_event_right_black_down[self._state] if source_rect is not None: self._source_rect = source_rect c_updates.add(self) def _right_black_up(self): """Signal that the adjacent black key has been released This method is for internal propagation of events between key instances. """ self._state, source_rect = c_event_right_black_up[self._state] if source_rect is not None: self._source_rect = source_rect c_updates.add(self) def __eq__(self, other): """True if same identifiers""" return self._ident == other._ident def __hash__(self): """Return the immutable hash value""" return self._hash def __str__(self): """Return the key's identifier and position as a string""" return ("" % (self._ident, self.rect.top, self.rect.left)) def draw(self, surf, background, dirty_rects): """Redraw the key on the surface surf The background is redrawn. The altered region is added to the dirty_rects list. """ surf.blit(background, self._background_rect, self._background_rect) surf.blit(c_image_strip, self.rect, self._source_rect) dirty_rects.append(self.rect) return Key def key_images(): """Return a keyboard keys image strip and a mapping of image locations The return tuple is a surface and a dictionary of rects mapped to key type. This function encapsulates the constants relevant to the keyboard image file. There are five key types. One is the black key. The other four white keys are determined by the proximity of the black keys. The plain white key has no black key adjacent to it. A white-left and white-right key has a black key to the left or right of it respectively. A white-center key has a black key on both sides. A key may have up to six related images depending on the state of adjacent keys to its right. """ my_dir = os.path.split(os.path.abspath(__file__))[0] strip_file = os.path.join(my_dir, 'data', 'midikeys.png') white_key_width = 42 white_key_height = 160 black_key_width = 22 black_key_height = 94 strip = pygame.image.load(strip_file) names = [ 'black none', 'black self', 'white none', 'white self', 'white self-white', 'white-left none', 'white-left self', 'white-left black', 'white-left self-black', 'white-left self-white', 'white-left all', 'white-center none', 'white-center self', 'white-center black', 'white-center self-black', 'white-center self-white', 'white-center all', 'white-right none', 'white-right self', 'white-right self-white'] rects = {} for i in range(2): rects[names[i]] = Rect(i * white_key_width, 0, black_key_width, black_key_height) for i in range(2, len(names)): rects[names[i]] = Rect(i * white_key_width, 0, white_key_width, white_key_height) return strip, rects class Keyboard(object): """Musical keyboard widget Constructor arguments: start_note: midi note value of the starting note on the keyboard. n_notes: number of notes (keys) on the keyboard. A Keyboard instance draws the musical keyboard and maintains the state of all the keyboard keys. Individual keys can be in a down (depressed) or up (released) state. """ _image_strip, _rects = key_images() white_key_width, white_key_height = _rects['white none'].size black_key_width, black_key_height = _rects['black none'].size _updates = set() # There are five key classes, representing key shape: # black key (BlackKey), plain white key (WhiteKey), white key to the left # of a black key (WhiteKeyLeft), white key between two black keys # (WhiteKeyCenter), and white key to the right of a black key # (WhiteKeyRight). BlackKey = key_class(_updates, _image_strip, [_rects['black none'], _rects['black self']], False) WhiteKey = key_class(_updates, _image_strip, [_rects['white none'], _rects['white self'], _rects['white self-white']]) WhiteKeyLeft = key_class(_updates, _image_strip, [_rects['white-left none'], _rects['white-left self'], _rects['white-left self-white'], _rects['white-left black'], _rects['white-left self-black'], _rects['white-left all']]) WhiteKeyCenter = key_class(_updates, _image_strip, [_rects['white-center none'], _rects['white-center self'], _rects['white-center self-white'], _rects['white-center black'], _rects['white-center self-black'], _rects['white-center all']]) WhiteKeyRight = key_class(_updates, _image_strip, [_rects['white-right none'], _rects['white-right self'], _rects['white-right self-white']]) def __init__(self, start_note, n_notes): """Return a new Keyboard instance with n_note keys""" self._start_note = start_note self._end_note = start_note + n_notes - 1 self._add_keys() def _add_keys(self): """Populate the keyboard with key instances Set the _keys and rect attributes. """ # Keys are entered in a list, where index is Midi note. Since there are # only 128 possible Midi notes the list length is managable. Unassigned # note positions should never be accessed, so are set None to ensure # the bug is quickly detected. # key_map = [None] * 128 start_note = self._start_note end_note = self._end_note black_offset = self.black_key_width // 2 prev_white_key = None x = y = 0 if is_white_key(start_note): is_prev_white = True else: x += black_offset is_prev_white = False for note in range(start_note, end_note + 1): ident = note # For now notes uniquely identify keyboard keys. if is_white_key(note): if is_prev_white: if note == end_note or is_white_key(note + 1): key = self.WhiteKey(ident, (x, y), prev_white_key) else: key = self.WhiteKeyLeft(ident, (x, y), prev_white_key) else: if note == end_note or is_white_key(note + 1): key = self.WhiteKeyRight(ident, (x, y), prev_white_key) else: key = self.WhiteKeyCenter(ident, (x, y), prev_white_key) is_prev_white = True x += self.white_key_width prev_white_key = key else: key = self.BlackKey(ident, (x - black_offset, y), prev_white_key) is_prev_white = False key_map[note] = key self._keys = key_map kb_width = key_map[self._end_note].rect.right kb_height = self.white_key_height self.rect = Rect(0, 0, kb_width, kb_height) def map_regions(self, regions): """Draw the key regions onto surface regions. Regions must have at least 3 byte pixels. Each pixel of the keyboard rectangle is set to the color (note, velocity, 0). The regions surface must be at least as large as (0, 0, self.rect.left, self.rect.bottom) """ # First draw the white key regions. Then add the overlapping # black key regions. # cutoff = self.black_key_height black_keys = [] for note in range(self._start_note, self._end_note + 1): key = self._keys[note] if key.is_white: fill_region(regions, note, key.rect, cutoff) else: black_keys.append((note, key)) for note, key in black_keys: fill_region(regions, note, key.rect, cutoff) def draw(self, surf, background, dirty_rects): """Redraw all altered keyboard keys""" changed_keys = self._updates while changed_keys: changed_keys.pop().draw(surf, background, dirty_rects) def key_down(self, note): """Signal a key down event for note""" self._keys[note].down() def key_up(self, note): """Signal a key up event for note""" self._keys[note].up() def fill_region(regions, note, rect, cutoff): """Fill the region defined by rect with a (note, velocity, 0) color The velocity varies from a small value at the top of the region to 127 at the bottom. The vertical region 0 to cutoff is split into three parts, with velocities 42, 84 and 127. Everything below cutoff has velocity 127. """ x, y, width, height = rect if cutoff is None: cutoff = height delta_height = cutoff // 3 regions.fill((note, 42, 0), (x, y, width, delta_height)) regions.fill((note, 84, 0), (x, y + delta_height, width, delta_height)) regions.fill((note, 127, 0), (x, y + 2 * delta_height, width, height - 2 * delta_height)) def is_white_key(note): """True if note is represented by a white key""" key_pattern = [True, False, True, True, False, True, False, True, True, False, True, False] return key_pattern[(note - 21) % len(key_pattern)] def usage(): print ("--input [device_id] : Midi message logger") print ("--output [device_id] : Midi piano keyboard") print ("--list : list available midi devices") def main(mode='output', device_id=None): """Run a Midi example Arguments: mode - if 'output' run a midi keyboard output example 'input' run a midi event logger input example 'list' list available midi devices (default 'output') device_id - midi device number; if None then use the default midi input or output device for the system """ if mode == 'input': input_main(device_id) elif mode == 'output': output_main(device_id) elif mode == 'list': print_device_info() else: raise ValueError("Unknown mode option '%s'" % mode) if __name__ == '__main__': try: device_id = int( sys.argv[-1] ) except: device_id = None if "--input" in sys.argv or "-i" in sys.argv: input_main(device_id) elif "--output" in sys.argv or "-o" in sys.argv: output_main(device_id) elif "--list" in sys.argv or "-l" in sys.argv: print_device_info() else: usage() pygame-1.9.1release/examples/mask.py0000644000175000017500000001267311207055754017405 0ustar vincentvincent#!/usr/bin/env python """A pgyame.mask collition detection example exports main() This module can also be run as a stand-alone program, excepting one or more image file names as command line arguments. """ import sys, random import pygame, pygame.image, pygame.surface, pygame.time, pygame.display def maskFromSurface(surface, threshold = 127): #return pygame.mask.from_surface(surface, threshold) mask = pygame.mask.Mask(surface.get_size()) key = surface.get_colorkey() if key: for y in range(surface.get_height()): for x in range(surface.get_width()): if surface.get_at((x+0.1,y+0.1)) != key: mask.set_at((x,y),1) else: for y in range(surface.get_height()): for x in range (surface.get_width()): if surface.get_at((x,y))[3] > threshold: mask.set_at((x,y),1) return mask def vadd(x,y): return [x[0]+y[0],x[1]+y[1]] def vsub(x,y): return [x[0]-y[0],x[1]-y[1]] def vdot(x,y): return x[0]*y[0]+x[1]*y[1] class Sprite: def __init__(self, surface, mask = None): self.surface = surface if mask: self.mask = mask else: self.mask = maskFromSurface(self.surface) self.setPos([0,0]) self.setVelocity([0,0]) def setPos(self,pos): self.pos = [pos[0],pos[1]] def setVelocity(self,vel): self.vel = [vel[0],vel[1]] def move(self,dr): self.pos = vadd(self.pos,dr) def kick(self,impulse): self.vel[0] += impulse[0] self.vel[1] += impulse[1] def collide(self,s): """Test if the sprites are colliding and resolve the collision in this case.""" offset = [int(x) for x in vsub(s.pos,self.pos)] overlap = self.mask.overlap_area(s.mask,offset) if overlap == 0: return """Calculate collision normal""" nx = (self.mask.overlap_area(s.mask,(offset[0]+1,offset[1])) - self.mask.overlap_area(s.mask,(offset[0]-1,offset[1]))) ny = (self.mask.overlap_area(s.mask,(offset[0],offset[1]+1)) - self.mask.overlap_area(s.mask,(offset[0],offset[1]-1))) if nx == 0 and ny == 0: """One sprite is inside another""" return n = [nx,ny] dv = vsub(s.vel,self.vel) J = vdot(dv,n)/(2*vdot(n,n)) if J > 0: """Can scale up to 2*J here to get bouncy collisions""" J *= 1.9 self.kick([nx*J,ny*J]) s.kick([-J*nx,-J*ny]) return """Separate the sprites""" c1 = -overlap/vdot(n,n) c2 = -c1/2 self.move([c2*nx,c2*ny]) s.move([(c1+c2)*nx,(c1+c2)*ny]) def update(self,dt): self.pos[0] += dt*self.vel[0] self.pos[1] += dt*self.vel[1] def main(*args): """Display multiple images bounce off each other using collition detection Positional arguments: one or more image file names. This pygame.masks demo will display multiple moving sprites bouncing off each other. More than one sprite image can be provided. """ if len(args) == 0: raise ValueError("Require at least one image file name: non given") print ('Press any key to quit') screen = pygame.display.set_mode((640,480)) images = [] masks = [] for impath in args: images.append(pygame.image.load(impath).convert_alpha()) masks.append(maskFromSurface(images[-1])) numtimes = 10 import time t1 = time.time() for x in range(numtimes): m = maskFromSurface(images[-1]) t2 = time.time() print ("python maskFromSurface :%s" % (t2-t1)) t1 = time.time() for x in range(numtimes): m = pygame.mask.from_surface(images[-1]) t2 = time.time() print ("C pygame.mask.from_surface :%s" % (t2-t1)) sprites = [] for i in range(20): j = i % len(images) s = Sprite(images[j],masks[j]) s.setPos((random.uniform(0,screen.get_width()), random.uniform(0,screen.get_height()))) s.setVelocity((random.uniform(-5,5),random.uniform(-5,5))) sprites.append(s) pygame.time.set_timer(pygame.USEREVENT,33) while 1: event = pygame.event.wait() if event.type == pygame.QUIT: return elif event.type == pygame.USEREVENT: """Do both mechanics and screen update""" screen.fill((240,220,100)) for i in range(len(sprites)): for j in range(i+1,len(sprites)): sprites[i].collide(sprites[j]) for s in sprites: s.update(1) if s.pos[0] < -s.surface.get_width()-3: s.pos[0] = screen.get_width() elif s.pos[0] > screen.get_width()+3: s.pos[0] = -s.surface.get_width() if s.pos[1] < -s.surface.get_height()-3: s.pos[1] = screen.get_height() elif s.pos[1] > screen.get_height()+3: s.pos[1] = -s.surface.get_height() screen.blit(s.surface,s.pos) pygame.display.update() elif event.type == pygame.KEYDOWN: return if __name__ == '__main__': if len(sys.argv) < 2: print ('Usage: mask.py [ ...]') print ('Let many copies of IMAGE(s) bounce against each other') print ('Press any key to quit') else: main(*sys.argv[1:]) pygame-1.9.1release/examples/liquid.py0000644000175000017500000000466111207055754017737 0ustar vincentvincent#!/usr/bin/env python """This examples demonstrates a simplish water effect of an image. It attempts to create a hardware display surface that can use pageflipping for faster updates. Note that the colormap from the loaded GIF image is copied to the colormap for the display surface. This is based on the demo named F2KWarp by Brad Graham of Freedom2000 done in BlitzBasic. I was just translating the BlitzBasic code to pygame to compare the results. I didn't bother porting the text and sound stuff, that's an easy enough challenge for the reader :]""" import pygame, os from pygame.locals import * from math import sin main_dir = os.path.split(os.path.abspath(__file__))[0] def main(): #initialize and setup screen pygame.init() screen = pygame.display.set_mode((640, 480), HWSURFACE|DOUBLEBUF) #load image and quadruple imagename = os.path.join(main_dir, 'data', 'liquid.bmp') bitmap = pygame.image.load(imagename) bitmap = pygame.transform.scale2x(bitmap) bitmap = pygame.transform.scale2x(bitmap) #get the image and screen in the same format if screen.get_bitsize() == 8: screen.set_palette(bitmap.get_palette()) else: bitmap = bitmap.convert() #prep some variables anim = 0.0 #mainloop xblocks = range(0, 640, 20) yblocks = range(0, 480, 20) stopevents = QUIT, KEYDOWN, MOUSEBUTTONDOWN while 1: for e in pygame.event.get(): if e.type in stopevents: return anim = anim + 0.2 for x in xblocks: xpos = (x + (sin(anim + x * .01) * 15)) + 20 for y in yblocks: ypos = (y + (sin(anim + y * .01) * 15)) + 20 screen.blit(bitmap, (x, y), (xpos, ypos, 20, 20)) pygame.display.flip() if __name__ == '__main__': main() """BTW, here is the code from the BlitzBasic example this was derived from. i've snipped the sound and text stuff out. ----------------------------------------------------------------- ; Brad@freedom2000.com ; Load a bmp pic (800x600) and slice it into 1600 squares Graphics 640,480 SetBuffer BackBuffer() bitmap$="f2kwarp.bmp" pic=LoadAnimImage(bitmap$,20,15,0,1600) ; use SIN to move all 1600 squares around to give liquid effect Repeat f=0:w=w+10:If w=360 Then w=0 For y=0 To 599 Step 15 For x = 0 To 799 Step 20 f=f+1:If f=1600 Then f=0 DrawBlock pic,(x+(Sin(w+x)*40))/1.7+80,(y+(Sin(w+y)*40))/1.7+60,f Next:Next:Flip:Cls Until KeyDown(1) """ pygame-1.9.1release/examples/headless_no_windows_needed.py0000644000175000017500000000246511207055754024012 0ustar vincentvincent#!/usr/bin/env python """How to use pygame with no windowing system, like on headless servers. Thumbnail generation with scaling is an example of what you can do with pygame. NOTE: the pygame scale function uses mmx/sse if available, and can be run in multiple threads. """ useage = """-scale inputimage outputimage new_width new_height eg. -scale in.png out.png 50 50 """ import os, sys # set SDL to use the dummy NULL video driver, # so it doesn't need a windowing system. os.environ["SDL_VIDEODRIVER"] = "dummy" import pygame.transform if 1: #some platforms need to init the display for some parts of pygame. import pygame.display pygame.display.init() screen = pygame.display.set_mode((1,1)) def scaleit(fin, fout, w, h): i = pygame.image.load(fin) if hasattr(pygame.transform, "smoothscale"): scaled_image = pygame.transform.smoothscale(i, (w,h)) else: scaled_image = pygame.transform.scale(i, (w,h)) pygame.image.save(scaled_image, fout) def main(fin, fout, w, h): """smoothscale image file named fin as fout with new size (w,h)""" scaleit(fin, fout, w, h) if __name__ == "__main__": if "-scale" in sys.argv: fin, fout, w, h = sys.argv[2:] w, h = map(int, [w,h]) main(fin, fout, w,h) else: print (useage) pygame-1.9.1release/examples/glcube.py0000644000175000017500000000523711207055754017711 0ustar vincentvincent#!/usr/bin/env python """Draw a cube on the screen. every frame we orbit the camera around by a small amount and it appears the object is spinning. note i've setup some simple data structures here to represent a multicolored cube, we then go through a semi-unopimized loop to draw the cube points onto the screen. opengl does all the hard work for us. :] """ import pygame from pygame.locals import * try: from OpenGL.GL import * from OpenGL.GLU import * except: print ('The GLCUBE example requires PyOpenGL') raise SystemExit #some simple data for a colored cube #here we have the 3D point position and color #for each corner. then we have a list of indices #that describe each face, and a list of indieces #that describes each edge CUBE_POINTS = ( (0.5, -0.5, -0.5), (0.5, 0.5, -0.5), (-0.5, 0.5, -0.5), (-0.5, -0.5, -0.5), (0.5, -0.5, 0.5), (0.5, 0.5, 0.5), (-0.5, -0.5, 0.5), (-0.5, 0.5, 0.5) ) #colors are 0-1 floating values CUBE_COLORS = ( (1, 0, 0), (1, 1, 0), (0, 1, 0), (0, 0, 0), (1, 0, 1), (1, 1, 1), (0, 0, 1), (0, 1, 1) ) CUBE_QUAD_VERTS = ( (0, 1, 2, 3), (3, 2, 7, 6), (6, 7, 5, 4), (4, 5, 1, 0), (1, 5, 7, 2), (4, 0, 3, 6) ) CUBE_EDGES = ( (0,1), (0,3), (0,4), (2,1), (2,3), (2,7), (6,3), (6,4), (6,7), (5,1), (5,4), (5,7), ) def drawcube(): "draw the cube" allpoints = zip(CUBE_POINTS, CUBE_COLORS) glBegin(GL_QUADS) for face in CUBE_QUAD_VERTS: for vert in face: pos, color = allpoints[vert] glColor3fv(color) glVertex3fv(pos) glEnd() glColor3f(1.0, 1.0, 1.0) glBegin(GL_LINES) for line in CUBE_EDGES: for vert in line: pos, color = allpoints[vert] glVertex3fv(pos) glEnd() def main(): "run the demo" #initialize pygame and setup an opengl display pygame.init() pygame.display.set_mode((640,480), OPENGL|DOUBLEBUF) glEnable(GL_DEPTH_TEST) #use our zbuffer #setup the camera glMatrixMode(GL_PROJECTION) gluPerspective(45.0,640/480.0,0.1,100.0) #setup lens glTranslatef(0.0, 0.0, -3.0) #move back glRotatef(25, 1, 0, 0) #orbit higher while 1: #check for quit'n events event = pygame.event.poll() if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE): break #clear screen and move camera glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) #orbit camera around by 1 degree glRotatef(1, 0, 1, 0) drawcube() pygame.display.flip() pygame.time.wait(10) if __name__ == '__main__': main() pygame-1.9.1release/examples/fonty.py0000644000175000017500000000475311207055754017611 0ustar vincentvincent#!/usr/bin/env python """Here we load a .TTF font file, and display it in a basic pygame window. It demonstrates several of the Font object attributes. Nothing exciting in here, but it makes a great example for basic window, event, and font management.""" import pygame from pygame.locals import * from pygame.compat import unichr_, unicode_ import sys import locale if sys.version_info >= (3,): def print_unicode(s): e = locale.getpreferredencoding() print (s.encode(e, 'backslashreplace').decode()) else: def print_unicode(s): e = locale.getpreferredencoding() print (s.encode(e, 'backslashreplace')) def main(): #initialize pygame.init() resolution = 400, 200 screen = pygame.display.set_mode(resolution) ## pygame.mouse.set_cursor(*pygame.cursors.diamond) fg = 250, 240, 230 bg = 5, 5, 5 wincolor = 40, 40, 90 #fill background screen.fill(wincolor) #load font, prepare values font = pygame.font.Font(None, 80) text = 'Fonty' size = font.size(text) #no AA, no transparancy, normal ren = font.render(text, 0, fg, bg) screen.blit(ren, (10, 10)) #no AA, transparancy, underline font.set_underline(1) ren = font.render(text, 0, fg) screen.blit(ren, (10, 40 + size[1])) font.set_underline(0) a_sys_font = pygame.font.SysFont("Arial", 60) #AA, no transparancy, bold a_sys_font.set_bold(1) ren = a_sys_font.render(text, 1, fg, bg) screen.blit(ren, (30 + size[0], 10)) a_sys_font.set_bold(0) #AA, transparancy, italic a_sys_font.set_italic(1) ren = a_sys_font.render(text, 1, fg) screen.blit(ren, (30 + size[0], 40 + size[1])) a_sys_font.set_italic(0) # Get some metrics. print ("Font metrics for 'Fonty': %s" % a_sys_font.metrics (text)) ch = unicode_("%c") % 0x3060 msg = (unicode_("Font metrics for '%s': %s") % (ch, a_sys_font.metrics (ch))) print_unicode(msg) ## #some_japanese_unicode = u"\u304b\u3070\u306b" ##some_japanese_unicode = unicode_('%c%c%c') % (0x304b, 0x3070, 0x306b) #AA, transparancy, italic ##ren = a_sys_font.render(some_japanese_unicode, 1, fg) ##screen.blit(ren, (30 + size[0], 40 + size[1])) #show the surface and await user quit pygame.display.flip() while 1: #use event.wait to keep from polling 100% cpu if pygame.event.wait().type in (QUIT, KEYDOWN, MOUSEBUTTONDOWN): break if __name__ == '__main__': main() pygame-1.9.1release/examples/fastevents.py0000644000175000017500000000551211207055754020626 0ustar vincentvincent#!/usr/bin/env python """ This is a stress test for the fastevents module. *Fast events does not appear faster!* So far it looks like normal pygame.event is faster by up to two times. So maybe fastevent isn't fast at all. Tested on windowsXP sp2 athlon, and freebsd. However... on my debian duron 850 machine fastevents is faster. """ import pygame from pygame import * # the config to try different settings out with the event queues. # use the fastevent module or not. use_fast_events = 1 # use pygame.display.flip(). # otherwise we test raw event processing throughput. with_display = 1 # limit the game loop to 40 fps. slow_tick = 0 NUM_EVENTS_TO_POST = 200000 if use_fast_events: event_module = fastevent else: event_module = event from threading import Thread class post_them(Thread): def __init__(self): Thread.__init__(self) self.done = [] self.stop = [] def run(self): self.done = [] self.stop = [] for x in range(NUM_EVENTS_TO_POST): ee = event.Event(USEREVENT) try_post = 1 # the pygame.event.post raises an exception if the event # queue is full. so wait a little bit, and try again. while try_post: try: event_module.post(ee) try_post = 0 except: pytime.sleep(0.001) try_post = 1 if self.stop: return self.done.append(1) import time as pytime def main(): init() if use_fast_events: fastevent.init() c = time.Clock() win = display.set_mode((640, 480), RESIZABLE) display.set_caption("fastevent Workout") poster = post_them() t1 = pytime.time() poster.start() going = True while going: # for e in event.get(): #for x in range(200): # ee = event.Event(USEREVENT) # r = event_module.post(ee) # print (r) #for e in event_module.get(): event_list = [] event_list = event_module.get() for e in event_list: if e.type == QUIT: print (c.get_fps()) poster.stop.append(1) going = False if e.type == KEYDOWN: if e.key == K_ESCAPE: print (c.get_fps()) poster.stop.append(1) going = False if poster.done: print (c.get_fps()) print (c) t2 = pytime.time() print ("total time:%s" % (t2 - t1)) print ("events/second:%s" % (NUM_EVENTS_TO_POST / (t2 - t1))) going = False if with_display: display.flip() if slow_tick: c.tick(40) pygame.quit() if __name__ == '__main__': main() pygame-1.9.1release/examples/eventlist.py0000644000175000017500000000713511225241633020455 0ustar vincentvincent#!/usr/bin/env python """Eventlist is a sloppy style of pygame, but is a handy tool for learning about pygame events and input. At the top of the screen are the state of several device values, and a scrolling list of events are displayed on the bottom. This is not quality 'ui' code at all, but you can see how to implement very non-interactive status displays, or even a crude text output control. """ from pygame import * ImgOnOff = [] Font = None LastKey = None def showtext(win, pos, text, color, bgcolor): textimg = Font.render(text, 1, color, bgcolor) win.blit(textimg, pos) return pos[0] + textimg.get_width() + 5, pos[1] def drawstatus(win): bgcolor = 50, 50, 50 win.fill(bgcolor, (0, 0, 640, 120)) win.blit(Font.render('Status Area', 1, (155, 155, 155), bgcolor), (2, 2)) pos = showtext(win, (10, 30), 'Mouse Focus', (255, 255, 255), bgcolor) win.blit(ImgOnOff[mouse.get_focused()], pos) pos = showtext(win, (330, 30), 'Keyboard Focus', (255, 255, 255), bgcolor) win.blit(ImgOnOff[key.get_focused()], pos) pos = showtext(win, (10, 60), 'Mouse Position', (255, 255, 255), bgcolor) p = '%s, %s' % mouse.get_pos() pos = showtext(win, pos, p, bgcolor, (255, 255, 55)) pos = showtext(win, (330, 60), 'Last Keypress', (255, 255, 255), bgcolor) if LastKey: p = '%d, %s' % (LastKey, key.name(LastKey)) else: p = 'None' pos = showtext(win, pos, p, bgcolor, (255, 255, 55)) pos = showtext(win, (10, 90), 'Input Grabbed', (255, 255, 255), bgcolor) win.blit(ImgOnOff[event.get_grab()], pos) def drawhistory(win, history): win.blit(Font.render('Event History Area', 1, (155, 155, 155), (0,0,0)), (2, 132)) ypos = 450 h = list(history) h.reverse() for line in h: r = win.blit(line, (10, ypos)) win.fill(0, (r.right, r.top, 620, r.height)) ypos -= Font.get_height() def main(): init() win = display.set_mode((640, 480), RESIZABLE) display.set_caption("Mouse Focus Workout") global Font Font = font.Font(None, 26) global ImgOnOff ImgOnOff.append(Font.render("Off", 1, (0, 0, 0), (255, 50, 50))) ImgOnOff.append(Font.render("On", 1, (0, 0, 0), (50, 255, 50))) history = [] #let's turn on the joysticks just so we can play with em for x in range(joystick.get_count()): j = joystick.Joystick(x) j.init() txt = 'Enabled joystick: ' + j.get_name() img = Font.render(txt, 1, (50, 200, 50), (0, 0, 0)) history.append(img) if not joystick.get_count(): img = Font.render('No Joysticks to Initialize', 1, (50, 200, 50), (0, 0, 0)) history.append(img) going = True while going: for e in event.get(): if e.type == QUIT: going = False if e.type == KEYDOWN: if e.key == K_ESCAPE: going = False else: global LastKey LastKey = e.key if e.type == MOUSEBUTTONDOWN: event.set_grab(1) elif e.type == MOUSEBUTTONUP: event.set_grab(0) if e.type == VIDEORESIZE: win = display.set_mode(e.size, RESIZABLE) if e.type != MOUSEMOTION: txt = '%s: %s' % (event.event_name(e.type), e.dict) img = Font.render(txt, 1, (50, 200, 50), (0, 0, 0)) history.append(img) history = history[-13:] drawstatus(win) drawhistory(win, history) display.flip() time.wait(10) quit() if __name__ == '__main__': main() pygame-1.9.1release/examples/cursors.py0000644000175000017500000000576611207055754020157 0ustar vincentvincent#!/usr/bin/env python import pygame arrow = ( "xX ", "X.X ", "X..X ", "X...X ", "X....X ", "X.....X ", "X......X ", "X.......X ", "X........X ", "X.........X ", "X......XXXXX ", "X...X..X ", "X..XX..X ", "X.X XX..X ", "XX X..X ", "X X..X ", " X..X ", " X..X ", " X..X ", " XX ", " ", " ", " ", " ") no = (" ", " ", " XXXXXX ", " XX......XX ", " X..........X ", " X....XXXX....X ", " X...XX XX...X ", " X.....X X...X ", " X..X...X X..X ", " X...XX...X X...X ", " X..X X...X X..X ", " X..X X...X X..X ", " X..X X.,.X X..X ", " X..X X...X X..X ", " X...X X...XX...X ", " X..X X...X..X ", " X...X X.....X ", " X...XX X...X ", " X....XXXXX...X ", " X..........X ", " XX......XX ", " XXXXXX ", " ", " ", ) def TestCursor(arrow): hotspot = None for y in range(len(arrow)): for x in range(len(arrow[y])): if arrow[y][x] in ['x', ',', 'O']: hotspot = x,y break if hotspot != None: break if hotspot == None: raise Exception("No hotspot specified for cursor '%s'!" % cursorname) s2 = [] for line in arrow: s2.append(line.replace('x', 'X').replace(',', '.').replace('O', 'o')) cursor, mask = pygame.cursors.compile(s2, 'X', '.', 'o') size = len(arrow[0]), len(arrow) pygame.mouse.set_cursor(size, hotspot, cursor, mask) def main(): pygame.init() pygame.font.init() font = pygame.font.Font(None, 24) bg = pygame.display.set_mode((800, 600), 0, 24) bg.fill((255,255,255)) bg.blit(font.render("Click to advance", 1, (0, 0, 0)), (0, 0)) pygame.display.update() for cursor in [no, arrow]: TestCursor(cursor) going = True while going: pygame.event.pump() for e in pygame.event.get(): if e.type == pygame.MOUSEBUTTONDOWN: going = False pygame.quit() if __name__ == '__main__': main() pygame-1.9.1release/examples/chimp.py0000644000175000017500000001336411207055754017550 0ustar vincentvincent#!/usr/bin/env python """ This simple example is used for the line-by-line tutorial that comes with pygame. It is based on a 'popular' web banner. Note there are comments here, but for the full explanation, follow along in the tutorial. """ #Import Modules import os, pygame from pygame.locals import * from pygame.compat import geterror if not pygame.font: print ('Warning, fonts disabled') if not pygame.mixer: print ('Warning, sound disabled') main_dir = os.path.split(os.path.abspath(__file__))[0] data_dir = os.path.join(main_dir, 'data') #functions to create our resources def load_image(name, colorkey=None): fullname = os.path.join(data_dir, name) try: image = pygame.image.load(fullname) except pygame.error: print ('Cannot load image:', fullname) raise SystemExit(str(geterror())) image = image.convert() if colorkey is not None: if colorkey is -1: colorkey = image.get_at((0,0)) image.set_colorkey(colorkey, RLEACCEL) return image, image.get_rect() def load_sound(name): class NoneSound: def play(self): pass if not pygame.mixer or not pygame.mixer.get_init(): return NoneSound() fullname = os.path.join(data_dir, name) try: sound = pygame.mixer.Sound(fullname) except pygame.error: print ('Cannot load sound: %s' % fullname) raise SystemExit(str(geterror())) return sound #classes for our game objects class Fist(pygame.sprite.Sprite): """moves a clenched fist on the screen, following the mouse""" def __init__(self): pygame.sprite.Sprite.__init__(self) #call Sprite initializer self.image, self.rect = load_image('fist.bmp', -1) self.punching = 0 def update(self): "move the fist based on the mouse position" pos = pygame.mouse.get_pos() self.rect.midtop = pos if self.punching: self.rect.move_ip(5, 10) def punch(self, target): "returns true if the fist collides with the target" if not self.punching: self.punching = 1 hitbox = self.rect.inflate(-5, -5) return hitbox.colliderect(target.rect) def unpunch(self): "called to pull the fist back" self.punching = 0 class Chimp(pygame.sprite.Sprite): """moves a monkey critter across the screen. it can spin the monkey when it is punched.""" def __init__(self): pygame.sprite.Sprite.__init__(self) #call Sprite intializer self.image, self.rect = load_image('chimp.bmp', -1) screen = pygame.display.get_surface() self.area = screen.get_rect() self.rect.topleft = 10, 10 self.move = 9 self.dizzy = 0 def update(self): "walk or spin, depending on the monkeys state" if self.dizzy: self._spin() else: self._walk() def _walk(self): "move the monkey across the screen, and turn at the ends" newpos = self.rect.move((self.move, 0)) if self.rect.left < self.area.left or \ self.rect.right > self.area.right: self.move = -self.move newpos = self.rect.move((self.move, 0)) self.image = pygame.transform.flip(self.image, 1, 0) self.rect = newpos def _spin(self): "spin the monkey image" center = self.rect.center self.dizzy = self.dizzy + 12 if self.dizzy >= 360: self.dizzy = 0 self.image = self.original else: rotate = pygame.transform.rotate self.image = rotate(self.original, self.dizzy) self.rect = self.image.get_rect(center=center) def punched(self): "this will cause the monkey to start spinning" if not self.dizzy: self.dizzy = 1 self.original = self.image def main(): """this function is called when the program starts. it initializes everything it needs, then runs in a loop until the function returns.""" #Initialize Everything pygame.init() screen = pygame.display.set_mode((468, 60)) pygame.display.set_caption('Monkey Fever') pygame.mouse.set_visible(0) #Create The Backgound background = pygame.Surface(screen.get_size()) background = background.convert() background.fill((250, 250, 250)) #Put Text On The Background, Centered if pygame.font: font = pygame.font.Font(None, 36) text = font.render("Pummel The Chimp, And Win $$$", 1, (10, 10, 10)) textpos = text.get_rect(centerx=background.get_width()/2) background.blit(text, textpos) #Display The Background screen.blit(background, (0, 0)) pygame.display.flip() #Prepare Game Objects clock = pygame.time.Clock() whiff_sound = load_sound('whiff.wav') punch_sound = load_sound('punch.wav') chimp = Chimp() fist = Fist() allsprites = pygame.sprite.RenderPlain((fist, chimp)) #Main Loop going = True while going: clock.tick(60) #Handle Input Events for event in pygame.event.get(): if event.type == QUIT: going = False elif event.type == KEYDOWN and event.key == K_ESCAPE: going = False elif event.type == MOUSEBUTTONDOWN: if fist.punch(chimp): punch_sound.play() #punch chimp.punched() else: whiff_sound.play() #miss elif event.type == MOUSEBUTTONUP: fist.unpunch() allsprites.update() #Draw Everything screen.blit(background, (0, 0)) allsprites.draw(screen) pygame.display.flip() pygame.quit() #Game Over #this calls the 'main' function when this script is executed if __name__ == '__main__': main() pygame-1.9.1release/examples/camera.py0000644000175000017500000000422511207055754017674 0ustar vincentvincent#!/usr/bin/env python # 1. Basic image capturing and displaying using the camera module import pygame import pygame.camera from pygame.locals import * class VideoCapturePlayer(object): size = ( 640, 480 ) def __init__(self, **argd): self.__dict__.update(**argd) super(VideoCapturePlayer, self).__init__(**argd) # create a display surface. standard pygame stuff self.display = pygame.display.set_mode( self.size, 0 ) # gets a list of available cameras. self.clist = pygame.camera.list_cameras() if not self.clist: raise ValueError("Sorry, no cameras detected.") # creates the camera of the specified size and in RGB colorspace self.camera = pygame.camera.Camera(self.clist[0], self.size, "RGB") # starts the camera self.camera.start() self.clock = pygame.time.Clock() # create a surface to capture to. for performance purposes, you want the # bit depth to be the same as that of the display surface. self.snapshot = pygame.surface.Surface(self.size, 0, self.display) def get_and_flip(self): # if you don't want to tie the framerate to the camera, you can check and # see if the camera has an image ready. note that while this works # on most cameras, some will never return true. if 0 and self.camera.query_image(): # capture an image self.snapshot = self.camera.get_image(self.snapshot) self.snapshot = self.camera.get_image(self.snapshot) #self.snapshot = self.camera.get_image() # blit it to the display surface. simple! self.display.blit(self.snapshot, (0,0)) pygame.display.flip() def main(self): going = True while going: events = pygame.event.get() for e in events: if e.type == QUIT or (e.type == KEYDOWN and e.key == K_ESCAPE): going = False self.get_and_flip() self.clock.tick() print (self.clock.get_fps()) def main(): pygame.init() pygame.camera.init() VideoCapturePlayer().main() pygame.quit() if __name__ == '__main__': main() pygame-1.9.1release/examples/blit_blends.py0000644000175000017500000001332411207055754020725 0ustar vincentvincent#!/usr/bin/env python # fake additive blending. Using Numeric. it doesn't clamp. # press r,g,b import os, pygame from pygame.locals import * try: import pygame.surfarray import Numeric except: print ("no surfarray for you! install Numeric") import time main_dir = os.path.split(os.path.abspath(__file__))[0] data_dir = os.path.join(main_dir, 'data') def main(): pygame.init() screen = pygame.display.set_mode((640, 480)) im1= pygame.Surface(screen.get_size()) #im1= im1.convert() im1.fill((100, 0, 0)) im2= pygame.Surface(screen.get_size()) im2.fill((0, 50, 0)) # we make a srcalpha copy of it. #im3= im2.convert(SRCALPHA) im3 = im2 im3.set_alpha(127) images = {} images[K_1] = im2 images[K_2] = pygame.image.load(os.path.join(data_dir, "chimp.bmp")) images[K_3] = pygame.image.load(os.path.join(data_dir, "alien3.gif")) images[K_4] = pygame.image.load(os.path.join(data_dir, "liquid.bmp")) img_to_blit = im2.convert() iaa = img_to_blit.convert_alpha() blits = {} blits[K_a] = BLEND_ADD blits[K_s] = BLEND_SUB blits[K_m] = BLEND_MULT blits[K_EQUALS] = BLEND_MAX blits[K_MINUS] = BLEND_MIN blitsn = {} blitsn[K_a] = "BLEND_ADD" blitsn[K_s] = "BLEND_SUB" blitsn[K_m] = "BLEND_MULT" blitsn[K_EQUALS] = "BLEND_MAX" blitsn[K_MINUS] = "BLEND_MIN" screen.blit(im1, (0, 0)) pygame.display.flip() clock = pygame.time.Clock() print ("one pixel is:%s:" % [im1.get_at((0,0))]) going = True while going: clock.tick(60) for event in pygame.event.get(): if event.type == QUIT: going = False if event.type == KEYDOWN: usage() if event.type == KEYDOWN and event.key == K_ESCAPE: going = False elif event.type == KEYDOWN and event.key in images.keys(): img_to_blit = images[event.key] iaa = img_to_blit.convert_alpha() elif event.type == KEYDOWN and event.key in blits.keys(): t1 = time.time() # blits is a dict keyed with key -> blit flag. eg BLEND_ADD. im1.blit(img_to_blit, (0,0), None, blits[event.key]) t2 = time.time() print ("one pixel is:%s:" % [im1.get_at((0,0))]) print ("time to do:%s:" % (t2-t1)) elif event.type == KEYDOWN and event.key in [K_t]: for bkey in blits.keys(): t1 = time.time() for x in range(300): im1.blit(img_to_blit, (0,0), None, blits[bkey]) t2 = time.time() # show which key we're doing... onedoing = blitsn[bkey] print ("time to do :%s: is :%s:" % (onedoing, t2-t1)) elif event.type == KEYDOWN and event.key in [K_o]: t1 = time.time() # blits is a dict keyed with key -> blit flag. eg BLEND_ADD. im1.blit(iaa, (0,0)) t2 = time.time() print ("one pixel is:%s:" % [im1.get_at((0,0))]) print ("time to do:%s:" % (t2-t1)) elif event.type == KEYDOWN and event.key == K_SPACE: # this additive blend without clamp two surfaces. #im1.set_alpha(127) #im1.blit(im1, (0,0)) #im1.set_alpha(255) t1 = time.time() im1p = pygame.surfarray.pixels2d(im1) im2p = pygame.surfarray.pixels2d(im2) im1p += im2p del im1p del im2p t2 = time.time() print ("one pixel is:%s:" % [im1.get_at((0,0))]) print ("time to do:%s:" % (t2-t1)) elif event.type == KEYDOWN and event.key in [K_z]: t1 = time.time() im1p = pygame.surfarray.pixels3d(im1) im2p = pygame.surfarray.pixels3d(im2) im1p16 = im1p.astype(Numeric.UInt16) im2p16 = im1p.astype(Numeric.UInt16) im1p16 += im2p16 im1p16 = Numeric.minimum(im1p16, 255) pygame.surfarray.blit_array(im1, im1p16) del im1p del im2p t2 = time.time() print ("one pixel is:%s:" % [im1.get_at((0,0))]) print ("time to do:%s:" % (t2-t1)) elif event.type == KEYDOWN and event.key in [K_r, K_g, K_b]: # this adds one to each pixel. colmap={} colmap[K_r] = 0x10000 colmap[K_g] = 0x00100 colmap[K_b] = 0x00001 im1p = pygame.surfarray.pixels2d(im1) im1p += colmap[event.key] del im1p print ("one pixel is:%s:" % [im1.get_at((0,0))]) elif event.type == KEYDOWN and event.key == K_p: print ("one pixel is:%s:" % [im1.get_at((0,0))]) elif event.type == KEYDOWN and event.key == K_f: # this additive blend without clamp two surfaces. t1 = time.time() im1.set_alpha(127) im1.blit(im2, (0,0)) im1.set_alpha(255) t2 = time.time() print ("one pixel is:%s:" % [im1.get_at((0,0))]) print ("time to do:%s:" % (t2-t1)) screen.blit(im1, (0, 0)) pygame.display.flip() pygame.quit() def usage(): print ("press keys 1-5 to change image to blit.") print ("A - ADD, S- SUB, M- MULT, - MIN, + MAX") print ("T - timing test for special blend modes.") if __name__ == '__main__': usage() main() pygame-1.9.1release/examples/blend_fill.py0000644000175000017500000000604111207055754020534 0ustar vincentvincent#!/usr/bin/env python import os import pygame from pygame.locals import * def usage (): print ("Press R, G, B to increase the color channel values,") print ("1-9 to set the step range for the increment,") print ("A - ADD, S- SUB, M- MULT, - MIN, + MAX") print (" to change the blend modes") main_dir = os.path.split(os.path.abspath(__file__))[0] data_dir = os.path.join(main_dir, 'data') def main(): color = [0, 0, 0] changed = False blendtype = 0 step = 5 pygame.init () screen = pygame.display.set_mode ((640, 480), 0, 32) screen.fill ((100, 100, 100)) image = pygame.image.load (os.path.join (data_dir, "liquid.bmp")).convert() blendimage = pygame.image.load (os.path.join (data_dir, "liquid.bmp")).convert() screen.blit (image, (10, 10)) screen.blit (blendimage, (200, 10)) pygame.display.flip () pygame.key.set_repeat (500, 30) usage() going = True while going: for event in pygame.event.get (): if event.type == QUIT: going = False if event.type == KEYDOWN: usage () if event.key == K_ESCAPE: going = False if event.key == K_r: color[0] += step if color[0] > 255: color[0] = 0 changed = True elif event.key == K_g: color[1] += step if color[1] > 255: color[1] = 0 changed = True elif event.key == K_b: color[2] += step if color[2] > 255: color[2] = 0 changed = True elif event.key == K_a: blendtype = BLEND_ADD changed = True elif event.key == K_s: blendtype = BLEND_SUB changed = True elif event.key == K_m: blendtype = BLEND_MULT changed = True elif event.key == K_PLUS: blendtype = BLEND_MAX changed = True elif event.key == K_MINUS: blendtype = BLEND_MIN changed = True elif event.key in (K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9): step = int (event.unicode) if changed: screen.fill ((100, 100, 100)) screen.blit (image, (10, 10)) blendimage.blit (image, (0, 0)) #blendimage.fill (color, (0, 0, 20, 20), blendtype) blendimage.fill (color, None, blendtype) screen.blit (blendimage, (200, 10)) print ("Color: %s, Pixel (0,0): %s" % (tuple(color), [blendimage.get_at ((0, 0))])) changed = False pygame.display.flip () pygame.quit() if __name__ == '__main__': main() pygame-1.9.1release/examples/arraydemo.py0000644000175000017500000001100711207055754020423 0ustar vincentvincent#!/usr/bin/env python import sys import os try: import pygame from pygame import surfarray from pygame.locals import * except ImportError: raise ImportError('Error Importing Pygame/surfarray') main_dir = os.path.split(os.path.abspath(__file__))[0] def main(arraytype=None): """show various surfarray effects If arraytype is provided then use that array package. Valid values are 'numeric' or 'numpy'. Otherwise default to NumPy, or fall back on Numeric if NumPy is not installed. """ if arraytype is None: if 'numpy' in surfarray.get_arraytypes(): surfarray.use_arraytype('numpy') elif 'numeric' in surfarray.get_arraytype(): surfarray.use_arraytype('numeric') else: raise ImportError('No array package is installed') else: surfarray.use_arraytype(arraytype) if surfarray.get_arraytype() == 'numpy': import numpy as N from numpy import int32 else: import Numeric as N from Numeric import Int32 as int32 pygame.init() print ('Using %s' % surfarray.get_arraytype().capitalize()) print ('Press the mouse button to advance image.') print ('Press the "s" key to save the current image.') def surfdemo_show(array_img, name): "displays a surface, waits for user to continue" screen = pygame.display.set_mode(array_img.shape[:2], 0, 32) surfarray.blit_array(screen, array_img) pygame.display.flip() pygame.display.set_caption(name) while 1: e = pygame.event.wait() if e.type == MOUSEBUTTONDOWN: break elif e.type == KEYDOWN and e.key == K_s: #pygame.image.save(screen, name+'.bmp') #s = pygame.Surface(screen.get_size(), 0, 32) #s = s.convert_alpha() #s.fill((0,0,0,255)) #s.blit(screen, (0,0)) #s.fill((222,0,0,50), (0,0,40,40)) #pygame.image.save_extended(s, name+'.png') #pygame.image.save(s, name+'.png') #pygame.image.save(screen, name+'_screen.png') #pygame.image.save(s, name+'.tga') pygame.image.save(screen, name+'.png') elif e.type == QUIT: raise SystemExit() #allblack allblack = N.zeros((128, 128), int32) surfdemo_show(allblack, 'allblack') #striped #the element type is required for N.zeros in NumPy else #an array of float is returned. striped = N.zeros((128, 128, 3), int32) striped[:] = (255, 0, 0) striped[:,::3] = (0, 255, 255) surfdemo_show(striped, 'striped') #imgarray imagename = os.path.join(main_dir, 'data', 'arraydemo.bmp') imgsurface = pygame.image.load(imagename) imgarray = surfarray.array2d(imgsurface) surfdemo_show(imgarray, 'imgarray') #flipped flipped = imgarray[:,::-1] surfdemo_show(flipped, 'flipped') #scaledown scaledown = imgarray[::2,::2] surfdemo_show(scaledown, 'scaledown') #scaleup #the element type is required for N.zeros in NumPy else #an #array of floats is returned. size = N.array(imgarray.shape)*2 scaleup = N.zeros(size, int32) scaleup[::2,::2] = imgarray scaleup[1::2,::2] = imgarray scaleup[:,1::2] = scaleup[:,::2] surfdemo_show(scaleup, 'scaleup') #redimg rgbarray = surfarray.array3d(imgsurface) redimg = N.array(rgbarray) redimg[:,:,1:] = 0 surfdemo_show(redimg, 'redimg') #soften soften = N.array(rgbarray)*1 soften[1:,:] += rgbarray[:-1,:]*8 soften[:-1,:] += rgbarray[1:,:]*8 soften[:,1:] += rgbarray[:,:-1]*8 soften[:,:-1] += rgbarray[:,1:]*8 soften /= 33 surfdemo_show(soften, 'soften') #crossfade (50%) src = N.array(rgbarray) dest = N.zeros(rgbarray.shape) dest[:] = 20, 50, 100 diff = (dest - src) * 0.50 if surfarray.get_arraytype() == 'numpy': xfade = src + diff.astype(N.uint) else: xfade = src + diff.astype(N.Int) surfdemo_show(xfade, 'xfade') #alldone pygame.quit() def usage(): print ("Usage: command line option [--numpy|--numeric]") print (" The default is to use NumPy if installed,") print (" otherwise Numeric") if __name__ == '__main__': if len(sys.argv) == 2: if '--numpy' in sys.argv: main('numpy') elif '--numeric' in sys.argv: main('numeric') else: usage() elif len(sys.argv) == 1: main() else: usage() pygame-1.9.1release/examples/aliens.py0000644000175000017500000002252211207055754017717 0ustar vincentvincent#!/usr/bin/env python import random, os.path #import basic pygame modules import pygame from pygame.locals import * #see if we can load more than standard BMP if not pygame.image.get_extended(): raise SystemExit("Sorry, extended image module required") #game constants MAX_SHOTS = 2 #most player bullets onscreen ALIEN_ODDS = 22 #chances a new alien appears BOMB_ODDS = 60 #chances a new bomb will drop ALIEN_RELOAD = 12 #frames between new aliens SCREENRECT = Rect(0, 0, 640, 480) SCORE = 0 main_dir = os.path.split(os.path.abspath(__file__))[0] def load_image(file): "loads an image, prepares it for play" file = os.path.join(main_dir, 'data', file) try: surface = pygame.image.load(file) except pygame.error: raise SystemExit('Could not load image "%s" %s'%(file, pygame.get_error())) return surface.convert() def load_images(*files): imgs = [] for file in files: imgs.append(load_image(file)) return imgs class dummysound: def play(self): pass def load_sound(file): if not pygame.mixer: return dummysound() file = os.path.join(main_dir, 'data', file) try: sound = pygame.mixer.Sound(file) return sound except pygame.error: print ('Warning, unable to load, %s' % file) return dummysound() # each type of game object gets an init and an # update function. the update function is called # once per frame, and it is when each object should # change it's current position and state. the Player # object actually gets a "move" function instead of # update, since it is passed extra information about # the keyboard class Player(pygame.sprite.Sprite): speed = 10 bounce = 24 gun_offset = -11 images = [] def __init__(self): pygame.sprite.Sprite.__init__(self, self.containers) self.image = self.images[0] self.rect = self.image.get_rect(midbottom=SCREENRECT.midbottom) self.reloading = 0 self.origtop = self.rect.top self.facing = -1 def move(self, direction): if direction: self.facing = direction self.rect.move_ip(direction*self.speed, 0) self.rect = self.rect.clamp(SCREENRECT) if direction < 0: self.image = self.images[0] elif direction > 0: self.image = self.images[1] self.rect.top = self.origtop - (self.rect.left//self.bounce%2) def gunpos(self): pos = self.facing*self.gun_offset + self.rect.centerx return pos, self.rect.top class Alien(pygame.sprite.Sprite): speed = 13 animcycle = 12 images = [] def __init__(self): pygame.sprite.Sprite.__init__(self, self.containers) self.image = self.images[0] self.rect = self.image.get_rect() self.facing = random.choice((-1,1)) * Alien.speed self.frame = 0 if self.facing < 0: self.rect.right = SCREENRECT.right def update(self): self.rect.move_ip(self.facing, 0) if not SCREENRECT.contains(self.rect): self.facing = -self.facing; self.rect.top = self.rect.bottom + 1 self.rect = self.rect.clamp(SCREENRECT) self.frame = self.frame + 1 self.image = self.images[self.frame//self.animcycle%3] class Explosion(pygame.sprite.Sprite): defaultlife = 12 animcycle = 3 images = [] def __init__(self, actor): pygame.sprite.Sprite.__init__(self, self.containers) self.image = self.images[0] self.rect = self.image.get_rect(center=actor.rect.center) self.life = self.defaultlife def update(self): self.life = self.life - 1 self.image = self.images[self.life//self.animcycle%2] if self.life <= 0: self.kill() class Shot(pygame.sprite.Sprite): speed = -11 images = [] def __init__(self, pos): pygame.sprite.Sprite.__init__(self, self.containers) self.image = self.images[0] self.rect = self.image.get_rect(midbottom=pos) def update(self): self.rect.move_ip(0, self.speed) if self.rect.top <= 0: self.kill() class Bomb(pygame.sprite.Sprite): speed = 9 images = [] def __init__(self, alien): pygame.sprite.Sprite.__init__(self, self.containers) self.image = self.images[0] self.rect = self.image.get_rect(midbottom= alien.rect.move(0,5).midbottom) def update(self): self.rect.move_ip(0, self.speed) if self.rect.bottom >= 470: Explosion(self) self.kill() class Score(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.font = pygame.font.Font(None, 20) self.font.set_italic(1) self.color = Color('white') self.lastscore = -1 self.update() self.rect = self.image.get_rect().move(10, 450) def update(self): if SCORE != self.lastscore: self.lastscore = SCORE msg = "Score: %d" % SCORE self.image = self.font.render(msg, 0, self.color) def main(winstyle = 0): # Initialize pygame pygame.init() if pygame.mixer and not pygame.mixer.get_init(): print ('Warning, no sound') pygame.mixer = None # Set the display mode winstyle = 0 # |FULLSCREEN bestdepth = pygame.display.mode_ok(SCREENRECT.size, winstyle, 32) screen = pygame.display.set_mode(SCREENRECT.size, winstyle, bestdepth) #Load images, assign to sprite classes #(do this before the classes are used, after screen setup) img = load_image('player1.gif') Player.images = [img, pygame.transform.flip(img, 1, 0)] img = load_image('explosion1.gif') Explosion.images = [img, pygame.transform.flip(img, 1, 1)] Alien.images = load_images('alien1.gif', 'alien2.gif', 'alien3.gif') Bomb.images = [load_image('bomb.gif')] Shot.images = [load_image('shot.gif')] #decorate the game window icon = pygame.transform.scale(Alien.images[0], (32, 32)) pygame.display.set_icon(icon) pygame.display.set_caption('Pygame Aliens') pygame.mouse.set_visible(0) #create the background, tile the bgd image bgdtile = load_image('background.gif') background = pygame.Surface(SCREENRECT.size) for x in range(0, SCREENRECT.width, bgdtile.get_width()): background.blit(bgdtile, (x, 0)) screen.blit(background, (0,0)) pygame.display.flip() #load the sound effects boom_sound = load_sound('boom.wav') shoot_sound = load_sound('car_door.wav') if pygame.mixer: music = os.path.join(main_dir, 'data', 'house_lo.wav') pygame.mixer.music.load(music) pygame.mixer.music.play(-1) # Initialize Game Groups aliens = pygame.sprite.Group() shots = pygame.sprite.Group() bombs = pygame.sprite.Group() all = pygame.sprite.RenderUpdates() lastalien = pygame.sprite.GroupSingle() #assign default groups to each sprite class Player.containers = all Alien.containers = aliens, all, lastalien Shot.containers = shots, all Bomb.containers = bombs, all Explosion.containers = all Score.containers = all #Create Some Starting Values global score alienreload = ALIEN_RELOAD kills = 0 clock = pygame.time.Clock() #initialize our starting sprites global SCORE player = Player() Alien() #note, this 'lives' because it goes into a sprite group if pygame.font: all.add(Score()) while player.alive(): #get input for event in pygame.event.get(): if event.type == QUIT or \ (event.type == KEYDOWN and event.key == K_ESCAPE): return keystate = pygame.key.get_pressed() # clear/erase the last drawn sprites all.clear(screen, background) #update all the sprites all.update() #handle player input direction = keystate[K_RIGHT] - keystate[K_LEFT] player.move(direction) firing = keystate[K_SPACE] if not player.reloading and firing and len(shots) < MAX_SHOTS: Shot(player.gunpos()) shoot_sound.play() player.reloading = firing # Create new alien if alienreload: alienreload = alienreload - 1 elif not int(random.random() * ALIEN_ODDS): Alien() alienreload = ALIEN_RELOAD # Drop bombs if lastalien and not int(random.random() * BOMB_ODDS): Bomb(lastalien.sprite) # Detect collisions for alien in pygame.sprite.spritecollide(player, aliens, 1): boom_sound.play() Explosion(alien) Explosion(player) SCORE = SCORE + 1 player.kill() for alien in pygame.sprite.groupcollide(shots, aliens, 1, 1).keys(): boom_sound.play() Explosion(alien) SCORE = SCORE + 1 for bomb in pygame.sprite.spritecollide(player, bombs, 1): boom_sound.play() Explosion(player) Explosion(bomb) player.kill() #draw the scene dirty = all.draw(screen) pygame.display.update(dirty) #cap the framerate clock.tick(40) if pygame.mixer: pygame.mixer.music.fadeout(1000) pygame.time.wait(1000) pygame.quit() #call the "main" function if running this script if __name__ == '__main__': main() pygame-1.9.1release/examples/aacircle.py0000644000175000017500000000137211210364127020176 0ustar vincentvincent#!/usr/bin/env python """Proof of concept gfxdraw example""" import pygame import pygame.gfxdraw def main(): pygame.init() screen = pygame.display.set_mode((500,500)) screen.fill((255, 0, 0)) s = pygame.Surface(screen.get_size(), pygame.SRCALPHA, 32) pygame.gfxdraw.aacircle(s, 250, 250, 200, (0, 0, 0)) screen.blit(s, (0, 0)) pygame.display.flip() try: while 1: event = pygame.event.wait() if event.type == pygame.QUIT: break if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE or event.unicode == 'q': break pygame.display.flip() finally: pygame.quit() if __name__ == '__main__': main() pygame-1.9.1release/examples/__init__.py0000644000175000017500000000000011207055754020166 0ustar vincentvincentpygame-1.9.1release/docs/pygame_tiny.gif0000644000175000017500000001255507344246634020233 0ustar vincentvincentGIF89aÈ<÷%7&!8 6$!!&(!!)75-77'('-0-/1146)676IW G FV q (S (X6G2F…É´¬Ù³ÑRfΟ[å®Ó†-Z5UZÆiIö–9´€×´÷¨š–·oÛf-Z©voË5ûöH°åËÑk–±[,?«5+çYK7Wð0«^ýÐÞ+j«øyö×çg4M³ÑaÃ޵ïßË!£fªßìX?©ÉšÝ¯·YÀ£ÿ~D-Z*ãnãó§e›6j=þ÷ÓÔ –ôó˜c1‹­d·ÀëÄ|<Òoï­Ú† úÿhÙó {Ñhs˜[â<ñÅOÖT3K¼óV8_]ƒ €2õNWìY³L:ïÌò*¤âI'œÆˆ=òÓ6¯d(#Næ(Cà6®Œ6/fóâ6©Àb[_`ób+3&IS9ª°7)ªT“Í”ÛøøãO«€aÅ5?²¢ä—&ÙÀ^3ŒPcåOTžù“7Hü˜3Ùƒ=rÒi>xÎ fYãDÀL&ÌLSe3ÍYe?qC}?}ãMB"•†KTj©]`âN]¤Š.,$’:]8qA P\ÁþNdê °ðçk>ç8aª©@Boás… cÍÕ¢‰Í4Ê ó¢+ÎøØŠ=Àc FFmtL£!Fè.á¯: ÓHók; 0ÖFP¯@T n`@Êߊ±ôQH®d¥4ý10"F6Èîìp€ÝÅ®˜‰@ à@Žé €,¸¸¦Ñ/i8A¦€7ÅAPiJA8&?¬‰!@_N»1€ þµzGëæÇÃúe`É;ƱÿíÃ|BàR•Îä£35" B¨ ‚ªzqvÞS)ð°䎄³›WúÐøE£`sñàšÕÚ¸½4`€ÂÇ\gB¥­m³›ûú@ z‘ÒëÂ=¾ÐD<‰ƒñ˜ÂŽ ÅÑqc7HÌ1… ŽOy/dãúÒ0ÂÅmïæ‹Ç݆ƽúMzºÛE)Ë \àå€ðBiÊá!q {\Þ=6ËÞoSñ¨@HKÆ€ ãЇ>ìQØ®ù0G \„N$#®è„ Ž0@¡ RèÖ@ìQT]Í•½,æðŽ&FS`uïþB™å†Ç½4 Kc a'¨Rw±“'3;P JŒ²¼œâHXL¦à ð€PB7ÊÌöAø(*P&xùÀ<ÚaŽ0PA ÂÁD@ ˆ •@ú€²õ²•5åî *§v¢¬‚óÜ^,º¯sA ìZDç©Ðy~¯M*µZP3º0©hdcÀ€§wLHÀIó‘Ó|Ü÷H.a.(¢ U€È!|˜1UE\\0€ùÕ˜¸‡=8†²Pvóë!ÊR•U{`¢¤E½—ª×=6¨¢Lº«Õ––{*ÐÇ=äÁŠÉOM þ€:¼ D´ ’ $.à…IP"M GLÞ1Ù>Îóƒ“=ciK˜´N€ ùtgUªÔä’–ªèú*UÅ`®§>¹# íTùÉÑ4Q»%ìÀÝÐúÉR ïÀÇkÓq<ÉãS9äÑ)x!^`À>|‰R;ÕÞ,I™ÜÎö’ªìÀ¹ð†ÏÂLScqMËàÆ îlDw—*CøÃ%oÒ¤W^4ü±±–£èò$_yÀ¢ èø_Jñ”(¤`‰°>Â…),0á@ÖÐ45âhkÃ*“Ë5m €x2¡†Ý9ÙÊUC—ÁÆd£‰ve6³þ‹²4£ÁÊvÀÀ<<5,l²Ž=óÒ±ÐÚsr+Ó †5˜ÊkDZ—‡Ô¥•Ù¼ v°+Å€päI Õ Æ1Ž@'Dá `ЦbQ‰IH!)8‡þЮB„`2!Á,ád(ƒÃ“Õ0kBÀzÖ€^°½†BÐið5¬‘ök0ÿúÉi(ĚДmÀÕ[6 ÔÀTýÐb„îœ\Â×F›µ Ðk0ϺVæ5°· ˆBxs»Óm8£¡Ùh0¹S%€3ÂÐNV6pØÈPÝð6œñDœš ¨N9Â@–„¥ Æîõ¯þ A† (Ö “ýC¬Ÿ}n;ôúå0ùÈan虚x¸³±r˜— U øƒ± ÑE 87—“M3@é„@Ú¬Ë`‚4;æ„èsê-r£BåOžy¯ñP x¹!z]ˆpŒBu¸zh‚ä "r¾„ ({:Ö áŒE•@‡:̯=x`7þñ1Cê x˜¯;ðø€†Nrr'=æ`<Ì ñPëmOUÈE.vÈ»¾ˆB9~àˆSDƒtÖJB)HÑ„à ì(à?^ù——OÀ¼ü0ø?ÀŽë§ù˧JB·öëþÐg0?æ…(Añ Ñí4Ÿà«o|ô©Oˆð/1(…T!:Òq#ÊÈ? Þ÷÷Ʀôv€©²ÐÇvlgr¶~ì§~ìwo©rJWyçVøn'@að(X §@ ??ðŒ  ùÇ qƒpL¨}ƒg… €2€„ïfl‚àÙ~ïFy[è‡þ_'HÇ'z~øˆLXpÀ…íç@‡‡…ðGdð…xØ…CÇy!÷‰Cç °Q°e˜Šex ù‡ N9§z‘ˆukGµ8kxÐ`€wàx€pp¸¶Šx•Wÿ……p'à‡÷V½v‹·¨€<¸‰Úw‹SÖ8kÙ˜vH‰íS°P'pŽ(péx%° €.Ð@ ª¨Šù§ ‹€ Áj©RŒ0w‹/l·‡©BytU~ηp€‚‘ˆw(0Øk=ˆBusk ÄÀv…ÐŒy„T8#€2G8x‚pt0™þ*•æ§Peè†ÊÀ 3Àÿ2YÌw·pn†@ Æ ³f…°vÒh‹%¹JwƒlwGw¹` B9kF‰s€% <° Ù`çv Ð %)9¨”„p F™”þX‹Di Ñ{ÆV‹·˜ ¹°0@…pJ¹•Gy ÆpJy‡“[¹ðdPx08dh“»‡ ­x ‘d(#dY–·—#™ Ðp ¸` rIUi‡# . Ð`•¶H”„0pÚ—¸ÐkÀPš$·„pšÐ`l~0eþg¨9’(pšm¹–±Ù—wSu•qi ·@D9 ÈxÆþ0’†P À€šÐ0)¸”ÇY„¹P eɃŀš¥wtx°ŒÛ‰ ¹@”Ũh™¥pŒ CQ“õ± ž¨i Z ÇI”Ð àšÐ Р߉𵠀H‡„i ¨)¡Z ¹0(ð± xù ¶Ú‰ n #š  ƒ\(p¤‰ * 0.Š Û©(3€2EÀ¢<Š—Åð J¤ ©Ò ¤ð¸@ Z ÁŽ@6ÉŠ9éC6“5¤<Š ±é ½p¦¢°9p7ÀjP¥< Å žp:¦J¢ qêà€2›P¥ÐÀþ±Y§¶Ð`¢`§ê  Š ž €2?BJ \9 «° z«ñ÷§©‚ÖZúªÅ° "€/À ¯êP“[ú†?° 1Y¸z U “ š*Ы–Š ÏÀ«qú¬ÁÚ¯Z  * 0 ‚j ÷)ªv »à¡û*§·Z¨Š p‚§P°'°»j ðšpZ²,›z²Ð ø‰þ‚ZZ†¤pÊ@_ÚWSö¦zZ²!iLt¸ Æ B;¦Ï ´ÂЯF+¬w F[´G+´¿ (û´Ak ‡*¦ûš¤' ²dÊ( k k† 0Y Àµ¨) ( ŠšHÛ´Cû´úÉ¥Êà5¸ø`«_k E§z0Y0ít(Ð ´E‹´Nk´ŠÛ´JªP‹û¸Ž{¹TKª  N«©~«§O›²ò걓ë·þ À±e‹2 ›ª*¿`©Ú¸pë¸Ï@ð²»—Š÷È  ‡¥Âf0 NÛ¹¨¹  øpïcÑ•*;¸˜Û¸¶þk½Âð Jö ¶ºO‹½Ï· Ø[½p[ ,û£Ô›²z¥‹Ð+\À ‹û ¤ûq¼§ÞºÖ˲•Y¤€™ùçàÃt¸æ{´†·5 ­“5½Ý‹¹,´÷{¶œÀÊû£Æ;ÁÜ´PŠ2zнN+¹  6;“i  ë{Á–« Ꚋô¸÷H³ÁS(ó×Û´p`qÀ ¥`ÂðJ¾0|¹E ÷ @¿ÜÁÏÀ¤É…®{»S|´"pº`¹ŠûÁŠ©˜! ÆLl´º`ª¿ÌÊ—* Åa,ÄÑZêÀÉõœ[¾·û þ{€Ä“E¶ÐÁL¬ Oü£>ð †ì½âiÀȸûÈc\ÉÀû»¿Ï൰ú)ÀøØI­‘\D ÐÀ½ à®g¥àbiУp´Ü{ËÜk DË & àº¸|Ë /PÉ °ä+̼ ¼@M o g$ K $J#V%Y6G5F=R=QÝ¥¦¸ñÞjóTþ«Œ­tí¾•y% |%lÔãËw[ï©­?øqçÍOÇ´yÕ|u,Xè³?b¼25Ò`±Ö|FÔ:SlÕ 8ûmG3Àm¥LúqÇÍ|eŠ6¦¨¢KÛ´‚[ˆúÓ(âmÅ„=1Ê3ÉWÌØ²â@’dÏZ5cFŒ¼µÃD‡Çè†äISF=AVi¥FÞÜMHîæÎ’FŽHf#ËW§¨såšlBÔŽÇÍ¢]—ðü& 2etéO:R| :m*èA…¼çœH¶XÑS‹žð$ñÕ,Q ji è@1—"žó~×(8ÍVÇŒ©¤ÓÄÂÍ¥¬®¹Å\þJE³L!ûeA@†ø%£¥ê©èWÎÒê°@¢ÉxÑH“Œ»Y¤EÇdÃO º]7¢NSɃĆ áZŪÌ4¯xÃ!à%†‰L-Ù<{A>û…ÑÙW²°!î¿ñQ8^¬ÒäwàhmÔðÊ,³4³L4x^óì÷ˆ¨„WÀ‚áÀËæ(#;Í,µì#O7fLÅ$­¼" ,¥„E$¡ÔÐM2h³6gª–* íØ5.z¸ÆPp0,ZIƒ±ÏÒ8ÃÌ+S³þØ£„Ï<®*ô×mÙbœÈÎ0!ÉÃNwõ4ת93ÉîÆά½š°`çM•þ!Z†,Í2IÌ•lW„³m¸3¥lQO7`$cwWeè-9QØ !2“%»p†þÊL$Ó¹4SLnzPYHb´)ªk5ç{=>M5Ô@Ñ3×í}{úî1±cÀ±×pÜëœoø<Ô0±/×óè^e=õÜ=•¼ÇVÅ–óÄÑ{Eƒ 2ËÄ VçªUC3}B=ÏÐQc~@‹,°¨AÐOaS¤ õP)‚ c 1•g}8€ Ê  lÀF°è7ÓªH&tªvp ,0@R±˜K˜U—à(‘éM/!i0@00L“ó˜­| 1‘sTÁYXDÀ)‡éT&@¥@”ÖÑL„°C³<Z—ÐÂÏ+Þ³3$: f@¡ž9CL}JR’Ž´´!M­M…ú,\Ã}èØþÀ³Ý:u aG‚Ùõj—¹Ì2vvBD+b»Ü‡u7»›ÿ~]ƒ°ƒ2uCÙ¾xÕ&Yïé†!­{}]X>8À‚È"Ѐæš3¤€±´ÃyAHÍÃ{=ëT¶­´ØoÏÞ›È5,âÆãûñXl8ìg‚·æý¾¹ïs®Ì€„ 1 <‰›ý,F/µB½rAþÏoƒc½ÌIÞ¯@Îàs}TÞòÝÐÀñ 64" PXÝ*ܶX`¢.Ђ±ŽC:Dˆ÷,w}§u‚Tžöz—dU@=ØÀ{ÈqùV}øpX®6 ¾¥x±woËFÃŹ7l fÈÖhSöx0|e–LTð1o–Æx©¶rçr0Kl ÞVyïlàp E‡ð_ PRð ÌP7*ä Î0 “ €üÀWÀ_pæKÐC Tʇƒç}mv[®Wpw7\Öð4J5•†÷%To‚kˆ/€Â 8&|xkG`þyWTò€Ñ×x7§‡l¸xSöiUx6$føkWv¬6{À“g~÷ÐV`ÐtøðàÀ[ M;àJI /ðýd ÀàZÐúà 1o=”‚lxˆ›hƒ÷%RõÖ†¦Là SÅMp†R.W[œ¨qÒhÂ×%J ȇ8ŽÎ˜ZBEÔÃç„vw&6Rõ%pØqÃåŽïp\ÊhoŽ¥Õl¡Xyç€0ip-°öÀŠðÐë°àp mÐïÄC XÀé0 Àúç^jrãC™8¯çuxhþ€øèQIF±MñDˆÍèQ-¨‰ÆTX¨To!ÈlPehjÛ(8‡_ |3¹Œôø •ˆe(SIÙ‡;ivudhàm÷] ~à‘ðtð‘àÖö`î - Ý ðm%©. ˆq§vˆjRô¨‰¾wZ l@=8ÉMÒçhgXmÙOÏRƒ RáW}{­æ{o‡ûô†·†˜QIRB•T‹F•Ëxƒ–[–÷÷€m Ð.°¸iëðàA·û.À™ ž@V Tp _àl€ZþðƒIu c%SKÉx·”Äc²)x7‡[ÐE1wñ$©¥$ó)]°e=”c‹R”L¦•ÃŽ.×T=Ô’l÷C›õwô•Ž ( ‚÷)€› ÝàZк°ÐðÐ`ZÐÚà_  Ð —`[_Ð šà ŸÐ^ˆ„9ƒ?Ô“,lj'Å‘šijJ ¡i8\Y(÷0_ñT™ÌXRúú‰Kµgbyé9Ÿ –|/Y¯ô ¨–l7x}0YpÉ$€†øÇTWâHb pøp›–÷ €Ð ðp¡T ¸Ù à1hþÚ°™àŽÀ Vpg°åð¢°&ùŠQÇeW[W¥ÁdŸ/¹Ž ÊCU'ÈMòù©êH|üÀU€!øJ Ž6è­dVFªšnx_Ê ùˆŽcTb*“ØJ¹QÕ‡­öµi¡· ?è`¡òp›ë°§{ªü·–àà\Й lÀ€ú`ŽÐ Žp . Ø`ŒZÚ«õ˜Ÿ« •šê’ùè’u0^ójsáè«ÏxŸ!ÅZü¤ŒI™¦§ÚŸŠùòúrzˆmÇa*|dj¯oZ¯ÉƉž]x8šÈ¤Ÿ­§ž&ß@§a‰›t ëð¶I§szþ›z¦0Ë›ð–ð — ]ÐÀ=*ìž}w¯{[œúCp;¦Cyw#uRÍUJ§T´Îèªç˜ó D;ŸòÊoô©˜ *œG¶ öJ€†¹lkè¯W{Ÿ#%fHµÒåGÛ°M[pÐ %»²ðpe> }d²}{›_àW™Ð Ð å0Š˜ZðL»å ÜxP´w€h¨´ 0¯ýD‹ ¶uйž;]xºp¸ºè‰žtpê8]J«q *R²;±€ÅM* »ÒX`+VK`ÔÇOݧ˜Rv™#°¬;š »fcBþ&]w`J¨:Ÿ‡%Ž×›°aÊOrË•¬é|Õ·ðð Rð0Êà ¥àVlp Þð ßí”{Ù /j°-à.ÀPxß¹O=¥ Rx°‹P»w€ˆÐ¼¢û,Ï»¹#u Áˆ ´ Á¬»¼¹HÁìÀÓEÁ06Áˆ½Ò%Âd¦ 0ÞÐñˆÀj@5ÁÓ|$ðÁN[ˆáËOžž«Z!¬Ïœ»ÂÐ ¶§‹%,];\<(]\LÁµ{Zw;ŸX¼Ãu{·>”€µ Æw ´ùÚT >@?Ð ã¡PÉ LþI4?…ÊŒÐܰ á°³œ®ép2'†¹‹°ÅÛÁ"EҰ» îêC*pɧ…Å|ʧ¼Åx`Ê<Æq¼ÊYRŒÂ— ¼ÜÁ[R|ɵ,dXТܤ‡Â$ Ëb\ÆPV̬˙ŒN|ÁÏ©L»¼<X´¸¼Ä#ÅÊÐKƬÉ\ÌËÍçèÍÌjˆr ÇhŒËrŒ$pÄÜ$pÉÀ[äLÁ‡ q†À 5`Kpi“PíÁ ` ˜W°¸ùçÐìç î‰NêC |ÉŠ€ÊtÂXÌì@|ÇMÔÜÀúþμŒŌ˦ÌÊ/|Ëè ½·ŒÊµ ˧ÜÃ*Mʱ‹ÅØìO¾+Â!5Ó— >ô¼"ŒÊ$ Í=Dº§ ¼TÌ@ÌäüÍC͡0µKÅá<ÓÖÎÞœÆ:͇€Å&LĨLÁ¦<*¦?Ô*À¸Á8}ÊŠ0\† ŒtJ1:]±>¯pm­VÐŒØüû kPÑÜ„Ô;=Ó<•Rè ´ÐÒUmÓŠ Ã6=ס=Ú6MÔB½Ë¥]×sP?:Ê+mÚ‹?|ðÒY­Ð  ÛôüC€Ê©›Ê¹½Ñ¨œ»§lÄp RiLÚXÜÏ=tÒ¡mËþǰÝÙ‹ ØMÚ¡ÍÊK]ò…°ðE³Pèæ31DpÝP‘Ü  ÚíÇW q½Ý£-EI¸ÀÚˇ œ]Ýö=Ú.à¨|p !@qÝßUÍ?Ú$@ *0ÙÝΫª¥mÓ ð¼è¬Ö¸ÌáPÖ~ÊsÐ]PLÚžkà;íàiíà+ßl@®@ ÛÀ½ ÎP”@ Q0f€† [ _¦g`É1>ÚR½_ý%ðLsÀܧÜÉÐ-ã2^Ý0ÎåãOöÌÙ¡=ÀÔÎà2®išÑÚmÊÑüÄ`>ã©Ìå_ŽÊ²m“þ†P®ÀHcƒ;6 É@È  ˆ Ð?ªWM>ÛuÛZ”†px>Ôâ2îÅâéqîé‘>ô,*@ÜaÞÁ‡  L¥.ã*àÚý­aŠéýݸ¤ÍœêºNÚRp†­ðç9@ ma`!O€èˆÞ  ƒÅM àésL@N¬^ç+[¾ëÜÞßyåú)ÛÞæq {`êý½rÐå ÐCTííc%rÝíô.㇠lðÁî ¤€|B 5¦°‡®ìOwŒ>Ä ®mL$€ë`º25ïõžñ¿÷îC €ñÚp0î£þæÏâÔÚ-Õînæ!¿ñ÷~ì€ÀþçN 8K ²à8T8 „ I¡ìÈì Þðèé‡ÀIÏåíþ, Ðô-?õöÞ]›MõgNñý=æÏò¡]ã=ÄRõ»~ÕÎ[@ý 4O ‘04€ƒ,ÞA¯ì”À~$GïîcOö‹°e(ø„oÓÎÍ…ßÁ|på\ÎÚ=$¿ ƒŸøºþòíÀ0@óœï l_óýþçwè4f|?Ì‘Oõ\ÿ, àõmžúÚáôîúY~E$Oö| õ[¾+@ÚŠ°nù ~¡‹ïp8ÐùŸßùœ ÊþžèÀk Ù¾ û-?U*" ,oøz °° Ðý½ßíé?Úfpnù|unë¸Dû‹í=¤ûõ®"°+zæð9tH‘¢E.bÈP¡¢C|æèY1Á€lÖ ˆäÊ#,!EŠ„¥Ì¤É'UêÉcÙÒåË—l̤‰àPCœ9uîdØ‹ç"Ÿ ù  YtfD¬X1QE ©€OΠ?'4øÙ5ëЮCÜü™U§ÙhqòÑÓU'£ x®(*àª[¼:UL=Šq,h0¸ðàÁ˜Ê7CyÜ PY¹òÉ“4@ÁäÜY¦QþwóŽÆ›Á¨7RÁ@@Ø©ÍCš!Ñ{â…(QOÎ6„«ÂvÞ ¼†©e¨ÎqFŸëä[u÷ñ†j'ÌæÞ}¶3ê¨TheÙH˘•Áâá®ó{—ר ؃·×rœhÕ2_QƒúvŠCïâ:Ä'æò»m&ÁD )™"!"@ìµ¢òë…â MAžì©'cJäéã²ÃëŠ`Žœô0*¬†S¨®H(pǺðQ88 ôÌ«ìõ"9>&åÙf¶ÚzÊ*(h 1f˜IãÃ?Èâéw ­—™ëŬC¦@T"@À?ï þȯʠô Dœ†ÁÏ«ü†)æŽ !Ë2†8Œ* ÊEô ª¨óãEÄE†±ÒÆèxìA8à H‘\iR*+2$ôJR†nš„¯›Ù¦SnÓž5†W üÌîÊ@ÿŒ”±.˜Éˆ2±:s‘=v|”—‰ÅêW›À*†¨}Æ'EøP!Lïäê¶Ú<Èô™lm6¡Š áÃa«5fÊ+{Q+±ÌîY^¬4&—Œ 4˜´¨?ròÕß³¶¶!M¡&MO·Ã Ery6;^žÆ(òUód=éÚ±õ½oèÀ¸€Ÿ)q^¨µË3+î¹Ê{þ ˜P†V`Œƒ ¦’@t³”h¼ _«ÅJ`c¢kºªÛ]„ ½D{:‚^lÎÚa9<äuwg²­4A„îû5¨^¬ºÚa¢õ”T.ÝPâ³²J¿Ôݨ=MçEý¼R`BxeËŠD3I²xù=u Jj±ZÓ_ýÛ^{/U®ZhXÙ)àž)جúÊ\"¯‹„aß{‘œÿ¶˜Ã^2è’ÌÖÅÏ'! 4zØy9bµ÷ih{Y€ª¸É§Aa÷óobP—ÙoîÙxù æ‘aT·×Ê 4-#˜ý1k%ÚEx4 `ÏxþƒF 4+WDe&AÆ j5:μca4)4º·¿ôÑvƒú[0q¢  ‰|a3Öp„¿øC $P‚"üÁc1„Ý`  »ø½l62ï` „]˜Bc|pPÙLÄ-p¸ *@(¢"l4!Àà(0M€Ð !øFÚ£4¡€Ð¸(bHÐH®øÜI\±—a3¬ÊëzH?¿A£"c\0Xá„( :i8CQJ@ (‚ñWÅ 1Ô(JT²bŸôá‡@“@À(ÈŸ‚_ 2z©#UnàÃGJ3þñ0ÓX-…®¨€£@LBcD%‰ÑÓ 0@hò`ÓÄh:'HW¨G‘"9sÐã‹â† ˆ`‘àÀ&8³ @¾±AØ2ŠÑ4ÕÆÀôùm„Ð0†0ÂZé6Ž $¥©˜g‰ˆ_Š Bw6½èÁ‘3éàQÚÊÌÑ­hE6ÉøDhÒŽ>ò…1#I»*ù¡6Õf Ä9ONæ#ç I!Mr ŒÃœQUjYP*D¨bwÎÐŽ-Å;b‰¤;›©­{Rleú†±#Ès f%(ɉ'xs&ðþbUGŒ ‚¬tEé „„^Òd£úËê8·˜²špT0D´ŠD-Y_šP9a*Ìz©(­D ]8'hÂ*J$ϲ¦”vÄHfŒ„² š„THäT[rÌ&¤X;¨ ‘LO` ÷`0Bþ…1^£€Üx‰ˆ©RQó¸ÛÖ¶‘õ¼c,§x&´ô·®·Ýc=ǺàŸîô@Ë\³[®5>x¤ß+ÃUP%3–n[=*`ØÙ¦²ŒGiyZIŒŽ ˜‰m/}ó»Ô³~†/Z´Ì¥fXP½ºãÃH*ƒÏ¿2íPÀ àÈ#ÐÁ{SÅž1Õ+~p>ÏÜÔ¿Ò…±µéÚ‡ß Çú¿{ü YÎdÝ1÷÷“³nö¡ûÕ1¸7(;mæ…#g ·+ÌUC9ÔÏF~=‰Ó—QÔp÷µÌõLŒhŽ2L ¹‘ vø¼%Ýp®¹7xÁŸü€À´þÑ t°Ãe+I= íUäZá ½¿k¿ëO—´(SoûÕ÷Íx¸¯¢—~°}Õqoû¬'¿ÄQ\…ágB×&ßÔW~/0hWÔ´;ô½»¯}rî¬ÛÇhõµÁ_û„c³¢”'‰:•q j^êÐݦSQöã×\PtgÞq S,T`<ß[µ±“¹óÎR'3À}C¾«ë±?2 hÀVë7­ã¶t8ª‚@ |†W"€Jˆ$ 9Š=X?H¬{†NÓ5ã+>”¾b 4 Ü2CS$@ùk‰v¨*£Ø¸Ä:#ð&ñx½â¾b;þA%ü´U 9@x@,¼Án{b€A°Ï›µ+LBÔ³@ ÙHDCRJ»’!tðƒ?:,ðü[Ã/ô·ThAƒ• Ë­õ°€þó¹wÙ‚îSÀȆ÷p1 €Vø»î €>:9ì·Q¼Âês¾z!ÚKÃ,ä±"è „î+Å„Àgø…; ºAì1Ê_ì@4¤EV¤±U Bƒ÷£-`½!”‡×ƒ±b;zó  ‰Ø ¸¿j G~ûƒ\”UGVıW,¸?9$FSô…> ?Sü³ÂûE| ?ÜÅjÔA ÎþADX!·À€§‹Æû ÐDxì±fŠ¿—àÀò8ÍÚ°UP>tü4_°\œ sœÄŽÌ1b˜@i]hEq¬9ð+PÄ@ŠÊG›4Šèƒ_ÀÁbܳ&X¨Èœ Hr£„è9„d \™©[Åßó…×€H—` €•H8£Œ)@ÁYt<䃴_(‚Ô(?€3+ôÂN „—œh²Æ;K$¬ô”P„;H†È»I½Ô( X8[ŘÃ1]àÀ™Èe„…¢,KJ–h‡*z€&»»óCYjÎè†dÐaøË„+M1ÜB8þTäèƒU„“L_ë4Ôê pCÖ´BÐÒ´EH#†T*|”TM]èxÛ˽$‚Ý„ÍÙ„5†_HMT,£A‚ÄT'R€€*`L—0BG)Ö‚Mê$x>@6ðL“‚€‚>P]ØP]X…>‚˜Ë›$ °"]ÍÑaØ…m]M›T€‚ÐüQ„µRÒ…"N›ý´ eN-€bÐ&- ° xܼ«œƒ•T3Ê‚FDȨK¢€ ;¤ R–¸ #o"8þ‡•¸n¨?ÍRÁM-(€x€/íR2ýÈ`p€ÀÏ2%#„òàNr3 X€HñL7›uxveô¦¸÷p t`¡7]TFmTGõŽH,@ƒoH½v¸Tu8‡n8ò|Ôç{x‚VàNR…J@‚ x€,8‡=}‰²É-`’sÊŒ*Tht‰v@G=€¨‚*È*ЀÎóTOcUº¤sÓÙP¡4¨!!€®òŽ 8n`R—bÝ´ç#€àV;´CÀ†Vå ÈÇ °‡'$6€zh‡*Væ4Hƒnp™{¨‡z¸–þø†*PV_ 8[Іl¸†6¸…]XC €Í˜¨Cø†vP½wxyxvè40€mX Ök‡s°…4V*à ‚•å* ‚*8ƒ4˜Øv¸U&©‡q`hÍh…VîøÖ:´Ã¤‹€ ,ÈÆq…‰kxØ¢à©ä v˜°V—8‡-hSæt€3è†Ìƒw¸†NÍÇnøSÖÓ×}Y}•‡nÈ,ÍÇÀ‚nÀXY .imW¯½T½Õ[º]´¯¥yÍ0l0C8ƒ,¨Ø€_å ‚,Ø‚0Hƒ5¸†mø†sP½¤…C`Z ‚?µ4HHþ jnØ‚¤ÁG)5ª…‰v0ØÙîP¡§µ•v¸†,Üá¤|™\ ÜHƒƒÜ\øP6ˆWžíP`ÒC5^tC‡3à€¤[VzÝ èE‡Ãå¤9€¤ûÞ¤; -Óý0í­Àï5VÅ8V¥Û8ƒkxÝ—4¨ö ò!È€*¸]Ü=Ü-(à3Øû…Þ–x‡o0„-P_ˆ`_˜¥ßâUàVmtèP`ƒ4à¤4`C‡FÈ‘et8oPaFu`ŒµÙ©Z U‡oè†nànÈáq8uhwáEã×vP‡î`6HbÎo(áL„0FtÅ` b½wØÛKe‰µ•b-Þb.îb/þb0c1c2.c3>c4Nc5^c6ã€;pygame-1.9.1release/docs/pygame_powered.gif0000644000175000017500000002367307344245107020712 0ustar vincentvincentGIF89aúd÷%7' 6 "!!#)(()6.03,4:88&''+.0.1.-3386(677-8BHW D g u ir#J %U([6F:T ?C.>@=*`,e.r2k6w,k19PV=WaD;|<;LCEADY VJTK]U[YNL1Md F{Tj [u\|fZc\(mb lhbxe|wftk~prn.GHGGTVXFGXYIVXWFZc]`ZMcjZceYntZpuqpNgiglpnivwwlk}otyyfvwvr~ƒ‡‡˜˜–©¸ · ˆ(—;†<—(½?¿ ÆÜÞãðá,Ë"Ü2Ú2Þ!&â7ä6æ!BŠD˜[‰Y›J¦N±QªS¶J« K¶ Tº!gƒi†k’r‹v–e¢f¹z¤~¶{€uUÀFÊ#XÆ"[Ô$DæIé#Iñ&Yë&Wñ(`Ê"bÙ%rØ!iî(kò)rî%uô(j€‚|ƒ„¼¹65ˆw…}-¼B9–ph¹E@¡g]«}}É ÃT<‰…‚œ™„”‡—”‹+†§‹³“­•¹¬’ •7µ¥¯¦+‡…Qˆˆs¹±FĆ֚Ěܛä‰ê#‡ò#ší –ô"¤ËªÔ²Û­á«÷·ç¾ú§÷ ¶ú Õ¶ǽ à¿ØÄÕÉ"ÀëÁúÈü îÌêÙ#ûäúå(ÞÙXÕÏoûëPúði†‰‡‰’‹‰‰“”””‹–——–›¡›¡›¦¥¸Ÿ‘¡¢œ§¨¨©«±¬²¬¬±³±¦ ¾¾¾½¾Á¿À¿¼ÂÂÀ¿¿À¿ÀÀÁ¾ýóþø£ÃÃÃÅÌÒÊÑÍËÓÔÑÕÄÓ×××Ùàüýý!ùô,údþé H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²dD|íÀ§ŸÉ—0cʔَ +\8IQY7³§ÏŸ@¶CòìZ6mH§!çr >|å¢l)÷4¨Õ«X7¾£í,,»´À¦-V#uíÞ©Ób×3h°ìj—µ®Ý» ¿EÒîŸ_yHB{u I¬¢×p‘ÍÆ‹Ê;¼#cU7ê)~3˃孛¶l×®=£N^9*Ó¼m«"¹µë˜ð¨ˆ—¹6’nݲ¾F³_T²u{ÅîµñãÓÁòº¯væqÐŽ†Fâ;s?VÚ kм»w‰øvþEËFÊyæu°&NgþŸlÙtÁûN¿þÂu¯Bkiÿ¯.õ±TW[:Д5Ÿ}&[h×ìÂß:¹|fꤗ ] fø>ãà6T8Å8ÿì26úQa.êhè"rð qMWäÕÖ ¥Þ5û…óŽsj3Í8/é8Ït.êd¦I|S ŠÙ ±h"R¤ÔT;í°³Ž:ê¶ëe¥ ½óX<±Î7߀SÜEOõ /^U pEþ¼>U@àŠ›ÚfÍ3ÏDÚ­6öäòRÝÜ‹´ áóŽM$Q$ @2É`Ä[´ô¯Sæ4qÂÌI0¥>ì(A<ãØÈËøè£OÐCËÏ:[TñÄQ|žÐï¤%õÐ=eÎ!'±rË//¤=él±…cûHO×­cÄ0x(*Џ¼-Í[“ŠRöx“CþCø¨S`ÀxàÅá]xÐÁP&'!Ž—Nµs ®ÁãOtO#;oÆoˆ¡VTÚ· ÐúTñ 9꼃9^Àî`@yBO©CŽ øñ&Ÿ@ÚõÝÄÎ ýãœ@ßï€ó7ætÏ<‘ÎBí„ µÞÊí¨¢Õ­’B°À?€b°Ñé¤ï¿?ÿmƒ¼`ÌQ` MÁG8r·1ü k ‚+@ ohƒ5¸ P`[ØY4@Â|s¨@€ü±á…ÀnöŽ-œ€€ËÜ/x €þ°‚CžwÄCuäP à…1¼° /Ãpd…yìÀœÀ †1xQ bðÀ〖ßhD>Ø!g¼­[×`U¸´ÁŠ'ìK!íÀÀýü·Á>úÑphPtàã(ÀÙÇ7xŸP]Ð?nðt-‡î·HþÁtlƒ6P@0RƒoÐÎHp\n‰>™Á þ¯ @ІtTa=“S¼¤(ò”~|N×à©CLäã•Ùï%¡•ú;üÑ~\aјX² Á VÈà̈åKºó‚ ¸ °Á–~þdC0P©MnŸCN=hžþ{¡þü€£ùÆßÐÀ{"TƒŒBB¢°3tŒ^xÜ Ø‘G,¡¹œáAÂA€tÁ¢… –ÂÁO°£›ýðG;”  ÷‰)@h€+ppŽŽ]ntð<©•šÏÇ` …â%ù)°M€©KE¥tÉB¬^´lÐeÕq¹x¦_Õ`.¿ñ¯Iâï“|ÃV+ÌJ¾S©¬‚ê®d¨¦•`(ØJu„ƒ›ýØG?Ê¡v˜€ëëÖ4€°x0à _s¦;U°Jó«bagû¸Ï|$ €»êhãzB¬ö¯ þ*[êTþuƒl0ÀÊ%w Ö ï -ÏÚùW N áAo×Ü÷søè?º<߸Âc¡ÙmMãOpÁ ôq ¼Ú ìЇ< qäãJØG9\`ŠPˆ¢ M°‚'PŠ)\E5ˆµ‡kK€â³t›ë^6`ÑÕ^\Üe(€þCGÀµod*ÞÈ\::’¾ø¾g_>²\ÜRug-Ê33»–6÷Ç)n6|[ÒÒ¬8ÈàD¤Gõ -ˆ‡¾õÁŽL` ò>!(( àâx)TQŠ'T@èP…*ú,rd’=÷Í+¾nG_•è8úÿr9&Tp=ÛñÍ“Ž÷6Ðä–&çóÏ^œ xœVô8 ²g@úgõ^xÂûܱç38Ež¸´¼Íß@†oìchT?G=„&©ç£âÀ‡À¡à Sd¡ &à‡;BŠO¸àæ8H{æ@ û¯–e8¡É5çÏ]ƒ–¯øÀþñï ¸zÏ~ÄOx}šœo¨¾ÿ,‡Ó™Tï©oƒûëëI«þî¯ÿõɯzëÿ¯ÿë§UP|€¬çTÁDr‡}÷ù&4úÀú¶ ápóBÓÃæW°  ° û`ààPð wDDk釖qPw&‡Ð?0XvAv€¶•~u ~ýãEe ?ê·?0n6§zÙW8brgÐ?2çrdÀrˆ€Ád_,¸~fÀ3€ñ7~.~¨¤„að^C—A€þ'}&§A§L @4í@ Ï€ ¬€MÀéò WðJ ¥@vë þ»&pïàhƒãg ›`mP–@ Jt~ƒ ^Ø“° š° x`‰ †q ‰–€v` šÀƒã7 q`š@‰m°ŠšP¶”ЊJ @gކ øƒ«X}ëÆ–‰Ø‡k‰çgu° –Àƒ4 šp•° • ~»(ЍDŠà“`»Èì4~;h ©¸AuŒ”zšP ÔÈ„š¸D•˜}qPx`q 9æPL 4’ ØÀ F ?€ó#¹¦à »æŸqŒèh‘0“ÀŠšÐ»ŠQáŒ<“š0 ‘¨ š ‰óÈ’–0þ –È’š@ ûH •P ,Ù§ø’5Y‹0ÙŽ= “D ˜À Á”›@ ã×’¬X –K¨ºµJ‹¡›_¹´[{´C›¡=äŠZ›YË´e;­Ck¶L‹ P[ -;·®pG¦¶1c ¶êLÒê´‚[›j+®N+¶Æ¡¸¨Ù9­— ‘€´ƒ –vI›ƒ;¹ƒ°˜ ­FZ¸—ú³M‹¶¯»¥ƒj<Ã’ Ѝ Uû´[ʸŠÊ£ZÛ¸¶Û¸š€ Ö*WðA0·À;·z ?€\~ëhy`º°+¸Ê˼˜ÐºÆÙz 4‰ þ-<£}€¹O«2z¸Ì+¸- ¨Óꨠ“Ë»¾Y[§NKº…µ^Ú3_Ù¸˜P_— º—Û¾ãÀ"Ð+À-€ypÀy\À, ð=ü4£¼ü0IPñ·=³p¶ë ´«¥jœ,z€!ÐR*¬‰À£k«´n›;º¸¸›»Ö;zÐ()µÐµ†Ë¿l« ÃP Gº } ¸lK¹ÅÊ3 ¹›0Âá{¨î»¸˜‚÷x ð ë 0 ¼Ãë ••Á޶K DüÃU¼ —@d"€´B •z)Ð ÃàÁz¿Û+#Ð#`þ) !0 €§ÆI“Ð < »xܼ,Ù Öà Â`®›À[Åšà‹=Ó홻Š!à¹hÉ °n›ÅY€# ·_,¼\qºÌ3(° œ0 ŠŠà Ö` ¬ Â0ÌÃpǦÜÁ ¬ ගР™½ŽÆÃÌѬ´‰\É€à ½À,0lèh!À’œ̧ŒÃP œ ËšÀ š@ ÖÍœðð˜ÐžöLÌÀì i¼ ÅÜ;ŠÐŒÈœÀ Âà ÎÁÄüœ‚ÌÎÅ@ÉQ+ “<ÌÄ\ Ã`Í&GåÉ;À þ£ñl $GË-‹ ü &N‘‚"À ø\ Ñ-ÌœP Ö ÈÍÌ`ÏÍ` Å  ƒÐR8½` ÌPÉ ÑÃàç+ÀÑÀœÆšðËýšy@ÈÁÍlÜÊç‡õì Ì@Ð[ûÎP Í@“œÔ­ KÅÐ=ÉC½ fÍÒ,0ÍFmØ=ÐÅ€Å&·ÅÐ ÂPÔCíÑœ ]Ì ԓܪœõœÍÎÐ ÅPÔÀ¼€·0ÆY ¡  “Ì ÌØ] ÕØ³=×Í@ Im ÇÐròJ$° n­ÔÙ,ÛC½Ò—, ÛCŒ×“þŒÆ! ýÖ}̉ ‰,ðËÕÛο0Ét] £ÍÓC½7šv Ѳ Ì’ Ì@ýÝ”üÓøí |àh àhãm ·ßÅÙÆÐ €MÛ´í=³Ðàå+î=#£Ðß=“ n]ÜX̵ÐÁŒß“<ÐÔ€þ¹37Ðæƒ¹mÛ`Ì ž·zû {#IL` AŽÞ8þܽÐ:P@$à)øb¬iàÀüåß}æ%~âÅ æ“ü p^ê†àÒ® =£RMêÖ V>в=èÖ0 çG*~â”>É´À3È ÛB~ãR}ÛÖë<ó¸x<3Þªþ܈ÆÌ~àÉ@ L5îÖÄäÈÍêè £6mp×3ÛÞìÊŽåÉ Ê ê0q`à½^îæÛsŽÛ%ÞëÏ®nîWÎ µ P€3>@ Ýn @ sðÖÀàh:°ì·^ê †@þÞ·äYn ËðÒ¶àhˆ@Þ¥þÜÖÐñ4ÀìרÔp ˆ`Èðêæ>éÀíò± 1I’³ôó›L³@Þõ®ðÉ@íç§ï¾L®žó8>èZïô“^ïð ¿ðD9PåôX.ñôöȽ µÐÀ<0â ßë(¯Öpö`®ñÀ²/L4@ï¤Î É@sµ ÕÝn÷¥~ö_îô¥^ø èG ¶À1q4ò]oâÔÐÒY=Lô°)H¶=è¥_÷WnÛåÁ ì0î'àÁ<û£ŽöÖ` ßCñµðµíìÁ\ï©?ÛÀÐ30Þ¼_ú¬°ì R_üAþÏúÀýàeŽä¤üϯúÿ¾åœÚ“N3Ÿàh%pö¬_û#ÿ䔼%úŽÖôÿnâlÿü›?çÔPÜX°52l¼xѵ†­ýP’A‚cjôHscÇ…­ÀÙÓgÏgтںðŽÞQ¤I•*%G $k0oj´6KÀ +[¾­Ã‡/i;§%K9“cJ™R%F\ˆèâdekN¥+—ÇÅC c.”‰S¢_ƒÆZ¾…iáÂ^ŠôPÒ¢j­Y3vÀ1BQgN[ÓlCkþÉpõÓtРт|›·Ôµkva-XÖqóÂe¢xu½.ÉepËL¸wnL´)“ ¶ˆHïæ¹Å!Æ\fÙ¢"gÝ>þ¦µŠŽ iæ(¹Ú]£F€„±ÚÇ5N¤0NÃ|ñ/#! ˆiÓ„ŠF¨$^3p)J 8R‹ xK Ÿqøàø…<¹ »Ï³epŒe<óÎ3µ ²Æ-ÇxXæ9è:;q¡j¬ºŒdk dhï²H(¹özxq¢w¬i²¨ÀŸ|æ™Ò9ðJzô™À±B¤ëK²&ÈG)|ª€ 4ö€À‡¸4rè ínz“ •¬þsŒ†Èä´IOg!ò¢d¡¦A>q’¬–?/¢­©¬ñáGH# n–jÐÚ“ÏК J P‹¦ˆ$ÆÄÒ@|–¸Ó¸‰TŒ B¥ÒY`Æ~tàÈÌ2´/‚¨)$Ñ‹tˆ+N7¿ìˆšVx½ÎY%”P=kññGC¤¢Jú$µÖ1Hø¥TqMë,úÓ‘p0W.XgÔñùä² Êó!ktJB£N€Õ–#TdIf²½:›ì—CìüqCŽ™¬8ƒò¬Ôšed ×Úˆ %¢”¨–8d ±V‡N†ˆkSnÏB¶}˜Þ‰BÁÒ œR@[P‡Ý+Ó¹lþj9d–!º° ¥Ìa`¤P‹-#eÀùŘc¸6ƘExpÀØöˆ Y¼>fmc~1„ª½VHhyí¢‰>¦žµvxà…U6ü­«{0D–YdYÄHôLÓp¹Y¨Q$‡ç+ÁZøj°¦'Üâ¿À€|òiç„ÃcÿWöH8€ §}wÞç¾Ö›¯0[dXó+ßýÚ-\ç‰#~à‰¥ª­wì³×~{î —‚.` ù+˼vi×ôI&p¾œßº·ÿ~üóWóº·H"‹w´}X€¤0`”×`þØÙkðÁŽ'P R A D¢8Rí°†ƒ!®?VÓ"°0ÈíGRȆ­ºÑ ð[¤W¼ÐjzPñžWRG¤F ½¨D?űµ¤Maò¥0=:f2éÅ ^!t#üyÊÀˆ£"bãb%Ù¦w¸Ù b2g]æ’(z­—HË ¨B+÷ùR˜bé ÀIºŠýÂaÕpF1¢b–”`Pe [x: kÐBQbÆ/D DЩ>­Å[~±L7ʤÀxgpr4ÌBaCÖPF1*¥T‹l³0nôH1‚±Q:Œ=]*àÒ˜æU¯ù4þ•E"0×a(ÄÀˆ€è°€Y csu  ˆ„ £Θl1šÁ‘N µM#rÙb eÀ!Ád”±‰É*#›=°Fh•1ÕEÌpk†&”ñ‹9€pÆk“qB©1 ™­ÆdE‡'et¢S­E Xæ°Ó^6œR @Ät¢½eðºWðÞ³¸H²‰Np¢] Ž&ÌúÚ= °ÊÐÄ&8ÞMhbÊ ¬&šÁÓE œ†&´« a8VMÎpÆ0xË eÂ"Á°Æ0*± L¬ $n`­Ñƒ‹ì ½÷̓c Á6CDŒ¨F1ê» äö­pñþvZqôaPD$‘»dÔV<íEÄ^$ßS²!ÁT5Qß@GŠup 8 ]ç7v À8Q_õn èē͜ æˆ`"¸$:QfMøA'ˆ‘ßN°H03&æˆû8·IzÕ{€l¢eæ„€Ó3k"ÇÌC'òkæM c•Ö'Ô‹‰lá»I&5»ÈQX:¿0&@Õ.Ò‡Ko",ØD­k éáÒ>@¡kýäM â"y00¨-‚†]›9yøu}Ñœ?ìzRÃĪ;Z×·Hõª7ÑQ2{Õz¶È Ìè]c"ÒONÀþF]jxh¨.óªw! ^¤ÚÚ€®W}‰AêËÚ>²c c‹ÀÒõ6DP_ˆkÄ/‡$à ¤½‰ ¿®5¹ß¢îZ_°Žµ&ô0@Äþ¸°Eþq`ç|àÒ^»ãýó¤ˆÕ$×Äœ›…ò’¼ðx}ó@ ¸ú"ÑÆó²mçI;|á›Ðpp"ëF`ßùýò¥Õ}n`÷‰&zðöDâÅš±ê²Cüì»Î/&,‚z[\ð—þr'Pp/ 'þ@§.ïÖk­‡„å_‡ø¶=~_4ÜõUp €½í44ÃÖ¡µ­Mþ ²;ýs_5¦sîma_¹õ>x±Ù€KD<Ù|‡8'üÞåÙß÷ÍèUµÅSpÅ'ß5à( šýäN`‚)ЃÎ7‰~“üÞïà¾ÔYèNÜÖõ¸Eüíô‹ ÁñhHÀ¯¿Œ‰@üaƒ¸Ä%0qÿúâzÁø“ fM躵£¼Uëƒ?ú³?LˆL¸GøG;÷˯@È:PHC¯ãS>DŠy»2›@m?‹ 9]{±< v0 ¤»ˆÒ3°P­Ó„@ óû¶‹è?’c¿À¹ë€BD+€È-Àk¹@8c³±«  A58¼ˆÕKD+¾` »4úÐA²ë;„!|»i·NÓ;L˜ÁAH€Æ¸;[ÃCÇ Cm[D-Z­Ä£DÅK‡j™¼ÞAM¸?HÀ¸’@ÆMH¨rh‚„’3p=MXÄ@Ä{¶@ÄÖƒ„„ˆ+? 8|$€u³´m·Öþcv´5Nˆ2\Ì/˘|L‚锳4h?ÑS»OP€’`Æ_%hº%>ë´ZÄ €ê¢|»UËDö Âà€ÜÓ„IP¯'œC²³¯½ 4M¨„uóÉMÐè?‹ëEH‚$ ê›„ 68¿/„°°Ã'›èK¶»´K¨»$P‚ °„J˜„’äC` ´PW›G²¼Æ°ŸûȽZ©‹6šdÊ3¸Œ&8ÇøºüªI˜„9ƒ1`I¨ƒ8˜7È/@ô;°ƒ:À¦´¯JL`S;µÓ1€Ó‹`Óö*1ÐP_’ `ƒQ}7°Ó7%P5ÖL=Òí€ @ J-5|°Dè6P8ƒP× ¯Ë0ƒQýN8Mê‰CÇ Wgeƒ.HÒvÝ€V€ xà( (WÂþƒ.耺*íÕW1ð€°M¸}ý‚~ý‚(`>ZÜø6ÐÓ6`ƒ/ð€$ý„.­Ö—z‡ö0,  ¥hš*Ù’ÀvðŠvÈNZ””` YÙH¹W’°€oÙ‹˜¸d‡…m€K|ðÔH ¸ hu@Y‘%5|ÀÙ‹ +Hx0u(ZlI/Ÿ”Æxª À¥|J‡Š—õ -‰x}`ÇH‚7Ì'vH‚§ OuàkÅÈk ³Zx»Ô¹íÒ-àZÕù4=ŠtXÉ’¨+P‡uø†(XI¥V¤È‡oH-²ˆo¬¤ ¹±Z¤ð¼©i‚Å͇pì\©QÌ= wá\µ‡\˜z‡Í˜¡}]Ris¨‚¨Û]¬H‡wÈZ×x‡ph‚ àÝ&‡‚]|xuH(ú.¯Pr¨‚&H‚£ ‡u™rˆ:¡]¨UZ:²¥(¢-èÞ&x‚O_ç¡í­‚$8 ˜€ 8%hãõ]Û•Z|Ї® `ô)àÖ§ô!`¾'µ)j`2éÒÙfàU ` Þ`î`þ`Þ«€;pygame-1.9.1release/docs/pygame_logo.gif0000644000175000017500000006103407344245107020176 0ustar vincentvincentGIF89a¤È÷   '6&"7 9#"/!#>1''$&'7,23,1-7557&(&'.1,2+,431.)46*686:>A L pk$-M 8C+;A;.n9DE6NU=SW>Va^D:B=@>7j @?@IEIFDZ UJQJPOTOWMYTYWEE)CE9KR#MP9PJ)Qn gYf[idhecz a}vhvj{r{sFHENNPKRLEWYRODRTKVYWE[aWdLZb[LbgYffWmrZta]rv`^[ef[kt[giggnqkrliutqnkrumvxvj}€z€Ž¯·-9Š7‘"6¨:«#Ü á è 4Ü>Ø$&å4ç!H’C–!K­Mµ!m’y¨z‚z~”wXÃXÏ$Që%qÌbÙ%iî(n„ƒy††‘‹‰& ™1&² º!®1+ƒ^nˆv‡z“|«I7ZLŠo_…|u­RK®nX¦rjÅÌ)É2*×oÇRJÅ`TÄpa І™„–ˆž“„/‰³¥Œ «‘¦—´™±ž·¦¹°"‚‚{…“w­‚y—È•èô"¥Ö¾ú¼û Ó>׸ɺ"â¾Ĉ\ØÅØÉ%ÀûÁü íÌðÝ&øàôá*úìOûñl†‰‡ƒ‹’‹Š•”–“”Š–˜–”Ÿ¡›¡œ›££ž²±©Š„®’†£™¹“‰²–˜¢ž ¢£¹¨•§©¨¨­°¬±­«³²°®¬±±­½½½­¼À¾¾À¼Á½¼ÅÄ»ËнÐÇ»ÐÓÉžšÄ¬›Âª¨Á¾¾À¾ÀÀÀ¾ýöýù±ÁÁÁÇÎÐÊÑÌÊÓÕÑÔÎÓØÖØÝâÞàÚÚáâáßãûùÐýýý!ùô,¤Èþé H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`Á‰JÙRª|93 ¬Û·pãÊ-:N•ra‰‰‘7.XFÜÜÈ+^ìñ™ˆ çžN½ºõ‰Ü,øP]9øpdÃþÅÚ@@ôˆàÄa‚b@4ʰ¿N¿¾ýÛÜR æn,X¬S”¬òJ,½^0Ih DÞDóGÄ`Ã6È ÃT!K4áÜçᇠÂNHðŒ)2t…_XÁB 6´ÂÚp¦pð‡ MsøP +©UL0½´òDP7!6éä“Q‘ñCÝÁrChP“O?ÿôƒÏ7e,p„õ²AV,H=ôØã3ĉ+ÀX\xÅ=‘ÁÐ@é矀þ¤Ì °¨L!˜AÏ?Œ6Ú(8UØˬ ±Á U€ÉYT1C^ªPÙ]xÃõ"ÉRx説¶Ú’þL¬fÄbpéè­ÿ Sƒd gŒ/¯0GÈÀÀ9˜"*1w¶Þ1Ï:‹L1Hh@›®f«í¶yó‡ TÓ éàjî?ùH‘„kÈ€W pÞc ³Ü1›Y2X€HËŒÐÎ32°l &·'¬0BhH Š«tà͹çRÂ+­%“ŒkW/1ÀÀ’*|ˆ4Ìd1OôB2òȃŒ)<³ðÍ8oË 6¨ÖKËPL±7°–Ì<27/°ØÂåØÚè=ÔL±A+Âù3p äìõ×~‘C¸?Ô µÐ·Ú#Á)ÐÊ3ÏÆ®-Í]Á_lsö­ù”þÖÎÊ ‹ ƒ-øàô‰Éj”6ŬÛ6ÜÄUæÈG„ÎݸÒ½&3mUCøè¤ßf†“ãD ö,~.2mkr[Vù¢®ÛDƒ× Ê”.üðŠ#+ªƒ2˜»þ9¬Bê1üQÂ7Î3ê WLg/þønqÃo­h€Oö¸ö3ƒ Ós× ʰß%=ôÚ)aïÿÿXB¬,sŒ&T¡yÙ³Ʊßä û°ßóöV*"l€Ì`S”±W°Ë“à­— §vJî$œPÑР gH”,<Œ€? ‡ LJiþv2B¸¸eX <¡ä@–hìðô,Ê„%:ñŒhTÉ8¬ bLî­Â=¾¨½,zO5¦˜í×(4AÁ¸ªÒHÈB–„7ð ŽaŠ)䃎ÿ‡h™&ÔŠŽ[»Œ¡&ò“ Üˆ80P Õø"8”°‚> 9ŽjQr=¨Õ`€ºæÒ¥.w90ô`r£’„*!¹ èO^–á&FGi {®IB yIÍj"d{È3%kùH:¢ÇT ,f€H~ÐlÍÂgÍv¶3NøXpZ¡‚z8¯ûþØ’£ô#0z–qEVIÇp€o·üƒ;ÊKfÈr›Áªè:zœÁ U`Æ é‘J„G5¯°Wƒ§ ``¨J?É Ä“;SüöЎন?¥ŒØ}Ô2! ›a€1 'X©RÓ† P ˜Ä8F1d K¡}7½i¤Á(ü€T B7¿X† ˜c7 ÍR×*Ãí©Â7p%à1’…‘î£Y½iÎðpXÀ¨¾ò1V…nŽƒSjðÆHo…1…§R`«d3ˆPfrqmM+,0Vsõà y@Ôð1Øà˜*ë"I‚à"`þæâöA‚UÀ(ãdwK>Üp‹ü‘j Ð0Rq€ «P>¼ñ[ÆM~ G?TZØsqßèj[Ó)ˆŽ·à%]4d$`^–YÜUÁN)Ö4`ø@ÐİÔ¢0y˜>:Ú€ÃuÊ`À?]C ('¼›~p^àn±5½Ð€…Öh áãèG8DàQá<«vÄ *>Ð_Ù - 9˜žx(¸»xa#(¥e0«×4ὕ>êAp4h ˆ€’@ä$Pâ‚/Û„/Ü ÕmMEÎáÃx±–ÆÜB—ÆQmM0z`…96ªùð†þ2¬ ¼pà=ðö ' Á1 làƒQH†U䯲ŠY,®eøÁv] |wËvÕÎ÷17Öø52(ó?ðñŒ/°9xÂ$XáŠ^Ôi^ð2 ‹™X¢ 9¸P 0}Œƒ V@Ã4û¼ TÅÒŒ´°Ye…íl1®’Sµpzqƒ@ahÂ*xQ'zÝiÀxR,LÑ Œ  àØ¯ÿ±(ô€5Ø&0†Íî?E PµôãÕšWhÀD/~£lû›8½x D°zðz¬¿_Q…v;ÜIP8Ü—¼ì#DఆܘîŸð>8þd‘cG1äÀ©‚1p<üåŠx¥/ÝšXDhôêº=Îó?AAˆæ¶Ñ&ô\ªB˜&Ì—^ra€3–·/fT IPÀ Ë’ª÷ŽÎu]à :ì’=Ôð' ˜êáI‚˜Îvê@!æåÎŒL'ð`g'UÇ=>žØ +#ÅÞIõ„,´ýð·©ÂÊuÊ@Xà’[¿9Æu½{ü2ÁDƒ?Vþ’øâG?eH qÕ1zàTîlò¯ßùç= $ €W³‡cHÏ{Ða¿5¥ªcJ¸>÷°'ÎàÙ5­'ÄÀË׺´^ÙÞ[1ãA"þæcØê•É}ôyž $ƒà×5‹`ãúð—‹2 `€IÔ«M @Ö‘¿õ¼ûƒù¦rÿÄò ±@ß ø"o–æ ¼ =Cs–—üç=èÈ À6þ6#(±@ ˜‚_A7e@%® '¿qvÁà ÀÐ ¾ Ån;8=§bÅP~2“>åqò`~­€‚†Ä&LH<¦‚­2 `1PcS“ ^¦z¾Â ¼à _†` ØÄq ó`~ÁpNðoÅ€ þàÇðPð„NÄ VP30|؇5`ï…2[`|QþàA“p…–!{ïB ÷å ø…_H†>8~Ó3àa õõoi(Åà»÷ä > f5Њ®øŠ°èŠàlQ Óà ã`F(‘‹á° ÜÀ ÔãÐ!'!hàZÊx#`3‚Hä0Ñ÷áW>à P0 «à[‰¯wG’H‰ö¥wÁ€À ƒG r–w„2 @,‘Ô!€PX¥Œþø¡pQ  Û%ÑÀp® ‘¯Õf°€#V€éR>‘‹Þà Ï  h€ hp’h Ñ€‹Äó #©þ Ï6`¯È‡b° ¸HŒ;!Þ Þ“A9’ß Ñ¡‹%ñ®à @6À9À óâx'tBKCŽ#(f¨dJFm8=2à8x‡æGÐb$A’dPÙ–n̨ٖ Ï V `0oyScpA1bŒ)ÿ<²@bn9‘9‰¾ Ïð˜é˜ù Ñ ÛðhSá Ì *y‰\À’˜)ÓP’cðž)Z8¥WYEc —-ycˆKi€o~ã©›º]œU€á _ÐÂYUýMã×ÊÞ­‰¾¡ 6åžœÈcjŸË(ó1”;ÕZn¦\®W gã°ßfÝæúš¨¹ÛŽþϠ̀ûPá®÷@èŸÝ Z y§–•nX•g8~Ip›³í F`Ë@ãã÷jçv>üšWpµFØÒÖÜP üíÛŸÖ &ä@çF ë ¾Ü|êå A„ì†[º¹Î­²~r<&¨ñ‰ê`[¨‹:LÍP àÍðºçæ.ìöôIÜ0à¬ä€g Ò½î~ëe @û 2 ¬eˆm½àV0²Í L¢GRàÂÖ~績ܪ¼­‹ÝIÎ7¥G qÜyÅæÚ­¿àccªðíÓ|ÂßþÑÁ.̽ oçàmä­ÊÐÚ›å][äzõ8,ÕÚ-ãÄΧ ÔA -¼ä"×ÿÝÈÇ^hÐpœÝÙ~ô èÐ:Ä j¦pLËç›]aÇñÔPÛp6À `.¾™ã+ßµoŸë-ÏßDžU«žáØ¡EóýæßœäJ^ôªÜòðòAÇl»Ñ‚¯¯Ä]òÁμýÉÞ<ÙË÷4.뀖9RÔ‡½øÜjó¢¥íôÀ |Òôù€øpõPáüÐå °(ù #ÀÐ2r‰xÄ®±  Rð úÐ÷ P†ßcãžþ¯å‹òëUáÝ¢»ð\ Ç›àþüxœW‹ÛPÔ…ÛÛ௯úK±¡ è _Õ ˜‚Os·!ô Ïìé/Ä ÀÐ#XÐÞ—ûò-dˆß={÷îåK× ‘èý‡ÀË+ $uì2c&Uš,¶ReË•0]Î v$‚‡/´¤!§¯Ü”ÄŒ+XÔèQ¤I©Aд© 9säL:UªTªYµnåÚÕëW°Z85ìYªsL8‘”^3(È:e“í]9læ’]³õjU¼h±b ,G€Ógné);07A_À‘ÿ-\9«^§À)>ЦqSþf½¶»uÍá½øµ\¸Ùœ Në@¶k«’[ÎJzêZ§¬+êmÄ…ùð-th¯^=|õî¡ñb€€õú!Ñ… ¢CRDØÑ*ØLôéÕ¯ ÖH/®Ìñ"ÑD5:L“Ýi´ärJ­ ¯¿|³KÁuKA6P ®[›c¬¦ HŠ¶ÔšZƒŽÒ¸J0·°Hmµ)«êÀ¯F¬Á³æx­)2Ü#€¹L`ÃÀÉJsqE#0àš2Ã?zЀ¯sS‘«5:4Ç {²79Ll*1d3Î6ÜX¼êJË3J§è² 2BgŸåZÎ:Ÿþ“®ŠF8 Š…‚Hf‘æ)¬3`Iz F¦™]ï¥`PŠg¶ð`>LëCdŸ²@IP•A`¯)±äqHM]°G«æ HGDU:fL «¬R˘AŠšÚ:,‹Å‰=ðU9М‹BS%ñÊ\ËôªHÍŽGŒ¹ØËTÅÔ2W‹…•µ1µÒ€¢éï²ø°[nÅ¥²H¾TŒÕApÃ7/²öãL0ETU0 ÉåÖÛ¨N#Ë ‚Æå”S®9{Š.Ÿ°)ö §ƒrúÑ¢j¤I„ > €x0%–EOz”¦XZIB†k— qs¶J*a¤22C R*6L¼íE|WÍ-¦ØÆZ¦„àëxuÅúÁ¼$lª„YÝWV©Éô–ØÞ nŒ¢FŠv¿ö-ë&Ÿ…»m1kJÙÔpÚÝff•5z¸•q­¥ŽáßÈ’‚¨¤¬¸B°õžZÈ]%»)¶ç7á„sâ:陯›pèy€‚’"4XÈgä‰(Ç¢2°`…°À†#$1åE=Oû`‚饗WLI¢‡ pŠŠðñ`  ¯ð¢™¡çCD}ÿfiÅ” 6ÛÃá~Òî‚]î¼àÕ¤òšR¥®YþvsU‘°£¨Am ÙêTÅ7©¥]`“¼Z·À­µ­`]ƒº €ÕËmœsV¾¾%¶|Ù‹D3jJbÜòŒ 8%|Cؽ"ƒ¡¹P€Tû ƒÎUåFNÑâ$-VAñ`•ÒëP+D#ô€“œšC{ ¢ Y(À=` ûˆBò1ˆÀ1&;  (@¨g½U²­¤$šÐƒ˜o.ÐÐ?èÑ5 í^@ÄÐÚWŽ|ðƒËÀ_Ršñ)EMk=,b)X¥‚¹ÈX­ÒKS©8 b…@ÔQ¢‘à B¥n+ªÚÀã8w­òm¯þT¥åLU®¨X-7 €2 â0²$jSLQ w·'â*-b²bl’¢$Ûð°ƒnà ›²-žò…Ÿ‹bZ(ˆ£(䃞&JJñ•û¬Ü0geE|ñèb>*æ{€ðЈ )YÀ¾P tH„Nч:ÐQ eÌ g(¸°+ Ap€@ÂÀPzôãxŸ|ê#úp!ÿ8D-;ikšé$'1[ÕÎꪘT”jn6GÍ©"3*Vô•Qj0Á¡›°LfS§‚³Ѓe=U1Ë.RâM–4dAЀ£¦<&j1þ׸˜ºB¹N5ŠEJRÆ€KÍQè”LkTè °Õôooíô+ ÝFÜ­ cpš‡@äÂ!¾ªð W'‹¿ý­-Ì™Ø=ÀÈ x`³Á‚%nt"°B9îQuHŽù¨ÇG§! iPCÍ`Æq†1l! W°Â :„€L×$È©2 @ƒgx¡}˜šO ÒàQ+ â¨EÁV‡®JÕmZ–²‹ìh£(é@ƃ§íÍU”ÕÞe`%K©*Ì^FeFÌÂ[))[U¾lJ2 \ À•Cf_'ËÏ»•*d‰ÂQþÐY¬¡´ Û/„y¹†(v€f}ðþÔiE£FãsaÛ‡…¹Ï]žÊšþl•²8¦9è°G4ðÛvà!°@Sΰ…'{àÒXp…»á"ï]öh9¼áå&â‡H `wÅ€Ï@‡4¼ðä4 0à„6¤?òbÊú@DÖkWµ¡ÈMýqÿ@<Ö}uøÑ¨ä'€Xb[8¬{•¯£'« ã3›èT'{Pc¡8@X°ÒÃdL·`oÓQçü–ÞéȨpÃ,Ü7òà>}AÄñpúI£ Õ©Ç4(ÀˆF¸# ã ô \þ@\¨a½d˜ dXŽëd‡xu¼D6h×®íQ pÊ*RØ5s„Zå¾ä U ècq=—ÚzÜbü>µùÑÔæÎ§VÔ5ømAÎM­œâ‚˜n/%À'ÜÅ®êu†ýÑRG¥0i`31ŸÕ$>¿…ý_me ‡Ýïîij‡p@„2°”H€%`€‚t¸u@é@‡eh((‡z³{+‡t³uà‡e¨+°gXF`G ‡p8 ø€zÈ …l˜¼+8©+˜‚úð.pr°)À:üéˆÖµÎq´ö£¿h±½cC•Ó¶×S0§ß>1þ&Þ€=й#Ì=ªH-°z¾kŠ*Ò¢¹Ð¯WaNËj’=Ï‘wze§yº§BB,ŒÂ¯»5'Œ°Öy§½Ð°ÄqCeÒ'¶{:õ#h¸» Ä;u¨‡s ‡hø ·•˜`f@Dj˜‚èA€@„zˆÀ1“†2`,@E}HƒŸ:lXN¨EN…mX°°ÐDx)àh¸†k€†4p-X.-†|ð”£R°"¾äÓ—'Ô&}‘´7ì:žKÔY¨B+T€Ïʵêã 6¶ô«:(« óÓF)Lkô '2B;,"õS¿s­k ä[=þ¤•7´ è¡lËGÔ‘›li»áKBƒäC‚ô¬0Pƒsø?&‹z@t ‡?° x€e8‡ÞA({`²sЂ豀ИoxŽt +x©èiáª8ùhZ`[äFÀ„DH@(½1à†nOðü-ð‚Ñ[†|ƒ28ª´Q›ò+>k;6:XGS¹):øq ìóBp±½_B ³A o°BÕØ«¿º¶1¤k" Q%¬p6M6¸2]12§H€°s¸Âš®4µL°[!«ÈœÔ«H³=¿”Œ¨ÉLdcËCìÃÜ=¥êÊø¢¿î›½IÛ9þBL9À):™Àâ²u˜M0 é)·Œy7ƒM:¡| †è8€hHJƒ†z€K|€ƒû- ‘eøÉ TL8£„-xNjPJOp.(AH„|(ƒ#¦ë5Œ¥©°G©›68 … Äǘ¢^ªÆµº>j:—/ Ž£ˆ?3Q“"'×ÃGfcGÓ0õ›?«0L„ÏA$¢ÒØÌ{D0(”ƒ š6ɤ½uB%Î5l|;eZ5]ü˜‡d ®É‹q$;< Ñðhð¿:9‡F¤0ˆ) ð€€.8ŽLç`2$}€=oÐÑâBЭ þˆ{0ÒzÀ¸‹K„h E[lk˜ 8€/x€ÉzÈ„FJNØ„¼‚@„{H+ P‰°:Èd‘Š ˜>°Ò–µ6µJÌÑϬx¿P£à“¦=ÝPö#­iú Y"- £Ký"M›» @œ›Ìä+¾B?|Oª`Ue¶¸cÕ Q›‘“Ñ.L¹=¤¶‡Ci|3t YkC¨kU·±H€P;SÅ=¸k@ƒêMÙÜQ{À€I|€hèÈtØÈÞô¨zÐh@Æ£‡zP†x€—õ:¼çØòôp¨ ä„F…q˜Ã(þè?| ‡J`SNЄœ‚X†z(ƒáÀ3TO¥Œ?ÅЩ¡LMÓ+/lÂì3Ç”*v4‚øàÛÂä‘qÜ>_½U­™%ºU!ÒÏú c3MVé˼ØB¹ ”½jM¥â0»KÕÄÔh)«ªSP{¬½x¯RMO1ú 6w„H&ÔZù€‹#:ÑQ{àZzàh 9TuØÖ×4ªÆÛÖx+(€Hƒû!Wzˆ-؉ñD„mØK°vð3-¡9Ø5 Jm(ƒ€Óf ‡,Ø‚NÚJa!?U‹>ÅÔŠò£Š9Aôº´d±£=T~Ù‹þ3Сœ=H€Úš#²–Í+SB?©Oq\1Ù²§Ý6A% B]5·´¦ÕxŒ°Î|=ñT\­*ÐdÇRqÚQC•­ ÃÖ5ºc Z¨[L68€3ðÍ œÍxø?õ½»ŒêMµ}¸t@Û³¥‡Gü¨uèH02×zȇªLƒ‹S†oðn@„+p+¹è†ÿs/JGØ.h)`j (ƒNZÏÔ°\èóS” ãõ\ƒ,^'±Qý‹5ÌŠ5^às—b“L¼C•¬è]P¹÷òËL­1:ÐÝbKLÅ´Ç^GvŒº@&„ÍWMêUB£þQíuÈšcÞ§zá·+–Ñ 3ü\­â¹>ÄŠ] 0œgñ–.áml€ÖÙ¼;®]_„ÊÈx ß¯%Ùd߇{Žu¸c•´‡Ô ™L™ЂhMˆø„]p»‡KP„\khÓs‡s òÅÖ%­­!Y¾1ôÓ0nY]¢=Q®½Ê²Ëd“X–Ú–ÕYXe£M¶UúŸÁx+v, õÜKMµÌtLS^ÚIU§ZLÀ«^mK_î\źei—QâFá.¿™W–+¬ÎÞ¾lVå(aµqÝ/&Ur–ƒôÚxhÄxÀQ°þ­c°†h¨`ŠéMO„ã7¶od`,`p)h†nЄN˜¨Å_øWzfÀY †f@h…¶i˜ëp C‘ëÊt’¡Åd¥Ú]Ú%CûÊÏË´¦±œÚ¹È9Ñp1eFb4n0e‘öÔ•vPÔPu¦Ê$.—ÏêéWbƒScYs«!¥fÚÕYe·Éf¶Úe¶ŠÞ #§w"P”î¯ý|1šÌK%ÕZÆš5,‡¯]_ߤ믆,´‚e¨à~c0B<ÀvŽr(ÈA`$d…nQèNP„G¨EM¸g;>i@„„¾ä?¨‡304üù½\šjþXÉ\bã]> •Þ‹6„;Ðé'†çvª“mR~OQÕ5ð9 +º8KU]¾;¸ƒ_%íø¼KÇÂiû£ŒföÜ6è¯ìíé©ÞT²fíÈÓ¦îfé…0¦ªOºaêƒ+{É\kå¤j^“#Æ&Q毨8L±oñ–•ëöÙÔN¬¾L1Á¹ƒ‹´‡ôýZ|þ×»‡1‚'P…Vˆ„ @°5ØŒ8±»ºðü¥ðz †8ld…N„PpìNplN¨„pnð8MhLÞj(‡!P=üAs<ØÓ’K&:ÀîýnUÂ(ç´sík]µò<%ÙcºÜqnf7(òAÐák›ƒàžT¨"aŸæÃ=iÚnórZÁ2æé–vsºïà[ï˜Ör£°føg÷uc‚‚è_ RSˆ„›‘1PyâŒmEÃ>ì¾äD G`ÓL¸°20X'š)Hu@ƒ8ªöš <„ù&ï-ǃA0„=Wf&÷Ó7t²ÈsCèqÓösk ù|¯ ²€@ƒ^û?°Åo‚#èR'õQ'_ð^(…¨ °€(*4@ƒ?øzeP†?8Ét¨.ððBÖ‚)(n°†F¨WO°†oØÅÎl…ŽÓp@øƒ£ú‚‡v1‡+t×󉟕GùA óÚÅv”‡•/rȇ|<’q‡ü&Góq¡ƒÈ/rywwþpqöqnq‘òaòoÇýËwªÁxüÓ??•w§¨`‘Õ´xöɬ¬`rÑ_‘A0„Ö^wrröØù»ŠÁoòìçÁ7„8pŒÊ×sÑ/k××óp,?„g¯üá/­;0r^ü趯\>—ø ¥€' Ç¿|¹zꕹê7­f1‘è»PE|öìá£W^ ¯ˆ1ôŘÇÁbQ²Aàˆ‘£¬rô¾MyqÅEšfˆ\4 §iQ£Pô¢MqQÓN›-ºÐ£§fDÏ B‡¥å#Ò¤Ü2„GÎ9P£BÔô*ž9Z¡Þ±zÕjþ¥bÇŠÕsõT©Qçx5ÔÖ+ž;tîàiÚëÚ´Zë^ÅJG/`ª{ûÚÍ+˜­!´jùº¬VNWƒ²®5,•Î]·t´^Ë·ÄG4=AMz¢ðÖÊxž®½c÷oe6ľ±{gk`½œé6EQú·Øl"KÎúXoæA:ÜtóãÔr¦l9*qÂnŸ>v=h÷]ÐHÙp<Orã×ç`$@lÝÑ©º&|;ðñÀ÷c,ñ·*Zë±w]ƒ rv'|Ô 0 …2ÜuŽ7#<†cL1ÅCÌ1ÇL/±´òʉ­¬òD«¼Ò„ ƒN3/LÑBJ‰´0þ…ÓL 6e””N7mÑÌ=ÒxðMQMÅ~L¹¥˜nÔYEW™b‡üñ^€Õ÷–vdºe×”ºÍÁ˜Wp]WerS^×&sÝõÝœhö…¥eÙÙ”u†1¶ÂG@ùÄŸYM˜d€Êe%‚RÉ&VsvMVÙTjaf§ zÉßÚ}uŸtĵåR+|Õ×døAÅfuÒy¶*­xNÅ—É͆T TÝZæžœÍg• ”é›­µù•uiÝaGXŸ–&À»¥˜Z:™!o|4ÔTa…”ÛÁt0ÀB1Äaˆñ/½òŠ8ïˆO¤ :ô¤QÓZh‘ÓWþ|‘9]1M=ÒHa†“UC”£¾:oÚ‘jåU|ìZ€fXQÃÒb$€ g~—)bZŠêòWᵬ¨ŠQµ]uݹçkÁÌê}ȉj`Y²ªk•µRbÐãÀ-ðV^U ýƒ²«R‰bEåjq%ç›ÉÀàÜW¸qæ²~€‰¶SoÆùU`Þ]lõÝÝÓI%Уzëi_tRÙ퀪a—ueR‰X!%p]öÉLMöVϯ¾,RÓSψ`C 6ÜP®4¼óÖû:ìÈÈ~Œ) 1:‰œ”p‘D"ŒSüF#‚áH,ñ3ër›QÑ14ßþÕ0T4Ptäe)_ÝTÐÓ|•p;•-ô*×itùxkågù“m†1ù¶_kíÛÅh£F‹b<X%¨½]­ûKо·-yE¨¢p´g¦ÄÆO^ñÖÉ´78‹1jfeÒ;H@ÉpK[’!”Rà È0ÏR™LSVð6¼X¦q&tËdÐÓ>”`”kÀ ,Í OO.SÀG²+ ªp+JƒDä!®ƒ때yÌŸÁ¤rL£ 7âÝMnÒ`áà ‡2 4ŽãI,û©Mú$³3µÅc1õHßÓpmCÜœªnx5Z‘І›þ[Uü6¨È\åñ@ÑÑÛ÷€†œ»¼áz^BÆœ³ ºå€IAígˆbAPyW“JZ`u•¾@’Ä[¦ä@Ê$€–œ b†ø3myÅ”Yt8Â6-jVMCøªKìˆO‘ÚÜP‚¼g6Þ¬e-Ѐäa ldõä)Œ@Bô@"à UDqxHDì•Ez]ñÈðÇ?’q R€ 8D9ÊA2t »ë]N´ yà Yx×ýäá–ŒäÔ0ˆ`M:Š+é¤ÌQÞí,Mß0÷6·CÞðg;ÃJ¦÷HÛ°Ç‘äøe¦ó+þ‹RY««¸¡•üAA ñ>©Œ2Z ð^_e5íØád¾Ô &ašGA µ’sÌtÀ÷²fu‘¢âö ×¹úÒ­Ei·HŠQzŒã``¥‰Õ1$‹ýܧ<ü!cĸÀ¼`¼‘Tƒ‰ ¼PÍ&‚ÕP‡=š!2x#£Çûpðx·˜ÚÔ‡9C“ÈQ2àñ®Œ”ŒTëÑ›¶µ·x% oGµ¾LŠzœœX %ÛZ“0G‹V ˜  ÑJÀ‡‚¬(P€k[Y©[J†h{`"GˆÍ9ç§ „u~»Ó¶ü4)Wí-ÑÓBfeL’!Å/þ€=ж»Ð{ÅG P À²ÂTtˆ ËOØÍ‹‹Èè"àƒ, `˜Æd‡r¡„¡,p§i#F¸²¸;íËQà¤,§· °]0^[“µ8–ïÕ"YÍtz¥qpÀ{âM龯|\ç´p7Ä¡Ê+8A¼‰‚8¢¶„)„ â€ä~jÇA>çU¸Ü—¨¿Úrs(‰U¿y, På˦ªSò·¤T¥|ÆJŽ(£'&À$Ì„ À‚°û|4½ä!dÄ"@B$˜° X`hPF" ÁŒQ— PBƒ PÚKl¨ýÍrùÌH>xÒ MzÆoþ°šÒ™V‚€øðbõ¹×N–µY‹NAðAoxÔÚ\“íS“Ûro aݲÙ†@á Ü—\ä#鵫o`ça{Ï;½1‰ëb"÷Ú- øH¡?@‚Áª°2DŒÃN˜Â¯CÆ1Z±yú¼à+˜ƒØ A¢ )Lá¬Î(9¢œXϔݬz®ç†2Ù–Ùwñã¹Ì\e£›×6wy½½Mì«T[Z@A j.*= ùSÂn[½l»å¹µ<úÎÅw—A+ÅÌxºñ+sœßxÎGUƒ¡÷³P» E‚ŸBhøÃyþáð¸Çá8ÈÇSìêw=ç}ÙÚG ¢D£dYzßÑ<´¾½÷êsæú´uz{ÛÏ}7!”? u>óaÌû¹oäÓÉ4¦ò5`Õ·žÇ8x2)6÷ãµ>s«Àú‘EO잀ý·’ÏzüuÅ—l@Œ‡Ï]î¼pÅ÷¼‹ƒå¥‰5Óg9¹€=(ʸ>ä¯òSBxëµ§üäå—}—¼­(ô’výîö­Àéöõòü CV”ñ83… 3œÛ¼AO}%…¢ßú%` ÉZ[¬ôD=„@ØÙ±‚*Ä@4š†¬Ú…H0ALÂÜ Ü•‚þHÀô}œ7XY`_왜!èr”–ÅêÜ:€´MR²%àåáÂ`fÞ´t[[Éœxžö ÙA$þ%¡¨P’9!޵MRèÍ¡~!~Ä >ŒÄ€ï1X$Ø€ ¨0<¼è“ñaÑ*l€¸‚ÑàÃØZ ¦8pä æ‘%@‹‰!z”5"V^$þà$–ÏûåšüEb ¸7•ÀæéÜÿYŸ  ~ÄëIÞ-ÇXd¢žû) €ýÔ ˆÃçŒd@²ÂÀ ¤8À„.ùR$æoù¤ÀÁÞ/íïïrnS(ëàØ-¬S¬-þþÊšéÂl õëí–°›ð[éfr­­lÖñ~ðCn K‹èbD “EGt€PÃUŽń൲/`¥*TúÀœïüEýÇ §“§ä-È.päÖ‚ B ÄÕ¬€ºñÇ ÿÆ‹!Ë-Ô=1í¬×bÄ$/ ÷Åû­®;ñòêÂ-ˆpúxo$¢i]•L‹7ïò¦“;!“ÅÔ€2\e4”L,˜_+Ÿ:ßÜA$ %1QptTWpäÂæ"–F¬nǸÁF2#²±Îªp8€xÙ¸îoþNìû'ìXêÀÙ4®Z ¬.üò0Ð1~éØãW!¨°þðÚ¨íN®‹ê/æ²)Góo@“˜F¬/’¶/sÂÝÈ2é(‘%ÅðŸÕ±ïê¦çÁòÓžp _Åó*E0 œí9v™ ¤-˜í3\5›`Á¬@ xo[ì»Ú°X¬ñéšóÐzJ°Ò.€Å±Ôþ²Eë~aé=.Óå'Y¸gúôïXàfë†0²Í°4K3(ƒV€#?òÇ.cCÎÝtŠ…³PŒó òroÝB0ÿ2ô-Gç.'Ëp G4Û2!'R;´uSÌ3/USuà• CûëEo.#ìSãWIw²¸úôE s[•Œ5Ÿµ30@§Jqòþ4EstSS4\§´;ƒ™IÀÿä@µÂ4Ù%éwÊ+DÀàtQTÁSXÀêÂO[4T{#ëýn–'¦t¥Ü‚cÃ0˜´¯~qã5„q_”5F†‚0lQÕ5<Ï5<†c›vX7E¼3cK­f_)8¡T“E'ï\o¶Yó§hSÎ{„¥ Yñ> !ôÁF^„À4È.ç†Î4“À 6Q0Ñ~ÜgS7 k¶iŸvPÓµXŸnÇ|r­âåWk‡R— ÂófG­}ÓñÌ^i é€!Ø‚ø¸Ž5@€v™µ¬ik³â• uùsg²V_ôc×®vþÐ*xî¾òîÖq0ó·IM¢vÔ0ÿAuÿ²S¿ö&snƒãnÌFøU(8%w8@ôx €ø7ÄB¬¨X4.ôœúvLnÜåÀ@wÅnsv0ƒ¸Ì–7‰;nn·,y«5yKø*%4G€*øô•ó4 B!”2€°‘·E¯y›—6qW°H£ÒÐÒ·À [KKÕÊøc5aøFmµ¸x³1ÇöÐðœÀÄ­}¸–»x›çvçvÄY2:–§}[4‡OñXq0áo\@îjöOo9*Ãsy7ôˆkzð¦t¸A>×Ö¢Óî£××Twšêþ<µïu?dM_e”£/tðX[ùˆÃ…—õˆÏìfs6ѺºE×î«Ûx_ ¸'EÁ2DAë­qkzŒ“7¬cmÙ8@ <:†ë.†Ãz_xö‰xlsv¤:ä`_´v`Àx•µ}÷9µ»,<€®2—fyyǶy;Çkºˆ¶™2}‹‡·«ƒ½cãÎë|Fò’r¦á }Oü—ÝÅËþ¹;62d:¢?=µ“8Ô×zçm܆ $…ŒÀ‰r~­CüÐŒúÄ_Å@PüÉøß³Õ–ü/'ÃÌ–z\Æ~Ò7?ŒÃ¹Éx¸!P;â÷E!Sõ¡3îçzÄ×ìÝC º5ð²[Ãt1d¨«aă#>l8LH öþÑ¡®‚o%[%ʇîðfL™3iÆìR×­œ)?V¼8±ãÈ[µ^\ù‘¤Î}24ħfT©0ì¨4%Äž q6†f VcÉ–5{íYW¾x±mËë­/Wˆ£wo^½{ùöõ{×ÙÔ˜„!tÌÃK¸+e*+äñ ':0~ÿe-œ]³km,\¶þ’jI;渦±‹ Ä."—ðì;¡,â鲦¼ºà%lH‹ÃÕ‚Ë­áâ ¶ ç¯U\‘žh0.…ö#¯'÷`›P>ÈÔ´ˆj‚;˜"ŠâdÂAêHòè0àrZáÅ©XÀ «tâÏ@’*M1Ь3ä„—d Ð³¨²¤ *de"ÀJ¥º<ê¡Z¨%av¬1Íö²zM$âðón2ß´©C!2 'ÄLEÇ Óä±I¯nÙ#JÁ2 —­Ü3Q”–¬Ì¶Z蔼Jÿõ£$‚ts¦1ü´G@odè˜6ôW×qÄa±eX<Y¼¼1rþ*?4ÓÂñÅ1ID ¤Ô¨Z†` @ƒ[˜RaεC ³5$?Pˆ*ö(„"Z=½ñ¼yWýH! 2ôsAt÷ë CX_j!©sr˜ZÐ/Z£ø»·¢[Rp“ÐxYmÐÐR¦>΃vÂŒ£ÅÉ>Ôl0ÂÔÌí7Ô?ƶúà¦T=…x>”– ‰€ bˆaƒ "zèš–à÷ÜU½Ñ˜0¢×¨Ï X`Y j’ÝzErî["ékÅ^چǮñ(]j ƒp#jº Ó.­½™^­ò£p(b‰Z°­–ÞœVµ– /¨1Q±Ÿu—€öC¥‡C½þÌ·¹"{ÍþhbŠ—¸Q–SÕ;s˜\î·91fù¡T^ÊH\aBeÖ™k˜ÇмUÕýuµÛ|sHTaÅ•±n§ …Ha·•ÆavV¯©µgž-ß‚k¾àšüí ‡®¨§±eê¨?³sþpIeˆ8¦)5Æ"*$ 7}}§ÛŠúªe6pi©€I’f@{%,W<Ìp¡·× P%3Wá’t­= ãw°ZØÿþǾÇ!&ø˜/ˆ1‘=d]R!€ÆbÁ€xèRÚŸ†Á1´T[äp²7À“Èž6¥žÍåðtÅ I ìm/j#þúÞ÷ØbÃ?”Œ|‰ `‚÷>k‘®xÓzmt„‹Z ÂCHÁp¾˜ˆË Øt¸>ñ΂ò ‚8˜%N…/¹ ÍØ¯a(0&¨@ rÀ„Ll•*äE– 93 òŒŽ«…À „Mˆîã€L*¨¾¼±ïV©|äTl=WÄ5u[RÙ²ˆÀ$“t]á.S *΄hâK(÷)÷’‘‡QXX–‡E^¹b‹Þã…*0o„œxé€qT¨IÂÎB·˜ŸŠ‚ Ž@@çÏ:ÞgÞÇ8£â,Pr…óä&_?øÉò™„DI°Ahr+~€þ‰šW– H¥œàî@¤qÌ™| DB禆Ư…Ñ,¨-î'.ôŸ½dˆ¾jRH8ï’‚"!ú‰¾„n„hD¦µQÔ¢ˆÆ!€ÇfN‚V$„/„5{E5ïÉÅ  C8¹:ãPЕ•¢B;g‹!p`÷”‰FŒdǨ ß Ç¦"¸[ýmßHñÊȺ0¯UhŠc‡Ê¥Fê6r–eÂd=SL4Œôø3¤M,(‚‹ã¹‰ÿš¬WöÚTp+}¢E¬Aÿ9PëÕô¦Î{ìLêWÖÖ=‰T¤_a9D½ñ²}XÀl_²ÊÍè©zÔþ pEªúJ‹WåÅ(*ð»pœüCt¶ÁмºP+)§"†oÒ£SÙ nÅ6ä"f:£*i«\Þ¾VL ³ïwY #À®hž+T•ÈÞ•˜Ìo+Ôù⤟ÅOhéûÞïöD·0)§f‰ÉÞÕ2$q3©À$ªÉŠR×&~TiÄÚ€˜4 ¥¬\4ÝS‹%SLE¨Cr!û8 <Fb’ƒ?-Ñ­š[@€`7œVPª?•Ëây$»!ïTÞ†4F²±”¯LÜé¼Ô™e®òÍåDG£Ç°´×*3&ø ³EA+yJßßFD#«Ó[|þ[h¼F¤(¦‰dÙÛZ,C„¦‘<ì•üW¼…$Ò Î ã¤öqü=—hO+“EöËk®0Np ?ø¡´‘tßJ[ºQ*’Ó‚Í%W`À2  N1Üg‘}6L •MȨn¹&ãà ÀüG= ´¾Ê®ÐµÍ|ma|Û!g>è}AÊÈQResѸ#"Œ£$²ûªº;kJ;L¥@½y,<ä~"HU4L¢çg|Sv+µ8_&';nG‹Ù!TŒÀ$Ð ãü}0èõbbÈ4|Ô+µÃxfn‹;Û|ýÈO_²Šó:ÉJ6+‚ë»|@¶šÛþ»êÅB»&Ø‚=ð ·“‘(w½ÓlÈ¿Ûä´^wOòDë†7º¾E0’aÑõ霼ÌÏ® šùÀw»ÏFCN¾žö¢ÍÏ®FŠq°ã‡v¯—ITKî¼^Ø+ß@EËò¼íê'Ü?›^Ûlj™2]åb¶zeá{™8ŸYÈ~î .è¬éHðפZ\¾çƒa8ã3î“>ˆï‡ÜцYè娂)Âëá<Œu»Û÷|ï§“§³ÛÝßÖÅñ‹oféÀ^ò†\zЭ p›ÜÝf®zð·¢§\(& @ð‘8ûþ÷Ýæv•µþ’ÔÒ:OÜ7É/˜þP]¸º(¸À °€àR–mFÜK<åj‚º‹µ€llðÍaˆì%2 ôȆŒc‘϶îª"K&ÀªµÆÌ» *ºíù>"þF°÷Œý® ÎÚÜïùJ_¦`-~…‹¢«à¸AõÀhh²Ô­!PðÉLˆ$ è@à¼ò«&¨nªîÛ¦Pù®O¥`£ø¾íéž/O’¯¿Ž «°êÞ­Ï>ì"8ÀŸžŽ ¥ Ÿ/ »pùRô|Àì Îr Ÿî ÷ÝlKJ ¬àpݺÐÒÐµŠ°+ÜHÖ@fïæ26&*<†çKÛŽfPÕ¢QþC…| PÔ.#Ãdb÷ÈŒ„R®Ö¦ “ø¾0û¨PaÑ«p‹/§<Ï?$IÏl@F~°|¼aŒ¦â‡h‘1/c€î%nö‚’Q*ÆøNP “oû0»PãO ·ñ§Ð ·pû ¤¨/Åq [0™ï÷’oòÄkÑù0Ó±Ð$ lêñ¥ãà( oøÐ÷Ð!bräz.äÄN& ŽiÍÃ\iÕŒ‚'°†îCnâ ³ ¤B áξ\«¯BrÝÐÝú°Ãð÷ºËýž-bëŸKæÜâ{ ²ÀËgø)—ÐÎþ¤ƒ Ó&¹taÉ+F`ú‚°1*‚g&ÁM ùѽ±+iñoQ)•&Ëq,éqþÌÐ! I&Òø ±,“!ãð÷¸‚.ÑoùäQýÞÒ&}¢$cÂlas¿®BÎi,Ñ1!ó!G0ëk¨p¥®ÊQéžÑ¨˜í28®ÍÂ>—/1á2}âgÂA³è¥ø¾ c2ÛPµ5aò±2eâz‘3GO›JAÀX†’|Dà>Æåéø² ²´" Ò‚³/¢!½Pƒ´Ñµð,ÏrÇi21 3&Ã1/eIÎÁt¡óRHÝøùäÑ[²ùqþ0éòøÒ1C’= ‘ûØédÓ%‘“ûÞë_Ê’6S/“³rLè_Ð&,û¼Ó¨øê!Á¢å8’<5;Ãû29g}Ò¬—¬ 6 ´1¿oùf‘&/ ó>µpŠL-lP‹~Ñ-l€Ð „“|H`箯;¿I``Ež¬ GS„PÃä“SÉ‘<ÉsE—Ï;½r ½ñ«ô1+Ë™TL³;¹“+ò=©T&EÃP)Ùt>’B% )Ëq+ÍQOÆ.Áð뤴&û±Aîê˜C pSÐûüîÑ~k$gð˜Ç,p?¸K㱯íìpBr0þÉûÎ<ñÊE¯¯/M sC³”Kÿ¿Zιt“yFï#Á:àRÏG·¦3Œc÷¼´R;4óþEôn*à< ”ÁVUD:'Ì ’C«t>ùpEÛ°§uZù”Taô·ÒS&ôÃJmÒK¥õ5£<‡´W½Ôgt&‚êRUÐ Éåp"FÙ´ ërM_2/ÁK@ Dy$s 2Bå…òôdcÀB%?Àª,M•`ER’à>ªSê€od€ìDûT`·4áð,ÃóÛüËi8M{,4æ¬ ØbÀ[šáV¹&÷PI6 É•=“—Rp–¦¢Xà ”¡ eYþ+Ö:Ÿiµ²; s[í5Fer·ð%ùtK¡ŽÖžr&ú-¡–<õ.¡õ^DZY×Ô@…Á³Æ®N¿RM¹2jáÕÙ0[k‘CÙöìRí@~À8øŽkC’ Î(2õÝLVÓ|€ÀÎn&P€=Wóaõ³Ç° 3û>õ1.U Ù³!£Vn/7!ãMŸÖRÝí¢`"ìÈ|åt¡ë×¶h àÀEb6Y”á>ÀŠ2ã6’qÒÝÎö%F Ê@œah˧hHV1mÖÁ³k½òZÃűO³°6¿þ‹&ThJÿÔr³µJåsotl_óÕ.*vM™Q]C7þ.[”øž7ÃÖR1KF{Õk0çP{/!O1Wf0˜ -N V‚j6¯· —q;,W}Œ™q;Å÷5Ù·}ÕôúøpNÀ¦T–3SV沉là¦@v¹&*\GU~ÕøWçT ê¡ØŽ÷>‚ Ï•ù&˜+ï3jÝW+YÒˆ·ÑzO4ñ¶®Eµ&A—©—~ßð}e’ {L"cBÔ—+«Wy——~÷<©w‚O{¯R{ìƒ07Fe?·{Ý„ÂÂW8q;¥ ]“ qa‹£ø SŽ1—øâÒz½—&eña§·J¥Ã6ÅR×aþ¡{€%“ÙBV³ xWxE¼ASá%帑k nÝ㞠ʨAfÏøWïÓOÅ[EqÑU/ŒÅz{rT•|¿2НÓfï÷׌•þŽ@VJ‡8E¯´ƒáóa¶” ÔNg¸”‡á/ñCpæ¸{×ô~§vŽ÷ð¿6 ެ¢\ata¥^¸;ç2a65ùn]Ôõ•5½rncS ñ³|7ÜÎ ]•,°Iºnàö@yk¬2}ÕÍN§Õ^‰XKùQ¡ë‚«¼ ôx{ ™ŠA×O÷p™Ku£~ÙT;?·›)k‚»x×^õñEã0E¹c…x£þû‡z9^Í’@]Z—zqíÔ&Ÿö8R— ÇPCq7ÖŸÁ9‹ãÓ+{&&ɘ œàÎb ¦D”€ESJ d³]Úi‘ø¥»ÙŠÝ4™™–s—Um#y“e}Ó (šk¨íÓ–º®ßdý“gó¢„!œž¡ÍHz÷–KµWíšÁ¹%£ô^ßt£×Ø+}5¨ ³ò, tdX€_Ò–1V¿YŸ1 \åq±{º©Í9ga’c›´²1UzÈ0[Óœeq£W¦ù2E·óÛ˜øMÀª[‹+pp[-Pà¬IɰÀ9JåÑ”Y¸e[¦¯wþ†™÷´Ù5w¡_Uº|rX$Ú°·F ´5“Ž¿Ø¼7$g«ÂÈ î'˜—H©ž5Û?µT¶yÙ©9!Ü¿¿³š3wÀ¤SÄ»Ÿé˜2ÿÛ=ýø;§UÙ”?·ËÄøM‰4¿X)kMZE›¿MümÏ[¶¥#{fLÐNu»¹Í8¶wüºwø6à¾Ú>²¸EûÝ3ˆM¼EûP±oü=_|S àóâûUXˆÁ @’õ¾YÄ Þý¿ù¿Å¸Y®Ú“…¦ÓÈ"èþ"À ®ù»ÆOõÅ¥ÔÉqŽõüÜF ñc©òÑ#¼£Í}àçØû2ÞÆù¨ñÀèÁ½·Áþ›³¾á·‘ÇÖ{빞Ÿýûè™ÝÃÛ˜âãÞéëNÓੜ®!=ßc¸¿­Ý'ІHØLÞ`Á€(›åEœ”5žï1èÙ“`âæ…4‚¶œ3¹”H™ê#_òó3éó~½õüZ| þõAªsÓcJ=>æ‰{òÛþƧÚ@Ç`ÔÖ5¾ÆÝ^ãá8Öѯ»&Š`jõ¼ôÙþÛR\vcÍÇa]øQ?æIßÑù1<¿,¹o4“« ¸#þ È|ñUDnŒcß ÿö™ÓgðòW„ø)ðÑbß3ênø±òBX® <˜K`„¸px1¢Ä‰ øAhPÆ;ÄA€¢È‘ôÁ¥ð`JWT¨ÑåÆ>!IÚ”H A™…ÉlY«ÂÍ¡D‹=qCª„>îtêÑ`Ó¨>ýD˜˜¡«­\»zý ¶+¯±¼|•%kv¬‚„£7®Ü¹tëÚ½‹ï££úíY¢˜¼uk<´¡*,«IW‘Ž$€£–Ož_VÞ(P‰Ç$‹\þ\YX­ œo.(‚´êŽIj–ž˜sXKи„¾¾÷†‹ SR¶¼þz'.%"#@RŒ<9+Wh›Ÿå5jÔ[¿Žð£(‚cƵùáàìÑBfHÖˆëÜ ìÆ%û·÷¿}l³x!Õäù«‡‡¿?‘8, ƒ‹ F”Ójµd°`„ÂVÁ¸x`Pë1C)®(âVÌ•–Y%Ž¥ i(“]‹.f'‹QH†!AA¤F‹P@€V_¹2I âWD-5~Ö„CòˆÚTGzÔÇKN„‚Ê÷d.~Ø7a“—²À”b.¸À€Yª„K†z!&GÖs'¢xœñbžzÚ5ÍQ6<éCD#€CÞCF¤·æD°D*(a9Ÿ@þ©(‘è„y&šõI(ôa$¤óÕ¢à˜ ôU-qÊê}øàÇ…G T  E@¸ùæq’ìY®Ø@€Rì‰l²â p µ¤æ]-RB4@-Z@“|¥Ê´­>$@8€*둸ԢÄÿµJÀEBûd-©Øæ·pŽžIêºb¶ëSá‚K*TjoÂE»AŽ–«Ú¹Qúk“{>öÚ•+#:7§+(`Õ%Krž! E€ ±:YYšë0vÞ€ råJ)\F4et0æ¢U’[`Ë©ôai ã”Á¸ŽŠÚ‘¼JÄ@ñÒ-°AχKþ”ÿ;´¤øÑ‡[ömîá D©`*ðÀç’mv_“”ò¶/ל‰ÁšË(uF`¡%~íkáö³åD ˆAN‹h'çX¬Ø üTŒƒxúØ]Ž[±Ô_`ƒ 8ààý\AÕ0ó¢TàHlèVð]Ä!:´ $·Z`ô^³@€ dù3nõ@  X ¸Àýb?lþ¨€0˜Á%l9p€¨pIÈÁöº÷=ðù,L¨$€ªoˆyÁÚ`ô¹h/1pEb\Á„ Ax1Ì ¯ˆÅ,jQ‹. j)XaŒU€‚ @Ð`[T[à!álcqš“‰|á Wø@:,*GÄ@Þ…f €ø—'šáfQŒH¢a2Ȱ”¬¤%/™ *¨B˜± oŒc”J¤9¾áh<ãh°!1y””ÁC9üUZx¡1U  $@¢QJA s.;²¶Ìyc`ÂVJ±®Ñ:Ê,¯‰ÍlVrØþ˜Ñ q¼ÅEÑ€Â$µy“EmÀL˜D)TÏwvE‘0ª×ËTÃì']Î`/àiO}"€ÞJõ$“0ã(&: QK Þ<7@" ¯Œèìz¹A…䂨ë¥<çϔʅøV Æ©'eðh[ˆzg|“`@ €e$bÍ j4š! 1X x@KÛ`’#€ ¥f^•’èé:Ö€``üb H‚¦ÆpHx\¼Á Ya e A`8¤€3Ø0‡…sj³ª#-lIKZØ^.Ðø"U Yzì”U0ÜþžÔð@Â>€¤žÆÁÑ6îVPF4¼Sºcá‡2¬`M,à*€‚²(°@$`À¨Û0Ba¸ÄÁSU€Œ YE4¦1çn•Þ@%8¼á ¢žÁ $Ú‚I—Œf4•F‚¼°«R@T§*U @«,ìêЯ~`RÈ‚°‘ZõAc‚…¥bœX+øB# aöic YŒx´®˜í)f`ã—k†¿¾ˆVððÛ’…fà´EѨBŸG1p#ÀÊüÂðŠR·f•ÓPÊ 2” A2„| #¹ €5þÄÝR $Þ$_ü‘ÁZ&@€¨@Y0ƒ,>á4ûS:ÀJÆ Š€ }h¨òó0ƒ3DCÕS4@=ˆAÔès²Æ!6ËNÌ(tÉЀe¤`d{"Ç8Ñ÷ñ®¶r†Ns\¢Q+¬²@pk*¨À8@j€ÄW“8€` à`B„ `A d8ƒ,˜Á gpcšžn¶4Ž;¡(òÈ"‡¨ í!–SÖ²+À¥œ'rYi+@(=Äq‡ã”âˆn4¢þÁ DA RP\©A+| g€Æ4¸±lìzC¤Ô·Çéò z(Ûˆ“‚`+Èq¨ ínÕd,Èq€Aä¬@ðíOoœÁάB@4:]2o8ô(!`ÑÇõMeTæbÀm¨}êy‰Æd$Mm—·²ðgÒ­‚k[  Oi9dQ¦Kh8Ã7Òì 4Ô ¶bAׇù Dz"Ñ©þñhˆaä^РpwÀ+¾Ÿá8Cö~” añÉ¢†2¢0W(Á–o{ãPè@ËsóåœçúÇ3¾ÀnÈsæ5ø»?£ñȺœ—j ÐþOƒòTG4Ì …»2s…R}À¾àpâK˜Ó {‘€Ô@Ÿ¾‹Èá eœ ˜¿õ«[UFõÄ€†iH]¥âxƬÿ ÌwaœïÀ ¬ ²Àl€GÑ€b0pzD|U óHeà âä}Ä7â jp€J5Fø``f Ï€Lˆ‚ý4 Ï€_p^#ðvõ ƒûUƒz)¨>ã€JÛ >¸ @¸ Ѱ Ôð 8ußÀ Ûð Ì  ² j…Ê …Ïð Dx„:8à€ ThV30cH†d8Q ð ¨…mè†Xo‡%3p5p4‡wˆ‡y¨‡{ȇ}臈(ˆƒHˆ…hˆ‡ˆˆ‰¨ˆ‹Èˆèˆ‰‘(‰“H‰•h‰—ˆ‰™¨‰›È‰è‰ŸŠ¡(Š£HŠ¥hŠ;pygame-1.9.1release/docs/logos.html0000644000175000017500000000304710333044744017212 0ustar vincentvincent Pygame Logos

    pygame logos
    These logos are available for use in your own game projects. Please put them up wherever you see fit. The logo was created by TheCorruptor on July 29, 2001.

    There is a higher resolution layered photoshop image available here. (1.3 MB)


    pygame_logo.gif - 676 x 200


    pygame_small.gif - 338 x 100


    pygame_tiny.gif - 200 x 60


    pygame_powered.gif - 250 x 100


     
    pygame-1.9.1release/docs/LGPL0000644000175000017500000006347610767640253015706 0ustar vincentvincent GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This 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 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! pygame-1.9.1release/docs/index.html0000644000175000017500000002021311206577570017200 0ustar vincentvincent Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pygame ||  Pixelarray ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    Documents

    Readme
    Basic information about Pygame, what it is, who is involved, and and where to find it.
    Install
    Steps needed to compile Pygame on several platforms. Also help on finding and installing prebuilt binaries for your systems.
    LGPL License
    This is the license Pygame is distributed under. It provides for Pygame to be distributed with open source and commercial software. Generally, if Pygame is not changed, it can be used with any type of program.

    Tutorials

    Introduction to Pygame
    An introduction to the basics of Pygame. This is written for users of Python and appeared in volume two of the Py magazine.
    Import and Initialize
    The beginning steps on importing and initializing Pygame. The Pygame package is made of several modules. Some modules are not included on all platforms.
    How do I move an Image?
    A basic tutorial that covers the concepts behind 2D computer animation. Information about drawing and clearing objects to make them appear animated.
    Chimp Tutorial, Line by Line
    The pygame examples includes a simple program with an interactive fist and a monkey. This was insprired by the annoying flash banner of the early 2000's. This tutorial examines every line of code used in the example.
    Sprite Module Introduction
    Pygame includes a higher level sprite module to help organize games. The sprite module includes several classes that help manage details found in almost all game types. The Sprite classes are a bit more advanced than the regular Pygame modules, and need more understanding to be properly used.
    Surfarray Introduction
    Pygame uses the Numeric python module to allow efficient per pixel effects on images. Using the surface arrays is an advanced feature that allows custom effects and filters. This also examines some of the simple effects from the Pygame example, arraydemo.py.
    Camera Module Introduction
    Pygame, as of 1.9, has a camera module that allows you to capture images, watch live streams, and do some basic computer vision. This tutorial covers those use cases.
    Newbie Guide
    A list of thirteen helpful tips for people to get comfortable using Pygame.
    Making Games Tutorial
    A larger tutorial that covers the bigger topics needed to create an entire game.

    Reference

    Index
    A list of all functions, classes, and methods in the Pygame package.
    Cdrom
    How to access and control the CD audio devices.
    Color
    Color representation.
    Cursors
    Loading and compiling cursor images.
    Display
    Configuring the display surface.
    Draw
    Drawing simple shapes like lines and ellipses to surfaces.
    Event
    Manage the incoming events from various input devices and the windowing platform.
    Examples
    Various programs demonstrating the use of individual pygame modules.
    Font
    Loading and rendering Truetype fonts.
    Gfxdraw
    Anti-aliasing draw functions.
    Image
    Loading, saving, and transferring of surfaces.
    Joystick
    Manage the joystick devices.
    Key
    Manage the keyboard device.
    Locals
    Pygame constants.
    Mixer
    Load and play sounds.
    Mouse
    Manage the mouse device and display.
    Movie
    Video playback from MPEG movies.
    Music
    Play streaming music tracks.
    Overlay
    Access advanced video overlays
    Pygame
    Top level functions to manage Pygame.
    PixelArray
    Manipulate image pixel data.
    Rect
    Flexible container for a rectangle.
    Scrap
    Native clipboard access.
    Sndarray
    Manipulate sound sample data.
    Sprite
    Higher level objects to represent game images.
    Surface
    Objects for images and the screen.
    Surfarray
    Manipulate image pixel data.
    Tests
    Test Pygame.
    Time
    Manage timing and framerate.
    Transform
    Resize and move images.
    pygame-1.9.1release/docs/howto_release_pygame.txt0000644000175000017500000000411410540372447022144 0ustar vincentvincent Here are some steps for making a new release of pygame. So everyone knows what needs to be done to make a release work smoothly. == release steps == * declare next release as coming soon to developers, and mailing list. * declare feature freeze. * check with people on different platforms that tests are working. * ask platform people to sign off for their platform building, and testing ok. * WHATSNEW document is updated, with any changes. * declare tar ball set, by making a branch in svn with the pygame version as rc1. eg 1.7.1rc1 - files to change version string: lib/version.py setup.py readme.html readme.txt - This is the subversion command used: svn copy svn://seul.org/svn/pygame/trunk svn://seul.org/svn/pygame/tags/release_1_8_0rc1 -m "new 1.8.0rc1 release." * second round of testing goes on the new release branch. If any changes need to be made, all platforms need to be tested again and signed off. The pygame rc version is incremented and a new rc tar ball is released. eg 1.7.1rc2. * if no changes needed to be made to the rc release, then the version is changed. eg from 1.7.1rc1 to 1.7.1release * release person uploads final sources tarball to website. * documentation is remade, and uploaded to website, not before sources. * release binaries, not before sources. * announce to the mailing list, and the world that a new pygame is released. * the version of pygame is incremented by 1 and pre appended. eg 1.7.1 goes to 1.7.2pre == Some definitions and explanations. == release person := person who is in charge of doing release. Should be one person. platform people := people responsible for each platform. eg macosx, windows, linux, freebsd etc. testing pygame := at least all the examples run ok. Also test major pygames, solarwolf, and pyddr work. Try to run other gamelets, and games that you know of. Try to test with different parts installed/uninstalled etc. rc releases := these are release candidates. If no changes need to be made, then the pygame version is changed and it can be released. pre releases := these are snap shots from svn. pygame-1.9.1release/docs/__main__.py0000644000175000017500000000105511204376022017263 0ustar vincentvincent# python -m pygame.docs import os import webbrowser try: from urllib.parse import urlunparse, quote except ImportError: from urlparse import urlunparse from urllib import quote def iterpath(path): path, last = os.path.split(path) if last: for p in iterpath(path): yield p yield last pkg_dir = os.path.dirname(os.path.abspath(__file__)) main_page = os.path.join(pkg_dir, 'index.html') url_path = quote('/'.join(iterpath(main_page))) url = urlunparse(('file', '', url_path, '', '', '')) webbrowser.open(url) pygame-1.9.1release/docs/__init__.py0000644000175000017500000000042611204376022017303 0ustar vincentvincent# Make docs a package that brings up the main page in a web brower when # executed. # # python -m pygame.docs if __name__ == '__main__': import os pkg_dir = os.path.dirname(os.path.abspath(__file__)) main = os.path.join(pkg_dir, '__main__.py') execfile(main) pygame-1.9.1release/test/util/svn_log_to_whatsnew.py0000644000175000017500000000442111215636064022647 0ustar vincentvincent""" reads a svn log, and generates output for the WHATSNEW. Should still edit the WHATSNEW to make it more human readable. """ import sys,os,glob,textwrap lines = sys.stdin.readlines() out= [] state = "none" for l in lines: if "-------" in l: state = "revision date line" continue if state == "revision date line": parts = l.split("|") out.append({}) out[-1]['revision'] = parts[0].strip().replace("r", "") out[-1]['username'] = parts[1].strip() out[-1]['date'] = parts[2].strip() date_parts = parts[2].strip().split("(") out[-1]['day_month_year'] = day, month, year = date_parts[1][:-1].split(",")[1].split() out[-1]['message'] = "" state = "message" elif state == "message": out[-1]['message'] += l + "\n" import pprint #pprint.pprint(out) # group revisions on the same day into one block. previous = [] for o in (out + [None]): if o and previous and o['day_month_year'] == previous[-1]['day_month_year']: previous.append(o) continue else: if not previous: previous.append(o) continue day, month, year = previous[-1]['day_month_year'] revs = [int(p['revision']) for p in previous] if len(revs) == 1: revisions = revs[0] else: revisions = "%s-%s" % (min(revs), max(revs)) print "[SVN %s] %s %s, %s" % (revisions, month, day, year) # uniqify the messages, keep order. messages = [p['message'][2:] for p in previous] unique_messages = [] for m in messages: if m not in unique_messages: unique_messages.append(m) for msg in reversed(unique_messages): #msg = p['message'][2:] for i in range(4): if msg and msg[-1] == "\n": msg = msg[:-1] lines = textwrap.wrap(msg, 74) if lines: if lines[-1][-1:] != ".": lines[-1] += "." for i, l in enumerate(lines): if i == 0: print " %s" % (l[:1].upper() + l[1:]) if i != 0: print " %s" % l print "" previous = [o] pygame-1.9.1release/test/util/relative_indentation.py0000644000175000017500000000734111020702635022761 0ustar vincentvincent################ QUICK AND NASTY RELATIVE INDENTATION TEMPLATES ################ import re ################################################################################ def strip_common_preceding_space(input_str): "Strips preceding common space so only relative indentation remains" preceding_whitespace = re.compile("^(?:(\s*?)\S)?") common_start = len(input_str) split = input_str.split("\n") for line in (l for l in split if l.strip()): for match in preceding_whitespace.finditer(line): common_start = min(match.span(1)[1], common_start) return "\n".join( [l[common_start:] for l in split] ) def pad_secondary_lines(input_str, padding): split = input_str.split('\n') return '\n'.join( [split[0]] + [(padding+l) for l in split[1:]] ) ################################################################################ ph_re = re.compile("\${(.*?)}") multi_line_re = re.MULTILINE | re.DOTALL ################################################################################ class Template(object): def __call__(self): return self def __init__(self, template, strip_common = True, strip_excess = True): if strip_common: template = strip_common_preceding_space(template) if strip_excess: template = template.strip() + '\n' self.template = template self.find_ph_offsets() def find_ph_offsets(self): self.ph_offsets = dict() for lines in self.template.split('\n'): for match in ph_re.finditer(lines): self.ph_offsets[match.group(1)] = match.span()[0] def render(self, replacements = None, **kw): if not replacements: replacements = kw # missing_ph = [k for k in self.ph_offsets if k not in replacements] # excess_repl = [k for k in replacements if k not in self.ph_offsets] # A lot more performant assert len(replacements) == len(self.ph_offsets) # errors = [] # if missing_ph: errors.append ( # 'Missing replacements: %s' % ', '.join(missing_ph) # ) # if excess_repl: errors.append ( # 'Excess replacements: %s' % ', '.join(excess_repl) # ) # if errors: raise ValueError("\n".join(errors)) template = self.template[:] for ph_name, replacement in replacements.iteritems(): ph_offset = self.ph_offsets[ph_name] ph_search = re.search ("\${%s}" % ph_name, template, multi_line_re) ph_start, ph_end = ph_search.span() padded = pad_secondary_lines(replacement, ph_offset * ' ') template = template[0:ph_start] + padded + template[ph_end:] return template if __name__ == "__main__": print Template( ''' def test_${test_name}(self): """ ${docstring} """ ${comments} self.assert_(not_completed() ''' ).render( test_name = 'this_please', docstring = 'Heading:\n\n Indented Line\n More', comments = '# some comment\n# another comment', ) check_that = Template('works with ${one} on each line, or even ${two_four}') print check_that.render(one='one', two_four='two') # BUG: Multiline replacements with 2 ph per line will go awry -> .ph_offsets # Outside scope of stubber print check_that.render(one='one\n one', two_four='two\n not_right\n') ################################################################################pygame-1.9.1release/test/util/gen_stubs_test.py0000644000175000017500000000044011032423152021570 0ustar vincentvincent######################### PYGAME UNITTEST STUBBER TESTS ######################## """ TODO ==== tests for new stubber: deleted tests for missing units """ import pygame, unittest, gen_stubs ################################################################################pygame-1.9.1release/test/util/gen_stubs.py0000644000175000017500000002411111146235662020547 0ustar vincentvincentusage_text = """ $ %prog ROOT eg. $ %prog sprite.Sprite def test_add(self): # Doc string for pygame.sprite.Sprite: ... """ #################################### IMPORTS ################################### from optparse import OptionParser from inspect import isclass, ismodule, getdoc, isgetsetdescriptor, getmembers import pygame, sys, datetime, re, types import relative_indentation import textwrap ################################ TESTS DIRECTORY ############################### from os.path import normpath, join, dirname, abspath for relpath in ('../../','../'): sys.path.insert(0, abspath(normpath( join(dirname(__file__), relpath) )) ) from test.test_utils.unittest import TestCase from makeref import docs_as_dict from test_utils import trunk_relative_path #################################### IGNORES ################################### # Anything not wanted to be stubbed, such as aliases, or redundancies IGNORES = set([ pygame.rect.Rect.h, pygame.rect.Rect.w, pygame.rect.Rect.x, pygame.rect.Rect.y, pygame.color.Color.a, pygame.color.Color.b, pygame.color.Color.g, pygame.color.Color.r, # Ignore by class: all methods and getter setters cut from root # pygame.sprite.AbstractGroup, pygame.sprite.LayeredUpdates, pygame.sprite.LayeredDirty, pygame.sprite.OrderedUpdates, pygame.sprite.GroupSingle, pygame.sprite.RenderUpdates, pygame.sprite.Group, pygame.image.tostring, pygame.base.error.args, ]) # pygame.sprite.Sprite.__module__ = 'pygame.sprite' # pygame.sprite.Rect.__module__ = 'pygame' # Mapping of callable to module where it's defined # Place any object that appears in modules other than it's home in here REAL_HOMES = { pygame.rect.Rect : pygame.rect, pygame.mask.from_surface : pygame.mask, pygame.time.get_ticks : pygame.time, pygame.event.Event : pygame.event, pygame.event.event_name : pygame.event, pygame.font.SysFont : pygame.font, pygame.font.get_fonts : pygame.font, pygame.font.match_font : pygame.font, } def get_Movie(): return pygame.movie.Movie( trunk_relative_path('examples/data/blue.mpg') ) MUST_INSTANTIATE = { # BaseType / Helper # (Instantiator / Args) / Callable pygame.cdrom.CDType : (pygame.cdrom.CD, (0,)), pygame.mixer.ChannelType : (pygame.mixer.Channel, (0,)), pygame.time.Clock : (pygame.time.Clock, ()), pygame.mask.Mask : (pygame.mask.Mask, ((32,32),)), pygame.movie.Movie : get_Movie, # pygame.event.Event : None, # pygame.joystick.Joystick : None, # pygame.display.Info : None, } def get_instance(type_): pygame.init() helper = MUST_INSTANTIATE.get(type_) if callable(helper): return helper() helper, arg = helper try: return helper(*arg) except Exception, e: raw_input("FAILED TO CREATE INSTANCE OF %s\n%s\n" "Press Enter to continue" % (type_, e)) return type_ ##################################### TODO ##################################### """ Test """ ################################ STUB TEMPLATES ################################ date = datetime.datetime.now().date() STUB_TEMPLATE = relative_indentation.Template ( ''' def ${test_name}(self): # __doc__ (as of %s) for ${unitname}: ${comments} self.fail() ''' % date, strip_common = 0, strip_excess = 0 ) ############################## REGULAR EXPRESSIONS ############################# module_re = re.compile(r"pygame\.([^.]+)\.?") #################################### OPTIONS ################################### opt_parser = OptionParser() opt_parser.add_option ( "-l", "--list", action = 'store_true', help = "list callable names not stubs" ) opt_parser.add_option ( "-t", "--test_names", action = 'store_true', help = "list test names not stubs" ) opt_parser.add_option ( "-d", "--docs", action = 'store_true', help = "get (more detailed) docs using makeref.py" ) # usage_text is assigned at the top of the module. opt_parser.set_usage(usage_text) ################################### FUNCTIONS ################################## docs = {} def module_in_package(module, pkg): return ("%s." % pkg.__name__) in module.__name__ def get_package_modules(pkg): modules = (getattr(pkg, x) for x in dir(pkg) if is_public(x)) return [m for m in modules if ismodule(m) and module_in_package(m, pkg)] # Don't want to pick up # string module for example def py_comment(input_str): lines = [] for line in input_str.split('\n'): if len(line) > 80: lines += textwrap.wrap(line, 68) lines += [''] else: lines += [line] return '\n'.join([('# ' + l) for l in lines]).rstrip('\n# ') def is_public(obj_name): try: obj_name += '' except TypeError: obj_name = obj_name.__name__ return not obj_name.startswith(('__','_')) def get_callables(obj, if_of = None, check_where_defined=False): publics = (getattr(obj, x) for x in dir(obj) if is_public(x)) callables = (x for x in publics if callable(x) or isgetsetdescriptor(x)) if check_where_defined: callables = (c for c in callables if ( 'pygame' in c.__module__ or ('__builtin__' == c.__module__ and isclass(c)) ) and REAL_HOMES.get(c, 0) in (obj, 0)) if if_of: callables = (x for x in callables if if_of(x)) # isclass, ismethod etc return set(callables) def get_class_from_test_case(TC): TC = getattr(TC, "__name__", str(TC)) if 'Type' in TC: return TC[:TC.rindex('Type')] def names_of(*args): return tuple(map(lambda o: getattr(o, "__name__", str(o)), args)) def callable_name(*args): args = [a for a in args if a] return ('.'.join(['%s'] * len(args))) % names_of(*args) ################################################################################ def test_stub(f, module, parent_class = None): test_name = 'todo_test_%s' % f.__name__ unit_name = callable_name(module, parent_class, f) stub = STUB_TEMPLATE.render ( test_name = test_name, # docs is a global, possibly empty dict, depending on options.docs comments = py_comment ( "%s\n\n%s" % ( getdoc(f) or '', docs.get(unit_name, ''), ) ), unitname = unit_name, ) return unit_name, (test_name, stub) def make_stubs(seq, module, class_=None): return dict( test_stub(c, module, class_) for c in seq ) def module_stubs(module): stubs = {} all_callables = get_callables(module, check_where_defined = True) - IGNORES classes = set ( c for c in all_callables if isclass(c) or c in MUST_INSTANTIATE ) for class_ in classes: base_type = class_ if class_ in MUST_INSTANTIATE: class_ = get_instance(class_) stubs.update ( make_stubs(get_callables(class_) - IGNORES, module, base_type) ) stubs.update(make_stubs(all_callables - classes, module)) return stubs def package_stubs(package): stubs = dict() for module in get_package_modules(package): stubs.update(module_stubs(module)) return stubs ################################################################################ TEST_NAME_RE = re.compile(r"test[_\d]+(.*)") # re.compile(r"test[\d_]+((?:[^_]+.[^_])+)") # def is_test(f): return f.__name__.startswith(('test_', 'todo_')) def get_tested_from_testname(test): tn = getattr(test.__name__, str(test)) separated = tn.rfind('__') if separated != -1: tn = tn[:separated] return TEST_NAME_RE.search(tn).group(1) ################################################################################ def already_tested_in_module(module): already = [] mod_name = module.__name__ test_name = "%s_test" % mod_name[7:] try: test_file = __import__(test_name) except ImportError: #TODO: create a test file? return [] classes = get_callables(test_file, isclass) test_cases = (t for t in classes if TestCase in t.__bases__) for class_ in test_cases: class_tested = get_class_from_test_case(class_) or '' for test in get_callables(class_, is_test): fname = get_tested_from_testname(test) already.append( callable_name( mod_name, class_tested, fname )) return already def already_tested_in_package(package): already = [] for module in get_package_modules(package): already += already_tested_in_module(module) return already ################################################################################ def get_stubs(root): module_root = module_re.search(root) if module_root: try: module = getattr(pygame, module_root.group(1)) except AttributeError: __import__( 'pygame.' + module_root.group(1) ) module = getattr(pygame, module_root.group(1)) stubs = module_stubs(module) tested = already_tested_in_module(module) else: stubs = package_stubs(pygame) tested = already_tested_in_package(pygame) return stubs, tested if __name__ == "__main__": options, args = opt_parser.parse_args() if not sys.argv[1:]: sys.exit(opt_parser.print_help()) docs = options.docs and docs_as_dict() or {} root = args and args[0] or 'pygame' if not root.startswith('pygame'): root = '%s.%s' % ('pygame', root) stubs, tested = get_stubs(root) for fname in sorted(s for s in stubs.iterkeys() if s not in tested): if not fname.startswith(root): continue # eg. module.Class test_name, stub = stubs[fname] if options.list: print "%s," % fname elif options.test_names: print test_name else: print stub ################################################################################ pygame-1.9.1release/test/util/create_doc_from_py.py0000644000175000017500000000420511206150727022376 0ustar vincentvincent""" For creating .doc documentation from .py files that include documentation. """ import sys, os, textwrap #import pygame.sprite #the_module = pygame.sprite #the_doc = "sprite.doc" try: #if 1: the_module = __import__(sys.argv[-1]) last_part = sys.argv[-1].split(".")[-1] the_module = getattr(the_module, last_part) except: print "useage:\n python create_doc_from_py.py pygame.sprite" raise # put makeref.py in the path. sys.path.append(os.path.join("..", "..")) from makeref import Doc out = [] out += [the_module.__doc__, "
    \n\n\n"] #out += [the_module.__doc__] if hasattr(the_module, "__all__"): all_attrs = the_module.__all__ else: all_attrs = dir(the_module) def get_docs(the_object, all_attrs, find_children = 1): out = [] for d in all_attrs: if d.startswith("_"): continue a = getattr(the_object, d) # skip constants. if type(a) == type(1): continue #print a #print d if not a.__doc__: raise Exception(repr(a)) parts = a.__doc__.split("\n") # remove some parts at the end that are empty lines. while parts: #print "parts[-1] :%s:" % parts[-1] if not parts[-1].strip(): #print "del!" del parts[-1] else: break text = parts[0] + "\n" + textwrap.dedent( "\n".join(parts[1:])) #out += [d, text , "\n\n\n"] out += [d, text] # get any children... #if find_children: if hasattr(the_object, "__theclasses__"): if d in the_object.__theclasses__: out += ["
    \n\n\n"] children_attrs = dir(a) #print children_attrs out += get_docs(a, children_attrs, 0) out[-1] = out[-1][:-3] out += ["\n\n\n"] else: pass #out += ["\n\n\n"] out += ["\n\n\n"] else: out += ["\n\n\n"] return out out += get_docs(the_module, all_attrs) print "\n".join(out) pygame-1.9.1release/test/util/compare_docs.py0000644000175000017500000000301611163576460021220 0ustar vincentvincent""" For finding out what is not documented. python compare_docs.py pygame.sprite sprite.doc An example showing how to compare what the .doc docs have in them with what the module has in them. For example, to see what the sprite.doc has documented compared to what the sprite module actually has in it. To be move to """ import sys, os #import pygame.sprite #the_module = pygame.sprite #the_doc = "sprite.doc" try: #if 1: the_module = __import__(sys.argv[-2]) last_part = sys.argv[-2].split(".")[-1] print last_part the_module = getattr(the_module, last_part) the_doc = sys.argv[-1] except: print "useage:\n python compare_docs.py pygame.sprite sprite.doc" raise # put makeref.py in the path. sys.path.append(os.path.join("..", "..")) from makeref import Doc f = None f2 = None f = os.path.join("..", "..", "lib", the_doc) if not os.path.exists(f): f2 = os.path.join("..", "..", "src", the_doc) if not os.path.exists(f2): raise "paths do not exist :%s: :%s:" % (f,f2) else: f = f2 d = Doc('', open(f, "U")) print d for x in dir(d): print ":%s:" % x, getattr(d, x) #def obj_doc_file(): print "\n\n" print "Stuff in docs - the_module. In the_module, not in docs:" print set(dir(the_module)) - set([x.name for x in d.kids]) print "-" * 20 print "\n\n" print "stuff in docs - the_module. In docs, not in the_module." print set([x.name for x in d.kids]) - set(dir(the_module)) print "\n\n" print "everything in the module." print set(dir(the_module)) pygame-1.9.1release/test/test_utils/unittest_patch.py0000644000175000017500000002321711225275646023050 0ustar vincentvincent################################################################################ if __name__.startswith('pygame.tests.'): from pygame.tests.test_utils import unittest, import_submodule else: from test.test_utils import unittest, import_submodule import re import time import sys try: import StringIO except ImportError: import io as StringIO import random from inspect import getdoc # This is needed for correct tracebacks __unittest = 1 ################################################################################ # Redirect stdout / stderr for the tests def redirect_output(): yield sys.stderr, sys.stdout sys.stderr, sys.stdout = StringIO.StringIO(), StringIO.StringIO() yield sys.stderr, sys.stdout def restore_output(err, out): sys.stderr, sys.stdout = err, out def StringIOContents(io): io.seek(0) return io.read() ################################################################################ # TestCase patching # def TestCase_run(self, result=None): if result is None: result = self.defaultTestResult() result.startTest(self) testMethod = getattr(self, self._testMethodName) try: ######################################################################## # Pre run: #TODO: only redirect output if not tagged interactive result.tests[self.dot_syntax_name()] = { 'times' : [], } tests = result.tests[self.dot_syntax_name()] (realerr, realout), (stderr, stdout) = redirect_output() test_tags = list(get_tags(self.__class__, testMethod)) if 0 or 'interactive' in test_tags: # DEBUG restore_output(realerr, realout) ######################################################################## for i in range(self.times_run): t = time.time() try: self.setUp() except KeyboardInterrupt: raise except: result.addError(self, self._exc_info()) return ok = False try: testMethod() ok = True except self.failureException: result.addFailure(self, self._exc_info()) except KeyboardInterrupt: raise except: result.addError(self, self._exc_info()) try: self.tearDown() except KeyboardInterrupt: raise except: result.addError(self, self._exc_info()) ok = False tests["times"] += [time.time() -t] if not ok: break # if ok: # if i == 0: # result.addSuccess(self) # else: break if ok: result.addSuccess(self) ######################################################################## # Post run restore_output(realerr, realout) tests["stdout"] = StringIOContents(stdout) tests["stderr"] = StringIOContents(stderr) tests["tags"] = test_tags ######################################################################## finally: result.stopTest(self) ################################################################################ # TestResult # def TestResult___init__(self): self.failures = [] self.errors = [] self.tests = {} self.testsRun = 0 self.shouldStop = 0 # TODO: all this is available in the traceback object err FILE_LINENUMBER_RE = re.compile(r'File "([^"]+)", line ([0-9]+)') def errorHandling(key): def handling(self, test, err): traceback = self._exc_info_to_string(err, test) error_file, line_number = FILE_LINENUMBER_RE.search(traceback).groups() error = ( test.dot_syntax_name(), traceback, error_file, line_number, #TODO: add locals etc ) getattr(self, key).append(error) # Append it to individual test dict for easy access self.tests[test.dot_syntax_name()][key[:-1]] = error return handling ################################################################################ def printErrorList(self, flavour, errors): for test, err in [(e[0], e[1]) for e in errors]: self.stream.writeln(self.separator1) self.stream.writeln("%s: %s" % (flavour, test)) self.stream.writeln(self.separator2) self.stream.writeln("%s" % err) # DUMP REDIRECTED STDERR / STDOUT ON ERROR / FAILURE if self.show_redirected_on_errors: stderr, stdout = map(self.tests[test].get, ('stderr','stdout')) if stderr: self.stream.writeln("STDERR:\n%s" % stderr) if stdout: self.stream.writeln("STDOUT:\n%s" % stdout) ################################################################################ # Exclude by tags # TAGS_RE = re.compile(r"\|[tT]ags:(-?[ a-zA-Z,0-9_\n]+)\|", re.M) class TestTags: def __init__(self): self.memoized = {} self.parent_modules = {} def get_parent_module(self, class_): if class_ not in self.parent_modules: self.parent_modules[class_] = import_submodule(class_.__module__) return self.parent_modules[class_] def __call__(self, parent_class, meth): key = (parent_class, meth.__name__) if key not in self.memoized: parent_module = self.get_parent_module(parent_class) module_tags = getattr(parent_module, '__tags__', []) class_tags = getattr(parent_class, '__tags__', []) tags = TAGS_RE.search(getdoc(meth) or '') if tags: test_tags = [t.strip() for t in tags.group(1).split(',')] else: test_tags = [] combined = set() for tags in (module_tags, class_tags, test_tags): if not tags: continue add = set([t for t in tags if not t.startswith('-')]) remove = set([t[1:] for t in tags if t not in add]) if add: combined.update(add) if remove: combined.difference_update(remove) self.memoized[key] = combined return self.memoized[key] get_tags = TestTags() ################################################################################ # unittest.TestLoader # def CmpToKey(mycmp): 'Convert a cmp= function into a key= function' class K(object): def __init__(self, obj, *args): self.obj = obj def __lt__(self, other): return mycmp(self.obj, other.obj) == -1 return K def getTestCaseNames(self, testCaseClass): def test_wanted(attrname, testCaseClass=testCaseClass, prefix=self.testMethodPrefix): if not attrname.startswith(prefix): return False else: actual_attr = getattr(testCaseClass, attrname) return ( hasattr(actual_attr, '__call__') and not [t for t in get_tags(testCaseClass, actual_attr) if t in self.exclude] ) # TODO: # Replace test_not_implemented mechanism with technique that names the tests # todo_test_xxxxxx, then when wanting to fail them, loads any members that # startswith(test_prefix) # REGEX FOR TEST_NOT_IMPLEMENTED # SEARCH: # def (test_[^ ]+)((?:\s+#.*\n?)+\s+)self\.assert_\(test_not_implemented\(\)\) # REPLACE: # def todo_\1\2self.fail() testFnNames = [c for c in dir(testCaseClass) if test_wanted(c)] for baseclass in testCaseClass.__bases__: for testFnName in self.getTestCaseNames(baseclass): if testFnName not in testFnNames: # handle overridden methods testFnNames.append(testFnName) if self.randomize_tests: random.shuffle(testFnNames) elif self.sortTestMethodsUsing: testFnNames.sort(key=CmpToKey(self.sortTestMethodsUsing)) return testFnNames ################################################################################ def patch(**kwds): """Customize the unittest module according to the run-time options Recognized keyword arguments: incomplete, randomize, seed, exclude, timings and show_output """ option_incomplete = kwds.get('incomplete', False) option_randomize = kwds.get('randomize', False) try: option_seed = kwds['seed'] is not None except KeyError: option_seed = False option_exclude = kwds.get('exclude', ('interactive',)) option_timings = kwds.get('timings', 1) option_show_output = kwds.get('show_output', False) # Incomplete todo_xxx tests if option_incomplete: unittest.TestLoader.testMethodPrefix = ( unittest.TestLoader.testMethodPrefix, 'todo_' ) # Randomizing unittest.TestLoader.randomize_tests = option_randomize or option_seed unittest.TestLoader.getTestCaseNames = getTestCaseNames unittest.TestLoader.exclude = option_exclude # Timing unittest.TestCase.times_run = option_timings unittest.TestCase.run = TestCase_run unittest.TestCase.dot_syntax_name = lambda self: ( "%s.%s"% (self.__class__.__name__, self._testMethodName) ) # Error logging unittest.TestResult.show_redirected_on_errors = option_show_output unittest.TestResult.__init__ = TestResult___init__ unittest.TestResult.addError = errorHandling('errors') unittest.TestResult.addFailure = errorHandling('failures') unittest._TextTestResult.printErrorList = printErrorList ################################################################################ pygame-1.9.1release/test/test_utils/unittest.py0000644000175000017500000007367711225300032021662 0ustar vincentvincent#!/usr/bin/env python ''' Python unit testing framework, based on Erich Gamma's JUnit and Kent Beck's Smalltalk testing framework. This module contains the core framework classes that form the basis of specific test cases and suites (TestCase, TestSuite etc.), and also a text-based utility class for running the tests and reporting the results (TextTestRunner). Simple usage: import unittest class IntegerArithmenticTestCase(unittest.TestCase): def testAdd(self): ## test method names begin 'test*' self.assertEquals((1 + 2), 3) self.assertEquals(0 + 1, 1) def testMultiply(self): self.assertEquals((0 * 10), 0) self.assertEquals((5 * 8), 40) if __name__ == '__main__': unittest.main() Further information is available in the bundled documentation, and from http://pyunit.sourceforge.net/ Copyright (c) 1999-2003 Steve Purcell This module is free software, and you may redistribute it and/or modify it under the same terms as Python itself, so long as this copyright message and disclaimer are retained in their original form. IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. ''' __author__ = "Steve Purcell" __email__ = "stephen_purcell at yahoo dot com" __version__ = "#Revision: 1.63 $"[11:-2] import time import sys import traceback import os import types try: cmp except NameError: def cmp(x, y): """Return -1 if x < y, 0 if x == y and 1 if x > y""" return (x > y) - (x < y) cmp = staticmethod(cmp) try: types.ClassType except AttributeError: class_types = (type,) else: class_types = (type, types.ClassType) try: callable except NameError: def callable(o): try: o.__call__ except AttributeError: return False return True try: basestring except NameError: basestring = str def geterror(): return sys.exc_info()[1] ############################################################################## # Exported classes and functions ############################################################################## __all__ = ['TestResult', 'TestCase', 'TestSuite', 'TextTestRunner', 'TestLoader', 'FunctionTestCase', 'main', 'defaultTestLoader'] # Expose obsolete functions for backwards compatibility __all__.extend(['getTestCaseNames', 'makeSuite', 'findTestCases']) def _sort_using_key(seq, key_func): deco = [ (key_func(word), i, word) for i, word in enumerate(seq) ] deco.sort() new_words = [ word for _, _, word in deco ] return new_words ############################################################################## # Backward compatibility ############################################################################## #if sys.version_info[:2] < (2, 2): # False, True = 0, 1 # def isinstance(obj, clsinfo): # import __builtin__ # if type(clsinfo) in (tuple, list): # for cls in clsinfo: # if cls is type: cls = types.ClassType # if __builtin__.isinstance(obj, cls): # return 1 # return 0 # else: return __builtin__.isinstance(obj, clsinfo) ############################################################################## # Test framework core ############################################################################## # All classes defined herein are 'new-style' classes, allowing use of 'super()' __metaclass__ = type def _strclass(cls): return "%s.%s" % (cls.__module__, cls.__name__) __unittest = 1 class TestResult: """Holder for test result information. Test results are automatically managed by the TestCase and TestSuite classes, and do not need to be explicitly manipulated by writers of tests. Each instance holds the total number of tests run, and collections of failures and errors that occurred among those test runs. The collections contain tuples of (testcase, exceptioninfo), where exceptioninfo is the formatted traceback of the error that occurred. """ def __init__(self): self.failures = [] self.errors = [] self.testsRun = 0 self.shouldStop = 0 def startTest(self, test): "Called when the given test is about to be run" self.testsRun = self.testsRun + 1 def stopTest(self, test): "Called when the given test has been run" pass def addError(self, test, err): """Called when an error has occurred. 'err' is a tuple of values as returned by sys.exc_info(). """ self.errors.append((test, self._exc_info_to_string(err, test))) def addFailure(self, test, err): """Called when an error has occurred. 'err' is a tuple of values as returned by sys.exc_info().""" self.failures.append((test, self._exc_info_to_string(err, test))) def addSuccess(self, test): "Called when a test has completed successfully" pass def wasSuccessful(self): "Tells whether or not this result was a success" return len(self.failures) == len(self.errors) == 0 def stop(self): "Indicates that the tests should be aborted" self.shouldStop = True def _exc_info_to_string(self, err, test): """Converts a sys.exc_info()-style tuple of values into a string.""" exctype, value, tb = err # Skip test runner traceback levels while tb and self._is_relevant_tb_level(tb): tb = tb.tb_next if exctype is test.failureException: # Skip assert*() traceback levels length = self._count_relevant_tb_levels(tb) return ''.join(traceback.format_exception(exctype, value, tb, length)) return ''.join(traceback.format_exception(exctype, value, tb)) def _is_relevant_tb_level(self, tb): return '__unittest' in tb.tb_frame.f_globals def _count_relevant_tb_levels(self, tb): length = 0 while tb and not self._is_relevant_tb_level(tb): length += 1 tb = tb.tb_next return length def __repr__(self): return "<%s run=%i errors=%i failures=%i>" % \ (_strclass(self.__class__), self.testsRun, len(self.errors), len(self.failures)) class TestCase: """A class whose instances are single test cases. By default, the test code itself should be placed in a method named 'runTest'. If the fixture may be used for many test cases, create as many test methods as are needed. When instantiating such a TestCase subclass, specify in the constructor arguments the name of the test method that the instance is to execute. Test authors should subclass TestCase for their own tests. Construction and deconstruction of the test's environment ('fixture') can be implemented by overriding the 'setUp' and 'tearDown' methods respectively. If it is necessary to override the __init__ method, the base class __init__ method must always be called. It is important that subclasses should not change the signature of their __init__ method, since instances of the classes are instantiated automatically by parts of the framework in order to be run. """ # This attribute determines which exception will be raised when # the instance's assertion methods fail; test methods raising this # exception will be deemed to have 'failed' rather than 'errored' failureException = AssertionError def __init__(self, methodName='runTest'): """Create an instance of the class that will use the named test method when executed. Raises a ValueError if the instance does not have a method with the specified name. """ try: self._testMethodName = methodName testMethod = getattr(self, methodName) self._testMethodDoc = testMethod.__doc__ except AttributeError: raise ValueError( "no such test method in %s: %s" % \ (self.__class__, methodName)) def setUp(self): "Hook method for setting up the test fixture before exercising it." pass def tearDown(self): "Hook method for deconstructing the test fixture after testing it." pass def countTestCases(self): return 1 def defaultTestResult(self): return TestResult() def shortDescription(self): """Returns a one-line description of the test, or None if no description has been provided. The default implementation of this method returns the first line of the specified test method's docstring. """ doc = self._testMethodDoc return doc and doc.split("\n")[0].strip() or None def id(self): return "%s.%s" % (_strclass(self.__class__), self._testMethodName) def __str__(self): return "%s (%s)" % (self._testMethodName, _strclass(self.__class__)) def __repr__(self): return "<%s testMethod=%s>" % \ (_strclass(self.__class__), self._testMethodName) def run(self, result=None): if result is None: result = self.defaultTestResult() result.startTest(self) testMethod = getattr(self, self._testMethodName) try: try: self.setUp() except KeyboardInterrupt: raise except: result.addError(self, self._exc_info()) return ok = False try: testMethod() ok = True except self.failureException: result.addFailure(self, self._exc_info()) except KeyboardInterrupt: raise except: result.addError(self, self._exc_info()) try: self.tearDown() except KeyboardInterrupt: raise except: result.addError(self, self._exc_info()) ok = False if ok: result.addSuccess(self) finally: result.stopTest(self) def __call__(self, *args, **kwds): return self.run(*args, **kwds) def debug(self): """Run the test without collecting errors in a TestResult""" self.setUp() getattr(self, self._testMethodName)() self.tearDown() def _exc_info(self): """Return a version of sys.exc_info() with the traceback frame minimised; usually the top level of the traceback frame is not needed. """ exctype, excvalue, tb = sys.exc_info() if sys.platform[:4] == 'java': ## tracebacks look different in Jython return (exctype, excvalue, tb) return (exctype, excvalue, tb) def fail(self, msg=None): """Fail immediately, with the given message.""" raise self.failureException( msg) def failIf(self, expr, msg=None): "Fail the test if the expression is true." if expr: raise self.failureException( msg) def failUnless(self, expr, msg=None): """Fail the test unless the expression is true.""" if not expr: raise self.failureException( msg) def failUnlessRaises(self, excClass, callableObj, *args, **kwargs): """Fail unless an exception of class excClass is thrown by callableObj when invoked with arguments args and keyword arguments kwargs. If a different type of exception is thrown, it will not be caught, and the test case will be deemed to have suffered an error, exactly as for an unexpected exception. """ try: callableObj(*args, **kwargs) except excClass: return else: if hasattr(excClass,'__name__'): excName = excClass.__name__ else: excName = str(excClass) raise self.failureException( "%s not raised" % excName) def failUnlessEqual(self, first, second, msg=None): """Fail if the two objects are unequal as determined by the '==' operator. """ if not first == second: raise self.failureException( (msg or '%r != %r' % (first, second))) def failIfEqual(self, first, second, msg=None): """Fail if the two objects are equal as determined by the '==' operator. """ if first == second: raise self.failureException( (msg or '%r == %r' % (first, second))) def failUnlessAlmostEqual(self, first, second, places=7, msg=None): """Fail if the two objects are unequal as determined by their difference rounded to the given number of decimal places (default 7) and comparing to zero. Note that decimal places (from zero) are usually not the same as significant digits (measured from the most signficant digit). """ if round(second-first, places) != 0: raise self.failureException( (msg or '%r != %r within %r places' % (first, second, places))) def failIfAlmostEqual(self, first, second, places=7, msg=None): """Fail if the two objects are equal as determined by their difference rounded to the given number of decimal places (default 7) and comparing to zero. Note that decimal places (from zero) are usually not the same as significant digits (measured from the most signficant digit). """ if round(second-first, places) == 0: raise self.failureException( (msg or '%r == %r within %r places' % (first, second, places))) # Synonyms for assertion methods assertEqual = assertEquals = failUnlessEqual assertNotEqual = assertNotEquals = failIfEqual assertAlmostEqual = assertAlmostEquals = failUnlessAlmostEqual assertNotAlmostEqual = assertNotAlmostEquals = failIfAlmostEqual assertRaises = failUnlessRaises assert_ = assertTrue = failUnless assertFalse = failIf class TestSuite: """A test suite is a composite test consisting of a number of TestCases. For use, create an instance of TestSuite, then add test case instances. When all tests have been added, the suite can be passed to a test runner, such as TextTestRunner. It will run the individual test cases in the order in which they were added, aggregating the results. When subclassing, do not forget to call the base class constructor. """ def __init__(self, tests=()): self._tests = [] self.addTests(tests) def __repr__(self): return "<%s tests=%s>" % (_strclass(self.__class__), self._tests) __str__ = __repr__ def __iter__(self): return iter(self._tests) def countTestCases(self): cases = 0 for test in self._tests: cases += test.countTestCases() return cases def addTest(self, test): # sanity checks if not callable(test): raise TypeError("the test to add must be callable") if (isinstance(test, class_types) and issubclass(test, (TestCase, TestSuite))): raise TypeError("TestCases and TestSuites must be instantiated " "before passing them to addTest()") self._tests.append(test) def addTests(self, tests): if isinstance(tests, basestring): raise TypeError("tests must be an iterable of tests, not a string") for test in tests: self.addTest(test) def run(self, result): for test in self._tests: if result.shouldStop: break test(result) return result def __call__(self, *args, **kwds): return self.run(*args, **kwds) def debug(self): """Run the tests without collecting errors in a TestResult""" for test in self._tests: test.debug() class FunctionTestCase(TestCase): """A test case that wraps a test function. This is useful for slipping pre-existing test functions into the PyUnit framework. Optionally, set-up and tidy-up functions can be supplied. As with TestCase, the tidy-up ('tearDown') function will always be called if the set-up ('setUp') function ran successfully. """ def __init__(self, testFunc, setUp=None, tearDown=None, description=None): TestCase.__init__(self) self.__setUpFunc = setUp self.__tearDownFunc = tearDown self.__testFunc = testFunc self.__description = description def setUp(self): if self.__setUpFunc is not None: self.__setUpFunc() def tearDown(self): if self.__tearDownFunc is not None: self.__tearDownFunc() def runTest(self): self.__testFunc() def id(self): return self.__testFunc.__name__ def __str__(self): return "%s (%s)" % (_strclass(self.__class__), self.__testFunc.__name__) def __repr__(self): return "<%s testFunc=%s>" % (_strclass(self.__class__), self.__testFunc) def shortDescription(self): if self.__description is not None: return self.__description doc = self.__testFunc.__doc__ return doc and doc.split("\n")[0].strip() or None ############################################################################## # Locating and loading tests ############################################################################## def CmpToKey(mycmp): 'Convert a cmp= function into a key= function' class K(object): def __init__(self, obj, *args): self.obj = obj def __lt__(self, other): return mycmp(self.obj, other.obj) == -1 return K def three_way_cmp(x, y): """Return -1 if x < y, 0 if x == y and 1 if x > y""" return (x > y) - (x < y) class TestLoader: """This class is responsible for loading tests according to various criteria and returning them wrapped in a Test """ testMethodPrefix = 'test' sortTestMethodsUsing = cmp suiteClass = TestSuite def loadTestsFromTestCase(self, testCaseClass): """Return a suite of all tests cases contained in testCaseClass""" if issubclass(testCaseClass, TestSuite): raise TypeError("Test cases should not be derived from TestSuite. Maybe you meant to derive from TestCase?") testCaseNames = self.getTestCaseNames(testCaseClass) if not testCaseNames and hasattr(testCaseClass, 'runTest'): testCaseNames = ['runTest'] return self.suiteClass([testCaseClass(n) for n in testCaseNames]) def loadTestsFromModule(self, module): """Return a suite of all tests cases contained in the given module""" tests = [] for name in dir(module): obj = getattr(module, name) if (isinstance(obj, class_types) and issubclass(obj, TestCase)): tests.append(self.loadTestsFromTestCase(obj)) return self.suiteClass(tests) def loadTestsFromName(self, name, module=None): """Return a suite of all tests cases given a string specifier. The name may resolve either to a module, a test case class, a test method within a test case class, or a callable object which returns a TestCase or TestSuite instance. The method optionally resolves the names relative to a given module. """ parts = name.split('.') if module is None: parts_copy = parts[:] while parts_copy: try: module = __import__('.'.join(parts_copy)) break except ImportError: del parts_copy[-1] if not parts_copy: raise parts = parts[1:] obj = module for part in parts: parent, obj = obj, getattr(obj, part) if type(obj) == types.ModuleType: return self.loadTestsFromModule(obj) elif (isinstance(obj, class_types) and issubclass(obj, TestCase)): return self.loadTestsFromTestCase(obj) elif type(obj) == types.UnboundMethodType: return parent(obj.__name__) elif isinstance(obj, TestSuite): return obj elif callable(obj): test = obj() if not isinstance(test, (TestCase, TestSuite)): raise ValueError( "calling %s returned %s, not a test" % (obj,test)) return test else: raise ValueError( "don't know how to make test from: %s" % obj) def loadTestsFromNames(self, names, module=None): """Return a suite of all tests cases found using the given sequence of string specifiers. See 'loadTestsFromName()'. """ suites = [self.loadTestsFromName(name, module) for name in names] return self.suiteClass(suites) def getTestCaseNames(self, testCaseClass): """Return a sorted sequence of method names found within testCaseClass """ def isTestMethod(attrname, testCaseClass=testCaseClass, prefix=self.testMethodPrefix): return attrname.startswith(prefix) and callable(getattr(testCaseClass, attrname)) testFnNames = list(filter(isTestMethod, dir(testCaseClass))) for baseclass in testCaseClass.__bases__: for testFnName in self.getTestCaseNames(baseclass): if testFnName not in testFnNames: # handle overridden methods testFnNames.append(testFnName) if self.sortTestMethodsUsing: #testFnNames.sort(key=CmpToKey(self.sortTestMethodsUsing)) testFnNames = _sort_using_key(testFnNames, CmpToKey(self.sortTestMethodsUsing)) return testFnNames defaultTestLoader = TestLoader() ############################################################################## # Patches for old functions: these functions should be considered obsolete ############################################################################## def _makeLoader(prefix, sortUsing, suiteClass=None): loader = TestLoader() loader.sortTestMethodsUsing = sortUsing loader.testMethodPrefix = prefix if suiteClass: loader.suiteClass = suiteClass return loader def getTestCaseNames(testCaseClass, prefix, sortUsing=cmp): return _makeLoader(prefix, sortUsing).getTestCaseNames(testCaseClass) def makeSuite(testCaseClass, prefix='test', sortUsing=cmp, suiteClass=TestSuite): return _makeLoader(prefix, sortUsing, suiteClass).loadTestsFromTestCase(testCaseClass) def findTestCases(module, prefix='test', sortUsing=cmp, suiteClass=TestSuite): return _makeLoader(prefix, sortUsing, suiteClass).loadTestsFromModule(module) ############################################################################## # Text UI ############################################################################## class _WritelnDecorator: """Used to decorate file-like objects with a handy 'writeln' method""" def __init__(self,stream): self.stream = stream def __getattr__(self, attr): return getattr(self.stream,attr) def writeln(self, arg=None): if arg: self.write(arg) self.write('\n') # text-mode streams translate to \r\n if needed class _TextTestResult(TestResult): """A test result class that can print formatted text results to a stream. Used by TextTestRunner. """ separator1 = '=' * 70 separator2 = '-' * 70 def __init__(self, stream, descriptions, verbosity): TestResult.__init__(self) self.stream = stream self.showAll = verbosity > 1 self.dots = verbosity == 1 self.descriptions = descriptions def getDescription(self, test): if self.descriptions: return test.shortDescription() or str(test) else: return str(test) def startTest(self, test): TestResult.startTest(self, test) if self.showAll: self.stream.write(self.getDescription(test)) self.stream.write(" ... ") def addSuccess(self, test): TestResult.addSuccess(self, test) if self.showAll: self.stream.writeln("ok") elif self.dots: self.stream.write('.') def addError(self, test, err): TestResult.addError(self, test, err) if self.showAll: self.stream.writeln("ERROR") elif self.dots: self.stream.write('E') def addFailure(self, test, err): TestResult.addFailure(self, test, err) if self.showAll: self.stream.writeln("FAIL") elif self.dots: self.stream.write('F') def printErrors(self): if self.dots or self.showAll: self.stream.writeln() self.printErrorList('ERROR', self.errors) self.printErrorList('FAIL', self.failures) def printErrorList(self, flavour, errors): for test, err in errors: self.stream.writeln(self.separator1) self.stream.writeln("%s: %s" % (flavour, self.getDescription(test))) self.stream.writeln(self.separator2) self.stream.writeln("%s" % err) class TextTestRunner: """A test runner class that displays results in textual form. It prints out the names of tests as they are run, errors as they occur, and a summary of the results at the end of the test run. """ def __init__(self, stream=sys.stderr, descriptions=1, verbosity=1): self.stream = _WritelnDecorator(stream) self.descriptions = descriptions self.verbosity = verbosity def _makeResult(self): return _TextTestResult(self.stream, self.descriptions, self.verbosity) def run(self, test): "Run the given test case or test suite." result = self._makeResult() startTime = time.time() test(result) stopTime = time.time() timeTaken = stopTime - startTime result.printErrors() self.stream.writeln(result.separator2) run = result.testsRun self.stream.writeln("Ran %d test%s in %.3fs" % (run, run != 1 and "s" or "", timeTaken)) self.stream.writeln() if not result.wasSuccessful(): self.stream.write("FAILED (") failed, errored = len(result.failures), len(result.errors) if failed: self.stream.write("failures=%d" % failed) if errored: if failed: self.stream.write(", ") self.stream.write("errors=%d" % errored) self.stream.writeln(")") else: self.stream.writeln("OK") return result ############################################################################## # Facilities for running tests from the command line ############################################################################## class TestProgram: """A command-line program that runs a set of tests; this is primarily for making test modules conveniently executable. """ USAGE = """\ Usage: %(progName)s [options] [test] [...] Options: -h, --help Show this message -v, --verbose Verbose output -q, --quiet Minimal output Examples: %(progName)s - run default set of tests %(progName)s MyTestSuite - run suite 'MyTestSuite' %(progName)s MyTestCase.testSomething - run MyTestCase.testSomething %(progName)s MyTestCase - run all 'test*' test methods in MyTestCase """ def __init__(self, module='__main__', defaultTest=None, argv=None, testRunner=None, testLoader=defaultTestLoader): if type(module) == type(''): self.module = __import__(module) for part in module.split('.')[1:]: self.module = getattr(self.module, part) else: self.module = module if argv is None: argv = sys.argv self.verbosity = 1 self.defaultTest = defaultTest self.testRunner = testRunner self.testLoader = testLoader self.progName = os.path.basename(argv[0]) self.parseArgs(argv) self.runTests() def usageExit(self, msg=None): if msg: print (msg) print (self.USAGE % self.__dict__) sys.exit(2) def parseArgs(self, argv): import getopt try: options, args = getopt.getopt(argv[1:], 'hHvq', ['help','verbose','quiet']) for opt, value in options: if opt in ('-h','-H','--help'): self.usageExit() if opt in ('-q','--quiet'): self.verbosity = 0 if opt in ('-v','--verbose'): self.verbosity = 2 if len(args) == 0 and self.defaultTest is None: self.test = self.testLoader.loadTestsFromModule(self.module) return if len(args) > 0: self.testNames = args else: self.testNames = (self.defaultTest,) self.createTests() except getopt.error: msg = geterror() self.usageExit(msg) def createTests(self): self.test = self.testLoader.loadTestsFromNames(self.testNames, self.module) def runTests(self): if self.testRunner is None: self.testRunner = TextTestRunner(verbosity=self.verbosity) result = self.testRunner.run(self.test) sys.exit(not result.wasSuccessful()) main = TestProgram ############################################################################## # Executing this module from the command line ############################################################################## if __name__ == "__main__": main(module=None) pygame-1.9.1release/test/test_utils/test_runner.py0000644000175000017500000002411711225275646022362 0ustar vincentvincent################################################################################ if __name__ == '__main__': import sys import os pkg_dir = os.path.split(os.path.split(os.path.abspath(__file__))[0])[0] parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils \ import unittest, unittest_patch, import_submodule from pygame.tests.test_utils.unittest_patch import StringIOContents else: from test import test_utils from test.test_utils \ import unittest, unittest_patch, import_submodule from test.test_utils.unittest_patch import StringIOContents import sys import os import re try: import StringIO except ImportError: import io as StringIO import time import optparse from inspect import getdoc, getmembers, isclass from pprint import pformat # from safe_eval import safe_eval as eval ################################################################################ def prepare_test_env(): test_subdir = os.path.split(os.path.split(os.path.abspath(__file__))[0])[0] main_dir = os.path.split(test_subdir)[0] sys.path.insert(0, test_subdir) fake_test_subdir = os.path.join(test_subdir, 'run_tests__tests') return main_dir, test_subdir, fake_test_subdir main_dir, test_subdir, fake_test_subdir = prepare_test_env() ################################################################################ # Set the command line options # # options are shared with run_tests.py so make sure not to conflict # in time more will be added here TAG_PAT = r'-?[a-zA-Z0-9_]+' TAG_RE = re.compile(TAG_PAT) EXCLUDE_RE = re.compile("(%s,?\s*)+$" % (TAG_PAT,)) def exclude_callback(option, opt, value, parser): if EXCLUDE_RE.match(value) is None: raise opt_parser.OptionValueError("%s argument has invalid value" % (opt,)) parser.values.exclude = TAG_RE.findall(value) opt_parser = optparse.OptionParser() opt_parser.add_option ( "-i", "--incomplete", action = 'store_true', help = "fail incomplete tests" ) opt_parser.add_option ( "-n", "--nosubprocess", action = "store_true", help = "run everything in a single process " " (default: use subprocesses)" ) opt_parser.add_option ( "-T", "--timings", type = 'int', default = 1, metavar = 'T', help = "get timings for individual tests.\n" "Run test T times, giving average time") opt_parser.add_option ( "-e", "--exclude", action = 'callback', type = 'string', help = "exclude tests containing any of TAGS", callback = exclude_callback) opt_parser.add_option ( "-w", "--show_output", action = 'store_true', help = "show silenced stderr/stdout on errors" ) opt_parser.add_option ( "-r", "--randomize", action = 'store_true', help = "randomize order of tests" ) opt_parser.add_option ( "-S", "--seed", type = 'int', help = "seed randomizer" ) ################################################################################ # If an xxxx_test.py takes longer than TIME_OUT seconds it will be killed # This is only the default, can be over-ridden on command line TIME_OUT = 30 # DEFAULTS ################################################################################ # Human readable output # COMPLETE_FAILURE_TEMPLATE = """ ====================================================================== ERROR: all_tests_for (%(module)s.AllTestCases) ---------------------------------------------------------------------- Traceback (most recent call last): File "test/%(module)s.py", line 1, in all_tests_for subprocess completely failed with return code of %(return_code)s cmd: %(cmd)s test_env: %(test_env)s working_dir: %(working_dir)s return (top 5 lines): %(raw_return)s """ # Leave that last empty line else build page regex won't match # Text also needs to be vertically compressed RAN_TESTS_DIV = (70 * "-") + "\nRan" DOTS = re.compile("^([FE.]*)$", re.MULTILINE) def combine_results(all_results, t): """ Return pieced together results in a form fit for human consumption. Don't rely on results if piecing together subprocessed results (single process mode is fine). Was originally meant for that purpose but was found to be unreliable. See the dump option for reliable results. """ all_dots = '' failures = [] for module, results in sorted(all_results.items()): output, return_code, raw_return = map ( results.get, ('output','return_code', 'raw_return') ) if not output or (return_code and RAN_TESTS_DIV not in output): # would this effect the original dict? TODO results['raw_return'] = ''.join(raw_return.splitlines(1)[:5]) failures.append( COMPLETE_FAILURE_TEMPLATE % results ) all_dots += 'E' continue dots = DOTS.search(output).group(1) all_dots += dots if 'E' in dots or 'F' in dots: failures.append( output[len(dots)+1:].split(RAN_TESTS_DIV)[0] ) total_fails, total_errors = map(all_dots.count, 'FE') total_tests = len(all_dots) combined = [all_dots] if failures: combined += [''.join(failures).lstrip('\n')[:-1]] combined += ["%s %s tests in %.3fs\n" % (RAN_TESTS_DIV, total_tests, t)] if not failures: combined += ['OK\n'] else: combined += [ 'FAILED (%s)\n' % ', '.join ( (total_fails and ["failures=%s" % total_fails] or []) + (total_errors and ["errors=%s" % total_errors] or []) )] return total_tests, '\n'.join(combined) ################################################################################ TEST_RESULTS_START = "<--!! TEST RESULTS START HERE !!-->" TEST_RESULTS_RE = re.compile('%s\n(.*)' % TEST_RESULTS_START, re.DOTALL | re.M) def get_test_results(raw_return): test_results = TEST_RESULTS_RE.search(raw_return) if test_results: try: return eval(test_results.group(1)) except: print ("BUGGY TEST RESULTS EVAL:\n %s" % test_results.group(1)) raise ################################################################################ # ERRORS # TODO def make_complete_failure_error(result): return ( "ERROR: all_tests_for (%s.AllTestCases)" % result['module'], "Complete Failure (ret code: %s)" % result['return_code'], result['test_file'], '1', ) # For combined results, plural def test_failures(results): errors = {} total = sum([v.get('num_tests', 0) for v in results.values()]) for module, result in results.items(): num_errors = ( len(result.get('failures', [])) + len(result.get('errors', [])) ) if num_errors is 0 and result.get('return_code'): result.update(RESULTS_TEMPLATE) result['errors'].append(make_complete_failure_error(result)) num_errors += 1 total += 1 if num_errors: errors.update({module:result}) return total, errors # def combined_errs(results): # for result in results.values(): # combined_errs = result['errors'] + result['failures'] # for err in combined_errs: # yield err ################################################################################ # For complete failures (+ namespace saving) def from_namespace(ns, template): if isinstance(template, dict): return dict([(i, ns.get(i, template[i])) for i in template]) return dict([(i, ns[i]) for i in template]) RESULTS_TEMPLATE = { 'output' : '', 'num_tests' : 0, 'failures' : [], 'errors' : [], 'tests' : {}, } ################################################################################ def run_test(module, **kwds): """Run a unit test module Recognized keyword arguments: incomplete, nosubprocess """ option_incomplete = kwds.get('incomplete', False) option_nosubprocess = kwds.get('nosubprocess', False) suite = unittest.TestSuite() test_utils.fail_incomplete_tests = option_incomplete m = import_submodule(module) if m.unittest is not unittest: raise ImportError( "%s is not using correct unittest\n\n" % module + "should be: %s\n is using: %s" % (unittest.__file__, m.unittest.__file__) ) print ('loading %s' % module) test = unittest.defaultTestLoader.loadTestsFromName(module) suite.addTest(test) output = StringIO.StringIO() runner = unittest.TextTestRunner(stream=output) results = runner.run(suite) output = StringIOContents(output) num_tests = results.testsRun failures = results.failures errors = results.errors tests = results.tests results = {module:from_namespace(locals(), RESULTS_TEMPLATE)} if not option_nosubprocess: print (TEST_RESULTS_START) print (pformat(results)) else: return results ################################################################################ if __name__ == '__main__': options, args = opt_parser.parse_args() unittest_patch.patch(incomplete=options.incomplete, randomize=options.randomize, seed=options.seed, exclude=options.exclude, timings=options.timings, show_output=options.show_output) if not args: if is_pygame_pkg: run_from = 'pygame.tests.go' else: run_from = os.path.join(main_dir, 'run_tests.py') sys.exit('No test module provided; consider using %s instead' % run_from) run_test(args[0], incomplete=options.incomplete, nosubprocess=options.nosubprocess) ################################################################################ pygame-1.9.1release/test/test_utils/run_tests.py0000644000175000017500000002720711225275646022043 0ustar vincentvincent#################################### IMPORTS ################################## if __name__ == '__main__': import sys sys.exit("This module is for import only") test_pkg_name = '.'.join(__name__.split('.')[0:-2]) is_pygame_pkg = test_pkg_name == 'pygame.tests' if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils \ import unittest, unittest_patch, import_submodule from pygame.tests.test_utils.test_runner \ import prepare_test_env, run_test, combine_results, test_failures, \ get_test_results, from_namespace, TEST_RESULTS_START, \ opt_parser else: from test import test_utils from test.test_utils \ import unittest, unittest_patch, import_submodule from test.test_utils.test_runner \ import prepare_test_env, run_test, combine_results, test_failures, \ get_test_results, from_namespace, TEST_RESULTS_START, \ opt_parser import pygame import pygame.threads import sys import os import re import time import optparse import random from pprint import pformat was_run = False def run(*args, **kwds): """Run the Pygame unit test suite and return (total tests run, fails dict) Positional arguments (optional): The names of tests to include. If omitted then all tests are run. Test names need not include the trailing '_test'. Keyword arguments: incomplete - fail incomplete tests (default False) nosubprocess - run all test suites in the current process (default False, use separate subprocesses) dump - dump failures/errors as dict ready to eval (default False) file - if provided, the name of a file into which to dump failures/errors timings - if provided, the number of times to run each individual test to get an average run time (default is run each test once) exclude - A list of TAG names to exclude from the run. The items may be comma or space separated. show_output - show silenced stderr/stdout on errors (default False) all - dump all results, not just errors (default False) randomize - randomize order of tests (default False) seed - if provided, a seed randomizer integer multi_thread - if provided, the number of THREADS in which to run subprocessed tests time_out - if subprocess is True then the time limit in seconds before killing a test (default 30) fake - if provided, the name of the fake tests package in the run_tests__tests subpackage to run instead of the normal Pygame tests python - the path to a python executable to run subprocessed tests (default sys.executable) interative - allow tests tagged 'interative'. Return value: A tuple of total number of tests run, dictionary of error information. The dictionary is empty if no errors were recorded. By default individual test modules are run in separate subprocesses. This recreates normal Pygame usage where pygame.init() and pygame.quit() are called only once per program execution, and avoids unfortunate interactions between test modules. Also, a time limit is placed on test execution, so frozen tests are killed when there time allotment expired. Use the single process option if threading is not working properly or if tests are taking too long. It is not guaranteed that all tests will pass in single process mode. Tests are run in a randomized order if the randomize argument is True or a seed argument is provided. If no seed integer is provided then the system time is used. Individual test modules may have a corresponding *_tags.py module, defining a __tags__ attribute, a list of tag strings used to selectively omit modules from a run. By default only the 'interactive', 'ignore', and 'subprocess_ignore' tags are ignored. 'interactive' is for modules that take user input, like cdrom_test.py. 'ignore' and 'subprocess_ignore' for for disabling modules for foreground and subprocess modes respectively. These are for disabling tests on optional modules or for experimental modules with known problems. These modules can be run from the console as a Python program. This function can only be called once per Python session. It is not reentrant. """ global was_run if was_run: raise RuntimeError("run() was already called this session") was_run = True options = kwds.copy() option_nosubprocess = options.get('nosubprocess', False) option_dump = options.pop('dump', False) option_file = options.pop('file', None) option_all = options.pop('all', False) option_randomize = options.get('randomize', False) option_seed = options.get('seed', None) option_multi_thread = options.pop('multi_thread', 1) option_time_out = options.pop('time_out', 120) option_fake = options.pop('fake', None) option_python = options.pop('python', sys.executable) option_exclude = options.pop('exclude', ()) option_interactive = options.pop('interactive', False) if not option_interactive and 'interactive' not in option_exclude: option_exclude += ('interactive',) if not option_nosubprocess and 'subprocess_ignore' not in option_exclude: option_exclude += ('subprocess_ignore',) elif 'ignore' not in option_exclude: option_exclude += ('ignore',) if sys.version_info < (3, 0, 0): option_exclude += ('python2_ignore',) else: option_exclude += ('python3_ignore',) main_dir, test_subdir, fake_test_subdir = prepare_test_env() test_runner_py = os.path.join(test_subdir, "test_utils", "test_runner.py") cur_working_dir = os.path.abspath(os.getcwd()) ########################################################################### # Compile a list of test modules. If fake, then compile list of fake # xxxx_test.py from run_tests__tests TEST_MODULE_RE = re.compile('^(.+_test)\.py$') test_mods_pkg_name = test_pkg_name if option_fake is not None: test_mods_pkg_name = '.'.join([test_mods_pkg_name, 'run_tests__tests', option_fake]) test_subdir = os.path.join(fake_test_subdir, option_fake) working_dir = test_subdir else: working_dir = main_dir # Added in because some machines will need os.environ else there will be # false failures in subprocess mode. Same issue as python2.6. Needs some # env vars. test_env = os.environ fmt1 = '%s.%%s' % test_mods_pkg_name fmt2 = '%s.%%s_test' % test_mods_pkg_name if args: test_modules = [ m.endswith('_test') and (fmt1 % m) or (fmt2 % m) for m in args ] else: test_modules = [] for f in sorted(os.listdir(test_subdir)): for match in TEST_MODULE_RE.findall(f): test_modules.append(fmt1 % (match,)) ########################################################################### # Remove modules to be excluded. tmp = test_modules test_modules = [] for name in tmp: tag_module_name = "%s_tags" % (name[0:-5],) try: tag_module = import_submodule(tag_module_name) except ImportError: test_modules.append(name) else: try: tags = tag_module.__tags__ except AttributeError: print ("%s has no tags: ignoring" % (tag_module_name,)) test_module.append(name) else: for tag in tags: if tag in option_exclude: print ("skipping %s (tag '%s')" % (name, tag)) break else: test_modules.append(name) del tmp, tag_module_name, name ########################################################################### # Meta results results = {} meta_results = {'__meta__' : {}} meta = meta_results['__meta__'] ########################################################################### # Randomization if option_randomize or option_seed is not None: if option_seed is None: option_seed = time.time() meta['random_seed'] = option_seed print ("\nRANDOM SEED USED: %s\n" % option_seed) random.seed(option_seed) random.shuffle(test_modules) ########################################################################### # Single process mode if option_nosubprocess: unittest_patch.patch(**options) options['exclude'] = option_exclude t = time.time() for module in test_modules: results.update(run_test(module, **options)) t = time.time() - t ########################################################################### # Subprocess mode # if not option_nosubprocess: if is_pygame_pkg: from pygame.tests.test_utils.async_sub import proc_in_time_or_kill else: from test.test_utils.async_sub import proc_in_time_or_kill pass_on_args = ['--exclude', ','.join(option_exclude)] for option in ['timings', 'seed']: value = options.pop(option, None) if value is not None: pass_on_args.append('--%s' % option) pass_on_args.append(str(value)) for option, value in options.items(): if value: pass_on_args.append('--%s' % option) def sub_test(module): print ('loading %s' % module) cmd = [option_python, test_runner_py, module ] + pass_on_args return (module, (cmd, test_env, working_dir), proc_in_time_or_kill(cmd, option_time_out, env=test_env, wd=working_dir)) if option_multi_thread > 1: def tmap(f, args): return pygame.threads.tmap ( f, args, stop_on_error = False, num_workers = option_multi_thread ) else: tmap = map t = time.time() for module, cmd, (return_code, raw_return) in tmap(sub_test, test_modules): test_file = '%s.py' % os.path.join(test_subdir, module) cmd, test_env, working_dir = cmd test_results = get_test_results(raw_return) if test_results: results.update(test_results) else: results[module] = {} add_to_results = [ 'return_code', 'raw_return', 'cmd', 'test_file', 'test_env', 'working_dir', 'module', ] results[module].update(from_namespace(locals(), add_to_results)) t = time.time() - t ########################################################################### # Output Results # untrusty_total, combined = combine_results(results, t) total, fails = test_failures(results) meta['total_tests'] = total meta['combined'] = combined results.update(meta_results) if option_nosubprocess: assert total == untrusty_total if not option_dump: print (combined) else: results = option_all and results or fails print (TEST_RESULTS_START) print (pformat(results)) if option_file is not None: results_file = open(option_file, 'w') try: results_file.write(pformat(results)) finally: results_file.close() return total, fails ############################################################################### pygame-1.9.1release/test/test_utils/async_sub.py0000644000175000017500000002404711227710366021775 0ustar vincentvincent################################################################################ """ Modification of http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440554 """ #################################### IMPORTS ################################### import os import subprocess import errno import time import sys import unittest import tempfile def geterror (): return sys.exc_info()[1] if subprocess.mswindows: if sys.version_info >= (3,): # Test date should be in ascii. def encode(s): return s.encode('ascii') def decode(b): return b.decode('ascii') else: # Strings only; do nothing def encode(s): return s def decode(b): return b try: import ctypes from ctypes.wintypes import DWORD kernel32 = ctypes.windll.kernel32 TerminateProcess = ctypes.windll.kernel32.TerminateProcess def WriteFile(handle, data, ol = None): c_written = DWORD() success = ctypes.windll.kernel32.WriteFile(handle, ctypes.create_string_buffer(encode(data)), len(data), ctypes.byref(c_written), ol) return ctypes.windll.kernel32.GetLastError(), c_written.value def ReadFile(handle, desired_bytes, ol = None): c_read = DWORD() buffer = ctypes.create_string_buffer(desired_bytes+1) success = ctypes.windll.kernel32.ReadFile(handle, buffer, desired_bytes, ctypes.byref(c_read), ol) buffer[c_read.value] = '\0' return ctypes.windll.kernel32.GetLastError(), decode(buffer.value) def PeekNamedPipe(handle, desired_bytes): c_avail = DWORD() c_message = DWORD() if desired_bytes > 0: c_read = DWORD() buffer = ctypes.create_string_buffer(desired_bytes+1) success = ctypes.windll.kernel32.PeekNamedPipe(handle, buffer, desired_bytes, ctypes.byref(c_read), ctypes.byref(c_avail), ctypes.byref(c_message)) buffer[c_read.value] = '\0' return decode(buffer.value), c_avail.value, c_message.value else: success = ctypes.windll.kernel32.PeekNamedPipe(handle, None, desired_bytes, None, ctypes.byref(c_avail), ctypes.byref(c_message)) return "", c_avail.value, c_message.value except ImportError: from win32file import ReadFile, WriteFile, TerminateProcess from win32pipe import PeekNamedPipe from win32api import TerminateProcess import msvcrt else: from signal import SIGINT, SIGTERM, SIGKILL import select import fcntl ################################### CONSTANTS ################################## PIPE = subprocess.PIPE ################################################################################ class Popen(subprocess.Popen): def recv(self, maxsize=None): return self._recv('stdout', maxsize) def recv_err(self, maxsize=None): return self._recv('stderr', maxsize) def send_recv(self, input='', maxsize=None): return self.send(input), self.recv(maxsize), self.recv_err(maxsize) def read_async(self, wait=.1, e=1, tr=5, stderr=0): if tr < 1: tr = 1 x = time.time()+ wait y = [] r = '' pr = self.recv if stderr: pr = self.recv_err while time.time() < x or r: r = pr() if r is None: if e: raise Exception("Other end disconnected!") else: break elif r: y.append(r) else: time.sleep(max((x-time.time())/tr, 0)) return ''.join(y) def send_all(self, data): while len(data): sent = self.send(data) if sent is None: raise Exception("Other end disconnected!") data = buffer(data, sent) def get_conn_maxsize(self, which, maxsize): if maxsize is None: maxsize = 1024 elif maxsize < 1: maxsize = 1 return getattr(self, which), maxsize def _close(self, which): getattr(self, which).close() setattr(self, which, None) if subprocess.mswindows: def kill(self): # Recipes #http://me.in-berlin.de/doc/python/faq/windows.html#how-do-i-emulate-os-kill-in-windows #http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/347462 """kill function for Win32""" TerminateProcess(int(self._handle), 0) # returns None def send(self, input): if not self.stdin: return None try: x = msvcrt.get_osfhandle(self.stdin.fileno()) (errCode, written) = WriteFile(x, input) except ValueError: return self._close('stdin') except (subprocess.pywintypes.error, Exception): if geterror()[0] in (109, errno.ESHUTDOWN): return self._close('stdin') raise return written def _recv(self, which, maxsize): conn, maxsize = self.get_conn_maxsize(which, maxsize) if conn is None: return None try: x = msvcrt.get_osfhandle(conn.fileno()) (read, nAvail, nMessage) = PeekNamedPipe(x, 0) if maxsize < nAvail: nAvail = maxsize if nAvail > 0: (errCode, read) = ReadFile(x, nAvail, None) except ValueError: return self._close(which) except (subprocess.pywintypes.error, Exception): if geterror()[0] in (109, errno.ESHUTDOWN): return self._close(which) raise if self.universal_newlines: # Translate newlines. For Python 3.x assume read is text. # If bytes then another solution is needed. read = read.replace("\r\n", "\n").replace("\r", "\n") return read else: def kill(self): for i, sig in enumerate([SIGTERM, SIGKILL] * 2): if i % 2 == 0: os.kill(self.pid, sig) time.sleep((i * (i % 2) / 5.0) + 0.01) killed_pid, stat = os.waitpid(self.pid, os.WNOHANG) if killed_pid != 0: return def send(self, input): if not self.stdin: return None if not select.select([], [self.stdin], [], 0)[1]: return 0 try: written = os.write(self.stdin.fileno(), input) except OSError: if geterror()[0] == errno.EPIPE: #broken pipe return self._close('stdin') raise return written def _recv(self, which, maxsize): conn, maxsize = self.get_conn_maxsize(which, maxsize) if conn is None: return None flags = fcntl.fcntl(conn, fcntl.F_GETFL) if not conn.closed: fcntl.fcntl(conn, fcntl.F_SETFL, flags| os.O_NONBLOCK) try: if not select.select([conn], [], [], 0)[0]: return '' r = conn.read(maxsize) if not r: return self._close(which) if self.universal_newlines: r = r.replace("\r\n", "\n").replace("\r", "\n") return r finally: if not conn.closed: fcntl.fcntl(conn, fcntl.F_SETFL, flags) ################################################################################ def proc_in_time_or_kill(cmd, time_out, wd = None, env = None): proc = Popen ( cmd, cwd = wd, env = env, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.STDOUT, universal_newlines = 1 ) ret_code = None response = [] t = time.time() while ret_code is None and ((time.time() -t) < time_out): ret_code = proc.poll() response += [proc.read_async(wait=0.1, e=0)] if ret_code is None: ret_code = '"Process timed out (time_out = %s secs) ' % time_out try: proc.kill() ret_code += 'and was successfully terminated"' except Exception: ret_code += ('and termination failed (exception: %s)"' % (geterror(),)) return ret_code, ''.join(response) ################################################################################ class AsyncTest(unittest.TestCase): def test_proc_in_time_or_kill(self): ret_code, response = proc_in_time_or_kill( [sys.executable, '-c', 'while 1: pass'], time_out = 1 ) self.assert_( 'rocess timed out' in ret_code ) self.assert_( 'successfully terminated' in ret_code ) ################################################################################ def _example(): if sys.platform == 'win32': shell, commands, tail = ('cmd', ('echo "hello"', 'echo "HELLO WORLD"'), '\r\n') else: shell, commands, tail = ('sh', ('ls', 'echo HELLO WORLD'), '\n') a = Popen(shell, stdin=PIPE, stdout=PIPE) sys.stdout.write(a.read_async()) sys.stdout.write(" ") for cmd in commands: a.send_all(cmd + tail) sys.stdout.write(a.read_async()) sys.stdout.write(" ") a.send_all('exit' + tail) print (a.read_async(e=0)) a.wait() ################################################################################ if __name__ == '__main__': if 1: unittest.main() else: _example() pygame-1.9.1release/test/test_utils/__init__.py0000644000175000017500000001364311225275646021553 0ustar vincentvincent#################################### IMPORTS ################################### is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests.test_utils import unittest else: from test.test_utils import unittest import tempfile, sys, pygame, time, os ################################################################################ # Python 3.x compatibility try: xrange_ = xrange except NameError: xrange_ = range try: raw_input_ = raw_input except NameError: raw_input_ = input def geterror(): return sys.exc_info()[1] ################################################################################ this_dir = os.path.dirname(os.path.abspath(__file__)) trunk_dir = os.path.split(os.path.split(this_dir)[0])[0] if is_pygame_pkg: test_module = 'tests' else: test_module = 'test' def trunk_relative_path(relative): return os.path.normpath(os.path.join(trunk_dir, relative)) def fixture_path(path): return trunk_relative_path(os.path.join(test_module, 'fixtures', path)) def example_path(path): return trunk_relative_path(os.path.join('examples', path)) sys.path.insert(0, trunk_relative_path('.')) ############################### INCOMPLETE TESTS ############################### # TODO: PHASE THIS OUT # Just prefix TODO test names with todo_. # eg def todo_test_sanity__is_overrated(self): self.fail() # Change test loader to load test_ and todo_ TestCase callables as tests fail_incomplete_tests = 0 def test_not_implemented(): return not fail_incomplete_tests ################################## TEMP FILES ################################## def get_tmp_dir(): return tempfile.mkdtemp() ################################################################################ def question(q): return raw_input_('%s ' % q.rstrip(' ')).lower().strip() == 'y' def prompt(p): return raw_input_('%s (and press enter to continue) ' % p.rstrip(' ')) #################################### HELPERS ################################### def rgba_between(value, minimum=0, maximum=255): if value < minimum: return minimum elif value > maximum: return maximum else: return value def combinations(seqs): """ Recipe 496807 from ActiveState Python CookBook Non recursive technique for getting all possible combinations of a sequence of sequences. """ r=[[]] for x in seqs: r = [ i + [y] for y in x for i in r ] return r def gradient(width, height): """ Yields a pt and corresponding RGBA tuple, for every (width, height) combo. Useful for generating gradients. Actual gradient may be changed, no tests rely on specific values. Used in transform.rotate lossless tests to generate a fixture. """ for l in xrange_(width): for t in xrange_(height): yield (l,t), tuple(map(rgba_between, (l, t, l, l+t))) def unordered_equality(seq1, seq2): """ Tests to see if the contents of one sequence is contained in the other and that they are of the same length. """ if len(seq1) != len(seq2): return False # if isinstance(seq1, dict) and isinstance(seq2, dict): # seq1 = seq1.items() # seq2 = seq2.items() for val in seq1: if val not in seq2: return False return True def rect_area_pts(rect): for l in xrange_(rect.left, rect.right): for t in xrange_(rect.top, rect.bottom): yield l, t def rect_perimeter_pts(rect): """ Returns pts ((L, T) tuples) encompassing the perimeter of a rect. The order is clockwise: topleft to topright topright to bottomright bottomright to bottomleft bottomleft to topleft Duplicate pts are not returned """ clock_wise_from_top_left = ( [(l, rect.top) for l in xrange_(rect.left, rect.right) ], [(rect.right -1, t) for t in xrange_(rect.top + 1, rect.bottom) ], [(l, rect.bottom -1) for l in xrange_(rect.right -2, rect.left -1, -1)], [(rect.left, t) for t in xrange_(rect.bottom -2, rect.top, -1)] ) for line in clock_wise_from_top_left: for pt in line: yield pt def rect_outer_bounds(rect): """ Returns topleft outerbound if possible and then the other pts, that are "exclusive" bounds of the rect ?------O |RECT| ?|0)uterbound |----| O O """ return ( (rect.left is not 0 and [(rect.left-1, rect.top)] or []) + [ rect.topright, rect.bottomleft, rect.bottomright] ) def import_submodule(module): m = __import__(module) for n in module.split('.')[1:]: m = getattr(m, n) return m def test(): """ Lightweight test for helpers """ r = pygame.Rect(0, 0, 10, 10) assert ( rect_outer_bounds ( r ) == [(10, 0), # tr ( 0, 10), # bl (10, 10)] # br ) assert len(list(rect_area_pts(r))) == 100 r = pygame.Rect(0, 0, 3, 3) assert list(rect_perimeter_pts(r)) == [ (0, 0), (1, 0), (2, 0), # tl -> tr (2, 1), (2, 2), # tr -> br (1, 2), (0, 2), # br -> bl (0, 1) # bl -> tl ] if is_pygame_pkg: module = 'pygame.tests.test_utils.unittest' else: module = 'test.test_utils.unittest' assert import_submodule(module) is unittest print ('Tests: OK') ################################################################################ pygame-1.9.1release/test/run_tests__tests/run_tests__test.py0000644000175000017500000001071311207055754024437 0ustar vincentvincent################################################################################ import subprocess, os, sys, re, difflib ################################################################################ IGNORE = ( '.svn', 'infinite_loop', ) NORMALIZERS = ( (r"Ran (\d+) tests in (\d+\.\d+)s", "Ran \\1 tests in X.XXXs" ), (r'File ".*?([^/\\.]+\.py)"', 'File "\\1"'), ) ################################################################################ def norm_result(result): "normalize differences, such as timing between output" for normalizer, replacement in NORMALIZERS: if hasattr(normalizer, '__call__'): result = normalizer(result) else: result = re.sub(normalizer, replacement, result) return result def call_proc(cmd, cd=None): proc = subprocess.Popen ( cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd = cd, universal_newlines = True, ) if proc.wait(): print ("%s %s" % (cmd, proc.wait())) raise Exception(proc.stdout.read()) return proc.stdout.read() ################################################################################ unnormed_diff = '-u' in sys.argv verbose = '-v' in sys.argv or unnormed_diff if '-h' in sys.argv or '--help' in sys.argv: sys.exit ( "\nCOMPARES OUTPUT OF SINGLE VS SUBPROCESS MODE OF RUN_TESTS.PY\n\n" '-v, to output diffs even on success\n' '-u, to output diffs of unnormalized tests\n\n' "Each line of a Differ delta begins with a two-letter code:\n\n" " '- ' line unique to sequence 1\n" " '+ ' line unique to sequence 2\n" " ' ' line common to both sequences\n" " '? ' line not present in either input sequence\n" ) main_dir = os.path.split(os.path.abspath(sys.argv[0]))[0] trunk_dir = os.path.normpath(os.path.join(main_dir, '../../')) test_suite_dirs = [x for x in os.listdir(main_dir) if os.path.isdir(os.path.join(main_dir, x)) and x not in IGNORE ] ################################################################################ def assert_on_results(suite, single, sub): test = globals().get('%s_test' % suite) if hasattr(test, '__call_'): test(suite, single, sub) print ("assertions on %s OK" % (suite,)) def incomplete_test(suite, *args): for results in args: assert 'self.assert_(test_utils.test_not_implemented())' in results # Don't modify tests in suites below. These assertions are in place to make sure # that tests are actually being ran def all_ok_test(uite, *args): for results in args: assert "Ran 36 tests" in results # some tests are runing assert "OK" in results # OK def failures1_test(suite, *args): for results in args: assert "FAILED (failures=2)" in results assert "Ran 18 tests" in results ################################################################################ # Test that output is the same in single process and subprocess modes # base_cmd = [sys.executable, 'run_tests.py', '-i'] cmd = base_cmd + ['-n', '-f'] sub_cmd = base_cmd + ['-f'] time_out_cmd = base_cmd + ['-t', '4', '-f', 'infinite_loop' ] passes = 0 failed = False for suite in test_suite_dirs: single = call_proc(cmd + [suite], trunk_dir) subs = call_proc(sub_cmd + [suite], trunk_dir) normed_single, normed_subs = map(norm_result,(single, subs)) failed = normed_single != normed_subs if failed: print ('%s suite comparison FAILED\n' % (suite,)) else: passes += 1 print ('%s suite comparison OK' % (suite,)) assert_on_results(suite, single, subs) if verbose or failed: print ("difflib.Differ().compare(single, suprocessed):\n") print (''.join ( list( difflib.Differ().compare ( (unnormed_diff and single or normed_single).splitlines(1), (unnormed_diff and subs or normed_subs).splitlines(1) )) )) sys.stdout.write("infinite_loop suite (subprocess mode timeout) ") loop_test = call_proc(time_out_cmd, trunk_dir) assert "successfully terminated" in loop_test passes += 1 print ("OK") print ("\n%s/%s suites pass" % (passes, len(test_suite_dirs) + 1)) print ("\n-h for help") ################################################################################ pygame-1.9.1release/test/run_tests__tests/__init__.py0000644000175000017500000000001011207055754022737 0ustar vincentvincent# empty pygame-1.9.1release/src/SDL_gfx/SDL_gfxPrimitives_font.h0000644000175000017500000017653311167703133023102 0ustar vincentvincent /* ---- 8x8 font definition ---- */ /* LGPL (c) A. Schiffler */ #define GFX_FONTDATAMAX (8*256) static unsigned char gfxPrimitivesFontdata[GFX_FONTDATAMAX] = { /* * 0 0x00 '^@' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 1 0x01 '^A' */ 0x7e, /* 01111110 */ 0x81, /* 10000001 */ 0xa5, /* 10100101 */ 0x81, /* 10000001 */ 0xbd, /* 10111101 */ 0x99, /* 10011001 */ 0x81, /* 10000001 */ 0x7e, /* 01111110 */ /* * 2 0x02 '^B' */ 0x7e, /* 01111110 */ 0xff, /* 11111111 */ 0xdb, /* 11011011 */ 0xff, /* 11111111 */ 0xc3, /* 11000011 */ 0xe7, /* 11100111 */ 0xff, /* 11111111 */ 0x7e, /* 01111110 */ /* * 3 0x03 '^C' */ 0x6c, /* 01101100 */ 0xfe, /* 11111110 */ 0xfe, /* 11111110 */ 0xfe, /* 11111110 */ 0x7c, /* 01111100 */ 0x38, /* 00111000 */ 0x10, /* 00010000 */ 0x00, /* 00000000 */ /* * 4 0x04 '^D' */ 0x10, /* 00010000 */ 0x38, /* 00111000 */ 0x7c, /* 01111100 */ 0xfe, /* 11111110 */ 0x7c, /* 01111100 */ 0x38, /* 00111000 */ 0x10, /* 00010000 */ 0x00, /* 00000000 */ /* * 5 0x05 '^E' */ 0x38, /* 00111000 */ 0x7c, /* 01111100 */ 0x38, /* 00111000 */ 0xfe, /* 11111110 */ 0xfe, /* 11111110 */ 0xd6, /* 11010110 */ 0x10, /* 00010000 */ 0x38, /* 00111000 */ /* * 6 0x06 '^F' */ 0x10, /* 00010000 */ 0x38, /* 00111000 */ 0x7c, /* 01111100 */ 0xfe, /* 11111110 */ 0xfe, /* 11111110 */ 0x7c, /* 01111100 */ 0x10, /* 00010000 */ 0x38, /* 00111000 */ /* * 7 0x07 '^G' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 8 0x08 '^H' */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xe7, /* 11100111 */ 0xc3, /* 11000011 */ 0xc3, /* 11000011 */ 0xe7, /* 11100111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ /* * 9 0x09 '^I' */ 0x00, /* 00000000 */ 0x3c, /* 00111100 */ 0x66, /* 01100110 */ 0x42, /* 01000010 */ 0x42, /* 01000010 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* * 10 0x0a '^J' */ 0xff, /* 11111111 */ 0xc3, /* 11000011 */ 0x99, /* 10011001 */ 0xbd, /* 10111101 */ 0xbd, /* 10111101 */ 0x99, /* 10011001 */ 0xc3, /* 11000011 */ 0xff, /* 11111111 */ /* * 11 0x0b '^K' */ 0x0f, /* 00001111 */ 0x07, /* 00000111 */ 0x0f, /* 00001111 */ 0x7d, /* 01111101 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0x78, /* 01111000 */ /* * 12 0x0c '^L' */ 0x3c, /* 00111100 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ /* * 13 0x0d '^M' */ 0x3f, /* 00111111 */ 0x33, /* 00110011 */ 0x3f, /* 00111111 */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x70, /* 01110000 */ 0xf0, /* 11110000 */ 0xe0, /* 11100000 */ /* * 14 0x0e '^N' */ 0x7f, /* 01111111 */ 0x63, /* 01100011 */ 0x7f, /* 01111111 */ 0x63, /* 01100011 */ 0x63, /* 01100011 */ 0x67, /* 01100111 */ 0xe6, /* 11100110 */ 0xc0, /* 11000000 */ /* * 15 0x0f '^O' */ 0x18, /* 00011000 */ 0xdb, /* 11011011 */ 0x3c, /* 00111100 */ 0xe7, /* 11100111 */ 0xe7, /* 11100111 */ 0x3c, /* 00111100 */ 0xdb, /* 11011011 */ 0x18, /* 00011000 */ /* * 16 0x10 '^P' */ 0x80, /* 10000000 */ 0xe0, /* 11100000 */ 0xf8, /* 11111000 */ 0xfe, /* 11111110 */ 0xf8, /* 11111000 */ 0xe0, /* 11100000 */ 0x80, /* 10000000 */ 0x00, /* 00000000 */ /* * 17 0x11 '^Q' */ 0x02, /* 00000010 */ 0x0e, /* 00001110 */ 0x3e, /* 00111110 */ 0xfe, /* 11111110 */ 0x3e, /* 00111110 */ 0x0e, /* 00001110 */ 0x02, /* 00000010 */ 0x00, /* 00000000 */ /* * 18 0x12 '^R' */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ /* * 19 0x13 '^S' */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x00, /* 00000000 */ 0x66, /* 01100110 */ 0x00, /* 00000000 */ /* * 20 0x14 '^T' */ 0x7f, /* 01111111 */ 0xdb, /* 11011011 */ 0xdb, /* 11011011 */ 0x7b, /* 01111011 */ 0x1b, /* 00011011 */ 0x1b, /* 00011011 */ 0x1b, /* 00011011 */ 0x00, /* 00000000 */ /* * 21 0x15 '^U' */ 0x3e, /* 00111110 */ 0x61, /* 01100001 */ 0x3c, /* 00111100 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0x86, /* 10000110 */ 0x7c, /* 01111100 */ /* * 22 0x16 '^V' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x7e, /* 01111110 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ /* * 23 0x17 '^W' */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0xff, /* 11111111 */ /* * 24 0x18 '^X' */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* * 25 0x19 '^Y' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* * 26 0x1a '^Z' */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0xfe, /* 11111110 */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 27 0x1b '^[' */ 0x00, /* 00000000 */ 0x30, /* 00110000 */ 0x60, /* 01100000 */ 0xfe, /* 11111110 */ 0x60, /* 01100000 */ 0x30, /* 00110000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 28 0x1c '^\' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 29 0x1d '^]' */ 0x00, /* 00000000 */ 0x24, /* 00100100 */ 0x66, /* 01100110 */ 0xff, /* 11111111 */ 0x66, /* 01100110 */ 0x24, /* 00100100 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 30 0x1e '^^' */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x7e, /* 01111110 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 31 0x1f '^_' */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0x7e, /* 01111110 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 32 0x20 ' ' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 33 0x21 '!' */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* * 34 0x22 '"' */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x24, /* 00100100 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 35 0x23 '#' */ 0x6c, /* 01101100 */ 0x6c, /* 01101100 */ 0xfe, /* 11111110 */ 0x6c, /* 01101100 */ 0xfe, /* 11111110 */ 0x6c, /* 01101100 */ 0x6c, /* 01101100 */ 0x00, /* 00000000 */ /* * 36 0x24 '$' */ 0x18, /* 00011000 */ 0x3e, /* 00111110 */ 0x60, /* 01100000 */ 0x3c, /* 00111100 */ 0x06, /* 00000110 */ 0x7c, /* 01111100 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* * 37 0x25 '%' */ 0x00, /* 00000000 */ 0xc6, /* 11000110 */ 0xcc, /* 11001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x66, /* 01100110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* * 38 0x26 '&' */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0x38, /* 00111000 */ 0x76, /* 01110110 */ 0xdc, /* 11011100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* * 39 0x27 ''' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 40 0x28 '(' */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0x00, /* 00000000 */ /* * 41 0x29 ')' */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0x0c, /* 00001100 */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x00, /* 00000000 */ /* * 42 0x2a '*' */ 0x00, /* 00000000 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0xff, /* 11111111 */ 0x3c, /* 00111100 */ 0x66, /* 01100110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 43 0x2b '+' */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 44 0x2c ',' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ /* * 45 0x2d '-' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 46 0x2e '.' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* * 47 0x2f '/' */ 0x06, /* 00000110 */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x60, /* 01100000 */ 0xc0, /* 11000000 */ 0x80, /* 10000000 */ 0x00, /* 00000000 */ /* * 48 0x30 '0' */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0xc6, /* 11000110 */ 0xd6, /* 11010110 */ 0xc6, /* 11000110 */ 0x6c, /* 01101100 */ 0x38, /* 00111000 */ 0x00, /* 00000000 */ /* * 49 0x31 '1' */ 0x18, /* 00011000 */ 0x38, /* 00111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ /* * 50 0x32 '2' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0x06, /* 00000110 */ 0x1c, /* 00011100 */ 0x30, /* 00110000 */ 0x66, /* 01100110 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ /* * 51 0x33 '3' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0x06, /* 00000110 */ 0x3c, /* 00111100 */ 0x06, /* 00000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* * 52 0x34 '4' */ 0x1c, /* 00011100 */ 0x3c, /* 00111100 */ 0x6c, /* 01101100 */ 0xcc, /* 11001100 */ 0xfe, /* 11111110 */ 0x0c, /* 00001100 */ 0x1e, /* 00011110 */ 0x00, /* 00000000 */ /* * 53 0x35 '5' */ 0xfe, /* 11111110 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xfc, /* 11111100 */ 0x06, /* 00000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* * 54 0x36 '6' */ 0x38, /* 00111000 */ 0x60, /* 01100000 */ 0xc0, /* 11000000 */ 0xfc, /* 11111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* * 55 0x37 '7' */ 0xfe, /* 11111110 */ 0xc6, /* 11000110 */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x00, /* 00000000 */ /* * 56 0x38 '8' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* * 57 0x39 '9' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7e, /* 01111110 */ 0x06, /* 00000110 */ 0x0c, /* 00001100 */ 0x78, /* 01111000 */ 0x00, /* 00000000 */ /* * 58 0x3a ':' */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* * 59 0x3b ';' */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ /* * 60 0x3c '<' */ 0x06, /* 00000110 */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0x06, /* 00000110 */ 0x00, /* 00000000 */ /* * 61 0x3d '=' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 62 0x3e '>' */ 0x60, /* 01100000 */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x60, /* 01100000 */ 0x00, /* 00000000 */ /* * 63 0x3f '?' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* * 64 0x40 '@' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xde, /* 11011110 */ 0xde, /* 11011110 */ 0xde, /* 11011110 */ 0xc0, /* 11000000 */ 0x78, /* 01111000 */ 0x00, /* 00000000 */ /* * 65 0x41 'A' */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* * 66 0x42 'B' */ 0xfc, /* 11111100 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x7c, /* 01111100 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0xfc, /* 11111100 */ 0x00, /* 00000000 */ /* * 67 0x43 'C' */ 0x3c, /* 00111100 */ 0x66, /* 01100110 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* * 68 0x44 'D' */ 0xf8, /* 11111000 */ 0x6c, /* 01101100 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x6c, /* 01101100 */ 0xf8, /* 11111000 */ 0x00, /* 00000000 */ /* * 69 0x45 'E' */ 0xfe, /* 11111110 */ 0x62, /* 01100010 */ 0x68, /* 01101000 */ 0x78, /* 01111000 */ 0x68, /* 01101000 */ 0x62, /* 01100010 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ /* * 70 0x46 'F' */ 0xfe, /* 11111110 */ 0x62, /* 01100010 */ 0x68, /* 01101000 */ 0x78, /* 01111000 */ 0x68, /* 01101000 */ 0x60, /* 01100000 */ 0xf0, /* 11110000 */ 0x00, /* 00000000 */ /* * 71 0x47 'G' */ 0x3c, /* 00111100 */ 0x66, /* 01100110 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xce, /* 11001110 */ 0x66, /* 01100110 */ 0x3a, /* 00111010 */ 0x00, /* 00000000 */ /* * 72 0x48 'H' */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* * 73 0x49 'I' */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* * 74 0x4a 'J' */ 0x1e, /* 00011110 */ 0x0c, /* 00001100 */ 0x0c, /* 00001100 */ 0x0c, /* 00001100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0x78, /* 01111000 */ 0x00, /* 00000000 */ /* * 75 0x4b 'K' */ 0xe6, /* 11100110 */ 0x66, /* 01100110 */ 0x6c, /* 01101100 */ 0x78, /* 01111000 */ 0x6c, /* 01101100 */ 0x66, /* 01100110 */ 0xe6, /* 11100110 */ 0x00, /* 00000000 */ /* * 76 0x4c 'L' */ 0xf0, /* 11110000 */ 0x60, /* 01100000 */ 0x60, /* 01100000 */ 0x60, /* 01100000 */ 0x62, /* 01100010 */ 0x66, /* 01100110 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ /* * 77 0x4d 'M' */ 0xc6, /* 11000110 */ 0xee, /* 11101110 */ 0xfe, /* 11111110 */ 0xfe, /* 11111110 */ 0xd6, /* 11010110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* * 78 0x4e 'N' */ 0xc6, /* 11000110 */ 0xe6, /* 11100110 */ 0xf6, /* 11110110 */ 0xde, /* 11011110 */ 0xce, /* 11001110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* * 79 0x4f 'O' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* * 80 0x50 'P' */ 0xfc, /* 11111100 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x7c, /* 01111100 */ 0x60, /* 01100000 */ 0x60, /* 01100000 */ 0xf0, /* 11110000 */ 0x00, /* 00000000 */ /* * 81 0x51 'Q' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xce, /* 11001110 */ 0x7c, /* 01111100 */ 0x0e, /* 00001110 */ /* * 82 0x52 'R' */ 0xfc, /* 11111100 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x7c, /* 01111100 */ 0x6c, /* 01101100 */ 0x66, /* 01100110 */ 0xe6, /* 11100110 */ 0x00, /* 00000000 */ /* * 83 0x53 'S' */ 0x3c, /* 00111100 */ 0x66, /* 01100110 */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* * 84 0x54 'T' */ 0x7e, /* 01111110 */ 0x7e, /* 01111110 */ 0x5a, /* 01011010 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* * 85 0x55 'U' */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* * 86 0x56 'V' */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x6c, /* 01101100 */ 0x38, /* 00111000 */ 0x00, /* 00000000 */ /* * 87 0x57 'W' */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xd6, /* 11010110 */ 0xd6, /* 11010110 */ 0xfe, /* 11111110 */ 0x6c, /* 01101100 */ 0x00, /* 00000000 */ /* * 88 0x58 'X' */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x6c, /* 01101100 */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* * 89 0x59 'Y' */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* * 90 0x5a 'Z' */ 0xfe, /* 11111110 */ 0xc6, /* 11000110 */ 0x8c, /* 10001100 */ 0x18, /* 00011000 */ 0x32, /* 00110010 */ 0x66, /* 01100110 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ /* * 91 0x5b '[' */ 0x3c, /* 00111100 */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* * 92 0x5c '\' */ 0xc0, /* 11000000 */ 0x60, /* 01100000 */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0x06, /* 00000110 */ 0x02, /* 00000010 */ 0x00, /* 00000000 */ /* * 93 0x5d ']' */ 0x3c, /* 00111100 */ 0x0c, /* 00001100 */ 0x0c, /* 00001100 */ 0x0c, /* 00001100 */ 0x0c, /* 00001100 */ 0x0c, /* 00001100 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* * 94 0x5e '^' */ 0x10, /* 00010000 */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 95 0x5f '_' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ /* * 96 0x60 '`' */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 97 0x61 'a' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x78, /* 01111000 */ 0x0c, /* 00001100 */ 0x7c, /* 01111100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* * 98 0x62 'b' */ 0xe0, /* 11100000 */ 0x60, /* 01100000 */ 0x7c, /* 01111100 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0xdc, /* 11011100 */ 0x00, /* 00000000 */ /* * 99 0x63 'c' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc0, /* 11000000 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* * 100 0x64 'd' */ 0x1c, /* 00011100 */ 0x0c, /* 00001100 */ 0x7c, /* 01111100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* * 101 0x65 'e' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0xc0, /* 11000000 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* * 102 0x66 'f' */ 0x3c, /* 00111100 */ 0x66, /* 01100110 */ 0x60, /* 01100000 */ 0xf8, /* 11111000 */ 0x60, /* 01100000 */ 0x60, /* 01100000 */ 0xf0, /* 11110000 */ 0x00, /* 00000000 */ /* * 103 0x67 'g' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x76, /* 01110110 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0x7c, /* 01111100 */ 0x0c, /* 00001100 */ 0xf8, /* 11111000 */ /* * 104 0x68 'h' */ 0xe0, /* 11100000 */ 0x60, /* 01100000 */ 0x6c, /* 01101100 */ 0x76, /* 01110110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0xe6, /* 11100110 */ 0x00, /* 00000000 */ /* * 105 0x69 'i' */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x38, /* 00111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* * 106 0x6a 'j' */ 0x06, /* 00000110 */ 0x00, /* 00000000 */ 0x06, /* 00000110 */ 0x06, /* 00000110 */ 0x06, /* 00000110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ /* * 107 0x6b 'k' */ 0xe0, /* 11100000 */ 0x60, /* 01100000 */ 0x66, /* 01100110 */ 0x6c, /* 01101100 */ 0x78, /* 01111000 */ 0x6c, /* 01101100 */ 0xe6, /* 11100110 */ 0x00, /* 00000000 */ /* * 108 0x6c 'l' */ 0x38, /* 00111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* * 109 0x6d 'm' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xec, /* 11101100 */ 0xfe, /* 11111110 */ 0xd6, /* 11010110 */ 0xd6, /* 11010110 */ 0xd6, /* 11010110 */ 0x00, /* 00000000 */ /* * 110 0x6e 'n' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xdc, /* 11011100 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x00, /* 00000000 */ /* * 111 0x6f 'o' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* * 112 0x70 'p' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xdc, /* 11011100 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x7c, /* 01111100 */ 0x60, /* 01100000 */ 0xf0, /* 11110000 */ /* * 113 0x71 'q' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x76, /* 01110110 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0x7c, /* 01111100 */ 0x0c, /* 00001100 */ 0x1e, /* 00011110 */ /* * 114 0x72 'r' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xdc, /* 11011100 */ 0x76, /* 01110110 */ 0x60, /* 01100000 */ 0x60, /* 01100000 */ 0xf0, /* 11110000 */ 0x00, /* 00000000 */ /* * 115 0x73 's' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0xc0, /* 11000000 */ 0x7c, /* 01111100 */ 0x06, /* 00000110 */ 0xfc, /* 11111100 */ 0x00, /* 00000000 */ /* * 116 0x74 't' */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0xfc, /* 11111100 */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x36, /* 00110110 */ 0x1c, /* 00011100 */ 0x00, /* 00000000 */ /* * 117 0x75 'u' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* * 118 0x76 'v' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x6c, /* 01101100 */ 0x38, /* 00111000 */ 0x00, /* 00000000 */ /* * 119 0x77 'w' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xc6, /* 11000110 */ 0xd6, /* 11010110 */ 0xd6, /* 11010110 */ 0xfe, /* 11111110 */ 0x6c, /* 01101100 */ 0x00, /* 00000000 */ /* * 120 0x78 'x' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xc6, /* 11000110 */ 0x6c, /* 01101100 */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* * 121 0x79 'y' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7e, /* 01111110 */ 0x06, /* 00000110 */ 0xfc, /* 11111100 */ /* * 122 0x7a 'z' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x4c, /* 01001100 */ 0x18, /* 00011000 */ 0x32, /* 00110010 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ /* * 123 0x7b '{' */ 0x0e, /* 00001110 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x70, /* 01110000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x0e, /* 00001110 */ 0x00, /* 00000000 */ /* * 124 0x7c '|' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* * 125 0x7d '}' */ 0x70, /* 01110000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x0e, /* 00001110 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x70, /* 01110000 */ 0x00, /* 00000000 */ /* * 126 0x7e '~' */ 0x76, /* 01110110 */ 0xdc, /* 11011100 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 127 0x7f '' */ 0x00, /* 00000000 */ 0x10, /* 00010000 */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ /* * 128 0x80 '€' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x0c, /* 00001100 */ 0x78, /* 01111000 */ /* * 129 0x81 '' */ 0xcc, /* 11001100 */ 0x00, /* 00000000 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* * 130 0x82 '‚' */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0xc0, /* 11000000 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* * 131 0x83 'ƒ' */ 0x7c, /* 01111100 */ 0x82, /* 10000010 */ 0x78, /* 01111000 */ 0x0c, /* 00001100 */ 0x7c, /* 01111100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* * 132 0x84 '„' */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ 0x78, /* 01111000 */ 0x0c, /* 00001100 */ 0x7c, /* 01111100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* * 133 0x85 '…' */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x78, /* 01111000 */ 0x0c, /* 00001100 */ 0x7c, /* 01111100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* * 134 0x86 '†' */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x78, /* 01111000 */ 0x0c, /* 00001100 */ 0x7c, /* 01111100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* * 135 0x87 '‡' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0x7e, /* 01111110 */ 0x0c, /* 00001100 */ 0x38, /* 00111000 */ /* * 136 0x88 'ˆ' */ 0x7c, /* 01111100 */ 0x82, /* 10000010 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0xc0, /* 11000000 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* * 137 0x89 '‰' */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0xc0, /* 11000000 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* * 138 0x8a 'Š' */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0xc0, /* 11000000 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* * 139 0x8b '‹' */ 0x66, /* 01100110 */ 0x00, /* 00000000 */ 0x38, /* 00111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* * 140 0x8c 'Œ' */ 0x7c, /* 01111100 */ 0x82, /* 10000010 */ 0x38, /* 00111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* * 141 0x8d '' */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x38, /* 00111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* * 142 0x8e 'Ž' */ 0xc6, /* 11000110 */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* * 143 0x8f '' */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* * 144 0x90 '' */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0xfe, /* 11111110 */ 0xc0, /* 11000000 */ 0xf8, /* 11111000 */ 0xc0, /* 11000000 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ /* * 145 0x91 '‘' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ 0xd8, /* 11011000 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ /* * 146 0x92 '’' */ 0x3e, /* 00111110 */ 0x6c, /* 01101100 */ 0xcc, /* 11001100 */ 0xfe, /* 11111110 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xce, /* 11001110 */ 0x00, /* 00000000 */ /* * 147 0x93 '“' */ 0x7c, /* 01111100 */ 0x82, /* 10000010 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* * 148 0x94 '”' */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* * 149 0x95 '•' */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* * 150 0x96 '–' */ 0x78, /* 01111000 */ 0x84, /* 10000100 */ 0x00, /* 00000000 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* * 151 0x97 '—' */ 0x60, /* 01100000 */ 0x30, /* 00110000 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* * 152 0x98 '˜' */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7e, /* 01111110 */ 0x06, /* 00000110 */ 0xfc, /* 11111100 */ /* * 153 0x99 '™' */ 0xc6, /* 11000110 */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x6c, /* 01101100 */ 0x38, /* 00111000 */ 0x00, /* 00000000 */ /* * 154 0x9a 'š' */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* * 155 0x9b '›' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* * 156 0x9c 'œ' */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0x64, /* 01100100 */ 0xf0, /* 11110000 */ 0x60, /* 01100000 */ 0x66, /* 01100110 */ 0xfc, /* 11111100 */ 0x00, /* 00000000 */ /* * 157 0x9d '' */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* * 158 0x9e 'ž' */ 0xf8, /* 11111000 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xfa, /* 11111010 */ 0xc6, /* 11000110 */ 0xcf, /* 11001111 */ 0xc6, /* 11000110 */ 0xc7, /* 11000111 */ /* * 159 0x9f 'Ÿ' */ 0x0e, /* 00001110 */ 0x1b, /* 00011011 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0xd8, /* 11011000 */ 0x70, /* 01110000 */ 0x00, /* 00000000 */ /* * 160 0xa0 ' ' */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x78, /* 01111000 */ 0x0c, /* 00001100 */ 0x7c, /* 01111100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* * 161 0xa1 '¡' */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x38, /* 00111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* * 162 0xa2 '¢' */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* * 163 0xa3 '£' */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* * 164 0xa4 '¤' */ 0x76, /* 01110110 */ 0xdc, /* 11011100 */ 0x00, /* 00000000 */ 0xdc, /* 11011100 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x00, /* 00000000 */ /* * 165 0xa5 '¥' */ 0x76, /* 01110110 */ 0xdc, /* 11011100 */ 0x00, /* 00000000 */ 0xe6, /* 11100110 */ 0xf6, /* 11110110 */ 0xde, /* 11011110 */ 0xce, /* 11001110 */ 0x00, /* 00000000 */ /* * 166 0xa6 '¦' */ 0x3c, /* 00111100 */ 0x6c, /* 01101100 */ 0x6c, /* 01101100 */ 0x3e, /* 00111110 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 167 0xa7 '§' */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0x6c, /* 01101100 */ 0x38, /* 00111000 */ 0x00, /* 00000000 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 168 0xa8 '¨' */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x63, /* 01100011 */ 0x3e, /* 00111110 */ 0x00, /* 00000000 */ /* * 169 0xa9 '©' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xfe, /* 11111110 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 170 0xaa 'ª' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xfe, /* 11111110 */ 0x06, /* 00000110 */ 0x06, /* 00000110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 171 0xab '«' */ 0x63, /* 01100011 */ 0xe6, /* 11100110 */ 0x6c, /* 01101100 */ 0x7e, /* 01111110 */ 0x33, /* 00110011 */ 0x66, /* 01100110 */ 0xcc, /* 11001100 */ 0x0f, /* 00001111 */ /* * 172 0xac '¬' */ 0x63, /* 01100011 */ 0xe6, /* 11100110 */ 0x6c, /* 01101100 */ 0x7a, /* 01111010 */ 0x36, /* 00110110 */ 0x6a, /* 01101010 */ 0xdf, /* 11011111 */ 0x06, /* 00000110 */ /* * 173 0xad '­' */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* * 174 0xae '®' */ 0x00, /* 00000000 */ 0x33, /* 00110011 */ 0x66, /* 01100110 */ 0xcc, /* 11001100 */ 0x66, /* 01100110 */ 0x33, /* 00110011 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 175 0xaf '¯' */ 0x00, /* 00000000 */ 0xcc, /* 11001100 */ 0x66, /* 01100110 */ 0x33, /* 00110011 */ 0x66, /* 01100110 */ 0xcc, /* 11001100 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 176 0xb0 '°' */ 0x22, /* 00100010 */ 0x88, /* 10001000 */ 0x22, /* 00100010 */ 0x88, /* 10001000 */ 0x22, /* 00100010 */ 0x88, /* 10001000 */ 0x22, /* 00100010 */ 0x88, /* 10001000 */ /* * 177 0xb1 '±' */ 0x55, /* 01010101 */ 0xaa, /* 10101010 */ 0x55, /* 01010101 */ 0xaa, /* 10101010 */ 0x55, /* 01010101 */ 0xaa, /* 10101010 */ 0x55, /* 01010101 */ 0xaa, /* 10101010 */ /* * 178 0xb2 '²' */ 0x77, /* 01110111 */ 0xdd, /* 11011101 */ 0x77, /* 01110111 */ 0xdd, /* 11011101 */ 0x77, /* 01110111 */ 0xdd, /* 11011101 */ 0x77, /* 01110111 */ 0xdd, /* 11011101 */ /* * 179 0xb3 '³' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* * 180 0xb4 '´' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0xf8, /* 11111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* * 181 0xb5 'µ' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0xf8, /* 11111000 */ 0x18, /* 00011000 */ 0xf8, /* 11111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* * 182 0xb6 '¶' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0xf6, /* 11110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* * 183 0xb7 '·' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xfe, /* 11111110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* * 184 0xb8 '¸' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xf8, /* 11111000 */ 0x18, /* 00011000 */ 0xf8, /* 11111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* * 185 0xb9 '¹' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0xf6, /* 11110110 */ 0x06, /* 00000110 */ 0xf6, /* 11110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* * 186 0xba 'º' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* * 187 0xbb '»' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xfe, /* 11111110 */ 0x06, /* 00000110 */ 0xf6, /* 11110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* * 188 0xbc '¼' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0xf6, /* 11110110 */ 0x06, /* 00000110 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 189 0xbd '½' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 190 0xbe '¾' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0xf8, /* 11111000 */ 0x18, /* 00011000 */ 0xf8, /* 11111000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 191 0xbf '¿' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xf8, /* 11111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* * 192 0xc0 'À' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x1f, /* 00011111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 193 0xc1 'Á' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 194 0xc2 'Â' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* * 195 0xc3 'Ã' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x1f, /* 00011111 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* * 196 0xc4 'Ä' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 197 0xc5 'Å' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0xff, /* 11111111 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* * 198 0xc6 'Æ' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x1f, /* 00011111 */ 0x18, /* 00011000 */ 0x1f, /* 00011111 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* * 199 0xc7 'Ç' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x37, /* 00110111 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* * 200 0xc8 'È' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x37, /* 00110111 */ 0x30, /* 00110000 */ 0x3f, /* 00111111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 201 0xc9 'É' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x3f, /* 00111111 */ 0x30, /* 00110000 */ 0x37, /* 00110111 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* * 202 0xca 'Ê' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0xf7, /* 11110111 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 203 0xcb 'Ë' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0xf7, /* 11110111 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* * 204 0xcc 'Ì' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x37, /* 00110111 */ 0x30, /* 00110000 */ 0x37, /* 00110111 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* * 205 0xcd 'Í' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 206 0xce 'Î' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0xf7, /* 11110111 */ 0x00, /* 00000000 */ 0xf7, /* 11110111 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* * 207 0xcf 'Ï' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 208 0xd0 'Ð' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 209 0xd1 'Ñ' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* * 210 0xd2 'Ò' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* * 211 0xd3 'Ó' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x3f, /* 00111111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 212 0xd4 'Ô' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x1f, /* 00011111 */ 0x18, /* 00011000 */ 0x1f, /* 00011111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 213 0xd5 'Õ' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x1f, /* 00011111 */ 0x18, /* 00011000 */ 0x1f, /* 00011111 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* * 214 0xd6 'Ö' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x3f, /* 00111111 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* * 215 0xd7 '×' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0xff, /* 11111111 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* * 216 0xd8 'Ø' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0xff, /* 11111111 */ 0x18, /* 00011000 */ 0xff, /* 11111111 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* * 217 0xd9 'Ù' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0xf8, /* 11111000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 218 0xda 'Ú' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x1f, /* 00011111 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* * 219 0xdb 'Û' */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ /* * 220 0xdc 'Ü' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ /* * 221 0xdd 'Ý' */ 0xf0, /* 11110000 */ 0xf0, /* 11110000 */ 0xf0, /* 11110000 */ 0xf0, /* 11110000 */ 0xf0, /* 11110000 */ 0xf0, /* 11110000 */ 0xf0, /* 11110000 */ 0xf0, /* 11110000 */ /* * 222 0xde 'Þ' */ 0x0f, /* 00001111 */ 0x0f, /* 00001111 */ 0x0f, /* 00001111 */ 0x0f, /* 00001111 */ 0x0f, /* 00001111 */ 0x0f, /* 00001111 */ 0x0f, /* 00001111 */ 0x0f, /* 00001111 */ /* * 223 0xdf 'ß' */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 224 0xe0 'à' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x76, /* 01110110 */ 0xdc, /* 11011100 */ 0xc8, /* 11001000 */ 0xdc, /* 11011100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* * 225 0xe1 'á' */ 0x78, /* 01111000 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xd8, /* 11011000 */ 0xcc, /* 11001100 */ 0xc6, /* 11000110 */ 0xcc, /* 11001100 */ 0x00, /* 00000000 */ /* * 226 0xe2 'â' */ 0xfe, /* 11111110 */ 0xc6, /* 11000110 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0x00, /* 00000000 */ /* * 227 0xe3 'ã' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xfe, /* 11111110 */ 0x6c, /* 01101100 */ 0x6c, /* 01101100 */ 0x6c, /* 01101100 */ 0x6c, /* 01101100 */ 0x00, /* 00000000 */ /* * 228 0xe4 'ä' */ 0xfe, /* 11111110 */ 0xc6, /* 11000110 */ 0x60, /* 01100000 */ 0x30, /* 00110000 */ 0x60, /* 01100000 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ /* * 229 0xe5 'å' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0xd8, /* 11011000 */ 0xd8, /* 11011000 */ 0xd8, /* 11011000 */ 0x70, /* 01110000 */ 0x00, /* 00000000 */ /* * 230 0xe6 'æ' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x7c, /* 01111100 */ 0xc0, /* 11000000 */ /* * 231 0xe7 'ç' */ 0x00, /* 00000000 */ 0x76, /* 01110110 */ 0xdc, /* 11011100 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* * 232 0xe8 'è' */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ /* * 233 0xe9 'é' */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0xc6, /* 11000110 */ 0x6c, /* 01101100 */ 0x38, /* 00111000 */ 0x00, /* 00000000 */ /* * 234 0xea 'ê' */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x6c, /* 01101100 */ 0x6c, /* 01101100 */ 0xee, /* 11101110 */ 0x00, /* 00000000 */ /* * 235 0xeb 'ë' */ 0x0e, /* 00001110 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0x3e, /* 00111110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* * 236 0xec 'ì' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0xdb, /* 11011011 */ 0xdb, /* 11011011 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 237 0xed 'í' */ 0x06, /* 00000110 */ 0x0c, /* 00001100 */ 0x7e, /* 01111110 */ 0xdb, /* 11011011 */ 0xdb, /* 11011011 */ 0x7e, /* 01111110 */ 0x60, /* 01100000 */ 0xc0, /* 11000000 */ /* * 238 0xee 'î' */ 0x1e, /* 00011110 */ 0x30, /* 00110000 */ 0x60, /* 01100000 */ 0x7e, /* 01111110 */ 0x60, /* 01100000 */ 0x30, /* 00110000 */ 0x1e, /* 00011110 */ 0x00, /* 00000000 */ /* * 239 0xef 'ï' */ 0x00, /* 00000000 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* * 240 0xf0 'ð' */ 0x00, /* 00000000 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 241 0xf1 'ñ' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ /* * 242 0xf2 'ò' */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ /* * 243 0xf3 'ó' */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ /* * 244 0xf4 'ô' */ 0x0e, /* 00001110 */ 0x1b, /* 00011011 */ 0x1b, /* 00011011 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* * 245 0xf5 'õ' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0xd8, /* 11011000 */ 0xd8, /* 11011000 */ 0x70, /* 01110000 */ /* * 246 0xf6 'ö' */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 247 0xf7 '÷' */ 0x00, /* 00000000 */ 0x76, /* 01110110 */ 0xdc, /* 11011100 */ 0x00, /* 00000000 */ 0x76, /* 01110110 */ 0xdc, /* 11011100 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 248 0xf8 'ø' */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0x6c, /* 01101100 */ 0x38, /* 00111000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 249 0xf9 'ù' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 250 0xfa 'ú' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 251 0xfb 'û' */ 0x0f, /* 00001111 */ 0x0c, /* 00001100 */ 0x0c, /* 00001100 */ 0x0c, /* 00001100 */ 0xec, /* 11101100 */ 0x6c, /* 01101100 */ 0x3c, /* 00111100 */ 0x1c, /* 00011100 */ /* * 252 0xfc 'ü' */ 0x6c, /* 01101100 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 253 0xfd 'ý' */ 0x78, /* 01111000 */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 254 0xfe 'þ' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x3c, /* 00111100 */ 0x3c, /* 00111100 */ 0x3c, /* 00111100 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* * 255 0xff 'ÿ' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ }; pygame-1.9.1release/src/SDL_gfx/SDL_gfxPrimitives.h0000644000175000017500000002033511167703133022040 0ustar vincentvincent/* SDL_gfxPrimitives: graphics primitives for SDL LGPL (c) A. Schiffler */ #ifndef _SDL_gfxPrimitives_h #define _SDL_gfxPrimitives_h #include #ifndef M_PI #define M_PI 3.141592654 #endif #include "SDL.h" /* Set up for C function definitions, even when using C++ */ #ifdef __cplusplus extern "C" { #endif /* ----- Versioning */ #define SDL_GFXPRIMITIVES_MAJOR 2 #define SDL_GFXPRIMITIVES_MINOR 0 #define SDL_GFXPRIMITIVES_MICRO 19 /* ----- Statically Linking so don't want a DLL interface */ #define DLLINTERFACE /* ----- Prototypes */ /* Note: all ___Color routines expect the color to be in format 0xRRGGBBAA */ /* Pixel */ DLLINTERFACE int pixelColor(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color); DLLINTERFACE int pixelRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* Horizontal line */ DLLINTERFACE int hlineColor(SDL_Surface * dst, Sint16 x1, Sint16 x2, Sint16 y, Uint32 color); DLLINTERFACE int hlineRGBA(SDL_Surface * dst, Sint16 x1, Sint16 x2, Sint16 y, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* Vertical line */ DLLINTERFACE int vlineColor(SDL_Surface * dst, Sint16 x, Sint16 y1, Sint16 y2, Uint32 color); DLLINTERFACE int vlineRGBA(SDL_Surface * dst, Sint16 x, Sint16 y1, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* Rectangle */ DLLINTERFACE int rectangleColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color); DLLINTERFACE int rectangleRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* Filled rectangle (Box) */ DLLINTERFACE int boxColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color); DLLINTERFACE int boxRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* Line */ DLLINTERFACE int lineColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color); DLLINTERFACE int lineRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* AA Line */ DLLINTERFACE int aalineColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color); DLLINTERFACE int aalineRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* Circle */ DLLINTERFACE int circleColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 r, Uint32 color); DLLINTERFACE int circleRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* Circle */ DLLINTERFACE int arcColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 r, Sint16 start, Sint16 end, Uint32 color); DLLINTERFACE int arcRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* AA Circle */ DLLINTERFACE int aacircleColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 r, Uint32 color); DLLINTERFACE int aacircleRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* Filled Circle */ DLLINTERFACE int filledCircleColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 r, Uint32 color); DLLINTERFACE int filledCircleRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* Ellipse */ DLLINTERFACE int ellipseColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint32 color); DLLINTERFACE int ellipseRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* AA Ellipse */ DLLINTERFACE int aaellipseColor(SDL_Surface * dst, Sint16 xc, Sint16 yc, Sint16 rx, Sint16 ry, Uint32 color); DLLINTERFACE int aaellipseRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* Filled Ellipse */ DLLINTERFACE int filledEllipseColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint32 color); DLLINTERFACE int filledEllipseRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a); #define CLOCKWISE /* Pie */ DLLINTERFACE int pieColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint32 color); DLLINTERFACE int pieRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* Filled Pie */ DLLINTERFACE int filledPieColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint32 color); DLLINTERFACE int filledPieRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* Trigon */ DLLINTERFACE int trigonColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint32 color); DLLINTERFACE int trigonRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* AA-Trigon */ DLLINTERFACE int aatrigonColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint32 color); DLLINTERFACE int aatrigonRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* Filled Trigon */ DLLINTERFACE int filledTrigonColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint32 color); DLLINTERFACE int filledTrigonRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* Polygon */ DLLINTERFACE int polygonColor(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint32 color); DLLINTERFACE int polygonRGBA(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* AA-Polygon */ DLLINTERFACE int aapolygonColor(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint32 color); DLLINTERFACE int aapolygonRGBA(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* Filled Polygon */ DLLINTERFACE int filledPolygonColor(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint32 color); DLLINTERFACE int filledPolygonRGBA(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a); DLLINTERFACE int texturedPolygon(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, SDL_Surface * texture,int texture_dx,int texture_dy); /* (Note: These MT versions are required for multi-threaded operation.) */ DLLINTERFACE int filledPolygonColorMT(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint32 color, int **polyInts, int *polyAllocated); DLLINTERFACE int filledPolygonRGBAMT(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a, int **polyInts, int *polyAllocated); DLLINTERFACE int texturedPolygonMT(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, SDL_Surface * texture,int texture_dx,int texture_dy, int **polyInts, int *polyAllocated); /* Bezier */ /* (s = number of steps) */ DLLINTERFACE int bezierColor(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, int s, Uint32 color); DLLINTERFACE int bezierRGBA(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, int s, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /* Characters/Strings */ DLLINTERFACE int characterColor(SDL_Surface * dst, Sint16 x, Sint16 y, char c, Uint32 color); DLLINTERFACE int characterRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, char c, Uint8 r, Uint8 g, Uint8 b, Uint8 a); DLLINTERFACE int stringColor(SDL_Surface * dst, Sint16 x, Sint16 y, const char *c, Uint32 color); DLLINTERFACE int stringRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, const char *c, Uint8 r, Uint8 g, Uint8 b, Uint8 a); DLLINTERFACE void gfxPrimitivesSetFont(const void *fontdata, int cw, int ch); /* Ends C function definitions when using C++ */ #ifdef __cplusplus } #endif #endif /* _SDL_gfxPrimitives_h */ pygame-1.9.1release/src/SDL_gfx/SDL_gfxPrimitives.c0000644000175000017500000032603611207055754022046 0ustar vincentvincent/* SDL_gfxPrimitives - Graphics primitives for SDL surfaces LGPL (c) A. Schiffler */ #include #include #include #include #include "SDL_gfxPrimitives.h" #include "SDL_gfxPrimitives_font.h" /* -===================- */ #define DEFAULT_ALPHA_PIXEL_ROUTINE /* ----- Defines for pixel clipping tests */ #define clip_xmin(surface) surface->clip_rect.x #define clip_xmax(surface) surface->clip_rect.x+surface->clip_rect.w-1 #define clip_ymin(surface) surface->clip_rect.y #define clip_ymax(surface) surface->clip_rect.y+surface->clip_rect.h-1 /* ----- Pixel - fast, no blending, no locking, clipping */ int fastPixelColorNolock(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color) { int bpp; Uint8 *p; /* * Honor clipping setup at pixel level */ if ((x >= clip_xmin(dst)) && (x <= clip_xmax(dst)) && (y >= clip_ymin(dst)) && (y <= clip_ymax(dst))) { /* * Get destination format */ bpp = dst->format->BytesPerPixel; p = (Uint8 *) dst->pixels + y * dst->pitch + x * bpp; switch (bpp) { case 1: *p = color; break; case 2: *(Uint16 *) p = color; break; case 3: if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { p[0] = (color >> 16) & 0xff; p[1] = (color >> 8) & 0xff; p[2] = color & 0xff; } else { p[0] = color & 0xff; p[1] = (color >> 8) & 0xff; p[2] = (color >> 16) & 0xff; } break; case 4: *(Uint32 *) p = color; break; } /* switch */ } return (0); } /* ----- Pixel - fast, no blending, no locking, no clipping */ /* (faster but dangerous, make sure we stay in surface bounds) */ int fastPixelColorNolockNoclip(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color) { int bpp; Uint8 *p; /* * Get destination format */ bpp = dst->format->BytesPerPixel; p = (Uint8 *) dst->pixels + y * dst->pitch + x * bpp; switch (bpp) { case 1: *p = color; break; case 2: *(Uint16 *) p = color; break; case 3: if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { p[0] = (color >> 16) & 0xff; p[1] = (color >> 8) & 0xff; p[2] = color & 0xff; } else { p[0] = color & 0xff; p[1] = (color >> 8) & 0xff; p[2] = (color >> 16) & 0xff; } break; case 4: *(Uint32 *) p = color; break; } /* switch */ return (0); } /* ----- Pixel - fast, no blending, locking, clipping */ int fastPixelColor(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color) { int result; /* * Lock the surface */ if (SDL_MUSTLOCK(dst)) { if (SDL_LockSurface(dst) < 0) { return (-1); } } result = fastPixelColorNolock(dst, x, y, color); /* * Unlock surface */ if (SDL_MUSTLOCK(dst)) { SDL_UnlockSurface(dst); } return (result); } /* ----- Pixel - fast, no blending, locking, RGB input */ int fastPixelRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { Uint32 color; /* * Setup color */ color = SDL_MapRGBA(dst->format, r, g, b, a); /* * Draw */ return (fastPixelColor(dst, x, y, color)); } /* ----- Pixel - fast, no blending, no locking RGB input */ int fastPixelRGBANolock(SDL_Surface * dst, Sint16 x, Sint16 y, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { Uint32 color; /* * Setup color */ color = SDL_MapRGBA(dst->format, r, g, b, a); /* * Draw */ return (fastPixelColorNolock(dst, x, y, color)); } /* PutPixel routine with alpha blending, input color in destination format */ /* New, faster routine - default blending pixel */ int _putPixelAlpha(SDL_Surface * surface, Sint16 x, Sint16 y, Uint32 color, Uint8 alpha) { Uint32 Rmask = surface->format->Rmask, Gmask = surface->format->Gmask, Bmask = surface->format->Bmask, Amask = surface->format->Amask; Uint32 R = 0, G = 0, B = 0, A = 0; if (x >= clip_xmin(surface) && x <= clip_xmax(surface) && y >= clip_ymin(surface) && y <= clip_ymax(surface)) { switch (surface->format->BytesPerPixel) { case 1:{ /* Assuming 8-bpp */ if (alpha == 255) { *((Uint8 *) surface->pixels + y * surface->pitch + x) = color; } else { Uint8 *pixel = (Uint8 *) surface->pixels + y * surface->pitch + x; Uint8 dR = surface->format->palette->colors[*pixel].r; Uint8 dG = surface->format->palette->colors[*pixel].g; Uint8 dB = surface->format->palette->colors[*pixel].b; Uint8 sR = surface->format->palette->colors[color].r; Uint8 sG = surface->format->palette->colors[color].g; Uint8 sB = surface->format->palette->colors[color].b; dR = dR + ((sR - dR) * alpha >> 8); dG = dG + ((sG - dG) * alpha >> 8); dB = dB + ((sB - dB) * alpha >> 8); *pixel = SDL_MapRGB(surface->format, dR, dG, dB); } } break; case 2:{ /* Probably 15-bpp or 16-bpp */ if (alpha == 255) { *((Uint16 *) surface->pixels + y * surface->pitch / 2 + x) = color; } else { Uint16 *pixel = (Uint16 *) surface->pixels + y * surface->pitch / 2 + x; Uint32 dc = *pixel; R = ((dc & Rmask) + (((color & Rmask) - (dc & Rmask)) * alpha >> 8)) & Rmask; G = ((dc & Gmask) + (((color & Gmask) - (dc & Gmask)) * alpha >> 8)) & Gmask; B = ((dc & Bmask) + (((color & Bmask) - (dc & Bmask)) * alpha >> 8)) & Bmask; if (Amask) A = ((dc & Amask) + (((color & Amask) - (dc & Amask)) * alpha >> 8)) & Amask; *pixel = R | G | B | A; } } break; case 3:{ /* Slow 24-bpp mode, usually not used */ Uint8 *pix = (Uint8 *) surface->pixels + y * surface->pitch + x * 3; Uint8 rshift8 = surface->format->Rshift / 8; Uint8 gshift8 = surface->format->Gshift / 8; Uint8 bshift8 = surface->format->Bshift / 8; Uint8 ashift8 = surface->format->Ashift / 8; if (alpha == 255) { *(pix + rshift8) = color >> surface->format->Rshift; *(pix + gshift8) = color >> surface->format->Gshift; *(pix + bshift8) = color >> surface->format->Bshift; *(pix + ashift8) = color >> surface->format->Ashift; } else { Uint8 dR, dG, dB, dA = 0; Uint8 sR, sG, sB, sA = 0; pix = (Uint8 *) surface->pixels + y * surface->pitch + x * 3; dR = *((pix) + rshift8); dG = *((pix) + gshift8); dB = *((pix) + bshift8); dA = *((pix) + ashift8); sR = (color >> surface->format->Rshift) & 0xff; sG = (color >> surface->format->Gshift) & 0xff; sB = (color >> surface->format->Bshift) & 0xff; sA = (color >> surface->format->Ashift) & 0xff; dR = dR + ((sR - dR) * alpha >> 8); dG = dG + ((sG - dG) * alpha >> 8); dB = dB + ((sB - dB) * alpha >> 8); dA = dA + ((sA - dA) * alpha >> 8); *((pix) + rshift8) = dR; *((pix) + gshift8) = dG; *((pix) + bshift8) = dB; *((pix) + ashift8) = dA; } } break; #ifdef DEFAULT_ALPHA_PIXEL_ROUTINE case 4:{ /* Probably :-) 32-bpp */ if (alpha == 255) { *((Uint32 *) surface->pixels + y * surface->pitch / 4 + x) = color; } else { Uint32 Rshift, Gshift, Bshift, Ashift; Uint32 *pixel = (Uint32 *) surface->pixels + y * surface->pitch / 4 + x; Uint32 dc = *pixel; Rshift = surface->format->Rshift; Gshift = surface->format->Gshift; Bshift = surface->format->Bshift; Ashift = surface->format->Ashift; R = ((dc & Rmask) + (((((color & Rmask) - (dc & Rmask)) >> Rshift) * alpha >> 8) << Rshift)) & Rmask; G = ((dc & Gmask) + (((((color & Gmask) - (dc & Gmask)) >> Gshift) * alpha >> 8) << Gshift)) & Gmask; B = ((dc & Bmask) + (((((color & Bmask) - (dc & Bmask)) >> Bshift) * alpha >> 8) << Bshift)) & Bmask; if (Amask) A = ((dc & Amask) + (((((color & Amask) - (dc & Amask)) >> Ashift) * alpha >> 8) << Ashift)) & Amask; *pixel = R | G | B | A; } } break; #endif #ifdef EXPERIMENTAL_ALPHA_PIXEL_ROUTINE case 4:{ /* Probably :-) 32-bpp */ if (alpha == 255) { *((Uint32 *) surface->pixels + y * surface->pitch / 4 + x) = color; } else { Uint32 Rshift, Gshift, Bshift, Ashift; Uint32 *pixel = (Uint32 *) surface->pixels + y * surface->pitch / 4 + x; Uint32 dc = *pixel; Uint32 dR = (color & Rmask), dG = (color & Gmask), dB = (color & Bmask), dA = (color & Amask); Uint32 surfaceAlpha, preMultR, preMultG, preMultB; Uint32 aTmp; Rshift = surface->format->Rshift; Gshift = surface->format->Gshift; Bshift = surface->format->Bshift; Ashift = surface->format->Ashift; preMultR = (alpha * (dR>>Rshift)); preMultG = (alpha * (dG>>Gshift)); preMultB = (alpha * (dB>>Bshift)); surfaceAlpha = ((dc & Amask) >> Ashift); aTmp = (255 - alpha); if (A = 255 - ((aTmp * (255 - surfaceAlpha)) >> 8 )) { aTmp *= surfaceAlpha; R = (preMultR + ((aTmp * ((dc & Rmask) >> Rshift)) >> 8)) / A << Rshift & Rmask; G = (preMultG + ((aTmp * ((dc & Gmask) >> Gshift)) >> 8)) / A << Gshift & Gmask; B = (preMultB + ((aTmp * ((dc & Bmask) >> Bshift)) >> 8)) / A << Bshift & Bmask; } *pixel = R | G | B | (A << Ashift & Amask); } } break; #endif } } return (0); } /* ----- Pixel - pixel draw with blending enabled if a<255 */ int pixelColor(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color) { Uint8 alpha; Uint32 mcolor; int result = 0; /* * Lock the surface */ if (SDL_MUSTLOCK(dst)) { if (SDL_LockSurface(dst) < 0) { return (-1); } } /* * Setup color */ alpha = color & 0x000000ff; mcolor = SDL_MapRGBA(dst->format, (color & 0xff000000) >> 24, (color & 0x00ff0000) >> 16, (color & 0x0000ff00) >> 8, alpha); /* * Draw */ result = _putPixelAlpha(dst, x, y, mcolor, alpha); /* * Unlock the surface */ if (SDL_MUSTLOCK(dst)) { SDL_UnlockSurface(dst); } return (result); } int pixelColorNolock(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color) { Uint8 alpha; Uint32 mcolor; int result = 0; /* * Setup color */ alpha = color & 0x000000ff; mcolor = SDL_MapRGBA(dst->format, (color & 0xff000000) >> 24, (color & 0x00ff0000) >> 16, (color & 0x0000ff00) >> 8, alpha); /* * Draw */ result = _putPixelAlpha(dst, x, y, mcolor, alpha); return (result); } /* Filled rectangle with alpha blending, color in destination format */ int _filledRectAlpha(SDL_Surface * surface, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color, Uint8 alpha) { Uint32 Rmask = surface->format->Rmask, Gmask = surface->format->Gmask, Bmask = surface->format->Bmask, Amask = surface->format->Amask; Uint32 R, G, B, A = 0; Sint16 x, y; switch (surface->format->BytesPerPixel) { case 1:{ /* Assuming 8-bpp */ Uint8 *row, *pixel; Uint8 dR, dG, dB; Uint8 sR = surface->format->palette->colors[color].r; Uint8 sG = surface->format->palette->colors[color].g; Uint8 sB = surface->format->palette->colors[color].b; for (y = y1; y <= y2; y++) { row = (Uint8 *) surface->pixels + y * surface->pitch; for (x = x1; x <= x2; x++) { pixel = row + x; dR = surface->format->palette->colors[*pixel].r; dG = surface->format->palette->colors[*pixel].g; dB = surface->format->palette->colors[*pixel].b; dR = dR + ((sR - dR) * alpha >> 8); dG = dG + ((sG - dG) * alpha >> 8); dB = dB + ((sB - dB) * alpha >> 8); *pixel = SDL_MapRGB(surface->format, dR, dG, dB); } } } break; case 2:{ /* Probably 15-bpp or 16-bpp */ Uint16 *row, *pixel; Uint32 dR = (color & Rmask), dG = (color & Gmask), dB = (color & Bmask), dA = (color & Amask); for (y = y1; y <= y2; y++) { row = (Uint16 *) surface->pixels + y * surface->pitch / 2; for (x = x1; x <= x2; x++) { pixel = row + x; R = ((*pixel & Rmask) + ((dR - (*pixel & Rmask)) * alpha >> 8)) & Rmask; G = ((*pixel & Gmask) + ((dG - (*pixel & Gmask)) * alpha >> 8)) & Gmask; B = ((*pixel & Bmask) + ((dB - (*pixel & Bmask)) * alpha >> 8)) & Bmask; if (Amask) A = ((*pixel & Amask) + ((dA - (*pixel & Amask)) * alpha >> 8)) & Amask; *pixel = R | G | B | A; } } } break; case 3:{ /* Slow 24-bpp mode, usually not used */ Uint8 *row, *pix; Uint8 dR, dG, dB, dA; Uint8 rshift8 = surface->format->Rshift / 8; Uint8 gshift8 = surface->format->Gshift / 8; Uint8 bshift8 = surface->format->Bshift / 8; Uint8 ashift8 = surface->format->Ashift / 8; Uint8 sR = (color >> surface->format->Rshift) & 0xff; Uint8 sG = (color >> surface->format->Gshift) & 0xff; Uint8 sB = (color >> surface->format->Bshift) & 0xff; Uint8 sA = (color >> surface->format->Ashift) & 0xff; for (y = y1; y <= y2; y++) { row = (Uint8 *) surface->pixels + y * surface->pitch; for (x = x1; x <= x2; x++) { pix = row + x * 3; dR = *((pix) + rshift8); dG = *((pix) + gshift8); dB = *((pix) + bshift8); dA = *((pix) + ashift8); dR = dR + ((sR - dR) * alpha >> 8); dG = dG + ((sG - dG) * alpha >> 8); dB = dB + ((sB - dB) * alpha >> 8); dA = dA + ((sA - dA) * alpha >> 8); *((pix) + rshift8) = dR; *((pix) + gshift8) = dG; *((pix) + bshift8) = dB; *((pix) + ashift8) = dA; } } } break; #ifdef DEFAULT_ALPHA_PIXEL_ROUTINE case 4:{ /* Probably :-) 32-bpp */ Uint32 Rshift, Gshift, Bshift, Ashift; Uint32 *row, *pixel; Uint32 dR = (color & Rmask), dG = (color & Gmask), dB = (color & Bmask), dA = (color & Amask); Rshift = surface->format->Rshift; Gshift = surface->format->Gshift; Bshift = surface->format->Bshift; Ashift = surface->format->Ashift; for (y = y1; y <= y2; y++) { row = (Uint32 *) surface->pixels + y * surface->pitch / 4; for (x = x1; x <= x2; x++) { pixel = row + x; R = ((*pixel & Rmask) + ((((dR - (*pixel & Rmask)) >> Rshift) * alpha >> 8) << Rshift)) & Rmask; G = ((*pixel & Gmask) + ((((dG - (*pixel & Gmask)) >> Gshift) * alpha >> 8) << Gshift)) & Gmask; B = ((*pixel & Bmask) + ((((dB - (*pixel & Bmask)) >> Bshift) * alpha >> 8) << Bshift)) & Bmask; if (Amask) A = ((*pixel & Amask) + ((((dA - (*pixel & Amask)) >> Ashift) * alpha >> 8) << Ashift)) & Amask; *pixel = R | G | B | A; } } } break; #endif #ifdef EXPERIMENTAL_ALPHA_PIXEL_ROUTINE case 4:{ /* Probably :-) 32-bpp */ Uint32 Rshift, Gshift, Bshift, Ashift; Uint32 *row, *pixel; Uint32 dR = (color & Rmask), dG = (color & Gmask), dB = (color & Bmask), dA = (color & Amask); Uint32 dc; Uint32 surfaceAlpha, preMultR, preMultG, preMultB; Uint32 aTmp; Rshift = surface->format->Rshift; Gshift = surface->format->Gshift; Bshift = surface->format->Bshift; Ashift = surface->format->Ashift; preMultR = (alpha * (dR>>Rshift)); preMultG = (alpha * (dG>>Gshift)); preMultB = (alpha * (dB>>Bshift)); for (y = y1; y <= y2; y++) { row = (Uint32 *) surface->pixels + y * surface->pitch / 4; for (x = x1; x <= x2; x++) { pixel = row + x; dc = *pixel; surfaceAlpha = ((dc & Amask) >> Ashift); aTmp = (255 - alpha); if (A = 255 - ((aTmp * (255 - surfaceAlpha)) >> 8 )) { aTmp *= surfaceAlpha; R = (preMultR + ((aTmp * ((dc & Rmask) >> Rshift)) >> 8)) / A << Rshift & Rmask; G = (preMultG + ((aTmp * ((dc & Gmask) >> Gshift)) >> 8)) / A << Gshift & Gmask; B = (preMultB + ((aTmp * ((dc & Bmask) >> Bshift)) >> 8)) / A << Bshift & Bmask; } *pixel = R | G | B | (A << Ashift & Amask); } } } break; #endif } return (0); } /* Draw rectangle with alpha enabled from RGBA color. */ int filledRectAlpha(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color) { Uint8 alpha; Uint32 mcolor; int result = 0; /* * Lock the surface */ if (SDL_MUSTLOCK(dst)) { if (SDL_LockSurface(dst) < 0) { return (-1); } } /* * Setup color */ alpha = color & 0x000000ff; mcolor = SDL_MapRGBA(dst->format, (color & 0xff000000) >> 24, (color & 0x00ff0000) >> 16, (color & 0x0000ff00) >> 8, alpha); /* * Draw */ result = _filledRectAlpha(dst, x1, y1, x2, y2, mcolor, alpha); /* * Unlock the surface */ if (SDL_MUSTLOCK(dst)) { SDL_UnlockSurface(dst); } return (result); } /* Draw horizontal line with alpha enabled from RGBA color */ int HLineAlpha(SDL_Surface * dst, Sint16 x1, Sint16 x2, Sint16 y, Uint32 color) { return (filledRectAlpha(dst, x1, y, x2, y, color)); } /* Draw vertical line with alpha enabled from RGBA color */ int VLineAlpha(SDL_Surface * dst, Sint16 x, Sint16 y1, Sint16 y2, Uint32 color) { return (filledRectAlpha(dst, x, y1, x, y2, color)); } /* Pixel - using alpha weight on color for AA-drawing */ int pixelColorWeight(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color, Uint32 weight) { Uint32 a; /* * Get alpha */ a = (color & (Uint32) 0x000000ff); /* * Modify Alpha by weight */ a = ((a * weight) >> 8); return (pixelColor(dst, x, y, (color & (Uint32) 0xffffff00) | (Uint32) a)); } /* Pixel - using alpha weight on color for AA-drawing - no locking */ int pixelColorWeightNolock(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color, Uint32 weight) { Uint32 a; /* * Get alpha */ a = (color & (Uint32) 0x000000ff); /* * Modify Alpha by weight */ a = ((a * weight) >> 8); return (pixelColorNolock(dst, x, y, (color & (Uint32) 0xffffff00) | (Uint32) a)); } int pixelRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { Uint32 color; /* * Check Alpha */ if (a == 255) { /* * No alpha blending required */ /* * Setup color */ color = SDL_MapRGBA(dst->format, r, g, b, a); /* * Draw */ return (fastPixelColor(dst, x, y, color)); } else { /* * Alpha blending required */ /* * Draw */ return (pixelColor(dst, x, y, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); } } /* ----- Horizontal line */ /* Just store color including alpha, no blending */ int hlineColorStore(SDL_Surface * dst, Sint16 x1, Sint16 x2, Sint16 y, Uint32 color) { Sint16 left, right, top, bottom; Uint8 *pixel, *pixellast; int dx; int pixx, pixy; Sint16 w; Sint16 xtmp; int result = -1; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Swap x1, x2 if required to ensure x1<=x2 */ if (x1 > x2) { xtmp = x1; x1 = x2; x2 = xtmp; } /* * Get clipping boundary and * check visibility of hline */ left = dst->clip_rect.x; if (x2clip_rect.x + dst->clip_rect.w - 1; if (x1>right) { return(0); } top = dst->clip_rect.y; bottom = dst->clip_rect.y + dst->clip_rect.h - 1; if ((ybottom)) { return (0); } /* * Clip x */ if (x1 < left) { x1 = left; } if (x2 > right) { x2 = right; } /* * Calculate width */ w = x2 - x1; /* * Lock surface */ SDL_LockSurface(dst); /* * More variable setup */ dx = w; pixx = dst->format->BytesPerPixel; pixy = dst->pitch; pixel = ((Uint8 *) dst->pixels) + pixx * (int) x1 + pixy * (int) y; /* * Draw */ switch (dst->format->BytesPerPixel) { case 1: memset(pixel, color, dx); break; case 2: pixellast = pixel + dx + dx; for (; pixel <= pixellast; pixel += pixx) { *(Uint16 *) pixel = color; } break; case 3: pixellast = pixel + dx + dx + dx; for (; pixel <= pixellast; pixel += pixx) { if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { pixel[0] = (color >> 16) & 0xff; pixel[1] = (color >> 8) & 0xff; pixel[2] = color & 0xff; } else { pixel[0] = color & 0xff; pixel[1] = (color >> 8) & 0xff; pixel[2] = (color >> 16) & 0xff; } } break; default: /* case 4 */ dx = dx + dx; pixellast = pixel + dx + dx; for (; pixel <= pixellast; pixel += pixx) { *(Uint32 *) pixel = color; } break; } /* * Unlock surface */ SDL_UnlockSurface(dst); /* * Set result code */ result = 0; return (result); } int hlineRGBAStore(SDL_Surface * dst, Sint16 x1, Sint16 x2, Sint16 y, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { /* * Draw */ return (hlineColorStore(dst, x1, x2, y, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); } int hlineColor(SDL_Surface * dst, Sint16 x1, Sint16 x2, Sint16 y, Uint32 color) { Sint16 left, right, top, bottom; Uint8 *pixel, *pixellast; int dx; int pixx, pixy; Sint16 w; Sint16 xtmp; int result = -1; Uint8 *colorptr; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Swap x1, x2 if required to ensure x1<=x2 */ if (x1 > x2) { xtmp = x1; x1 = x2; x2 = xtmp; } /* * Get clipping boundary and * check visibility of hline */ left = dst->clip_rect.x; if (x2clip_rect.x + dst->clip_rect.w - 1; if (x1>right) { return(0); } top = dst->clip_rect.y; bottom = dst->clip_rect.y + dst->clip_rect.h - 1; if ((ybottom)) { return (0); } /* * Clip x */ if (x1 < left) { x1 = left; } if (x2 > right) { x2 = right; } /* * Calculate width */ w = x2 - x1; /* * Alpha check */ if ((color & 255) == 255) { /* * No alpha-blending required */ /* * Setup color */ colorptr = (Uint8 *) & color; if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]); } else { color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]); } /* * Lock surface */ SDL_LockSurface(dst); /* * More variable setup */ dx = w; pixx = dst->format->BytesPerPixel; pixy = dst->pitch; pixel = ((Uint8 *) dst->pixels) + pixx * (int) x1 + pixy * (int) y; /* * Draw */ switch (dst->format->BytesPerPixel) { case 1: memset(pixel, color, dx+1); break; case 2: pixellast = pixel + dx + dx; for (; pixel <= pixellast; pixel += pixx) { *(Uint16 *) pixel = color; } break; case 3: pixellast = pixel + dx + dx + dx; for (; pixel <= pixellast; pixel += pixx) { if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { pixel[0] = (color >> 16) & 0xff; pixel[1] = (color >> 8) & 0xff; pixel[2] = color & 0xff; } else { pixel[0] = color & 0xff; pixel[1] = (color >> 8) & 0xff; pixel[2] = (color >> 16) & 0xff; } } break; default: /* case 4 */ dx = dx + dx; pixellast = pixel + dx + dx; for (; pixel <= pixellast; pixel += pixx) { *(Uint32 *) pixel = color; } break; } /* * Unlock surface */ SDL_UnlockSurface(dst); /* * Set result code */ result = 0; } else { /* * Alpha blending blit */ result = HLineAlpha(dst, x1, x1 + w, y, color); } return (result); } int hlineRGBA(SDL_Surface * dst, Sint16 x1, Sint16 x2, Sint16 y, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { /* * Draw */ return (hlineColor(dst, x1, x2, y, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); } /* ----- Vertical line */ int vlineColor(SDL_Surface * dst, Sint16 x, Sint16 y1, Sint16 y2, Uint32 color) { Sint16 left, right, top, bottom; Uint8 *pixel, *pixellast; int dy; int pixx, pixy; Sint16 h; Sint16 ytmp; int result = -1; Uint8 *colorptr; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Swap y1, y2 if required to ensure y1<=y2 */ if (y1 > y2) { ytmp = y1; y1 = y2; y2 = ytmp; } /* * Get clipping boundary and * check visibility of vline */ left = dst->clip_rect.x; right = dst->clip_rect.x + dst->clip_rect.w - 1; if ((xright)) { return (0); } top = dst->clip_rect.y; if (y2clip_rect.y + dst->clip_rect.h - 1; if (y1>bottom) { return(0); } /* * Clip x */ if (y1 < top) { y1 = top; } if (y2 > bottom) { y2 = bottom; } /* * Calculate height */ h = y2 - y1; /* * Alpha check */ if ((color & 255) == 255) { /* * No alpha-blending required */ /* * Setup color */ colorptr = (Uint8 *) & color; if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]); } else { color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]); } /* * Lock surface */ SDL_LockSurface(dst); /* * More variable setup */ dy = h; pixx = dst->format->BytesPerPixel; pixy = dst->pitch; pixel = ((Uint8 *) dst->pixels) + pixx * (int) x + pixy * (int) y1; pixellast = pixel + pixy * dy; /* * Draw */ switch (dst->format->BytesPerPixel) { case 1: for (; pixel <= pixellast; pixel += pixy) { *(Uint8 *) pixel = color; } break; case 2: for (; pixel <= pixellast; pixel += pixy) { *(Uint16 *) pixel = color; } break; case 3: for (; pixel <= pixellast; pixel += pixy) { if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { pixel[0] = (color >> 16) & 0xff; pixel[1] = (color >> 8) & 0xff; pixel[2] = color & 0xff; } else { pixel[0] = color & 0xff; pixel[1] = (color >> 8) & 0xff; pixel[2] = (color >> 16) & 0xff; } } break; default: /* case 4 */ for (; pixel <= pixellast; pixel += pixy) { *(Uint32 *) pixel = color; } break; } /* * Unlock surface */ SDL_UnlockSurface(dst); /* * Set result code */ result = 0; } else { /* * Alpha blending blit */ result = VLineAlpha(dst, x, y1, y1 + h, color); } return (result); } int vlineRGBA(SDL_Surface * dst, Sint16 x, Sint16 y1, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { /* * Draw */ return (vlineColor(dst, x, y1, y2, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); } /* ----- Rectangle */ int rectangleColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color) { int result; Sint16 w, h, xtmp, ytmp; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Swap x1, x2 if required */ if (x1 > x2) { xtmp = x1; x1 = x2; x2 = xtmp; } /* * Swap y1, y2 if required */ if (y1 > y2) { ytmp = y1; y1 = y2; y2 = ytmp; } /* * Calculate width&height */ w = x2 - x1; h = y2 - y1; /* * Sanity check */ if ((w < 0) || (h < 0)) { return (0); } /* * Test for special cases of straight lines or single point */ if (x1 == x2) { if (y1 == y2) { return (pixelColor(dst, x1, y1, color)); } else { return (vlineColor(dst, x1, y1, y2, color)); } } else { if (y1 == y2) { return (hlineColor(dst, x1, x2, y1, color)); } } /* * Draw rectangle */ result = 0; result |= hlineColor(dst, x1, x2, y1, color); result |= hlineColor(dst, x1, x2, y2, color); y1 += 1; y2 -= 1; if (y1<=y2) { result |= vlineColor(dst, x1, y1, y2, color); result |= vlineColor(dst, x2, y1, y2, color); } return (result); } int rectangleRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { /* * Draw */ return (rectangleColor (dst, x1, y1, x2, y2, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); } /* --------- Clipping routines for line */ /* Clipping based heavily on code from */ /* http://www.ncsa.uiuc.edu/Vis/Graphics/src/clipCohSuth.c */ #define CLIP_LEFT_EDGE 0x1 #define CLIP_RIGHT_EDGE 0x2 #define CLIP_BOTTOM_EDGE 0x4 #define CLIP_TOP_EDGE 0x8 #define CLIP_INSIDE(a) (!a) #define CLIP_REJECT(a,b) (a&b) #define CLIP_ACCEPT(a,b) (!(a|b)) static int clipEncode(Sint16 x, Sint16 y, Sint16 left, Sint16 top, Sint16 right, Sint16 bottom) { int code = 0; if (x < left) { code |= CLIP_LEFT_EDGE; } else if (x > right) { code |= CLIP_RIGHT_EDGE; } if (y < top) { code |= CLIP_TOP_EDGE; } else if (y > bottom) { code |= CLIP_BOTTOM_EDGE; } return code; } static int clipLine(SDL_Surface * dst, Sint16 * x1, Sint16 * y1, Sint16 * x2, Sint16 * y2) { Sint16 left, right, top, bottom; int code1, code2; int draw = 0; Sint16 swaptmp; float m; /* * Get clipping boundary */ left = dst->clip_rect.x; right = dst->clip_rect.x + dst->clip_rect.w - 1; top = dst->clip_rect.y; bottom = dst->clip_rect.y + dst->clip_rect.h - 1; while (1) { code1 = clipEncode(*x1, *y1, left, top, right, bottom); code2 = clipEncode(*x2, *y2, left, top, right, bottom); if (CLIP_ACCEPT(code1, code2)) { draw = 1; break; } else if (CLIP_REJECT(code1, code2)) break; else { if (CLIP_INSIDE(code1)) { swaptmp = *x2; *x2 = *x1; *x1 = swaptmp; swaptmp = *y2; *y2 = *y1; *y1 = swaptmp; swaptmp = code2; code2 = code1; code1 = swaptmp; } if (*x2 != *x1) { m = (*y2 - *y1) / (float) (*x2 - *x1); } else { m = 1.0f; } if (code1 & CLIP_LEFT_EDGE) { *y1 += (Sint16) ((left - *x1) * m); *x1 = left; } else if (code1 & CLIP_RIGHT_EDGE) { *y1 += (Sint16) ((right - *x1) * m); *x1 = right; } else if (code1 & CLIP_BOTTOM_EDGE) { if (*x2 != *x1) { *x1 += (Sint16) ((bottom - *y1) / m); } *y1 = bottom; } else if (code1 & CLIP_TOP_EDGE) { if (*x2 != *x1) { *x1 += (Sint16) ((top - *y1) / m); } *y1 = top; } } } return draw; } /* ----- Filled rectangle (Box) */ int boxColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color) { Sint16 left, right, top, bottom; Uint8 *pixel, *pixellast; int x, dx; int dy; int pixx, pixy; Sint16 w, h, tmp; int result; Uint8 *colorptr; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Order coordinates to ensure that * x1<=x2 and y1<=y2 */ if (x1 > x2) { tmp = x1; x1 = x2; x2 = tmp; } if (y1 > y2) { tmp = y1; y1 = y2; y2 = tmp; } /* * Get clipping boundary and * check visibility */ left = dst->clip_rect.x; if (x2clip_rect.x + dst->clip_rect.w - 1; if (x1>right) { return(0); } top = dst->clip_rect.y; if (y2clip_rect.y + dst->clip_rect.h - 1; if (y1>bottom) { return(0); } /* Clip all points */ if (x1right) { x1=right; } if (x2right) { x2=right; } if (y1bottom) { y1=bottom; } if (y2bottom) { y2=bottom; } /* * Test for special cases of straight line or single point */ if (x1 == x2) { if (y1 == y2) { return (pixelColor(dst, x1, y1, color)); } else { return (vlineColor(dst, x1, y1, y2, color)); } } if (y1 == y2) { return (hlineColor(dst, x1, x2, y1, color)); } /* * Calculate width&height */ w = x2 - x1; h = y2 - y1; /* * Alpha check */ if ((color & 255) == 255) { /* * No alpha-blending required */ /* * Setup color */ colorptr = (Uint8 *) & color; if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]); } else { color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]); } /* * Lock surface */ SDL_LockSurface(dst); /* * More variable setup */ dx = w; dy = h; pixx = dst->format->BytesPerPixel; pixy = dst->pitch; pixel = ((Uint8 *) dst->pixels) + pixx * (int) x1 + pixy * (int) y1; pixellast = pixel + pixx * dx + pixy * dy; dx++; /* * Draw */ switch (dst->format->BytesPerPixel) { case 1: for (; pixel <= pixellast; pixel += pixy) { memset(pixel, (Uint8) color, dx); } break; case 2: pixy -= (pixx * dx); for (; pixel <= pixellast; pixel += pixy) { for (x = 0; x < dx; x++) { *(Uint16*) pixel = color; pixel += pixx; } } break; case 3: pixy -= (pixx * dx); for (; pixel <= pixellast; pixel += pixy) { for (x = 0; x < dx; x++) { if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { pixel[0] = (color >> 16) & 0xff; pixel[1] = (color >> 8) & 0xff; pixel[2] = color & 0xff; } else { pixel[0] = color & 0xff; pixel[1] = (color >> 8) & 0xff; pixel[2] = (color >> 16) & 0xff; } pixel += pixx; } } break; default: /* case 4 */ pixy -= (pixx * dx); for (; pixel <= pixellast; pixel += pixy) { for (x = 0; x < dx; x++) { *(Uint32 *) pixel = color; pixel += pixx; } } break; } /* * Unlock surface */ SDL_UnlockSurface(dst); result = 0; } else { result = filledRectAlpha(dst, x1, y1, x1 + w, y1 + h, color); } return (result); } int boxRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { /* * Draw */ return (boxColor(dst, x1, y1, x2, y2, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); } /* ----- Line */ /* Non-alpha line drawing code adapted from routine */ /* by Pete Shinners, pete@shinners.org */ /* Originally from pygame, http://pygame.seul.org */ #define ABS(a) (((a)<0) ? -(a) : (a)) int lineColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color) { int pixx, pixy; int x, y; int dx, dy; int ax, ay; int sx, sy; int swaptmp; Uint8 *pixel; Uint8 *colorptr; /* * Clip line and test if we have to draw */ if (!(clipLine(dst, &x1, &y1, &x2, &y2))) { return (0); } /* * Test for special cases of straight lines or single point */ if (x1 == x2) { if (y1 < y2) { return (vlineColor(dst, x1, y1, y2, color)); } else if (y1 > y2) { return (vlineColor(dst, x1, y2, y1, color)); } else { return (pixelColor(dst, x1, y1, color)); } } if (y1 == y2) { if (x1 < x2) { return (hlineColor(dst, x1, x2, y1, color)); } else if (x1 > x2) { return (hlineColor(dst, x2, x1, y1, color)); } } /* * Variable setup */ dx = x2 - x1; dy = y2 - y1; sx = (dx >= 0) ? 1 : -1; sy = (dy >= 0) ? 1 : -1; /* Lock surface */ if (SDL_MUSTLOCK(dst)) { if (SDL_LockSurface(dst) < 0) { return (-1); } } /* * Check for alpha blending */ if ((color & 255) == 255) { /* * No alpha blending - use fast pixel routines */ /* * Setup color */ colorptr = (Uint8 *) & color; if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]); } else { color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]); } /* * More variable setup */ dx = sx * dx + 1; dy = sy * dy + 1; pixx = dst->format->BytesPerPixel; pixy = dst->pitch; pixel = ((Uint8 *) dst->pixels) + pixx * (int) x1 + pixy * (int) y1; pixx *= sx; pixy *= sy; if (dx < dy) { swaptmp = dx; dx = dy; dy = swaptmp; swaptmp = pixx; pixx = pixy; pixy = swaptmp; } /* * Draw */ x = 0; y = 0; switch (dst->format->BytesPerPixel) { case 1: for (; x < dx; x++, pixel += pixx) { *pixel = color; y += dy; if (y >= dx) { y -= dx; pixel += pixy; } } break; case 2: for (; x < dx; x++, pixel += pixx) { *(Uint16 *) pixel = color; y += dy; if (y >= dx) { y -= dx; pixel += pixy; } } break; case 3: for (; x < dx; x++, pixel += pixx) { if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { pixel[0] = (color >> 16) & 0xff; pixel[1] = (color >> 8) & 0xff; pixel[2] = color & 0xff; } else { pixel[0] = color & 0xff; pixel[1] = (color >> 8) & 0xff; pixel[2] = (color >> 16) & 0xff; } y += dy; if (y >= dx) { y -= dx; pixel += pixy; } } break; default: /* case 4 */ for (; x < dx; x++, pixel += pixx) { *(Uint32 *) pixel = color; y += dy; if (y >= dx) { y -= dx; pixel += pixy; } } break; } } else { /* * Alpha blending required - use single-pixel blits */ ax = ABS(dx) << 1; ay = ABS(dy) << 1; x = x1; y = y1; if (ax > ay) { int d = ay - (ax >> 1); while (x != x2) { pixelColorNolock (dst, x, y, color); if (d > 0 || (d == 0 && sx == 1)) { y += sy; d -= ax; } x += sx; d += ay; } } else { int d = ax - (ay >> 1); while (y != y2) { pixelColorNolock (dst, x, y, color); if (d > 0 || ((d == 0) && (sy == 1))) { x += sx; d -= ay; } y += sy; d += ax; } } pixelColorNolock (dst, x, y, color); } /* Unlock surface */ if (SDL_MUSTLOCK(dst)) { SDL_UnlockSurface(dst); } return (0); } int lineRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { /* * Draw */ return (lineColor(dst, x1, y1, x2, y2, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); } /* AA Line */ #define AAlevels 256 #define AAbits 8 /* This implementation of the Wu antialiasing code is based on Mike Abrash's DDJ article which was reprinted as Chapter 42 of his Graphics Programming Black Book, but has been optimized to work with SDL and utilizes 32-bit fixed-point arithmetic. (A. Schiffler). */ int aalineColorInt(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color, int draw_endpoint) { Sint32 xx0, yy0, xx1, yy1; int result; Uint32 intshift, erracc, erradj; Uint32 erracctmp, wgt, wgtcompmask; int dx, dy, tmp, xdir, y0p1, x0pxdir; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Clip line and test if we have to draw */ if (!(clipLine(dst, &x1, &y1, &x2, &y2))) { return (0); } /* * Keep on working with 32bit numbers */ xx0 = x1; yy0 = y1; xx1 = x2; yy1 = y2; /* * Reorder points if required */ if (yy0 > yy1) { tmp = yy0; yy0 = yy1; yy1 = tmp; tmp = xx0; xx0 = xx1; xx1 = tmp; } /* * Calculate distance */ dx = xx1 - xx0; dy = yy1 - yy0; /* * Adjust for negative dx and set xdir */ if (dx >= 0) { xdir = 1; } else { xdir = -1; dx = (-dx); } /* * Check for special cases */ if (dx == 0) { /* * Vertical line */ return (vlineColor(dst, x1, y1, y2, color)); } else if (dy == 0) { /* * Horizontal line */ return (hlineColor(dst, x1, x2, y1, color)); } else if (dx == dy) { /* * Diagonal line */ return (lineColor(dst, x1, y1, x2, y2, color)); } /* * Line is not horizontal, vertical or diagonal */ result = 0; /* * Zero accumulator */ erracc = 0; /* * # of bits by which to shift erracc to get intensity level */ intshift = 32 - AAbits; /* * Mask used to flip all bits in an intensity weighting */ wgtcompmask = AAlevels - 1; /* Lock surface */ if (SDL_MUSTLOCK(dst)) { if (SDL_LockSurface(dst) < 0) { return (-1); } } /* * Draw the initial pixel in the foreground color */ result |= pixelColorNolock(dst, x1, y1, color); /* * x-major or y-major? */ if (dy > dx) { /* * y-major. Calculate 16-bit fixed point fractional part of a pixel that * X advances every time Y advances 1 pixel, truncating the result so that * we won't overrun the endpoint along the X axis */ /* * Not-so-portable version: erradj = ((Uint64)dx << 32) / (Uint64)dy; */ erradj = ((dx << 16) / dy) << 16; /* * draw all pixels other than the first and last */ x0pxdir = xx0 + xdir; while (--dy) { erracctmp = erracc; erracc += erradj; if (erracc <= erracctmp) { /* * rollover in error accumulator, x coord advances */ xx0 = x0pxdir; x0pxdir += xdir; } yy0++; /* y-major so always advance Y */ /* * the AAbits most significant bits of erracc give us the intensity * weighting for this pixel, and the complement of the weighting for * the paired pixel. */ wgt = (erracc >> intshift) & 255; result |= pixelColorWeightNolock (dst, xx0, yy0, color, 255 - wgt); result |= pixelColorWeightNolock (dst, x0pxdir, yy0, color, wgt); } } else { /* * x-major line. Calculate 16-bit fixed-point fractional part of a pixel * that Y advances each time X advances 1 pixel, truncating the result so * that we won't overrun the endpoint along the X axis. */ /* * Not-so-portable version: erradj = ((Uint64)dy << 32) / (Uint64)dx; */ erradj = ((dy << 16) / dx) << 16; /* * draw all pixels other than the first and last */ y0p1 = yy0 + 1; while (--dx) { erracctmp = erracc; erracc += erradj; if (erracc <= erracctmp) { /* * Accumulator turned over, advance y */ yy0 = y0p1; y0p1++; } xx0 += xdir; /* x-major so always advance X */ /* * the AAbits most significant bits of erracc give us the intensity * weighting for this pixel, and the complement of the weighting for * the paired pixel. */ wgt = (erracc >> intshift) & 255; result |= pixelColorWeightNolock (dst, xx0, yy0, color, 255 - wgt); result |= pixelColorWeightNolock (dst, xx0, y0p1, color, wgt); } } /* * Do we have to draw the endpoint */ if (draw_endpoint) { /* * Draw final pixel, always exactly intersected by the line and doesn't * need to be weighted. */ result |= pixelColorNolock (dst, x2, y2, color); } /* Unlock surface */ if (SDL_MUSTLOCK(dst)) { SDL_UnlockSurface(dst); } return (result); } int aalineColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color) { return (aalineColorInt(dst, x1, y1, x2, y2, color, 1)); } int aalineRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { return (aalineColorInt (dst, x1, y1, x2, y2, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a, 1)); } /* ----- Circle */ /* Note: Based on algorithm from sge library, modified by A. Schiffler */ /* with multiple pixel-draw removal and other minor speedup changes. */ int circleColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 r, Uint32 color) { Sint16 left, right, top, bottom; int result; Sint16 x1, y1, x2, y2; Sint16 cx = 0; Sint16 cy = r; Sint16 ocx = (Sint16) 0xffff; Sint16 ocy = (Sint16) 0xffff; Sint16 df = 1 - r; Sint16 d_e = 3; Sint16 d_se = -2 * r + 5; Sint16 xpcx, xmcx, xpcy, xmcy; Sint16 ypcy, ymcy, ypcx, ymcx; Uint8 *colorptr; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Sanity check radius */ if (r < 0) { return (-1); } /* * Special case for r=0 - draw a point */ if (r == 0) { return (pixelColor(dst, x, y, color)); } /* * Get circle and clipping boundary and * test if bounding box of circle is visible */ x2 = x + r; left = dst->clip_rect.x; if (x2clip_rect.x + dst->clip_rect.w - 1; if (x1>right) { return(0); } y2 = y + r; top = dst->clip_rect.y; if (y2clip_rect.y + dst->clip_rect.h - 1; if (y1>bottom) { return(0); } /* * Draw circle */ result = 0; /* Lock surface */ if (SDL_MUSTLOCK(dst)) { if (SDL_LockSurface(dst) < 0) { return (-1); } } /* * Alpha Check */ if ((color & 255) == 255) { /* * No Alpha - direct memory writes */ /* * Setup color */ colorptr = (Uint8 *) & color; if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]); } else { color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]); } /* * Draw */ do { ypcy = y + cy; ymcy = y - cy; if (cx > 0) { xpcx = x + cx; xmcx = x - cx; result |= fastPixelColorNolock(dst, xmcx, ypcy, color); result |= fastPixelColorNolock(dst, xpcx, ypcy, color); result |= fastPixelColorNolock(dst, xmcx, ymcy, color); result |= fastPixelColorNolock(dst, xpcx, ymcy, color); } else { result |= fastPixelColorNolock(dst, x, ymcy, color); result |= fastPixelColorNolock(dst, x, ypcy, color); } xpcy = x + cy; xmcy = x - cy; if ((cx > 0) && (cx != cy)) { ypcx = y + cx; ymcx = y - cx; result |= fastPixelColorNolock(dst, xmcy, ypcx, color); result |= fastPixelColorNolock(dst, xpcy, ypcx, color); result |= fastPixelColorNolock(dst, xmcy, ymcx, color); result |= fastPixelColorNolock(dst, xpcy, ymcx, color); } else if (cx == 0) { result |= fastPixelColorNolock(dst, xmcy, y, color); result |= fastPixelColorNolock(dst, xpcy, y, color); } /* * Update */ if (df < 0) { df += d_e; d_e += 2; d_se += 2; } else { df += d_se; d_e += 2; d_se += 4; cy--; } cx++; } while (cx <= cy); /* * Unlock surface */ SDL_UnlockSurface(dst); } else { /* * Using Alpha - blended pixel blits */ do { /* * Draw */ ypcy = y + cy; ymcy = y - cy; if (cx > 0) { xpcx = x + cx; xmcx = x - cx; result |= pixelColorNolock (dst, xmcx, ypcy, color); result |= pixelColorNolock (dst, xpcx, ypcy, color); result |= pixelColorNolock (dst, xmcx, ymcy, color); result |= pixelColorNolock (dst, xpcx, ymcy, color); } else { result |= pixelColorNolock (dst, x, ymcy, color); result |= pixelColorNolock (dst, x, ypcy, color); } xpcy = x + cy; xmcy = x - cy; if ((cx > 0) && (cx != cy)) { ypcx = y + cx; ymcx = y - cx; result |= pixelColorNolock (dst, xmcy, ypcx, color); result |= pixelColorNolock (dst, xpcy, ypcx, color); result |= pixelColorNolock (dst, xmcy, ymcx, color); result |= pixelColorNolock (dst, xpcy, ymcx, color); } else if (cx == 0) { result |= pixelColorNolock (dst, xmcy, y, color); result |= pixelColorNolock (dst, xpcy, y, color); } /* * Update */ if (df < 0) { df += d_e; d_e += 2; d_se += 2; } else { df += d_se; d_e += 2; d_se += 4; cy--; } cx++; } while (cx <= cy); } /* Alpha check */ /* Unlock surface */ if (SDL_MUSTLOCK(dst)) { SDL_UnlockSurface(dst); } return (result); } int circleRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { /* * Draw */ return (circleColor(dst, x, y, rad, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); } /* ----- Arc */ /* Note: Based on above circle algorithm by A. Schiffler below. Written by D. Raber */ /* Calculates which octants arc goes through and renders accordingly */ int arcColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 r, Sint16 start, Sint16 end, Uint32 color) { Sint16 left, right, top, bottom; int result; Sint16 x1, y1, x2, y2; Sint16 cx = 0; Sint16 cy = r; Sint16 ocx = (Sint16) 0xffff; Sint16 ocy = (Sint16) 0xffff; Sint16 df = 1 - r; Sint16 d_e = 3; Sint16 d_se = -2 * r + 5; Sint16 xpcx, xmcx, xpcy, xmcy; Sint16 ypcy, ymcy, ypcx, ymcx; Uint8 *colorptr; Uint8 drawoct; int startoct, endoct, oct, stopval_start, stopval_end; double temp; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Sanity check radius */ if (r < 0) { return (-1); } /* * Special case for r=0 - draw a point */ if (r == 0) { return (pixelColor(dst, x, y, color)); } /* * Fixup angles */ start = start % 360; end = end % 360; /* * Get arc's circle and clipping boundary and * test if bounding box of circle is visible */ x2 = x + r; left = dst->clip_rect.x; if (x2clip_rect.x + dst->clip_rect.w - 1; if (x1>right) { return(0); } y2 = y + r; top = dst->clip_rect.y; if (y2clip_rect.y + dst->clip_rect.h - 1; if (y1>bottom) { return(0); } /* * Draw arc */ result = 0; /* Lock surface */ if (SDL_MUSTLOCK(dst)) { if (SDL_LockSurface(dst) < 0) { return (-1); } } // Octant labelling // // \ 5 | 6 / // \ | / // 4 \ | / 7 // \|/ //------+------ +x // /|\ // 3 / | \ 0 // / | \ // / 2 | 1 \ // +y drawoct = 0; // 0x00000000 // whether or not to keep drawing a given octant. // For example: 0x00111100 means we're drawing in octants 2-5 // 0 <= start & end < 360; note that sometimes start > end - if so, arc goes back through 0. while (start < 0) start += 360; while (end < 0) end += 360; start %= 360; end %= 360; // now, we find which octants we're drawing in. startoct = start / 45; endoct = end / 45; oct = startoct - 1; // we increment as first step in loop //stopval_start, stopval_end; // what values of cx to stop at. do { oct = (oct + 1) % 8; if (oct == startoct) { // need to compute stopval_start for this octant. Look at picture above if this is unclear switch (oct) { case 0: case 3: temp = sin(start * M_PI / 180); break; case 1: case 6: temp = cos(start * M_PI / 180); break; case 2: case 5: temp = -cos(start * M_PI / 180); break; case 4: case 7: temp = -sin(start * M_PI / 180); break; } temp *= r; stopval_start = (int)temp; // always round down. // This isn't arbitrary, but requires graph paper to explain well. // The basic idea is that we're always changing drawoct after we draw, so we // stop immediately after we render the last sensible pixel at x = ((int)temp). // and whether to draw in this octant initially if (oct % 2) drawoct |= (1 << oct); // this is basically like saying drawoct[oct] = true, if drawoct were a bool array else drawoct &= 255 - (1 << oct); // this is basically like saying drawoct[oct] = false } if (oct == endoct) { // need to compute stopval_end for this octant switch (oct) { case 0: case 3: temp = sin(end * M_PI / 180); break; case 1: case 6: temp = cos(end * M_PI / 180); break; case 2: case 5: temp = -cos(end * M_PI / 180); break; case 4: case 7: temp = -sin(end * M_PI / 180); break; } temp *= r; stopval_end = (int)temp; // and whether to draw in this octant initially if (startoct == endoct) { // note: we start drawing, stop, then start again in this case // otherwise: we only draw in this octant, so initialize it to false, it will get set back to true if (start > end) { // unfortunately, if we're in the same octant and need to draw over the whole circle, // we need to set the rest to true, because the while loop will end at the bottom. drawoct = 255; } else { drawoct &= 255 - (1 << oct); } } else if (oct % 2) drawoct &= 255 - (1 << oct); else drawoct |= (1 << oct); } else if (oct != startoct) { // already verified that it's != endoct drawoct |= (1 << oct); // draw this entire segment } } while (oct != endoct); // so now we have what octants to draw and when to draw them. all that's left is the actual raster code. /* * Alpha Check */ if ((color & 255) == 255) { /* * No Alpha - direct memory writes */ /* * Setup color */ colorptr = (Uint8 *) & color; if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]); } else { color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]); } /* * Draw */ do { ypcy = y + cy; ymcy = y - cy; if (cx > 0) { xpcx = x + cx; xmcx = x - cx; // always check if we're drawing a certain octant before adding a pixel to that octant. if (drawoct & 4) result |= fastPixelColorNolock(dst, xmcx, ypcy, color); // drawoct & 4 = 22; drawoct[2] if (drawoct & 2) result |= fastPixelColorNolock(dst, xpcx, ypcy, color); if (drawoct & 32) result |= fastPixelColorNolock(dst, xmcx, ymcy, color); if (drawoct & 64) result |= fastPixelColorNolock(dst, xpcx, ymcy, color); } else { if (drawoct & 6) result |= fastPixelColorNolock(dst, x, ypcy, color); // 4 + 2; drawoct[2] || drawoct[1] if (drawoct & 96) result |= fastPixelColorNolock(dst, x, ymcy, color); // 32 + 64 } xpcy = x + cy; xmcy = x - cy; if (cx > 0 && cx != cy) { ypcx = y + cx; ymcx = y - cx; if (drawoct & 8) result |= fastPixelColorNolock(dst, xmcy, ypcx, color); if (drawoct & 1) result |= fastPixelColorNolock(dst, xpcy, ypcx, color); if (drawoct & 16) result |= fastPixelColorNolock(dst, xmcy, ymcx, color); if (drawoct & 128) result |= fastPixelColorNolock(dst, xpcy, ymcx, color); } else if (cx == 0) { if (drawoct & 24) result |= fastPixelColorNolock(dst, xmcy, y, color); // 8 + 16 if (drawoct & 129) result |= fastPixelColorNolock(dst, xpcy, y, color); // 1 + 128 } /* * Update whether we're drawing an octant */ if (stopval_start == cx) { // works like an on-off switch because start & end may be in the same octant. if (drawoct & (1 << startoct)) drawoct &= 255 - (1 << startoct); else drawoct |= (1 << startoct); } if (stopval_end == cx) { if (drawoct & (1 << endoct)) drawoct &= 255 - (1 << endoct); else drawoct |= (1 << endoct); } /* * Update pixels */ if (df < 0) { df += d_e; d_e += 2; d_se += 2; } else { df += d_se; d_e += 2; d_se += 4; cy--; } cx++; } while (cx <= cy); /* * Unlock surface */ SDL_UnlockSurface(dst); } else { /* * Using Alpha - blended pixel blits */ do { ypcy = y + cy; ymcy = y - cy; if (cx > 0) { xpcx = x + cx; xmcx = x - cx; // always check if we're drawing a certain octant before adding a pixel to that octant. if (drawoct & 4) result |= pixelColorNolock(dst, xmcx, ypcy, color); if (drawoct & 2) result |= pixelColorNolock(dst, xpcx, ypcy, color); if (drawoct & 32) result |= pixelColorNolock(dst, xmcx, ymcy, color); if (drawoct & 64) result |= pixelColorNolock(dst, xpcx, ymcy, color); } else { if (drawoct & 96) result |= pixelColorNolock(dst, x, ymcy, color); if (drawoct & 6) result |= pixelColorNolock(dst, x, ypcy, color); } xpcy = x + cy; xmcy = x - cy; if (cx > 0 && cx != cy) { ypcx = y + cx; ymcx = y - cx; if (drawoct & 8) result |= pixelColorNolock(dst, xmcy, ypcx, color); if (drawoct & 1) result |= pixelColorNolock(dst, xpcy, ypcx, color); if (drawoct & 16) result |= pixelColorNolock(dst, xmcy, ymcx, color); if (drawoct & 128) result |= pixelColorNolock(dst, xpcy, ymcx, color); } else if (cx == 0) { if (drawoct & 24) result |= pixelColorNolock(dst, xmcy, y, color); if (drawoct & 129) result |= pixelColorNolock(dst, xpcy, y, color); } /* * Update whether we're drawing an octant */ if (stopval_start == cx) { // works like an on-off switch. // This is just in case start & end are in the same octant. if (drawoct & (1 << startoct)) drawoct &= 255 - (1 << startoct); else drawoct |= (1 << startoct); } if (stopval_end == cx) { if (drawoct & (1 << endoct)) drawoct &= 255 - (1 << endoct); else drawoct |= (1 << endoct); } /* * Update pixels */ if (df < 0) { df += d_e; d_e += 2; d_se += 2; } else { df += d_se; d_e += 2; d_se += 4; cy--; } cx++; } while (cx <= cy); } /* Alpha check */ /* Unlock surface */ if (SDL_MUSTLOCK(dst)) { SDL_UnlockSurface(dst); } return (result); } int arcRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { /* * Draw */ return (arcColor(dst, x, y, rad, start, end, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); } /* ----- AA Circle */ /* AA circle is based on AAellipse */ int aacircleColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 r, Uint32 color) { return (aaellipseColor(dst, x, y, r, r, color)); } int aacircleRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { /* * Draw */ return (aaellipseColor (dst, x, y, rad, rad, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); } /* ----- Filled Circle */ /* Note: Based on algorithm from sge library with multiple-hline draw removal */ /* and other speedup changes. */ int filledCircleColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 r, Uint32 color) { Sint16 left, right, top, bottom; int result; Sint16 x1, y1, x2, y2; Sint16 cx = 0; Sint16 cy = r; Sint16 ocx = (Sint16) 0xffff; Sint16 ocy = (Sint16) 0xffff; Sint16 df = 1 - r; Sint16 d_e = 3; Sint16 d_se = -2 * r + 5; Sint16 xpcx, xmcx, xpcy, xmcy; Sint16 ypcy, ymcy, ypcx, ymcx; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Sanity check radius */ if (r < 0) { return (-1); } /* * Special case for r=0 - draw a point */ if (r == 0) { return (pixelColor(dst, x, y, color)); } /* * Get circle and clipping boundary and * test if bounding box of circle is visible */ x2 = x + r; left = dst->clip_rect.x; if (x2clip_rect.x + dst->clip_rect.w - 1; if (x1>right) { return(0); } y2 = y + r; top = dst->clip_rect.y; if (y2clip_rect.y + dst->clip_rect.h - 1; if (y1>bottom) { return(0); } /* * Draw */ result = 0; do { xpcx = x + cx; xmcx = x - cx; xpcy = x + cy; xmcy = x - cy; if (ocy != cy) { if (cy > 0) { ypcy = y + cy; ymcy = y - cy; result |= hlineColor(dst, xmcx, xpcx, ypcy, color); result |= hlineColor(dst, xmcx, xpcx, ymcy, color); } else { result |= hlineColor(dst, xmcx, xpcx, y, color); } ocy = cy; } if (ocx != cx) { if (cx != cy) { if (cx > 0) { ypcx = y + cx; ymcx = y - cx; result |= hlineColor(dst, xmcy, xpcy, ymcx, color); result |= hlineColor(dst, xmcy, xpcy, ypcx, color); } else { result |= hlineColor(dst, xmcy, xpcy, y, color); } } ocx = cx; } /* * Update */ if (df < 0) { df += d_e; d_e += 2; d_se += 2; } else { df += d_se; d_e += 2; d_se += 4; cy--; } cx++; } while (cx <= cy); return (result); } int filledCircleRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { /* * Draw */ return (filledCircleColor (dst, x, y, rad, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); } /* ----- Ellipse */ /* Note: Based on algorithm from sge library with multiple-hline draw removal */ /* and other speedup changes. */ int ellipseColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint32 color) { Sint16 left, right, top, bottom; int result; Sint16 x1, y1, x2, y2; int ix, iy; int h, i, j, k; int oh, oi, oj, ok; int xmh, xph, ypk, ymk; int xmi, xpi, ymj, ypj; int xmj, xpj, ymi, ypi; int xmk, xpk, ymh, yph; Uint8 *colorptr; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Sanity check radii */ if ((rx < 0) || (ry < 0)) { return (-1); } /* * Special case for rx=0 - draw a vline */ if (rx == 0) { return (vlineColor(dst, x, y - ry, y + ry, color)); } /* * Special case for ry=0 - draw a hline */ if (ry == 0) { return (hlineColor(dst, x - rx, x + rx, y, color)); } /* * Get circle and clipping boundary and * test if bounding box of circle is visible */ x2 = x + rx; left = dst->clip_rect.x; if (x2clip_rect.x + dst->clip_rect.w - 1; if (x1>right) { return(0); } y2 = y + ry; top = dst->clip_rect.y; if (y2clip_rect.y + dst->clip_rect.h - 1; if (y1>bottom) { return(0); } /* * Init vars */ oh = oi = oj = ok = 0xFFFF; /* * Draw */ result = 0; /* Lock surface */ if (SDL_MUSTLOCK(dst)) { if (SDL_LockSurface(dst) < 0) { return (-1); } } /* * Check alpha */ if ((color & 255) == 255) { /* * No Alpha - direct memory writes */ /* * Setup color */ colorptr = (Uint8 *) & color; if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]); } else { color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]); } if (rx > ry) { ix = 0; iy = rx * 64; do { h = (ix + 32) >> 6; i = (iy + 32) >> 6; j = (h * ry) / rx; k = (i * ry) / rx; if (((ok != k) && (oj != k)) || ((oj != j) && (ok != j)) || (k != j)) { xph = x + h; xmh = x - h; if (k > 0) { ypk = y + k; ymk = y - k; result |= fastPixelColorNolock(dst, xmh, ypk, color); result |= fastPixelColorNolock(dst, xph, ypk, color); result |= fastPixelColorNolock(dst, xmh, ymk, color); result |= fastPixelColorNolock(dst, xph, ymk, color); } else { result |= fastPixelColorNolock(dst, xmh, y, color); result |= fastPixelColorNolock(dst, xph, y, color); } ok = k; xpi = x + i; xmi = x - i; if (j > 0) { ypj = y + j; ymj = y - j; result |= fastPixelColorNolock(dst, xmi, ypj, color); result |= fastPixelColorNolock(dst, xpi, ypj, color); result |= fastPixelColorNolock(dst, xmi, ymj, color); result |= fastPixelColorNolock(dst, xpi, ymj, color); } else { result |= fastPixelColorNolock(dst, xmi, y, color); result |= fastPixelColorNolock(dst, xpi, y, color); } oj = j; } ix = ix + iy / rx; iy = iy - ix / rx; } while (i > h); } else { ix = 0; iy = ry * 64; do { h = (ix + 32) >> 6; i = (iy + 32) >> 6; j = (h * rx) / ry; k = (i * rx) / ry; if (((oi != i) && (oh != i)) || ((oh != h) && (oi != h) && (i != h))) { xmj = x - j; xpj = x + j; if (i > 0) { ypi = y + i; ymi = y - i; result |= fastPixelColorNolock(dst, xmj, ypi, color); result |= fastPixelColorNolock(dst, xpj, ypi, color); result |= fastPixelColorNolock(dst, xmj, ymi, color); result |= fastPixelColorNolock(dst, xpj, ymi, color); } else { result |= fastPixelColorNolock(dst, xmj, y, color); result |= fastPixelColorNolock(dst, xpj, y, color); } oi = i; xmk = x - k; xpk = x + k; if (h > 0) { yph = y + h; ymh = y - h; result |= fastPixelColorNolock(dst, xmk, yph, color); result |= fastPixelColorNolock(dst, xpk, yph, color); result |= fastPixelColorNolock(dst, xmk, ymh, color); result |= fastPixelColorNolock(dst, xpk, ymh, color); } else { result |= fastPixelColorNolock(dst, xmk, y, color); result |= fastPixelColorNolock(dst, xpk, y, color); } oh = h; } ix = ix + iy / ry; iy = iy - ix / ry; } while (i > h); } } else { if (rx > ry) { ix = 0; iy = rx * 64; do { h = (ix + 32) >> 6; i = (iy + 32) >> 6; j = (h * ry) / rx; k = (i * ry) / rx; if (((ok != k) && (oj != k)) || ((oj != j) && (ok != j)) || (k != j)) { xph = x + h; xmh = x - h; if (k > 0) { ypk = y + k; ymk = y - k; result |= pixelColorNolock (dst, xmh, ypk, color); result |= pixelColorNolock (dst, xph, ypk, color); result |= pixelColorNolock (dst, xmh, ymk, color); result |= pixelColorNolock (dst, xph, ymk, color); } else { result |= pixelColorNolock (dst, xmh, y, color); result |= pixelColorNolock (dst, xph, y, color); } ok = k; xpi = x + i; xmi = x - i; if (j > 0) { ypj = y + j; ymj = y - j; result |= pixelColorNolock (dst, xmi, ypj, color); result |= pixelColorNolock (dst, xpi, ypj, color); result |= pixelColorNolock (dst, xmi, ymj, color); result |= pixelColor(dst, xpi, ymj, color); } else { result |= pixelColorNolock (dst, xmi, y, color); result |= pixelColorNolock (dst, xpi, y, color); } oj = j; } ix = ix + iy / rx; iy = iy - ix / rx; } while (i > h); } else { ix = 0; iy = ry * 64; do { h = (ix + 32) >> 6; i = (iy + 32) >> 6; j = (h * rx) / ry; k = (i * rx) / ry; if (((oi != i) && (oh != i)) || ((oh != h) && (oi != h) && (i != h))) { xmj = x - j; xpj = x + j; if (i > 0) { ypi = y + i; ymi = y - i; result |= pixelColorNolock (dst, xmj, ypi, color); result |= pixelColorNolock (dst, xpj, ypi, color); result |= pixelColorNolock (dst, xmj, ymi, color); result |= pixelColorNolock (dst, xpj, ymi, color); } else { result |= pixelColorNolock (dst, xmj, y, color); result |= pixelColorNolock (dst, xpj, y, color); } oi = i; xmk = x - k; xpk = x + k; if (h > 0) { yph = y + h; ymh = y - h; result |= pixelColorNolock (dst, xmk, yph, color); result |= pixelColorNolock (dst, xpk, yph, color); result |= pixelColorNolock (dst, xmk, ymh, color); result |= pixelColorNolock (dst, xpk, ymh, color); } else { result |= pixelColorNolock (dst, xmk, y, color); result |= pixelColorNolock (dst, xpk, y, color); } oh = h; } ix = ix + iy / ry; iy = iy - ix / ry; } while (i > h); } } /* Alpha check */ /* Unlock surface */ if (SDL_MUSTLOCK(dst)) { SDL_UnlockSurface(dst); } return (result); } int ellipseRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { /* * Draw */ return (ellipseColor(dst, x, y, rx, ry, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); } /* ----- AA Ellipse */ /* Win32 does not have lrint, so provide a local inline version */ /* sweetlilmre: added hack to detect MinGW and avoid function */ #if defined(_WIN32) && !defined(__MINGW_H) && !defined(__SYMBIAN32__) __inline long int lrint (double flt) { int intgr; _asm { fld flt fistp intgr }; return intgr; } #endif /* Based on code from Anders Lindstroem, based on code from SGE, based on code from TwinLib */ int aaellipseColor(SDL_Surface * dst, Sint16 xc, Sint16 yc, Sint16 rx, Sint16 ry, Uint32 color) { Sint16 left, right, top, bottom; Sint16 x1,y1,x2,y2; int i; int a2, b2, ds, dt, dxt, t, s, d; Sint16 x, y, xs, ys, dyt, od, xx, yy, xc2, yc2; float cp; double sab; Uint8 weight, iweight; int result; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Sanity check radii */ if ((rx < 0) || (ry < 0)) { return (-1); } /* * Special case for rx=0 - draw a vline */ if (rx == 0) { return (vlineColor(dst, xc, yc - ry, yc + ry, color)); } /* * Special case for ry=0 - draw a hline */ if (ry == 0) { return (hlineColor(dst, xc - rx, xc + rx, yc, color)); } /* * Get circle and clipping boundary and * test if bounding box of circle is visible */ x2 = xc + rx; left = dst->clip_rect.x; if (x2clip_rect.x + dst->clip_rect.w - 1; if (x1>right) { return(0); } y2 = yc + ry; top = dst->clip_rect.y; if (y2clip_rect.y + dst->clip_rect.h - 1; if (y1>bottom) { return(0); } /* Variable setup */ a2 = rx * rx; b2 = ry * ry; ds = 2 * a2; dt = 2 * b2; xc2 = 2 * xc; yc2 = 2 * yc; sab = sqrt(a2 + b2); od = lrint(sab*0.01) + 1; /* introduce some overdraw */ dxt = lrint((double)a2 / sab) + od; t = 0; s = -2 * a2 * ry; d = 0; x = xc; y = yc - ry; /* Draw */ result = 0; /* Lock surface */ if (SDL_MUSTLOCK(dst)) { if (SDL_LockSurface(dst) < 0) { return (-1); } } /* "End points" */ result |= pixelColorNolock(dst, x, y, color); result |= pixelColorNolock(dst, xc2 - x, y, color); result |= pixelColorNolock(dst, x, yc2 - y, color); result |= pixelColorNolock(dst, xc2 - x, yc2 - y, color); for (i = 1; i <= dxt; i++) { x--; d += t - b2; if (d >= 0) ys = y - 1; else if ((d - s - a2) > 0) { if ((2 * d - s - a2) >= 0) ys = y + 1; else { ys = y; y++; d -= s + a2; s += ds; } } else { y++; ys = y + 1; d -= s + a2; s += ds; } t -= dt; /* Calculate alpha */ if (s != 0.0) { cp = (float) abs(d) / (float) abs(s); if (cp > 1.0) { cp = 1.0; } } else { cp = 1.0; } /* Calculate weights */ weight = (Uint8) (cp * 255); iweight = 255 - weight; /* Upper half */ xx = xc2 - x; result |= pixelColorWeightNolock(dst, x, y, color, iweight); result |= pixelColorWeightNolock(dst, xx, y, color, iweight); result |= pixelColorWeightNolock(dst, x, ys, color, weight); result |= pixelColorWeightNolock(dst, xx, ys, color, weight); /* Lower half */ yy = yc2 - y; result |= pixelColorWeightNolock(dst, x, yy, color, iweight); result |= pixelColorWeightNolock(dst, xx, yy, color, iweight); yy = yc2 - ys; result |= pixelColorWeightNolock(dst, x, yy, color, weight); result |= pixelColorWeightNolock(dst, xx, yy, color, weight); } /* Replaces original approximation code dyt = abs(y - yc); */ dyt = lrint((double)b2 / sab ) + od; for (i = 1; i <= dyt; i++) { y++; d -= s + a2; if (d <= 0) xs = x + 1; else if ((d + t - b2) < 0) { if ((2 * d + t - b2) <= 0) xs = x - 1; else { xs = x; x--; d += t - b2; t -= dt; } } else { x--; xs = x - 1; d += t - b2; t -= dt; } s += ds; /* Calculate alpha */ if (t != 0.0) { cp = (float) abs(d) / (float) abs(t); if (cp > 1.0) { cp = 1.0; } } else { cp = 1.0; } /* Calculate weight */ weight = (Uint8) (cp * 255); iweight = 255 - weight; /* Left half */ xx = xc2 - x; yy = yc2 - y; result |= pixelColorWeightNolock(dst, x, y, color, iweight); result |= pixelColorWeightNolock(dst, xx, y, color, iweight); result |= pixelColorWeightNolock(dst, x, yy, color, iweight); result |= pixelColorWeightNolock(dst, xx, yy, color, iweight); /* Right half */ xx = 2 * xc - xs; result |= pixelColorWeightNolock(dst, xs, y, color, weight); result |= pixelColorWeightNolock(dst, xx, y, color, weight); result |= pixelColorWeightNolock(dst, xs, yy, color, weight); result |= pixelColorWeightNolock(dst, xx, yy, color, weight); } /* Unlock surface */ if (SDL_MUSTLOCK(dst)) { SDL_UnlockSurface(dst); } return (result); } int aaellipseRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { /* * Draw */ return (aaellipseColor (dst, x, y, rx, ry, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); } /* ---- Filled Ellipse */ /* Note: */ /* Based on algorithm from sge library with multiple-hline draw removal */ /* and other speedup changes. */ int filledEllipseColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint32 color) { Sint16 left, right, top, bottom; int result; Sint16 x1, y1, x2, y2; int ix, iy; int h, i, j, k; int oh, oi, oj, ok; int xmh, xph; int xmi, xpi; int xmj, xpj; int xmk, xpk; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Sanity check radii */ if ((rx < 0) || (ry < 0)) { return (-1); } /* * Special case for rx=0 - draw a vline */ if (rx == 0) { return (vlineColor(dst, x, y - ry, y + ry, color)); } /* * Special case for ry=0 - draw a hline */ if (ry == 0) { return (hlineColor(dst, x - rx, x + rx, y, color)); } /* * Get circle and clipping boundary and * test if bounding box of circle is visible */ x2 = x + rx; left = dst->clip_rect.x; if (x2clip_rect.x + dst->clip_rect.w - 1; if (x1>right) { return(0); } y2 = y + ry; top = dst->clip_rect.y; if (y2clip_rect.y + dst->clip_rect.h - 1; if (y1>bottom) { return(0); } /* * Init vars */ oh = oi = oj = ok = 0xFFFF; /* * Draw */ result = 0; if (rx > ry) { ix = 0; iy = rx * 64; do { h = (ix + 32) >> 6; i = (iy + 32) >> 6; j = (h * ry) / rx; k = (i * ry) / rx; if ((ok != k) && (oj != k)) { xph = x + h; xmh = x - h; if (k > 0) { result |= hlineColor(dst, xmh, xph, y + k, color); result |= hlineColor(dst, xmh, xph, y - k, color); } else { result |= hlineColor(dst, xmh, xph, y, color); } ok = k; } if ((oj != j) && (ok != j) && (k != j)) { xmi = x - i; xpi = x + i; if (j > 0) { result |= hlineColor(dst, xmi, xpi, y + j, color); result |= hlineColor(dst, xmi, xpi, y - j, color); } else { result |= hlineColor(dst, xmi, xpi, y, color); } oj = j; } ix = ix + iy / rx; iy = iy - ix / rx; } while (i > h); } else { ix = 0; iy = ry * 64; do { h = (ix + 32) >> 6; i = (iy + 32) >> 6; j = (h * rx) / ry; k = (i * rx) / ry; if ((oi != i) && (oh != i)) { xmj = x - j; xpj = x + j; if (i > 0) { result |= hlineColor(dst, xmj, xpj, y + i, color); result |= hlineColor(dst, xmj, xpj, y - i, color); } else { result |= hlineColor(dst, xmj, xpj, y, color); } oi = i; } if ((oh != h) && (oi != h) && (i != h)) { xmk = x - k; xpk = x + k; if (h > 0) { result |= hlineColor(dst, xmk, xpk, y + h, color); result |= hlineColor(dst, xmk, xpk, y - h, color); } else { result |= hlineColor(dst, xmk, xpk, y, color); } oh = h; } ix = ix + iy / ry; iy = iy - ix / ry; } while (i > h); } return (result); } int filledEllipseRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { /* * Draw */ return (filledEllipseColor (dst, x, y, rx, ry, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); } /* ----- filled pie */ /* Low-speed float pie-calc implementation by drawing polygons/lines. */ int doPieColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint32 color, Uint8 filled) { Sint16 left, right, top, bottom; Sint16 x1, y1, x2, y2; int result; double angle, start_angle, end_angle; double deltaAngle; double dr; int posX, posY; int numpoints, i; Sint16 *vx, *vy; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Sanity check radii */ if (rad < 0) { return (-1); } /* * Fixup angles */ start = start % 360; end = end % 360; /* * Special case for rad=0 - draw a point */ if (rad == 0) { return (pixelColor(dst, x, y, color)); } /* * Clip against circle, not pie (not 100% optimal). * Get pie's circle and clipping boundary and * test if bounding box of circle is visible */ x2 = x + rad; left = dst->clip_rect.x; if (x2clip_rect.x + dst->clip_rect.w - 1; if (x1>right) { return(0); } y2 = y + rad; top = dst->clip_rect.y; if (y2clip_rect.y + dst->clip_rect.h - 1; if (y1>bottom) { return(0); } /* * Variable setup */ dr = (double) rad; deltaAngle = 3.0 / dr; start_angle = (double) start *(2.0 * M_PI / 360.0); end_angle = (double) end *(2.0 * M_PI / 360.0); if (start > end) { end_angle += (2.0 * M_PI); } /* Count points (rather than calculate it) */ numpoints = 1; angle = start_angle; while (angle <= end_angle) { angle += deltaAngle; numpoints++; } /* Check size of array */ if (numpoints == 1) { return (pixelColor(dst, x, y, color)); } else if (numpoints == 2) { posX = x + (int) (dr * cos(start_angle)); posY = y + (int) (dr * sin(start_angle)); return (lineColor(dst, x, y, posX, posY, color)); } /* Allocate vertex array */ vx = vy = (Sint16 *) malloc(2 * sizeof(Uint16) * numpoints); if (vx == NULL) { return (-1); } vy += numpoints; /* Center */ vx[0] = x; vy[0] = y; /* Calculate and store vertices */ i = 1; angle = start_angle; while (angle <= end_angle) { vx[i] = x + (int) (dr * cos(angle)); vy[i] = y + (int) (dr * sin(angle)); angle += deltaAngle; i++; } /* Draw */ if (filled) { result = filledPolygonColor(dst, vx, vy, numpoints, color); } else { result = polygonColor(dst, vx, vy, numpoints, color); } /* Free vertex array */ free(vx); return (result); } int pieColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint32 color) { return (doPieColor(dst, x, y, rad, start, end, color, 0)); } int pieRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { return (doPieColor(dst, x, y, rad, start, end, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a, 0)); } int filledPieColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint32 color) { return (doPieColor(dst, x, y, rad, start, end, color, 1)); } int filledPieRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { return (doPieColor(dst, x, y, rad, start, end, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a, 1)); } /* Trigon */ int trigonColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint32 color) { Sint16 vx[3]; Sint16 vy[3]; vx[0]=x1; vx[1]=x2; vx[2]=x3; vy[0]=y1; vy[1]=y2; vy[2]=y3; return(polygonColor(dst,vx,vy,3,color)); } int trigonRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { Sint16 vx[3]; Sint16 vy[3]; vx[0]=x1; vx[1]=x2; vx[2]=x3; vy[0]=y1; vy[1]=y2; vy[2]=y3; return(polygonRGBA(dst,vx,vy,3,r,g,b,a)); } /* AA-Trigon */ int aatrigonColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint32 color) { Sint16 vx[3]; Sint16 vy[3]; vx[0]=x1; vx[1]=x2; vx[2]=x3; vy[0]=y1; vy[1]=y2; vy[2]=y3; return(aapolygonColor(dst,vx,vy,3,color)); } int aatrigonRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { Sint16 vx[3]; Sint16 vy[3]; vx[0]=x1; vx[1]=x2; vx[2]=x3; vy[0]=y1; vy[1]=y2; vy[2]=y3; return(aapolygonRGBA(dst,vx,vy,3,r,g,b,a)); } /* Filled Trigon */ int filledTrigonColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint32 color) { Sint16 vx[3]; Sint16 vy[3]; vx[0]=x1; vx[1]=x2; vx[2]=x3; vy[0]=y1; vy[1]=y2; vy[2]=y3; return(filledPolygonColor(dst,vx,vy,3,color)); } int filledTrigonRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { Sint16 vx[3]; Sint16 vy[3]; vx[0]=x1; vx[1]=x2; vx[2]=x3; vy[0]=y1; vy[1]=y2; vy[2]=y3; return(filledPolygonRGBA(dst,vx,vy,3,r,g,b,a)); } /* ---- Polygon */ int polygonColor(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint32 color) { int result; int i; const Sint16 *x1, *y1, *x2, *y2; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Sanity check */ if (n < 3) { return (-1); } /* * Pointer setup */ x1 = x2 = vx; y1 = y2 = vy; x2++; y2++; /* * Draw */ result = 0; for (i = 1; i < n; i++) { result |= lineColor(dst, *x1, *y1, *x2, *y2, color); x1 = x2; y1 = y2; x2++; y2++; } result |= lineColor(dst, *x1, *y1, *vx, *vy, color); return (result); } int polygonRGBA(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { /* * Draw */ return (polygonColor(dst, vx, vy, n, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); } /* ---- AA-Polygon */ int aapolygonColor(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint32 color) { int result; int i; const Sint16 *x1, *y1, *x2, *y2; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Sanity check */ if (n < 3) { return (-1); } /* * Pointer setup */ x1 = x2 = vx; y1 = y2 = vy; x2++; y2++; /* * Draw */ result = 0; for (i = 1; i < n; i++) { result |= aalineColorInt(dst, *x1, *y1, *x2, *y2, color, 0); x1 = x2; y1 = y2; x2++; y2++; } result |= aalineColorInt(dst, *x1, *y1, *vx, *vy, color, 0); return (result); } int aapolygonRGBA(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { /* * Draw */ return (aapolygonColor(dst, vx, vy, n, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); } /* ---- Filled Polygon */ int gfxPrimitivesCompareInt(const void *a, const void *b); /* Global vertex array to use if optional parameters are not given in polygon calls. */ static int *gfxPrimitivesPolyIntsGlobal = NULL; static int gfxPrimitivesPolyAllocatedGlobal = 0; /* (Note: The last two parameters are optional; but required for multithreaded operation.) */ int filledPolygonColorMT(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint32 color, int **polyInts, int *polyAllocated) { int result; int i; int y, xa, xb; int miny, maxy; int x1, y1; int x2, y2; int ind1, ind2; int ints; int *gfxPrimitivesPolyInts = NULL; int gfxPrimitivesPolyAllocated = 0; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Sanity check number of edges */ if (n < 3) { return -1; } /* * Map polygon cache */ if ((polyInts==NULL) || (polyAllocated==NULL)) { /* Use global cache */ gfxPrimitivesPolyInts = gfxPrimitivesPolyIntsGlobal; gfxPrimitivesPolyAllocated = gfxPrimitivesPolyAllocatedGlobal; } else { /* Use local cache */ gfxPrimitivesPolyInts = *polyInts; gfxPrimitivesPolyAllocated = *polyAllocated; } /* * Allocate temp array, only grow array */ if (!gfxPrimitivesPolyAllocated) { gfxPrimitivesPolyInts = (int *) malloc(sizeof(int) * n); gfxPrimitivesPolyAllocated = n; } else { if (gfxPrimitivesPolyAllocated < n) { gfxPrimitivesPolyInts = (int *) realloc(gfxPrimitivesPolyInts, sizeof(int) * n); gfxPrimitivesPolyAllocated = n; } } /* * Check temp array */ if (gfxPrimitivesPolyInts==NULL) { gfxPrimitivesPolyAllocated = 0; } /* * Update cache variables */ if ((polyInts==NULL) || (polyAllocated==NULL)) { gfxPrimitivesPolyIntsGlobal = gfxPrimitivesPolyInts; gfxPrimitivesPolyAllocatedGlobal = gfxPrimitivesPolyAllocated; } else { *polyInts = gfxPrimitivesPolyInts; *polyAllocated = gfxPrimitivesPolyAllocated; } /* * Check temp array again */ if (gfxPrimitivesPolyInts==NULL) { return(-1); } /* * Determine Y maxima */ miny = vy[0]; maxy = vy[0]; for (i = 1; (i < n); i++) { if (vy[i] < miny) { miny = vy[i]; } else if (vy[i] > maxy) { maxy = vy[i]; } } /* * Draw, scanning y */ result = 0; for (y = miny; (y <= maxy); y++) { ints = 0; for (i = 0; (i < n); i++) { if (!i) { ind1 = n - 1; ind2 = 0; } else { ind1 = i - 1; ind2 = i; } y1 = vy[ind1]; y2 = vy[ind2]; if (y1 < y2) { x1 = vx[ind1]; x2 = vx[ind2]; } else if (y1 > y2) { y2 = vy[ind1]; y1 = vy[ind2]; x2 = vx[ind1]; x1 = vx[ind2]; } else { continue; } if ( ((y >= y1) && (y < y2)) || ((y == maxy) && (y > y1) && (y <= y2)) ) { gfxPrimitivesPolyInts[ints++] = ((65536 * (y - y1)) / (y2 - y1)) * (x2 - x1) + (65536 * x1); } } qsort(gfxPrimitivesPolyInts, ints, sizeof(int), gfxPrimitivesCompareInt); for (i = 0; (i < ints); i += 2) { xa = gfxPrimitivesPolyInts[i] + 1; xa = (xa >> 16) + ((xa & 32768) >> 15); xb = gfxPrimitivesPolyInts[i+1] - 1; xb = (xb >> 16) + ((xb & 32768) >> 15); result |= hlineColor(dst, xa, xb, y, color); } } return (result); } int filledPolygonRGBAMT(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a, int **polyInts, int *polyAllocated) { /* * Draw */ return (filledPolygonColorMT(dst, vx, vy, n, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a, polyInts, polyAllocated)); } /* Standard versions are calling multithreaded versions with NULL cache parameters */ int filledPolygonColor(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint32 color) { /* * Draw */ return (filledPolygonColorMT(dst, vx, vy, n, color, NULL, NULL)); } int filledPolygonRGBA(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { /* * Draw */ return (filledPolygonColorMT(dst, vx, vy, n, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a, NULL, NULL)); } int _texturedHLine(SDL_Surface * dst, Sint16 x1, Sint16 x2, Sint16 y,SDL_Surface *texture,int texture_dx,int texture_dy) { Sint16 left, right, top, bottom; Sint16 w; Sint16 xtmp; int result = 0; int texture_x_walker; int texture_y_start; SDL_Rect source_rect,dst_rect; int pixels_written,write_width; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Swap x1, x2 if required to ensure x1<=x2 */ if (x1 > x2) { xtmp = x1; x1 = x2; x2 = xtmp; } /* * Get clipping boundary and * check visibility of hline */ left = dst->clip_rect.x; if (x2clip_rect.x + dst->clip_rect.w - 1; if (x1>right) { return(0); } top = dst->clip_rect.y; bottom = dst->clip_rect.y + dst->clip_rect.h - 1; if ((ybottom)) { return (0); } /* * Clip x */ if (x1 < left) { x1 = left; } if (x2 > right) { x2 = right; } /* * Calculate width */ w = x2 - x1; /* * Determint where in the texture we start drawing **/ texture_x_walker = (x1 - texture_dx) % texture->w; if (texture_x_walker < 0){ texture_x_walker = texture->w +texture_x_walker ; } texture_y_start = (y + texture_dy) % texture->h; if (texture_y_start < 0){ texture_y_start = texture->h + texture_y_start; } //setup the source rectangle we are only drawing one horizontal line source_rect.y = texture_y_start; source_rect.x =texture_x_walker; source_rect.h =1; //we will draw to the current y dst_rect.y = y; //if there are enough pixels left in the current row of the texture //draw it all at once if (w <= texture->w -texture_x_walker){ source_rect.w = w; source_rect.x = texture_x_walker; dst_rect.x= x1; result = (SDL_BlitSurface (texture,&source_rect , dst, &dst_rect) == 0); } else {//we need to draw multiple times //draw the first segment pixels_written = texture->w -texture_x_walker; source_rect.w = pixels_written; source_rect.x = texture_x_walker; dst_rect.x= x1; result = (SDL_BlitSurface (texture,&source_rect , dst, &dst_rect) == 0); write_width = texture->w; //now draw the rest //set the source x to 0 source_rect.x = 0; while(pixels_written < w){ if (write_width >= w - pixels_written){ write_width= w- pixels_written; } source_rect.w = write_width; dst_rect.x = x1 + pixels_written; result = (SDL_BlitSurface (texture,&source_rect , dst, &dst_rect) == 0); pixels_written += write_width; } } return result; } /** * Draws a polygon filled with the given texture. this operation use SDL_BlitSurface. It supports * alpha drawing. * to get the best performance of this operation you need to make sure the texture and the dst surface have the same format * see http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdlblitsurface.html * * dest the destination surface, * vx array of x vector components * vy array of x vector components * n the amount of vectors in the vx and vy array * texture the sdl surface to use to fill the polygon * texture_dx the offset of the texture relative to the screeen. if you move the polygon 10 pixels * to the left and want the texture to apear the same you need to increase the texture_dx value * texture_dy see texture_dx * * (Note: The last two parameters are optional, but required for multithreaded operation.) **/ int texturedPolygonMT(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, SDL_Surface * texture,int texture_dx,int texture_dy, int **polyInts, int *polyAllocated) { int result; int i; int y, xa, xb; int minx,maxx,miny, maxy; int x1, y1; int x2, y2; int ind1, ind2; int ints; int *gfxPrimitivesPolyInts = NULL; int gfxPrimitivesPolyAllocated = 0; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Sanity check number of edges */ if (n < 3) { return -1; } /* * Map polygon cache */ if ((polyInts==NULL) || (polyAllocated==NULL)) { /* Use global cache */ gfxPrimitivesPolyInts = gfxPrimitivesPolyIntsGlobal; gfxPrimitivesPolyAllocated = gfxPrimitivesPolyAllocatedGlobal; } else { /* Use local cache */ gfxPrimitivesPolyInts = *polyInts; gfxPrimitivesPolyAllocated = *polyAllocated; } /* * Allocate temp array, only grow array */ if (!gfxPrimitivesPolyAllocated) { gfxPrimitivesPolyInts = (int *) malloc(sizeof(int) * n); gfxPrimitivesPolyAllocated = n; } else { if (gfxPrimitivesPolyAllocated < n) { gfxPrimitivesPolyInts = (int *) realloc(gfxPrimitivesPolyInts, sizeof(int) * n); gfxPrimitivesPolyAllocated = n; } } /* * Check temp array */ if (gfxPrimitivesPolyInts==NULL) { gfxPrimitivesPolyAllocated = 0; } /* * Update cache variables */ if ((polyInts==NULL) || (polyAllocated==NULL)) { gfxPrimitivesPolyIntsGlobal = gfxPrimitivesPolyInts; gfxPrimitivesPolyAllocatedGlobal = gfxPrimitivesPolyAllocated; } else { *polyInts = gfxPrimitivesPolyInts; *polyAllocated = gfxPrimitivesPolyAllocated; } /* * Check temp array again */ if (gfxPrimitivesPolyInts==NULL) { return(-1); } /* * Determine X,Y minima,maxima */ miny = vy[0]; maxy = vy[0]; minx = vx[0]; maxx = vx[0]; for (i = 1; (i < n); i++) { if (vy[i] < miny) { miny = vy[i]; } else if (vy[i] > maxy) { maxy = vy[i]; } if (vx[i] < minx) { minx = vx[i]; } else if (vx[i] > maxx) { maxx = vx[i]; } } if (maxx <0 || minx > dst->w){ return -1; } if (maxy <0 || miny > dst->h){ return -1; } /* * Draw, scanning y */ result = 0; for (y = miny; (y <= maxy); y++) { ints = 0; for (i = 0; (i < n); i++) { if (!i) { ind1 = n - 1; ind2 = 0; } else { ind1 = i - 1; ind2 = i; } y1 = vy[ind1]; y2 = vy[ind2]; if (y1 < y2) { x1 = vx[ind1]; x2 = vx[ind2]; } else if (y1 > y2) { y2 = vy[ind1]; y1 = vy[ind2]; x2 = vx[ind1]; x1 = vx[ind2]; } else { continue; } if ( ((y >= y1) && (y < y2)) || ((y == maxy) && (y > y1) && (y <= y2)) ) { gfxPrimitivesPolyInts[ints++] = ((65536 * (y - y1)) / (y2 - y1)) * (x2 - x1) + (65536 * x1); } } qsort(gfxPrimitivesPolyInts, ints, sizeof(int), gfxPrimitivesCompareInt); for (i = 0; (i < ints); i += 2) { xa = gfxPrimitivesPolyInts[i] + 1; xa = (xa >> 16) + ((xa & 32768) >> 15); xb = gfxPrimitivesPolyInts[i+1] - 1; xb = (xb >> 16) + ((xb & 32768) >> 15); result |= _texturedHLine(dst, xa, xb, y, texture,texture_dx,texture_dy); } } return (result); } /* Standard version is calling multithreaded versions with NULL cache parameters. */ int texturedPolygon(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, SDL_Surface *texture, int texture_dx, int texture_dy) { /* * Draw */ return (texturedPolygonMT(dst, vx, vy, n, texture, texture_dx, texture_dy, NULL, NULL)); } /* Helper qsort callback for polygon drawing */ int gfxPrimitivesCompareInt(const void *a, const void *b) { return (*(const int *) a) - (*(const int *) b); } /* ---- Character */ static SDL_Surface *gfxPrimitivesFont[256]; static Uint32 gfxPrimitivesFontColor[256]; /* Default is to use 8x8 internal font */ static const unsigned char *currentFontdata = gfxPrimitivesFontdata; static int charWidth = 8, charHeight = 8; static int charPitch = 1; static int charSize = 8; /* character data size in bytes */ void gfxPrimitivesSetFont(const void *fontdata, int cw, int ch) { int i; if (fontdata) { currentFontdata = fontdata; charWidth = cw; charHeight = ch; } else { currentFontdata = gfxPrimitivesFontdata; charWidth = 8; charHeight = 8; } charPitch = (charWidth+7)/8; charSize = charPitch * charHeight; for (i = 0; i < 256; i++) { if (gfxPrimitivesFont[i]) { SDL_FreeSurface(gfxPrimitivesFont[i]); gfxPrimitivesFont[i] = NULL; } } } int characterColor(SDL_Surface * dst, Sint16 x, Sint16 y, char c, Uint32 color) { Sint16 left, right, top, bottom; Sint16 x1, y1, x2, y2; SDL_Rect srect; SDL_Rect drect; int result; int ix, iy; const unsigned char *charpos; Uint8 *curpos; int forced_redraw; Uint8 patt, mask; Uint8 *linepos; int pitch; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Get text and clipping boundary and * test if bounding box of character is visible */ left = dst->clip_rect.x; x2 = x + charWidth; if (x2clip_rect.x + dst->clip_rect.w - 1; x1 = x; if (x1>right) { return(0); } top = dst->clip_rect.y; y2 = y + charHeight; if (y2clip_rect.y + dst->clip_rect.h - 1; y1 = y; if (y1>bottom) { return(0); } /* * Setup source rectangle */ srect.x = 0; srect.y = 0; srect.w = charWidth; srect.h = charHeight; /* * Setup destination rectangle */ drect.x = x; drect.y = y; drect.w = charWidth; drect.h = charHeight; /* * Create new charWidth x charHeight bitmap surface if not already present */ if (gfxPrimitivesFont[(unsigned char) c] == NULL) { gfxPrimitivesFont[(unsigned char) c] = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_HWSURFACE | SDL_SRCALPHA, charWidth, charHeight, 32, 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF); /* * Check pointer */ if (gfxPrimitivesFont[(unsigned char) c] == NULL) { return (-1); } /* * Definitely redraw */ forced_redraw = 1; } else { forced_redraw = 0; } /* * Check if color has changed */ if ((gfxPrimitivesFontColor[(unsigned char) c] != color) || (forced_redraw)) { /* * Redraw character */ SDL_SetAlpha(gfxPrimitivesFont[(unsigned char) c], SDL_SRCALPHA, 255); gfxPrimitivesFontColor[(unsigned char) c] = color; /* Lock font-surface */ if (SDL_LockSurface(gfxPrimitivesFont[(unsigned char) c]) != 0) return (-1); /* * Variable setup */ charpos = currentFontdata + (unsigned char) c * charSize; linepos = (Uint8 *) gfxPrimitivesFont[(unsigned char) c]->pixels; pitch = gfxPrimitivesFont[(unsigned char) c]->pitch; /* * Drawing loop */ patt = 0; for (iy = 0; iy < charHeight; iy++) { mask = 0x00; curpos = linepos; for (ix = 0; ix < charWidth; ix++) { if (!(mask >>= 1)) { patt = *charpos++; mask = 0x80; } if (patt & mask) *(Uint32 *)curpos = color; else *(Uint32 *)curpos = 0; curpos += 4;; } linepos += pitch; } /* Unlock font-surface */ SDL_UnlockSurface(gfxPrimitivesFont[(unsigned char) c]); } /* * Draw bitmap onto destination surface */ result = SDL_BlitSurface(gfxPrimitivesFont[(unsigned char) c], &srect, dst, &drect); return (result); } int characterRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, char c, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { /* * Draw */ return (characterColor(dst, x, y, c, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); } int stringColor(SDL_Surface * dst, Sint16 x, Sint16 y, const char *c, Uint32 color) { int result = 0; int curx = x; const char *curchar = c; while (*curchar) { result |= characterColor(dst, curx, y, *curchar, color); curx += charWidth; curchar++; } return (result); } int stringRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, const char *c, Uint8 r, Uint8 g, Uint8 b, Uint8 a) { /* * Draw */ return (stringColor(dst, x, y, c, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); } /* ---- Bezier curve */ /* Calculate bezier interpolator of data array with ndata values at position 't' */ double evaluateBezier (double *data, int ndata, double t) { double mu, result; int n,k,kn,nn,nkn; double blend,muk,munk; /* Sanity check bounds */ if (t<0.0) { return(data[0]); } if (t>=(double)ndata) { return(data[ndata-1]); } /* Adjust t to the range 0.0 to 1.0 */ mu=t/(double)ndata; /* Calculate interpolate */ n=ndata-1; result=0.0; muk = 1; munk = pow(1-mu,(double)n); for (k=0;k<=n;k++) { nn = n; kn = k; nkn = n - k; blend = muk * munk; muk *= mu; munk /= (1-mu); while (nn >= 1) { blend *= nn; nn--; if (kn > 1) { blend /= (double)kn; kn--; } if (nkn > 1) { blend /= (double)nkn; nkn--; } } result += data[k] * blend; } return(result); } int bezierColor(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, int s, Uint32 color) { int result; int i; double *x, *y, t, stepsize; Sint16 x1, y1, x2, y2; /* * Sanity check */ if (n < 3) { return (-1); } if (s < 2) { return (-1); } /* * Variable setup */ stepsize=(double)1.0/(double)s; /* Transfer vertices into float arrays */ if ((x=(double *)malloc(sizeof(double)*(n+1)))==NULL) { return(-1); } if ((y=(double *)malloc(sizeof(double)*(n+1)))==NULL) { free(x); return(-1); } for (i=0; i 0 and len(self.queue) == self.maxsize # Put a new item in the queue def _put(self, item): self.queue.append(item) # Get an item from the queue def _get(self): return self.queue.popleft() pygame-1.9.1release/lib/threads/__init__.py0000644000175000017500000002103211207055754020560 0ustar vincentvincent""" * Experimental * Like the map function, but can use a pool of threads. Really easy to use threads. eg. tmap(f, alist) If you know how to use the map function, you can use threads. """ __author__ = "Rene Dudfield" __version__ = "0.3.0" __license__ = 'Python license' import traceback, sys from pygame.compat import geterror if sys.version_info[0] == 3: from multiprocessing import JoinableQueue as Queue from queue import Empty elif (sys.version_info[0] == 2 and sys.version_info[1] < 5): from Py25Queue import Queue from Py25Queue import Empty else: # use up to date version from Queue import Queue from Queue import Empty import threading Thread = threading.Thread STOP = object() FINISH = object() # DONE_ONE = object() # DONE_TWO = object() # a default worker queue. _wq = None # if we are using threads or not. This is the number of workers. _use_workers = 0 # Set this to the maximum for the amount of Cores/CPUs # Note, that the tests early out. # So it should only test the best number of workers +2 MAX_WORKERS_TO_TEST = 64 def init(number_of_workers = 0): """ Does a little test to see if threading is worth it. Sets up a global worker queue if it's worth it. Calling init() is not required, but is generally better to do. """ global _wq, _use_workers if number_of_workers: _use_workers = number_of_workers else: _use_workers = benchmark_workers() # if it is best to use zero workers, then use that. _wq = WorkerQueue(_use_workers) def quit(): """ cleans up everything. """ global _wq, _use_workers _wq.stop() _wq = None _use_workers = False def benchmark_workers(a_bench_func = None, the_data = None): """ does a little test to see if workers are at all faster. Returns the number of workers which works best. Takes a little bit of time to run, so you should only really call it once. You can pass in benchmark data, and functions if you want. a_bench_func - f(data) the_data - data to work on. """ global _use_workers #TODO: try and make this scale better with slower/faster cpus. # first find some variables so that using 0 workers takes about 1.0 seconds. # then go from there. # note, this will only work with pygame 1.8rc3+ # replace the doit() and the_data with something that releases the GIL import pygame import pygame.transform import time if not a_bench_func: def doit(x): return pygame.transform.scale(x, (544, 576)) else: doit = a_bench_func if not the_data: thedata = [] for x in range(10): thedata.append(pygame.Surface((155,155), 0, 32)) else: thedata = the_data best = time.time() + 100000000 best_number = 0 last_best = -1 for num_workers in range(0, MAX_WORKERS_TO_TEST): wq = WorkerQueue(num_workers) t1 = time.time() for xx in range(20): print ("active count:%s" % threading.activeCount()) results = tmap(doit, thedata, worker_queue = wq) t2 = time.time() wq.stop() total_time = t2 - t1 print ("total time num_workers:%s: time:%s:" % (num_workers, total_time)) if total_time < best: last_best = best_number best_number =num_workers best = total_time if num_workers - best_number > 1: # We tried to add more, but it didn't like it. # so we stop with testing at this number. break return best_number class WorkerQueue(object): def __init__(self, num_workers = 20): self.queue = Queue() self.pool = [] self._setup_workers(num_workers) def _setup_workers(self, num_workers): """ Sets up the worker threads NOTE: undefined behaviour if you call this again. """ self.pool = [] for _ in range(num_workers): self.pool.append(Thread(target=self.threadloop)) for a_thread in self.pool: a_thread.setDaemon(True) a_thread.start() def do(self, f, *args, **kwArgs): """ puts a function on a queue for running later. """ self.queue.put((f, args, kwArgs)) def stop(self): """ Stops the WorkerQueue, waits for all of the threads to finish up. """ self.queue.put(STOP) for thread in self.pool: thread.join() def threadloop(self): #, finish = False): """ Loops until all of the tasks are finished. """ while True: args = self.queue.get() if args is STOP: self.queue.put(STOP) self.queue.task_done() break else: try: args[0](*args[1], **args[2]) finally: # clean up the queue, raise the exception. self.queue.task_done() #raise def wait(self): """ waits until all tasks are complete. """ self.queue.join() class FuncResult: """ Used for wrapping up a function call so that the results are stored inside the instances result attribute. """ def __init__(self, f, callback = None, errback = None): """ f - is the function we that we call callback(result) - this is called when the function(f) returns errback(exception) - this is called when the function(f) raises an exception. """ self.f = f self.exception = None self.callback = callback self.errback = errback def __call__(self, *args, **kwargs): #we try to call the function here. If it fails we store the exception. try: self.result = self.f(*args, **kwargs) if self.callback: self.callback(self.result) except Exception: self.exception = geterror() if self.errback: self.errback(self.exception) def tmap(f, seq_args, num_workers = 20, worker_queue = None, wait = True, stop_on_error = True): """ like map, but uses a thread pool to execute. num_workers - the number of worker threads that will be used. If pool is passed in, then the num_workers arg is ignored. worker_queue - you can optionally pass in an existing WorkerQueue. wait - True means that the results are returned when everything is finished. False means that we return the [worker_queue, results] right away instead. results, is returned as a list of FuncResult instances. stop_on_error - """ if worker_queue: wq = worker_queue else: # see if we have a global queue to work with. if _wq: wq = _wq else: if num_workers == 0: return map(f, seq_args) wq = WorkerQueue(num_workers) # we short cut it here if the number of workers is 0. # normal map should be faster in this case. if len(wq.pool) == 0: return map(f, seq_args) #print ("queue size:%s" % wq.queue.qsize()) #TODO: divide the data (seq_args) into even chunks and # then pass each thread a map(f, equal_part(seq_args)) # That way there should be less locking, and overhead. results = [] for sa in seq_args: results.append(FuncResult(f)) wq.do(results[-1], sa) #wq.stop() if wait: #print ("wait") wq.wait() #print ("after wait") #print ("queue size:%s" % wq.queue.qsize()) if wq.queue.qsize(): raise Exception("buggy threadmap") # if we created a worker queue, we need to stop it. if not worker_queue and not _wq: #print ("stoping") wq.stop() if wq.queue.qsize(): um = wq.queue.get() if not um is STOP: raise Exception("buggy threadmap") # see if there were any errors. If so raise the first one. This matches map behaviour. # TODO: the traceback doesn't show up nicely. # NOTE: TODO: we might want to return the results anyway? This should be an option. if stop_on_error: error_ones = filter(lambda x:x.exception, results) if error_ones: raise error_ones[0].exception return map(lambda x:x.result, results) else: return [wq, results] pygame-1.9.1release/lib/gp2x/locals.py0000644000175000017500000000004610373225603017521 0ustar vincentvincent from pygame.gp2x.constants import * pygame-1.9.1release/lib/gp2x/constants.py0000644000175000017500000000105410373225603020260 0ustar vincentvincent # GP2X joystick button mappings BUTTON_UP = (0) BUTTON_DOWN = (4) BUTTON_LEFT = (2) BUTTON_RIGHT = (6) BUTTON_UPLEFT = (1) BUTTON_UPRIGHT = (7) BUTTON_DOWNLEFT = (3) BUTTON_DOWNRIGHT = (5) BUTTON_CLICK = (18) BUTTON_A = (12) BUTTON_B = (13) BUTTON_X = (14) BUTTON_Y = (15) BUTTON_L = (10) BUTTON_R = (11) BUTTON_START = (8) BUTTON_SELECT = (9) BUTTON_VOLUP = (16) BUTTON_VOLDOWN = (17) pygame-1.9.1release/lib/gp2x/__init__.py0000644000175000017500000000105710374300526020005 0ustar vincentvincent # this lets me know that the module has not been imported. # we store it so we don't reimport a module each time the isgp2x function is called. _is_gp2x = -1 def isgp2x(): """ Returns True if we are running on a gp2x, else False """ if _is_gp2x == -1: #TODO: FIXME: HACK: need to find a good way to do this. # Use configure to put 'gp2x' in the version string? import sys if "arm" in sys.version: _is_gp2x = True else: _is_gp2x = False else: return _is_gp2x pygame-1.9.1release/examples/macosx/macfont.py0000644000175000017500000001060410213736026021355 0ustar vincentvincent""" EXPERIMENTAL CODE! Here we load a .TTF font file, and display it in a basic pygame window. It demonstrates several of the Font object attributes. Nothing exciting in here, but it makes a great example for basic window, event, and font management. """ import pygame import math from pygame.locals import * from pygame import Surface from pygame.surfarray import blit_array, make_surface, pixels3d, pixels2d import Numeric from Foundation import * from AppKit import * def _getColor(color=None): if color is None: return NSColor.clearColor() div255 = (0.00390625).__mul__ if len(color) == 3: color = tuple(color) + (255.0,) return NSColor.colorWithDeviceRed_green_blue_alpha_(*map(div255, color)) def _getBitmapImageRep(size, hasAlpha=True): width, height = map(int, size) return NSBitmapImageRep.alloc().initWithBitmapDataPlanes_pixelsWide_pixelsHigh_bitsPerSample_samplesPerPixel_hasAlpha_isPlanar_colorSpaceName_bytesPerRow_bitsPerPixel_(None, width, height, 8, 4, hasAlpha, False, NSDeviceRGBColorSpace, width*4, 32) class SysFont(object): def __init__(self, name, size): self._font = NSFont.fontWithName_size_(name, size) self._isBold = False self._isOblique = False self._isUnderline = False self._family = name self._size = size self._setupFont() def _setupFont(self): name = self._family if self._isBold or self._isOblique: name = '%s-%s%s' % ( name, self._isBold and 'Bold' or '', self._isOblique and 'Oblique' or '') self._font = NSFont.fontWithName_size_(name, self._size) print name, self._font if self._font is None: if self._isBold: self._font = NSFont.boldSystemFontOfSize(self._size) else: self._font = NSFont.systemFontOfSize_(self._size) def get_ascent(self): return self._font.ascender() def get_descent(self): return -self._font.descender() def get_bold(self): return self._isBold def get_height(self): return self._font.defaultLineHeightForFont() def get_italic(self): return self._isOblique def get_linesize(self): pass def get_underline(self): return self._isUnderline def set_bold(self, isBold): if isBold != self._isBold: self._isBold = isBold self._setupFont() def set_italic(self, isOblique): if isOblique != self._isOblique: self._isOblique = isOblique self._setupFont() def set_underline(self, isUnderline): self._isUnderline = isUnderline def size(self, text): return tuple(map(int,map(math.ceil, NSString.sizeWithAttributes_(text, { NSFontAttributeName: self._font, NSUnderlineStyleAttributeName: self._isUnderline and 1.0 or None, })))) def render(self, text, antialias, forecolor, backcolor=(0,0,0,255)): size = self.size(text) img = NSImage.alloc().initWithSize_(size) img.lockFocus() NSString.drawAtPoint_withAttributes_(text, (0.0, 0.0), { NSFontAttributeName: self._font, NSUnderlineStyleAttributeName: self._isUnderline and 1.0 or None, NSBackgroundColorAttributeName: backcolor and _getColor(backcolor) or None, NSForegroundColorAttributeName: _getColor(forecolor), }) rep = NSBitmapImageRep.alloc().initWithFocusedViewRect_(((0.0, 0.0), size)) img.unlockFocus() if rep.samplesPerPixel() == 4: s = Surface(size, SRCALPHA|SWSURFACE, 32, [-1<<24,0xff<<16,0xff<<8,0xff]) a = Numeric.reshape(Numeric.fromstring(rep.bitmapData(), typecode=Numeric.Int32), (size[1], size[0])) blit_array(s, Numeric.swapaxes(a,0,1)) return s.convert_alpha() if __name__=='__main__': pygame.init() screen = pygame.display.set_mode((600, 600)) s = SysFont('Gill Sans', 36) s.set_italic(1) s.set_underline(1) done = False surf = s.render('OS X Fonts!', True, (255,0,0,255), (0,0,0,0)) screen.blit(surf, (0,0)) screen.blit(surf, (2, 2)) pygame.display.update() while not done: for e in pygame.event.get(): if e.type == QUIT or (e.type == KEYUP and e.key == K_ESCAPE): done = True break pygame-1.9.1release/examples/data/yuv_1.pgm0000644000175000017500000236501710076162473020566 0ustar vincentvincentP5 752 864 255 €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€                                   €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€                  €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€                             €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€                                 €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€>Zideigcgffedcbbeeeeeeeedddddddd_adglortsuy~„ˆŒŽ’”˜£¨¬®º¹º¾ÄÇÉÈÏÙÁ§¸ÏÒÒÈÇÇÅÄÃÂÁ¼¹µ®¨¢ž›˜˜•І…‡xwyy{|w}~‚ytvtvrxuw{vwvvwwusrtutnnoligdgkkhhlnnoopppoononkjjd_crxqnrqqlihmnkkmklmnnnmlkghiiigfegggghhhhkgeedbdgeeeeeeeecegfeddeefilpsuwuw|ƒŒ’—™£¥©®³¸¼¾ÂÄÈÊÌÊÉÇÉÆÀ¸±«§¤ ˜”‘‰†€‚€|xvvxwwwz{{y~~|{yxwv{{{{{{{{vvuvvvvvxvuuwwvsstwyyuvwsoorsoquuttrponmusrmhlojflppnlifgmpqrlhioqrokhikstsniegisqmigiospqkcckqqnkd`hrnbQJC3,.,-OU>0444.&0>FO[T<3FRPMTZ[MKILQLDDMLIHHGDCFXZEBY_IAYeO8@Wa]][ZZZ[\^XRK<,*00259=98666=<>=97EW<%$#.@DSgkVKs¥©dC{ªˆ[_eQ<555512369;=?BEABDFHIIIHIJKLLLLPPQQRSSTTTUUVWWXZ[\]_`bbcccddeeegggffeeegghhiijjmmkjiiiikkllnnopnooppqqrpqrqpnljja`aWUcrvnmpxqN25=<<==?79521/--0**+++,,,)07;:89;CCDDGIKLNNNNNMMMRRRRRRRR€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€=ctkhmjekkjigfddddddddddcccbbbbaeeddddcceeddddccbcdgilmnnoqvz‚Š”„{‘ŸŸ¦¬®²¸½ÃÇÉÐÐÐÐÏÏÏÏÊËËÇÂÁÄǰƒjrxtrrtvvnuƒ}}}‚wx{wz{~{yxurtzspmmonifflnjglpqqrrsrrqponihjd`gnypntsrjgfkmhjononmlklmnkklmlkihjjkkklllokggfegkiiiiiiiigffgiigeggffeeddfecdefedhjloruwx~†•ž¥©ººº¼¿ÃÇÉÌÊÆÆÆÆÅÄÂÁ¿¸¯¦¡ž—•’ŽŠ‡„‚}}}}||||{{zzyxxx|{zz||{z|yvvxxurtwyzxwxzuppuursxuututttttstoinqidiorojfdgloqqjehorsohefimoolfdgksqmhehotqsmaakqomlc]fso`RKD2+1-0NY<0940(&1?GOaX60HUNIR[[ZVTVXSNPKIQQDDLJ?JPHFW\NL\d^M?DV]_\XZ\ZYbWNH9))41258;=>>?><:89;><9;?:5?QA''% /=CXacWJo¥¨fIv¡‹`[hT;534;89;>ABCDGJGHIJJIIIJKLNOPPPRRSTVWXXZZ[\]__`abbccddeccddeeffhhhhggggeffhijkkkkjjklmnoooooppplkkjiihh`_\ZVRONH??A;A]vrptswrM//5//.,0*.,*+0588579;>ACDDIOQONOQTSRRQRRRVVWXYZ[[`abcdefg€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Bgvlkpnmqqponmlliiiiiiiiiihhggffhggggfffffghiijjiiiiiiiieffedcddcd_ahecknprtwz|}‡‰Ž“™Ÿ£¦­±µ¸º¿Èϼ[emhioomgd‡¦œ•œ•yrxvywxqr||vuvwyslopgilkgipspuuuuutssrogeg`\expntqsnjeilhmtrponmlmnnmmoonljimmmmnnnnplkkkkmplllllllljihjkkihllllllllonmllljigghijklljhebbcfhhimqw|€‚Ž’™£¬²µÈÌÒÖרÚÛÐÒÑÊÀ¹¸º­«§¢œ—“‘ˆ‡…ƒ~}|~|z{|}{y}yyzzuqu…‚€‚|urrtutuxuuvvwwxxpptrmrtkfhnsogcfjmnnmgflnpqmhdegmookecgkppokhinrqsnfekolmnhafqpfQJH5/601PV;/61-(&4CHR`T12HTMGQ[^TILSOPWXY[b^QMTWKOPE?LSHGZ_SJGHLN[^XY[[Z_SJE9**302479::9<==<;;=>=77;95?OC*'##187BAAILMLIHJLMMMMMLKJPQSUVWWWWWXYZZ[[^^_``abbeeddcbbbcccdeeffffghiijjiijjklmmllkkllmnkjihfedcZYVSOLIHHGEBAABCB@LMJPPQVTOY`XSdeNBPQ>>Wc]Y[^bXSPI9((12358998748<>=:9999<=73@SD#() 2@CVgdSLq¤¤fG}¦‰b_fY??=9ADNOQSQMKLOKMNQRTTTSTVXYZ[[\]]]]^^^````aaaabbbbbcccccddefggdefhjlmnjjjkkkllgec`][YYUTROLJHFDDCBA@@?=>?AABAAFEIH@Ldojp{svvL)'.6R[QVVTgwvqqrqtttsssrrtojilnljmmlmmopqssrqponnlmnopqqr€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Gnxptuqsxusttsrroqsuurrwtrssqsurtqqsuwuqrqqsrppsqpsusmjkppqrolmphmnkhhjjmigihghliffhgdbcdeeeddegc_cgccgecbcfjors|pgghgjo\PKNPNJC<<=>?CFENQQLLJ5.B^`[\\`^TPI8)*0/14789:;<;9:<:9<9=<=;8DU@'&%!.:FTefSLq©¡cEz¦Ša]cVHB=:@GOTTTUTSSTRQSWZZYYWUZ_]\^^]]^_^^`cba`abcefdccdedegeeghhmojjihijhebfb][ZXSOOMJHHHGFBBAAA??DC@ACCDEDJKKMOPRSXX[ZTVesopurwuQ01:I_hghc]ntqstsvvwwwy{{z|xpkjjkmrnlnppprppqponpsqrqpopqr€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Gmyrvxutqtvtssttvxwtttrrutrrtwusstvvtttuurrtussusttrqpoorqstspquusqqpnnpsolllknrljjnqnjhnljiiihggjmjdgigfedcbcdedddddcddcdec^``[YVUVUSOKOKMNMX^UG@IVXEAb}ZOplKd“˜Œzvzvszpfiw~}yttsswxusqxwvwxxuqwtqqtspmqtqruttvrssrtvvtprsrqrrrquvwxut{vuuvsqtyvqsvtrsuvvvwvuuuwtqqsusqpqqpqsrnqoooommmjiikkjknhgeddfgigghmnnrw€…‹Ž“𢱬®²·À¹¤Š––‘˜ž|‹ž”–’Ž˜‹~w{~y{zz|yx||vpmkknleipsqoidgoqpomfdjrrplfdioprphdhmnpoibdlonlke_enj^UNK8-411IWA141.)'7DGVaM67MRNIM[W64MJ?ORLJV?1HJ79SD;745996;78;?@816IW]]XZ`TLE3(+213566777:=<8789;;:8=<4@UA%%&#,9GWhjXPtª dEz¥Šb]cVJIHHNRW\ZY[[ZYYYYXYZ]^^[\[\]^^^`a``^^^__`a`_beggfgiihghggif``b^`\VRPNMKLJHHHHFD??@CEDCDCCCEGFGJNMORSTVWXZ]`aa_^c`_\VXgvvppqywS39JXfklnjhqvy{{{~‚„‚…„€wljomknolmqspnoroorqoostrqrqprv€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Dn~wwvtwxwvxyyxvyxvwxutwxytrvvsrsuvtropruqortrqquvtpqvxwuttutqqtvtstvvtrpoqttrqqpnnrtspnrpnlllkinmmnnljgklkjhgijkfeggefhdefc``a_ec``c_[]^[\[UQPLQOQNONIOVPL]WHhŒˆzyyzup~x\Yv—£‰_YqŒ|}‰zjpuvtttsxwponqotvwwxwsurrrrsttssssssqsusvvxzvsvywwxwtuwxtvxvz{uvvwxwuwztvxwwwuqswxuuvrlwurprtsptpnqtrnmsqpooprsolklnmmnljjklijmqmoqt{~uyƒƒ{~…€u¨¯±»·´Ä“rrxy‡Ž‘‹‹™•ylonlmheoropiekopoonhflqopmeelpqtpgdflrsphaclrrmnh`frn_WMK9/312IWA141-)(6DJY_I4:NPNNS]V53KB:RTMUR46[Q7FWKLQNKLHDFHHGKPJ906IZ^Z\^QJC3(+0025677889:98:<96=;9<<6@SC$$'$+7HXggSLr¬¤dEz¦Ša]cXOQSW\\\a^\\]]]]Z\]ZZ[\[\^[Y]^\\aa`^_bca`figdddc`__`^ZWVTQQOMLJDFEDDEEDCCCCBBAAAFGIJKKLLNOOSWWWZVY__YX`hcdfgiijie\WUUZemrlnpwrT?AB@@@@BBCBBEGHJJKLNQUWVUYZX]]]`dcabhgihb_beggeddefgbUKMQ[ekqmpqtoS?J]]dnmnngceijjhdfghiijlnlmoomnompoooonmlpnlmqspknqrrstsq€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€F{…wŠƒ~‡€i^gnkquwxz||}|z{zz|~{w{{{€}xxwrpsvurqurqruuuuyvvxxvvwwwvtuvwvsttttuuuuvvtrrstsstsssuwnstpnorutsrrsssrlpqpnnoplmliiknogejh`bif_`^\^\Z\[\ZY`^Y]XY`[\^[ckpppnmrk\UUUQU\YWY_[X`_UTWYZZYTNNQ[ƒ¡žœ ua_bagjjlkknqrrrstvwxyz{{‚€~~€y€ywz|yz|~~|{{}{~{wvx{~}{yz|ys{{{yyxxxw{{xx{}|}xvvvuvxvwz{{xvtuvvtssuutomoqqpqqnossqokroquxyzyodadaacbafijmllqst|tm|„€zoknmiijmopnnjhhoomnledlprqkfchqpqqkehqsqrlcagnpqme`gpnfWMK;1302NW>/64.%(;GJ[`E.9LRNHT`M7HVPQ>)F\B>ZdMEYWIFU^OEKGNbV;EO6,32/5?LW\NIB1)./13678899789;=:9;=74<=5?SA''%",9EUegUPv±©_F©‡\\h`WWWZa_\^`a_`a_Y\]^__^_a^]__][\[XVVVVRNKKKIECEFECAAA@>>?=@BA@?BFGHJLMNPPTVYZZ[^_]`ddcba`cbacfdabgdegecb`cddeffggcWNLP[myuoqpxuV/64-$)>HIZ_C.ATWRMW_K/;>8<2*EMFBFLOKEFNLHJIFKDN[N>KK4162112CXZMIC0*///136789:9<;89:::;85;<7ASA)'%!-9DVggTMt­¥_F€©‡[\h`XXUXacaaca^_bb^[[]_^[XYVRRRKJLMJGEFEDDFA@?>>>>>=<=@CDFIIKLNPOPTXY[\\]^`bccb```a`^_cb^]`]]]_cbadfcceefhhghhhhgffcWONR^nytpppxxX<[{mcnmljhkonknnilmlkmpoljpnknmjonoonnpqpopqqppppppprrsrr€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€<^ihrsmnsvshacjmlijpvutw}~„ˆ‘‘“Ÿ«ºÏÕÒÕÕÑÎÌÈ¿¿¸³¯­¬¨¢›•‘‡ƒ‚~~|z{|ysstspqw{{vxxvuvuswvttuuutuqtyxuusssstttttwrosvtpotrpqtoknlonnpmhfedcbacdb`agh`]ccgeabfa]blponprql_[^bb_`acaddaacfbaced_^`ba^^_^\Za]^`^^b__bb_]]]\\^]ZY[\\[\\`hjlqtsuy‚~y}€€€€€€„€}|||~€y|~}}}}z|~€|yy}{zzxvw{yyzzzyxxzzyvwzzv|xuuvuvxvyzwsrstns{|tsy{pollnlikplospmoqurkhjnk_ajqqpkffkprolgdfnpppnfgsqqokfdhnspolggmrqoicempomkfbirncTMK8.410LYA141,'->GJ[\@/EXTRX\]QC?=<8655:9416>=5=FA7;CDBAHLBAH@1.7/,6DU]XLJC/)//.036789:6;=;9878;<9;;9CRC(&&"+8DVeeQJpª¢aF}§ˆ^]f^YYTV`ccgfd_XTVXTRPNMLKJDCBA@ACDBBBA@?@@EBADDDGLMLNQSSUW\VOQZ^]`___^^_cf]^^^]]]^_\\_a`bdabcehhimogcefggehhgghijkaUMOV_krsruqusW=Y{i_rrnjjjjhikkhgklkjkmnmrnilonoqppqpoooprqopsspmopprtsq€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€<[d\]bcb````dfc^abcdhjjllrttwy|€„Ž™®ÊÔÎÎ×Ö×ÙØÖÖÙÛÚ×ÔÖØÕÏÎÉÆÅÄÀ¼»·¸ª•” Ÿ’“ˆ…†…‚}€zvvxyttutsstvwuxxtx|yprttttuvwxwuuvursxvqrsqqlmlmnjilmigeabee]__bcacffijfhf^boxqoqqsl][ckfacfgjbdiedfhcaeea`bb^`b`^^`^c^^`aeb^``^_bb_acdbabba]_ba`bddcdfhmqrqqkmsrtxyxy{~~|wx…“‘†šŸŸœ”Œ‰„€~€€{z{~|{z{}~{zww{€ztux||xuuvxvuwwsonrxxty~zqooqstronsqnrusqopoldjsfajqpmihjlsqmmhdimoookbdppopmdbjptvqhejnptupfcinpmme]dqpcXPI1'244IYE22-+)0>EJ\Z>1ATJK]]WT\ZSRPLOMOKHECBBB?:9;845;87726=3/153CX[[[YLH@+'0224677888:868;:77<;8<;6@RD&%(#*6FQdgVPu¬£cEz¦Ša]c^ZZTS]a`cee^K;9@EECAABA>BDA?BC@@ADEEEIKLKKOUUQSZVVX\]\[\`\WZba]^[^`a`^__`abccdefcfeceiieefeddbcggfhjfddeihhgghij_VQSV_ltsrurvvZCc„mapljmoooonlkkonmnmkmqpnpqpqqmprpllrutoqsqnnqttrpqqppq€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€:]hcgdcjeadeadf^_db_cc_`cffghecffhnx…•—š™œ¡¥¨¬°¼»¾ÃÅÄÇÌÌÐÕ××ÖÖרÝ͸¿ÕÚÏÎÊÆÄÄÁº´¹±ª¤ŸŸž˜‹‰‡ƒ‚~zyywz|vuywuvutvyusuvvywvrvutrmqurnnppooieeefgbbcbbfgfgjkecijg^epsoppqthabcegecddjnhchkhfgededaaa`bb]_cca``begfd_`aaabceedbcfdbedda`cc``a^`eeabhghgfgggklmkknllqhja]ÔÚ»²ÌãæáÝÙÓËÇÀ¸°ª¥£—Œ‹‰…‚|wx}{w}~~}€{z{}~|yw|||}zsnuzyvvxzpsusprtrutuwvssukrytjlogckoopmijiptqojdgpproifillophabjnqppmfhnnrsmcckpqole`emleVQM;*.20IWD166,$,FHI^X;0JWOHPVWUSWYUPQSUUSRSUUUUUVOLRPIIGBGFAA8-16JYa`Y[YOK=+(-/-25589:;988::9:;;;=>;5>RI)&+$)9BVbhVPz±§dFz£ˆa^c`XZZZ]^afeg_E25=?@BDDCB@CEGGGHKNNOQRSTTUWVXZ[XWX^]\Z\_`__^^`_]^baabcddb`fffeeeefdgiihghjffgggfedfiheeiiffghhggggcUPTV^ksxttnszbDe‹t`rrlmkmnmlmmmopqpnnpqqqonooonlqsoorrotqprrqqttrsuurpp€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€=`jfigcfdadd`dheghdbdcbcdfedecabdcbcefedkiimnnpsyz}ƒ…†ŠŽ“™ž¢¦ª­´¹®¢¬ÄÍÊÎÎÏÒÖØØ×ÚßÝØØÕÏËÌÃÀÄÁ¶°³ª‡vƒz||}zwyzwwvxxvstzusrrusoroknolpnbkecjied]afiigcclgjlmjjcenqppsvsk`behgeeihgjllkihbdedcb``_ac`_egabbcdddddbdda`dghhgghhfghffccffccic`dfecddcegedffefdcdefg`ca_xœ¦œžÁåñíëííëììììêéçãßÚÖÑÊÁº´ª”Їƒ‚€}{{}€{wvy}~|x{|{{|yup{‚~|}wzsrutuwuxxwvvvussvwpjqulfmqtvphgjnqpqnghpoqrlegpnonhbcjmrpkedhloqpjechnspmfbgongUQP=*,22IWD166,%4EHQeX:5K_]UX[YSFOVTONOPQPQUVUVYYWV\^XQOVVWVZWB19V_Z\[Y]YOK=,*.013349;87:<<::<<:<::<86BUD%"(")9CUbiWOx¯§dH}¦‡_^g`XYZZ_adhcgeN98?GHIJLMNOTTTRPRUXXWUUWXYYXWVVY\^^\^_]\^``acdcabcecdeeddgigeeigcdjgeccdfghefghgfeehhhigdfidefgghijcXQQS_mstrtrxx]Fb|mdomlmnmmppnnqlkoroopmoonooqqqtpnqsqpprootvtqpssssrssr€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€?hpejlhgjhhgddfghdadhifddfecdedccbbceffeheeffdegfefgfcdfdeffghkmswsnv††Ž‘”™¢§ªª¹¿»ÀÇÈÄËÐÔØÙÒÐÙË”zˆ’’––Œˆ…¢³¡”œ—ƒ‡~uv€z{xvwsttvwsmielhecbfd`chjgehigkkhdd`dsxrptrokgbdmoheijkoljlikfefgfeff`efa_dgbdfgecaabafhfdffdhgiifjnmijklomihlihikjjjljklkkookkjhfhhfonifedgf]sŠ”™Ÿ¥¦©¬²¹ÀÆÉËÖØÝäìîíêðèÝÒÉÿ¼´µ³¯¨¡œ™˜”††‡x‚ƒ}}}wyŠ’‹†‰„yupsxusx~vy{ywv{z{zqiosmcjqqmljdinsqpmhlpssplfgopnongcgmrroiefkorojdejpsqngbgong[QJ;/33-IWE166-'2CGPcW90I`bYY[\WRX\YVUVUSRUXWSTX[TV\ZSSWRUPLYZD9Pc\X`]\]YNJ<,*/004558989789;<<;;878:73=NH)%)$)8BVcjVNv®¥fH}§‰__i`WYZ[`cfgdgaQFGITUVVXXYYWXXWVUWY\YWWY[[Z[]\YZ`dd[_dddddbaeggfgfceffffeddfffffeefeffeddgiegihgefffgihggikffhggghheXQOR_ntuuuqyx^N^fahpjoqlnonnnnnmlnnnoonooppqponpoqsrmmpppqtsqqsttrpqtus€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Amvlqpjorpoppnmosmjlnonmmmkijjiglkihgfddhfegfefheffgeeegjkkkhgedfigfgfdgjjjiijlnmryzy€†ƒ„–˜œ™š¤ }o}†‹’ޕнÜÀ­Â¡šŸ}[pŽ—““’““Œ¢ž{r}piozrcbbfiljhjjhmlefih_i†ˆpouqsnebbgijkkolpmlqnomiggfffdffgedfiifhiifffgjfgmldchkhkonkkmmmlmnonmmnnnnqqqmponoooqrpppnookopknnlrsllkjmpmgmmmnprtvwy}†Ž–™š¢ žž §®³·½ÅËÍÌÊÉÎÏËÿ½´¨€u{ƒƒ}zƒ’›š™˜‰uqttw|{wy||{||}{y{z|xqtvpijmoonkiiosqojflruqnlgeloopmfdksnoqmfgoqoqlcblsroleafnmf[QM>/12/JXF256.).>FRbV9-L^`[[\_\\][YYZVQVWX[YVTUWVY^YPPWZ\TLTWMN^^X[\WY^WMH;*+/0.36689:<779<<978;;:<;4;OI,&*%*7BWciVMv¬£hGy¥‰a_g_WZ]]bceffe^QPTUZZZZYYXXWYZ[ZZ[\_^^_bcb`befecdfgcdcbdgfdeecbcffeffggfeb`bbbbfihedfhheefidgiigffgfeeffghhefggghijaYSQSanqswvoyz`Q^YXkrmprmpqolmllptpnpnjmomlmnopqlnqrqoprpopstsrrrqruwvrp€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Dnynrutxsrqrusrttqqqonpsvsrrrqpooopoonnnpmmnnmnpmnnkigggjhgefghhffffhddkgeccdefge`cigcdfgjhiokgnofbgkkllnirqo¨•„— ŽŠ‡iSt—–𛡧¢«äÔz~½¼˜io¤‹¡¤l`Œ¡—r^etsmpnftŒroxqplb`ejjhlpooplntpmnhfghgfejhfgjkjiggghihhglihkkihiloooqqnmonnnopppnopoqsqmtwvqrsstpnpttttqpususptrrpnnpqpnmmkjjklljhgfghihhhhhhkorkpw~„‰Ž‘—¡ £¬¯­selokx£Ÿ™•™™Šw‰š•‡‰‡‚ˆ„‚||}|y|z€„{yrimlntqiijmppplehsqooodbkprrkcdkppmmicgmnkqoc^hsrpmfafnmf[QM?001.JYG256/+*+-9E:+,CMQVZZ\\\^_`dd`YZ[\Z[ZWSTY[[\SNRSUVRUWW_]Y^\VX\`VLG8)*/.02249;988:;99:978:8;=4:QC'"&$)7DVdkWLs¬¤fFx¢‡_^e^X]_`bbbgdfcWQW[\[ZYZZ\]^^^^_`bd__``aaaababdca`aedcabcb_dcbbbbdfffffeefgfbaegfedfeeegggfegjihfghlhgjjeeihhhggghiaZTORbpprurmyx]QaXXktklomllmmjijkpomqnmrqonorrsuppqqqpswpoprssrrusqrssst€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Djzusuutssqrrqqrrrrtuuuvvssutsssstttrrrttqpqpnnqpstsrtutsqmlkllljllmoljopnlkjjigijiiljghhkgcffcehfccefgjddhhcioifhkhiiablrpptsv~w„²ªit°¼¤s`–¨«ÎÄgT¦×Äœ`QŒ¯œsƒ°£„„ƒztvrnx~|||~xkotru{tloojdfifbcgjjjkkjkgfegikigfjljlomhmrokosrpppqsrsrpmqrrrtrnuvvtrvywsqswxwvutuuwxutsvuuuspqsppqqqpnnqqqrqrqqjmprrponjjigeegiejmklrwxmkmqlfm{†‡‰‹wŒ­·¯°®®»­‘yx||†‡‡‹‰}…‰ƒrjmomjfgkpqqkeimnoroeckqonkebhnpqngcdinoold`irqrohchpoh]PJ>210,JYG3560-+'#&,*(../.6;:==AFIKMQSRWZZZ\a_Z^b][`_Z\XX]]ZXX]]Z^]\`^cVLE6'*.-/3336765987679:;6869<5:PE*#'%*6DTenYKr¬§bFz ‚\]e_X\__babfdfcWTZ^_____```_`_``aaaccb`__`afa_beecc]befddca_bgieabfhdacgieaefggffedeghihhgfegijhhghjjjjhfgjkkjhffgheWQSU_mtusqq{v\T^YYjrjioomkmopnllmopmmnpqporromnorrrpqrsoprrqprtsttrqrtv€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Chxttrsyvuuuwxxuxxuswxvwutvvtssrvwwurpqrvssssqqtpsussuwvstvyzvplpttqsrnmoqrrpoopptpikmjfinnhfhjiigggffhjdgjhghhefbbdfgfhfcbcec^bbciib_gmigZhoqƒ|[T{’ŒiGa™¥Žn|¢žwvxqqqs‡±¼½±µ¾œbw²¬{dbo~ŽˆŠƒtorpllmjimjhghlmkhmlnqpmnppnostpnqtqrrpqtsnrutuvwurrvxwvwuwwuvxxutzuttwyxyxvvyyuttuuvvvussqsuvvutssrrqqpooopqponoppqqomllkknpoqsngjqxzwrqrt{{{‚†Œ——|kmnjvŠ˜™š… ªžxhqqkjiflrsqidimnpqmggkpmlkedkskppjefmttnkfciqqrohchpohWPOB.*-0JZH3561/)--**,+)-+&()&(&'*+)*/477:=>CHKJSWVTY\[[__ddbb_ba_`a`\\bWLF6'*.,.3655667:767879<<:9:==DRI.&('*5CVdkWNu®¦`H{ž€]_d`WZ[\acfhff`UU]```bcb`_]``abba`_eca`````da_`bdddadecceghcegfdcfigc`ciic\_fifeiigdhlligghfgiijihhchiedgihiiihhhjldTPWZ^jsusuw~v]U^YZjrlkqmmmlnqplkkprooqnronopnmooopqsrokppqrrsrptrrssrtw€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€I‡™‡‡†{vxwxz}€}uw~}xxvtvtuyyvwxutvwwutuwwttvvuvytwxtrstrsrrsvvusswsnrxwuotxxtqsuuprusqrrsopssrsuomqsmmqqnklljlkehgfgecedcbfcdfcfc`bc_^aa[[\[]]Y]ZZZZZWTWWXUTU[Zapnllomku„–•¤³ŽNu»¤\BO±ÑÍÅÏáÖ»®±ŸŽ“Š‚„„€}{ywrolqspmmoolptsqvwrxuutrswvssrtx{yvyz{}~xuyyzvtxyvvvx~{yytuzusvxwy|}|zwvuuuwxyywvuusstuvusprsutsrrronmopponoopqonqtnrwxxwtrl`]db\]bdbejjgkttx}yt|‚}wroqrkgijmrtskcftmmqmfglntuldglmnmnkfjrtonng_dorqmfbgongYOMA/+,-JZH356201/.-*')/%((,,++%)*(%$&&$#$&%%&)*,04559?ACGMNRVTW]^[__]a^XMF6'*/,03449;986899:=>>DADIKPX\C*"%&*5D[cfUR|°¢bHyœ€a`a`WWXYaekogebWRY`cccccba`aa`aabbab`_`bba_`deb`adegfcaaccaffedfiheceffffhiefggfedchgfffggggghijjihiiihhijijjjihijldZSOQaptuuwswt`WbZ[jsnlpnmnpommoonnooqrrpmlopoorpmovumlqrrronortrmox{vrs€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€U¤À°©‘y|}tkimqrttvwwwwvwx||vvzvuzxuspsuqptwvuvvxzwqswuqx|xttuuxvwtrxynssttttuurqswywuvwtutqsvsprssroptvsppqnnrpmonjmqmkjmmfehheggdege_a_``]]^[\Z\ZWZ[TWUVSRSRYlvuomoqhWRWZZZVVceaWP\w™šš°É½­»½¨®¸£ž¸º³·¾ºµ±«¢   š””˜†‚…ƒ|xuvuqpsspnquwwtrqx|€€ysx€xy{}yx~|}{}xyxr~wwwy||ywz{zyyyxwxxxyyxvt}xtsuwwvwttvvttvupsqqvtsrvwtruvolt{zwuuskjkljjkijkkjjkkjkfgiedaW[nsrqjhhknrurjfioqommjhkprpkhgioromicelpknldaipnqqfadkpi[QN@0,.1CVI799425332//0,-/.)(+..&)*((*)&'))&%''$(%$')'&'()+-0468??@CHLMLFA92-,-.34579:<93.+("),('0DXdiVNt¬¡fNu“‚c_ibWZ][addggheZT[da``a`_`bbabb``a^bcddddeggbaeeddebdffeffcgdcfgeefghfeghggfigfgihfhghijjhghhefkkggiigghiiijjjjihij`TRXZ`lrtttszt^Y^\Zktmmojnnlnonnpmmnnonkpqnntspqqsqoooorqqqrutrqvwussqqs€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€[¢Â¹°œˆƒ€‚wc[diejijjmnonvuutwz‡†……½Á·µ±¯°¯¬ªª¥Ÿž˜”‹‹‰…€~{yuvxxxywvuuttsssvvvspouzwqtyxrrttwywuuwxvvvuwwurxtyvstsutpqtrpppplklmkkmfiligkldccegha\^_[YVXWT\ormkouvlXQTVUWUVZZZYZ[_a]_]\a_ZZ\^^``VVe]^cdbehekmry~‡ŒŽ’•˜ ª­ª¤¦ž•™”œŸž©³¦“”——’Ž’™’†ˆ„ƒ‡~yƒ‹‡€€‚yy{}|zxxyy{}}{yy{~~~zxwy{sux{}|zxwwwx{|yuztwzxwstvwurqsuwttvxyx{snnpmmopompuuolmlpphejkfmmnstmjiioqomiggqssqmeemsrpjcdkpsspieejpqrlefknonldcinpfXQN>,,/-GYI3689;9458423311475/-./..//-,-*(''('()'++'%&'%'(+-..,,--.,+,15149?EKOR[\^_^\YVNLHB;4/,***)(%$"&!'*)*3GWfkVOx±¤hJq–…a]i`W\_^cgikgfd\W\aaaaa`^_bcabca`a`fcabdccddbddbacdfgecefghfdceffefgfggeegggghijhffghjihgggkhijgiljfikhefhhggilljkmdVQST_nuussqys_Y`]\lvopqtpnnopommllnqqpnrorsoqtsmqsrsporqoortutqotvuusru€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€?n~~wqqqqlc^cillmmmmoqrsvyyxz„‰ˆ…„ŸÆÐÉÊÈÉÌÍÌÍÏÈÈÍÐÉÃÄÆÀ¾¹´°®ª¨§¤¡—•‘ŽŠ‰‡…‚€~}xwwxuqsyvssxvqoquuwwtstvyrrwwyzwppzvpwvsstsqnpssnlkoolkmqllmighgbedef`Z^b[USYXSZosomoqodZRUUUWWYTUVY[\ZYWXZYY]_]^`_bfc_ccgiebehfddefffghcegfhklkmqokksurt€ˆ‰˜“…‹‹•“–¬Æ±œœ›£®•­Õȳ½ºª›˜“Œ‰ƒ€~~{yy{}}|{z{|}z|~}{{}z~~{yzzy~vuxvux|zw{{utuwmtyywwz{qmosrqrssrrtspopsurkfglnnossmhhgkmosqkhmnmkmojgnupmhcfmootrkgekupnmhdhlkmkcekpofXRP?+.1-GYJ67;;><57<946869842331-,-12/.0/-,/.+*,,,*))+)&,,,-./0125:?BFJLVY]a`]YVPNJE>70-))*))'&%%%%&&&&&%#$#(3F[gjUNx³©gIs™…_\i_X]a`filjhhe[V[bebaaa`_`cbbceb`cdccddcdfeddddedddfdcfffheddeffefedfgeefdgigghhghijjjgfffjhklffhehilkfhmnggikkklocWQQUborvtsrws^Xga[kvrstpjnrlmrpjsrpsolssqlloqppqoruqpqrpquupptupswxssvw€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€>^gacdee^aefdaabcdedcdgikiknqpruvwz}’±¾¿ÃÂÅÉÌÌÏÒËÎ×ÛÔÏÔÙØØØ×ÕÑÐÐÏÓÑÊÉÊÈÅÿ»¸´±°¥¨©¥¡ž˜‘ˆƒ€‚ƒvsyzvuvurprwxuswuyuqsrqsvwuutsrtnnrsmlorjjkigkmekicda^`a_ZWZVRajnkjmoqj[TXZYZXYZ[\\\[\\[Z^_[\^]b`_bhfa`aggbadggjjihggfelklmkhikjjkkljjibgifeggdgeeghkwƒs|z~ˆ€€ª×ɹÒÕüÁ¿½½¿¿¾¼¸²¯±°§—•‘ŽŒŒ‰„‚|yxxxyz}}xx|‚€zy}|{…zxzuwzusqvywwyzxsprutsuuxrrwxstzwxvleiqtqjkonmidimonmjiklmmnmffonmooihihoqmhhilromjebgmmpmgiprrjZRR@,/4.DYM:<==??89?<8:<;<:535766323424784221-.030.00.,,57;@EKORTVZ^`]XSROKE@952.,*'&%%%)*))'&$#(''&&%%%% $%%+4DZbeTMt¯¨fLzž†a`l`Z]_`cdgfilgYRZeecbccbbbcbbdeb`dacddddedcddbdedcaddeggegfccghddgeeggfhiefiifhjihjiihhhgggjhglkgijffhhjljkllihiklcUPUZdnpvrsqwr_Ye`\lwpppnkpqmqunrtnmutnpttrrssqrtnptspsutnnqswvrqsxxtsvv€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€:`kbdjkgcfgecefecefecdehgcbeeccfabfgny}ƒˆ”—¢¤¦®´´·¼¿ÂÄÈÎÐÐÑÔÓÝÜÖØÜÜÚ×××××ØØØÙØÖÒÐÍÉÅÈÇÀº¸·µ·¥†v}‚~~|‚…{uwyu|{wuvy{vursvtpotqlnsvqjolkiehkihmlfcbaa`]WUZUQbornnoopiYT[_^]YXW[]^[[^aZX\`_^`a_`aeggffeiigjlmpklkkmpommkloollpnkknmllomifimmkifjjedhhdb]fdafdgt‚up„{y„ˆ–œ  ¢«¶¹·¶¹·´²µ¸¹´¯²¬¥£¤¢œ–””‘‰†}}{{|x{{{vy~srw|‚ƒ~|zsqqrruxxxvvyxwvwsxxlbmyuojpsnheghoqoljhgllikmiflppplechkoolhfgjosqg_bimpomgjmook\RRC-/4/AYO>?@?@@;=A?=?@><<=;78<;99997788533358;77;BDEIOUWY[[[YXUQLID?7242.+(''(+)%"!!#$&''&%#"!&%$$$%%&&!"!#+6EYbgYRu­¦cL}Ÿ„``ja[\_chfhiijfZT[dcbcddcdgd`becabbabbbcedaaefdcedeedddffgjfdeggedffggeeijggggjkhgjihghijihcgffjihkjghkjjiijlkhfjlleYQRWeqrtprswubZca^owonournnpsropqqonorupqwvonrroootwtrwsrtvwxxvostuwvuw€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€9cm`affccghedgfcccdeffgfffggfdfigdfeddadbbdffegjiimprx{yƒ„Œ’•—šŸ©«ª¯´¶º¼¾ÂÆËÏÓÕÚÖÕ××ÖÚàÝÞÝÝßÜÙÝÆœƒ‰Ž‘•’™{oŠ‘Œys‚ƒ‚ƒ|uy}|yux}€{plmkjlmkkmjgikib__^`[TRZUPbvunnqqqj_WY[Z\\]d^YX\`a_ba`ab`^``cfedfgfkmjkpnknnonmotrnpooppppprpooooqsonooljntqrpkijmormoolllijdfhhgdecddcbcfhljmpomu€ƒƒ†—ž Ÿ¦©®°±³¶¸¸¹º¼»¶³²¯­¦£š”˜–ˆ…ƒ~|ttw‰•“’’ˆxttutsy|z|}wuxwsy{}rfsykhnrqmghglppnhdelsuqkdfqnomjihhjlmnjeelrssjadjlkmkfgihki]OPD--4/AYQ?AAACA>@B@ACB@?ACA==@8:<=>>=;>@BCEHJITUWWWVXZRQNJD=841-)%$$%&%'+--*'$$#""#$'(&&'''&%$(&%###$$#!,7F\gkZRw¯¥bHzŸ„_^gb[[_hmjkmjif^Y]ccccdcbcfdabdbaaabdeeddeffcbehdbdfdefffgheggffffdikjhijjkkgfijfgmihghjjjighmnighgdgjjihikfghhijmncZVTVertsostyucZhc_nwprurqonnmovrqrqnosspsqpsrqtqsssusruutssvurpuvssvwvw€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€?hsijigfkjhffgggigefhgdadefgfggglfffghehgghifcdhhggedhidib^bffdefmmmqqqxz|„‰Ž’”˜Ÿ¤¦§«°²¼¼¼ÃÊÈÈÑ¿•‰’“—›žž¡š‹‹—ž¥¤ª¦zm“ž™£›‰‹˜™’š¡¸Å¤wxš–Ž…ysqolrtkddc^_[X[TSj…uqstun^VY[Z\[\X[_`^]]_ab^]bb`caefcagiclkhltpkpuvtrtxvpprqprvvrqsrqqstsmoqtsrsurjkvxolqppqsonspqlwtijmurollmoonsjehhc_`fdbabcccadinrw{~ƒ†Œ“—›¥¯°²°³²´¿¾šsx‚z}‚‡–›œžœŒy{~|zyx{}~~~{{zƒ€qw€uiinoqqgchmppnjghlrrolggnprnhedfmppqmeelqlmjcblqnnmhhgfkk]MOD,,2/BYQ@ABBEA@BCACECAEECACCB@CDDFLONPV[]]]XRTRME@=71,,*('&%%%&&%##$'%%%$$$$$$$$$$$$$%%&%$"! $#"!!#$%$"(+09AL[hjSKt®£fHy¡ˆb`hd[Z^gkeellmi]W]fgdcccbaaddccdb`cfdcddccdehgfffdegdegeeffffghgedeehihhfehhjjhiihikjiiiiihiijkjiihhlkijjikffhkjijmdXVYY`oytptvyubXea_r}urqosusnoqroqrstttuooprqstsprutqsvtturrwwtuzvuvwxxt€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Ehrospnqpsromjlroliknnlnjijjjijmhglngfhe_dhhffghgfddffdcehkiecfieeffgghhdfhhggikehmqolmrtvx|€„‡‰snsy{{{„ƒ‡‡…Š’—”žœ‚yŽ¢¡ª¤”™¥ ºÆàúÙ‚|ÍÜÊÇÌÉ’s‘t\œº¡¡ž˜‘‰Œ„e]w tqzurv]XYWX\YY[W^\^_Wb^fe\`ecgejhcefgiiknorsrpuqqutprxttssuvusxsquvssvtuwwuvvronquursvnqrrsrqsppttpmopklnpqqrrrnggopljlmmmmnmlhjiffijhghijjihgjoprx{…yploqry„ŽŒ‰ˆŽ”‹x€œ©¤¢Ÿž¤Š~~€‚€}‚‚yy€vpmmrqiigpolmiekpsnkmgbgopolgcgoromjeelrolgcdjnklpkbcghg]UQE/+32>SQBDGCDABCDEEDDCFJMNOQRWY\^^][YUQKGC>950***'((#"$&'&%%%%$##$#"!%#$'%"#'&% !&"&##$%%$$#''(*+-27<>BCNTLJZghYNz°¨fG{¦‹c_ebZZ^gmihghkh[TYbkhbaffb_cddcbbcfddcbbeghcadgdcffgefiifefhffggghgeefggfgieghijhhjdiljgilogikiikllmmmlmlllhjkjhinr`WRU\fptwwwrvvd]he`n|utxsqsvsrsrrwwvvspsutvuprwwtuutttsptvuuwwvxwuvzzvuw€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Ao|ruzwsstttutrqsqprurprvplotvtrlloommppoomkijlmiklkihikjkkjihhieeeeeeeefeeeefeehecdgjifffeeefghgghfceihhffhgfhlklrvrmpw{uˆ|u~‡Š¢ÅßÀxu¹ÌÁÃÙÂ}‡¹kT¶îÓÎÏ×ÚÎÏàÌŽu‘ž‡rtwsrnRHq„\gstttnid]`]]bfe`febdhfdhmmosssuyrqstsqtyutstwxxvsvwtsuvttopvtpqvwvtssuvutuvutrppsqqstvwvwutuuuroqsppsropmpstsqnmlorqonoomnonmmnojkllkjkjlorpmlmlnrutu{~xx€…‰Œ›ž…mjorx˜ž’€‡›¢•|mmnkecgnnnojehqrokjgionknnfekoponlghmsokgffjmlpmdbilhd^TOD0-30;NOILJDGCDFIKMMNUTTX\\WRSQNID@<://-+)'%%%"#&%'(#&'''&%$# !"#$%$#" "! $!!$! &#$%),1578=??BIOQSZ^WWYNIXgj[Mw¯ªhK¦†]^j`XY_gmjlljkh[SYdgdegfffbcecbddcfgcadeeddebdgdcdcgfeeefggdeggehidfiiffiiegilifkmgghjljhiljjjkjiikmknplkmkgjlkhgilf\VTV_ltuutputc]jhcpzuuvrpruttutwtqquwtrtyxqovyutstvwttusuwyyxyxvwwvvwy{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Enyqtutxwwyxvuwvwutwzxtuuvxyxutvuwustuwzwuuttsssqstsrqstrqpoponmooooonnnqnllnnliikjhjlidijjjjiiiiilkgfhghgghiiiicedceedecbdddhkhhs~…~ee€………“…b{ŽiZ’±£¡£³¹´»ÎÁŽx‚pmyxvwj55~´¶Î·]o½Ä¸¼¨•ˆ{xŒxlzupvxxyupomptsqptxtuusrstuwuuvxyxwrwyusvyxqtvvxyyxy{yutwxuttvwwwuszxwvxywuyustxxtouyyxxurtstvusqrtnqturnpsrollnppoqlmnlnspoqrpmlmnls{ytt{}og`_aadhfigfhgiq{…~qx‰qnssmggklnppkghrqpmjgjntmljddlppmliefnsqpkeelqmnhbfppga_RMC1.2.ADHMMMNPSX[^\baYV\^[[fk^XWMJYhk[Lv®ªgH{§d`e`[^afjimkjkh\RW_efcbddcefaeiddhhabdefeefccefbcgjehhffhighgghhihgikjggjifiihjlhgllmljjklkkmmllnnmmmkjkkihljgggjklf[TUYdoussvtzwd]hfervswvsstsqquwtruusuxwywtuxwvzwussy}ztwwyxuuwwxwy{zxxz€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€]ŸµŸ†~|zsnottpwzxvy|{{zvvy}}{y{~zx{yux|zzzyuwzxvuvxxwvuuvvuuuvtttuuvvvtuwvutuvyvstttuvstuvwwxxqqsspoqqonoqpmkmrqqpnlkikkjlnljmifhllhghhfmdffdebfbb_Z^\\[WWYRR\koonknqdRMRNPdbK`€uvsuw‰¢°…k‹”¤¼ÊÉÊÍÉÄÊʳyBAÀËÀº½Á¾¹·±«¦¦£˜˜’Œ…ƒ„…„€~xw~|ww{zz|{wuvytuxvxytu{xtxzxxuvwwwvutwywuvvuyuuwzyvvzytruvuuwoswuroqtrrpossqrqstsrrpmlnuyxw|~zlhligjlnjjlkjkjjlof^egY]hqnooiemknqniijmplijgfmqnljhehopoojegmqpkheehmnnnf_elmmZRPE0+1/;KMBBA92/..,+(&%"&)'%#%'$#####$$"!!"%%&% "###! #""!!!! "#$%',2678:??AHMNRUVTUWZW`ea]\]]^`daY\b```____``ahg]Zac^dfeZYZPL\ikZMw®§hH|¨Žfaec[\`hmjkkkkf]Z`eedghffgfecaeiebfeddfedfihhfeghhffgijiggighjhhjkfjmmjjmmkhkkmplimljkmnnmmmkkmonnoomsvpkmmkkigfgkmgYPT_jpovuww|wc]nkfr{tstsvvsssrswwvuvutusvywvywqtwwuuxzywxxxyzz|yzzwx{yu€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€U–°¤™…wz}}kalspsxtsy}xvz}{y{||||zttwx€‡…‡‡œ°¶³°°®«««ª¨¦©¥¡ ¡¡˜•”’ŒŠ‡†„‚~|y|yuruyyustwxxwtsvxzyvwywwwutwzyu{swztx|tuvwvsuwtxuqquututpnrxqrlloopgbhceZSVWPPYjklqpnmdRPSRRUUWSPQYUT\[\W\\Y]acbgfdgjloklmnnlheijihhijkmggoroosqqppt{}{…Œ›¶¹¢’š¬½ÂÃÌÚåÏÄÅËÏÝéååòïéîêÚÓÐËÄÀ½¸¯©ŸŸ›™š–Ž…€…‡‚~xzxuuxzxuwxvssvzwuwwrswvrxytswunptyxtv{|yojotrqsvsorwtptpnqmdhplfimnpmhjlnmmomiglnookggjmllmmihjkmnkfhmnqokfekqqslcclojg]SOF4/3-#$$&'%$(##$%%%$$"'('$#"!!"""### "%&&'*-7;::>BFNNSVTPPV\VZ_^ZWUVQ\db\\^^`bgbY\b_`_]\\^acblk^[eh`cjj\Z[PIZjm\Lt­©eH}§Šbdng^]ahmhhhgih_[_eggccfgefdggffhgehgfeffedghgefhgfgijjihjkkhlnikpmmmmklnmknkmomlmnpnllnqpmooonorqoomptrjiokhfhlonlaYTUXbnuvtvv{ub\kkdo{vttyxrpvyvtrtsswwvxtqtywvwvvwxxusvzwuxzxyzwuvwxyz{{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€8_oggf_^^]]]_bdfdghghlljonnqtvvuqv|}}~ƒˆ‚……Š ¹¿µ·¹ºº¹¹»¼»»¼¼¼½½½¾½»¹·µ´³¹µ³²®¨¦§£¢Ÿ›˜”‘Їƒ|{}{zyxwuvvxzzyx}|{zyy{|{uwvqtzxrquvsnp}xrqtrprvqommkjkf`_^ZXOKYloppntveUNQQSYWSS[WQYa\UYY\__`eldgiihhknponorsrqrolmrtspppmijnnjkmlhffebeegmrsmgmpux{€†Š‰ˆ‰™¤­²ÎߨÓáßÔÝÛ×ÖÙÞàÝÙÏÖÝÜÔÎÍÏÇÆÃ¾¹³®¬£¢™™™‘…ˆ†ƒ~~z{{{zywvr‚y{|qsuƒ…€~yxprpnruuvmprrssroqrwobkwpflsrmkkiiklnnjhilqrmigimnrojhfhmlmokeflmpmjcakrmmohdgnrkZRNH:-)) &(#"! ""$$! !!!$$"$  %&&)+/51AABFMRUUSTVWUX\^[VVY[[]^[WY^Z\bb\[][ZbicY]cbfklbXZ`^dd]]^^eechf][cgebifZ\[NMYijXKy±ªdH|«Ž^`na\`bfkinkkni]ZdkiigikifhjgimlhhjiffjihhhfghijiihggfgihgjlljimomjkllknqpknqonolkpqjinponlomnonlmnmnnoppnmqkggfjmkcXRU[dovvuuvxu`^nkfrxqswssrsvutuzvstutuwuqquvwwutxzwuxzw}yzzutx{zxvy}zx}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€<`j^_cadabcdca`^c__bb^^a\[[\_``_^^____``dbbcdekqlosuwy}€~…‰‰Ž˜œ™—šŸ¥¬²·¹½¼¾ÄÇÇÊÎÏÏÐÒÓÔÕÕ×ÒÒÙÚÕÕÛÔ¬Š†Œ‹‘’‹‰‰ŠŽ‹†„…„……‚„‚}{wyy|vuutzwtyvqtpqxsomghga[XYTNZkqmkmmniSQWWTWX[ZYXUVZ\Y]]_ccbdhhjllmortvtssuutrutrrrssspoosutrrorrpqstrusqoopqqtqoortsrmllmooom`gfchifgje`_cghgmoqtx|€‚‡Š—Ÿ¥©«µ»ÀÀÁÇÍÐÚÜÞáâââáåâßÚ×ÕÔÔ®x‚{v€Ž˜—’–”ˆt{}yxzzxyxvvy|zwxvytimuphlopomkiiloonigjmonjigilrrolhehorqkfhjmrsohcdimmmngehmqk_UVK/#&$! "%&$""%(***/56@@CJKQTVYWTW\Y\baZW[Z\bdaZXZ]]_`\XZ_\afd]_a]]ekd[]dbcgicZ^dbcb[[\^fgeki\Y`c^fnl][XJJ\klYKw¯§bH~«]`ob\`bgjinjknj^\ekjjhhkighggigeilffhiilkiggikkjihigjifjmlikoollkkmrljlnnmmnpnmonmportpmnpnmmmnnmmojnpnlkkjpnlihhklf[UW\dntxzyy~ybajihu{ruxtsrtutsussuxwttvtrtwvuwyxvxzyxz|{yxwtvzz{{ywzzy|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€9_mcdd_`cdefeecc`__bbabda``acdcb__^^__^^a`aec^\]abca^]]^_]^bdcdghjlorvxy…„†‘’•™¢¤¦©¬¯²³¼º»ÀÂÁÂÆÈ¦‰†ŒŽŽ‘”˜œ˜–—š£Ÿ›šœœ˜”𛕖žž—˜˜‰‹‰ž†|Ÿ–|Š™Œ„vjtwttihgb]YZSKUmnlmlmrnZQSTUYXW\WVYXZ[W][\_``cghkosttrrxwuvxywvvvuutuvwxsqtvttwuxwutwvtuusrqrtvvsqpqqqpuspqqsrqlnpnnqrntpkijkjijhfghigd\]`cegghkmnptz‚‘”š¢ª°´½½¿ÄÊÒØÝ¯|wŠt„¡®§ž••ž˜‹°·¦¥£›œŠxuz~€€~xrv}€xqoonnmgimoolfdhnpomjhginmmmjfhoopkggjklppjeeikmmnfehlpk[SSK1!% '3AJQOG=97?GHGLNTWXYVSVWZ[^a]Z]_YZbaYUYZ]ad`[Z]^_aa^Z\a^bgf__a^ainf[]bacfid^afehha``_dddmk_\egaflh\]\NL]mmYJv®¦bI}ªŒ_and\\ahnjklgjkb^elihjlhikkgfhjihfcfjigjkhhijkjhhhihhhjkllmjmmmmnnpopopqrplnonmooopmrsnlopmmrpmqqoqsqnmmpppikjhggild\UTYgswswuruwc_olgt{ttuusstussuuvxxvstwvwvuxzxxusuxyyxvvxwvxyyzz|~~z{zu€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€8`qjlmgggggfghjkdffefghfb`_`bcb``___aaa`Z_b_[Z]`\]__^^_a_[\ab_`d`_`__^_^[Y[_a`behhhijkklpuwx{„ƒshhnpsu}€‚~„‰Œ‰ˆŒ‘”’››•• £¡£¬²¹¯™¬t¼¸¯ÙÌ´yKFT[[RQLMKEEFJ]ojloilujWMPUX[WUXTVZ[\`ca]\^abeiginrvvusvttuwxwvxxyxxy{|{uswyxy{uwwtuvvtrsuuuuvwrsssrsuwvtttusqoqqsqosvqrppprrqookijmomkpppnmjhghfedccehfecbbcefkknry€‡‹qv}z{‚‘ŒŠ‰›—‚•ÀÒÊÏÐÎÕÑ£}tqlwžŸ¤–€ƒœªšxjrphhigknnlgfiplkoohgnomlkfcgnrnmlhgjmloleehlonmeehkol`UNMC2+0>Qkvw|‚k\MP\[UVUXY\b`[Y[[Z]a\Y^]YY^^YWZ[\`a_[]b``bc_[]b``eg`\^_`hnf\]cadehf`bfefgcdb`b`ipna]bb\^^WNWZKEYikXKx±ªdI|¨Žabkd[]`imjkpiii`]emghlmkkliljhiljjljjiikhgkiijjjjjkhgiklkmojlnllklooonllmnnpponoooonoooommomrplnnlmqnmnoonmkkjjnnllf]VTZfrvvvvstwg`smfpyuuuuttutttvvwvttuussxwtvzxtuuuuuyzvvvw{{uu}zvwxxx{|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€>eskmojllkjjjmoqilkgfhgdhgefghfebcdedeffdgd^\ab``ab`][[\^_^\[[ZXYYYYYYYY][Z]\ZY\YYYYYYYYZ`_XW[[TXXWX[^\XY[]\ZZ\_]]]afihfkjfhotuw“¬¥|x…db““…¡±¡d41LQD784/.//,=drjlqhnud=5;@DINTgtpbeu~xsppponputrsuvvuxwvwxywvyxvvvxxxvtuy{{yxvyyxx{{yrsuxyywvuwxwuuwzwvtvwyyxtuusquwtttuuutrqzupnprrqoppqqqoooopplilqkkmmmkihkjhgghijinslozvqrx~|z}}vy‚ŠŒŒ— ¦…jfeev¦¥±§‡®´žwhtshfijmoomifiopppjdfpomlkffkqpmljdejlnpnfaflonleehjnlbYOPRKLYox††y|†‡†x`U^`ZYYYVY``ZY^\Z_c^[_[Z[^]ZY[]^ac`^`f`acc`\^cb`eha[]_]ekdZ\b`jikjdcecce``^XXTRUQG??=953./HYOJ[kkYKx°¨dI{§ccia\`cfkinolmi]\dikmkjlmiifkihkljiklkkkjikjjlllkkjhjkjgijijigjmnlmmlnpollnnnnljjjjnooopnnqqopqomookmprokikjjkllllkbXRV\fqxyuvxvud_omgrzuuuutuustvvuwwuuwwttuxywwwuwuwxwvy{wuwzyxzzxywwz{{}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€In{qrtprponmljjjpppnmllkonllmmljfhjiggikefd`bhf`cdeca_`a^^^^_____^][ZXWW[XWYXTTVTTTTTTTSX[[VUYXTPRSQRRPKKMOPPNMLJKLMNNMKOLMNNQTSPQ^bSQXOQVWal]R^YECPSGBGD97;9/9\hcehfnr^2)+,+4BQu’‹¢¾Åü¸µ¶´®¨¦¨£™—–“‘‹‰‡ˆ‡…ƒ‚{z{{ywz{zyyyvrxzzwwyywywvwywsnxxwvvvwxxvutvwwvwzwstwxwwwwwwwxyuvwxxvsprstttsrqsqrusnmprssrqnkipppooooosqqkntomqtttxxttte_`^\dkecbdfhnsxvzkt‚ysjjstkedjlmmlgdfhqtohehnooqohfikopnhehmollmidfmnnkdehjnla[VUY^l{}x}|nkv|ƒ‡rYYa^Z\^\\a`ZY^[[bha[__`dgd^]`^_ceb^_c`acc`\^cbcgha^_^gnsj^_daea`]SNMIGG@=70/+%'&# #=TNJ]mmYKv®¦bJ~§Œbcjb\`bgjinmkmi^]dhmokhklkkljhggefiikmkikljjlmmkjjjojknlijljlnmlijnkmmkknpnoqqolmnnmnlkpqonqmormmpnnnnnonmlljlkginodYSU[cnuxvwwyvc`pojsxrsrtuvtsvxwuvussuvuxstyzyyxstyzwvwvxwwvx~~vy|ytx}}|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Bhwnqtprpqstutsrtqqttqqtusrrrrqonqtrnlorjopkfhmnjkljhfghhbagf__e``______]ZY\[XXZ\[ZXVTRQRRRQQQQPOQQONOPOLKJJLMNNHJLNMLKKMIMOIJLHIJLIHHDEGHJJHHFCFMGCIKIIFFDADB::7/*(%$$ "!!%,' >TOLZjkXKx±©`K€©Š`cld\]ahnjkogfg`]emjkmliloliklifkokjgikhhklhjlkihjmjhikkmnlnnmnnlknqoopponnmoqomnqqprrqpkkpoopoklmjmoqqppmjidgjhkmic[SRWdpttywtyyeasofntrvwtuwtrwzwtsrtwywtuxvsuz{|wwxwvwyxx|zwy{yvxw{…ŠŒŠ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€3JRLORSVSSUVXZ[\^]\^`bbaccdfhijkgijlmmmmllmnopqqoqsuuutsqppoonnnkkjhgeddgfdba_]\^^]]]\\\[ZYXVUTSTTTTTTTTLLLLLLMLNMLLKJIIJJJJKKKKHHIIIIIIGGGGGGGGGFEEEDB@F>?AA<9EV]Z^^^g\F=FGBFDAEIQZbimowx~…Š’˜ ¦¬²¶¸¹Â¾ÁËÏÍÐØÝÕÍÐÛáÞÙÐÑÓÐÊÃÀÀ·Àº¢–œ•“—”ª®—…Š‹‡Šˆƒˆ‰ƒz{~~xz~|y{wqqrtw{}{upwwwwwxxxursvwtsvutsqqrtutuuronqtosvtqopsprrttvwlmlv~vrw{tifkkiihgjlkkklkhjle^cg`^hopomhflpnjljfgqmmnkhhjlpqlfekpmkjigimnpnlhffjmrpe]dnolh`X`nppzyku‚sejp{…ƒt]X`Y^`^`iia`d]]fid___]diaXZ_adikhda`bcefaYUVQOJD=73032-$!  !"##&(# (+)*-1%:VPJ]mjVLx­¥dI}ªbbje[cecmqnnpmg_^glklliijlmlmiinnjkkkjjkmmlkljgkpoijljhlnllnjlppoolkmopnlkkpmmpqnmnpmopmmqtonqromnlnsrnopnmjeglkjlng[WXZanuuuupuvf_rlct{vsttuuwyvsvuuuuuuuusvz{{vuxwvuwzyvwyzxuuuwyw‚‹Œ…|xt€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€+AF===;=>>>??@@ACBACEFFECCDEFGHIIJKLMMMMPQQRSTUUWY[^_``_ccdefghhgghijkklonnmmllkkkjigfeeccbba`__\\\]\\\\VVUTSRQQRRQPOONNLLKJIHGGIHGGEEDDFFFFFFFFDCCDEFDCA>>??:9HfkcgigleP>BEAFFD@ACEFFFEFFGJIHINRSW[^acdompy}~‡™–”𣫮®©´»¼¿ÇÊÇÅÊÁ­¦°¸·¾Á½Æáäʳ´¸¹¼¹¶¿Å³¦¨¦ £Ÿ—¥¼¹ž•›—ŠŒŠˆ‡‰‰ˆ‡~|xutvz|urqrsqrvtuwxxwvtruwxvuttvtrsuvspuysnrvqhft|xtuxyunptpmnnrpmlmmlkmmkc[enjelommkgfjnooogcisojmogcjnnmjffimpopmiilnkmlggknlnogagnmjpfYd|{mmsmvwfdkm€‡{gbf]]_]`hg`^_\_gha\]b`gnia_^]^^\UNIGB@?>7/**&%$" !!!!"#$&&'**)(&%$$%%!$,,)+,0$8UNH[ljWN{±ªdI|ªcbje]`dgklqpooma^hkmnlkkljgjjhgjmjghjighkkhmhgkmkkmlmkilooqojjmnoomkmmmnqpnqnmqqnmpmooqtropqoopnmnnrqnmnmklnkkljjmme[WY[erxvtvw{uddrlct|xuvuutuvttvsvyxvttuutvyxxvtvxxy{yutwz{yvvx{…‰upcXV€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€&@???>==<<:98:<==;::;;<<<<9:;<<;;:9::;<<==;<<==<;:DDDEEEFFHIJKMNPPSTTUVVWWUUVWYZ[[^^^^^^^^________``_^^\\[XXXWVUUUTTSRQPPOONNLLJJIJJKJKJJJGFFFFECA??>;<65HflacjeggV<=@AAABCCBAAEDEEC?@DAAABCDFGGFFFFEEFNNOOQTXZZcigjqsow{zrqzƒ…•—¦Âɵ£¥¯¶¿ÂÅ×äÊÆÏÍÅÉÎÑçëåÛ×ÕÐÏÇÈÊÏÒÒÐͽ·­£šš›’ŽŒ‡…†}zwuyxwutqmjsrrrrqqqtwtszwoniuvruvtwuopqmmpnnoprsromlori_grmgjmmjjkiiljhlkghoqpnkedmomljgehlpoomijnpmmlhcchojmjfjmkioibj}shmou}xf_ik{†„tee^[]]ahga_b_agf^WVXTUUNGA:6773/*('!  !!"#%&&'))',++*)(('(((''&&&%$#%)&&++/#7SMG\mkXP|²«dI|ªcbke^_cjjhrsmml^[hkkkkklnmkigikigikjgghihhijmmihlkglmlklmnpnmoqommmjknpnjloooomnppnrrpostqprqppqpoqqomoqnllmkjihjnmd[XWYdquytvw{ufgqjarzwvwvttuutuursuuttuwwwyywvvttvwwyzyxxw{{wy€„|ndb_]^_€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$8=79<9:==<<;::9;:9:<=<;<<;;;;;;<==>=<;;;;<<===>@@?>=<::99999999:;::9:997889:;;;???@@@AA?@@AABBCFFFGFGFFHIIJJJJKNNMMLLKKKLLLMMNNMNMNNNNNMMMMMMMMMLKJJHFDFFB=>85G]jb`hfglY=9D@<@D@@@@@@@?@?@CA?AECB@??@ACEFEDCDCBDEEDBCEHABCEEDCDDGHIGHIKIORXfkb[[dkvz’Ÿ‘Ž™ž¢°¹¾ÞçâÙßéèãåääçêííëêéçãÞØÒÎÊÈÈȶ­ª°®ª¦£ ŸŸœ—‘ŽŒ‹ˆ…|}}{yxy{xwz|{wmlu€ƒ€€~}tpmlmsvtostqoopppswn`htqbfqtljjbjqqnnkggnoqojhjmknqne`hsrolifhlmlmkedimnimkgjljjikpomxzjjmrwreajoz‚ugebaa`aa^WSRMJKH@851-,*$#""% !#$$&'''(()))++)(()++((''&&&&&&%%$$###&''((+.,1$7TMG_olYNz®§cH|ªccke^_cgjipolmm`\fimnmkiklmlkmnjfhmlhhllhimijjjjlljjmnnnmmnmmnonnopkjlqqonqosqlmssnqomlkproqqooqpnpqqpqrqnlkjiihkmnb[WVXervwutryxhdpkdtzvtwvtvxvwwuvtrruvvtvxvuxywvvxwwwxyzxyww~„~ul_[adhsƒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€&:=69;7788889899:878:;:988877666:;;<;;:9<<<=====:::999::6789:<==A@@>=<;:<<<<<;<;9999::;;7889:;<<99:9:9996677889988777766566788999999:9::>>?>?>?>BBAACB@>?>9573/@DBA@>>?@A>?@?ABCB?>>>>????>?@BAAAFCBBA>?C?DDBCCBBADBDB?GLGDKLOX]bz‘€•‘šª¿ÒàçéÝÜÚÙÙÚÛÝÞÞâççàÛÚàßÞÝÞàâãØÒÍÉÉÇÅ¿º´°¯­©¥‹y{zx~}zzŽ›”••‡nusoswvwsuurqrrppovqditofiopkijhjnopqjfjnmopjegnolkkigiopmlighlmllgabimmkmjfikjllowshpwmgiqumeehiu|~q[USKHEB=60+)&$#! ! !%##$%$#$')/)%&)(()++*)(''&(&%%$$$&##$$&&''##%&()*+,0348>:0/2&9UNH]mkVMx­¦cH|ªcclf\bcbjmkmookc_hllmmjjkmmkomimolknmlmlkkmkhhmomlnonljikorqommoqpnnpokklljjjiefffdhghfeinmtsqoqonqtsrqommkllkkmlmnf^ZXZesvsturyyg`qokz}utvsqsttuvsvutvxywuuwvtuvuuxwwxwwxyzyv{ƒ|njc^n~‚}{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€(;?:@DA@;;<==???=;:;==<;==<<<<<<99:;;;:98899999965433334333333440000000033210/../012345623344556::::::::;;::9:99;;;;;;::==<<<<;;;;:9876655555555320100-+.+*)*)'.GdldfgfkmN018789:::;=?AB?>@CA?AEHGGGFGHHEEDEEDCDECABBB@>>B@;;:=<:;?9;====>>@@=AA=BCCCGB<>>EDJIFHHINNNRZhv€†}wtty„‘‘•£¦©®¹½ÃÊÐÕØÙÞßàäæèæåææåãààâ丆|ƒ€ƒˆ’–—™“–{{–™Žˆ†Š~tvyxvvuqxxjmxvqnmqtmfgmolkmicdjpqnhbdnlmmkfcholmnmiimosoicbeknmmgeikklpopruwupdhqtlfeeejw‰s>%)&###"#"%&$(*&&)(+++)&%&(*&$&&&&)%%%%%%%%!!#'(%$$)**,-./0:;>BEIKMPPQSY^N504&9UNHYjhVLy¯¨bG{©ddlf\cd`jnilpmia`hmmnlkklkhjolimnklpnmnliillmmmnomkonopmkkjikjhhgeebfgebdefjjiijlkjnpmkkjhhmnopqpoqqopqnkjkijjkmllnaYVX[guzutvuyvfdnlgw{wx~utsstwxvtuwvuuwystwwsuxxvstwwx{|yqy…~pig`^v‡Œ“Šu€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€&8;59=87667899::=;:;<=<:==>>>>>>:;<>>>>>=========<:87778<<;976545566778833210//.00/.,+**//000000000000005444444488888888;;;;;;;;>==;;:98:9:9:9:9;986630.)&,,(((,>ZjgiifjoZ4(.++-210../010025536:78899887=::>?;<@AAABCDCBDGE@BHG@BACEEA>=>==>>>?>@@=BA;<;>9:9?C=>CC>>A@?AEGHGCCDEFFFFKHHLOOSWY\bhnrtv„‰—¢¦©¯·ÀÂÂÇÔàµz…ˆˆ£¬ ”‘”’ƒpŸÊÐÄʾ¯¼¾˜xrsqzŠ˜•ŽttŽ˜{iosleffproolggkqpkigfknookfdhmmnomigijmniackmholfekljkpnjn{‚zpgorojdadgcmˆy<#'"" " '&%%'*-.,$#(&$$$)*+)'%&'(&&''$&*"#$&(*+,//4:=;;>>>========<<::;<>@>>=<<;::========;;;:9998777666556666555511111111.//12344222223330123456756666666555555556544431/+(22(')+4MbfijehnfA03.0675310011101320151234420/5006612713454445;758;<<;::=AB@=;FCCCABEF@BAGF@A?CBCACD>@:@BA?96==<;=?@?=B@>;;<>@?=>BCAACA@???ACDEHJIHJOTTY^`bgqymVXX[ddrt~|z‚ƒte‘ÃÊÁÓͽÎÞ©|spk º·¿²‰ƒ§Ã¶€eoqlkgknmnqkfhmnrqjfjpprrlfehllkjiffggjkjedinookefmnjiqqnktƒklxrhhb^gedctx^LHUKE;-()%(&(4GVZW@0),+(()%'((&$$$$%(++),1568;>ACDEBBED@@B\\\[ZZYYYZZ[\]^^`ZY[[\R?.2$7RKE_pmYOz¯¨aG{©ddmf^_bggenplnna]hklnmjhikkkjjkijjjijkkjkmnnmmmidbcfaacbbdcdda`gjgeghhgffhigcdkliilmdahqvvqikqtpnnnppponqpjkolfhllleZVZ\es{wtutywe`rmfv|vrsuwtruvsrvvvuuuvvvusuwustvvwxxywr|qrŽyqt{¤¾Ì·¢€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€&:@::;;>==>==<::9;;::==;===<<<;;;><;=:79=;99;;97<::<<::<988:967;<:89;<;9;;::9988987666667655557777777777766799758998544555656565887766657996688535899642022//.*%+BelggeiqfD,48103467876586568987;88;:88:876667895555666643333333332124422235668<;<>?@AAADEFEDEGIEEGIHFFIDEEDBABD@A@>>@?>?==?>;<@@=<=@A?<==<;>AA?=?@?><<<;;=:79:7ACDEEBBBA?;8621.-.&&=VZ[]YVYWW]]UKEFLY^ZZ_ZL9*2*6SOEVplVLx®]Hƒ¬‹bcnc_dd`ciqpnqpb\gmlnonllmnmkikolhjljmolkljkliddeef`acefhihgcdjllmnps{{€‹ƒŠ“™ššœŸ ¢¤—‚wtrmlppkmuoqqopqmgpkhjljijfXSSZhryzzvxxtefmofsyutwtuwyxuvywvvvvxxvtuwwvuuuwqyxxysx„ukšÕÇ ›¨ž±ÕèìèÛ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!3:6764645678888;77<<99=;==::<<9;><;=;8:>>===>=<;<;;:;:::;<;::;;9888999899::;;<<;;:999::98776789666666668886558:5677667966666666877766654664355245676532455322.)'AakijhdphI./5211233443334555556655665567899987644567899888999::8::99;<;;9997457;9754689986557:=88888:<=:>??=<::>?><=:;;83550:UjhbgnooW?>>=====<;::;==>:<<:;<<9<:88:;:9;879:9:<<:;==:;>@AA?BFEADEEDCCCBB>?DFCCEBBCEJMF6:VkibekmiN<:<:84:987764224/WqoXLx³©`G«Žfdji]^_chijmkmne^gkomllnnmkkjjiiknnllmkikopk`]baXTWg~– ¤©«©³»¶´½À½À¾Â¾ÂÉÉÃÇÆÅÅÅÅÅÆÈÆÉÌÊÈÈÈ·}nprrprnnqrnllkmlikopmfXUU[gpvwytuyzicttjuzsqtuvvttuwvrqsvvvvsuvwwwxz{{{y{|vwzy|žÆàÍ´ËÊ©®Õèèê퀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€%48676268887643247644774799768867889998835775579688779977::979998:;;989;:::998887777789:::9:9:::;;;;;;;;:99;<<:79:;;99:;::9:9:::777666666766565565332334232001.*06Jhldjkin\;)063432223562344334658866997;:876677899::;;;99::;<<=<>=:89:9667888:=999:9::;?>=>@A@>?@@@BCB?EDCCCCBA>?AB@>?B@>>>=;=?=<::;><9::::;;9798:>?=>CAADJRWH11RkmjkmlhYQTUMFEHB?CDBBGE?9@\Y@Onlkopkedkkhkokfjmlllhbelpomkedhonkjjfcgnmlhcaglklnjeji\Z`^^XJED>4@NV[][XYY\bdaWPMEFPZepw‚„wikpx„…‹‹ˆa:$#&%&'''%%&''&&%+)'&%&'(((&'+%&?USJMRKOZN3).)&)(*':W[XQ<)1)0MKB\rkVLz²¦bIªŒeend]accimsmjmpc]fjikllkklnmkjhglokhklkloniefjfUSnޤ®¹¿ÂÆÅÃÇÈÄÆÌÈÃÈÈÿÀÃÅÅÅÆÂÀÂÆÈÆÄÄÆÉÇÁÂÉÍÔ¾—{trptpnossplkklkjknnmg\YXZfoxwxuuyxgcrtjvzutywvuwwvwyuvwutwvqvwwvtsrrxvzyqrxx„œª¿æà¼Ç˪­Ôéìí퀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€&594665966766543623562254223310243566554458765797679:9:;8899967:79;:879;8877665598889:;;99999999;;;;;;;;><:9;<=<;<==;;<=<<<<<<<<99::::::87777666764223452320120,05Ihleljhpb?-17365433568765689878;;9:==:<;:998:::::;<<==;;;;;;;;9::9<;;;:9:=;;;::::::86679:9=:99;;<<:<>??=<<>BDCBBDEDDEFECBCBBCA@????>>??>=<;;<;97898:;:@G?+3WpoihjniVKMPLIGDCBBFJMMPNPM[aLIQconomhbfjmmmfdkpnopkefjknpme`emnjijjgjnomidbgkjjjecojUMRNMPOF=:INXekkhfnlntvroneZVZ_ehdkx~{unp|…‰†ƒ€e?"''"$,+$''(((('&('%$$%&'*)((+$%>\SHKNMQQ?35<6+))+&,EZ]P8'1+1NOJ^rkVKv®£`Jƒ«‹cepb]cdbfmtrokje_ellkjkmmmkmmmjgklgikjimpkbaghZUr£ÂÌÆÂÄÇÇÉÌËÆÃÄÅÄÅÈÏÉÇÊÉÃÀÁÅÂÀÀÃÅÅÄÇÅÄÂÀÅËËË˼—wrwsrqomoqqnljjkkikmeWTTZfouttrtuq``tsht|xvytsuwwuvxxwwvuvvspswyzyxx{xztzxx±¬¿ëÙ¹ÊΨªÓëìëꀀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€2FLFEGGJEEEDCBA@==<=<<;<:6599448546755645666566753377669:89;:78<::;;:9:;7778899:887778997889998899999999:<<<::;=9;<<<<=?<<<<<<<<<<<<<===<;:<;:9;<;98899:67644752+8Sjjkmdhq_>/45254444566:878:<:89::::<=<;<=>>><<==<<<<;;<<<<<;;;=<:9:=<:<;;<;9;=<<;<;<<=<<;;<<<<=;:<;:9::;<;99:;;<;89<<;;;<=<<<====>>??@=>?@?=>@==<=@CDCCILNU[J.0SjkkmmphPEF@=<688646<=<<;>DZ^B/?^qolmkgjpqqnfcjolnojdfkmoolgegjmnlhdgikpmjechkjloe`szaNMKJPUPOZedefdchorljotuw{sup^VemcY`kw|xuy‚‹‹…‹†pB(")$$)$&&())*))%&%&')**''%'*$&>YWRTURL=/457;8-'+)$8WbO3(2,2PRM\snZJr«¤]I…¯ddne^ab`ehmqnllc]ekmnonkkkmlnnifhkilmkjmlf_f\\gyœ¾ËÅÀ¿ÆÇÃÄÉËÊÈÅÃÆÇÁÃÃÄÅÄÄÃÄÆÆÄÂÂÄÈÌÈÄÃÃÄÈËÉÀÅÒ½…ounoqpopsqmljiljhingVPS^msvyzx{{veeyufs|zuuquwvtvvvwvvutwwtwxyyyyz{tx|qryxˆ«®¤ÂéѸÎש§Õîêè뀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€6Q\SRTTTUUUUTRQPORRNNQQMNKKNMJJLHFHIFEGCA@??@@?>:999:99988998789876778764455667788766677889::9888888888869;<:8898:;;::;<;;;;;;;;99::;;;;=;:<<99;;;:9999977645774);^lhmmbjoX6/4423455665588889999878::::<:;<>>>>=::;<=>>????@@@@@>?><=??>@???><=?><:99;>@?ABCBA@@?@BCCBBB>??@????>=<<=<:7??><;;<=;:99;=<:89:;:9;>:88;>@ACKLJISZF%1RgilmiifTNPKEDB@=:9<@DFKD^WKMRI9+'+,,2=:-%)&2N[P9-2)3SRJ[ro]Nt¬¥bKƒ«‹dfqjbccdhjnolqrc]hlpnlkmlkhglmkjjjjiklnnhcefZo—©°¿ÌÅÁÁþÀÄÄÇÅÂÄÅ¿ÆÇÆÃÃÄÄÂÄÃÂÁÂÄÈËÍÇÃÁ¿ÂÆÇÅ¿ÐÏ¢yponoqrtspljjkkjjlohZWZblprvxvxzwebzvgs{xttswzwttvwwwxwvxxtwwvuttvxp{}rpt„¦¶§ž½ç×·ÁÓ¤¡Ïëè忀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€1Q`WTWUSSTUWXYYYZXWYXVVWXXXXWWVWWTVWSSTPVTRRTTRPNPPLKMLIGJKHGIJICA@ACCB@A@@@?>>><<;:999:89:;;:988888888897557887:;;976669999999955666777854763363333221144312541-<<<<<===;<<=>??@=@@?>?AB>==>=<=@AAA@?=<;>@@?>=?@ACCA?@AAEDCDDDB@CA@AA??@>@A@@???=@@=<=>=?====<=?;99==;>DCHJJSYE$+Qhhfgipl^NKNF>A>>;8;CGFFHBI\^I3@aurnlhgonjlplgkmkopgaekhnqlgillklkfdfikmkheejnlplcdshI?BDO\bcefbdfhjmnmmmmnqtvwwy||iaX]dfrƒˆƒ‡‰†„†‹c;-*)&!''())(('&'()('%$((&'*#$=\YQVT9(*(#,+ /?4&*!(F_V812%4TPE]qm^Sz¯¥bI‚¬Žgfmf^abbgjnllllc]dlpnmmnnlkdijjmmjkommmi`bn_Z}¯¾¹¿ÈÃÁÀÀÀÁÂÃÈÈÁ¿ÅÁ½ÄÄÄÅÇÈÆÁ½ÆÃÀÁÅÇÆÄĽ¼ÀÃÆÇÆÈÂÅÊ·wvsomqrqpqgkmkjmpqfZWVXdoyuwuvzzgavvjtyutxwxyxtpsxuprxyvuwruxzzzyy{|uty|ª²©«ÃåÖ´ÅÍ¥¤Ïìïë倀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€-GNGJLIKKKLLMMNNRQPPPQSTRTUSPPSVVYYVVYYVUXWUUYZXWYZXX[\ZXXXXXXXXSSTTUUUVSSRRQPPPOONMLKKJDIKHEEECFCBCB>=?DA?>??>=<;=>=?AA?=<<==;;=<;??<>A><;:<:;>><;<9;=>?>=?AAABEAADFDBABBAACDC@BCCA>=>@A@@A?==?GBFLPSD'(Ihjeeejj]OPMA@@;7349?BBA=9AZ`C,:arnqndclommmieiljmngchmkoqkdchklmkfeikkpkgecgmoloedgTBALW_dd^^gd_`fjpsnnkmstrtzw{‚z|‚‚zi[\ckv‚‡‡†Š„…‘‡pQ9.& (')+)%&,#')(''('%(('*%&?:<@=;;;::::987623553346,/Qllkkjfm^B56786679<=<:9;;88;;9;;;;<<<<>>===<<<>==<;:98;:9:<=<;<:9;>?><>=;:<::=<8:<;;<=>>;77:=<9:;<;;99AA?=;;<=;;<=><<><97:<=<==<;;<=<9>??=;;>=<>B@DKMQ[N-)Hkrkkjml_QROEDD=;9:Y\^X?((+#(++4;8<4(%%9ZS6-6+5QLE^qkZPy±¨_H«Žgfli\^caflrpomld_gnikmnnlllmjjmmkjlgknkbiug[­ÂÅÅÃŽ¿ÃÆÄÂÂÄÐÊÀ¼ÀÃÁÀÆÃ¾¼ÁÈÈÄÆÅÄÄÅÅÄÂÂÇÉÆÁÁÄÆÉÉÂÈά~mvrprrommpmlnopopdZWZ^frx}ttu{yifrpgt{yxwsuvwtuwxvvwwwwxx|uotzxtuvzrq{‰ž«¥ªªÁçÙ¹ÃÅ¥¦Óíééꀀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€7QXQUVSUUTSRPONNMNOQQPONLKJJKKKLLJIIIIJLGHJLLIGFHFFHHFEHJKKKJJKKMMMMNNNNMNOPRSTUUUVWYYZ[\YX[]][Y[[[[\^^\]^_]Z[]`_]^__[YZ^[ZZYWVXWWXVUSTTTOQRPOQQKKKKKIHGFFGECABB34SnmggkemnW;362333577647898899788888999:::99988<<<<<;;;<::;<=<;===<<;==>=::;:9=;8:<;;<==>=::=>=<<<<<<<<=;:<>>;8=<<<;;>A@=;<====<;;;<>=;;=?><999;:<>?>@DEJOLN[R4$=dogfijobSQMA?>:999;>DHEC@E[^C.:[ponmhclonllgchpoopkcckmmomfcinnmiddgjjliihegigjgcs|eU\fdca_bffcgd^ajqrrolmswuquuxyz€{{„ywoc_q€†…††…ˆ†ƒ†…r[3%$*)'*'&*+'&()(#&'&(#$><<<;;;::;;;;<<<<;=>=;:;=8:;<::;><<:;=;9=:8:><;;:878<<:9:::9::;<=<<;<>>=;99:;;9:<;;;=>>=>??=;<<<;;<=::=@@@ADGINMOWM1';aoegmoqdUSNECB;::;=AEHEECI\`E29]spmkgfiljkmjgjkpqnjeekllmkdchmmoniefjnlqkabhkloiap|m_b[_ggbdgcbb]^cflwsnmswuqotx{{|€‚€‚„‡…€{lYXn€ƒ{vy€ƒ…ˆ‹Œf='*(&()")+(&))'%&%%*%%:X`XE/&*(*),3?;,,<0*&5XZ9%0&6URM_rkZPy±§hK¬eeoi_cd`ekoqsqmdaimlmljknmihlmjhilmkqp`cqjb£¶ÃÇ¿ÂÅÆÁÂÉÆÀÄÏËÂÁÄÃÅÇÄÂÃÄÅÅÄÀ½¼ÁÅÇÇÈľÅÃÂÁÃÄÄÃÅÈÂÃÏÇ¡}usrssqnlnlmonkmrd\YZ^htyxy|wyvgf|vgrwuuvtrsuuwvsssuwxwuryzxwyxvv~qly‡’¡«¹´ªÀæÑ±ÆÍ¨¢Íìîíꀀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€6PXQUUPQRRSTUVVWSSRRRSTURUWVTRTVTTVZZVTTYVUWWTTVUXXUUXXUUUUUUTUUTTTSTSTSTTTSSRRRQQQOONMMPNOPNJKOLQSOLMOPLKKMOONMNLLNPPRUSSSRRTUUVX[ZYX[]_\]\Z\_]``aaa`_^```abbccdWT[hpjejfgfefhdfeca`_``Z[\^^\[ZYYYXXWWWQQQPPPPOOONMLKJJGHIGECDEA@@BDCA>>?>?@=:<:7:=;998:7687669::989:;<8;?>;:<;:;;:=ABCHHKVL/*=cqijprqeUQMDCA<:8:@DGGLJHL_`E2:atonkegjkijnkgikmlkjfdimnnicchkjjifeeghinh`djjipj^h}zk_X_ikedeabeb^dintqnmoponosxzz|€€‚‡‰‚ƒx^GRk„{{‚{€…ˆˆŠŽ’‹l=&,+&+*$#()$$()(&&-*(;X`T=-)*#',79:920:3*%6[^8(2(6SOJ`rlZOx°§_E}©‹bdqh`ed`eloqpnkc`gkmlkjlmkiojilonkigliZjtgyž§³ÆÅºÂÆÇÃÂÄÆÃÆÌÑÅÂÃÁÂÆÅ¼ÀÅÇÅÃÂÃÃÇÅÀÁÇÈÃÁÃÃÂÆÊÉÄÈÌŽÅÈ«„wurpqqpnnlmnnknrc]ZZ]iuxvy{tyyifxpdu|vsuxxwvwvuuzwtrsuwwuxxwxvssymm|™¡§µ¶®ÁèÙ¶ÁĦ¦Ñëêê耀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€6QYTWYTUTTTUUUUVTSRQQSUVTTTUUUTSVUTTTTUVVTSSSRSUXVUXWTTWWTQSVXURVVUVUUUUVVVVWWWWWXWXWXWWZZZYVTUXSWYVRQSTVSQQTVVURQQSROMNPQPNMNOMNOOOMMMNPOPPMQSPSTTUUUTSUTSUVWVUWSQSbngbabehe_\_`bddcbbbfdeggedfccdeffggddddcccba```__^^`^\\]][ZZZZ[ZYVTSSRSSOLNPLLLIFGFEFC?=?@?@@>=<<<<;<>??>==A=;;<;;AFILILZR3&>bpjkllodSMHA?<<97:@FGFGEBH\`C/;/**/63'%<]\6'2(6TPK`slZOx°¦]F‚¬cdnb^egbhnprpmleagmpnllkjijmnppnlkkqme`pnj”¯­ºÉÀ»ÇÈÄÂÀÁÂÄÅÆÆÁÂÈÇÅÅÆÂÃÅÆÃÁÃÇÉÊľ¿ÅľÁÆÇÃÂÄÿÀÆÄ¼Âʲˆwvroorqomljjlnmlb]ZY\iuwvxytywjozobu|uru~|uruvsuwwvvvuttrtwzzuu|{lp…–𫳲±ÉëØ³¼Å¦¤Íéëêæ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€3NXTYZVWVVVVVVVVTTTTTUUVWWWXYXWVZYVSSVYZUVWVWXWVZWVXWTSUWUTTVWVTWWWVVVUUUUVVWXXYXXXXYYZZ^^][Z[\\[YXYYWVWZ[\]^]\Z^\]``]\]\]\YY[[Y[ZZZ[[ZYWX[ZX[]XTTUUUUTTWUSSTSQOUOFDWgc_imsrcPMTRTWWVUUVXUTVVTUXZZ[\\]^^a```____bbbcccddfdcdffedbdggedeggfdcebbehdcd`^^]_`_\[\[YWVUSRQQPTPLKLMKIIGGGFDBBBCB@?@A@>><9899998655677668;;:;=BFMLMVK-(DfolmkklbRLIDDA<;;>CGIJDA>E^bG1<^oknmeclomlmieijmpmgeimnnmiddilgkmjecioklojcinjongrŠ~f]`djnmkljhheabionrqljnqotzzy|~}~‚€ƒ†„‡rZTey…‡‚ƒ‚„‡ˆ……‡‰‚U*")%)+)'3A=-$''&)$%<[cQ7+*+$*8>/&))*63$(E_W4&0'6TQLaslZOx¯¦bL…®hgme`ec^gpspnmld_gnmllnoljipmhhmrpjoma`mgr£·°ÁËÁÀÇÈÀÁÂÁÁÂÄÆÈ¿ÅËÇÂÃÉÅÄÅÄÂÂÅÆÃÀÀÅÇÅÀ¿ÂÃÁÀÁ¼ÃÄ¿ÅѺŒvvtpqsrmnpnkmrrma]YW[iuvzwur{yjnscrytsvyvrswxusyywvuvwx{wtx{xuy|ls‹—¨¶®®ÈâδÃɦ Éèíì倀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€7R[VYZUVVVVWWXXYUVWXYXWVSVYYVUUWSWYXXYWSSWZYY[ZVTVWUUXXVVY\ZWVX[XXXWWWVVWWWXXXXXYYYYYYYY[[YWX]]Y^XUY\[XWYZ[ZXXY[_\[\[Z[^[^^[\`a_^]\^acb`Y[^^\_`Z_`aaaa```_]]__]\`_XQ\iimplpqcVW]WXXVSSUWXTSUTSTXQQQQQQQQSSSSRRRRTTTSRQQQTVWXWXY[\[YZ[\\[b`]]``bhb`dhgfgfiggiighjjjjihgffdddcaaabca`_\ZZ]Z\\ZXWVTWWTQOOONLLKJHGEDGEDCA?@CHHNQPSJ5,IgkkmkmkaPIE@@<78:<>BEHGB>E]bD-:[nlkkgckppnlgekqlmoiehlomkicbgklkjihilomihgegkkqg]p“œ‡k^_^aggipvssndclrlmmmlklmq{~{zz{€{ƒ‡€ˆ‡‰r_\ey†…†‡„…Œ‹…‰‹‡rO3)*/',L`N.&,.,,%)C\eR6)(,)5:5+,+%-95#-N`T5*4)5RNHaslZOx¯¥bJ¨kkpebhf`fmnppome`ipqnlmnmjgjijlnlkjon^gtez´º®ÀÊÄÄÃÅ¿ÂÅÆÃÁÄÉÁÄÅÈÉÀ¾ÉÇÂÁÆÉÈÅÄÉ¿ÄÊÊÇÅÃÂÁÁÂÃÄÅÇÉÇÀÆÔ¿tvusstqkiopjinpm`\YWZhtux{|vzvfk{rcrzxwxvtvwuvwuuvwwvuvwyyvsuvvymix–‚y‘¡š˜¨¾·¬¾Ã§¦Îéëëæ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€9TUOTUUTTUWTXXRVURRVWUTURWXUSVYYUUVVVVVVXVUVXYXUYYXXWWVVVVWWXYZZ]WUVWUUWXVVXXVW[ZVY[Y[\WTWYYWVWX[^_ZVY[VY[\[XWXYZ^_\ZZYV[\]]]]\[`_]]][_ha`_]]]]][afe`]`dZ[]^`bcd`i_RZfikjmnkgeeg``````aaaaa`_^^^^^^^^^^^[[[ZZZZZ[TQRTUUSQQQSUUSQQRRSRRQPSRQQQQRRUUUUUUUUYZZ[\]]^aaaaaaaaedcbbcdejjiihggglllkkkjjiihhggffeedcbbaa_^][YXWVZVTY_^VM@MfmjolimaVPLFBA=>@BDFHHHICFY`K0:Wmolmjcmprsphdfnmmlhfhlrokhhhgflnkffhkoiffc_dlmtk^o— ˆxiebadhjksutohfkpkkmpnhjprz{vw{‚‚ƒ„……‰‚wojjz…„„†‰‹ˆ………ˆˆe7'',*"4YcF 'AC0 "?]bN8.)+,;<.#*)&.;1$6X`O715)4TTL\poZP}°¥aJ¨‹gipibfeaiprrqokc]cnkomknqmhkimpmllgplZlznŠ´¶­ÂÌÆ¼¾ÅÂÀÃÆÄ¾ÀÆÇÂÃÊÌÆÂÄÄÁÁÄÆÄÃÃÈÆÃÂÄÆÆÄÄÇÿÄÇÆÅÆÆÃÂÍб†sqppqqpnmmkimstqeWW]WWktv{wxvijyqew€{xyuwywvyzuvvustwwvutquurz~rn}”™„s~„‰‡‹’Žš¼¿œ Éâèë耀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Bjwplgin_\`]WTQYWYZZXVW[XWUTUXWUXWWWVVVVWVVWXYYXVVVUUUTTWWWWVVVUTUUWXZXU]YVWY[]_ZWWXUY__]YUUVXXWY_a]XZ[YZZ[[Z[[\Y]^\[]\Y_````__^Z[\]][[]\[[[[\]][_ba]Z[]baaa``__[c^Yaknrkhfec`adccccccccccccbbbbaabcdeef\\]_`bcdba`ce`^edcbbbba`cb`_]\\\WXZ\[[YXTTTTTTTTRRRRRRQQSSSSSSSSXWVUUVWXUVWXYZ[\[\]^`abcfffeedddddeffghhggghijjkjigffgffZWfnmmjmqg__`_^^XXWVVUTTYWMJX`O;AUlrlklhiiijkhdfponnlhgilnlgdfiigkmhchnlkjhecgklokbr—¥•‰nicbdinpkorqmlossrsvrljltyzwy~|€‚ƒ„………ƒ„~ohp|‡ƒƒ‰‡ˆŒ‡ƒ‹zG'#) ;[Z@, )E@*$)9XdX?*'4;=0#%,+*0@,(CZ]Q715)4USK]qpZP}¯¤bI€©‹ghqg`ed`gnpopqmcbilomjjnonookkkhknmpi]otm’¹¶·ÇÆÄÇÇÅÇÅÆÊÈÂÃÈÉÁÄÊÅÁÅÈÀÁÅÆÄÄÅÃÄÅÄÂÄÈÇÂÁÉÅÀÆÉÅÈÆÁÂÅÈͶwusrrqomonlhjnnkcXX[V]p}sx{w|vfj~vhw|vuxtvvuutsruvvwxxwvvvswwt{mh}’’Œ†ˆ“І‘Žu±½ž¨Òèëì退€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Z¢›“Ž•¡‡stxspmnsqmkmpolfgigc`chdcba``abccba^\\\^^^^]]]]YYXVUTSRWXVRUZ[XSUVUSUWYRS[]XVXVWWXZ\[XUV[\ZZ\^_[[[[^^^^[^_]^`_\___^^]]\^___``_\^^_`abbc]^```^^^aa`^]\[[\_[Yafinsnkkhb`a________\\]]]]^^`aabbccc``abdeff^ea]ega_`abccbccacefgfedccccdeffffffffffgffedcba````````]\[ZZ[\]YYYXXXXXQQRTUWXXZZZYYXXWTUVVWXYYXYZ[]_``ba`][\_b[Wellnnsnf`bfgghhggggfffdh`V[cd`\^jqljkelnnpqlhhnnmjhhjjmlkidbfmolifchlkllhdfikmijeoœ’ˆyohghklgmuxvssssrtxzwutvxyyz}~}€€‚ƒ„„…‰…ƒviis‚ˆŽŒƒ…ŽŽˆ‚Œ†`<))/=5)'*))06:&2U\XR904)5TSJ]qpZP|¯¤bH€©Œfhrg`ec_gnpspqlbdmnomiilllnmjkkjlonoi^nrr›¿¼·ÂÃÄÂÁÃÃÀÁÆÆÃÃÇÈÄ¿ÃÆÁ¿ÇÉÄÁÀÁÃÅÂÉÄÁÅÊÉÄÀ¿ÁÅÆÅÃÇËÆÁÆÄÁË»tsrrttsrrqnkknnlb[YWVcu{uxxwydj|sgw~xuwsvuuwurtvuvwxurpwxuxxu|nj…–˜•—”•¡¢“¼¼ ¬Öêëìꀀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Z¡—’š©”tt~{{z‚€{x{}||z|{yy|zywvvx{|}€~}{{{{zzzzxxvvtsrrlmmllnkgdfgfipvxnt~wpnjghhfbabec`VQUYXY[YXYZ\ZYY\[ZZ]ZVXXYZ[]_`a_^]\ab\``abbbaa[\]_aba_______^_e`[^ekmpmopnhb^]aaaa```__``aabbb``__^]]\ccba``__X_^]__]a`bddddegeeedca_]`_^^_acdbbbbbbbbgffeedddgggggggghgfeefghffedcbaabbaaa`````__^^]][ZYYXWVVVVVWWWWWVUSSTUTSCMbebjkkh_YZ[ZXXZZ[\]^__[b_X\dgheagpmjgchmoolhdejlnmiegjqmjjgdfkqoifhiilomhbbfiighcgzƒvilf_[[]_`hmqutuvywusvyyvsyxy{|||~€€‚ƒ„„ˆ„…‰s`fy‚‰‰…„…‡‰ˆ‡ˆva<*4GW^V@3+CP6%%(@\a[H21>:*+-+&*14.,D`\VS;/4)4TRI]qp[P|¯£bHªŒfgrhafdahoqtpqofcilmpomoqomjjkmmnnnmj\kwz Á»ºÄÂÄÆÄÅÄÁÁÅÆÄÃÅÉÃÁÄÆÅÅÆÅÄÅÈÈÄÂÄ¿ÂÈÊÆÄÇÃÅÉÇÂÈÊÁÄÈÉÁ¿ÍºŠwusrsrpnonmlmoqqe]XWXgwyzwvwzeizpcu€|xwvwwwxvst}ywxxvuuuxuxwu{|poŒš’¥œ’–—¢°«¬Á½ž¨Òæéê耀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€]’ ’‹“¡mtƒ{vzƒ…‚}z}~|{}}z{~}|{}†‰‡ŠŒŒŒŽ‘ŽŽŽŽŽŽŽŽŒ‘Ž‹‰’ˆ‹—©¸À¾¾ÃÀ¶³··±±°«§£¤¥¥“xltuomponmmlkjhhgdefb\a`_^^_ab]Z`d`ab[``aa`][Y\[[\]\ZX^^^^^^^^b\[`gjjfhnqjb__^``__^]]]bbbbcccc``______aa`_^]\\_ab```bbccc`]\\^_acdc`[YXY[]^]\[___________``aab````````cba``abcabcdeffghggggfffiiihhggfihhgfeeddddccbaaa_^^````KUjlhljhd\VWXVSSVVVVUUUTTTOO\aWLSZgpqkggimnkkhgjpnprkcckmomhfiifjomhghkmmkhc_ekijhcdmjXF?<::Z_]P916/(*('+-.06CT^ZZU;.3)5TRH^rp[P|®£bI€©Œfhqhaed`hoqrqpmgdglnqqpqpljkkkkmnopli^oy~¥Â¹½ÉÃÅÈÇÆÆÂÂÅÇÆÄÅÇÆÅÃÂÁÂÄÄÄÁÂÆÂ¿Å¿ÀÄÈÈÆÄÂÇÉÄÄÇÆ¿ÃÈÇ¿ÆÏ¶Šusqqqqomkjjjkmorj]XXZgvw|www|wgktds|xvwuuwwvvvswttwxwutswuvvtzyip™–›Ÿœ§ š©¼³°Ä¾¥Ðæéé䀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€\–¦—’Ž“¡‹kp{uw{‚{y{|{x|~€€{z}‚zyvvy…‰‰Š‹Œ‹ŒŽŠŠ‹‹‹ŒŒŒŠŠ‹ŒŒŽŽ’‘“‘’”’“•›©ÁÖÛØØÕÎÑÙÛÔÔÔÖØ×ÓÐÚÀ™Œ—š‘››–””–šš–”•–‘ŠŒŠˆ††‡‰Š~~Ÿ–Œ…€|xuxyywsolklkjihgfeabimjljcknmicaacddcba``____^^]]]]]^^_`aa]]^^^__`ba_]_hkfbdeda]ZXTVY\`cde]]]^]^]]]]]]]]]]ZZ[\]^__________a`_^^_`a^^____``[[\^_`abccbbaaa`bbbddeffaabccdeeffecbdgj_\jsqqnqleadhgeedddcbbaaa^VVaf]UV^gpsngflonllkhgmoolhfgihlmighihkjkjfgkjihheaiolnifgf[G81/,**(&#.5@MXaehwyyy|€€}z{{{{}}}€‚‚ƒƒ„„‡†„„yeep~†…„‡Œ„‹ˆ†‡‡{a<5_dA"*68WY7!%>Z^\WE50*''&*+).=P[\XX^V:-2(5TQG_rq[P|®¢aJ¨‹hipf_db^fmonsqhdfjnnmlopkilillmoolnmecvu{ªÃº¸ÅÇÅÁÁÆÃÀÁÄÆÅÄÅÆÊÆÄÉÄ¿ÃÃÅÂÂÇÆÀ¿ÄÄÆÈÆÃÄÇÇÄÅÉÉÈÇÅÁÃÁÁËϵ‘rpopqrqonmlmlknrl]WY[gtxzw{xxshm}uhvzttxtsuvtvxutssvywtqrwvvutyvdrŽœ›œ ¨ŸžµÅ³¬Ã¿Ÿ§Óêíê €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€X•¦—•‘“ Žps„„~{~‚ƒ„„€}‚€~|}~~{~|ywz€ˆ………‡ŠŒ‰ŠŠŠ‹‹ŒŒ‹‹ŒŽŽ‹Œ“–“Œ”–’–¯ÍÕÑÒÑÎÐÕÔÏÌÊËÏÓÔÔ×¼•‰™”•œ¡¤ š—šž­¬©§ª¬§Ÿžžž¡¦ª­««ÇÝÑÁ¿½¿ÀÂþº·º½¿½·²²´§¦¦¥¥¤¤¤¤¨¨“uihaidk~‰†„ˆ‚‚€~}}|vutrqonnjjihgfedaabbbbcc]]`fg`\_fgijkiebd`ZVW\dhba_]\\^^^^^^^^^^^^______________dcbaabcdba`_^]\\[\]^`abb___^^]]]]]^_`aab[\]_`bcda```abcc[Vdkkmmrib_beca`ddefghhijjd_chjldaempmhcmqpnomifekokhiigjkmlhdgmnhhkjiihlkidcjnjnhgh_M>72.+)(('%*(')2?LS`hpswz{wy}~zz{~€‚ƒƒˆ‡ˆ‡t\_m€‰†ƒ„„‡‡‰‡ƒ}l9(FcY7$9<-N];!'AV^`_P714*',/),AT`aZWY^T9,1)6TPF_sq[P{­¢_Kƒ¦‰ikof_cb^fmokqslefjklkloqnmrjnnnqoklrfcwsz«Ä·µÅÆÃÃÆÆÅÃÃÅÅÿÀÆÉÆÂÁÀÁÃÃÃÃÄÃÆÂÂÈÊÇÅÇÇÃÃÃÄÉǼÁÃÄÀÄͺ“wurrqqnlqooomknsj\WX[gvywy{vxtfkysiwzstyxvuutttuywtsuwvsryxwvvzvfv”žœžž¡žœ¥ÄÔ½±ÆÁ¡©Ôéëë瀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€^™¦––’’œ…px‡„|{„ƒ€‚ƒ~~~‚‚}yz|{~{wux~…ŠŒŠ‰‰Œ‹‰‰‰‰Š‹‹‹ŒŠŠ‹‹ŒŽ‘ˆ”ŒŠ”ªÅ×ÒÑÑÍÏÑÎÒÔÕÔÑÏÏÐØ¿™Ÿ—š˜Ÿ¤¡™–𡧦£¢¦©¤œ¤¢ žž £¥¨¦ÃÝμ¾ÁÁÄÇÉÈÅ¿ÇÍÒÑÌÊÍÑÁÂÃÅÇÉÊËÍÔϪ|owwkcy«ÊÊÆÍÉÉÈÇÅÄÃÿ¿½»¸¶µ´³±®©¥ ›™™˜–”“’‘”‰rba_^dliggilmnmliea^[Zffffdb`_^^^^^^^^^^]\[ZZY________`_^]]^_`^^^_``aa`____^^^\\\[[ZZZa``_^]\\^^_`abcdea`fmng^V]nmhoqrslfggc^\]]^_`bcc`b\Y]`_``ZbmliieioolkllmjjnpkdfonoolgfimlmhehjlonmgacjlkleefV@67/+&$%')))&#"%)-/4DU`hpspxyy€€z~~€‚ƒƒ‡ƒ…†ƒ…†~rd^k}‡Š‹ƒƒ‰Œ~~„s=-LcQ/#?7&G^E%#@\\W^\E772+./*=X_`ZVZZYQ9+1(6TPF_sq[P{­¢^L„¦ˆjlng`ec`gnpqptodbjmoqpoolijoqlilllqwi_ru{¨Å¹µÅÅÁÃÆÄÂÂÂÃÃÂÂÂÁÂÁÅɽÅÈÀÂÇÄÄÇÄÁÂÃÅÆÆÄ½ÆÈÃÀÀÁÄÁÉ;¸Ì¿Žutrrstrpmllmlimrg\WWYhwyw{ys|xeh|tgtxsuzwussurqwxwuuwzxts{yyww{whx•œ•š›§Ÿ¨Íݾ¯ÉãªÐãçì쀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€bž¯ š”—¢‡ou†ƒzxˆ‚€†‰ƒ~~€€€~y~z{{y}†‰‰‡‰Ž‘Š‹’”’ŽŠ‹ŽŠ…‰‘Љ‰‘“Ž‘’‘¢ÁÌÏÐÏÎÎÌÈÑÔÔÒÒÔÐÉÔ½–Ž˜•˜ –ž¤¡š—œ¡¥¥£¡£¦¤Ÿ¤¦¡ŸŸ §­©¿ÓÊÀ¼±¹Âü¼Ã¹¿¾ÁÆÈÇĽ¹¼¿¾ÄÌËÈÐȨ†vvzuj~³Ø×ÍÌÖØØÖÙÝÚÓÓÖÖÒÒÖÕÒ×ÙÒÏÕÔÏÓËÈÍÏÌÐØÙÛ©lZbbdggffimlloonkhfdccYe¦³£‘y‰ˆ‰Š‚‡˜‘wmx|wzz|Š‹„‚‚qhtljj_\cad```__^^]^^^^^^^^\\\\\\\\\]]]]\]^Z`c_bb\^fchkgqsZ]flqmlvty€|qlg_\Z_^X\gh_cib`b`aaZXgnkjghikifhjiinmlkiffhkooifhjhjnkeehhjlhgebgmkpmh]J;52**)((())''(('%$##.9FUcmpuz}}~€„„‚‚„‡…ƒƒ†ˆ‡…‚vd_rˆŒ„‰ˆŽ‘‚{wN8LeH%-B0!IcF'&=Z^UV\WK>46516IWT[^YSY\P?03-2RMGatqZNz­¢cI§‹hipi]bd_aisrqsocalsplknpmigknlkmlkmqe]u|}¥Â¸¸ÃÆÆÁÃÈÇÀÁÇÅÁÃÉÄ»ÁÇÀÀÅÄȾÂÈÅÂÅÈÅÂÁÃÇÇÃÁÆÅÀÁÅÇÆÂ¿ÂĿƽ’uyururnqklllmmnnd][Z[ivutzywytclviuyvvuvvvussvyyyyzxutuvxwxuv{thrŽ™—Ÿ§©­¦§Çܹ¥ÄĤ¦Ìåêêꀀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€^žµ©£š˜¡st…‡~„ˆ…ƒ‚‚ƒ~ƒ‚€}}€€}|||z‡Š†ŠŠ†„‡ˆ‡‰ŒŽŽŒŠŠ’އ†Œ‘ŽŠ‡‰“ŒŠ‹‘¦ÇÓÐÏÓÓÐÐÔÍÏÑÔÖ×ÔÏÔ½–˜—›¤›œŸ¡š ª©©§¤¥§¥ £¦£Ÿ ¡£«ª¦½ÕÊ»¹¸¹Á¼¼ÂÁ¹»¿ÂÃÁÂÅÉÀ¼¿ÂÁÇÏÎÆÌʽ­Ÿ’ˆzl´ÕÐÊÒÒÐÐÓÕÔÑÐÍÌÌÍÍÌÌÍÎÐËÊÒÓÐÔÌÑÓÏÎÕØÕ«vW]c`afgjijlnmopnligfeeg\vÅöÞ½¹ÁÏØÖÊÐàÔ±§²··¿ÄÊÝÞÕÑÍ»¯»¾·ªˆwŠ–—‹ˆ†„„€}yuqnmkkjiggeeeb``bb`]]_`]]aaadiilokd\eqsqiemntxtnnlea[]_``chlcljie_cd\_iloqjffloonhdelmnnjfgjnolgcfijqkghiffkhhjidgllnleWF:40*)(((()*(((('&$#$!)9EUgw}~€~{…„ƒ†…‡†„…‰‰†‰€rgl}†…„ˆŠŒ…|bET`<-AF)'K_G($C]\VWW[\M:8997=BBOV][Z_V?.1,3TOI^qoYO|°¥`K„«Œgfjg^df`cjqqpspc_hprnlmpolilnlknmkmud]y€}¤Æ¸·ÅÈÆÅÈÈǾ¿ÉÈÀ¿ÄȾ½ÄÅÄÅÈÇ¿ÁÁÀÁÃËÄÁÀÂÉÌÈÂÊÆÀÄÅÅÊÂÆÈþËÁtwtqsqmpoonmlkkkd\XWYiy{tzzz|wckƒtduzuvxxvuvxwutyvtuvvvvswx{xwzqiw”œ–ž¨®·®¬ËÞ»§Æ¾¢¦Êãêë退€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€c£¸«¦žž©˜uq‡…„…„„‚ƒƒƒ‚‚~zz~}||zy~ˆŠ‹‹‡ˆ‰ŒŽŠ‡Š‰ŠŒ‘‹‹ŽŽ‹Œ‘’–’”‘ ÀÎÕÔÊËÖÙÒÊÊÍÓ×ÕÑÏÕ¾–‹–—œ¤¤ž ŸšŸ©«¬©¦¦§¥ ¢¥¡ž ¡¤«®ªÂØÉ²²¹¸¿À»»À¿¸µ¼Â¿¾ÅËÀ¼¿ÂÁÇÏÎÆÈËÌÐÏȾ´¤§¿ÎËÌ×ÑËËÑÓÎÌÍÒÎÎÒÓÎÎÓÏÏÊÉÎÎÌÍÔÍÖÔËÜÖ¤bV`b]bffhlkikmllqomkihggo`[Ýà·²¾ËÙÞÖÛê߯¼ÅÊÏÚáéçêçêïãÞììéâ·žÀÛÕÐÐÏÏÎÍÍÍÉÈÆÃÀ½»º»¹·²¯«¨§§¡œ¡¢—“ŽŽˆ~vjjgfmrnikojhknuqxysmold`^_`acfkomlgjjee_XbmlmojhjlmnmhgljknnkggjqqojgegiljjheejnkklidejjlkaOA:3-*)(((()*))))(&$#!1ARar‚„}†ƒ~{~„……†€€…‡„ƒƒzg^pƒ…ˆ…ˆŠ„ƒ‚jOXX33PR#+SaE!B]][\ZYVC:3582.49:EW\Y`X=-0+3UPK`sqZN{®£_L„§‡fjqjbeb\dnsrqure`hoqssqnoppmomlonlntc\x|¤Åº¸ÆÅ¿ÀÇÄþÀÿÁÄÄÁÀÃÆÁÀÆÄÁÂÄÄÅÃ»ÃÆÁÀÇÅÂÈÈÂÂÆÈÇÅ¿ÄÇÉľÊÀtusqrpnooonmmlkkc\\[]jvvw{yx|xfm~shy{suzruursxyuttuuuvz~uxwxvv{tlz–œ– ¬²´´°ÃÖ¾¬Á¾¥ªÍäêë瀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€h¨¹©¦ £´¢{r€†„€„‰††Š‡€}€‚‚}}€}~|zƒŒŽ‹” ¤šŒ‘‹‹Ž–žž•‹Š’˜’ŒŒ‘Ž”Œ“™¸ËÍÌÉÊÎÏÎÕÎÉÍÏÎÐÕ×Á—‰‘’–œ ™—œ›£¦§¦£¢¤£Ÿž——¡¡¥©¬ÄØÈ³µÀ·¼½ºº½¼·´¸¼¾½¿Ãǽ¹»¾¾ÄËËÒÒÏÌÊËÊÊÈÈÈÉËÍÍÍÒÏÎÒÓÑÎÍÉÇÇÊÊÈÈËÒÐËÊÍÎÌÌÐÒÊÎÞÍštUZdc^`aedfeflonnqpnmkjjjmsdwÈè¿°»ºÄרÜéäÀ¸¿ÅËÕ×àìîéëíߨæãâ亘¿àÖØØØÙÙÙÙÚÝÝÜÜÜÛÛÛÜÝÜÝÜÝÜÝÚÖÒÓÖ×ÔÐÑÍÑÑÂÅÈ´ƒw~}zq]dffdy𢛗’Œ†††rcbfgmvysrzwoogfhptpkfcjlkmnkhjkkkkigfhjkkjgfhjkllheilhjiifbeiikl_J@<4,)(('()*+***)(&$#'5Nhy{…ƒ‚‚‚€€ƒ„‚‚„…‡ƒiUhƒˆ‚‡…‰Œˆˆ†r_ZM6BXS24W`?$%CQXUZ^RC6-*1:3)*/.6FRX_S8.2,3UPKbuqZNz¬¡`L‚¢„hntebie`hnopptpc`gnjopmijlmmonmonlotiay€‚ªÇ·¸ÇÆ¿½ÂÀ¾½¾¿»»ÀÄÄÅÁÂÆÅÀÁÇÃÁÂÀÁÄÆÈÁ¾ÄÈÆÅÇÈÆÄÈÈÃÁÆÆÃÅſŻtussrqppkllmnnoog_[ZZivwy{wv{yfn~wkvwtwysrsvvssvwvvwxyyzwxvwtv|uny’™—¦±³³·²ÁÕÄ´ÆÆ«¯Òçéèæ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€d©¾¯­¥¥·ªƒx‚ƒ€~„†ƒ…‰ˆ€~‚……ƒ€€ƒƒ€ƒ‚‚~ˆ”•—¢°²§–‘”“’— «¬§Ÿ¢¡«·¹¬š’’“£¤Ÿ›“ˆ–¸ÏÑÒÑÐÐÏÍÊÈÍÕØÑÌÊØÃ—†ŒŒŽ‘Ž•›žŸ œŸ Ÿ ž¤ ™›ª±°±®´ÈÓų±¸µ¹º¸¸º¹µ²¶º»»¼Àû·º½¼ÂÊÉÈÉÌÌÉÇÉÍÅÌÏÊÇÊÍÌÒÓÒÐÒÔÑËÌÎÏÍÎÑÒÏËÇÇÉËÏÑÏÏÍÊÓË”b]``^ce]^cifdfmmkkqpommlllfuna•Òм¸¸ÂÔÖÛçÞ½ÄÊÕÛÙàëíéêíߨæêä库·àÛÙØ×ÖÔÓÒÑÝÜÚÙ×ÕÔÓÓÓÕÖØÙÚÛØØØÙÚÚÛÛØÕÚÞÓÙãÉ“|‰‹‚™ž„nnpkb…ÀÐÄÉÊÇÇÄÅÌÆhhi`oŽœ›¡¢‹€• œzjonijgknnlmkfenlkjhfgiiiigfehknkkiegklmllhghkklm]HC@5,((''()++***)'%#"" '6Pf‚…†ƒ…„…†…‚…‰…‰‰rTXs‚†‡†‹‹‰Œ‡uf]OCOQ90CbU2!(C\a\[T?40,+4:3)(*-05CW_O804.3TOI^qoYO|°¥_Lƒ§Šjjjjeha[gqspptnb`iooponnpolmonmonlosg`w©Æº»ÇÅÄÁÄÆÂ½ÂÈÄ»½ÅÃÃÁÁÃÃÂÃÆ½ºÂÊÅÁÄÅÄÆÅÁÄÈÈÃÃÃÃÅÅÆÈÇÄÅÆ¿Å»vtutsrsqjklmnpqqd\ZY[jz{vyww|yel„wgtzxwtvssvwuuwwvtstvxxswx{xwzrjv‘——§³´¶°¬Ãؾ¯Ì˪¬Ôêèæé€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€d¬Â´³©©»­†z€{y€€‚ƒ††††…}~‚€||Š–—›£¨¨¦£œ•˜šž¤©¬­®°®°±²¾À³¢Ÿ™•”“™¤³»º¯Œ—µÈÎÐÌËÍÊÄÐÍÊÍÐÒÔÖÓÀ—…‹‹‹ŒŒŽ‘”˜œœ›–›š™œž¦£œ¡²»»»ÁÆÑØÎ½´¶´¶····¶´°¶»»¶µ»Á»¸º½¼ÃÊÊÊÉÉÍÌÉÇÉÌËÍÎÉÅËÔÏÓÑÎÏÓÏÇÊÏÐÍÍÓÓÏÉÄÄÇÇËÎÊÊÊÔÈa[X[^]ed_egigdhnolmqponmmmnipxin©Í¿¶ÇÔÙÔßéÔ¿¼ÃÌÛâÝåèêåçéÜÔâèáẔ¶ßá×××ÖÖÖÕÕÛÚÙØÖÔÓÒÙÙØ×ÖÕÔÔÔÖØÙÙÚÜÞÚØÕÖÌÔàÅ’y„ˆ‚”›™”Šyi‰¾ËÃÊÍÎÎÌÑÞÙœojg^už¸·ÂÀ‘³Ê¸‚fssjkgkpojhhhjponlgeglmmlieeghjiihcbipmmjfdfhkmlZIHB3,('''(*+,)))(&$! !(:ewƒ†…~†‚‚†…ƒ‰…ƒˆ_M_z…††‹‰‡Œˆ~e`]HBG?>Zb>'$&?]^\V>,.-/.371/12-/.7Q`S>25.4TNI`spZO{®¤]I‚©Žljjfcie_hooqqtpcajqooonnnmkmomlonlnq`Xv}{¢Å¼»À¾¿¿ÁÄÿÃËÉÂÁÄÂÀÁÆÃ¾¿ÅÂÁ¿ÃÈÆÂÅÇÀ¿ÆÈÀ¾ÄÂÅËÉÄÊÌÃÅÈÊÅ¿ËÂusturrsqmmnnnnnoc]\\]kxwvzwvzxfn…vgy}vstrvvrrwywoswxwwvuuxwyww{sdw”™•¥²µ³®ªÁÕ»¬ÇÊ£¤Ïéçç뀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€h±Åµµ­®Ä±‰}„ƒ~|‚ˆ†„ƒ…†…ƒ„„~‚|}~z|‹™š‘œ¤£  £¤¥¦¨ª«­°²¬®¶´«®µ°¦¯®§§©¬±µ¿À¹°¤§ºÃ¹¹Ãù¸ÂÂÂÀ¿ÂÆÆÄɺ”†Ž—•–˜˜—™œ˜Ÿœšœžž—˜£¨©¬­«´ÅÉ»²µ³´µ¶¶µ´³²¶¹¸µ´·º¹µ¸»ºÀÈÇÇÂÂÆÇÃÃÅ¿ÁÉÐÎÇÉÑÑÐÏÎÐÏÌÇÊËÌÌÍÏÐÐÍÆÆÈÅÉÌÆÆÓ·cZW]bYZbbafgiihilkjlpoonmnnooclsg~´Ì½ÑÜÛ×èóÙ¿»¾ÆÙáÝçéìèëïãÝëåãã¹—µ××ÑÑÒÔÕÖרÕÖ×רÙÚÚÕÕÕÖÖ××ר×רÚÛÛÚÚÝÕÕÏÔàÅ”€‰‹‰†ƒ™·Ç옡ÂÐÂÆÇÈÊÆË×Ëšrje`xž³¯¾Ã¡“±Âº„eqrgjkjnomljikooomifimkmlfdehhijigffghlkheehkmliWJLB0+''''(*+-((('%" +Rwƒ‚‚€ƒ~‚€„…‡ŒvYZo}…„†‡„ˆŠŽo^R:.AY][G'(/+=Y\VG0&.+-+3;:9::@ED@K^X?04.4UPJburZNz¬¡^G§‹jlricgb]forrosre^fonoonkijmlnlknmkmsb[x€}¦È»¼ÇÅÃÂÃÀ¿¾ÀÂÃÂÃÁÇÁÁÇÊÃÀÃÄÃÁÂÇÈÄ¿ÀÂÇÆÁÄÈÅËËÇÃÈËżÄÇÊÅÀÌÃ’sprsoproppoonmmmi`\YZixyx{xuywgr„wjxyrtzsuwxusstyxwuwxxuwyvwtv|ufy˜›—¥±±°²¯Â×óÉË£¡Ëçêê뀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€j´È¸¹°±Èº‘„Œˆ…Ї†ŒŽ‰„„…‡ˆ‡‡ˆ„€‚~’ ¡ £©¯®«®µµµµ¶··µ´¶³º¼±±·´±¿¼±´¾ÁÀÈËÅÁÄÁ¿ÇÆ¿¾ÃÄÀÂÊÈÊÇÃÄÈÆÀÁ´’‡’–—•——››—œ¦¢£ŸœŸžŸ¡›—™™šŸ¦¤¿Ë¾´¹³²´¶¶´²³¸µ²´·¸¶²µ±³¶¶¼ÃÃÄÃÇÎÌÅÄÈÃÉÌÉÇÉÎÒÕÏÎÒÓÎÊËÌÈÉÎÐÍÎÒËÄÆÊÉÏÔÎÚ¿…YXb]WZW]]_ecaaghgikloponnmnoohlnrfl™»»ÃÇËÏãðÙÀ»º¿ÒÛØäçêæèìàÙçäæâ´–¸ØØÖÖÕÕÔÔÔÓÒÒÓÕÖØÙÚØØ××××ÖÖ×ÓÏÑÖØÔÏÕÝÔÕÐÒØ»•€ƒ€€…‚–³ÑÓÉÆÅËÏÄÄÃÆÊÇÊÔΙrnh]tœ¶¬·»˜Ž±Æ¶‡gruiggoooqqlghnmlljhikrrmeafklknlhggjqmlhgikjikfTJNA,)''''(*,-(('&$!#&Bp‰…‡„€‚„ƒ‚ƒ„Œ‚eV\v…€€‡‚ƒ‡vS5(%0EI:2)(%":YbS@7,%&&&''())*'((&!2\ƒ„„ƒ‚ƒƒ€zƒƒ€ƒ„u`byw{„‡ˆˆp_l`2#($(*$*,'9Z\EIhnhljjllmmmmknoYCV^A,4- 6SQK_trZP~²¦eL‚¨jjngaec^fnruqrrf_hopnoomnnmjkmnnnmlsg]t€€¦Æ¶µÄü»Ãþ¿ÂÃÁ¿ÁÅÈÀ¼ÃÈÅÂÅÉÂÃÊÉ¿¾ÆÉÁÁÇÈÆÅÁÃÌÈÀÅÈÅÆÄÃÂÁÂÌ¿utsssrqprnmopnkkh_[[^kvvx|zvxyhmƒweqxuuwzwuuvvwwwuuvxwwwvyyzwx|uiy•™˜¦®¬±±­ÀÒº«Äɨ¨Ìçìêæ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€n¸Å²º»¹Ë¾x€ƒ‚}zz|}||}~}yyyx}}}}Ž–•››—–™œ¡¤¢¤©«ª«®³±¯®«ª®³³³´±³º¼¿ÁÅÇÆÄÄÄÃÆÄÅÅÃÄÈÈÉÉÊÊÏÒËËÍ»“‡—–’™¥˜ž¡šš¤£žŸ¦§£Ÿ ¦Ÿ—˜Ÿ¡¡¤¥«ÀÙѺ·¿»º·±­´¸µ¨°º·¯¯¬ª«²´´··¶»º¸»ÂÁ»¼ÃÁÇÊÉÉÍÎÌÍÑÕÔÑÎÍÍÓÔÑÎÍÏÍÇÅÇÊÇÌÞÀuRac[aic^_\YXX[^`dghikomijsqlmkd`ik\TUOO\S„®À·»ÓÒ¿·¾ÄÉÏÎÎãìæëìÙÔáççÜ®”·ÙÙÔØ×ÒÒÕÕÓÖÕÕÖÔÑÒÖÔÒÓÓÑÓÔÐÒÓÕØØ×ÕÕÖÚØÏÍÓßÁ”}„Љ‹ˆ¯ÍÊÊÊÆÃÇÎÊÅÂËÊÁÎÍšond`uŸ¶«ÃÌ—‘±Ã¹ˆgqwokggoomnhcghknnjhillihhegjjnmkggjkknoheggjng[I<3*%*%%&'())*))('#0_~ˆˆ…ˆ…€€~‚€‚}d\r}xtyƒ‹r\bQ0(&(#+&)1.:W]KPnodgeda^ZWTSRLMA8R\=.4."7RPJ`vsXL{® _J€¦Škkogaec^fnrvsstg`jqonopnopoppppomkjsg]vƒ†ªÇ¹¶ÀÁ¾¿Á¾ÀÄÆÃÃÅÄÀÉÁ½ÂÅÀ½ÀÃÂÂÃÅÅÄÄÂÄÂÁÃÃÁÁÂÊÌÇÂÂÃÄÂÂÂÃÁÍ“wurrttropkjnommqj`[Y[hvywwvzyfn~uhu{xvttuwxtrtyuvsqt{|xwwtwwy{phz”˜˜¦­¬¬°°ÁÒ¹§½Ë¨§Íèíê瀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€m¸É·¿½»ÌÄ‘z‚~{}~~}|zz|y}€}zxyzzvvw~—”—˜•”˜—•–ŸžŸ¤¦¥¦©®¬«««ª®³°²´¬®¹¼¼Ã¿¾ÀÂÃÄÆÃÃÈÊÇÈÉÈÉÈÉÉÎÍÇÉÎÁšœ•˜¥ ŸŸ—™¥£¢¢¢¤¤ œ¡Ÿš™¡¤¨©°ÄÚз´º½¹µ¯°¹¹¯¥«¸·°¬©§§©°·¸´³¶¹º½¾¹µ¹ÁÂÄÈÈÆÄÅÇÏÍÌÍÐÐÍÉÒÓÑÌËÍËžÅÐÊÉ׳iMcbZdlf\[[ZYYZ\]ceedhlmjiolb[RNR^ZNLRNOVMV‡ÀÂÁÝܽ¸¸»ÄÇÂÉãëçëì×ÓáèåÚ°•²ÑÒÍÑÓÐÌÐÖØÒ×ÚÕÔÖÖÒÑÒÕÓÐÓÙØÒÔ×ØÙØ×Ö×ÚÛÖÒÔâÉ’}„‰‡‰…‹©ÈÈÉÌÈÃÄÅÇÊÉÍÆ¾ÑÏ›omd`v¡»°ÆÌ—‘±Á¹‡fouljehnlknjcekjijljihllnlgfjlpkgehlkholfffflogXC3.(%($%%'())**(''$ 4h…‰‡Š‚‚‚~~‚„ƒkVhzypqz€yr[?,2D>/(@IFLED[`G>@A>:AAAWY8/4.$9QOJ`vsXL{® ]Jƒ§‰hkqhbfd_gosrqrqd\hqrqqqooonmnnooonnrh^v†‹«Àµ¶ÂÂÄÂÄÄÅÂÂÆÆÂÀÂÈÂÁÄÿ¿ÄÄÃÀÀÄÉÇÁÆÈÃÁÈÉÄÄÈÃÄÅÃÂÄÄÇÅÇÆÁËÂ’wurrttrolmmlkmopf\WX\ix}zxtx~wdrˆudx€zururqtwwuuttuvxwwvxwtwxy{qh{”—™¦¬­±®®È×¶¥ÅЪ¨Ïëîêæ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€f¯Å·»º»Ì¿’{~}zy€‚€{y{y~{{}~€zvtyœ™“™–“–š˜––—› ¢££¤§¤¤©­­«ª¥­²©ª·º¹º¶¶¼ÁÂÂÄÅÁÂÅÇÊÊÆÇÄÄÆÎÐÊÍÒÜ›Ÿ››¦©¦¡ž¡£¥¦¥¢ŸœšžŸ ¢¢£«¯À×Ò½¹»¹···µ¶¶°®©®³±¬§¨¯©«´µ²³¶º¸³¯²¹º¶¶¿ÄÁ¼¿ÅÊÄÄÅÈËÍÏÏÌÌÉÇÆÇÄÁËÈÊÂÈÕ¦\Lba[`caWVWXYZ[^`defgilkimh`ZQIN\SEHNMWZMSJk´ÏÎÝÛÀ½¼¼ÄÄÂÐåìçìêÕÒãçãÛ±“±ÑÏÉÈÊÌÊÈÈÉÉËËÌÍÎËÇÊËËÊËÐÑÎÍÎÏÑÓÕÔÓÔÑÓØÕÏÜÊ‘‡Šˆ‰‹«ËÊÉËËÅÅÈÈÉÈÌžÓÔnj`^w¤¶®ÁÄ•–·È»‡dmrigempkimjegknonidejlnlihfgknlighjkkkihidemm\O:..-%!#$%&')***'&'$8l‡‚„†ƒ€€„„‡uW_qyonywr[?>ACFJLNMMPR[ZV`Y;.4.&:ROJ_trZP~²¦aM…«Šgiqicge`hptsrtsd]ispnoommmlkkklmmnnsi^u†‹¨¹°¸ÇÅÁ¼ÀÆÅ¾¾Äü½ÆÊÆÆÉÅÁÂÅÈ¿ÃÈÉÆÂÉÆÂÃÈÆÂÁÃÆÅÃÁÂÅÇÅÃÇÇÀÌÅ”utsssrqpnoppmjjle[X[_jwyz|wuzuco†sbrxvwuutrtvwwwyyyzwvx}wzz{xy}vh}•˜›¨¬®¶³²È׸«ËÒª§Ðìïê瀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Y–«¢¨«¯¼¦ˆ|~}{{€€~|{|~z}}{{||}}~y{ šœ˜““’‘‘’•—˜›žŸž Ÿ¥ª¨¤¢ ¦«£¦³´±µ¶¹½ÀÁÁÁ¾¾ÁÁ¾ÀÆÈÂÄÈÇÇÆÆÑÓ½—‹—œžŸ ª«£ ¡¤¨¨¤£¥©¨£ž Ÿ¢£¥¨«³ÇÛÓÀÀƶ¹½º³³¶µª¬±®«®­¬¯«­µ¸²¯²·¶²°´¼½¹·¿Â¿ÁÈÈÁÇÊÎÎÌËÎÒËÇÅÆÆÄÂÁÎÈĺËÙ¡VL\\^cdf]UVWWXZ_cecdgjjkkgZRSUVWVRHFJW[T\SJXœÒØÜÜÁ¹º¼ÁÆÊ×çíçëêÔÒæêæà³’¸ÜÓÏÑÓÔÒÎÍÒÒÌËÏÐËÇÇÌÌÉÆÊÍÊÆÆÉÌÌÊÈÍÓÎÊËÏÎÊÑ·ƒ–“‘ªÎÐËÌÌÈÆÆÅÅÅÍÊÃÕÖŸoj`^v£·µÂÀ˜žÁÔ¿‡cmqfefkplilhdhrmijmjhkookghhhkikkiddinjghgahrjOJ<00/&##$&')**-)')(" !!# Cq†‡|~ƒ€„…|`Xerliv}wlXPc\DXkLOgnl_IT`ZUY\[SORUVTOJFRZ_\X\R=-2-'AHOMKHQbkmpxonihhchqbU•ÖÜÝØÃ¼ÅÍÐÓÔÚèîèíëÖÕééÝ×­‹µÞÒÍÖ×ÑÏÒÒÑÑÑÒÑÐËÃÅÏÒÒÎÌÏÐÌÑÒÕ×ÖØÙ×ÒÖØÕÐÐÚ¾†gu{u}z{ÇÊÄÅÅÁÁÌËĽÅÈÊÚÔ™mhb]xŸ¼½Ã½ ·É¾ˆcmskkknpmlmkghjoomifihgkpmdflnjiihghllmkefhijeidL=B:% &+-(%*'&&''%" !>wŽ„‚€€€}{~‚x\UmyvmWVf`[lM&LqaYi\, <[_[WYVOLPMJKNNJERZ]WY`U=,50$9VSK`tr[P{­¡`J£†glsg`ca_iruwqttg^gsrpnmnpomopommpoktmav†®Â¹ÀÊÆÃÀÁÄÁÀÄÈÁ»ÁÈÅÁÂÉÉÃÁÅÆÃÂÆÈÄÂÅÆÄÂÃÇÉÆÃÂÆÇÈÆÃÁÂÁÂÅüƿ“urtpornqqmqrljordZVW\l{|wwy{{ufq…ufw|urrvuuutvvrtyxtrvwuvxvwuw{tn€™œš¤­²³¶¸È×·Ÿ¾Ë©¦Ëéìéꀀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€U…’†‡‰†ƒ„}~€}}|}~€€~||v|~}}}}~~y}–«©¤¦¢Ÿ ž™˜˜œ›–”“’”™•”™œš™ž“’¡¨¨ª®¯«¬±³¯²µ¹»¼»»»¼¼ÂÄÇÈ¿ʻ˜‰‘’“™œ ¡œœ¡¤§«ª§©¬ª£¢Ÿ˜š¤¨¥¦³½ÓèÞÆÄÊÂÀÂÁ½½¾º°´¹´°¯©¦®±³²¯®²µ²®­°µµ°ª´·µ±³º¾½½¾¼½ÂÄÅÈÈÇÇÊËÀ°¦˜–‘’’\FW][[gmjh]VW\]Y\bj^H;@FEDPY`juwsprlmlllhji[W˜ÕÛÝÚÀ½ÄÇÊÓ×ÙèíçëëÖÕèåߨ¦„µàÏÈÑÔÑÓÖÕÒÏÒÐÍÔÔÊÇÎÔÕÏËÎÒÒÐÐÐÑÓÒÓÕÖÓÓÓÒÑÙ½ˆkz€}‡…†¤ÌÎÆÅÈÆÃÈÍÌÉÊÃÂÚÑ—nic]w¿Äɾœ ´À²„gorhhfnpmlmkghjllljgijigkkgfijjiihfgjklnjgeet‚€\:=M7#+0,(**+++*'$!!#T€‰‚~€~|}~~x]Rj€gBKibXpO%NsSShY)>[``^`]UONUOHLMHISW\\\^O5+51%;VSJ_sq[P|®£^J¤…ektidga]hpqtrtpd`ktmopononmmpqnlnomqiax…‰«Ã¸ºÅÃÂÄÉÊÂÂÈÆ¼»ÃÅ¿ÀÀÄÉÅÂÅÈÉÄÁÇÅÁÃÁÄÃÁÃÈÈÄÅÆÄÁÃÄÅÅÄÁÄÆÃÊÀ“qpvttsmlpkjopmmpk^YZ^jwzwxz|zseqƒufv|vvxvuussvxvxttxzwuvyxuwwy|sl|•šš¥¬°¸¹µÀÓ»¤ÁÏ©¡Ääêéꀀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Y‹–‰Ž–•“’І„€‚„‚€€€€}{{|}zx}{wy{—®­¤§£Ÿ ¡œšš›˜”’“–˜™”‘•™ššš”——• ¤¢ £¦¨¬±±®µ¶¸¹¸·µ´¿½ÂÃÁ¿»ÀÁ¶˜Œ““’–ššš›œŸ¡ ¤§©¨§¨¤ ¥¥žœ¥«««°½ÓæÝÍÌÎÇÁ¿ÂÁ¿¾¿·ºº´±±«¨¯¯±³±¯²¸µ¯©«°³³³³²µµ²µ¹¸À½¹º¿ÃÄÄǼ¾Æ°b`YYY\ZMGOXUXaimhabXW`^XZaaOHNQSUU\hpqrrpqsrttqpon`TZœÓÛà߯ÀÁ¾ÃÒ×׿êäèéÔÒåâÞØ¦ƒ´ÞÎÉÏÑÒÒÑÐÐÏÓÑÍÐÓËÉÐÕÖÒÏÏÐÑÓÓÐÑÓÐÎÖØÒÐÓÕÔÛÀˆnz~{…ƒ¨ÍÎÅÀÇÊÆÉÊÇÉÑÉÃÖИpld]wž¸ÀŹ— µ¿µ„epvnnmjooljfeiljimjcfjllomdbirlkjjghkknnjgaew†mH14:5&'01*(*)'&&&#0h‹}€€}|~~{{bOh…uL(Ko^Ig`A\hBRt`.=W[\\]\VPCNMGHIIMU\`_aaSA-60$9USK]qp[P}¯¤aK‚¥‡hmugaeb]hqtsvyp`_jpnprqonnonnoqnklqngay…ЬÀ·¶ÇÇ¿ÃÎ̾¾ÄÈÀ¾ÄÉÉļ¿ÆÅÂÇÈÇÀÂÊÇÁÅÆÆÄÂÃÇÆÃÈÆÄÅÇÇÅÆÄÄÆÆÂÍÕppuutslloqpllnrvk^Z]ajuxy{vv|t`n‹wdtzwvwzwvwuuvxuwxxuvy~zyuwx{}shx‘˜›§®°º¸²¿Ô¾§ÃϨžÂâéç耀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€T‰”„ˆŽ‹ˆ‡ƒ}€}|„|yz|yv{€}z}„ƒ}~𴳩¬¨£¥¥¢  –“——“”šš•““”’”––˜œ“‘£¢  £¨ª§¤£®¯°±´¶¸¸ºµ··¸¸»ÃÀµ–Š“”’’”—™™š £¡¤§¨¦£¡ ©¨§±ÂËÍÒÍØåéÚÇÅÃÄÁÂÃÄ¿º·¹»¹º·­ªµµ¶¶´²±²¬®³··³±²°°µ¸µ³·»¾¿¿½º»ÀÄ´ý…\[[WWTROHKXXQUaili`b\\]Z\aaTLIJOYcdinnmqsrqttwyurqj_Q`¦ÛãäÝÊÀ¿¿ÆÖÚÚæêãèéÕÒäå×Ô¯‹®×ÒÎÒÓÑÑÒÓÖÓÐÓÒÎÊÉÏÐÐÏÑÓÏÌÎÑÐÒÕÓÎÎÓÒÐÓÔÑÏÜÆŠs€Š†‡§ÉËÅÄÊÊÅÃÇÄÃÎÏÌÛÖœqja\{¤¶¾Ã³“ž·Á¶€`nvkiijooljfeikmoqj`bhmmomheilkjjjhjmnkjhgbar€]1$%)@?##,.+(*)&$$&%!!Q……~€||{}cG_}_2#Tr\8NcZ^M6E\P, <^^][Z[XRTXZVRONONTNEEB9418/ 6STM`sr[P{­¡bK¤‰jnsh`dd_fpvtqute]gtvqnpqonpnmopokmqskbwƒŽ²Â¸¸ÊËÂÃÉÄýÁÉǼ½ÈÏÆ¾¿Ä¾½ÆËÇÁÁÆÄÁÀÊÅÀÁÅÇÄÀÌÌÈÄÃÃÆÉÀÅÇ¿ºËÅ”vrsonqorospihknph\X[_iuxyztu}wbo‚wjvtms|vstutrttwvusvyzyzyuwx{}sj{”œžª°²¶´³ÅÜÁ§ÀЪ¡Åæëè瀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€`˜£‘Œ~~€zz~€}{{{yy‚€ƒ~›¶´­®©¥§¦££¢š˜›š—–•–”’“’–œ›šŒ™Ÿ›š¥¥ ž¢¦¦§«°µ¸¹³®±µ¹»¹½Æ¸•…“’‘”––—œž¢¥¤££¢¡£§¨§¤¬¿ÊËËÊÓÞæØÈÊÏÃÅÆÁ¾Åĸº¹¸¶¸µ®°µ¸¶±°´µ²±¯°µµ±®®ª¯°±´±³¾¹·¹»»¾ÄÄ»¾¼—d\g`]]WUXVTXWQR\ellg_Z\]VVWSKJDH[jjgfknptsnkonpwvwvh[H]¦ÝêèÝɼ¿ÈÑÚÝáêíåêìØÕæäØÖ²Œ¯ØÓÊÓÕÐÑÖØØÓÎÐÑÏÎÍÐÍÎÏÒÔÎËÑÓÍÑ×ÑÐÔÔÑÏÎÏÍÏÚÁ„o{}~‹†ˆ³ÒÎÈÉËľÀÄÈÈÌÊÍàÖslb]{¦¼ÃŶ”ž¶Á¹„dsvhegnpmlmkghjoonidgiflqogcejljjjghkljkhhd_fqS$IP*"""&))++-+'')(%7mŽ‚}{|~d@OfD#(CNA-1=@A0/.14-+@VSPLHIIC>=:6433311-+*'&)39/4SSNdwt\Oy©bI}¢ˆilqjafe^cmusloti_ixtoorrmlolopmmopnvk`r}´Äµ¸ÅÆÇÇÈÅÂÁÀÅÄ¿¿ÇÈÈÅÿ¿ÅÅÿ½ÀÆÆÂÆÃÁÃÄÄÃÃÆËÊÅÄÈÇÄÀÈÉ¿¹ÍÈ–urspnqnqrpnmmooni]XY]jwzyvux{whrƒscu{wuvtuvvvxyvtuuwvuuuyxuwwy|sl}—œ¥ª¬¶´²ÅÛ©ÄÒ®§Ëêîêꀀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€_š§•‘‰~}}†Œ‡€~~}}~}}~{}€‚}‚~š¶³±°«©ª§¤¦ ŸŸ™œ˜–””””’•™•–š”’›™’——šžž›ž£¥¤¥§«­­¬±¯´·ºº´´Å¸•„Ž““”šš˜› ž¥¥£¢£¤£¢¢ž¤¡ž¤«¬­¬±ÆàÝÉÉÐÏÄÅÈÀ½À¼»½½º¹³ª®¶¹¹µ²²²°·²°µ·²­««²±±·¶´¹´¯²¸»ÁÄ¿·Ã§q\ee[Z[WV\]Z\YYW[eigcd[ZXNIJF9AJXgkjkiorturqvxtqtsvzlSB_©ÛééÞǸ¿ÎÓÕÙçëíåêíÚÖæäÞÜ®‰²ÞÔÊÒÔÐÑÓÑÎÐÎÎÌÐÓÌÈÒÔÓÔÕÍÊÒÑËÌÏÏÏÒÑÕÒÍËÍÑÙº†s}|}‰‚„®ÎÊÅÈÇÄÆÊÅÇËÌÉÍßÒ›tmc\z£»Áƹ™¡¹Å¹„akpfilnpmlmkghjmjhgfiimnmkihjmnlkiffiilkfdfd_R2! U[2$%!#&(+*,+(()& N…‡{{|~€‚„hEIS;+30/37328;@FEHNQSO610,(+,%(5628=?D@-.8.%(*290 5SSMcvt\Oyªž`I£‡hlre`fd^fqxvqsre`jupopspllpmnnlnqqmrg_t|ˆ²Ä´¼ÉÅÃÀÅÊÃÃÄÿ¿ÂÄÇÇÆÃÃÄÅÅÇÀ½ÀÃÃÄÅÅÇÇÅÅÆÆÄÄÉÇÁÅËÊÅÃÇÈÂÀÒÊ–qpusssmmokmmghorg]XY^n|}ywwyzugs…vhx|ustuuuuvxxtwxuqtyxqvxvwuw{tj}˜™¡¦ª··³¿Ö®ÊÒ¯©Ëèìê쀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€aœ©—’‰‚†„€‚€ƒ€|}€€~}~}ƒ€~…ƒ€¸µ¸µ¯®¯«¨«ª¤£¡š—›š™™˜•–˜““–›š“•—™˜—™Ÿ¤žŸ¡¥©«©§§¨®¯±¶¶»¾µ•…•––”™™’–¦¨§¦§©©£¡¦¥¤¦¥¥©­©¼áãËÅËÇ¿ÇËÂÃÇ¿»¿À¼º¶²¹¸·¹»·±²··´³µ²¬¬±µ¶²®±·¸´´²¸»¶·»¹¸¸—hXbcZ[^[VUTU\QXY]imgdc]WLCMWQAK^ihhkkgjkorqs{qrswrqteOEm·àæäÛÈ·¿ÎÎÊÒéêìãéìÙÕäéÞÚ°‰±ÞÙÑÔÓÒÔÔÑÐÎÒÓÑÔÒÊÍ×ÔÎÐ×ÔÍÏÑÑÌÍÕÔÎÏÖØÖÎÊÍØ¼…t~}އЫÏÍÆÆÁ¿ÉÇÇÍÍÊËÑÞÔ›qi^Yz¦¿Äɾ›ž²¾¼‰fnskkhjooljfeihkjjeadfkllmljjmmkkjggjjikhb`mkO(6hW,$#!$(()--+*-.&8mŠzz}}€„|dILSKKOLOUYTYaY\TWc]_cJ+(((%*,%8[fahhdmU./?,((080"7TRK^rq[P|®£`K‚¦‡gmvfcic\fptvsvrc^jwtpmmnnprplknqonopfd}ƒ‰±Å¹¾ËÈÁ¾ÂÂýÁÈÁ¼ÃÉÉ¿¼ÃÅÁ¾¾ÆÃÀÂÆÆÄÅÄÆÄÂÇÍÊÁÂÇÉÇÇÉÈÇÂÂÃÂÂÒÆ‘rqusrrmnqlnoikojg_[Z]kvtz|vuzsaothwxpsxwttxyzzywwwvvwxxuxwxtuztj~› œ£ª¯³¹¶¿ÔİÉÏ­§Èäèç뀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€_œ«•Œ„~€ƒ‡…€~~~~~~|||‚‡…€~{¡»¹µ¹¶­­³°§­¥¦¨¤¡££š—–—•’‘’—–’“˜š›•–•“•šžžžž£¤ ¢¨©¦¡¦¬°±²ºÀ²•Š’˜››–›œœ›”˜©­«¨§©¨£Ÿ ££¡¡£¥©ª«ÈëãËËÐÅÄÇÅ»½ÄÂÂÇÉÉǽ¶¹¼½¼»¹¶´³°·²´Âº­´À¹µ··³²µ¹»¿½¸¹»¶¿¯‘q]]`^ZXY\\XVXZTT\fljdaWLA=DKHMallnponklkjmrtswttttwtiIHÎâÝäÝØÎÔÝÝÙÚëéñêëêØ×èåÝܱ‰®ÙÒËÓÑÍÒÔÓÕÏÒÑÒ×ÕÎÎÕÐÒÔÒÔÕÑËÎÏÍÏÔÕÓËÓÔËÈÏÛµ…v}†…ˆ¨ÌÊÃÃÅÆÈÇÅÏÕÏÉÎÞÒ›qjbZyª½¼Å¼š ²Á¸†empjlfnopnjgffijllifhkklolfjmijmmgegklmnedcmoJ$ A`>&($#'('+,..-*&# !Y…ƒxy€ƒ~sYOPPNEOR[YZ`[Z[ZY[X]_K*'+%")'&KjogfjroC0A@').*06-6TQKaws[P{­ bL§Šhoriagd^gqvrsutfanvspllorrrrponoonlte^w„‰«Ã·¿ÏÉÂÁÅ¿ÂÇÄÀÁÅ¿¿ÁÆÇÃÂÃÅÆÅÂÀÃÆÅÇÅÅÆÄÄÄÂÁÅÈÈÉÇÅÇÂÅľ»ÊĘqturqrpmnnknolopg^XY^juyzxwwvsiw‰wftyxywyxursutqtuuwyutyvwvxwx|soz–¡ž£ª²±¶´¿ÙÆ«Àи«Æåíî뀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€d¤°“‹Š„ƒƒŠ…|z{~‚ƒƒ‚†„~…ƒ‚…€‚ž··´º¹²°¶¶°¨§ª«¦¤£Ÿžžž™••˜“•–‹”œš••““––žž£¤ ¡§¨¡£§¥¨°±²º¯–Ž”–š˜š¡”›®«¦¦©§¦¥££§§¦£¢¦¯¬²ÌèàÎÎÏÅÄÇÅ¿ÂÆÁÁÉÈÂÁ¾¹·À½¼¾¼¶³µµ·³´º³«±°®®²¶¶¶·ºº´²·»º·±¶œoX\ba][[]]ZYZ^UNXikfg`RKMMMSYhkllonifhklklprrsovvox{hIU‰ÈÐÅÔàÉÇÍÎÑÕÑÕâêåèèÖÕæåÜÚ¯†¬ØÒÃÌÐÏÓÖÕÖÏÔÓÔÕÐÌÐÒÍÍÑÒÑÎËÓÓÑÐÐÒÒÑÙÖÑÌÌÒÞ»‚t‚„€‡ƒ„¨ÊÊÆÇÆÄÆÅÉÎÎÌÇÇÖÖ›nid]y¨··Ãº–Ÿ¸ËÊgoskjfmnonjhggklmmifgjnpnhddhkimmiehjknjcc^joJ#!"*;+  !"&(*--..+*)$ H„zruw{€€y_ORUTQJ?IXXXZ\[[Y\X]_L+(*'(+)0TpjkmhnbEGVB"%,*06,5SPKaws[P{¬ bK§Šhoqiagd^gqvxwvsd^lunnnpqqpopnmnpqpnsf`xƒˆ«Äº»ÇÅÁÁÇÈÀ¿ÃÄÀ½ÂÇÄÃÅÊÊÆÄÅÇÃÃÅÄÀÁÃÆÅÄÇÉÄ¿ÁÀÇÆÂÅÌÊÅÅÅÀ¼¾ÎÅ”quurqrpmllimnkopf^YY_lx|r{yvzwgt‡uewzuvxpquwurswsvwtrvyuvwvxwx{rh{™¡ ¨­®±²¯¾ØÄ¨¼Î¶©Åãìí退€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€g¡ª’Œ†‡€ˆ†€€„…„‚‚‚ƒƒ„€ƒ‚€~~‚Š…ƒ·¹´¼½¶³·¸´ª®³°ªª¨¢¡¡¢ ›•–š—•–Š–Ÿ•–—˜••–•’ššž›¡¢§¥©§©­­¯»®–Ž”–šŸ£œž¢— ®«¥©®«©ª¨¥©©¦¤£¨°²¸ÏæÞÌÉÇÄÃÿ¿ÈÏÊÃÈÅÁ¿º¹À¿ÀÁ¿¸·¹¸¶¶·µ°°´´µµµ·¸µ±´·±­µ·³²³¼¨vUXc`_]\\[ZZ[Y[U[noc]UNMQSWaijijjjlmkdimkkmpppuysqxtcRV„»¾¸ÎÖµµºº¿ÆÀ½ÜæãçèÖÕææÜØ«„ªØÓÅÌÐÏÐÓÕÕÖÙØÔÓÍËÐÒÎÍÐÔÑÍÍÏÒÔÒÎÌÑÖÝÖÑÏÏÑܽˆv~|…„‡®ÓÑÇÈËÇÂÆÌÎÉËÍÎÚÓ™mie_|«µµÃ»™¢»ÌÆ‹cmtiihkmnmkihiijlkhegjkmmjfdhmilmifgjkmkif_mnD # $%(-.,-,)+,(  3r†{stknrzmWIT][^XCBX]WZ^ZZZ\X\_L-*)'+)&9awhjmhmVJGH7$%*1/5,5RPJaws[P{­ aK€§Šhoqiagd^gqvvtspb[jsqqqpnmllnmmnpqqprfbyƒ†«Æ·¶ÄÇý¿Á¿¾Á¾½ÃÇÇÂÀÁÁÀÃÈËÀ»ÁÆÃ¾¾Èý¿ÈÉÅÃÂÆÆÃÈËÇÀÅÅÁ½¿ÎÅ”qturqrpmkjhlnkopd]Z\bny{u~}y{ucq†wgrtuzyqsvvwwwvvsrrqsxzwxvxwx{rh€ž¡ «®¬µ²«ºÕÅ®Ä͵¨Ãâêë耀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€e¥‹„z|xv{|}€}}}}}|{{„€€}{|~€‚‡Žˆƒ›µ¸¯µµ¯¬¯®ª¦«­©¤¤£  Ÿž™”“–—“‹ˆ”™’’‘‘’‘“““•˜šŸž¡¡£¨§«²¨’Œ•™›œ¡ž ¢›”š¨©¥©®­««¨ª¬©¥¥§©¬°µÍèàǾ»»½¼¸¸ÃÆ¿½Á¿½¾»µ´¸¼½¹´´¶¸³°¶º³°µ¶²µ´°²µ³­³¸¹¶´·¹»¸£šŠdU^`_][ZYXYZTZX[ee\YNKINT]ejejpoikkdbimmjlmnmvvrtvj[YSg›¾ÑÞØºµº¾ÃÇÄÈÝèæëìÙ×çèÝת‚ªÙÖÉÎÓÒÏÑÒÐÒÖÓÒÓÏÉÊÓÔÑÐÓÑÏÔÓÓÒÑÏÏÑÔÔÓÔÒÍË×¹…u‡‚‚¨ÎËÃÆÏÌÈÄÇÉÅÆÎÔÜΗojd]~°º¶ÄÀž§ºÃ¸…amshhjjlmmkiijhiklighlomolcdkllmkhdfjnjoohdl_1"##*""&#&--+,+++-)%! &_…|rm`fmgOBKURW]N?N^YYZY[[]W[_M/*&&,#"@cqgimkiSF=2,,)(1/5+4RPJaxs[P{¬ aK€¦‰gnqiagd^gqvrqrrc\irusqommllonmnpqporgc{‚†«ÇµµÄÈÄ¿ÃȽ»¾ÄÄÂÂÂÇÃÁÿ¿ÃÄÀ¼¾ÃÄÄÅÉÈÅÀ¾ÅÉÆÉÉÿÁÅÆÇÂÆÅÁ¾ËÅ—quurqrpmllinnlope]YZ`mx|wwxzwqevƒwhuxwyvqssruzysuwxxyxvywxvxwxzqj‚  «®¯®±±¿×È­»Íµ¨Ãâêë耀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€e¦¯“‹|wzwyy{|utxxyyxux{{yz|zvx}{}|{–²µ°²²®¯°®¨¥¨¨¦£¢¡¡¥ ˜–•‘“’‹‰‹‘‡‡‰Œ‹‡‰Š‹‘”‘–‘• ¡Ÿ¡Ÿ‹•›š–Ÿ£žŽ’©«ª©«®®«¨«ª¨§«¬®²¸»ÏèãÌÅÿ¼¾ÆÉúÂÀº¼¾¹´·»½¹µ´µ³±­·½´±µ²¬®­ª¬±°«°¯³®¤ª¸¸ ut‰wWWb^][YXYZZXV[`ZKGLH@BTdfgkggjklpofbinlkkmnmipvtqhTUXPg¦ØäÔ´±·¹½ÃÆÑâìéííÙÖæêßÙ«ƒ«ÛØËÐÓÑÏÒÔÑרÔÏÒÐËÉÒ×ÓÍÐÎËÏÚØÖÓÒÒÒÑÐÒÓÏÊË×·†t~€†€®ÌÉÆÈÈÄÆÆÇÈÅÇÌÏØÑšqkd\|®½¶Ã¾›¤¸¾¼hmtjhgjlnmkiijjkmmjhjmllnkehmjnmjfcdkpjmjgf]C!"! (3)#%!%+-.---,(&&%##%%!"P‚}i`Xgpj\SILWXZZSEP]ZYYY[\]WZ_N-'$'-$(Nh[TRPMHH@C4*/+%'05,5SPJaws[Q{­ aJ€¦‰gnpiagd^gqvwtvug]jssqooqrqoqpnnppnmrgd{ƒ†¬Ç¼»ÈÈþÃÇú»ÃÆÃÃÅÇÅÅÇÆÀ¾¿Êļ¾ÇÊÆÃÈÉÉÄÁÅÉÅÂÇÆÂÅÈÆÂÁÆÆÂ¿ÌÅ—qturqrplpoloolopi_WV[iw||yy{ztj|‡qcy~tsuruvuuvvtxzxwwvuyxxwxwwzqf|˜ ¢¥¤©°¸·¼ÎƲ¿Î¶©Åãìí退€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€i¬¸¡“‚‚„‚yy|{}}||~~zx{~~{zz{~z}œ»¿µ¶¶¶¸¼¹´­°°¯°®«ª®¨¤¥¦£Ÿ™›˜””””•––“‹ŒŒ‹‡‰‰‰Ž’’’•“•›šœ ¢•”šš•š¢¥¦¡•˜­°¯ªª®¯¬«©¦¦¬®ª­¸½ÀÎâÞÌÆÅÃÅ¿ÁÈÊÇÂÈÆÂÄÄÁÁÅÄÄÃÀ½ºº¼¹ÀÆ¿¹¹µ³´´µ·¹·³®¥¥ – ˜vaZfg[U[\^]ZZ\\[XZ_^PCAC<>I^ifbgiddiklkifkmlkmnnnjlsqgZPPSOPq»èÒ±³¹¶ºÆÍÕåîêìë×ÔäëàÚ¬„¬ÛØÏÒÒÏÏÓÔÓÐÓÐÎÐÎÊÌÍÓÏËÐÑÍÍÒÓÓÒÓÔÕÕ×ÓÏÊËÐܺ‹v||{†‚§ÉÊÈÊÊÆÆÈÎÎËÑÐÌÚÚŸqke]x¦½µÀ¹’ž¸ÃÃ’fismigkmnmkihiklmlhefiejlhhjkioligddjqrkeieJ-"%"""$ "#"&+.+)*.-**-('##-5/ F~ƒhXW_\T]^RP[acd^[`]USQX[]^VY_O,#%*.)5][><@:.&3HF.$+'#%17-6TQKaws[P{¬ `J¦ˆgmpiagd^gqvxttte]kwvrooprrprpoooonlshc{ƒˆ¬Ç¸¸ÅÈÆÃÅÅÆ¼»ÃÄÀÃÊÆÃÁÃÃÁÂÆÇÿÂÇÃÀÄÈÆÃÅÊÉÅÄÈÈÄÂÄÇÄÂÄÅÃÁÂÑÆ“quurqrpmrqmpplooe]YZ_juwuyutxsctŠsbv{sruwyyusuvtsruwttutxywyvwypf{™¤¢—Œ‘—«µ¸ÅÀ±¾Î¶ªÅãìí退€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€m¯¼¦¡}ƒƒ„ƒ‡†}~†„‡‡ˆŠ……ƒ‚ƒ……ƒ‚‚„}}š¸¼³¶¸¸¹º¹¶²·³¯µ¸´±´¯¬­®«¨§¥¤£  £ ˜—™™–”’‹ŒŽŒŒ’œ•˜š›™—ž¥¥–Ž”™›™œ¥©¥Ÿš ¬°¬«¬­¬«©©ª¬¯®¨«µÁÂÑæäÎÄÃÄÅÃÂÆÉÅ¿ÄÇÇÇÉÃÁÆÌËÉÅÂÀÂÅÇÂÄÉÇÂÀ½ºº¼ÁÀº²­—‹†~rsuj[a[OQWWSY[\[[]]ZX]WIDHKIJYcfigee`bflnjghjlmkloqpookkj[NQOJVWQØÙ¸¶¼½ÃÌÐÙçïéëéÖÕåèÞÙ¬„«ÚÖÎÓÒÐÔÕÑÏÐÒÓÕ×ÎÇËÔÖÓÎÐÏËÊÏËËÏÕ×ÕÓØÑÍÍÎÑÝÀ‡t}€€‡{ŸÈÊÃÅÊÇÃÅÎÍÉÐÏÌÛÛŸrke]x¦Â¶À¸‘žºÅÀagtlhimnomkhggkklkgcdgkmlgdehklkjjgehntigl_=%()$'(! !#'*,/1.-.-)''''#"%!'26#:s…fV]WBO\RIT\clhcb]WQJIW[^^VX_O.#(,*);`hZ`f\J5*IK3''$')28. 7USMaws[P{­ `J¥ˆfmpiagd^gqvwrrrd\jvwtpnoopoqonnppomugbz…Š­Æ¹·ÄÇÇÅÈÈÁ»¿ÇÆÀÁÆÄÁÁÄÅÄÆÉŽ·¿ÊÇÁÅÆÆÅÇÉÅÁÄËÉÅÃÄÃÂÂÄÅÄÂÃÑÆ“qturqrpmpploolopc\Z]bluwtvsszudsŠxhwzuutvvtqrvxvsvvsqvzwyywxwwypj€œ¦¡}€…𤣫ª©Á͵¨Ãâêë耀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€k´Â¨£˜‡†„‚€‰‰}{ЇˆŒŒ‰‡‰Œ…‚…‰ˆ……††‰~™¶º³·º¹·¶µ´¶»³«²¼ºµ´²°±°¬«¬¤§­¨ž¤¦š™››™˜˜—”‘“‘‘Ž‘’““•™˜œ Ž‹•š›šŸ ¤¤›•¨¯ª®³¯¬«¨¥¬¯¯¯¯²¸ÆÁÌæåÌÄÊÆÃ¿ÁÈËÆÁ½ÅÇÆÇÿÁÂËÎÉÃÃÆÇÄ¿½ÁÅÃÁÁ¿¼½¿¶£’‰€vk`Y\^YQZa[PPUUTXZYZ\[X[]M=@DBBWde_biiediihlmjkmnlklqrqnjkj^TQSQNRUHZ›ÉĶ»ÈÐÐÏÜéñêëê××èæÜØ«ƒªØÓÍÓÐÎÕÖÑÏÓÐÏÔÖÌÈÐÔÕÓÐÎÎÏÒÒÏÐÔÔÐÎÐÑÌÎÔÒÌÙŠu{}}†€~§ÌÌÅÅÆÄÄÇÌÌÆÈËÍÚÔsld\{­ÉºÂ¼—¤¼Á¼ŒenwidknopnjgfflmnmifgklknlddkmiikmjfgllejkU5$'("##!" ##%,.-0/-+,--*(()'!"#&#!$6,.d|^Sg]>IP>Ea^Wa_aZNTZOQW[^^VX^O2%*,$#8Y[bgkjk`A:\U9'&.(39/!8VSMaws[P{¬ `I¥ˆfmoiagd^gqvzuvwf[grpqrrqonnommnpqqovg`y†‹­Åº¹ÅÇþÀÃÁ½¿ÄÃ¿ÂÆÄÂÂÅÅÃÃÅɺ¿ÉÈÃÇÃÀÃÇÈÉÆÀÂËËÄÃÆÅÁÁÆÈÄÂÎÅ–qturqrpmnnknoloph^XX^lz}vsy{sdq’}kyztw}wttwwtuyxwvwwsrwyzwyvwypi€œ¥¡‚ˆ›§¤¥Ÿ¢Á˳§Âàéêæ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€l¸È­§š…„‡ƒŠ†{ˆ‡‡‹‹‡‰……‰Š†„†‡‚†‡„‚•³»³´¶···¶µ¸·³²··µ¶¹µ¯¯µ´­«¨««¥¡¡¡  Ÿ›™š™–”˜•Š‹’Š˜›—•›š‹•››žŸ¡¦§ ›¡­««®®ªª®®­­­®¯³µ´¼ÂÕëáÆÂËÊÃÃÆÄÅÇÃÃÈÈÇÍǺ»ÄÈÆÃÆÇÅÆ¾ÃÌÊÀÁÉÈÇÈȵš€pula^^XX_a\[ZYWVTT\WW[\[\\WWIBNTRVakkeeedddfikkjjjfkokhnpijmj^SPSUUWRV[Se’¿µ¹ÈÑØÜØæêëîçÔÒçäÛØ±…¨ÜÕËÐÎËÐÏÌÍÎÏÎÓÔËÉÓÓÏÐÑÌÏרÒÑÑÓÒÑÑÓÐÐÔ×ÔÑÜÁ‹w}{y„„†¨ÍÐÆÅÄÈÉÁÄÌÍÊÇÏãјokcYy®À­»¾™¡ºÈÁˆbowgdhlikpnggmlhlnihjgnlkjkkllkjlkefjkhiplN."%$! &&!%'%##'+--.1-,.,)*.(*(""(*)& #% *.*^u^MPK'!"!! %)'')'%$'*,.0-//-++*))*)%#'+,)&  '& '/+\t]A766@YYXa[TWda`^ZVPINONLFMWJ0.2*%.-)-)&?fpjo\:'(''++09/5VSJ]wu]Pz¬¡`L¦ˆhopgcgc^dmvyrquiYdurqppqponrrqpooppsic|ЬĹ¾ÄÀ»¾ÁžÁÅÆÂ½ÀÈÈÃÂÃÁÂÆÅÅÁ¾ÂÆÃ¿ÀÄÄÁ¿ÂÇÈÆÃÄÄÄÄÆÅÿÆËļÌÇ•ossqprpmnpllkkqsc[XZ`jstwxxx{ucwŒ|hu{tpruwvvxuqtswutwvsrxwtwwy{qi ©¥£¡¦¬±¯²¼»¸¿ÆÂ»¿Õêî退€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€r¶Ä¯­ ‰„€…ˆˆŠˆ†ˆ‰…ƒ…‡‹Œ‡‹‰†…†‚ˆ‡‡‡‰ˆ˜²¸´³³²³³´µ³µ´²´³³¶»·³´µ°¯¶µ²±²²­¨¤«©¦£££Ÿ››œ›™™“Œ‰‘‹‰Ž‘‘–™”‘‘“˜š™œœ›Ÿ§¨«ª¨«©¦¨£¨¬«®³µ´³½ÕëãËÈÌÇÁÆÏÌÇÇÅÁ½ÄÇÆÊÉÆÉÈÆÄÄÆÉÈÎÈÅÈÈÃÆÏâ‹ur…€fTYZZ]^\\[ZYWVTSRWUXXTWZUNAN_^Y^aSIS]VOUY\^W[`P.$',5@7+(+#.SlljhD&&-'$.09/5VSJ`xt]Q{«ž]O„£…krmfdib]enuvxvsg]huvsppponnmnoppomlqi`wŽ›´¿¼½ÂÆÈ»Âż»ÃÅÂÂÆÆÂÀÄÆÂÃÊÅÀ¼ÀÃÀ½ÁÅÂÄÉÉÅÅÈÈÇÄÁÁÄÅÅÂÆÉ»ÊÄqttrqsrnlnlnnmqpg`\\_kywxyz|tbv‘}ivywvtzsqrrtvsvssxzxwxvxvxtv{tl{‘˜™›˜šž™—š™˜œ  œ«Ñìë倀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€tÁί©¡Ž…‰…‚†Œˆ‚ƒ…‰ˆ‡‹Š††‡ˆˆ‰…„††††˜°²²±°®¯¯±±®´¶µ¶³°³¶¹·µ¹¹µ²²¯¯±¯­¯´³°­¬«¨¥£¦¦§¥¢ž›”‘ŽŽ‘Œ”‘ŽŽŽ’’•–—œ¢£Ÿ¤£¥£¢¥¨¦®«¤¦¶ÄÆÄÄÈØèßÍÊÇÆÄÇÉÇÊÎ˽ÅÈÆÊÈÃÊÉÇÉÇÂÂÄÂÁÁÈÇÆÏ̵ˆ~|z‚‚jWS[ZW]_\\]]\ZYWVUVVZZXXRD?8=P[]`e_ababdfecehiiiiinmkjnrfOMQTTTUUSVOSWQUZUS‰ÃÕÏÕàßêéæéçØÙîèÙÔ¯‚¢ÖÔËÒÙØÓÑÑÏÓÓÎÌÑÓÔØÛÐÑØÙÕÔÑØÔÓÔÓÐÐÓÒÐÓÕÔÐ×¶€nyzy€|{¡ÊÊÂÍÉÂÂÃÇÌÌÎÎÏØÌ•opg[~¹Ä·¹¬¬ÇÅÃŒckshgillnnlhhjoljiffilmhfgjhhijikiddjkfyŽ…Z2',+%%()**&)))+,+,.-/.,*)))((),-.--$&#%/03,&FZQ=,%'8SYQQSOCT]UMXZPIRUYZTX_O-+..Hi\8+.&/TlliiJ-(,'%.09/5VSJaxt\R{«_M‚¤‡ipoeeia\fouytvxg[hvqrrrsutrlmopponmpjbxŽœ¶À»¿ÆÆÅ¿¿ÌÆ¿ÀÆÃ½ÀÅÇÁ¾ÂÆÃÃÈÆÄÂÃÆÃÁÃÄÅÆÄÄÅÅÃÆÅÄÄÈÉÇÃÃÆÈ»ËÄŽqturrsrnnolnnmpnc^\]`itxqz~xwrbuyizysvtquvvvsqvwuxwrtxvtwxzwvzrk~–˜“’“›ž–‘•›™—š§¢›¬Ôëé瀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€s¾Î´®¢Œ‰ˆ†ˆŠ†‚……‚†ŒŠ‡ˆ‰ˆ…ƒ‰‹…‚‡†‡ˆ‡‡™²·°°¯®®®®¯«°²³´±­®µ¹µ±µ¹·³¹¸¶´±¯²¶­««¬«©¨ª«©©§ ŸŸœ›•‘ŽŒ’Œ““”•—šœ››ž¢¦¦¨§£¦©¥£§¤¢¥©¬±²³ÈãÝÌÊÊÇ¿ÁÈÉËËÆ½ÁÅÆÉÉÄÇÍÅÃÇÇÂÀÁÆÅÆÅÆÊ¸—€~x^RW[ZY[]\^\[ZYWUTSUVTX[NAC;;JYZZ`ca]^cbacffggfffghgglpi_VNNRTSTVTQHGRXPNSUHn­ÕÑÉÕãëêçêéÙØëãÕÓ²‡§ÚÙÔÕÔÒÑÑÑÑÐÓÑÐÕÒÒÙÖÑÔØÕרÒÓÑÑÐÐÐÑÔÓÒÖØÓÎÚ¿Šw€~‡„…¦ÌÌÄÍËÇÆÄÆÊÊÊÌÏÜЖopfY~½Ë·¼·™°ÈÈÀ‹cjrigilmnnkihilkkljihjkkhhhjjiijnoihjjjwsS8*#) */*+*))+,,*+-+,./.*()))*--++,'&**+,6*5?6,'&(6R\P?=FIJOMQZUIHNONMHQ]Q1)*6ZlE/0"/[ngkjF)&*(),09/5VSJcys\R|ªœaK€¦‰hnpeeja[gotwuwwe[juqrpnorrooopqqqqppjczœµÀ¸¾ÄÂÁÂÂÇÂÀÄÇ¿ÂÄÅÂÁÃÅÄÃÁÆÄÁÁÃÂÁÄÇÆÄÄÅÆÄÂÁÀ¿ÁÅÈÄ¿ÃÆÇÂ½ÍÆpstrqsqnrqkkllpoc\YZ_jvyzyy|vbvŽvfxwsxyxsoptvvvvrpruwwvuvuyyzzor’”‘“‘–¡š˜œ›•”™¡¦¢±Øíè倀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€tÀÑ·³¨’Š‡ŠŠ‰‰†„‰‡ƒƒ†††ˆ‡„…†‰‡†ˆ‡‡ˆˆ‡—³½²²³²²±°°³±«¨«­¯³²·µ±´¶µ´¸¸¶²°°°°¯®¯°¬¨©­°««ª¦¥¥¡ž¢”“’ޑޑ˜œ™ŸžŸ žœ¢ª§ª¬©¨©¨¥¤¦¤¥«ª©®¯¬ÆçßÅÄÊÅÃÊÎÊÈËʼ½ÃÅÇÈÅÅÍÆÂÄÈÄÁÃÉÊÅÄÈ·šŒ…tyƒnVNXUX[[[]]\[ZYWUTTYYYZUG@C=KY[Y\`_b[]ba`cecddddfhjcdlkWFHRSRPNOQSSMPXXLBBEEW™ÚàÐÙììêèìêÚÖèáÒѲ‰©ÞßËÓÓÏÐÓÕÙÑÏÍÒ×ÔÏÐÎÐÓÓÑÓÖÕÑÓÑÎÎÒÒÏÍÎÑÏËÊÙ½Šw€€‡……©ÍÎÄÉÉÊËÈÇËÌÌÊÌØÔ™qncW€¿ÏÀ¹›­ÆÍÅdiphijlnomkhhhjlnomighlljijjkkiilkffiikkeQ8*$&K\6%,-+))''+0,*-20*(,**+-*''*&$+)(+2*$($&)$ :OOA;@PZMKJRZTKLGGDC?JYO5!":bzeE)&$=epjpb8"),()*09/5VSJdys[R|ªšaK€¦‰hopdfj`[gpttxytd]jtutsrrqnlppoopqrrskc|’´¿»¿ÅÃÀÂÀ½Á½ÂÇÃÂÆÇÄÁÄÇÅÄÄÀÇÃÀÀÁ¾½ÁÊÃÂÈÉÄÂÅÃÂÁÂÇËÉÅÃÅÆÂ¾ÐÈ‘orspprpmqpjjlmqpj`YY_kwz|tsyu^r{gu{utwyuvvrsxxsstxxsquwwtwxy{phuŠ’Ž’•’Ž•–Ÿ ´Þñç €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€wÄЯ­¨’„„‡†…‡…„‡‡‰‰‰Œ‹ˆˆŒ„„Љ†„ƒ~†‡€~•³¸²²´´´²°¯²±¬ª¯°¯°­´¶¶¶³±´³´³²µ¸·³³³¶·³®±·°©©««¬«¤žŸžœ•’“ŽŽ‘”™Ÿ¢œŸ£¥«­©¨®®¥©©¥¥ª©¨°­¯ÉçÚÂÂÆÁÂÈÊÇÌÏÉ¿ÁÅÆÇÇÄÆÊÊÄÁÅÇÅÅÆÍÅÆÈ¤…kx…wdWSUPV][Z]\^^\[YXVVSRZU@=A8,#2UijiiV+1/%&)09/5VSJdys[R|ªš`L¦ˆhopdfj`[gpttxwtgZewwsoonmmoonmlmnprvja|”ž³½¹¼ÇÆ¿ÀÃÇĽÂÉþÅËÆ¿ÂÈÄÂÆÇÀ½¾ÄÇÃÁÆÆÃÂÅÄÂÂÆÄÄÄÄÆÇÄÀÂÄÆÂ¿ÒÊ“orrpoqplmmjmoorod[WZboxytz{xzuaqou~xsxyupqwxvwxxwvuttuvxvwtu{uiŸ¡–”““•—”œœš³âòç䀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€uÅÔ³°¬•†ƒŠ‹‰‹Š‡‡Ž‹‰Žˆ†Œˆƒ€‚…ƒ‡††˜²¹··¶µ´´³²°¯®°³³±­¬³³­°º¹¯·¶²°²¶·µ··¸¶°¯³¶¯°®­¯«¦§¥¡¡¢œ—˜œš–Š”››˜™œ¥£™¨°¬ª«©¦§«¦¨§§ª««­­µËá×½»ÄÂÅËÈÄÎÓǼÇÉÄÇÌËÊÌÂÃÊÌÈÆÅÃÊÆÕŘwiyˆqYXZXYZYWWY[Z[[YZZVQW[XF8=HJHS\^[[]^^bb`aeebfeddegfehjWCDGFKKJKNPQPNKYZQKC3/*))()*&+..--..,1/0+$(+#%)&"&-+' "DJFEEMTA4;@>>GKDEGBJZQGUTMMWWY`V1(*4QkT-1:Xnigjb?+&-+'*,9<0!9XUMdxs]Rw§œ]L€¤Šjoqgcib[frwqswtb[hptqopqonnlpqlilppxi`~•›²Á¼ÀÇž¼½Ä¼¼¿ÃÂÀÃÉÇÂÁÆÇÂÁÃÄÀÁÄÃÃÅÃÂÄÅÄÃÃÅÈÃÂÃÃÂÂÅÅÄÃÃÁ½ÎÈ–rqrsspoovkgnrnnse\[VXn{zuyxtyu_s¡˜qr{xustssuwwtrtuvuuvvvryxwsw}qbÑß¿ÈÄ»¼Ãø´¶´²°¶Íåîêæ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€sÇÚºµ­–ˆ‹Œˆ‰Š‰Š‰‹‹ŒŒ‰ˆˆ‡‚€„†…ƒ„‡„„›·¿²´³²±³³±¯²´²°°¯­°¯®®±´µ´³µ¶µ¶¸¸¶µ´²²³²°¯®°¯¯²±­®®¨¦¦¤¢ œ›“Š—ššž £œŸ¥ž¢¯®«©«¬¬ªªª«¨¦«±²²³µÉåÚ½»ÇÁÁÇÇÃÈËÁ»ÅÊÊÉÈÆÈÉÃÆÎÌÉÈÈÆËÎÒ´Šˆqr‡oVRXYXXY[[YWZ\]\[XTQWZSFCGNUYXVVVWYZZ]^\]`a^``acb`djkT=9BGFFLOSSPNNORUPKJC78605=1-6?AGPE?FX^PJQYQOXZ[\H/+/*.HbrmlmmiZB-.0/,)&&+58,6URKdxt]Rw§œ`Oƒ¥Œkqsgcib[frwywwtd[gnmqsommmkjnqpoonltkbz‘´¾¸¿ÈÆÃÅÅÆÁÀÂÄÃÁÃÈÇÆÆÄÄÂÀ¿ÀÁ¿ÀÄ¿ÂÁÅÁ¿ÇÊÅÂÃÄÆÄ¿ÀÄÇÄÆÈ·þŽotuppsrmopokjlnmd[[X\oyxzytqzy`qª ojxsqyusstvwwvutstwxwuwutzxuysdÕçÒÙåàßÜßáàááÝâáåëíëé耀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€tÇØ¸°¨•†Šˆ†ŠŒŠŠ‘’†‰Šƒ„ƒ„‡‰†‚€‚Ї—´½·µµ¶¶´´µ³²±³³³²²¯¯¯¯°±±±´³²°¯¯°¯´¸³¯´¶µ¹¹µ´µ´®ªª«««¨¢¡¥§¢Ÿ••››š¡«§¥¢›Ÿª°³³¯¯°®©©ª¦¤©°²´·µÀÕÓÁº¹ÂÀÂÿÁÿÂÂÀÃÉÈÄÅÈÃÄÈÅÅÉÌÇÃÁ¥‹‰„~ŽŒdNUXVXZ[YWVWVWY[ZXY[YOGDDMVYXWWYZZ[]\]^^_`aa`bbbfi_Q02>C=CLJFGJNRQNJQMGCAAFNNNi¦ÐǾÑàéäêíßÜäß×Щ‚§Ú×ÎÓÔÓÓÒÒÖÔÔÔÖÖÔÐÍÏÒÖØÖÔÒÒÚ×ÓÑÑÓÐÍÓÕÒÔÊÐÙ½}…„‡ƒ…¥ËÏÊÊÆÈÊÊÉËÉËÍÓâÓ™mjfYw±ÉÇÑÈš£ÆÕÇ`hpgfihlllkggnjlnmhdfjmjjkjfefikkieehlmgi_m“x2"(>jP%#+)**%%(''*-,,-//.//("! )-+)+)$''#!'86;7/IBFMIHKHIDP_[QLHMJLVX[]K/(.,'/9FV\ZSG4'(-.)&)((/48,6URLdxs^Qx§œ`O¤‰josgcib[frwywwtc[jtwsqtqmnsmnppoonmrldxžµ¼´¾ÇÅÃÆÄ¾¾ÀÆÉÈÆÅÉ¿ÄÄ¿¾ÁÁÀ¿ÀÂÁÀÃÆÆÄÅÈÆÂÂÍËÊÇÅÆÇÅÁÁÂÀ»ÊÃnuvootsllljikppmd\ZY^owwwyvt|z_p”lo|wtxstuwxwspruuttvwvtvwzvsztg“ÖãËÒáÝààâäääãàââæëëëìꀀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€uÃÓ¸µ¬“…Š‹†‚‡‹‹ŒŠŒ‡ƒˆŒ†„ƒƒ‚†‰ˆ†}~ˆ‡‚š¼Ã¾¸·»º³³·±´»¼´ª¬´²±°®¯¯²´°²´²¯®°´¶·°«±´³µ¸²²·µ®«­¨§«¯¬¨¨ª¦¢˜•™š™›¢¦¨¢œ¥«¯²±­®²±««ª¨¨ª«¯·º¸ÂÔÑÀ»¹ÀÀÁ½¼ÁÅÁÁÃÂÃÊÌÉÇÀ¾ÄÊËËËÈÊκŒ†’~w~Œ~ZMWXXYZXWVWXUUVUWWZ[YKA@FQYWXZZXVX[][[[\^]^_`_^ac\J918@>=BHGIMQRPMLLOKF@AIOPNJV‘ÌŸÓâèäêíÝÚãÛÒ̦¤ØÖÈÌÑÕ×ÑÐÓÓÒÓÓÕÕÖÖÐÒÕÕÔÒÒÒÕØÙÕÒÒÕ×Ö×ÔÕÍÒÚ½Ž}‡…€‡„†©ÐÓÊËÆÇÇÍËÉÃÃÈÎÛÓšmjfYw°ÒËÍà´ÒÔÊelthgihkllkfgnmmmmifgjmkjlkhggijkhedhlmkk`n„c+!'/UM/&,(('&&($'+-,+,--/0.(!"$&)*+(&%(($$IFY^D=NTJKX^XVSGHKQXVZ_P1%*+('(/,75-.-*,,,))-'$-58-8WTNdxt]Rw§œ`M€¡‡gmqgcib[frwvwzxeZhtvspnnnnnqonnnoopqmdwŽžµ»¶¿ÇÃÀÄÂÀÂÁÂÄÈÇÅÄÈÇÆÃÁ¿ÂÅ¿ÁÄÃÂÁÀÅÂÃÄÂÄÈÉÇÄÂÁÃÇÆÀ¾¿ÂÁ¾ÎÆ“nuvootslkiikmnnoe\ZX`ouwuyyv|w_r•ˆjt~xwtvusrsssspwyvuy||wwsuw{}maÓÝÄÍàßààßÝÝÞàâäáæêêìíæ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€sÅÙ»²¦“Š‹†ƒ†ˆ…ƒ‹ŠˆŒŠ‚‚†‡†…‡‡‡„ЉƒŸÁÈÀ»º½ºµ³·µ¶¸¸±«°º¹²¯±¯­±º³±°±±°°°®³°­°³´¶µ®¯µ´¯­®±¯²µ®§§©¬¥š—››œ¢¡¡¤©¡ž¨¬³³¯¬°µ±©¬­­¯¯¬¯·¸µ¿Ó˶´»¾À¿½½ÃÅüÄÈÊÌËÉÊÄÂÅÉÈÇÆÁÉÒ²|„ƒfoŒnVTWZ[YVVWXWVRTRQSXXUJ@59JVVUVXXUTWZY\[[^_^^ac^^bZG848<<>BEFJIJLNNMLLQIB?DPRIENMj«ÍËÍãéåëëØÖâØÍÈ¥£××ËÏÓÖÕÑÏÓÔÓÑÑÑÔÖ×ÒÓÒÒÑÒÓÔÍÒÖÖÔÕÖÖÔ×ÕÙÒÖÛ»‹|‡‡ˆ†‰§ÍÎÆÈÇÊËÉÊÍÊËÎÏÙÔšmjfYv°ËÄź¹ØÖÊdlshfgikjmojehnlmnlgfhjnokggiijjjhefhkpljmtg@!''&+47/()%$&&))&#)-,*+.0-.,'! "$&),+)''"!&7?4;=+!/GRR\Q58KLIOZ[V\]RPUZ]VZaR/#(-**)/),)(,*&*))*,+&'/48,8XUNdxs^Qx§œ`M~ …flpgcib[frwtuzyeZjxutrppqolsolmoopqqlcwŽžµ»·¿ÆÀ¾ÃÅÆÂÃÃÄÄÄÄÅÃÅÆÆÅÅÄÃÁ¾ÀÄÃÄÅÃÂÁľÄÊÅÁÄÈÆÃÅÈÆ½ÁÇŽÉÄ“otuppsrmlklolhjpg]XW`otxw{ytyv`u™ˆiuzuvrrtuwwvtswxusuxvptyvuuz}nd”ÙãÊÔãÝÕØØ×ÚÛÝâáÞâèçëê߀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€yÆÕ¸³©•ŠŠˆŒ‹…€ŠŒ‹‰Š‡ƒ€‹ŽŒ‰ˆ‡†‹„Љƒ ÄÈÀÀ¿½¼»º¹½ºµ±°²´µ¸´´µ³¯²¸³¯­°´²­©ª°³±°³¶·´±³¶µ´´±®­°±­ª®±­¥š–™˜š ¥¤¥¨¢›¥®³±®­°²­¥®®¬¬®­°·¸³»ÍDz±¶·¹º»½½½¼ºÁÆÉÉÄÃÉÌÊÌÊÆÅÈÆÊÆ ~Šsd†›ˆ`UWTWZXWWXXVTUXUPRUOD>86ATZY[TUVVVWYZ][[_`^^ada^WG849368@CEKLLKJJMOSEDIGECDC?AFKJOQMMD204)5URLdxs^Qw§œcP¡†gnrgcib[frwtsxzi\hsxusrolnsqmmrtqnnrjayœ³¼¸ÁÉÅ¿¾¾ÀÀÁÁÂÃÄÄÃÂÂÃÅÃÁÀÂÃÃÂÂÅÁ¾¿ÂÄÅÅÂÀÂÅÃÅÇÇÆÈÆ¾»¼ÀÀ¼ÊÁŒrqrsspoojijnonnqk^VT`nszzzvt|zar¦•kpyqqwoqrtuvvvuttwyxy{yuqxyxzqbÖèØÞÛ½¾»ÁÒÜÞãÝÜæêäçæØ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€tÄÖ¼¸¬”Š‡Šˆ…‡ˆ„‚€…ŠŠ‰ŠŒŒˆˆ‰ˆ‡ŒŒ‰Ž…|›ÄÌÇÀÂÆÂ¿¾º»»µ²¹¹°¬¯µ»º³­«­³«­³±­®¯±®¬­±´²®®°³³³¸·­°´µ±­°°­°®¡’–› šž§¨¢¢©ª¬²²®³µ¬£«¨¥ª¬­³µ¸ÅÌÀ²¬ª©·¾¹·¼½·µ¸ÂÇÇÀ¼ÆÆÆÂÂÆÅÇÏ˪‡„Œ‚y„‘‡nXVYXWXWXYWSRTURRTPE>>>=FU]YVXYSSYZVW^YY\`a^^adZF1,47457:>ADEEJIJMMKLQOFCBBDD?HHGLLZ•ÔìèçëìÜÑÝÎÊÅ } ÔÚÑÒÔÒÎÓÙØÒÕÓÐÒÓÔÕÕÓÓÕÕÖÖÒÒÔÐÌÏÓÓÓÍÓÔÕÊÏÙ½‡yƒƒƒŒŠ¢ÌÏÇËÊÌËÎÇÈËÌÌÒãØšlkfVr®ÎÌÔɨ°ÆÝÌŒakpghfglmlmigiqmjkkeelnljigefhnnheihgjpkdtzU>IC,&(&(+-)*'%'$"%&)+,++-.1+&#! ## !)+)+,)##/DW^^]\\[ZZ]^`^\Z\]Y\__][\^__]\\\\]KKKJJJJJHGFEDCBB??=:62.,,/'5XXNcws]Qw¦›`N}œ„ipqichaZfsxnwzsa[ittrrqpqqnlnprrqomxqf|’˜­»º¿ÅÃÂÄÁÀýÀÆÅÀÂÇÅ¿ÀÃÃÃÿ¾ÁÃÄÄÁÁÅÄÃÿ½ÂÅÁ¾ÅÃÂÈÆÀÁ¼ÁÄÃÃÏÃousoqqmlnnmklnood[[[`muyy{yv{u^t«žpnyursvpqvwuuwwyvruwvvxvu{yuxpd—×äÝÚÍÎIJ§¸ÉÒßãßÞäæâèçÖ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€n¼Î²®¥ˆ„…‚‚„}~€~€…‡……„„ˆŠ‰…‚†}¤ÍÏü»»µ¶¸¶µ·´°°®¨£¨®¯ª§©©§©¨¦§«®®­§§¨ª«««ª¨®¯­®²­¦«®µ¯ ¤°¯¬¦›”•—•“˜—™››£«¨©ª­­©¦§©¬¨¦¬¯®¯´²¹ÂÀ¶­¨¨°´±²¹ºµµ¹ÁÃÃÀ¹¾ÁÄÅÅÅÂÃÊÊ¡||ˆ}Š•‚hVQX[VZWVWWTSTSSWXL<6;DLUXXXVUWYWSTYZY]\]^][\`RB30368;569<@CFGIHHJIFHKFCDB<>DEJJEDNNg®âïêêç×ÔÔÌľœ}¡ÔØÎÏÑÒÓÖ×ÓÏÐÒÖ×ÒÏÓÒÐÒÕÓÑÒÒÒÒÕÔÏÑÔÏÎÒÒÕÌÑÚ½‰{………‘Ž‹¥ËÐÌÌÆÉÏÌÊÌÍÍËÍÜØ›mjeUt²ÑËÔа³ÃÖÎŽbjphiginonoliknmllkgeilmmjfefhmnifhggkihimqW8;D7 &&)#&)(()&!"'),-,-./.+&! #&'#%&+/+)/0*"+CX]]\\\\\\^\Z[\]ZXRTUTOLKLGFEDDDDE;;:87543....----.-+*)+,-11) 7UTLdxt^Rx§œaM~¡‰jorhchaYfsxxvuse\jwtomnoqrpmoqrrqnmrkay˜®½¸¹ÂÅÀÀÁÄÃÀ¿À¾¿ÃÆÃÃÂÂÅÅýÁÂÁÂÁÀÁÁÁÅÉÃÀÄÉÇÆÁ¿ÄÉĽÀÃÃÁÀÍ‘ousoqqmlmnopppoofZXYapuvtwut}{`o¦™lkwutvsvywqqsuuwxvsstuwutzxuwod˜Øâ×ÔËÑ׸¦¼ÏÍÖäãáåæâæâÑ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€lºÌ°ª¡„„‚€ƒ}y|‚‚}~„ƒ€‚††…„‚{¬ÓÐÂÁÁ¿º¹º·´¶¹¶±¯®«©°®¥¥¬¬¥£¨§¥«¯­«¨¨ª¬¬©©ª««ª«¯ª¦¨««°¬¡§²±²¨ž˜•“‰Ž“˜˜˜›Ÿ¡ ¡¡£¥¦§¨¯®¬«°´´±·¹½À¼®¤¤«¬­«®±²¯²¶½½À¿¸¸¿ÃÄÄÁ½¿È¿”t}Œ„|‚Œ}m[NT_`\WTUVTTTTSXWI:BGIKKMNMIHIG@@ABGKHPQOESOK‚ÒõìêëÖÓÔÎû›~¡ÒÕËÎÐÒØÚ×ÕÌÏÑÒÕÕÒÒÏÍÐÔÑÍÐÕÔÒÐÑÓÒÑÑÎÏÎÓÍÒÚ¼Š{………‘ŽŒ«ÏÒÉžÅÌÉÉÍÎÒÑÐÛ×›njcTw¸ØÌÑ˪¯Ã×БciphjjinonokiklmmkkhgiimnjfefglmkggfhmlkkcZchYC:'"%&+'%)(')&""$&()*+,-+)$#)*)').2-,3/' #:NRQPNMKJIB@>>@@?<9::840/./.-,++,,++++++++++,,----000000//11+#:XVNdyt^Sx¨bL~¥jnshchaYesxyutwj^hvyplmoopoopqrqomlpi`x˜¯¿¸»ÅÅ¿ÃÆÄ¾¿ÁÀ¿ÁÄÂÃÇÄÁÿ¿Ã¿¾ÃĽ»ÀÂÃÇÆ¿½ÃÉÈÂÃÆÄÄÅÀÄÅÄ¿¾ËÂ’ousoqqmlnlkjjknpfZWX`ouvtwtpyy`o©po{wtvqsvvvwvqmttsvtt|uusywuwnd™ÙàÒÐËÔìʰÁÓÊÑèçäæåâäÝÊ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€p¿Ó¸¯£†…ƒ„†ƒ„ŠŒ‰†‰ŒŽŒ††‰‰ˆ‰ˆˆƒ„~¬ÒÏÊÌÍÊÅÄÃÀÀÀ¿¶·¹´³º¸°­²±ª«®¬©ª­®¯®¯°±°°¯¯°­«°±­«±³·³±µ·µ¶º²§™“‘–——••˜ž¡žœ¢¦¤¤¤ž¥¤¤¦§¬®¬«±µ¸µ¥›Ÿ¤¥¦©¬¯°°«°¸»½½¶ºÀÀÀ¿¼º¿Ç¹p{Š…}{…xfXT[^\^WRSUUTTQMOPC9@MSTVYYWWXWTU[[VUYZ\YV\bYI886203675558BGIHNRRRSROQJKQUYXPQNLMUQIRPY”âìĹÆÇº³–u‘ÄÏ¿¾ÂÄÁ¿ÁÃÂÅÁºº¾ÂÅÅÂÅÌËÈÈÉÉËžÄÊÉÉÍÊÉÑÈÅÍ·ˆy„„ƒŒŠ«ËÒÏÊÄÊÉÃÇÇÆÍÊËàØ›mjeUt²ÆÌßÍŸ²ÍÑ͘gfrlgfinonokikknnllifgkkkigfgimiihfhlljsdaŽ©‹qaOBDRT>*"))%')%"&%%'))('#"%*)$%)'(,-.5:76431,#!%&(''&&%%$%#!!##!$"""%$! !"  "$%$#"$$$'@XSLdxs]Rw§œ`M}Ÿ‡jorgag_Xdqv|wvwhZgyxrppnnnkllmnprstpi_w–¬¼´ÂÉÂÂÆÂÁÂÂÃÂÀÂÅÅÀÀÂÂÂÁÂÂÄÈĽ¿ÃÁ½ÀÃÁ½ÁÄÂÀÁÁÁÂŽ½¿ÃÄÂÁÍÂousoqqmlkgimniimh[WV_nvxytpr{u]t¥˜kiwuuxtpqtwxuptvwwwxwtpvvvvz}na”ÔàÙÜ×ÞéàÔÙßÝãæèåÞÞæåÒ¼€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€uÂÜ´ª™Œ‰‰‡‰Š‡ŠˆŠŽŒˆŒŠ‹ŽŠ‰„ƒ­ÕÕÍÆÅÓÞÓÆÉÄÊÉÇÌÉ¿ÄÀ¿ÀÀ¾¹¶¸¸±¬²·¶´´´´²³µ´±±·´­­¯¯°³µ¸·²¯±´º¹ ™ž˜š¡˜–Ÿ£Ÿ¢¯ª­°®°®¦¤¬ª¦©§¤¨¦¤­³ªž™•š˜”“˜œ™š ¨ª®¯¨«´²µµ­­µº›ukvrs~}zŒ\LW^ZVUVWUQQSIA?>;;8569:84889;?CFHMPPLLPTTSPQQORXWQOXORYMSRRiºç̽¾À±«”zšÍØÆÆÍÏÈÆÍÑÒÍÇÆÉÈÅÇÊÆËÔÑÈÆÈËÄÃÇÅÃÄÅÅÃÃʾºÃ®‚t~~~Ї…¦ÌÖÍÅÄÌÈÒÏÉËÕÑËÜØšlkfVr®ÉÊÛÍ °ÈˢggslfeglmlmigilpnjiiggjmmieehjnhhhfimklkebgoqdEEYPIQ;*$*("$('$%$$%''&$$'+,&!#()$$(+397740/.*""$"!!%%%%%%%%++,-/01155568:<>E<9>R]TQfzv`Tz©žaL~¤Œjnsfaf_WdqvxxwscZhuysonnrrnrrponnnnvodz–ª¹ºÁÈÇÆÇÃÀÂÃÆÄÀ¿½ºÁÅÃÁ¿À½¾¿ÂÅÿ¿ÇÄÀÃÇÄ¿ÁÄ¿¿ÂÅÃÀÀÿ¾ÍÄ”ousoqqmlpkjnnklrg\ZX^lv|tvvuyrYn£™op}yuutrsusrtutwxvvttxqwwwv{~ob•ÕÝÓÖÕááâáäããéåéæÞÝæåϹ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€tÃ׿¹°›‡†…ˆ‹ŒŠ‡‰ŠŽŒ‹‹ŒŒŽŒ†‡‹ˆ†«×ÙοÃÎÍÍÒÐËÌÈÇËÈÃÄÄÃÃÅÆÄ¿»¼½µ±¸¼µ°´´´´³²°¯®¯²³°­®³²±²²±³¶´¸¶Ÿœ¤œ—¡¢Ÿœ›› ª²¯¬®²°ª¥¦«¬¨¦ª­®«¯±®ª£–Š“”’“˜™—™š›¢«¬©§¦ª´·³«­·µ“pnwpt~}p|nSNZ`YPOSSQQPB<=ACLVWUUVVVWWWWWSNRYXQ[WC5<=8;<=74:;8:<56<=@EDLNQQRSTTYTQQRUXWQOQURNLILQV†ÓÙ³½½³¥Žy—ÌÔÇÊËÎÏÌÌÓÕÚÛÓÐÐÊËËÐÒÒÒÎÌÑÔÑÍÏÓÑÍÎÔÎÎÑÌÈÙņr}}~„¢ÏÐÆÏÏÌÊÊÊÊËÓÎËÞ×—nodVz´ËÉØÍ¥·ÑÙÉ•bhthhfhkmmkihhllkklhefjjjiiijklnkebejlijhg_fviG^jL?H6$$$%&((&$#"""%((%',-+(##&"%),-035355/-/&!&'% " !#$$%%%%&(*+.10--279;989:;=@BA9>IMQVWUUUVVVVWUUSRRUXYXF309??>@948;859957;:=DGINQRPPRUSTWWRRVVPRTSMJGBOROj±Ð¹³µ­£z–ÈÎÌÏÎÏÐÍËÏÍÏÐÎÓÖÌÉÍÐÐÐÔÒÌËÐÏÏÔØÔÏÐÕÐÑÔÏÊÙÃy†‡Œ‡ˆ¨ÎÒÊÈÃÅÇÊËÈÆÏÏÎÞÛšmkaU{¹ÍÈ×Ѭ»ÏÓ̘cishgehkmmkihhmnnmjfgllnomjijmlnmieeghmniifgme`th:(31%%$$%''&%#$$$"#%'*.,'%$%'%$$)/3216310.-&&+-*()++*-36533369<@@@@ACEFGIIEEINPNNMMNRUVZZTW\^b`bb_]_decfgjfd^RTexv`Ry§šdP{œ‰knqhagc[epxuuxyh^jtspqpnoqoqrqpppposg_|“˜­º¸½ÆÆÄÅÃÄÄÄÄ¿ÀÀ¾ÁÀ¿¿À¿¿ÃÆ¿ÀÆÄÁÁÂÄÁ¿ÁÃÄÄÄÅÂÀÀÂÆÇ¾Ãû¶ÌÅ‹kttqrqmmikoojgjpf]XZ`mwxswwtzu]q¡gmwtvxvussuywtvtutsuxvtxwxttype‘ÉßÜ×ÖãæÜßéæÜÛàåçÛÒâãÆ³€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€sÁÕ¼·®šŒˆ‡‡‰‰‰‰ŽŠˆ‰Š‰Š‹ŒŒ‹ŒŽ‹‡‰ˆ…¤ÐÕÉÉÑÔÏÐÒËÑÍÌËÉÊÎÏÍÎÍɯľ¾¿¾³­¸Ã¿¹¹¹¸·µ´´»µ¯®­­®±³°±²°±³²´´¡’š¡žœž¡£¡š ¯­®¯ª©¯°¦¢©¬«ª¬®°¬°¶²¡”‘ŒŒ“–’˜ žœ¤¢¡¤¤¨®«¦¨¥‡lkmfr€rn{…sZU[YWXVROKB?;CQUTUVTTTTUUVVSVVQOSY\H3-6:=?9<4389556646:9KTTQPQSSSTTUUUUUXUPSVJ7&'-36:==87;91054335;@ABDHFGKNLLNONRVVWVSQUUI?CLNUaLEŒÊ¼¢¤Ÿ˜ˆv“ÆÌÃÇÆÅÌÏÍÊÎÐÒÏÎËÅÊÒÐÌÉÌÕÖÑÍÒÒÐÓÕÕÕÊÌÔ×ÔÑÝÁ‰z††ƒŒ‰‹«ÊÉÇÌÃÆÑÏÒÑÏÑËËàÙmidVxºÉÎÞÍ¥ºÏÍΘchtijjhkmmkihhhklkifeilljhfeggmklljfhllljgd`jƒn1$&&#%&$""$%&&%# !$%$'&#!$%&('$$&+./.0242140&"5N[]\a_ab`[[_Z^ca][^baa```abcege`^adecge]]ce`cc]\]^gh`hi`\`eeegf^^^RNgusaSu¤›bP~žˆimthagc[dqwuvzwdZivqqooqmkopnnoomlnti`xŽ–¬¶·ÂËÅ¿ÃÄÆÁ¼ÁÇÄÁÁÁÎÍÄ¿ÂÀ¼¿Ãľ¾¿¿½ÂÁÀ¾¼½ÁÆÃÂÀ½¼ÁľÀÃÁºÆÀktuqrqnnjhiklllmd[VW^kuvtrsuyn[y§hovquwwuuttstvrutrtwvvvuqtuvxkj”Ñå×ÍÑßãÝßããàÜÖÔÙÜâìÙ²¤€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€rÃÛÅÀ¶Ÿ‹‹Šˆ†‡‹ˆ‡‡†……†ˆˆŠŒ‹Š‹‰Ž‡„­ÚØÇÌÒÕÐÊÈÊÎÓÌÅÈÉÈËÌÎÐÐÍÊÆÅÅÍÆº¼ÄÅÅÃÂÁ¿½¼»»½»¹¶°­±··°°´±®°±´¯¡–™žŸ œœ¡£ŸŸ©­¯³³¯±®¥£«°­©­±²¸³±¶º´¥—”“••””’‘’‘‘”˜–›œž¢¦ž…hjz|zxxtxqu…€fWWUSLB@?;;MWUTTSTTTTUUVVVURSXXL6&'-07ENKGC?>>4-/6666;CCBEHDDJMLJLNNQSRTWVUYUG;BMQOD9]°Ð°¡ ›”„s’ÅÍÁÅÅÆËÎÌÍÎÍÏÏÑÏÈËÒÑÑÎÎÒÔÐÒÓÏËÍÏÏÐÇËÒÔÐÏÛ¾‹z‚ƒ„‹‡¦ÑÏÄÍÌÉÈÌÏÏÏÐÈÄÙÖœlieVv¸ËÑàϦ»ÓÔÍ—bgrikkhkmmkihhooljheeihkmlgffhkklkiikomlgjiZ\tQ%#*%%"&%#"#$%%%##" #$#$$""%%%''&%'),./3/2752/+*#)BZa]Y\\^a`\]aZ_cd`^^_bba``abcdfd_]adefhe_]ab_bb\^_ahhajkb^eihhig^_`SNeus`Rv¤šbO|ˆimrhagc[epxtuyyf[hssnpspmnnqnmppllovk_v‹—¯¹´ÀÇ¿½ÆÇÄÀ¾ÅÉÀ¼¿ÁÁ¿Ãý¼¾¹½Â¿¿ÁÂþ¿ÀÂÂÂÃÄÅÃÁÀÁÄľ·ÂÉÁ¹Ê‰jstpqplmkjjllllmd[VX^kuwvttvzoZv§—mpytqstvwxvuttttvvuwywswvwssxoc’ÓæÕÑÚåãßßáßààÛàæâãëÔ«¢€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€sÃÙþµŸ‘†ŠŠ‡††‰ˆ‡…†‡†„‹Ž‹‰‹ŽŒ‰Œ‰¨Ó×ÍÑÑÍËÌÎÐÐÒÐÏÏÌÉËÌÈÈÌÏÌÉÈÄÉÆ¼»ÁÇÉÂÃÃÂÁ¾»¹¹¹ºº¸´´·¶¯°´²¯²´¶¯ –šžŸž› ££¡¢®²±±³µ´¯¨£¨­­¯²´´´´·¼½´¤—ž˜––”•—”””’’””“—˜—–š™š¢¢‡nrxmltoqor}~qcXROI?:=>FRVTVWUWUUUUVVWWTQSWO<*#$0:DSYRKHC<:6..6;;9;ABDJGCDJMIIMMMPQOQVWQXUC8>GF2-K–ÙÑ¥¡–Ž}mŽÄοÂÃÆÊÉÉÎÍÊËÌÐÎÇÊÏÐÓÒÎÐÕÖÏÎÌÎÑÏÌÍÉÍÑÏËÊ×¹‹{ƒƒ…’ˆ¨ÐÎÂÌÔÒÇÏÏËÇÌÈÆ×ÑšljhVr´ÐÌ×̦¹ÒØÏ˜beqgiihkmmkihhllklnkggjlnlhfgjnonjghkmnmghhc]N."'("!!#"#$%%$#!#$$#"!"%%%&&%%&()(').25037511//+4L^`\[[[^a`\\__`bba```_^]]]]^_bdb^\`decca``ceffe_bfgkidlmc`hkhghf\^aUOdvu^Pw¥˜bNy›ˆilohagc[dqwuuxwf\hquopspmnopoooonnnqiby›°·´Àƽ¾ÉÈÀ¿¿ÄĽ¹½Á¿Äž¾ÄÄÀÁÃÃÀ¿ÁÁÁÀ¿¾ÂÅÅþÀÁÁÄËËÄ»ÄȽ´ÈÄirropokknnmlnpold[VX_kuwyxvw|qXp¦–loytrtvvustutqusuwuvwvtxwxttypa–ÓàÖÕÙâäáßÛØÝáÞÛßÞßæÓ²©€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€wÄÖ¼¸²¡–‰Œ‹‡„„…‹ŒŠ‡ˆŠˆƒ‡ŠŒŠŠŒŽŽŽ‡‚¦ÓÕÊÓÕÎÎÒÑÍÕÏÎÒÑÎËËÍÉÉÍÌÇÆÈÇÅľ¹ÁËËÈÇÅÃÁÀ¿¿»¹¹»»¸µµº²²¶²®¯²¸¯Ÿ—šžžŸ¢¢ Ÿ ©®ªª°´®ª­ª¨§«°²°®®²»Äø©Ÿ ž™™ ž–’“–‘‘–‘•Ž‘˜™™œ˜‡nilkotvqqtrlqyy]SMH?=DJUXTQVWUYUUVVVWWWSUVO@0('(8GMMJC>;;>@EOFCELLGHNNNPPOQTUY`YA2;C?;RÓïÑ¡••‘ŒoŽÁÇÁÃÄÆÆÂÁÈÄÄÉÎÒÎÅÇÕÐÑÑÎÑÖÖÓÍËÒ×ÒÐÕËÏÑÍÇÇÓ´‡{‡…‚‹¥ÄÌÏÑÊÊÇÍÎÊÇÏÏÈÒÔœjddTs¸ÍÁÏΫ·ËÓЙbeoegfhkmmkihhkmmlkhgkpnlifgikimnkikmlknhcm‰C%$#$#$#""#%&&$"""#%$!$(($$&&%*(&')-./64531340//;Q_`_caacea\Z]db`_`aaaeeccbcddbdc_^bfgifedddfhfd^afgidgoncailgjkg\^aUNcwu]Ox¦—bMw™‡jkmhagc[dqxxvwue\irrpmoroovoqqnnppmsjawŽ›³¼¸¾ÄÁÂÇÄÀÃÁ¾¾ÀÀ¿Á¿¾¾¿¿¼¾ÄÁ¼ÁÅÀ½ÀÀÁÁ¾½ÁÆÄ¾ÃÆÄ½¼ÅÇÁ»¿ÆÄ»Å¿hqqnonjjipqkinoke\WX_lvwwvvw~uZp¤’kqztttstsqrvvtqvurtutsxwtwwx{ndžÔÛÖÕÒÚçààãÞÜßâàÜàãäÚĸ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€qÁÙÆ¿²ž–ŒŠ‹Š‡ŠŒ‰†‚†‰‡†‡ŽŠˆŒŒŠŽŒŽŒ†…¦ÌËÄÍÕÓËËÏÒÒÏËÊÌÎÎÍÏÏÐÑÏÏÐÏÍÈÅÄÂÁÈÏÈÄÈËËžÄÀº½Â¾»º·³³³´´³°®¹µ¤—™›› š›œ ¡œ§ª««§©¯¬¢¦«¨§°²¯¯µ½ÀÅù¯¤Ÿ£¢ –’™“ŽŒ““Ž”•“”šŠm_ksnmsqhouki}ŽyVKQG@JT]RVUTWQRTXXRRXYVX]W@65-*+CLG;,*,;B>30246=?88DEEPIBEMLIJJJLNONNQTWVYC/9B?h´ÑáæÂ¢’•Œ†|nŒ¾ÇÀ¾ÁÆÄ¿Ã˾ÂÉËÊÅÂÌÖÏÏÏËÍÓÓÓÒÍÐØÓÌÒËÍÏÒÍÐѽ‹z‚€Œ‹‰ªÉÎÎÐËËÉÈÊÍÎÎÇÆ×Õ™ljeWy¹ÉÆÐ˯½ËÑǘaipifigllklifhmllkhfgjlpnihddhlnomihkolon_|·™>$#$$ # !""##$$$" !"" &')('&&')&&)++.32454477657;F`bUbdabdb]\_defedcccadgea`ejcikfbcgigikd]ekelg`]^bfheig_\__ZY_[]b[RMg{u\Qv¤›cSz™‰ijsk`b`]hqtstvwh[gutpqqooqqppqqqponvoe|‘–ª¸¸¾ÂÁÅÆ½»¿ÁÂÂÂÁ½º¾ÁÀ¿Ã½¼½¿ÁÂÂÂÁÀ¿¼½ÀÀ¿¿ÀÁÂý»¾¾ÂÄÀ¼ÌÃŒkqtqoonkjkllmmll^YZV[lysutx€tYt¥‘gmvssstvspruuuuuwsosxwwwutou}mfšÒÙרÒàáââáÝÛÝàÞààéâÌÅÄ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€wÅÚü±ž–Ž‹ŒŒˆŠŠ‰‰Š‹‡ƒ†ˆ‡Š‹ˆ‰ŒŽ‡…¥ËÌÅÑÏËÎÌÇËÑÍÌÎÎËÌÏÍÉÌÓÒÎÏÒËÄÅÇÂÁÈÌÆÈËÅÄÆÁ¾ÂÂÄÁ¾ÀÁ»´¶¶µ±¯¯°µ·§””˜—”•› ¦¡¢¨¬©§¦¥«®¬©­·¿Ã½ÄÇÍÉ»±¨­¬¦œšžž™š¢š—ŽŒ”ŽŠŽ“•“ƒjbqxmgmoktxpv‚ƒ~v_JFNTV_USOQSOUVVTSVXVR^YL835-,7DBB@1''29;88975;A@:;DKMHBEMMKLMNNLHINQQQV^M8145,+AE>BL?0./29>??;65<<9;CE>322355313003750+,3?P]\TScvr\Rv¤ePv–‡koug`fb[epwwwyyj]huokmpnlmnpooonmllti]v‘™ªµ¬¾ÌľÃ»À¿Áý½ÂÁ¾¿ÀÀÃÄ¿Á¿¾¿ÂÄ¿À¾¾ÃÀ¼¾Â½ÁÄÁÂýº½À»·Ç¿ˆkqtqoonkiijjjjkkfXVX_kt{wvsszpZx«”hnywz}yttusqrrpuuqruvvvvvupu}ldŸÚÚÒØÒ׿ßÜåìàÕÙçßáèà×н€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€rÃÜÈż§›‹‹‰‰‹Š‰……‰‹‰…‚ˆŒŠˆŒ‰Š‹‹…¢ÊÑËÐÓÐÌËËÈÐÑÐÍÊÌÏÒÍÍÍÍÌÐÑÎÇËäîѼÆÓÑËÌÊÇÈÇÈÊ¿ÂÅÃÀ¾º·´µ·º¹¸»¸£‘•œœœ—›››œ›£ªªª§¤¨«©¢¤¦§§§§§««´Çɽ¶±¬­­ªª«¨£¡¤¤™—’–’”–“ދޒ‰t`\^[^hqpqtw}}x||fHCT^ZXWUSTTRUQUXWTSUWM>4286)*>EAAEMPN79FLW`WOfws^Ssž˜`Kx›Šmpqd`hcYbq{|xvui^iuxposspppqponoprspi`y‘˜­»¶¸¿¿½Â¾¸¿ÄÂÀÁÀ¾ÄÄÁ½½¼¿ÅÀ¾À޾ÄÅÁ¿¼º¿ÅÄ»¿À½½ÁÃÁ½ÀþºÊŠkqtqoonklkkjkkmmcWTT_pwvz{wvzpZy¨foyrsvouvsqoqwvustyvsutvvwrv|ke—ÓÓÁÃÉÚáÜÞêê×ÏÚäÞæßÖçæÂ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€wÇÝÆÅÁ¬”ŒŒŒ‰ŠŒŒŒ‹ŠŠ‰††‰‰ˆˆ‰‹‹ŒŠ†¡ÉÑÇÑÏÍÓÒÍÐÎÌÌÑÑÍËÌÎËËÎÎÐÐÎÌÐéôÛÃÉÖÓÊÍÍÊÏÏÌÂÉËÈÆÄÂÁÀ¿½¼»»ººÆ½§–—›¤¤Ÿ›¡Ÿ ª¬©©¬®±¬£¡¥£§¯­©®°¬µËÍ»±®¯°°±¯«§¤©®©¢›–Ÿ£˜’–™•‰p[[`_^hojdgilu|xuzybQVXf^RRVXQTWTPSXSI6/034-'3HJ:6IYVH/47BJIGGJJIJJJKMMLJJLUYWRSSG^©ÞåÝÄŸŒ„~}xnŒ¾Æ½¾ÀÀ½¼½À»ºÂƾ³¼Ü⺰ÄÉÆÆÄÈËÑÐÊÍÏÉÏÍËÏÍÐ͵„w…‡…ˆƒ«ÎÐÇÅÆÌËÇÈÉÆÃ¾ÃÚÖšljcTuµÕÍÇ¿³ÆÐÙÍ‘]nqhhggllklhehkmmifghiiikkhgggfikjfgkooogijcr…T<8*!"&##""!! #!!##" "$%%%#&&%'.1146656897960!2i†„yW5)(%"$&')))(()-../03576?BGFAAGHDCHIGIEGJKLNNLQSVVOPTIX›ÚêÜÁ›„}{ti‰¼Å·¹¹¶·¹¼¼¿¹¼À¾¹ÆäïÀ­¿ÈÅ¿ÃÈËÊÉÍÎÉËÈÆËÊÎ̳…x†‡†Ž†¦ÌÑÈÇÆÊÇÆÁ½¸º¹À×Õ™ljeVx·×ÉÉÆ²½ÆÍË`qodhjimmlkgdfjlljgfghlmkgdcejlmmkhgjmlmihdax‘wF51$ "$#"""! "#" #$$"!!"###!"%&$(-1146656897:903k…ƒŒzZ<4;=86KDA?>@FHECEBD@?EFEGCJNMLNOMPRW[OLSIX–ÛîÚ¿„„|xqf†ºÄ¶¿À¶¯³º¼º¹À½»ËìíÈ·ÂÆÀÁȾÂÀÂÎÎÊÌÊÇÆÊËÏÍ´Š|†…‚Œ†‚£ÍÕÎÊÅĽº¹½ÃÌÌÌÜÕ™ljeWy¹ÓÅÎÔ¼ÀÆËÐ\oqhiggllklifhijllifeghkjhjgeglkjighikjmki`c}’c9.-"#$! !!""#!%&$!!"#"!!"$$#"%"#'*+/3467569977>41k„Ž‚jYW[\]^_```aadbaacdeedbbeedeicdabigcefdcdeecacabhmnkgG9JSWZPSfvscXu ›_M£†empgagbZdpwwtssf\huxmjopmoqrqpooopprh\u—¨³±¼Á½ÁÆÂÂÀÀÁÁ¿»»¾¿ÀÃþ¾¿»¾À¾»½ÂÀº¹¼ÃÀ»ÂÉĽ½À¿½Äƽ»¿Á½¹ÉÀ‰kqtqoonkkjihhjlmdWVY_jpuxytptjX{¡Šcq}tswpqqqrppswrqstvxusuwysw{inÀ¾ÒÑËÄÉÚÞÐÑÞã×ÔæäÚêèÑ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€s¼ÒÃû­ª’ƒ‡Œˆ…~…‡……„€ƒ‡}‚€ƒƒŠ‚ƒ„}—ÃÎÃÅÇÆÂÁÅËÆÂÃÆÇÇÇÅÃÄÃÄÇÈÇÆËÖèíèÞÑÎÄÄÅÃÀÃÆÂÀ¾ÁÁ¼½¿¹»»½¿»³µ¿¾À©–˜ ¤ž¦©¤¢¥žŸ°·®¨ª¬­­­¬ª¯±­¯³°³»ÄÏÎý¸´¸´°¯µ·ª«³²ª«ª¡£§¨¤¢¥¤ž›š—ƒlb[\gggie`fonpq{wx}xz™jUPQSVRQXT:)1565/)')+CHB8@OK:2+$!5F??DABDECDGBA@ADFFEJHGGJMOONRWYSPQLHŠÚíÞÈžƒ€wxte¹Åµ¸Á»µ»½º·»¸½¾¹ÌèéÎÇÄÿ¼ÌùÅÌÇÇÈÊÌÉÅÉÌÐη‹z…‰†‡…¤ÌÓËÁ¸¼¹¼ÅÇÉÒÊÃÚÖ˜lkdSyÀ×ÀÅϾ¾ÒÑ͉boqklbelnljedikmnnlgdgmiffhhijkmkikijpkmhk_e••Y0+%# ! !"#$%%$#""!"###!!##!!#&%%())-39328:648<>13h‚‡‹‹‡„s`a`_abbbccbj`dccjigfecbeghidedcdbdkcmjeeegafejonkhcKEMPY_TXewsaWx¡—dPx–…knoe`gd\epvxtqoe]gpupnmloqommmnooppjh`vœ¯¶´ÁÇ¿¼ÀÀÂÅÁº¼Ã¿¹¼ÃÄ¿¾ÀÀ½¾¿¿½¾Á¼¾¿¿¿ÀÂļÁÄ¿¼¾¾¸»ÂÇÀ¸ÆÀŒhnqonnnkmihiiklhcXUW`ouwxwprym\|ŸŒlqxutvuqnrwuqtrrssrrrswwtvtrukgš¿½ÆÚØÔÉÏÑÐÕàåâÏÚçäßëëÕ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€yÆÛÇÄ»©Ÿ’ˆ‡ˆ‰„{‡‡†Š‹…‚„‚€€ƒ„…‡†„…€ÊÔÄÊÐÒÏÌÍÏËÌÎÍËËËÉÊÌÌËÊÉÉËËÔåìêâÔÎÊËÍÌÈÌÐÍÊÆÈÉÄÃÃÀÀÇËÈÂÀÆÎÇ號£¤¡Ÿ¤£¤¤››©®­®ª¦¬²¯§§¯²¯°´²µ»ÁÌÎû³¸¹µ±°µ¹¯ª«´²¬¬ª¨­¬­©£¡¢žœŸ’ze]`irihmiacktwxvst{„’…gSRUPKV[E0-0354/(%(,AIA6?PM?4)%&087>C@>>>?ACBA@ACEDDFFGJMNNMSORWRQRJM~ÍñåÇ›€zzwmŠ½Ë·¼À¹¸¾¼½½À»¿½¯ÁèðÓÈÂÀÀ¼ÃĿȎÂÉÍÍÈÈÑËÇÈ»…{‡†ƒ†€„¬Ä½µµ¶ÃÌÌËÈÈɾÁá×–jmfQvÀáÊÐÔÀ½Î×Òbkpijeelnljfdhknmljhefkhjnkeeljjihgfglnjee_d‡Ž_/&&!# %"""! ##!!!""#%" !! "%&%&)*+/4778899889=15kƒ…‹Š€~mdadfffinmjc`bckoeeiccijhghaegfcadibiffecebeckqlhe`FBKMV_TUewsaWx —cPy—„jnpf_c_Wanvzywtf]htupnooppnoonnnnnnmj`t›¯¸±º¿¹¼À¼¸¿Â¿¿Ã¾¿ÂÄþ¼¾¿½º»¼¿À¾¼º½ÀÀ¿ÀÂÁ¿¿ÀÁ¾¾Ã¹»ÀĽµÅÁhnqonnnkliikilnl^WY[amtwtzutyo\v¨nuxrpsrrpquvroqturswwttwtustxkf”»ÄØðëáÐÔÓÐÓÝâàÏÜêåÚà䨀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€uÆÞÈÆÂ¯¡“Œ‡„‰ƒy€„ŒŒ‹‹‰‰…„‡…„ˆ‰ˆ‰ˆ†ˆ† ÍÔÄÊÑÔÒÐÐÐÍÉËÐÏÈÉÏÏÐÑÐÍËÌÍÍÕäëëãÔÍÎÏÑÏÍÏÓÑÓÌÍÏËÇÇÈÌÐÑÉÅÇÉÆÈç”™žžœ ¢¤¥¢šœ¨®«¬­­«©§¤¦®±®¯³³·¼ÁÌͺ±µ¸·¶±²¸²«©¶¸¯­­ª­¯±®¦¥§¤¡¤ ˆkaiqnebjka^hhiloqpv€x‡ŽuZRSNOWM5-1.033.'#'-;HE7;JOJ9)*00.2>@AA??@A@A@@ABCCBFEEFJMOPSOSTNPRJPÒêܺ”†Š…}vnƒ­¹°µ´­±¶²µ¹¼µ¸¶£µæðØÎÆ¿¾»»ÃÁÅÉÐÏÇÏÎÊÍɼÌÕ®||ˆ…„ƒ“Ä´½È¾¿Ç¾ÄÎν¾ÝØ•hngQu¿àÖáØÃÄËÔÖ•bfohhiflmlkfdhjmmijhfekjlmkgfgkiihedgjlijgefrqU,$% # "!! !""'" ! #'&%'*+,05679999988<.7o„…Šˆ€|tk[Y`ec`^][ECXlmc]hvh^]]XZaaVPWej^OQIDQQDCE@D\omhf^GCLKT_UQevs`Vw —bP{˜ƒhnrhaf`Ycpxwxzyl`ispnqrnjmopponnmmlqk`sŒ™®¸³¾Ä¿¾Â¿¾¿ÂÀ¾ÁÀ¾À¾½ÀÀ½»½¾¼¼¾¿½»»¾¼¸·¾ÆÅ¾¾¿À¿ÂÇż»¿Á¹°Á½‹hnqonnnkjikljlooaXWW]luzqwsrwn_~¦‹jtyqqxrstrpstqwvutuutqqwusqw{kb™ËÔÙåàÛÖÚÜÙÛÞÞÚÓÛåßÑÑÕЀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€nÀÙÆÇŵª“‹†ƒ†„|€‡‰…†‰Š……‡…ƒ„††‡ˆ‡Š†¢ÏÔÉÍÏÍÌÎÐÑÐÐÎÍÎÍÌÎÍÊÊÍÎÏÏÏÐØçíêáÑÊÑÐÐÏÌÐÒÍÒËÊÏÍÇÇÌËÍÏÎËÎËÄÊÍ´—–¡£¢¥£¥§¡›Ÿ¨¬¯¨§¯°¨¦§¨«­«­±±µ½ÅÏÍÁºµ¬³¸¹²®³±¯³º¸µ²¬­¯±­©««©ª¨¥£“tgovlkfdjlij`Z_knqwzvn|މpYWSYJ3.53-.01.&"'/7DG;6FRQ?--83.16>ABA@CB?@@@AAAA@ECBDHMPQPPRQONJJ{¿âáäÊšˆˆ…{tp…©·±±°©­²¯²«¯«¯®¤½éîØÏų¯µ´½½·´³š‹¨ÅÆÁ»·ÄÄ¡tu€‚„‚«ÓÐÅÅü¼½Á»¼½¸±¿à×–ilgSu»ÓÙêÔÄÐÍËÕ˜bdrifkglmkkgdgjlkjjiedkkjhggggnklmggkmiikffii^D-*' !!! !""##!  !!"%"!#"!"%%$&)++.36449;8689;*;t‡‡ˆ†‡€kotWDBAA>;7DSO=,-:==?6;==:,'% """"""!!!!!  !"##!#&&#"#$$%()),07348=;86:9%AxˆŠŠ„„~kmyeN?4672.0+@^T99=7MU?0=81ES93LipW6-LPD85AJQP?79:;;>>==?ABA@@@A@ADHLMMQPPRTFX æëÝäìÅšŽŠƒ~x»ÈÀº¾¼¸¼¾¼¾¿½¼·½ØëçÐÈɺ¾Æ¬y\UVV``Z`—½¸¨¹Ç®„x~„…z„¼áÆÀÍÊ»³°³ÀËÎÓÒÐÜÓšlhcXw²ÑÉÓɼÈÑ×ΔbhvkehhkkjliefijjllgdfjjjjgfgjkijjggjnjgdfgfmeL1"&'%&'#"""""""  "#$"!$(($!"$$&))(*-4899;@<695"N~‡‹Œ‚w|{uz|zkYL=007,@LDHL9/BSB3>93HM34UljS7.6IWE16:1Kgohfd`G4?NV]UVcuq_UvŸ–bP{˜ƒhmribf`Wanvtwxvg\gssrroijoplmmnnoppnh_y’™«¶´¹ÁÀ½ÁÀ½ÁÅÅÁ¾¿¾½·»¿¿¿¾½º¼¿À¿¾¿¾»¼¾»¸ºÁÃÁ¾Á¾½ÁÀº±ºÃÁºÈ¿Šhnqonnnkkikkghkj`WVV\ktytxsuyl[|ƒhuwrsroqrqpsvtttrrsvtqqwusqw{ki‹·¾µ·¹¼½¿ÁÃÃÂÀ¿ÆÂÁÃÂÀÀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€uÆÛÃÁ¾­ ‹…†„„‡€}†Šˆ‰Š‡…‚ˆ†…„ƒƒ…‡‹†ˆˆ‚žÌÕÍÑÑËÌÑÑËÏÕÐÉÎÑÎËÍÊÎÑËÊÑÔÊÔæíëã×ÓÍÌÎÌÊÍÏÌËÌÈÇËËËÑÀŸ“¢µÅÍÉªš˜——ž¢¤¤¥§§Ÿ—›§¬©ª«¬±²ª¥§¨«®°±±²·½Èɾµ­´µ±°±¸½²¬­¶¸¸»¶²±²µµ²µ¸µµ´¯ª¤‘vcf]bf_jzwiuyyzspxxffu—´¡d9,83-220*(,,)+13:BEB>CLRKCHOUVD78:=?=<<<>ABB@AACA@AEIMNPPSTUGXŸèè×âòÑ¤ŽŠƒ}rŒ¾Ë¿¾ÂÀ¼½¼Àý¾»»ÑéæÕÍÆ³¸¹ŠTObos‚~eaƒœ“¯Ð´‹~„‡†…±Öƹ³´¶¹ÀÍÒÑÎÒÍÍãÔ˜jieWu±ØÊÑ͸½ÔÝÑ”bhtidehkjjlieejlkjiffhkljghjidjjihgfhmmkfdgclmZ?+-0--+))(''&&%! !#$%#"$''#"#&&(*)'(,09=::==850")]„„ˆ‰szƒ}~u|uaL=79=;>RM2/CJ@563:RN05\oeM4<>KVC01/A_qjdehiH4@MU]URcuq_UvŸ•cPz—„jnpldhbZcpwuwxudYfssqokjnoinnnnnnooog^w‘˜¬¹±·Á¿º½¾½½¿À¼»¿Á¿½½¿ÂÄÁ¾½¿ÀÁÀ½¼½¾»¿Á¾¼¾Âý¾¾»¼Âü²ºÁ½µÃ¼‡hnqonnnkliijikmj]UXZ`lruttnqyn`˜|exzrstlqssrrrsrtvvspswtwtustxkj‹¹Ã·µ¶¸·¹¼¿À¾»¹¼¼½¿À¾¿Ã€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€qÇÞİžŠŠ‡ƒ‡‡{{‰ŠˆŠŠ…„…ƒ‡ˆ‡†ƒ„Œ‹„‡Š… ÎÚÎÒÐËÌÓÔÏÑÐÊËÒÑÊÊÏËÏÑÉÇÍÑÎÕæíìåÖÏÑÓÕÐÈÈÌËÌÏÊÆÊËÊϯ–˜Ÿ«º½¤’—œ™ž Ÿš¡§§ž’”¢ªªª¬¬«¨¤¥¦§§ª¬®±²ºÁÊÈ»´®®¶¶³°¶¼´«­¶¹¸µ®­±¶·¶¸¶²±¶»±¥¦ž…rhall^k{pgpz~{vpmz{gbcz¦¤qE6;1-3/1)&,.+,1::6?NH=ANMCFMUYM:88;<::<;>ABBAAB@@ADGJKJPNQRZNBbµäååñÔ£…Š‚~nŠÁλ¿Â¿¾¼¸ÀÈÅ¿ÃÁ¸ËëéßÔí½Ç“[^m|‹œj[pŽ¾Ô²ƒy‚€}¡±³³¹ËÏÇËÆÉÇÌÖÉÀØÖ–hjgVs±ÙÑØÓµºØÛÔ”chqgcbikjjljeejnlgffhjkjiigeefjkiggeelkojbgejoudQKKKJB642/+(&$!!!!"$%&%##%%##%(()+*((+.5==968<1,"1hˆ‚„„yz|€ƒxsz|z{|o]C>62?B44@>=;55G`H-8`jYC2:Q`U:5=29:;:<@BA@A>@ABCFKOOQKOPEBHl¡àïèΛ†ˆƒ|rŒ¾ÏÂÂÃÀ»½À½Á¾½ÀÀ¾ÏéõÚÐÈ­·Å›jqxy‡™–‘—˜tSu´Ã®~u~ƒ‚†…ƒ ÀÌÌÌÉÈÇÊËÉÌÓÇÅäÓ“eheVw¸ÒÐÜÕ¶¿ÉÌÔšdgofigglmlmigihlmlkhefkkjhgffglhfijhgjkgfggehntrlffijh[NF?:5-.,+%#!)$%&&&&%$#%()(*..,'-5:9534, "Ktƒ…Švpz€€€~y|you|y€ocN:48;9;=8>G<DHMB57AJK49P84UnjbfhdK=FMU]QMbvq]Wx šdQy–‚hnshae`Xbpxpovte^fmnqpllppmnnnnnnnnpjby“§µ³¸¿ÀÂÄ¿»ÃÃÀ¿ÁÀ¼»¾ÂÀ¹¹¿Ã¿»º¼½½¼¹¼À»ºÀÀ¿¿¾¾¾º¹½¿¼·¿ÆÁ¸Å¿‹iqplmljkkjihijklbUOVbmttsvqtxk]€œ{fusorwusrssrqpu|vouvqqsrptutuinŒ®²¬®­²µ¶³­«®®ªª§¨®¯««°€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€rÅÛÁÁÁ­š…ƒ…‰‰~{ƒ†‚‡Œ‡…ŠŠ‰‡††‚„††Œ‹ƒŸÎÙÍÎÍÊËÏÏÌÌÌÉÊÍÌÊÍÎÏÎËÊÍÐÐÎÔäíëßÐÍÓÑÍÆÄÌÐÊÅÆÈÈÄÂÆÍ­Ž–’”šœ–”–˜š›š™™š›š™™˜›¢¥¤¡žŸ¥¥¦¨¨ªµ¾½ÂÁÅÎÎĶ­­´±©«·¸¯¯³¸¶µ³¯³´·¹·¶·¹¹³³³¯­¯¨–zlbdktywtvzyvwwsw{pernW`ˆp;)-*+$10.,,-/15:;:<60+"(Tw}ƒˆwlo~†‡†„{spmsyuy|q]G:56<@;9=::G>457=E?;6:AD5E^B3MdhccggK>FMU]RNbwr`Yx–aOz™„imph`e`Xcpxxvyue_hppnmmnmmnnnnnnnnnpi`x•¨µ­´¿Á¿¾¹¹¼¿ÁÀ¿¼¹»»¾¿¿ÀÃÂÀ¾½»¼ÁÆÂ¹¹À¹¹ÃÅ¿½Åú»ÄÄ»µ½Ä¿¶Ä½‰iqplmljkiijkkkkjcYUWZcovrtqv|n\|{fvvrqsrruxuooutoqussusssquuuvia’ÂÁ·½ÀÂÂÄÃÂÄÇÅÁºÁ½»¿¿º€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€zÊÝÁÁÁ°Ÿ’‡……ˆ‡}z††„‡ˆ…ˆŠ‹‹‡„…„ƒ…‡‡Œ‹‚žÍØÉÍÎÊÇÈÌÎÎÍÍÎÏÌËÌÏÉÊÌÊÊÍÍÊ×éëèã×ÏÍÏÏÉÇÎÎÅÅÇÉÉÿÃ˶ˆ’’”•••––™žŸ™”—šž¡ž˜—™ ¢ ¡§ª¦¡¡¦¨¥¥«®¬¶°´ÂÊ·±°¶³©ª²²ª©¯¶µ´³°µµ¹»¹¶µ¶¶³µ·²­²´¬™hgtxtr{wxz~€znr|udmiTby<*,/4122/,,/28:<;99COSOHJNOVWA78:988=9>@??@AA?>?BGJJIQRRRJFNPN€ÕõêÐ¥ˆ…€{r‹»Ê¾¾ÂÃÀÁÂÀºÁÆÄ½¼ÐìéÙÎÄ»´¯±š}zu~w~€›¥|WgŠ„ƒ‚~‰’‡¡ÌÓÆÈÊÉÌÌÍËÅÌÑÓáÕ•gheUv·×ÔÔÏÁÊÆÆÈ’ahrgidfkljkhehjlkjjhhkhijigefhjmmhfhjgmliffiklnmjginqoc]^[WN=7W\D-%%&&'''%$$%*-+*,/00--4=>6-)#0^zz‰unt€ƒƒ…†xjjlnqpsx{€t_F6D=6468FLU]RObxtaZw›’eQy”gotg`e`Ycpwutyvg`ipnoolkmnmnnnnnnnnph]w‘˜ªµ­´¿¿º¹¹¿À¿º¸»»¼½ÃÂÁÀÀ¿¼¹¼¿À¾¿Á¿º¼Á¼ºÀÃÀ¸¼¿¾½À½»¾´»Â½µÃ¼‡iqplmljkmkihijmn`YWXX`mvuunrzn]} |dsurstqtutrssssqstsuvsturuvwxji¹¿¹½¾ÄÁÀ¾½ÀÅÈÇÂÃÆÈÆÃÅÈ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€vÈÞÇÇÆ²¡“‰††‡†}{‡‹‹Š……ˆ‡‹ˆ‡‡„„††……‹‰€œËÕÆÌÑÐËÊÎÑÍÌÍÐÏÏÑÒÐÇÊÐÎÍÎËÉØêëçãØÒÌÍÍÉÆÌÎÇÉÊÌÌÇÃÆË´’Œ’Ž“–”˜–˜žŸ›š£žž¥¥œ™¡¨©¦¥§ª©¦¤ªª¦¥§ª¬¬«·ÌÑõ±²³°­­°°¯©°µ²²³¯°°¶»»¹····¹»¶¯³¶²®”wuƒrq}||z}}xu{uekfYuŽ~H)++.61110//13989<:69@OKDIRWWO@6699968;=?@@@?>CA@BEJLMMMQSJJUQI€Ö÷èÉŠ‰„{p‰¹È½ÀÅÄÁÃÄ¾ÃÆÅ¿ÁÒéêßÓ¿»´™‰xoxvmumt’Ÿ~`ct†~‡‚|¤ÉÎÉÑËÅÍÎÈÇÉËÈÊÜÖ–gieUu·Ô××ÐÁÉÇÎÉ“airhieejkjjhegfmomifehjiggffgilkiihhjlmkgddgijllihjpqod]]XTM>9WjZ<* $&''''&%$)**+-/0/40,-473,'!4d|x~…yu|ƒ|€rgllfkmonps|ƒ€lWJ60887875776=>1513=<.IfM3AVfjecfM?FLU]SPbxs`Xv›“bPz—ƒimqg`eaYcowwuzwf_fmmqrmklnmnnnnnnnnpg\v’™«µ¨´Âþ»º½¾À¿¾½¼»¾¿¿¾¾½¾½¼¾½»½ÁÁ½»»»»¼º¿Â¸»ÃÀº¼¾¼¿µ¼Á½µÄ¼‡iqplmljkjjjkklll\UTY^gptvvorwl^€zcstrrtqppsusqprrrvxtqvtvsvuxyji½Ä¹µ¶Á¿À¿½ºººº¶¾Á¾¼¾À¿€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€sÄÛÆÇ‰‡…‡…}}ƒ‹ˆ…†ƒ…‡‰†‡ˆ…„…………Љ€œËÖÉËÏÐÎÎÑÕÏÌÍÎÎÎÑÓÊÇÌÏÌÐÓÎÎÔæîéÚÎÏÎËÌÌÉËÏÎÎËÊÌÌÉÈɰ’—’’’’•˜–—œŸ¤£ ¡§¦›™£®¬ª§£¢¤¦¥©«ª©©­²­¯¾ÒÔÁ³²²²°­¬­¯¯«²µ°±´­¨¯´¸¸¶¶¶µ¹·º¸³µµ®²¢ŽˆŠ~ty€~z||zwspvh[xˆsJ/*(+.0/.03565668;;989?EDFLQUN?679898:=:965<=5687BE>?EKH528:7769954:@A@@;>ACCDFILIMSMLRKUŸéòæÎ……~zqŒ½ÍÃÂÅÇÃÂÃÂÂÄÅÆÅÅÓçðáÖÀ›|uƒ€vux|vjokkminŠ‘x`v‰…†ˆ†ËÓÅÆÆÂÁÃÆÊÌÍÈÈÜÕ•gjgXxº×ÛÝË­¶ÆÚÏ—djrhjgfkkkkhehkkjjiffjkihhhigfnlihhihhljgeceimmmjhimmj_[[TPL>6QdibM1$!''((''%%(),.,+.328:3-,+(!!9fvu{xtx‚†|}|ojkfgplfqvxvw||x}ul\IIQONMQS[^RQSTZTM]hZ`ehfdeggO@FLT]TRcwp\Uu—eQy•€hote_fc[douvtxte_irupmoqpnmnnnnnnnnph]w‘˜ªµ±»Ã¾»¿¼¹ÀÀ½¾ÁÀ»¸µ»ÀÁÀÁ¿½ÁÆÂ¼¼½»¼¾»¶¸¼À¾»Á¼¶ºÁ¾¸¸½À½¸È¾‡iqplmljkkjhggilmaVRX`jsvqvtuvh\ƒ”vewvpptptuqortsuturmrvrrwtssyzhjˆ§¦£ª©¨®®®¯¬¬±¹¸°°¸¸°®µ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€tÄÝËÌŰ¡‘‰‡…††€‚‹‰‡‡…ƒ…‚‚††‡‰‰‡‰ƒ„ŠŠƒ ÐÛÐÎÌÌÊÉÎÕÑÑÍÍÑÏÍÐÑÍÌÍËÉËÑÈÕèîìæÕËÐÎÐÐÌÊÍÍÈÆÇËÌÊÈÈ«ŠŽ’““—™šŸ¢¡¥©¦¤¦¢ž¡§£§­«¦§¨¦¥¨©§ª²´¯³ÃÕÕô°¬°°ª©®°¯¦ª¯°´µ®®±±¯®°µ¶µ¶²µ¸µ´³®³·»±˜…~€‚z{~{~~„lefZ@2/+)((//136788;;<;989<77233277--587657:99=AA>;>?BCEFHIJHKRNKSSP†ÒîèÍœ……}si…ºÍÂÄÇÄÁÅÈÃËÊÈÈÅÃÒìêçÄ•vq}‚zmrz{vnphf`WS[juqz‰‡…Œ…{ ÇÓËÉÆÅÅÅËÊÈÏËÉÜÓ“fihY{¼ÏÎÔɬ·ÅÏÊ”cjsijegklklifikmlhhfcblljgffhjnmjeegiihigc`cimkkjgillh_]]VROA8TfdaaL2"'(((('&%((,.-*-32892-,*%%Agqr|x}~ƒyx|{nihdjnff{sptwvw{~ƒ‡smjcg_cfik^UPTXRQ]dcdgieabfhPAFKT]UScwq]Vtš“aO{˜„impe_fc[douvtxue^fnsronnpnlnnnnnnnnpi`x•¨µ¶¼¿¹·¾¾¾À¿»¸ºº»¾¹»¾¿À¿¾¾»¾¹µº¼¸¶¼¼··½Á½¸ÀÁ»¼Â¿µ·»¾»·Ç½„iqplmljkghijjjiiaVQW_jrsuwrrth^…ž{esspswtsrssrqrpstuwsrupvtrrxzfh¸½°ªª´¶³´¶¶²±²®°¯­°µ³«€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€o¾ÖÅÈı¥ˆ‡…††„†Œ‡ƒ…‡ˆˆ„‡‹Š†‡‰ˆ€‡ˆŸÏÚÑÐÑÑÌÈËÒÎÏËËÑÎÉÌÍËÈÈËÍÌÌÊÔæîìâÎÄÑÐÐËÅÇËÊÆÆÉÍÌÉÉÌ­”“–•’—˜™ £›¥©¨©ª¢œ£©§«­¦¢¨®§¥ª«§¬³±²ºË󯀵±²±°¯­¬®²ª«°³µ°ª®³²°°²µµ²º¶¸¸²°±®«°½¾­Ÿ’ƒ€~~€}syzu€…xfN8.-)%'0/2565568645:<;<=AEFGNMNSMGPVJfµíìǘˆ…zsj†ºÌÄÁÃÆÃÃÇÉÇÄÅÉÇÄÑéðÌy{}~jev{svunfQFHFDGJZl“ŠŒˆ‚©ÈÏÄÂÃÄÁÌÎÈÆÐÊÅÛÒ’fihZ|¾ÖË̦µÁÃÄakujidglmlmigijjjjhcaejlmkfegjjjihggikhlkdaflohihgillh_]\SON@8Sk_XlfA$'(()('&%*'(,.--0474-*-*#(Hinp~zz|ƒƒ}{|xjihfjg_k{oluulq€|z{€ƒ€||hXXYZb\RLTXOLSZeeilkfbcePAFKT]UScxs`Wt—dQy–‚hnse_fc\dotxuxte`kuqopqnijpnnnnnnnnpjby“§µ®´¼ºº½»»¿¼¶·¼¾»¹¾¼¼¿¿¼¹¸¼¿¼º½º¶º¹»º¹º¿Âº¹Àýº¿Àº¶¹¼¹µÅ»‚iqplmljkihggghjk^ROWcmqotvqsxk]£fturrttvuqorssqvtqrrprovtqqxyej•ÁºÀÂÄÇ¿¼ÁÆÇÇÇÇÃÀÁÅÆÁº€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€b¢ÁÁÄÀ¯Ÿ”‰ˆ‡ƒ‚}‰ˆ†‚‚‡ˆ„†‰‡‡Š‡ƒ…‡…‹…žÎÝÌÊÑÒÇÃËÐÎÏÐÍÌÏÏÊÌÎÍÉÉÌÍËÊØèïêÝÑÊÒÍÌÈÂÈÏÊÈÍÍÌÅÄÊĬ“Ž’”•—œ¢£ £¦¨¬®©¢¢©©ªªª«­®¬ª««©ª­¯´ÂÏÛÓ»±´µ´´°­¯¯©¤³º¯­²¯¯¶±¯³¶´³³¶¶µ´³²±°¯·Àº±°«¦•ƒ|yqljnnkm•‡j_ZK2%+,+02454248=8:<<;:;=:;:63310/036765679;:;==>AEHIJKLOQNMS\QRˆÜöÅ’„‚~{tkˆ»ËÀÅÈÆÅÇÇÅÈÃÃÊÊÃÔöášswxw{ubblvwvpcUI@><8:A7M™Š‡‰ƒ¥ÌÌ¿ÃÁÁÈÈÅÇËÐÊÇßÔ‘gmgXÂÖÍÐÁ©¿ÄÎÏŸdhqjeechjjligjhkkiheejnnmjgfhkjhfefhijkjgdehihnlhdejlkc`\SRK:8NgbYcvi3"'&'/+%)%*+,,,/0571,/.*)0Tjkr{xtƒ‡xuwrcac_^\]fnhgjf`iyurt}…‹€fLIWb]SNNSQJP_efrlgfdhkN;EPW^URdun\Xyž”gUy”ƒhkpi`eaZdotxwwqecltimrpklonmmmmmmmmth[u‘šª´³´º½½¹µ¹½¹¸¾Â¼¹¾¿½º¼À¿¼½Á¿¼º»½½¹¸¼½¹¸¼¿¾¹¹½»µºÁ½³¼Å·°È¼hppklljkkmihggie\UUV_ptruwusyi_ƒ—xcpqqrronoqqoqvtstsoqttwtswstvef•½À¶¹ÀÁ¾ÀÁÁÁÁÂÄÊÈÅÆÈÈÆÃ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€R¨¦®µ±©’†…„ƒ†„ƒ‹Š‡„…‡ˆˆŠˆƒ‚…‡……ˆ‡‹‡~œÍÙÈÆÍÒÍÌÐÒÎÐÎËËÍÎÍÍÌÌÍËÊÌÑÏÖáíîáÐÅÐÎÍÊÈÍÏÊÍÐÍËÆÇÑͨ‘’’‘–œŸ¡£¥¢§¬«¢œ ¥©«ª«­¬©¦®­©«­«¬¶ÀÌÙѹ³»µ¯­®±µµ®ª±´®°¶¯¬ª¯³²¯°´¸º¶²±±°¯¯´²³·´°²¯« ’vqnovy~‘™xRKRG1&+/-.0367557:79:;::999=<7468721475249:<;88;>@==@CCBFMKGELSSQOSLsÆóÊ“…‡‚}vk†¸ÈÃÇÇÃÁÅÈÈÅÆÌÌÄÉÖÜ¡}owxvqeecnxtnh^KB<=;537;7^ˆ‰„…¤ÎÐÄÉÇÀ¿ÆÉÊÆËÍËÜÔ‘fldTz½àÔι¨ÇËÌΟdhqkfffklkkhegglnlgbemjkkigefgkkjgdcehhhfddgjjmkgdekmkeb]VTM=:PcaY\sxP+*('&&(*$+.-*(-1351-//*(#5Wmou{ws€†…|ssr`[]\WW[fa^be`ahjmry~ƒ†„€†oYT^_WSQRRQX_bgnheebfiP=FOU^TMavq^Wv–fTx“ƒhkqi`eaZdotstvrfagnpkjosmknmmmmmmmmti[t”¥¯´ºÁ¾¸¶µ¼º¸¶¹¼»»Á¿À¾½¾½¼¼¾½¸¹½¾º¹¼¿½¹ºÀÀ¼¶»¾¼»ÀÀ¹´½Å·°Ç»hppklljkjmihhhjg_UST]ntuptsrxia†›}hvurqpoqqqqrrqrsrqrpqutpnrptyji”¹½µ·»º¸º»»¹¹»¼¾¿ÀÀ¿¿ÀÀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€J“• ¤¢’…‚„‡ˆ„‚„ƒƒˆ‹‡‡ˆˆŠ‰†ˆ‰‹„|žÐÙÉÅÇÍÎÏÏÍÌÍËËÑÒÏÏÉÉÉÉÉÉËÌÈÑãðîÞÑÍÓÕÑÍÐÑËÇÉËÈÈÃÆÐË£Ž”‘“’‘”š  Ÿ¥­¢¤§¬ª ¤£©ª§¨¬«¦£®­©°¯«®¶µºÍн¶½¼³°±²´µ±®°±®³¶­«¬®¯­±µ¶²·±®°²±±±°±­­¯²¹²®±¯¨£ ™š¤¥¨¤zRPVO=-/430147987678899:9867=?:7985332147986:<;::;<>:;ADBDIFFHJJJNSUHX¦ëЕ†Œ…wl„µÅÀÆÊÈÇÈÈÅÄÃÆÉÊʸ›€qjmkjjhidkpgdbXE=87611489>:586324984689879:9=99=BCCEHFEGIMOQVLGˆàÕ—‡ˆ|xm†¸ËÄÇÈÄÂÆÉÉÅÆÃÄŲ’|qhggcdlic`ZVabQ@956644686<;Lx†¦ÏÏÂÆÅÆÎËÇÆÇÌÇÆàÓejbRw»ÙØÛŲÒÓÍÍždhqkfgjonlkgbegkkijighkjjihggfilmicbfkilkfbdimjjgeglmlc^[VRM?:Pba`etq]4)-(%&.*--***,,00///+(+B`sx|ztzƒ„tmoof[]]X_baS]ghhomagdjz„…†Š„‹‹ze`giaRP[abi`a`hkfggM8AMW`VPcun]Yx›‘cQv’ƒimsiaeaZdotxwytf`hqupjilooommmmmmmmnf\u”¨¶¯µ¾¼·¹¸¹»¹¶»ÁÁ»¸¿À¾½ÀÁÀ¿À»·½Á¹²ºº¹¹»ÀÀ¿Àþ¸ºÀ¾¹·½Å¹±Å¸€hppklljkhliiijnk]QRYbmpsuupoxi]~˜xevvrqswsqstrqrosxvppvyxsqsoptdhŽ«¨Ÿ¤ªª¬®®­ª©©«¬®°°®®°²€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€N~„†ˆ†„‡‚„‰‰‚‹Š†‰ˆ…‡†…‰Š……‡…„ƒ‡…~ËÓÀÃÅÉÎÐÏÍÏÒÎËÎËÈÌÑÌÊÌÏÍËÌÎÔâïïßÌÁÍÑËÅÍÏËÌÍÏÍÍÊÊÏÅ ‘•Ž“•”“–œ ¢®§£§©¢¡«¬©¦¥§ª«ª©®°­¯µ¸·¹¸ÀØØ¾¶¿¾¼¾»³¯·¾±³·µ³¯©¯²°°²³±±²´³´µ´±²µ°¸¹°ºÃÀÌãÆÃÕ§¥¦¶´W^hsucPGC=:9767788889877:<=<<==<:87348956;:96569987;><;8678986898679<>>?A@<:::77;:65899779;957<=9;ACAEHJJJNPQUXEqÑÕ—†‚|yl€±Å¿ÄÅÂÁÄÅÄÉÄÇÇ·Ÿ…nwpc\agc]SVIAXlZ832146876<9NbYbwqmpgV@/#%7J9(*,-1+*-/21,--)1Pjtzzut€‚vcdmcYXXY`ZP[gjlqlfkghlrx|‚††Šˆƒˆ‹{cg\OMNKHKPU\hifhcS?IRV[QM_ur_Wt˜cQv’‚hkqi`eaZdotvuwte]fsolstjkqmmmmmmmmmof[tŒ“¦²©¬¹¾¼¿¿½¼»º½À¼·¸»¼¼¼¼¹¹½»º¼½¸µ·º¾¼¹º½¿¿½½¿Á¾º»»·¶ºÂº³Å¸„hppklljkhkhhijnj^RQU_lqsnturud]… }fwupquqsssttsqqtsqsutsrqt{wwwdd–ÂÈ¿ÀÅÅÃÅÆÅÂÂÃÄÅ¿ÀÂÃÀ½€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Hv„{{zxwuuwvxsko{}}{}~|€‚€€~||yy{vr•ÃÇÁÇÅÂÅÄ¿½ÆÄÂÃÉËżºÂý¼Âþ¹ÐæíêâÖÊ»¾Â¿º½ÂÁü»º½Äºœ‰ŠŒ“’—ž¢¡ž¢¥¦¨¨£¢©©§¥¤§©¨¤¦¬¬§©¬­¬£¥³Ôá̾¾ÅÂÁ¿»¼½¹º¹¸µ·µ«©¯²µ³¯­°´«¯¯¬«¯²²±±µ®¶¾µ¸Å® º²‰‚‚‡…}ƒŒ~d_o…‰vaSF?<98::8578:::99:=>?@?=:89999:;:8::878996::98=CB>DFFDEJOPUVDsÒÒ”…ˆ|xwm³ÊÉÊÈÂÀÆÌÎÄÅÉ¿¢Š~wtme_^`\SPPCJilJ0740/1577A38AEJNUŸÐÔÂÆÊÉÈÃÈËÈÌÊÅÔÒŽdjcSy½ÔÙàɳÐÐÊÌchqlhhglmlmjgjlkhhkjijkkkjhgijmlkhffhjnomhdgmqppnklnmid[]ZTQG?R_[lwccudUK=)+DY9(./+/,/0130+,.+7Ypuywrt}~rdflcYXY\]XX_cflpicfjgktvt{ˆ‡†„…ˆŠ…fWPSVUUTSZbifflfQFQRR[SK_ur`Xt˜dRw‘fjoi`eaZdotqqurcZcpsnpokorkmmmmmmmmqfZsŽ–§²¨­¼½¹½À½¸»»¼¿½»¼º½¾½¼»¼¿½¸´µº¼»º»½»¸¹¾¾º½ÂÁºº¼»¹´·Àº´Æº‡hppklljkhkhhhiliZRSV_nqprvurve\›xcvvootqpqtvtqorttutqqvustytstae”¾Ä»»¼¹¼¾¿¿¾½¿ÀÅÅÄÄÅÅÄÄ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€M{Š‚~}{|~}~{u|}yxxy{}||‚‚~yw|x{}utŸÑÓÌÎÆ¿ÅÉÇÈÅÇÇÆÅÉÈÃÃÇÇÃÃÆÅÂÃÖçëêäѼ£¯ÄÍÈÉÌÅÁ¿ÂÂÄȼ™†ŠŒ‡Œ‘–—“”šžŸž ŸŸž¢  £¦¥ ›ž¥¦¡¦§¥¨¬£ž¨¾¾ÅÛßȼ¿ÄÄÃÀ¼¾¾¸µ¶·´¸¹±¯¸·´±²´±¬­²²­­±°¬¯¯°««³°«·«’¢¤tv„|xy}†‚shpƒŠzfXJ=;:;=;729:<==<:8>><=?A@<9:<<978;998667768:<<<=@B=CEDDHKJTQAvÔÏ‘…‘ƒ|xjz©¿¹½¼¸·»¾¾¼¾¾º«z}qc]\URTVTNARuh?/7643465318>?HKEKyÀÓ¿½ÂÃÁÅÄÈÍÑÇÀÕÒŽdh`Ou¸ÏÝåÁ¢ÃÊÈÌchqlhhhmnmmjfinnoqofchjlmljhijoonkiiknttqkhjorqrollnmibY[XQOF=W^`wvV\wgKGK85L[=&+..4.-2241*,/,<`uwxupt€ˆ„widhfbWUY[WU_[Z_jolgefjmnou€‰‚…‰ˆ„ƒˆŽi`cccc_[bhkfhqkLHUPO^WLato^Yw˜‹eSw’fhni`eaZdotsrvte\ftsmospklpmmmmmmmmqfYt’›­·©±À»±¸¾¼ÀÁ¼¸»¿¾½¹¼»¸¹¹¸¸»Â¾¶¸º·¶·¿¿¸¸¿Á½ºÄÀ¸¼¿¼º³¶¿ºµÆ»‰hppklljkhkhgghkh\TSS\msrtsooyl`Ÿ{gzypnqutpmpttoqsurpstorootqsvfl–¹½·º¼¹¸º¼¼»»½¿»¾ÀÀ¾¾ÀÀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€K‰ˆ€{ƒ†‰ƒ}…„‚}€„‚„…„€ƒ„‚x{€~{£ÓÖÈÈÊÅÂÌÒÊÆÇÉÈÄÇÊÉÊÌÌËËÍÍÌÊÚæîèÞÓ»“šÄÔÃÉÓÎÈÅÂÍÈÆÎº—„Œ“Ž‘’——˜˜–—šœžšž¦¥ ¥¤šœ¡Ÿ¥£§¤Ÿ¥š”¡¹¸ÅßÞŽÂÀÄÆÃ¿¼½À·±¶¸·¸³®¸³²´³®­±¯µ±­°±®±»¹±«­°© ®¤™›š~q„‚}}|}ˆŽ‡Š‰†‰v]^]B66<:895777:=;78<===?B@<:;<:9:<<98;:67:96779:;<===@AGIEIVJBˆäÎŒ‡ƒ|m}¥°±¯¯²¶¸µ²¹·¸³uxi_`\LISWNOK\nS3852456;=6278;DIIJ\•ÆÊÁÃÉÉÄÆÉÉÎÊÇÚÍ”jncOy·ÌÒÚÁ¬Î˽Ðflnigfiopkkomgorqnmjghjlnmiehlssojimppsurlhlruuvtolmljd[ZYYRDCSUd€rNWqgLDJA?R_>'++-..-,2..0..(::::<=<<<;>@><98:==<=<:869;;88899::;:9>@?ACLUEU¨ìÏ“‡„€~yj¯Â¹¼ÀÁ¿¾À½¼¹®“vmrc`XNJQTNPIJY\E3976/.9=72/128BHJOOu®ÌÆÃÈÄÊÉÈÅÈÄÁÕÒ˜jm`MwµÒÚÓµªËÈÉΟjqtmiemmnpomlknusnmnljonlkgegklllnoomkouxsmmtzuvuolllj`Z]ZRNKPN[pzbJVnnQ?EHLY_A(+**-/003400*&4ayyvwpty{rhdedZWY\ZZ\[VY\ahkhbafgipwupˆ‰†‡†ƒƒŠ€dECY^NDT[WZfh`SDOTV^VQcvqaYs•ŽfUy‘jnrgbdbZapttrusfahprnmmlllijlllllkjnhatŸ­µ®²¼¼º¾¼µ¼»¸»ÀÀ»¸½¸¸½½¹º½»¶µº»¹¸ºÆÄ¼¸»»·¶¾ÁÀº¹Àþ³ºÃ·¯Ã¹…homjmnkjhfhjhjml]USX`krpnrruwb_ƒŒhevxrpuoruupnqvpsqoqrrsrrutqtrimŠžŸž¡¨§¦§©¬­®­¯°°¯®®¯€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€N{‰…†ˆ„„ƒ„„ƒ†‡‚„ƒ†‰ˆƒ„‡………„„„‚…¢ÑÖÆÆÉÊÈÊÌÈÇÍËÉÍÏËÉÍÌÉÆÈÊÊÇÊÚçïêáÖ¿˜ƒœÃËÅÅÑËÌÅÉÅÄË¶šŠ“Ž•–•’•›žœ ¦¤¢¤  ««§¥££¤¦¥¤¤¨© ‘’—•¿áÖÅÇÆËËÆÃÆÇÿ¼¼¿Ä½±¶¼·¼¿µ´ºº²´··³±¯ª¯³¸°¨­«™•‹Š”r„zuy€…‰€œ¯Œ[U[TWQ;-26369::87:=<>B>::>>:;?;<:7898899999999;49?A@?ILCuÐóÀ„€€zj|¯Å¶¼ÁÀ½º¾ÂÅÀ·¤‡miqd\OL[bWIOEMWK95721)(272//--5@BFONVÃÇÀÇÅÊÈÇÄÇÄÃØÓ—gi_My¸ÖÙϱ¨ÉÉÎËhovsrropqsspnmrwwrrsrptqpnmjkmmlptustwyyuniltztwvpkklkg\]WOPNLKbypUFPgpU:;HSbc?'//.,..237..*%Hw|syxnwz|zlcaa`TUYZY[\XWXY]did]bjkfnzxju‚ˆƒ„†…ƒ…ˆsPDKNIJHO^ffglS@KVZ\RPduo_Zt–dSwhlphaba[cprxvuqgafoommnmmomkmmiimmkqi`rŸ¬±®µ½»»À½¹º¸¶¸¼¹¹½¹¼À¾¹·º¼¿½¹¸¼º¸¹ÂÁ¹¸¿À»¼·¹¿¾ºÁµ±¹Ã¸°Â¶€homjmnkjkhhhfhlj]URW`kqostrsucbˆ‰gfxxqorrutqqurlptvutsqqsrttrtriqz}|}{|ƒ„ƒ‚‚ƒ…‡ˆ‹‰ˆ‰‹ŽŽ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€R}’•”‡†„‚„†ƒ„„€„‡‡ˆ‡†‡ˆ†…„†…ƒ|~~ ÎÖÆÆÉÍÌËÊÉÉÇÆËÏÌÊÎÊÈÆÉÍÎÌÉÊÚçðëâ×À•z’Äм´ÆÍÒÉÉÄÅȲ—‹’‘‘’––”˜  šž¤¤¦ª¦£ª¯­ªª©¤žž§¢¢¢˜ŽµÛÒÀÄÊÈÊËÆÃÆÉþ½ÀÇÅ·µ¼¾¿¹´¹½¸³±¯°³µ³°´´²®­´¬˜Š‰„‡wn~su|ƒ€‚†ƒ—°Ž[V]]Z^M2*020668759==>AA><>@@:??=;>?>=>;B=9<8999:;;;;?;8@?;K{µÜëíĆ|zzn~¬À½¿ÃÂÁ¿ÀÂĹ©–nc`^CJjp]QOCGNLD=7.-/3/&)/.+&(6?86@MC_žÈƾÃÊÌÎÌÎÇÀÑÑ’ad^P}»ÐË˶¦ËÍÃϦorzuompwzwvyvnrtwyyqlnqruurmnrsvyvqmqvrwzwpnrywywqllkj\\bYQSL@PwwURQCSgW:.,AkrF(/1-+//21,+*#@wqy}rmp{|~shcVNTXY[YX[^YY]_]\\\[]fmijvzmis„ƒƒ‡Š„€|hI?IPLKSbifglT<@HRZMB_tq`Wq•eTx€imqiaa`\dpqquvriafrrmpsnhkqnkjjkjlnqf`w˜§¶¯²·¶µµ´¸¼»¹¹¼º¸¹Á¾·µº¹µ¶½¾ºµ¸»¹·º¿º¶¾ÃÀ½¿ÁÀ¶±ºÃ²ºÆ¼³Å¸‚homjmnkjfdhjijli]TRW_jqoqqnrxfaƒfcrssuuqopstrrursuurqqruqrssvsgkwwmiimtpqssrmifnmosxyws€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€b¦¿²«£ž£›Ž‹Š„‰“†‡Š‰‘‘މ…„‚€ƒ‚ÇÓÄÈÉÉËÊÆÆÂÄÈÇÅÊËÄËÎÏÍÉÉËÌÌÛèïêàÕ½xНÄÉ·£ºÌÆÃÅÊɮމŒŒŽ”‘”–—–”—ž¡ ¢¨§¦§¢¡ª³¬¨§¤¡ ¡——™–Ž’—”–¾áÒÀÊÐËËËÈÌÎɺ¾ÊÇ¿ÂÀ¹ÂÄÀÂÉÀ´¶¶»¸·¹³­²³···µ³³·°”Œu^`hw|‚‚‚œ©„\X[W_[b_F358<=<==:8=AA=:<9::;;<<=B=9;A=Jq¾çíè뾇ƒ‹|uti{«Â·½ÁÀ»¹»¿º±¢‘~jXMNDXtmWJB@CA===6/062,+)%&&#'5=74^sqaVp•‘cSv~hkohaba[cprvvvpc]ftrklqolnpnjilljjnfc_qŠš«¶¨«µ¹¹¸·»½º´³·ºº¼»º»½¼º¸¸¸½¾·µÀ÷»¾¹µºÁ¾¶º¾½¹»Á¿·²ºÅ»³Æ»…homjmnkjfehkiijg\TRV_jpopqopsaa‡…dfuqquurttppsrmqprpkkosuqqrswsgjyxkhnswwvtuurkelmquwxur€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€a¤¿®£Ÿ ¡“ŽŽŽ‹‹Œ‰‰˜“‹–‘‹Œ‹‡……‡‡ƒ~šÃÑÅÍÌÈËÍÉÇÉÉÈÆÈÎÏËÉÉËÍÊÇÉÎÍÜèïèÞÒºŒrˆ°ÁËÇÄÈÌÈ«ŠŒ‰’‘‘”—˜™›œœ¢§¥¥§¢ §®ª¨£Ÿ¥©£“•””˜™•—–š»ÙÎÂÉÏÊÌÌÆÈÎË¿ÁÇÅÆÇ¾·ÂÇÅÂÆÄ»·º»¸¶¶³³º¶±±¶º¸´°¬§±®ˆghty}|{€{|€™ŽhU\d_b^`bVA406;99@>;?D@>ADCA@:>A@?>>>>?AB@??<<<<<<<<<;9;9>V…¸Õäâæê»ŠŠƒuqshy®É¹¼¿¿¼º»½µ«›ˆveWMQVa_L@EK?:668972374020(&'%'29418>=Cq²ÆÀÉÀÃÇÉÎÉÄÖ×—eh`Ms«ÊÑœšËÌÆØ²uq{xrruwz~}yusuyzyyvrsvwwvsnorzyyzwrsvxwutqorw|ztooplfg_ZWYOER|‰iJTVF>eoJ2*,VrM'-2/-0,.100'9m„ko}tipw}‚tj[MUc`USVZYXZXYYWWZ^^Z]bliepvihq~~tt~}z„‡mMHQAWkrrrqmO=EKUaWL^ro_Wq–aPtŒ}eimgbdbZapttqrnb_jutomnmmmjkkllmkkkgb\n‰™¨±¨ª·ºµµ´µ¸¶¶ºÀ½»½½µ·Á¾º¸¸º¼ºµºº¹¶¸¿¾µ²¼À¼»¾¼·±¸Â¸°Æ¼ˆhomjmnkjigiigghf\TQV_jpnlpptwc`„†ejxrpsqpprsrqqrolmqrrsqvqqrtxsfkvuow‚„~wnhffnqtuvuvv€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€[”°¥™–—”‡„‡ˆ‰ˆ…ˆŒ’Š’—†‰Š‡ƒ}†‡‚|{“¹ÇÃÌÊÄÇËÇÅÌÏÊÆÌÑÍÈÅÇÉÊÉÉÉÇÎÝèîçÜи•s‘Ä̽¦‘©ÄÄÃÊÐÌ®Ž‹ŒˆŒ‘ŒŽ“”•–•–šž ¢ ¤¬¨¡£«««¤ž¨­ŸŽ•›•œš¢ÈÞÊ¿ËÓÄÄËÉÈËÉÂÄÆÅÊȺ¸ÈÃÁĽ½ÁÅÀ½»¸µ·¹µ¯³·³µº¹µµµ¦dgy€}uv}{w~„“x[Y_d\`d`_dYA09@;7@?:>>>>>ACA=<=>?@A><>?@<8=A=>>>=<<;;9>?5L¼Ä×äçé㽎}‚xwxgt¦Â¼¹¸º½½º¶´ª–mc^\g]J;8?BA@>?A<9@AA><<=;78?A<:>?;8@8@w²Â¸ÕåÝä縊wrsiw¨Å¼¹½¿º»¼·±§’pdfrdK:3/:C<<37=849<=?DJONHC;2151.01:>Jt«¿¼ÂÌÊÉÆËÈÇÛÒ’agbPt«ÇÒÆ™–ÆÔÂʪvpxsosyzy{zvtw||{|ytvywy}{tswxt|„{pt|z{wppyxxtnkmnld\]\SPo ›uYSYT=3[zb?0!7fa.$86++2.4-&8t˜wmyjiv€ugcfdabbOO\`ZYWVTYYVWZ[\Zhun[bshZhzzff{~|xƒ’†g\gibhplnsoW<>JW]QP`pma[s”cVx‹yfnrjbeb\clovwvnb`hnnnmmnnoommlkjihhnh_wŒ¢¯®³¿¾µµ»¿¼·µ¼Á½··»»»ºº¹¹¹º»¸¸½¾º¸»»¼¹¶º½¹½º½º³¼ÆÁ¶¹Àµ°Å¹jnnigikjilkgehkk]USV\fnnspnruec„hhwrouxoqrssrqqttprxuoqrstsrurgkwq~ž¤œœšš˜ˆm[^imruutuvv€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€S‰ž™ž¡–†€ƒ…ˆˆ…ƒˆ…‡ˆ…ˆŠ‡ƒ€‚„€€€}€›¥®´»ÃÅÆËÅÆÈÊÍÎËÇÈÏÎÈÆÌÌÆÆÕãîç×ǯx–»Ë̯—ªÃ¸¯¸ÄÃ¨Š‰Ž‹Œ‹ŒŽ–˜˜ž§¡¢£££¢¢¤­´®£¦ª¤›––™ ¡–’™¢”žËàÎÅÌÈÆÊÍÈÆÉËÁ¿ÇÉÊÊÀ¾ÆÇÄÄÇÉÉÃÄÈÃÀ»±²¼ºº¹·¸º»´´¼«|k…ž«ª¢¨±¡”§~WW_`c_ddccfhaW?58=9<@9=?ABA@@@@@?>=;=:754>@Nzª½¾ÆÌÈÅÅÍÌÆ×Ò’agbPt«ÅÇÁ ™ÁÖÐȨvr}xtv||z{ytrvyz}~wqtzy{~zsrx{|~}vsv{{|xqotz|yytmjjjhf\\VRo—«•nXVXTA6UuiF4%0]]5'/.,./.,*8]‹”vhydgy€yrfadb_``TOWZVWVVWWVVWWW[^fqpbdoi_etyhdx€urw‡ŠtcfddoytoppV>?IW^RO`pma[s”ŽbUx}gkmibe_Xanupprnc`hppnnqnhjqklnonmkjof[u•¦°¬¯»½´³·¼º¹¸º¼ºº¾º¹º¾¾»·¶º¹´·À»²³»¼ºµ¶À½¹¿Â»¶Áʱ¹Â·®Ã¹†imnjhjjighgfimlj`UOU_lqmlnqvvdc…†cfwrpuwtonrsrrttrvxsprsqrsrrvsinvpƒ¥¨š–šš–†jX\imsupnrtq€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Ht‚x}‡‚ohmq{ˆ‰‚‚‰ˆ‡‡ˆŠŠˆ…‚…ƒ~~{|‚€„Œ‘˜Ÿ¦²¹ÀÈÉÅÉÓÕÎÈÈÄËÎÈÆËÍËÁËÝðç̸£‰v•ºÉȬ–¹É¾¸¹´°œ‡‰ˆ‰ŒŠ‹‹‘—š˜¥§¥¡¤¨¢ž¥®²®§§§ ™—˜›ž›’‘™¤–¢ÌÞÎÈÍÃÃÉÌÇÄÈËÆÄÉÆÇÈÀ¿ÆËÉÆÇÊÍÉÆÇÄÀÀ½¼¾À¹¹¼º¸¹¶·²»¬v”©³®¤±Ã¨‚}ŽiZfaZcfjjjhijihY9/;>:;:???ABBA@BCDA<<>?==?A?:9;B;785//4;9H{²Á½ÁÏàÚßâ´ˆ€upqgs£¾¹¶º½¹º¼·²œŒ}mojRB8431471,0;@93:CJMSZ`a`][QG@=AB<:Ca®·º¿ÈÆÅÆÎËÅÔÒ’agbPt«ÃÅÇ©›¾ÔËÍ«ytƒ}ytsz{z}|xww~~{|zutwx{~zsu}~{{}{ss|~xqnoruzzvolkkhf_Y[m‹¢¦‹bX[WTH:ImuR:)(Q]=+--+.,0$4Wœ‘rm‚wgp|}yoebcb`aaZTWZZZYW[\XSVXZ[dhigcdmjdalwiat{vpzˆ|d\aeoxvnklU?AHU_SNaqma[r”ŽgUv|ejnd`fbYanvqqvui_dmomlmnmnoijmopnljjaVp‹’¤¯®°¼¾¹¸·µµ¸º»º··º¾¸¶º¼»º¼»º¶¶¼½¶³¸¿½µ¸À¿¶¶¾À··À¼¬°ºÅ¸¬¿·†gloljjjgfghhjmkh]URV_jrrpmkqvge…†dhysorrqqrqpqtwqpuvqtwrnorrrwukkvw‰¤¢˜•˜†xhZZclttmmvyu€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€8[jd`b`UTY^qˆ‰‚‡‰„„ˆ‰‡‡Š†€}€€€€~€ƒˆˆ‹’š§³½ÇÃÆÑÓÍÈËÍÑÑËÈÉÉÆÂÆ×ðå뜂s—¾ËÇ©’³ÈÅÆÆ¼´ „‰Ž‡‡‘‰Ž“—š›œ§¥ ¥«¢ž«¯°­©§¤—‘•—–”•›¢ š§ÎßÎÅÌÉÅÈÌËÉÈÆÃÅËÈÇÉÂÀÇÊÉËÉÅÇÇËÉÆÃ¾¾Á»·¼À»º¼¸µ³»· ™¨±¶µ¤§¼­‡zsaZbcaehlkjkjklnmS<:B>:??@AAAAABBBFGBBC@;;<><;:;>732.,3>@;gª¾µ·ÁËÝÖÜݱ†wrsgr¡»µ³·º·¹»·®›‡}{u]C6123012..3;?:9BLSTUY]acec^WPNRN@9Ot—©´¾ÄÁÄÉÈËÆÂÖÒ’agbPt«½ÆÇ “ÇàÌΫzv|yrv}}{}{vtw}yzytswx}|ttzy{y{|xuz€ztrppswyzwroqpnf[_—œ §XW`VUM=ACB@?BEIEGJFDB<=AC>97;>=84346;BC?BDB?>BGHDDGGFC?ACC?>Q†°¸³©¥¬ÂÕÏÔÕ©ƒ‚ytugp›´«©®³±³¶²›Œ—•mTN;52/-+,++-37>EHHLPTY^aehkjihdchcVV~¡°¼ÊƸÃÃÅÅËÈÄ×Ò’agbPt«ÊÌ¿š—ÀÎÃɤut~{{rsz{z}|xwz}}~yswzy{~ztu|~ww€spz}}|wokq{yzwrnnkg^x–¥’Š™‘kPW_W\R6'Q†]7"DlT&!.,-))Nr„““wboymjyzohcdaabbacf`Y[YUWZ\ZVVWWX\cZXko``jf`cnh`m{ztx}{}{mkoqojkkkTAEKU^TRbrnaZr’ŒaRu{dkrh`b^Zclqrtwrc]dnsolmmkijspmjijkmrh[sŒ”§³©«¹¿·³´¹¼¹·»½¸¶¼ºº¹¸·¸¹º»»¶µ»¼¶°¹º¶³¶»¼»¹¿½¸ºÁ¼²­µ¿µ­Ãº‡gloljjjgjifceikiZRNT]jqpppptucb„…egtnptrprrrqrrrostqqsttrrtrrushpoz˜¢••Œ‚vso`Ycmnnorvwv€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€3]h^^]XTVU^sƒ…ƒ……†…„„„„„€‚}|€‚}|}ƒ‰„ƒ‡‰…†Šˆ‘–›£°½ÄÅËÊÊËÌËËËÉÃÑíḢ›tœ¿ÆÁ¨—µÊÆÈÎÉ¿¥‡†‹Œ‘Ž“—˜•–š¢œ›¢¢œŸª©¨§¡™˜—Œ“Ž”™•™¢­ÌâÒÆÎÒÌËÍÍÎÐÐÃÁÉËÍÌÂÀÁÅÄÄÄÅÊÊÄÅÄÃÄÁ¾½Çÿ¼»¾ÀÁ¿¿»»ÀÀ»¸¨…dZ`ba`^Z_`bgjropnjlpojpuyqW>;EABBA@@CFGIHGHFA=B@?@DGHG<77=>>HV¦®£¨«¦«¾ÒÍÑÒ¦vrrdk–­¦¥ª¯­°³°ž”žŽX?>-.+(&()((/6:?ILKNRV\`ceilkjjhfig^k–±´¼ÄÀºÄÄÅÄÉÇÆÛÒ’agbPt«Ï͸“•µÆÑÌ¥wu}z{pv||z{ytrw}}y{yuuxzƒ|rqv|z}|wvvyzzuonu|xywromjfg”¨ ŒŠšŽeSY[X`Q/!G‰•rD'>lT$%<63-Afx†–‰peonfmyqfddgecfedghbYZYSVZYZWTVX[^]NRlmWZje`coi^k{€xw|}€‚minohdhhU@DMV\STcrnaZq’ŒbRtŒ}hjjc^ca[clqssvse]guqmiinqnipolkjklmsh\t—«·®°½¿¶´¹¿¹·¶¹»·¶ºº¸·¸¸¸¸¹½Âº´¼Á¹´¼º·µµ·¸´³¿Ã¹³¹»µ¬¶Â¶«¾·‡imnjhjjihhfdfjjgZTSV]hqsronqsdd‡…fiupormnssnlnporttoottmoprrrwuklr}’•—†}sssaV^inprw}|w€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€;dmbb\WZZ\hy…‰‡ƒ„ƒ€ƒˆ†ƒ‰„ƒ†‚~…‚||‚‰„‚†ˆ„†‹‰ŒŠ‰—¥°µ¾ÁÅÉÉËÏÔÆÂÑî⸡˜}v¡ÇÍÅ©—¸ÍÅÂÉÊÀ£‰†ŒŽ‘‘““—“‹›š–—› ¤§©¨§ —˜˜‘•’’‘Ž‘–”›ª¾ÛäÏÆÎÖÍÊËÊËÌËÁÀÉËÌÊÂÅÈËËÊÆÂÅÅÆÈÇÇÊÈÃÂÂÅÅÿ¼¿ÈÆÀ¿Á¿º­›zh[YX\a_[[abjnflknmhjqrnquvzpL7BCB@@ABDECKLIKIB=@?ADEEGJC@DIBA\€©«£ «­§¦¼ÑÌÐФ€|soo`g‘©¤¢¨­«®²®œš˜}P;5)/,((,.,+5<=?INPVXZ]__afjjjlkhig`a–¸»¿¿½ÂÂÆÉÆÆÃÆàÒ’agbPt«ÁÏÄ££³µ½É£vu~}tsyzy{zvtw|}}zuvy{€xpr|y|zv{~zyvrpruxvxwsqqnk…¨›|˜bUYXYcO+@„ŸM+8lP#5P?53_v}‹‘|ninoioxria`db`ccbemdVUUQW\TTUYZVV\XNYur\\hd_cqk]i|€tkov{‡whjqjeikV?DNW[RUcsnaZq’ŒiUq†zjlhb^c_W`nwusvudX`oqljmnkkmjjjjkkkkkdZrŠ’©¹®³½º²µ¹¸¼º··º¹·¸¹µ³·º¹¹º·¹·¶»»¶³»º»¹¶º½º´¸¹³³¼¾¶¯¼É¹§¸±ƒjnnigikjgklhfffd_UPU`lrpinswtacŠdjxssupoooprtttspoqqpppstusquqgkwzy€’œ‘~}yyuaXeqsngkx}z€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€'FmsŽŒwinwmoywkeddc\ZbgfdmbSWXQXZRSWVTVYYVUXim\ZgcXbmi`dtztqpqy…{lisndecT@DKT[QQgwp`Yr…cUvŒ~gjoa]c_X_krvuwrc]eqqnllnonloljjklkjpi]rŠ”©´ª°¹»º·²¶¼·¹¿½·¶¹¸º¸¸½¿»¸¼¼¹´µ»¹¯º½¾¸´»¿¹´Â¿¶·º¼º²¹Á¶®Á´~emmikkijghikgekh[QLQ\iolqoouubdІdhyvttpuooqppqppoqsrqstrprrrsphmyrpФ¢Œ~vu{vb[fokimtxyx€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Aiqefe_[filu€„‚‚‚‚~‚‡‹ˆ…„ƒƒz‚zz„‰‡…„……„‚‰‡‡„„Š‘›¡©±¶»ÀÃÆÔàîç̸¬~w¥ÆÉÀ ˜¼ÌÆÂÄÊÚ‚‹Œ‰ŒŽŽ“•’Œ’˜œœ¢¤¡š™•–œœ™šŽ‘’‘•Œ’¿àÓÆÍÔÏÎÍËÍÐÏÆÈÏÑÐÌÄÁÉÊÊÈÆÄÄÇÆÅÆÈż½ÆÈÂÀÃÆÈÇļÄ©…rprjjgeilf\Q\cehklnnnmoppnlntutwxdJ=AA@BA>=GIHHHEBC@ABCDIMMDOGD_”¶ª”Ž“—Ÿ—˜¹ËÄÉÊ¡~ƒvqmdk†ž¤¡¥ª«¬ª¤£ŠaC;831,''**+/17DGEB?KJIJKFCFFHEBEJKKKKKd´À©‘Œ™¢¦¡˜¿ÍÃÇÍ¥‚~€uqogm‰¡šŸž §¨¤¥™rO@:62.((')./18=?BGNSVXWY[[^beeegljfgigZn¥Â¾¾ÂÃÄÅÇÅÈÂÁ×ÐŽai`Q{±ÎÌÆŸ›ÂËÆÐ§rv€|xwr{{{~zps{}yzwtvy{€„€uquƒzw{ztsxyyysjjsy}wuumiœŸ“›™†‹ŒoUX[[Yd\0F‚€_:*PjUS|_/BkwzŒˆt`Uakmtupkif_efehhda[TLV\Y]]Z\\YVXVPNW^kmccgaX^ji]Ygu‚}uxtq{…xfflghjT=?HWaUPctn_Ys“ˆcUv~gjoa^faX^ltrtwob^hqoommlkjjoliijkkknh\r‹”©´¯°·¶²µµ´··³¶À½¶·º·¶º¾º¶¶¾¾»¹ºº¸µ·¼¸´»Á½··º·¶·»¿¸¯¹Å¸¬¾´‚emmikjijkifhffkg\RNS]ipnnonpsfeƒˆfjytqrnqpmmsrqsrprrnknqorsontqdhywjt’›…|{vyzdVblomhgpz€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Fovilojcgiku~}‚„‚€€‚ƒ…„ƒ„†‡…„ˆ‡„€}}€ƒƒ†‡†‡ˆ‹‰‡†ˆ‡†‡‹‡‰Œ”›£©®ÆÔÒÁ»¸¤x{©ÃÈÁ –ÀÍÅ¿Áǽ‘‡ˆ†ˆŠ‰‹“—™™— ž˜œ£˜Œ˜–‘Ž‘–˜˜•”•——•–™Ÿ•ÂàÕÊÍÇÊÍËÈÍÓÐÇÈËÊÇŽ¹ÇÈÆÇÌÉÃÄÆÅÈÈÄÆÇÃÅÈÈþÂÅÂÆº’oksplmjkopnotcX\jkiiinoonllnqporvw{ypT<;GFFHAEEGLOJGKLMIGMLJOPJg›­´½¯“”žŸ ¢¡ÄÏÂÈЪƒ|tqohn‰¡™›œ¢¦¦¢_MG;20*,/,,201;AAAFLRRQWZ[[^figdgijhhii]h Ä¼¾ÅÃÂÈËÆÆÂ¾ÎÑ_h`R{¯ÂÄÈ¢‘·Å½Ó«tv}{vrqz}|~xow|yvz{tp|}€{qpx~vsz{utz~{ztkku|zrtshoŒ¢˜‡‡‰rUX]^\kf7E…`>7ZiX[}U5Xxs‚~iVCOW\fliiifbfc``]VRPLJUZWXXVWWTT[[SQW^iibcf[X^in`QUruurntƒ}jfnkhiS?@GT_SNarm_Yt“‰aTt‹|ehma`gcY`mvuvuncbhnqomkiijklkjklljhlg\rŠ•¨³¯®º¾·µ·º»»¶µ·µ²¶¸¹¹»¼¼»»º¸µ¶ºº·µ¹¿½··»»¹¸½¾¼·»Á¹­¹Å¹«½´„emmijkijjgcffhmh[SOT]ipotqmored„‡fiyrprprsqoppqupqrroqrqrturqvsgn}{lj„”„xqq€ƒi[hqrlehryy€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Evpjjjiddit|usz~|z{|}}}}}}~€…||xtyƒ‚ƒ‚‚ƒ‡‹ƒ~€‚€„ƒ……†ˆŒ–­Â²²· uy£¸¿¹›–¸Å½¹½ÄºŽ|…†ƒ†‡‡ˆŠŠ’—™–“Ÿ š™œ’‰’Ž•™˜““––“’–™™‘—ÂàÑÅÉËÍÑÏÊËÍÊÁÆÍÊÇÆÄÄÇÆÅÇÉÅžÄÈ¿ÆÍÃÂÅÆÃÂÈË»£}hnpnqplkljhlsiXXflkmmmnnmkknpilou{xx€pLAFHJKPTSY\Z\bfffffhkjii]b™¾¹¼Ã¾ºÄÊÆÉÆÀÎÊŽfk\JyµÇÅÅ–­Ä½Ô§qxxsuuz|yy{ysw{xu|}vq}|}~{srz~~{ywwwxxutqlnv{xsvqi}œ£žž‡…‡tTUZ\]rp=?y„fFCave`oNGkyvŒnbTAILJNQRV[\]ZPHKMJHPNOWZWY\TVVST[ZRTUYce`dgXUYem]N[z{|{wmlu|qkrmgeUDGJT]SN`ql^Ys”‰aStŠ|dhma^faX_ltyqqod[ampomjihiklkjklkigke\r‹”¨²¬«¸¾¶³µ¸¶¶·¸·¶¸º¹·¹»º¸º½º¶±³¹¸²°¸ºº·µº¼¶´¸º¹¶¾Âµ¬¸Å¸«½µ…emmikjijifcfghlg[SPT]ipolfelsegŠ…eiwrpsrronmmpttopsrqpqoqpqqprofjwzpkz‰‚ys|Š€f\ejoneahoq€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€P|lhkkhigjwztw€}{|}~~~|}}ywy}€„zuyyv|ˆˆ‡‰‹ŒŒ‰ƒ~}}€~€€€‚‚–³¿°°¶žsz§ÂȽ™–¸Å½»ÂË•}…†„†ˆ‡‰ˆŒ‘–—˜——œž›˜–Œˆ’”šŽ’˜š•”™œšž”–ÀáÒÁÆÏÊÌÐÌÈÉËÃÇÌÉÆÆÂÁÇÈËÌÉÅÆÈ¾¿ÄÅÆÈÊÃÇÊÇÅÈĺ©‹mipppxruslijifocaillnqmmmnopmkirsswww{`BISTURRV\\YZ^UWXWW[XPTRS_bbffZTVelUIa}~}|wrps{ƒwkljhhXILNU_UP`ql^Xs“‰bUuŒ}fin`\a^W_jqsprqc[dsonmlkjjinkhgijjjid[s‹•¨²®¯¹ºµµµ·µ´·¼¹·µ´¹··¶´¶¸·¾¸¯¯¶¸³²º»½»·¹¹²¶»¼¹µ¼¿²­·Ã¸¬¿¶„emmijkijigfhgfidZRPT\gpoqmksub`„„dhwpossmloplorqrqsuqorvtqststqiiuxtow…‡wr‚‘|]\ljprmkpw{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Nynorkannnv‚‚|z€€‚……ƒ‚„…~€„†‚‚yv„—œ™–•–—–••Œ…ƒ‚ƒŠ†ƒƒ„vƒ¦½±°¹¤t|¬ÊÒÀššÀÌÃÀÇÐÆ˜€ˆ‰†Š‹ŠŒŽ‘•—˜™œž›œž˜Œ‰˜’“–“‘’‘‘˜›š›œ›•“¼ãÔÂÌÒÉÈÍÌÉÌÏÆÇÈÅÆÉÄÀÂÄÈÇÁÃÇÄ¿ÅÈÈÊÊÅÀÄËËÂÂȼ£“{kmppqprutnlmicnkhhjiimonoprqomqsroquwxzqTAFEAIFGGHKLLOKFGGBENTn‘¯½¼¾Á³©¢§ª¯±ª«ÆØÓÝ㶈|wutkn†œ›”“•š¡“u]YI941,)""(..1;BECBEJMLILPW_cdgighfhlhej`X…¶Á¿ÀÀÄÇÉÅÆÂ¿ÑÍŒ`h^Ny°ÁÈÇ™Œ¶Ã¸Â¦us~„}oqw|}}{uov||{}yst{z{~vty{xz|srwxyyslnuvw||nm“°ª‘ŠŠ’ŠhTKLQ[ƒI-Okp]TgˆxbQOntrŠˆlacdh[VY\UMNNHEHHJSYXVWVY]\XUXVVVVWZZVXUU]acf][VUbnYI^zƒ€wyysoz†|leejkWGJKUaVOarl]Xr’‡_Rr‰{cfke_c`[dnrnrvob^itrnjijklljijklkhehc[rŒ•¨²¬¯¶¶³²²·µ²±´¶²²¶¹¹¹¶²µººº·¯®·»¸¹·»¾»¹ºº·²º»·±¶½·®¶Á¶®Á·ƒemmikkijbdfjhgkgYRPT[footqoqrceŠ…eiwpmrsnpsqonnlnqsqosxxqqrqpspfpxurvz‚|w‚ŒwWWmoomnrx}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Dwƒqnqmhlpor}ƒz…†‚ƒˆ‰†ˆ‡…†ˆˆ‰ˆ†‚||ˆ–›ŸŸ›œ˜Ž†„„ƒ…ˆ‰‰‰‡„„‡‰~ƒ¢»­©²Ÿy{¥Àȸ˜ ÄÎÿÄ˾‚‹Œ‰ŒŽ’’’“–šŸ™’–ž—ˆ…‹–š‡‘œ”›žœ™˜—Ÿš”¸ÞλÊÑÉÅÃÁÅÉÇÅÆÈÂÀÄÄÄÆÅǽÇÍÅ¿ÃÃÄÊËÈÈÏÐÏÊú¢‡mglokntrsmlopljkloljoomoqrrqooqttjilmtzy~~hMGHFFFJJJMMKKQNIKOKRho{¡ÆÅÁű¤¥¦Ÿ¦·±©ÂÖÔßã´…zƒyvrgh“–•Œšž†jZZH50)&.'%,2.1Xe^_bflnihmbV~¼ÇÁÄ¿ÁÅÆÂÇÈÆØËllVKw¢¿ÇÀŠƒ²¾¼Ì¦sy‚~xuq{~{}}wqrz||}xpqyzz{xrpt{}}ztsuzv{{qjpwut€{j}Ÿ¬²ª—ˆ¢›|rg_[VfŽŠV.''4Seafpvdctmoˆ‚f`cWRTLScdSKUYPSUVWYZWTZZZ[[[[[[VTUW\ZRPTTV_d_YUWPWigOPk€|~|xqqv}}qcagT?AHS\RQ_on`]r‰„cSt‹zdhlg_b]V_ksvture]ervpkiijkliijjiiijjf]t–©³®­µ¸¶·µ¶µ®®µº½»´µ¶³¶¼·²¶Á½¶µ¹¶°®´ºº³´¾¿·´ÀÀ³°¾À²³¸Àµ­À³{`ikhkkhiefdijfggWRTRYippnooto^gŠ‚dftqoppoonoruroqqppqttqoooprxsgjyz{|vtwuqqwq`\hsqoqv~‚„€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Cnymmnopti^l„ƒz€„††ƒ‚ƒ„……††………†‡ˆ‹ˆ™•š—“”–£¦¤™››˜–‡†‡‚|{|€‘››¡œ‡nqvyƒƒ’®½¿¿Å;|†‡‡ˆˆ‡Ž‘•™š˜•˜žšŠ„‹Ž”•‘ŽŒ‡Ž–œ ž˜š˜š¾ÞÐÀÃÎÇÇÊÊËÍʽ»ÄÑÛäæßÑü¾ÀÂÅÄÀÁ¼¶¸¾ÁÂÀ¥Ž€rfdekpqmknpqooooppqqsphchopoomkknprrnoqppqtv|z}{fMDHKJHDBDKPLJMRSWh|rtytqŠ­º¬¦£¯½¸°µÎÞ×Ú廃{‚{rpde…›Ÿ”‘˜š‰seXK<30..0//**3=CFKFFGHKLIFNSH?L\[`efgkgdkdU†ÃǿľÃÅÅÁÆÆÆÙĉgjXO}§½Ê½ÁÍÁŤsu}{wrq{~{}}vps{zwxuoouvx|{rouuvy{xtuyyzysmpvwu}tj†©«§ ‘ƒž‹oincb`n–“[2$',8QdmvwZi{j{”ya\[JFSZ[caTQWWPQWWUWXX[VXYXWVX[_WTWYXTLQTV[aa\ZWZQUgkSNgyy{{wsszzh`eQ;>FS\SQanla]qˆ†bRuŒ{dhjc^c`Z`jousvrd[cntnijkihhlighkljghcZq‹•¨²¢«ºº´´·»µ±´¹ºº·³¶¹¸¹½¸³¶¹¹´´»·³¸º¹¸º¼¼¸´¸¹¹²°¸»´±¶¾³¬¿²{`ikhkkhifechkghe]QPS\imnmlkrq`e„‡hjwtopppppoprssprusoqsptrrootsjg{~{|zxtxtu{xe^hppnlr}„ƒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€@pzjkqpkti_m‡‡zy€„„„„…„…‚„…‡††…„ŠŠ‹Š‚‹œ˜”™“’•’š¦ª¢›™›”‰……||y}ŠŒ‘xz}ux€~‚˜¨¯µ¿Ç³…„ˆŠ‰‰‡‡•—’–ššœœ›˜‹„‹‘“‘’ŽŠŽ˜ž¡¡”•™½ÜÐÁÄËÅÇÌÊÊÌÍÄÃÈËËÕãéàϼºÁÅÃÂÆ¼ÂÈÁ¾¾µ˜zgghmojopnkjklklprrpopsuslcdlpnmpqnlnqsnpppopsuptvyxeMDFGHIJKLMJGINRWdrwrz~to}‹žª®²¸´²½ÏÞØÝ纄~‚{sqef‡œ˜—–’‡{ttbJ<;630'-/*+9@@DIINPJD=515BMLHRaed_bkgdm\R˹ÂÂÅÄÃÀÅÄÄÙÊgiVP~©¾È·y~»À¯Ã¦vw~}ytq{~z||upu}|wuqnrqpptslktwvxzxwx||zwslnv{{wqq²­š‘…z‰’yeiqcehp”—i9"&..>Yo|q\ntpŽ”sa\WHJ]hcf`WTWTPU[XW^]UTXXZZURU[UQQX\\VRRSW`gaZXWZQSdoYMc~‚xvy|ywtu|zlbeR<=FS]SPaom_\q‰†aRuŽ|egic]a]Wamttosr`^ktrljmomklmjfhkmifmg^t—ªµ©­·¹³³³¶µ´·¼º´´·º·³µ·´±µ»¼µ¶½·®´¾º²±¸½»·¹¼¸´·¼»·¯¸Ã¶«½³€dmmijieeggbeffig[LKR^koqqnkstdi‡‚dfurpqrrrppqrpnmnrsortrrsrpottlly{€yvzwuw}vb[fptspvƒˆ…€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Eu€qswtmyn^e€‡}zƒ‚„„‚…„„„††‡ˆ…ˆ‰„„˜–“¡˜—›•–£¢Ÿœ˜”𛓉†{yrszzv|†…ƒ‡}z‰€„Œ“ž¯¸§…ƒ‡‰‰‡‡‡†‘•Ž”™–™›š—•Œ†ˆ’Œ‘–ž¢”“•˜»ÜÒÄÆÉÃÆÌÌÊÍÍÆÆÊÆÀÇÜéçÝǹ¾ÁÁÆÆÈËû¾­†ibfjimrlonnppooportronqtoqpg^epppsspnopmopqpppsusryysk_PMLNRSPMMKLQUYdpurtyywqh‚™®¸¸°²¾ÒÜ×áé·‚‚{sqegˆž•›—„xx~jNAC?<4$#&'0@FDHLLPMB;96999ESPP`h`VWZUT_RO–ÌÀ¸ÁÂÅÃÃÂÆÃÂØÏggVQ‚­ºÁ³~‡º¸«Á¤vw~ztq{}z|{toovvsqjejqonpoggpuvwwursuy|{rjnwz~zuw“®¦™–†{”–i]xuehll‚tB"!/13Ksriqxhzšˆi`]WMS`caicVW]\VY\WU]\TR[WX\\VX_YXY[\XROTQS]d_YZUXQRanXG\|…}zyyuwusuyqecV>?GU^SO`qn]Ys‹…aRu|dgic\a]Xantqmtq`[flojghkklmljjijiignh]rŠ“¦±°§®¹º³°´º·¶¸¹¶´µ·²²º½´°³µ¶±³Àº¯±¾¿³¨°½½¶³¿À¶¶¾»®®·Âµ«½³€dmmijieeegeeecih\VVSWejipposp`j†ghurmnnmnpopqrqpmorsstrssurqtrhnz{}xy}{vuwq^[houvu{…ˆƒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Fq|tuupmrl_gƒŠ|sƒ}‚€‡†„…†ˆŠŠˆ‡††‚ˆ’’”ž¡”‘–•–’”ž ™’•Ÿ”ƒwtxqnjbi~ˆ”ƒ€‹}z~}}‡— –„€ƒ†…„…ˆŠ’”––‘“––•–”‰Š†‰Ž‹‰‡‘–”” ¥˜‰”¡®ÎãÓÃÈËÆÇÌÍÏÎËÀÃÉÉÃÉÙãë߸œ¡¨£¤Ÿ¡¤ª®¡acfjkfhkjhgjnolmpqrssqppqrqrhX\lrkqsqnoqqpqqqppru{vuz|vpqmdZVVVQMLKQWWWduuuursuuqtwˆ¤´¸ºÀÑÛ×âéµ€„{srfh‰Ÿ™ “yr‡~lVJIED>/%(.9FIHJSSSK>9<>?QMDNSU`h\PIB>DOLQ™ÉÀ¾À¿ÄÂÃÄÈÂÀÕÍŒdfWT„¯¯Å¹{„¾º§¾Ÿpv~}wrr|}z{{tntvsqrkfkonnqpihoquxzwttuxy{ulmuzyypt—¤‘—€‚—zZr‰ylmnfozsN'*2/Coto}zo“£z[VSNMYb`af_WY\ZYYZURVXTUWPOVZWUVUWY]]VNMVRS\d_YZZ[SQ]lYFZy„|yxutwsszug`W?>GU_SN`ro[XsŒ…bRt{dhjc^c`Yajonqurf`foonlklmmmjklkhghikdXm„ «¦¤±»¸²±¸¹¹·µ¸¸µ´µ°µÁ¸³·¸¶¬­¸¹°®º½·±¶¹´²ªµ¾¶¯¼Á³®´¼²«¿²{`ikhkkhi`gghedgeYPPRZhmnonjpn`h‹„fhwtrssnrsplmorsrstsppstuutqsnbk~~y{||{ztrwsc]iptvw|„„€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Gq{qturoqi\e‰}x}}‚„ƒ†‚‚ƒ…‡ˆ‡…‡‡Š…|€Œ‹‰‘•Œ†‰Œ’“—“’Ÿ›–†wt}ofaZ_wŽ‹ƒˆ‡vozxx{…‹…€„„‚†‹‘““”••”†€€ƒ…ˆŒ‹•’ žŽ‡•¦¶ÓåÒÄÉËÊÍÍËÍÍÇÂÂÅÿÉÜèðÝ¢t{„ztuj|¡¢y_dgeacijkoljknpnmnlnprrqppwrqm_Yeskorpnoruqrsrqqsuy€wsƒ„upwrmjgaWOKINXWS^qvpswuuzsmq|‘²Â·ÎÜÙàæµ‚zsrgiŠ œ£•yt…‰{ndXLDEFB76=FIHHGORYXNGDADZYHDITdfZQG>HX\HY£ÉÁÀ½¾ÂÀÃÇ˽ÓÍfiYQ|£«É½y‚ÃÆ·ÃŸpy„€yur|}y{zsmsupllifkkkiihfipmosvsptzzwwvnkszxwnu“•‚‡Ž|wv\i—•vqqldfmmZ1%-0=Xqy{u„¥›lVPMNR\ddge\VYVRT[XTU[[QFEDGNWZYWPPT\`VMNTSV^c]VX_]TPYj\JXu€}yxwtxtt|xiaT;;DU_SNbqm\Yq‹‡cSt‹zchlg_b]V_lsuuul^Ybkjnoljkkikllkhgghng[p‡‘¥°¦ª¶·³±°²³´µ¹»¶µ»»±±¸º´´¹¼·­ª³¹´­¶¹¶¶»¸³µ¶¹¾·°»Â¶®´¼²¬À³|`ikhkkhiafffffhc]MJR]ilnrnjqtekŠ„eguqmnnpqqpqqpnqtsrsppvqpqqsvqdlz||zz|qnqxud`mxyz|€…†…€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€BoximutmldZh„‰|y€†…‚„ƒ€ƒ…ƒ‚‚„‡‰‰‡ˆŠ‰ƒ~‚‹‡‚ˆ––Š‹‰ŽŠ‰ŽŽ‘šœœš‰yzud[\Y\r‹¢•}Œ€xruxx~„}„‚„„„‰‘•–’“Œ‘Ž””‹…€‚…ƒˆ‰„œ‹–›ž¾ÝÖÉÊÈÍÒÎÆÆÈžÁÇÅ¿ÇÚæïâ¥nq€{…•vmnfedagoidnkiimswvsrtutqpprtoqvn_arvrnmoponrssrqqsv|qiowz|ssssrngaXPS_`Zbsyvv{}xv{~rsts­³ËÞÛÝã¶‚zsrgiŠ œ¦›v„†ysrdN@AINFAHOJHJHMOVYUTTRKPROICJZj\SF@VkeEa­ÌÀ¾»ÀÀ¿ÄÉͼÑŇdj[RzžºÅ´y|ª°·Â›kw„~wsr|}y{zsmltrljgehklkihefkmmszvoqz{yvpknux~zy}‡†ƒ“™”sfu”¥‹osqjefhib;'$(17>X{yu“ „^XTU[^^_^de[SY]XVWVX[\[RGINRTWZYUWRQ[`UMRQRV\^WRT[YROXi[IRp€ƒƒ|wuwytt}yjeQ88BT_TOdpk]Zp‰‰dStŠycima\a_Ybmssqwr^X`bjppjhlnlllkjihggng[p‰“¨´¨«··¯­¯¶¸±²½À²®»Àµ±·¹¶³²¹·²°·½¶«¶¿»³º½µ¯²ºº±³ÃŶ­·Â·¬¿µ‚dmmijieeegbbdgidXQQQXgmmklmsq`g‰„fhvspqqpqrppqqqtuomttoqsqporvpbf|{}~|wrsw|vgk{xwz~ƒ…€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Gqz|wolscXd}ˆ€vƒˆƒ€€‚|„†‰Š„„‡ˆ…‚ƒˆ„‚ˆ“™—”–“‹ŽŒˆ‰Ž‘“Ÿjqpb[agit‚›£‘|†“ˆxkrv{€{xƒ…†‡†…„Ž•–”•–’‘–˜’”™˜ˆ€ƒ‚€‚‚™’Š‹•¸áÚÄÊÆÈÌÍÊÇÊоÂÇÈÍÚáëݦ|‡“Ž£§’tlqqojgfhlmiellmprsqostusomorvvqqskgounmsrqvqqpruursvkRFQ`ntrrw{{xtqokklrtjfousrrstrp~urttwˆœÌÝÜâæ´€ƒ|roce†œ¥›œ‰u|wbgk`LCFGENOIHPPIFJLS[]Z[^TPVUKFJXhZ@5.4RbQi³Ò¿¾Á¼»ÇÊÃÆ¾´ÅȆcg\Ty¬¶Æ¬|²µ¹Ê p{‚zwvr|}y{ztnorpjfdeikjhmoc`mpstsrsuvuwxsmqy|yyqyƒ…’¢²¥„Š£†vy{mjibolE)%)/3-W~~Ž¥’tZWUYYV^gcabWQ\]WXZZXW[[WVYXY\]YVVXQR]`UMLRQW^]YVTZXPMXcZIRm~‚|vzzwuuw}xgN>9BT[QO`pm\Xq‹ŠcRn‹€ehlf^a]YblprqspaWaoprjfoqllllmmlkjipc[qŒ–¤²°¬µ¹³­²¿¸¯±º¹±°³¶°®¶½ºµ¶±µ°°½½²­»¿µ®·¿º«¯¼»®±Áø¶Áų«¾¯zflieijhhgfeihgjd]TPSZenorolpo`i‹‚djwppurssplnrrnqooqrqprqrurosskn~„ƒ„|~€{{€~uty„}{~„†‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Crƒ|zurssdYcz…{z„‚€€€€‚„…†‡ˆ‡†ŠŠ‡ƒ‚…ˆˆ„†Š“•—™•Ž‹‘ŒˆˆŠŽŽyfgm`Zbimv‚Žœ˜Ž}optuy€{}€‚ƒ„…„„‰”‘’—–’’••–œš‘‰…„ŠŒ††ˆ“ŽŒ‡Š•œ·ÜÚÇÈÃÆÌÏÍÈÉÍż¼ÃÇÏ×Úïá©‚“Œ–ª™rure^fhijihghqmnsuropklmoqrssqxtossnmqroqqqtsututqwvhQE@DIU_air|€}zyzqtuyzqlr{yusrrrrpptxxvw{¬ßÝÖå¸}„„|sqdf†¡ Ÿ‡og``caUF????OUQLQRIAIKQY]^afb]_YLDER\TD?98GNQwºÌ½Âļ¾ÅľÆÂºÌɈdg[Sxª¿Ì®~ˆ»º¹ÃŸqx|vtyywxvqonqpnlgcciliijeclnnquxvspwxytlmrtxuo}›¬­¤¢¡•£„m„…mlnalqR-!*/18g‹Š›¨]SUV[]Z`d_ccVQ[]UU[XRRWYVTZ[ZYZ\[WVRV^]TNOQR\e`WUXRWSOZf[FQm}€ƒxuyvutu|zoT?9BS[SP^pn^WoŠŠfTl„ybimc\`^Zdotusto_Xcrolmmgghfhijkkkjij_XoŠ•¥´®¨¯µ±­®¸¶¯±¹¸³²´·³¯±···º¶º±­¸¼´°´º¶¶¹¹¸´·¿Á¶±¾Ä¸¬¸¿¯ª¿³bjkillfeacehfdjg[SORXdmmspkom`j„fkwonroopqprtsoppnotsqssqqppushp}}‚€„€€€~{zxxw€‚€ƒ‡„€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Dmytyyrood\g}†yƒ€ƒ€…ƒ†ˆˆ‰ŠŠˆ†ƒ€ƒ‡„‡‰ˆ‰‹”‡„ˆ‹Š‰‹‰ŽŠ„~qgjk^Zcjlw‡’–˜“†qcaovyy||}€€ƒ„†‡ˆ•‘Ž”™••’““’™•“’ŽŠ‹Šƒ…†‹Ž’’Ž—œµÙØÇÉÄÆËÎÌÈÈÌÀ¿ÄÇÂÅÓÝíæ­zˆ‚‰‹{migcbbhmkebejljlqsqprusqprsrqtusswrigouomrststpwxttjRFEFCAHUZ[cpy~}~~vz{zztpqtttsstvxsuwwzytn‚°Õç峄„}usfg‡™œœz[Z_ddWLEA@GNOYYQTWNAJLRX]_ejfa`WKDERZUIEC?CCWŽÄÅ»ÆÆ¼ÄÇþǸÈÊŠfh[Sw¦¾Ê¬{„¸¶³Âžqw|uswyz|uoonomjifegklhfhfisnpuywstyxxwpiluxyq‚“—««¡©­™–…htˆ~jjkftb5 /-.I‡—•Ÿ—gQVXY]]\ac^b`TP[]VUSVWVVTSU][XVY]]YTTY^ZRORTRZbZMMTYXPISb^MSmzz‚|vyxwtty{vZ?9DQ[WP`ol\YqЇcUo…ychie^b^Yblqqpsn`Xanpptpgjneffhijjjika[q‰’¢³«¨²·±ª¬·¼µµ¹¸´´µ¸°¯ºÂ¸­¬¼º±¯¸µ­¯´µ±´»»¹µ·¼¾´®¹¾³³¿Ã°¨»¬wekjfjjhhfghjfdheZRORYdmmonlrqah‰divoorpoonnnooopqqpqrrrmnrsuwpbm|{‚ƒ‡‡‡…‚wy~€ƒ†‰Š€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Gmtoy{sjsg[d|…~z„‚…‡€…„„‚†ŠŒ‡…ˆ†{}‡ˆ‡†…ƒƒ†‰‰…ƒ„„‚„‰…ŽŽ†|roslbcnlhx“—†”±žgQakswyz||}€€€‚…ˆŠˆ‘Ž”•”‘‘“——–•—™’‡‚ƒ„„Š•œœ–”¶ÜÕÂÍÊÉÉÊÈÅÇÌÉÄÅÊÈÌÖÜåæ±m[htŠ~mbcec_ahmkdadikoqqqrsrqqpqrsssrtomrtkbmtpnpqsusmrzscTHFGGFCFMSSV`nz~~}z~yvvtsknqttvy{}zuux|yuov§å沇~„~vuhiˆ™˜—j=RkcVHELHEO]MWXSUZSFJNSX[_bf^\]ULEBM^YOLMKIHg§ÌÁ»ÅüÀÅÅÂÉ¿²ÃÊŒhh[Sv£·È¬x}±±°Æn{zvtqx}€€zplqsrojdchljimkcbkroquvsv{yzztmnux}xq„”Š‘ª®¢§®¡›šh_y‹vikgrm?$1(/c¡›˜—wUW\^][YZacaa_TQY[TTWWUVWUUX\VRUXZYYTVZ]XQPRRS]g`TQU_WOLS\ZPNhz‚ƒ{sy|{wtw{{]<7EQ\XOdngZ\vŠeZs…wdkje_b^W_iorrsoaZcompnjjnlggghjjjiine_tŠ’£´§§³¹±ª¬¸»µ³µ³²³´¸±°¸º°­´½º±²ºµ¬°À¿³±»Â¾±¶½º¯²¾¾´´¿Ä²ª½¯zgliehjhidbafeegb[SPT[fnollmusbf†ƒgjuomomoooponpsrnpqosuointvuunbp„Œ‡‡‡†‰’ŠŽŽŒ‹„xy}ƒšª¡€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€GtwwwtqviZc~‡}w}…„†ƒ~…„…‹ŒŠˆŒ’Œ€ˆŒ†„†‡ƒ‚„„„…††„„…†‹Œˆ‚xqpiep}sbuš‘r‰»©gSmlmrvz{zw}}}}‚…‡Œ”™—–••“‘“—˜Ÿš˜œ™ˆŒŠ”œ –•¹ßÒ¿ÌÍÊÉÈÆÃÅÈþÁÄÁÅÐÖãä±bD]~Œ…jYajhdcehjifcdfknoopsutpprtvuroqqopvsh\irtsolswurprlVINKIHIHDHQVV]jw{~€€xux{xrrrrsuxzzurtxwusrkr§×¶ƒ€ƒ}wuiiˆœš™c,>\WB7AQKAJXLQRORVRFEKRW[^`ac`[NFA>J[ZVU[ZQN»Ð¿¾À½¼¸¿ÃÂǼ³ÉÉihZSv¡ºË®x€´´°Ä›nz‚zusoz}{rjmopnkddjigilja`gllouuqrw{|{umovy|zt…’…¬©–¢²©¡œnid|“yajrqH(*$?„©œ’€_R]^^^ZW\acadaXSWTPQWWWWXUVZ_YVZ^^\[VVZ\XQNPPS[]WRTWZSOQV\YOKcz‚…ytuz}yvw|€_;5DS\WMdmgZ]v‰bYu†xejh`[`\V^jqqqtoc\dmokegnjgljjkkkiihjb]sŠ”¦¸¨¤®¶³¬¬´¶±²··¶··³µ¶¶µ±¯²»¾´¯¹»´±½Àµ¯·¿¼®´½º®²ÁÁ´¯»Á°ª¿²~cjkilkgegedhggicZRPT\fonnmlqq`gˆƒhjtpmnnqppqomorllqrmqwsoprpptqfk‡•““”–š–‘”—––—Š‚||–ÇÙÁ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Fxˆ|wutsuiZd‚‰|u~„|‚……‚ƒƒ‚†ˆŠŒŠ‰‰ˆ†„ƒ‡…‡ƒ€ƒƒ€~€ƒ…„‚‚‡Š†}rkj``q‚u`o“”~…“yZ`unntxtqtxwwxyz|~†“˜™–˜š•Ž˜œ›–˜›““‹•–•š›ž»ÜÓ¿ÇËÉÈÉÈÄÃÄÄÅËÍÄÅÔáêêªVQ†œ‹i^]dghkkhhiihfedljikortupooruvspvqovysf]jppsrpsrqxrmk]OSPONOLFIUVX`koqw{|{wrw|zyupprvxyssuwvsqrqwiw¦§…}|vvih†š•˜˜i/-FXH8?QIAKWMNNMPVQB?GPVZ^`_he\KEB?KX[[YbdYX•ÈÏ¿À½º½½ÂÂÀø²ÌÇjh[Uv ¼Ê©u»·­¼šnw~zrp{{wxyrlrqoolfbfgiihfgimimtwsnqw|{yqjmvz{}v…“…±¤‡´¥¢¡€`j•ŒlhrpQ- *^¢ª›}`QU]aX\YY`d`]c_XUUSQSSVXZXST[YYWWZ]ZUWVY]YPLMLV`_USTTTPOPT]^RLbw{xowywvw|„gA5BT\TM`nj\[r‡€\Vt‰zdhea\a\U\homorob]birlhkljinkkkljjhgja[q‰’£´©¦±¸³­­·°¬°¸¸´²±·µ³µ¶²¯±»»²°º¹®ª½¿¶³¹¾º¯¶¾¿³°Áŵ±¼Á¯§º¬wdkjgjkggefghdaeaWQOSZfmmmmkrqag‡€ghtqoprsrrrpnoqortsstvxspnnrwrdi…‘Œ‰‹Œ‘’•”“—ž›”ˆƒzŒ½æèÚ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Hy‰}{zuptjYaˆ}}„ƒ„„€‚‡†„ƒ…†…†ˆ‹ˆƒ€‚…„ƒ‚ƒ€€‚…}{}}}ƒ†skjjbbo~ykv•’“~WUrƒ{rtwqkpwstvwxxxxzƒŽ‘‘•™—‘”—“ŒŽ•˜–š—“›Ÿ—ŽŠ‡‘›™“œ ¡¶×ÔÂÅÉÆÅÇÈÅÅÆÈÃÆÊÉÍØÞìë¥`x§˜rc__`bjlcijjjigedqomlmosvwtrrtvvtttrosyrdhqoovurnotojpm_URSPMMHJTTV`ikhmwssxxtw|yxsoossoiepzzutvwqtrp~Ž‹|€zuuig…˜‘‘—o50LaT=CVTOUXNQSRWb[DBIPSW\__bd^PMG>F[^^Ydj`e¢Î̾Á½¼¾ÅÆÄÂǺ²ÊÅŒjh[Vx ·Æ¥qº¶«º˜nw~zrszzvxwqoopqsridgjkmkhgiioqsutstv{{zrjkruuyr”Œ—º¤‚˜¯£¥¤“ˆkcxŒˆmml]6>®¥ˆdMP[_bVZVVae`^a\UTWVTVYVSUYVUZYZYXZ[ZVXVY_ZNHJNV]YRTZZRMORT]^TK`v~‚}tpvvrqqw‚vM7@SZQN_nl][p†€`Vq„ubjle`d^U\gntsrk`]gpnllkijkihhijjihgnbZp‰’¡°¬ª¶»²ª­¹´®²»º³°±±¯²»¼²¯¶»µ¬±¾·©¨¿¾µ²¸¹µ¬³¹¹¯¬¼À±¯»À®§º¬xglidhjijefgjgejgWPOS[fmmlllsraf…‚jjtrooqlmoppnnorqmntsoprpoquyrbl…‰ŠŽŽ‘•–”˜™Ž‰~ªáèÛÞ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€J}‚€ytng[dˆ…†}}„…ƒ€‚ƒ…†…‡ŠŒ‡ƒƒƒ‚ƒ……†…ƒ€€‚„€€€€€€~vppojqmr~}‡™ŠŠ–†ZVžuiqtrpnstvxxxvuz‚Š‹•˜’’•˜—“–™—™Ÿš’–š˜•Œ…‡”™•”¦£›°ÓÔÄÈÉÅÂÃÅÆÈÌÂÃÊÌÅÈ×ãçä¨~™œtbcXX^`fmkiklkhfeflppiflsvutrqqqrsrrstxzpaautpuspqumdfqvjZWXRMOOOTUV_jlhipqqy~{||wspstm]ONg{{vwxu}lgnuƒŠƒ~ztuhg„—œ‘šr4=`cM8Daf`ZNNTYX`phKHOSRTZ]]ih\IFC>I\ac]hodj¨ÐʼÁ¿¿¿ÂÂÂÆÏöËÄ‹jh[Wy ³Æ©s}¸·¯À˜lzytquy{|}xqqmmllh`_fjggieadikqvuqpsvxxvpimw{y|q}’Œ–µ›}ޤ£¤›ŒŠ‹t^`‚˜|fhe@!P˜®™oSPXcb\XZSQ]dbbc\TTWWTUVVVYZVU[\ZY[[YXYXUZ`ZKEJRW[XRUWTWMLRTX\XPbrv{„‚wuxtnkkq}W:>SYOPani\\s†}aVr‡xckoc_d_W_ksrqqj^\fnmjjlljiidefhhhhhnaYq˜¦´¯ª²·±ªª³¶­°¹¸²±µµ°¯·¾¸±±»µª®¾½³±¸½¶²¶¼¾¹³¹´¬±¾½³°¼Á°©½¯{ckkhkkgfigfigfhaXQPU]honomjon_g‰€hitsqqtppnmnopqmprrolntrqqqrwsglƒŒ‡Œ’–”•™œš“ŒŽÄïæÒÕ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€J}{€€}tgY`|Œ„yƒ€|€ƒ‚€„‚€€†…ƒ…‡ƒ|}„„~€~|~~€€~‚|}|ulkmknkrzq}ˆxˆ‹ww‘°fjpmsloqrqrvwttx|‚…Ž”’–™—“•–•˜–—˜˜š  ™‹–š˜˜¢£¸ÚÕÆÄÈÄÄÇÈÅÅÆÂ»ÊÓÁÀÙèì๕xYV]YWZ\^bggilmhcejnqtpijrwsssrqprupusswyseamtnqvojchnopqpoebgfZWYS_WS`njcgqsutuy{yvnnxv_NOJTdtytrvwoqsoxƒƒ{wtvnj›”›ƒ?+HOB?QljTHINS[[e€wI>MQQVUV`feYKCEa_MGNNNOKHFIQVRT]\GBB42CLSfhcfkamŸÉżºº¹½ÆÅ¿¾ÇÁ¸ÆÃ„e_DEy¦¯º¡r»¾µ¸”djtolnoqsttrpnrnkklfdglmljiffjnoruspszxtspifjnnji}–”¤¨„kƒ•™­—`mŸ”hfqom{…gg›škW][[]_^\ZXZZZ^^`d\URUYXVV][WVYWVY[\^_^ZUPVYXZ^RDDPZ[URQNKLMMRUWZUO\lv{~€€}stuqv|uyƒuQJXVPcwn[Yqˆw[Ur†ybfgc`aZU`jrnkonb]ekjlmlkijjjiiiihhglaXp…©·ª¦³¹°ª®¹µ±³¸·¯¯´³°¯¶¼³¯·¾»°®¸³¨©¸·±¯¸·°°·¼¶«±Á½«­Àí©¿­xbjjfghfgkeceimj`VPPT\fmlmihpo\fŒ‚fjwplqwpqommqrqmpssqoopnnqqryugmŸš˜œ ¡¦¢¢­®œ¯åòèæëíãÛØ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Glww„ˆƒzp\a}ˆ€€€ƒƒ€€~}~}ƒ…†‡…ƒ€€€~€‚‚~~~|~{{~||sotuliZW`_blkm‚Ÿ³¡„’®ª”yjlmnpprqpssmlqu{„‰‡ˆˆ‡‰‹‰–”ŒŽ“”’•–’‘’“‘“˜–•°ÇÆËÚÖÌÈÃÃÅÇÄÀÂÈÄÈËÉÄÇÔßÕskc]\YY[\^dh`TY]adiopmqolpskbdltzxwxvqpnouvxwi^dmjhpssvyyvuwxwrvwuu{xn`[[^[]lznxqfo{xqnwywwzzy}}xvwuruuvupqvywwtqfbuŠ‘‰†Ža0;G?SnbHTxvVFNQIEFEFKRROPVRBA=))>JT[bhce_j—Èɾ½À½»ÂÃÁÃÆ¼¶ÊÄ‚hdCCx¡±¹¡z‚²°¬µ”dkuohjjnquurnlppomjedikkjhgdejoopstppwqqpjcfkkmlhx—¦ xk‡“–°˜[m¥›phsuiowo€–~^X_Z[\\``XVWX]cece_XRUYYVXYWWYXXY[ZYY[\\XTWWV]`PAEU]\SRURLGKOUWWZTO\jrv{ƒ€rrywx|zz„aPVSO^qiZZsŠ|\Vq„xcefa_b\Xajpplnl_\emnnkjijhfiiiihhggoc[s…ާ²«§³¹°ª¬³´®®¶·±¯³·²±ºÀµ­´¼º««º¶§¨º½³®¹¿¶­¯»º­¯¾¾°¨¿Æ°«¿«sckkghighfeffehgaWQPV]hnmjmlnl`j‰|hnwonqqppoopqpmrtsqopruqprqsytdtŸž¤¢Ÿ¥žŸ®¯£¸èëéçêëçÞÖ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Hpzu~}yxq`_v…‚}ƒ}}†…~|€€‚ƒ‚‚‡…‚~~~~‚„†„~||~~~~~|{z{{vmiiklZT[knhv—¤®¯š“¦©œ˜xhmklrnnnnqrmlrvzƒˆ…ƒ‡‰†ˆŠˆ‡”‘‹‹Œ‰‹‘’‰ˆŠ‰Š‹‹™©ªºÔÒÉÉÆÄÄÇÆÃÄÇÄ¿ÄÇÄÌÕÑ …ohaYXZVXZ]bfc\^ZY]dinsrnpxxmcaikpvwspossuyvvwmdlywoqtvywuvz|{xyxwyzvuztj_]\Zbptvkerztmr{~zzzyxwxzywwwsrptxtpu{z{xukfwˆŒ‚Œ„R1BAFdmfen†nTPNHFHAFNROKLNPGC@98@FKJTikf\k˜ÉÌÄÂÁ½¼º½ÁÄȾºÎÄkkRNxœ±·žxƒ³¯¨½›giqg^_gjnqroljlppkfabhfhijiedgmnnrvqnsvtpicfjjpngpŒš§•owŠ‘²—Ws¨™xrqvmst~–j__d[\a^\^^ZXVZbddgaXSTVVWXWTZ]VW]\[VTW_`[UVWW]`N@EY]XOQVTPFLQVVWYRP[gou|€|suzwtxzz„nYUPM^ogZZpˆ|[Vqƒvagja`b[Wajpplol`[dklljghkkhiiihhgggnb\v†¨±¤¤²¹²®¯´µ®®´µ­«¯·°®¸À´ª®¼¶¨©ºº®­¹º®¨·¿´¦®½¾®¬º¼°©ÀÅ®«Á¬pbjjfhhfgccedacd_WQPU]gnmjommlbk‰~hmvonpnmllnopqrpqqoprsrvtsqrwp_o•«¨¨°¯©²®´¾½¸ÉæêéèèìëáÔ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Cp|pnopr{oaew€€€€}z„{~‚‚†„€}{||{„‡†ƒ€}€€~}~|y||ztnkhbca\fpn€ ›š–¤¢‚wx~oflnrrquusrpoq|zƒ„‹‡…‡Š‹‘“ŠŒ‹‰”“Œ‡‡……‰ŠŽ“‘®ÕÕÉÈÈÄÄÇÈÅÅÆÌ¾ÁÆÃËÏ¿Š{kb\VUXUY]adgfc][XZ`hlmmrutrqj_jorsvxvpptrrrsxxqqyxqqtwuuvxwtsusyww}ysw}se_b_]dupa_qyoirtuwywvxwxwvz{xtrrvzupqwwwtrjetƒ†~}ŠP;JAStnlƒ’€of]UNIAJTVPLMMSRJGJHGNKNLYgh[lÌ˼¹¼¼¼ÁÁÀÀý¹ËÈ‹kk[X| µ¾ t‚¾»­¹—acmfaeghjkllkkoolhgfccfhiihedhnmlpuqosvnhgdeiknlcjŠ ¬“q‘†’®ŽXq«œƒxfr{uuƒšYY^Z\a`[[^\ZYX[```d]TTXVWZY]ZZ[ZXXY^[Y\`_YRTYZ\]PBCSVSNORPNHMQUTUXSNXepx~}|wopvyw|„u^TNM`of[Zm„{YUrƒt_hndaaYT_ksqmom`[cilnlheghhiihhggggj^[wˆ‘ª³¢¤³¶¬©®µ±¬®¶µ­¬´·®©´¾¶¯¶º²¦§³µ­¬¹º±­¸»²¬·Àº«¯¾¹¥¯ÁÁ©¨Â®qaiieggeffdeedgf_VPOU\gmmlmlonaj‹…fgtolnplloqomnrsnlptssvsqqqsysbr§È¾ÈÌÈÉÍÖÚÒÐÞìèêìíêäÝÙ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Bpzpspms|tbe~…|{„„ƒ‚‚€€ƒƒ~|~‚†‚€‚‚}„ˆ†‚€~†~|€yvyz|yuqf_cdiiurh|Œ’‹ˆˆ†wklnknomqppoptusppxz~ƒƒ…’މ†ŠŒ††Ž“”“’“‹‰Žˆ‘”’¤ÇÓÌËÇÈÆÄÇÌÈÁÉÁÇÉÆÒÄ–}wmc\VW\U\bdefe`a\^\`hghsuuuuqidclrrsvwtqpooqrstxvwyumpzvssuvvvwvvvuvwvtuzwkaacaopY[xwhiwxv||w||xxyyywxyrsttsqpprz{vmlx~‚}~ƒ~gSMHStoi}„“ˆ|gSDAMVSLJKLJROINUX[_YOUfebk¡É˼¿À½¿¹ÀÀ¿Ä¼¹ÑljhfVT{¢´½¤x€µ¸´»•^cqkcbhikmnmlknnlkjfdfkmkhgedfkhowunnrrlheadkonf^n«ªrŒ’„”¬Rv±¥…vz{vz{‡ˆnYX\^^]^^^][ZXV\cccg`TUZXST\_YXZXVXZWVX[[WUURRW]]M=CRVRQPNONMPQSVWUVSVemv}}yxvtvzrtziZOO_pj]ZsŒ{]Tu…uaeh_\b[T^lssnol^ZfphhkjefjlgdekmighkaZr†Œ¢®¨¨µ¹­¦©²±©®·±­±´²««·¾¸´¹º±§¯¾·¬¯»º²²¼½±ª·Â³¥°¼»±«½Éµ¨º­u`kihjfgeffefdfibTPMQ_jlghjjonakŒ„ghvtrojplnqnmqsostpnprtuuutswo]s»ãâÞÞßÝàâçêçãçíêëììêãÛÔ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Jv}qx{xy|vedx€|€}€‚~€}|€€‚€~‚…€}~|€‚††ƒ‚ƒƒ€~}zz{~|vojdcghcrzeo”–ˆ‘š‚`qŒpsopqnnroorttrrtwz‰‰‡ŠŠ†‰Š……‘’”–•”“•““Š‹‘’‘•‘˜¯¸¶¼»ÀÄÇÉÌËÉÂÁÉÈÉɤuqzp[W_^X\[^dfdcee^YTZghjstuvxuoiigmx|wqqusqqrstvsxzwuvvuyvtuvwy|wsqsttsst{}ukea_kkW^xvmuyywyzy{|v{~|xwxzsrtvtpnozzuqhdq{{z}u`NHbtimusƒŠ|wkXEJTZRKHGCITTNQWZ^bYMN[`epœÉÍ»¼À¼»¼ÅÇÃż»ÓƈgfVU{£²½¢u~¶¶®»—`doiaaghjlmljinnljgccgghhhgddipmoqmijmpnlf^`fjlh_m’­©Ž~‡š«yU³¤‡z€‚€y~€sc_a^]^`^\ab[VWW\ddabaUTXYXVY[XX[ZXVTVVWZ]^ZV[TSZ]M;?LXVPOOPKJNTUTTURTXflrzz„}wvwxvvsw‚€r]KK`nfZWoŠ|ZRs…ucgk_\`[Valpqmmh\\hojghhghjhjhgjlljjmd[s…‹ ¬¥§´¶®¯²·±©­´¯©¬±¶¯¬³µ®¬´¸´±´¸¶°®·º¯ª¹Âµ¦±¿³¤«»»­¦¾Æ¯¦½¬q`lhhifgecdbdcehb\UMNZinmkmlom`iŠ‚hkvqosstpnonnonqsrpoqssrrssswp_zÄçâÞáäâÝßäèæäçîêëëìëåÝ×€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Gu}ptyvsvqcbu}€}ƒ|€€~€‚€‚zv|„ƒ€ƒ~{~€~{{}}~{wpifgecWbnq}‰‹ˆ‘ “pƒ§‘ktrimpmpssssrooqvw€…‚‰‹ˆƒ…‰††Œ•–™š–“•™”˜–Ž‘”‘”‘˜›Ÿ«¯µ¾ÆÈÈËÏÄÈÎÊÐÀ†cuxjY[\YYb^^ab_dlhc]W]ikhmpstuuohegmrtrppstrmmpsruxywwxxurtxzxrqqrtxyyxvuvy{{ysg\geU]son}yxyxz|ywxz{y{|ytqprwwrpquwxxlbo~||}|tbSTTZhqkjw…~}‚mTDFO[]N<;DLRSS\c`ZaYQNU_jr—ËÕ¿¼¾¾¾ÀžÆÀ¹ÉÆffWU|£²½ p}¸µ¦´’_dojehfgikkjhgjlkieabgijjkhcdkpopokjmngjlgacgfhk_m–°§‰“‹ˆ ¥q\ˆ¶§…‚|y{€ud^a_\bbb_]`_XZYV\gd^cZRUWVVW[YVVWXZYUTVXY]_\WWTZ`ZA4AOUQQTSOHKMRSOQVUMUdlrx{€€~xtsvwtx€{dLMcmdZVm‰]Tt…uafh_Z_[Xbklooqj]\delijkkllhjjhgillii`Yr‡Ž¥±§¨µ¶®­³¸²­®´²«®·¼²¯¸¹­ªµ¼µ±´·²°¶¸¼¯§µ¿³¤³¿¶§®ÀÁ«¦Á۫ĝr`kihjfgeggefegjcWTQT`jkflmlom_iŠ„jmwokoqnnmmpqqqponmnpppporqswq`|ÉéÝÙßãàÛÝâçæäçíêêëììçàÛ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Gu~ooqppok_bw‚~€€€~|}€~‚€€ƒ‡‘¥ ‘†…„„€x|~}||}}zwwrikkeda[]{…km†“ž¥–›«gnqghqoqrpoprsssur{ƒ‚‡Š„ƒ‰‰ˆ’“—š˜“”˜š›–‰’”Š’’Ž”Ÿ¦¨°º¾¿ÅÎÉËÏËέslƒv`Y]YSX]_cecadifba\[gj`enutrsndajqrrvupsroljlnpxyxvtvvvquyysnnrtzytszztrvxz~~rehhZ_lko~}yytv|xwu|}zwxuqsrsvvsonrwz~sen€|{~€{q`NVKSon_nxqx…†rSCFN^cP4-6AEFJVcc\`\VQScrw˜ÊÒ¿¾À½¼ÁÈÇÁÆ¿¸ÉÁ„efWV|£¶¿kzº·¥µ“`enhcgdfhiihfedgihgcbfijiigbbhmmooifgghjhdainlem`m›±¤Ž’‚ƒ  kb‹²ž‹„}}~|oebZSXecaa`]YYYXXeqg\b^TSVWXUW]ZWVTVXVRVZ\[[YXWV[^ZH8?PTOPTSOHGJQTSRSUNVcmtxyz}wtvvssvz}jPSenf]ZnŠ^Uu†tadg^[`]Xbjknmoi]]egihjkjiifhifcdjjgjaYs†Ž¤°©¨´·ª¤«·´°°µ³©«¶²ªª¶¼´¯´¹³¬³½µ¬³µ¸­¨·¼³­´»²¨®ÁÁ¨¢½¼¥ªÃ©o`lhhifgeggdecdf_VROR\hjgjkjnm`k~eivqnnmgmqtvrlmppoopqrrppqqqvo^}ÍëÜÙàáÝÞßãèçåçìêêëíìéã߀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Gpzomnorqndew‚‚ƒ‚€€€}}‚ƒ€€€|}Ф·¼·¬œŠ†Œ‰€|€~}}~|{{zvtmghkdcliYuxm’—˜‘‰nhnmknptrrqrtvwvvpyˆ‹ŒŠ†……ˆŒŠŠ˜––˜™š –”‘‹‹Ž‘“ŒŒŒ–š˜œ¦®´¾ÈÆÇËÌÁfy†q\V\]ZV^^befdeggab^Wcoc_lyyuvrghgiovxwtwrpqojmsswxsruwuvvwvtrv|wzyuy}xlnw{ww{yrnpebkow€{xzuw|wtrx{xxzytoqstvwtptuswtjo{~yx{iKGQ\oi\n~mjt{„|\EIS[[RD4(07=NSNNTUPFDNQSWOB@MRTams|{}{zxuuvwtx|ƒ|_I`mg[WoŠ|^Uu…t`dg_\aZS]hmilpiZ[hokhhhfghfjhgijhffkb[sˆ¦²¤¨¶¶ª¨­³¬¦­¸±¦«µ¸¬ª·º­ª¸¿³®·¾´¨§½¾¯«¾¾¬¦´Áµ¥¬¹¹¬­¾Ã¯¬Â®q`kihjfgebcbcceibUSQS]hmlpolmj^hŠ‚hkvqossolmpppqqtqpqsstusstsswp^€ÏéÜßÞÜáæäåéëèçéíëëêêçã߀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Is€ts}…„~|smt}|w~‚€}~ƒƒ‚‚‚€”ÀâÝǽ§Ž}}€€{|‚ƒ|y|}yyukhkjipink_gvj\Wlލ¾¦~wnrsmnnorsrtvsoxxz~‚‚‚…ˆ‹Œ‹‹Š”™œ›˜˜›˜ŒŽ‘”––’ŽŽŒˆ…Ž’Œ‡–œž¢ª¹ŠaƒgYs€`YeWW^caaeijoi\YZannaZevvpomfeejqvtqutvxuootqpoptyzxwvvvtsw|~zuruxxuztu{{tsxwuidjv|twwtyytwxyvuvyywuurpqtvvtpsqy}ss}|z}|uz{mw•›‚w……YCEOix\KKPUWXVMCGIPSSVO=?XYSf{|vœÊ͹»Á¾»»¾ÁÆË¼·ÓÁ…ghXSw›©°—q€¶²¨¹“\ania`degggecbfjlmkfeighhigcdkegjhehljkgec`bgimd^}£¦•…tea„¬Ÿ]L‚±¢……‚ƒzum_]`]_e^_le]juinypa_cWVZZVWY\XZYURUVQRY__][YW\[XUZVE=ITRNRVQDIMNQXYK=ALSdos{y||~}wrtzzsvy€iPcqiZVq[Ss…ubgjb\^XS_ilfmshXZgkllmkffjkhdeijfccg_Ys‰‘©¶¡¤µ¹«¤«·±¨±½³§«³¸²®²¶²­°Áº®±¾º¬«»º®°À¸§«¸Ä± ­¿º¨«¿Æ¯¦Â°m`lihjfgehhffdeg`VSQRZejjmmjlk_j„ghvtrojllpropqosomorsrsrqsstyra…ÑéÝàÞÞéãáâçêèèéîìêêéæâÞ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Lwuy‡†wfdx‚{w~{‚€ƒ{€ƒ||‚ƒ…~žÕëÛź¢Œvr}„ƒ‚„„}y~~ywwtqppoljlpifyƒpX\ˆ“ƒ¨É£|vnpomllsrqqsuusrssuy~€€ƒ‡‹Ž˜˜”“••”–“”—•“™—ŒŠŒ‹Œ‰Š’”Œ•—ŸžzmƒxYl‚v\[ba_\]adddeih_[\cppeZ`kvztrfcfkmqwzttwyxurpppqrtuvvuuxyxyzwxutwzwvzxutvwvtttmcdpxxx~xx{{zyvwxxyywutquutuuw|yqs|{su~€{y}}tz’Žv~›˜yO@BAc‡iGHQSQSROMKJJQYWRRS\\XjzršÉÊÁÀÀ»»½Ã¾¹Á¾ºÎÃeeRPx›¦°—nz°¯§¾”^cmhb^cghhjfa`cghggdcejihhgdceenofbghcgfeddeginec‚¢¡yi`Y„µ¡ZH…­¢‹€‹‰wtzugab_[bdmz}mfw{gisldbZXWVXYXWVTXYVTUWWXY\_]YVUWSVZ\TB;NQNNUTLIKMSTSTOAFJQ[ht|€€{vstvrqqu{}oYbmj^\qƒy[Rqschha[a^V\dioopk_[clgknlllkhiiihhggflaZqƒª³¤£¸¿®¨¯´±¨­¸±¥©´³ª«¹¿´°¸¸³ª®¹³©¬¶·°®»½¯¤¯½³ª¸Ä¼¨ ¿Æ­©¼§s`lihjfge`dfigfg_TQQT[gmijkhmh\m„flvqpoqmmnnnqqolpqppoqurppqtyq^ÏïßÛâççåãåéêççêéììììçßÝ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Cmwnortupphjz€~}†‚‚†‡‚|€„}€ƒƒ¥Øíßų®¤‚htˆ†|†€x{|z|xrmllgacnfl‚xmƒ“ˆ„‰ž£ˆztooqpmlrrqrtutstuuz‚|~†ŒŒŽŽ’•““•˜—””‹•—“‘“”“““‘Œ’ŽŒ‰ˆ‹‘ŽŸ“mtƒjg}zia^][`\\bfffhli^[Y^kpj`^cpyrojedimsvtuwvtsutqnquvsprvttttuyytwutvywuwwvvxxvsq{m\[l{}{wxvwzxvwzxwvustwsrtvux{{qpquwuuz}€€zx{kUUXVaŠ˜{PCE@TzlKFNPPRRPOPOKNX[WUT___uwv›ËÌ¿¿½¾ÁÅÁ¾ÅÀ½ÓÃeeRPw›¤®˜r³®¢¹[akga_bijhfbaefijjidaaggggebcegcbeebejiheb_`cfkdd†¥„rf^[ˆ³˜TJƒ«¢Žƒˆqsysgdeb]bs‚‰…o`jsiklcfgYZSPUWUUYVYZWTTTTXY]_\WTUTRUX\YJAIRPLRSKEFLRSPQROWNN\lsx€‚€|xwvvtnlov~wd^jj^Zp…`Wu„tdgg\X_\V_imolkg^]elhihhhjjjiihhggggj[Wv‰Ž§¶¥§¸¹©«²³´¬®µ¯§­¹¹«¨¸Á·®³¼´«±¼²§¬À½®§³º´¯¹Á³¨³½¸«©ÀÀª­Á§k`liijggeegghddf_ROOT\hoknnimi]p‘bhsopprlllorpnqqoqrqsuttrqqsxo\†ÐëÞÝãåãåãæìéãäìéêêêëèá߀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€8anggdehlngfw|{€|‚ˆ‡†‡…~|‚†}€‚…¦ÔèÜݼ¹fo€|†‚x{~}|xvohhkh`cnin{jo¡¥„y‚ŠŒzyunnrmmqpqsvvtrsqu}‚ƒ‚„ˆ‰ˆ‹Œ‘‘”–˜œ™”’’––—𖑑ޑދ’’¦’sqmk„…i]a[Z[[Y\beeehkg`][\irlc]]kxtmfdfhlrxwsrtwxtsutpmqtsrswuwwvuvt{yutwxwxwvuuvxxwxj[[o~~wwzzxyxwx|wtvyyxvwtuvuvxvwwttwtsw…ƒ{olqhS<3=CF`q_LCG@DgnRCJLMPRQRQRNKSYYWd_\e}qs˜Èɾ¹º¹½ÃÄÁ¿Ä¼ºÑ‚efRPw𧝖q€¶® µŽZalhcadiifeaafeggffc`agghhecdgiihggfdbghigddgjide‰¨•vhi`a‘¶”SQ„ª¡…ngqwpghhc_qІ}kbprmoj_ei\YWWWYXXWWWWUTUUTUY^`^YXZXVXWYXK@HSTPSSKEHMQRTRPQTNNYhsxx~{xxwuumosx~l`gg]Zo…^Usrafe\Z`[T_ikfkql_Ybkkihhhgijihhhhgggmb\t†¥® ¤·¹®®²±²¬¯´®¨°¹µ¬­º¾°ª²¸²ª±¼´ª®½»°­»¿³ª¸Ãµ¨±¼¸©®Á¿©®Ã¦g`lihjfgeghffccgaVRQT[flhikiok]m‹dktqrrsqspmqolnnorqlloqvsrqswnZˆÒîâããââæãæìéàâìëìêêëåÛÖ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€4\hdc_afh_S\w„€€|}…‹‰~wz‚‡‚~€„‚žËÞÕöÆÇ”afy|‚€ƒ|}}y{u…„xi[]ceddfz˜—€su‡›’wwxnouronruwvuuuuuwz€„†‚}€†Ž‰‰Ž‘‘””Ž“‘Œ“’ޒމБ‹ŠŽœ—‡vq‰•u^`_XXZWZ^bddefhhdb_^grkb]^gvxocdfhiqwyruvwwvtqlnqrpmpuuqs{{xvw{ztsvxvvxyyxxwustj[Xhy{vstwxvz|yxvstxzwruvsrtuuxutsx|wvzg]ZYO?757=AIMJEBFB?XhTAFHINPQURWUQRUW\\Zdntxts™ÊË¿¹¹»À¼¼¼¾Ä½½Ö‚fgSQw™¬°“l}µ¯¢µ]dmidbehfefeabefedecabghjiebdgihgeddeehigb^_elideФŠjbhZ^“³ŠLRŒ«¢€r\]oumehga`|•‘‚wgfvqkom_`e[PTVVUWWVVVUUVYZZW[ad`\\_YVXVUSE8EPTUVQIINPORVRMPNQX`hryzy|vvvtypqsqz}rhhc\[pƒzZQp€qbfg^]bZS_iiknpj^[bhihhifccghhhhghggkbZp©±§¤²¸®«®´«©°·±«®´²­­µ´ª©´¹±©±¼±¦¬»¹¯¯¿Â²¥¯Ã·¦¯Á½¨«ÂĬ¬À¦k`liijggecedfceidXTRUZejfeiipl]kˆ€dirlnmmoromopmmstsqrqprurrqswn[ƒÒðååãáææâäêèâãëëìëëìãÖ΀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€5[f``\_dbWO_{‚‰†z{„‹xtuz†„ƒ†|šËßÒÄ¿ÍÆ”hp}~†ƒ~z~‚zv~’ž©¥—‚kZ\]dffxŠŠŽƒnq’ª–oqwonuutrrvvrqtvtyrt…{z|}„Œ‰‹’‹Šˆ‰‘˜˜””‘Ž‘“”•‘‹‰†ˆŽŽ’Ž“™ˆ~“§‰``ga]UV[^`adhhfikib_]blob^`bo{tjedfjpustuvtttsrsrrsttuuvqrwzywrvwvuxwsqzz{yxvtsxp`Xev{wuuxxwz|xvyzvtwxvvwurssuzyvsuvsv€„dPPPIA;>;12BIIJCCDEDMWM@CDFJMPWZ\\[[XY_^alihrsl™Êʾ¹¹º¿½½¾ÁĽ¿ØÁ‚fhTQv˜¬°“k|´® ´^emgbabfgfie``fiihhebbghihc`addgheceghbdfdaafkidgˆš~caeYc˜®JZ—­¢‹veOUntjafd^c„—tcfvmksqcdh^SRSVWUVXXXZ[^^^^\_dfa[Z\\W[[ZVHCC@AEFKTZZYZ_]ZZZ\numghpšÉÊÁ¾¾»¼½¿Á¿¾¹¼ÐÀfiUQv—£­•nz®¨›­Š\dkeaa`figea_bcfgdb`bgjiihebbdicbfd^`hjigdcdgkfal†ƒlee^^u£¢nOv¦£ˆd[KLirh^dcf{•šŒ€k]nxgflgZ`dUJWbcdgfaabefd^\]Z\`dc_^_\W[ZWWK<>OVSUSLIOLNQTTROMOZabmzzyz~‚€xuxxyvuxz~ƒtga_\n…[Rqp_ccb]`ZS\fkonkd^agiijjihijigggghhiib[Xp„’¬² §³±©«±ºµ¬¯·±¨®º´¬¬¶¹­«¶·³¬²¼µ©ª¹¹¯ªµ¹°ª¸¾¯§µ¿·¥°ÃÁ«°Å¨i`lihjfgeefefcdhbVRRT[fkhgjhnj\lŠ|cjplrqoqsqnoqpnqmmnopqnsqqqsxp]‚È̶Ñéèâçâãçéæèíëìììíéâ߀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€:clfmpjacjfgwƒ†ƒy~Žƒwoottw~~€‹„…¡Ç×ÒÈÁ¶ÂÛðèÁš‰‚‚~zwz”·¼¨˜•{kgejrpjxŠŒ“‘¨¬Žƒ†umprtvtwvqpturqttty€‚„‹’“މˆŒ‘š”“˜š—–•’–—‘Ž‘’ŒŒŠ…ƒŠŽŒ‰ŠŽ‹Žš‚˜¡›žlajl`[[][Y_ijfgmljife^Ziqp_[_bluqebhjimrttuxxwvwurqrrprvrsutruxvxwwxwst{wsuzysu|wtdV`v~yutx{wuxz{yyyuqsyuwvvywuvzwvrpyzlOV\UE??=A<416=>=ECFA@CB@EC?@CDISW]\Z]_^_\^nkZdss˜ÇÈ¿¾¾¹¹¿ÃÆÂÀ½ÁÒ¿giVRv—¥®”juª¨Ÿ«Š]fnheedgdcec`bdikgc__chgffebbchgfffeeejhda`chkc_o‡~igebcz§¤sV~™¡¤‰a[MKgrh^eem†–›Ži^w~zoqpb`cZR_jkd^_ccbcb^Z[_]^aeea^_]Y]YV[R@@LRSUOHIMMRSMOSRNLYfcfptzvyysuzzts{{z|j`_]oƒy[Rqrcgh_X]ZT]iqnome]^dfjkjiiie_fgghhiiii[Tp„¨·¥¨¶·¬¥¨µµ«­¶¯¥«¸¸¬ª¶·©©º¹«¤¶Á°¤±¾¹ª§¸¾²§»À¬Ÿ¯Á¼©²Åì¯Ä¦g`lihjggedeccbelgROOT\hokmmilh]o~ekojonknollpnlpnpooqqqsusrqswn[}ÊÒ»ÔìèßìâßçëèçëçêëìíèáÞ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€@ivtyytoszj_r€‚‚u}’”ƒywrls~|wy|}ƒ¯ÎÑϼ¹Øëì騳”ƒ}}ytЧ­¶´›Œ‘~a_mllnƒŠ}‰™·¯|x…qklprurrrrqonnqsoos|ƒ†‡‰‹ŒŽ—š™–”–˜•‘Œ“—˜—“‘“‹‡„Œ‹‹††‹ˆŒ“„Š£¦¢ž`hljd\X]Z[^ejebgknke_\^dmm_[_bnvrffgfghrttussvxussttsqqrusqoptxzuuwyxvuvwwwwwxxxzveV_v}wwvxzzwwx{|wv{zuwyvtwyxwxyttwsuymYUWVTMAA=>;548>BA>BDBCEBC??CC@DMVUVZaebZX\_VRkss™ÁÈ»¹ºººÁÅÁÀº¿Ö½fkUMs˜¤¯•js¨§ž©Œ_dkgdb_befedddbfgeb``cegcaeebeihhgdacfhie`_agnb_pƒ{gadlv ¤kV|œ£ €eXLKasg]_h‚’’˜zlqvushca]\^^XYcfc`^_feeb][\[[`dff_[]]^\YVYUB=HPPTRHIKHNSOLQVSKR_ehotvzƒztqquwvttx}~od]Yo…yZRrp`ef_^_YS_ljkpodZZcljiikkhgikihfffhii[Vs…Œ§¶¡¤»Â«¤²¸µ§¦¯­¥«¶»¯ª´º²­²·¬¦³¼¬£°¼¹«ª¾Â±§·¿³¥²Àµ£«ÀÆ­¯Ä¥l_jfefdfdbhhgdfh^PPQRZinggnllh_o‰}bktmpqpmoonpsropnqpjkrrrotqqxm^ƒÂÎÄØèèçáàäëëççëíìêìíæßÝ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Cp}u{{st{j^o~}}€~ˆˆ}zzols{wtw{yxy–¾Ò̸ÊçìçìÞ»¦€xtz–­«­µ¢ˆzhZ_oron~qƒ—…«`krpikmpsqptutpnnnmnot~‰ŒŽ’““’Œ’š›™–˜œ™Ž•šš—’““’‹‡ˆŒ‹Š‹ŠŠŒŠ‰Ž“Œ–¥£¥–l]kogb`\Z\Y^cbegbjmkiheabord]^^iurhfefkmtyrptrpswrqrwvsruuttuuvwxzxwwvutuuxywvwvstviX\q{xxvuwxwxy{zutxyvw|ywvwwxyxrtwps|q[PTXWVNG==<86:>?CB?BGVVUUZ_XM^h[]dlnrÄÊ¿À½¸·½À¾Áø»ÓÁ~ciXRt•¢­”ir§¥œ§‰\djea`dghhda__defgfa_bkjdab_]bliffecdfmkd_^_bggdv‰uTRhzy† z€Ÿ¦mXNVhvokq{‰ˆ~~vjdeech`]_]^aaYYab]]]a]^ab][ZXZ^acd_\^^\Z[YZTA;GQSSMFLJKPSQPRTSLQ_ehntz{{zywuupsvvuvz~|sh]Wn…{\Tsp_cd`]^YT^kkgfki[Yenlifffehkjigfffghi^Zu„‰¥¶¥¥³¶££´·¬©±º´¬±»´¯²½»«¦±¾´«²¼±¤ª»»®«¼¿°¦´½²¢«»¹°¬¼½£§Á£i_jfegdfdafeecgkbSPSWZbiilkhni[mŽ}bkumpqppqpmmppntppronoprotqqxm^‹ÐàÓÞçåäââåëëççêíìêìíçßÝ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Bs~pt~tsyi\n€|€Š†}‚{y{xonw{|}z†³ÔÍÂÚòíäïâ¿°‡ur†«º«¥«˜t^WUV_ie_jgl”Ÿvz£kuyoiloswvuwxtoostrsux~ˆ‘’Ž•™™—•œœœ›Ÿš””˜˜–•““—“””Ž……‰Œ‹‰‡‰ŒŠ‰‘Ž©§›}[_lpgda][\\\^cfdaeijklhbalrf\][bpric_cjlqorutsuupostppstrttvwwwvuvuvy{xutxzxsruursxn\[p}{wtstvuvvtwyxvuvxvxxwwxyyxtstos{s_PW]Y\WND?>:58=9:?>?CA=@AAAA@@BELOSUSRW^ik_a`bhnžÈ˼¿¼¸¼¾ÆÃ¾Á½ÂÔÂdjYRu–¡«“ir¥£›¨‡\fmd_`fhihd`^]edcee`^ahihhga^cihijjfdciidbccbdigwcFTtŠz‹ª™‚––•‘rii{…ˆ~trz{gd_\^_]]_d]]_^^_^WV_a]\[^\\`a^\[X__^]]YX[\]\[USTI9GSRTRHGNPOMPRTVSLQ^egmtux|}}ytqwvvuvwxxzym\Vm„}[Ssp_dea\]ZU]ilkkngYZgniijllihhiihfffggk`\v„Š¥µ¢¦¸º¨¨µ´§¨²¹³ª­²³ªª·¹­¬º¿°¦²Áµ¨¯½¼­§µ·ª¤¶¾³¥¯»´§¬¼¾¦­Å£f`kgegdfecfdcbekdUNQY\`gknjfmiYm‘~bltmoqomopnnopnspnpspoqrotpqxm^Œ×îÞáâÞßäãçêëççéíìêëíçßÝ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Ar|nr}~vpte\rˆ‡zv†‘‰‰xurj`gw€{zx{Ÿ»¸ÆáðíçîáÀ«ŸŽysŽ·½£‘ŠsYR_`S[c]e{sk‰„Zq¿Ä‘€‚plprtwusssssvxxuwyz}‚Š’Ž•™™–‘šŸœœ  œš›™™•”—˜—˜—•’Œ„„ˆŠ‰ˆŠŒŠŠŠŠŽ¡¯¥ƒ^]cjmlh`[^^\Y^hfab`gkljfbcgog^aaervmb\afjnsssrqsvvqstsrrqqqqqrrsstyvuwyxvuwxxvuutrvyo\[p~|utsuwxwuzwwxwzzytxzwuvvuyyqpsuvsbW^_YYVRPDA?43:<>A@?BBACCC@<;?CCAMPMPY^___ab]a\d˜È̹º»»Á¾ÈÅÁÃÀÄÕ¿€gmVOt™¢«“ku¦£ªˆ]jpe`cbeggecaaeffhgb`cegfec`ahffffc`aecgheddiplSh‡jHb’’z‰¬˜w‰¦§˜†xuoix‰‰~li|jd__a`\]cd^^b`__]YV[]\\[]`^__[[\[Z]^`a[VW]\ZXRTUI;GRRSSJGNQNNSTRTRMP]dfksxz{{|{xtwtqsx{ywz~q[Wo„}WPp€qagia[[ZU\hllqpf^]chhhiiihgfhhggffffn`Ys†¨²¡¦·¸¤¤²·°ª®·²«¬°º«¨¶¹«¨´¿¯£±¿³¦­¾º¬­¼»¬¨¶À´£®½´£«½Á«¯Ç¤g`kgfgegeegeebcgaUKLW_dikjkglg\n~blulopolnonmmmllsqklstprotqqxm^‹ØðáããßáååçëêççéììêëíçßÝ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Dq}ssspkrse^s‡ƒwx{•´»ª˜Œ‚~umt…އ„…‡š¢§ÍçéëéæÝŪ£Œ€•¹·—}r`RVebM^gcq…sdss^ŒÙБzmlruwyvtqpruxvutxwz~ƒˆ–‘“”“”—ŸŸ¡Ÿ›œ¡™™˜˜œš•”œš—‡ƒ‡Š‰ŠŒ‹‹Œ‹‹—²¯fTaekmljb]_`Y[cghf_^flmlgcdjrl^[Z]jzqb^cfjpsqtwuqqsprsrrqqpttsstvxyvtux{yvtxvvxwuuvxwm[Xl{{vuuvz|{yvsstuvwvvyzvstvwxxqptuusd^^\[XRTXJGG;05=C@AA?BFEAB@;;?A?AEL[rwhZcd^\^_Ve•ÈÏ»¼¾¼½¹½ÀÇʺºÑ¾glVNt™¥¬•ox¨¥Ÿ«ˆ]ipe`c`cffeccccffdb_`cghgc`_ciihgfcadhiiecghhjO7`uUq–z‡¤“x‹¤—’†xukdu‰Œ‚f_{…sb_\[YX[``[]bb``^ZUZ]^_\Z`]]\ZZ\[`a_^^ZX\W[[XSTUFŒËÝåêçåäääåäåääããääåæææææææææææææææææææååååååååäããáàßÞÞßÞÝÜÛÚÙÙàÞÚ×ÔÓÓÔËÐÑÌÆÄÁ¾¯§šŽ…~xupprtuvvvvtzˆŽŒŽ“š›ž œ˜—šž£¥¤¢¢¡Ÿ››š–”—˜•–š“‰‰ŽŽŠŠ‡ŒŠŠ‘¥» jVY`]_eimprof]]_\]hpmida^agllienri\W_hpul`_ackpstuurrvsssssstvtrruvwxwwsqruxywtuuuuuutuz}q[Yl}{vuvtsyyyywuy{wvxwtuyzwuxrlmqv|q^]bYV[ZTV[YSVRBEKNLMRPGEHIKKFFN[_ZUWZ^fc]OO€±¬•«Ãž¿¿ÁÁÀ¾½ÀÇÁ¾Ò¹y`nVIr”ž¨šo© ž¨^ckgc``gifefdbbdfeca``mjdig\^cjijhfjdT;41781++ &^‘•t`~¡œŽ‹Š‹—œ¤¬†cmrirxZ {X_a\`[\pve\`a]`a_XTUWWY[\Z][YZZWUTX]_[VTUUTSWWTN?6@SWQMHGJPOLNQQRSLKWcbcnqqtvwzzssqrqpuywy|zhqƒ{[Ss‚rbik\]bZRYckmkkf\Y`fhghkjgfgbehhfddeg^Xpƒ©²ª§º¸§ž¯¾®¤¬¸±¨­¶´­°ºµ¨©¸²¬¨²½µ¬²º»¯«¸¹«¥ºÂµ¦³Ãº¨¬À½¦²Æžh`lhgheecgfdgece`WONU\diikdbniZn‘cktknnlmoqollmomlkossqqrqsmpwka˜âðáÞåäìåãåéêëêìéêêìêäÝÜ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€>ŠÕîëçêïçççæçæççæææçççèèééééééééééééééééééééééééèèçæååääãââààÞÞÝÝÞßßÞÛØÖÐÒÑÊÆÈÊʼ»¸³«…|xssvxxvzy{€…‡“•–™™–‘‘”šœœ˜™œš•”–”‘•™—’”””‘ŒŒˆ†ˆŒ‹Ž’§½•bZ_`[[dhmprqjb\^ZYdnledeb_cjmlemsm`X]fovpb]\bnnqsuvrqutuvtrqqpsqrrruwuvtwwstwurvxvvxvrttxrb\l~xwxzztrvzxyxvxzxzxvvwxwvvxtlilt|w`[c]UZ^WR]]PRWJFINLKSTGEFHKIBERZ^\UX\^_`_KL‹¹©”³Éø¼¼ºººÁÇŵ¸Ó½sZmR>j“Ÿi©›”¢Œ\_kcVRYdc`db^aacdca^^_dgchfWW^daflgWC352495)##&5p˜”t_q Ž‡‘”——¦¨Ybigt‚’sV yU^c_^Y]ptaZ^]Y^^ZVXWWYWV[][XZ][XXWZ`d`UONUTRVVTO@7@TXPKGHIOONOOPSOIHS`acmpquxy}~wsqokjqwvvv~~op~x\Vv‚o]dh\Z^XU^flllnh\V\bifgjjeegdfhhfeeff]Xo‚ލ±©£¶¸¬£­µ®¥®º³¨­¶¸§§¸¹©¨¶¶±¬²º°ª²¹¸­­½»¬¦·Á³¢¯Ã»¨¬Ä¤¯Å j`lhgheechfdgebd_VNNU\chhigfmfZo€bktostpjmonoppoonponnrurqsmqwk`–Þîåãçãìæãäèëéêìèêìììæáက€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€>uºäìçæêééééééééèèèéééééêêêêêêêêéêéêéêéêççççççççêêééèçççææååäãããßáãäãáÝÛÝÝÙÕÓÓÎÇÇž¹±¨¢—Žywxyy~„…„ˆŽ“’•–—–’’——˜–“•›™“𣡗“’’•””ššŒŽŒˆ‹‘ŒŒ‘¦ºacc^Y[dimoqqkd__\[dppigea^`fkmflspcX[emwse[[blnssqrttuttpmmrtstttsrvyvuttvvxxtsvwvvxwuzuvueZe{zywuuwy{yxx{}vsxzxwyzwuuxzulfiqxxe^c_ZZ\YX\\TSTRIHMNJRUJBCINJBGUX][VX__[_cNS•¼¥—ªÈÈÀÅÁº¼¿ÃÄÄúºÔ»|_cNS…œ°§w…¯ž«^drdIB]igdkgahghjihghibnknfFFfrsmZA2*&5<=5(&.7/9l’•€df”œ‹Š˜”—¥¤xR\jjq†•qV„¡|Y^b_^X]mrd]`_\_^]\ZRLIGHOXWUWZYWXXY_fcYRTUTQUVTO@7?RXOIFIINOOPNOTNIGQ]acmqrwzz~zwurmkrywrry}qp{vXQqm\cfa]^XT^cghijg][bidcehihhifggggffgg^Xp‚©±£¦¼¹©£°¶®§°½³©­¶¸¥¢¶»®ªµ¿³«µº«¤²»µ¦«ÀÁ¯¨¸Á³¡­¾µ¡¥ÅǪ²ÈŸe`lhgheecdhfdbeg]ROOQU_higihldZp|`hslpqnonmmoqolpnprnorpqqsnqxj_ŽÛïèåèáæçæâæêêêêçëíîìæßÞ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Bb˜ÏíëäçêêêêêêêêêêêêêêééèèèèèèèèèèèèèèèèææææææææééèèèçççèèèççæææääåååãâáßßÜØ××ÓÌÐËÆÁ¾º·´®¥—‰zxxw~„ƒ‚…Œ‘‘”–—™–—ž™œœ—–™›˜’œœ”‘’’•Ž…‰‡Œ‹‡‹”¬¼‹aff]Z_eimnooke__]\cnqlle^]_bgkkmpnbVZghuwi_^adpsroqtuvqqqpswvrtturruyvtvutxyvtxuuvwvxzxvzxfTa~|zzz{zxuxwx|~wswwvw{zvvyyxtkehqvyh`cd]YYY[[\]WQPMFKOKOSMEELRLFO^_`[SS[_[`cOU•¶ —¨ÅĹ¼¼¼ÄÁ¼¸»ÅÁÀÔ½z\`KW’¯ ª¢z‰¨™•¢Š`cphK?`khfmgajijjifefhfgcoiEEhtcK5(#*4;70,/488 +b‹“…je‹›‹˜“‘œ§£wScvsp—q[†ž‚e_^^^[]inf]_`_^\_bZQICCINUWVUWVVW_\]`_WVYTSPTUTOA7=PVOHFJIMOOQONSSNKQ\_aiprwyx{}xusrnlpursu{|tv€xZQn}n^ccZ[`YS[fnjhhc\Y`eehjihgd`ggffggggi_Zq„«³¤§¾»¬¦²¸®§±¼³¨®¸´ª¬¹·©ª¸¿¯¦±»¯§³Â¹©ª¾¾®§»Âµ§³¿´¢ªÇÆ¥®Å¡i`lhgheecbedccfi_RQPMQ`jijeeogWm“fovklmlnmmmlklmnnonnopppptosxj^Þñß×ÚÔÖáçåçêéëééììêêçã €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€F_®ÞëæïêêêêêêêêëëëêêéééççççççççççççççççèèèèèèèèççççççççèèèèèèèèèçææååääåèåÞÙÚÛÛÔÐÌÉÆÄÀ½·²©ž’†}xx}‚…‡‹”“—–•–’˜  ž›š›š˜•˜˜—˜–’•”’ˆ‰‡‰‡•²¾bikc[^eimmnnlh_]\]_gnmnf_]^^cilkpqdUXdjtvl`^`brqprtsrvwuqopssrrrssqsvutzxuvvtuyutwwvx}vtuylZa{xvzyvutvvyzxyzwyxxywuw{vvsldhqw{k_dh_WX]\YZ\YSQPIJOLMPOJHLNHGUc[[ZVSZ`]_aV_–¶£”«ÈËÃþ¹¹¼º·¹¾º¼Õ¿nSfJG‹½À¾¨{¸±³¼¬‘’›¤–•›šš–‘™¦¥¢œ–‘’–œ¢’xtwJ5&-513AF6,3:6*"+i“‰od~š–™™˜œ¥tWj~wq’m\|Ži`]^`^agid[\^^[X]^WVUPQVWSWWTVYYY[YZ^]ZXZTRPSTSOB69KTNIFJINNNRROPTPKQ[`cjru{|z}€|ronnklnmrvz{uz‚y^Tp~o^ba_^`YS[cijgfd\\bgcghffjhdhfddfggfi`Zr„‘«´¥ µ¹­¤­´®¦°»±¨°»¶¯²»µ¨©¶º¯¤­ºµ«¯Á¾®¬º»­©¹¿´©µÁµ¥®ÆÂ¤­ÄŸi`lhgheeccbafedgbWRONUdmiheemgZp’}cmthijjnmmnlkmpnsojlmntpptpsxj^–åïÑ¿ÂÀÇÚèèêëéëêëíëêêéãက€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Dgz›ØòêíêêêêêêêêëëêêééèèèèèèèèèèççèçèçççééééééééççççççççççççèçèèéèèçæäãããèêåàÞÜÙáÜÔÎÊÇ­¦œ…}|…‘‘˜š—˜’˜§¢Ÿ ¢ šš™š™”’•˜—’Ž’‹‰†…‰ŠŽ’´À’eioh^_dimnopolfabc`dmqnje_\\bgjiosgUUamruobY]dqqprtrpsqpqrrppptsuvttvwvwuswzytwvwxyyz{zuuzt`\l|uvywuutwxywvz|x|zyxwvvxvwwodepu{pa^ebYU]]XVZZWUQMKLMMOONKMMFHVaWW[ZVY_^]ddi’¸¯›«ÄÈÀ¾¼¼»Â¿¼¼Â¼¼Ó·nXgLR˜ÂÀÞ͉›æðçÉ«“—𦥧žž ¢ ™—𢠖‹ŠŠ†„Œ‹‚lG,13499;B;645/#"4mŒ”•w[x’””œ™š¤–p]p}yx–m`q|zl`^aabhhdd^^]^]Y]ZUVWUUXVRVUSVZZY]]`a`ZTQTRORTSPB56FPOJFIJNMLRUQMQNJNZ`dkrv~€~‚…‚yrqtpmoqpswzwz€wZRqo_df^Z\WV_finlmi`\bgfhgdehihhfccegfeh_Yq„ª²¢ ¶¶¥œ«¹­¥®¹¯§±¿¸­­·¸¬«´º®¤­º´©«¼½±­»¼°ª»Âµ¥±¾³¡ªÀÁ«·Æ™``lhgheeccbaedcfaWPOT[djiffdjf_s~cltlnpoqonnonnmopmkprpooptptxj]œçîʲ°´ÃÝêèêíèêééìíììæÚÑ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€@ks…ËòçäééééééééëëêééèççééééééééééééééééèèèèèèèèèèèèèèééæææçççççèèéèçäâàååâßàäãÞÜÜÛÚÖÏÆÀ»´³´®¡–‘†~‚”–•”š˜—š–•Ÿ¤¡¢¤£Ÿ ›–—™““””—ކ‹Œ‹Š‡Š‰‹‡¸Å™gekgagdimnprrpgabc]^hplnkaZ[bfmjmpdSTcknvvfWYdorqoqrqpnoqsqoqusqtwtrtvwwxuswytswyyy|{xpsywa[l{y{{wwxuyzxwxxwyxxxyzzxvwz|rbblrywdW`f]RU]YW^]UVPQMJLNNNQORQKMX__[\ZQR[^_daUp¥¶©©ÁÇ¿º¼Ãļ¼»½Á»»Ò»lUhOR’¹´Ë¾‡›ØÔÇ·_icddonknrledeaba`__bec`agX>2(72-3>;5971(  "7q†ˆ’|a~‰‰—’˜¥©•sgw~}…¡–tiqw|s``cbdmja^\[XYZVW[WX[[\\[YZWUY[ZXZ\_`a_[XTRORSSPB54COOKGIJOMKRWRKTPKNW]`fns{~}†„|squqmotprw}{|€xZSslZ`d]]`YS[dkdfjg]Y^eghhggggfhebbdffef]Xo‚Ž©±Ÿ¢ºº­§¯²­¥­·­¦²Áµ¨¨¶¹¯­·ºª¡°½±¦®»½±®½À°¦¹Â´¢®Á¸¥³Â»£°Ã›f`lhgheecbfdcaeg]SLOZ]_ejhb`lj^r“dktmpokkmnnnoonmknpnsvroptqtyi]›åíβ¬°ÆçîåçìçéçèëêêëçÜÔ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€=`s„ÁîéêéëçìèÝâãâåáÜßáÚÓÒÖÛÙÖ××ÔØÙÓÓÛÚØßâãáàåèæäåæíìäèëãééäæîéçñçéêêèçèêêäãååàÞáåàÞàÜÓÌÊÁ½·±¬©¨¨¡“ˆˆŽ‘”™™œŸœ›”–Ÿ¤¤¤¥¥£›•—™˜›š”˜™“’ˆ‰“މ‹ˆˆ„ŠŠ’¶Ã–hgmbadgdinnqtphfb]]agljomd`^]_ikptiVTblnsreVWbloppstqoqrrrqrsurvtrtustvsvyvtvuvwz|socD:Nr|xhVj{~{vxxuyyxwuv{{u{wttxzzyyuun`bqxuwiZ`h`TU\_\[\[ZVPJIJMOPROONGRdbXV^[STXaaYa^Y©¤ªÅÊÁ½»¾¿»¼¼½¿¹½Ø½kUcST›Ä·Î¸†œÌʰ„lsrhktuvz|vmmsoooooooorkuuT4.04/'4B<53*("""5n|Š™xfx‡€ƒœ™‹˜¦œ~mw}‚” •rvuja__^`v~h_`]\[Z^^WY\XTX[YW[YYZZXWY\^^]]^[WRTTSPRUJ:4CTOEGJIHOTPNOMLOIKZ]X[owx€€{„†{strsrloqqqvy|}s\Vo}j\_f][^YU]cfefjdXYceejkeeigafffeedddf_Zr‡’«´Ÿ©¼¸ª¥¶¾«¥®¸µ­®¾²¦­¶´­®¹¿«£µ¿­£°¾»®¯¿¾®§·½¯¡²Å½«®¿º£±Ä›e_jfdebcbbcbdcdg`TMLS\fjfgfgjgZs“z`lrommkjorpoppomlorpopooopmuwhcžëñˬ©¯ÂæêæçìëêêèëëêëèáÛ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€>gty·íèâÜÙÍÊÁ¶´¯²®©¨ªª¨¨¤¡¡¤¥¦©ªª®¬ª¨£ª¾ÊÀµ·¿À¿ÆÂÉ×ÝØÛâàåéåäçâàèåææåäåçêçåæêéäàáâäãÞÜÛÕÌÇýµ®ª§¦®¥ •‡‰“”˜š›—™œ••¡£¢¥§¤ —•”—˜˜š™š˜”“Œ††Œ‡‰ŠŠŠ”®µŠfhngcdghikoqpojc__^\bkmolgb\Y]fhosiWUchlqocXZbnttooqrrquupnqsssussutrttqrvvwwuvvbI60+.>f{}mXdx|wtwwwywtv{yvvxzywwwxzzwwyrccmpxzl[_hcXV^`\[]^]YQJKORTUTPJKN[g`SS^^UTV^a]^`Z_y–³ÅÉü¹¼¼½¹ºÀ¶¸Ù¸jVfUS”º·É¹Žœ½·º©yei_^ifgjmlcYUWVVUUTTSSX]b\G6,'.-&090(# 6q{‚š…p{…}…¢Ÿž¦˜uepvzŠ–“mfc]Z`g`_}„g`[\__[\\WZ^[VWZZ[YSSYZVX^[]]\]^[WQRRURQRJ;3@TQHHJLKMNKOSQIMIKWYV[qxux|y}‡…~{xuplprttwwy~wYTm|i\^dYW[WV`hmkgki]Zcjkiijjigfffeeeeddf^Yq„¨°¥¤³·¯¤®´®§²»²¦§³¹¦©·¹±®·¸±¥¬»¯£°Âºªªº¸¬¬¹½®¢´Ç¾ª°Â¾¥²Äžj`kfeecdbcdcdcdf_SMMS[eifgfhki]w–~clqnmppnlmppmkmqrqqqoorqqqntvf`êïÇ«­·ÌæêæèìêéëíìëíìåÜÚ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Erxo«áÒ¾³°¡œ™•˜‘މ‹‘”‘‘”މ‡Š‘˜š˜•’‹‚©·¨’Š‘‘” š§­«¬³´¾ÇËÍÔÛàæâåéêèæåäêçææåââåãæäàßßÚÓÐÌÄ»³«¦£¯««¥˜—™”˜›  ¢”•©§¢£¤¢¤¢™žžšœš—šš˜‘‘‰xs…‹Œ‹‰Š˜¥ yehljfefjhipoloohddb^ckqqolh^Z^gkpriVR^hmqmbY[blpojmrsqmrtrqsspssrstrqtqprstvwtuJ,)#'456ZwzlY]t|yy}zzxvuwxvtwxzzyxwxyzuw|tfdlov{qbbjfZSZ^ZW[^\^ULJNPRRVSIIUag_MO^aYTT[]d`\`[]m©ÆÉ¾»º½¾¾½¼¼Ã¾¼Ï¹iTaPM‘·¯¼¥y¹¸ºªyktjhoijnnifgkmiihhggggckl`K4*-.2-..$ !7wzwš—}‡Ž…£–‡š¨”n]jnr„”•„j^\ZZ]l`bŠŠd\^]^\Y[]YW\\YYZYXZZYWXY[[Z\]\]^\XQPPTSPQJ<117MTOJJKIHIKNOOSOHL[a][``_WXWBozff\tÉì²sdfer|„Š‹£ÕÞ¶ÈæìÚɱ£ª›ªÍéíììææçïÂpazty“•„„ƒ‚Œ¨µ¤’€€€~}‚†‚‹’—¦ÀÚééãáãäáàâÙÚÚ×ÑÈ¿¹®¢——¡£¥¥œœ¡ •ž¡¡¦©§¦¢˜™ž›™žœ–—˜ƒv}ˆwhpo{—¨—s_e_bghkfefccikimqqojfcbbcgjopg]\[imop`T\`]`c]UXckpqoonlltqqtsopusoqsqqrqrttsqmnv}f07bzxm_]p}|zytuxrrwxwvuwxyzzzzz|wuxtjfmsu{wg_ekjUR\]\_^\^``][[][TS`aX[`]OT__XOP_d_Zeup^|ºÎ»µµ·»½ÀÂÁ¿¶¼Ú·gRaNK³©³ }–¼·¹¨i]xlWaqspqvwqnpmmmnnoookwsZA5346&!7r|b~ª«˜zˆ®¦‹¨Œh_eZ`‚¥Šj]aa`e^\]‡ŸrS^a][ZZ^^XVWYURUYUZ\\[[]][]^^[[[WRPSGBJPQMA;35CONHGKKJIEITPLIHGINOORKNORciQ=EV_ihftrotx~‚zi^p|k_aeYW[WT]cghjhbZUYcfijgefijfffeedddgYYt€®¯›£¹»­ ¬µ®§°¹´ª«¹±£¬¼¸«ª¹»´®·¾µ®´¿¹¬¯¼¶ª­¾Å¸©¶Å¹¥´Ä¾¦³Ä›e_jfdebcbbcbdcdg`TMLRZcfbfdfheXq‘z_inljllpjglppnmomopnoqrrrrntue_|²º¸¸·¸Íäèãåêèççëëêëìçá߀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Eiyad‹´Øåºzbku€ƒ‚Љ„°âÕºÄÛíݼ­®­  ÉêìçæìçèíÅ{cvz€˜’„…„‚‚’°·¢š–Šƒ‡†}||~~…„…“§ºËÞàÝßåçÝÞÞÙÔÔÑÊűŸ‡€•¢š›¦¨—œ•Ž™¡¢££¢¡ ¡––—˜—˜£œ—”‹‚……zgooz˜¡„dcfe`afihheccehlqqqomkhfffglrqng_\bkqq`R\bY]d\W\amopqpoqurutqorrpvspnopqrnstrqssp~k;/Wx~rf_t~{}zuvuutuvyzvtvyxwwxzywxynip{xzzna`ee_QZd\YY[X`f[W^d\SQYa`]][WX`]XWQ_aXYhurax³ÒÁ¼Â»¼Á¼µ¼Ä¹»×­hOaKK‰®§²žy¶³·¦iWljakturv|yldegdcfhcafefgVB6.2<)!7msb{ ­‰o„°§ª‘n^f]]ƒ£Šd^gb][`Vc”œmYbb_ZWX\`b[ZWTUVUTYY\][Y\a_]\\[[YSUSD@JRSOD;58>HLIJHGHKMMLPNMMICADF=AAADOiT2/<;IVTNS[\`mwk^r‚k\b`[[]UR^ehihgbZZ_bhhjhdefcbdffecdek^[p|Ž­­Ÿ¡·º«ž¬³ª¦­¹µ¨©³±«±À½§¨¿·ªª»Â²©±¼½­©¼»«©½À®£·Ã¶©°¾¾©±Ãœ`ahcehcddfdbcfea_PMMQXbgcbdfjfZw{akplhklkkklllmonmmppoopnrppotb`‰»¸·»¹¸ÅÞââêðèçëììêìîéä倀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Dmq[}´ÇÓç¸wduˆ†}‡‰»ÞÉ´»ÓãѲ¨¬«Ÿ¡ÊëìçæëåæêÀtZkoy—”………}„˜³µ¡—™–‰˜Œ}xxz|€„‡Ÿ·ÑàáÞàåãÞÙÖÕÕÐɧ’‚„–£ž™ž¬£––š››š›œœšš’•——••––•”…ˆ‡wqqn€ —q\igffebcfjeaacflrqonnlhgjfgkmllh`ZajooaS[\V\cYT]emprqonpqommoqrststqmnstsrvvssvsmwmA)Qt}pcV\agt|wmwvuuuvwyxutvwxyz{|zzxojqvuwyreaggXQ]aYZ_ZV[b_\`c^TPXab^\`\[a_YXQYb^[hxu`t°ÐÀº¿¹»Á¾·½Ä··ÑµmRbLMб©²¡€”²­´¢dQgcW_ipllpmd_a_dbadb_dihhR;4.69' 3gq`v˜¨Ÿw‡¬¤‘¡«‘n`f]]…£Šf`gb][\Ym™•iZb^][Z[\]^YXXXUTUUXZ\]\ZZ\a^\ZXZYSOMA@JQQKE=649FOLNJFEGKNOQRROJFGJI?;:<;8DN3!*'.48349;EXda^r|g]c_^]^UR\ceijjdYV]bbdhhdeebbdffdcdef[Zs­­¡ ³·©Ÿ°»«ž«¹®§±·¸°±¼·¤¤¹À±¤³Ä¶¥­¾·­²À»¬«½½­©¼Â³¨°¿¾©±Ã›`ahcehcddcdbadge`QNNRYchdeccig\wŽ{alpljmmpmlmoppnmomjjnponrppotb`ŒÆÉÉÎÊÅÊÝßÞçëæèìëëêìîçàà€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Iifh§ÎÅÑë¸ue|‰Šz‡Š—ÈÞ°´ËßÔ¸©ªªž¢Ìììçæëæçê¾pTceu—•ƒƒ…‚{‚–¨©œ“‘’ˆ‚˜{vw|ƒˆ‡Šˆ…ˆ¢¼ÖäàÜåâà×ÐÖÒÀž‰†Œ•¢¦£›¡© ›š—–––˜˜˜–—š›˜˜˜—”•˜’†ŒŸŸ‰{rl†¡ˆc`fa`bb`elhdbbceinkoqoookedinnmnkb[bknodW\ZU[`WS]dinqonprqopollnppptsmnuxtsusoqvwr|rH3N_]UOSNMOVdqwxwvuuuvvxvuwzyxwsx{{zqknrtvzyiahl\TW[ZZa[Y\_^[^d_VQW`da]\YW]^ZYSUb_Xauxcr­Ñ¹½¹½À¾¹¿Æ¸·Ï³nWgRN‚¦¢·ª”·²²¨ws†pr{~|„‚zuvxtpsyxw{qccRA4)67%.`n_n¢¥˜‹©¢”¥¬nah[\‡£‹icga^\Y^}‹c[a_]ZXWY\_YUX[WTVVZ\]]\\[Y\Z\\\\ZSNTPLMORPB>935DONKIHHJLLLLPQKEDGJKEA=@@>GL7#'-+.20/233;ISSTm€o[]dZZ\UR^fhehkeXV_g`adcbfjhbdffeccddXYr€®¯£¤µ´§¡²¸§¡¬¸°¦¬¶·­«´³¥§ºÂ¯¤µÅ²£°Å´¦®¿¾±«ºÂ´¦µÁ·©°À¿©²Ã›aahcehcddced`bhe]ROOSZdieecchg\xŽzampmlookkllmnpqlmoqrpnnnrppotb`£ÞÝ×ÜàßãçããééäéééêêìíåÜÛ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Jgj„ÈÌ­Éíºwg|‡…z~ŒŠžÒÞ½­³ÏäÖº¯­¦¤ÐíëçæêééíÁrUcdw—”ƒ‚…„…•Ÿ Ÿ™’“‹‰™}xws…ƒˆˆ‰Ž‘–ªÍÛÜÜßâ×ÎÙÑ®‰ƒ‹’‘™¢©ªš§¯–š••––––˜—–’”””“”‘Ž‘“Š„™º¸†wuŒ’t^hggd`_bhmgdbccdgjnpolnqmgeinonole^cknoi]^_WY^VU\`hnqnmrtsmqsqkhhjpuupotvtrrqppsuuvzW$ %3:FLJDFMNKOPKPevxxwvuuuuxxvxzyvvv{}}{umjrvv|~n_djf\NW_UW^^\]^[]e]WUZbea\^\W[\YWPQ_^V[owfq¬ÓÆ»¾¼À¼½ºÂɼºÑ¯kWfRLv™Ÿ¶ªƒ•º¶¹§m]{€ohipnnoi_WUZPWaXMS`G-5AB4%:;&  ,\m`hƒªŸˆ§¤™¦¬ochZ[ˆ£Œmgg`_]Xcˆž€`\^^]ZWUW[^]UU[XUVV\__]\]]\[XWWWYXSQWSQOPSO?=;76@KNIIJKLKJINRQKFHJKJHDCEEGPF.$-.*-1.26536>CMZr}l[X\\[]UQ\cffjleXT]eegiifhifceffdccdhYWq~¯²›¥¸±¥©¹¶¬¦«³«£­¾¶­ª´¶­®¿¼«¨ºÂ²¨¯»·®°»º®«¸Å¸¦¯À¹«±Â¿©³Ä™aahbehdddbccabgf^RNORYdidcdejdYw‘x`lollongjlkjloplkmpqnlmnrppotb`¤ãâØÝæååãßàëéèïîéêéëìåÜÜ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Dk£×œÀë¼|j{„…~‰‹‰¬ÞÓ°©»Ùèϲ¯¯¢›¦ÓïëèæèçéíÃuWefx–•‡‡……††•››ž˜‘Š{…—ztq|€|‚„€ˆ’“”‹‹¨ÎáÕÔÚÛØÛÆ›xƒ“˜—–™¥¯¡ž¬­˜Œ”“˜›™——˜—‘’•˜˜“Ž‹‘„…§ÊĦހˆ’~b^gdhga^aefjfbaabfjllouumhhhgikklmj`biloj`_`XZ\UU^bkprlkorqqklplbepsuusqqrtrrsvtpqu{\)6CBIHIKKJKNNLQXTOYgxwxwvuutwxwuxxxzxyxwyxsnswwzn\[^caQQZRO_]Y\cb_c_ZX[bca_b`Y[^\ZTNZ^\]ksgo¨ÒǼ¾½Áº½ºÀÈ»¹Í²kU_MHo–™ “xŠ¡Ÿ±]AU^TPPQONNNKKMEF^b;%7J1";D4%7>' .[mbf}—« Š§¨Ÿ¥«‘qcgZ]‰£Œqkg`a^ZfŽšy_][Z[\[XWXZ_VVZYTVX[_b^\\^^`]\YXXWQMSROMNTQ@;::7;GOOLIFFHKNRSPKKLLJHDCIONNM<&'/**0..23115=EO\pwgXZa\[]TQ\cegijdXV]cefigeefccegfdbccjZXq~­±š¥¸±¥©¹·©ž¯¾¬¥µ½¶­«´·«ª¸»­¨µÀ·¬«¼»¯¯¿¹ª«º¿µ«¶¿¶§±ÄÀ¨µÄ˜bahcehcddgccdbcb[PMNQXcgcddeidYx‘v_kmjknlnonllnnllnnlmoolnrppotb`¤åäØÝçæåßÛßéèåëéëêééëåßà€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Fp›ÃÚ±“Ãé½~l{†ŒŠ‘…‰Áçâ«ÍÛæÙ»©§¦š¨ÖðëèæçãåëÂtVcdu”—‹‡„††–›˜‘‹„u–’†|ppy~{€„‚‹’²ÉÕÌÒààЫ…z‰””™™•¡¤©¡ ®¨”•¡Ÿ›šš™•–˜›™“Ž’‡‘´Ì½¢‰‚p_ee`aa_\^chjfcbbadgmmprojjnjghkmool`^djmj`_[WZ[RTahjnoljmoongfjjdfnrtvuqnpstrrttrsv{lN;DRPHFFHLONKHOOQVUNSdvwwxwvutrwvuxyx{{yvvxwpkqvux{p]TUU`ZHKWY]]\^db_a`\Z_cc`_``WW]^\VSZ^^]itlm£Íƺ½¼¿¼¿»¿Ä¸µÈ´mXaQLl”¢‘t…›–¦˜dKXZQRWTTSTTTUVMRdX(*7%!6=3+44#!1[kbew‘¤œ‹Ž¥¬£¥©”tbe\_ˆ£uph_b_\iŽ”s_\[Z\][WVX[^YXZXST[X]aa][[\^]]\Z[WPLSSPJLTSD<9:68DNRNIDCFLQRQONOQNKJJNWWZ^U,")*&05../.-039BKSiwiZ^iYY[TQ]egefgaXW^cbcddadgedfggdbbchYXuŽ«¯ ¤¶µ¦ ³»­£±»©¢´Áµ¬«·¸©¦µ¿°¦µÁ°¤µÈ»¦­Å½©®¿¾¯§µÃ·£²ÆÁ¨µÄ—bahbehdddf`adbcc]PMMQWbgcgdbge\xv`klhjmjmppmkmnnlnopponlnrppotb`¤äâ×ÛãâáÞÝÞèéåèéìëéêëæàက€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€H}»×Éš‘Èë½}iy…Œ‹ŽƒÎé¿«½ÖÙäàÁ£Ÿ§˜©ÙñëèæçãåëÁsUaaq”˜ŒŠ‡…„Š˜¢¡›”„vƒ–‘ˆroy‚€€†„„ˆˆšÅ³‹Ÿ°ÀÅÒÜÕ»•x~‹Ž‰’–’šŸª«¢¢¬¤—Ÿ¤¢ž›—–˜››™•””‘¤Âǯšˆ…idjdeedc__eligeedbbdgmqpoomjkhhlptrkb[aini`aZVYXPSageillkjkkddfgihfensvsooqsuurqsslcUMFJMFADIMPPNMMNJRRUXML`tuwwxwvuqwvtyzwxywwz{ysmptvwzudSNOafJE]d\\]^_^_c_[]ejd]ZbbWT[[XRW[^][gunm ÊƼ¿½¾¿Â¾¿Åº¸Êµn[dUOk“›¦–r„ —›¤rU]dbbb]]]\[YWUTUWE%$% "7>201( !2[g_cs‰˜—Ž£«§¨§—xac^a‡¤Žxsh^c_]kŽŽo^Z]]^^ZVUY^]\YYZTRZ[]`a_[ZZ\YWVVXXSOOMLKORJC=;;68AIONKHEFJMQQRUWVTTQT\`Y_dK(','(11021/2655=ESmuf^a_\[]TP[bdgggaWU[_egjjgggcdfgfdbbbgVWuƒŽ¬±ž´¸¨±¿©§´½®¡¬»¶«­»¼¬«½¿­¤·Ã­¤ºÁ·¬µÅºª¯À¿¯£±Á¸¢²ÈÁ§·Ä–bahcehcdd`[_bagiaQNNRXchcgdbfe[ywbmlhjmigmplikopnkknnkkmnrppotb`£ãäÝáãÝÛåäáæèâäçììêëìåÞÞ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€@ÛØ¬Œ•Áï¾zet€†„†‡™ÐãÅÁÔÒÜâϯ¡ Ÿ˜ªÚñëèææåèíÃtU``p•—†„†‡…ˆ’Ÿ›—’zn|މ†…ylx†‚|ƒ…„žàÙ¨±´š»ÓÒÄ®‘|Š’™”—ž ª«£§¬£•œ¡ œ—‘Ž•š›˜—–”’—£½Õͱ ‘†{nceh`bfhfbbeilhdcbacfkjjmpqnklhffktskd[`kojbc^WWUOS^adglnkfddbaabcdhkirvqnqtrtyyuuqZ>6AHGGFFFKPTUTQNKOUOP[QJ\stvxxxwvvzurwyuuzvvxxuqnpswx{{lWGPgqXK_d\YWY]adfd\[chd][bcWU]_\VTZ^^[gsho ÊÈ¿ÂÀ¿ÁÅÀÂÉÀ¿ÒºpY^PNk—œ¤•zަ™žŸu[]_\[\^]YUTUVVVYXN9#&( :D42/$2Zd]ao„Ž”‘¡©¨«¥˜y`a_c†¤Žzth^c`]m‹m\X`Z]`^YVX[]^YX]WQW`__a_[Z[^\\[Z\YSJLMMLOTM@=>=9:@BMMLJGFIKJKPVVSSURV_d^hc6%&($*-(241.2965=GMgte[abZY[SQ\cfdefaVT\aeegfcefdefggdbabhVTr€Ž¯¶™ ¹¼©œ­¸© ³¿¨Ÿ²»²¦§¶¶¤¥ººª£³Áº¯¯À¶«±½»°­½º°«´»²¥²ÉÁ§·Å–cahcehcddfcec^cdWROOSYdieeeehcYx’xdnmikniknokknomnonllnnmnrppotb`¡ÚÖÌÏÓÒÖÜÝØßæãæïëìëììäÛÚ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€;–ÚÃ¢ŠˆÆí»ygw…‰€‚ˆ¦ÚáÊÒàÔäỘ˜£¢±×ïìéëèæéê¾sR]cu–†ƒ‡„ˆ”¡ –”—•‡mu‡ƒymt~~ƒ€€€¨êá±ÃÆ”œÑźͳ{{”‘‘—‘”“™¢ª­£¤“ ™™š›‘–š•”˜•Ÿ»ÄÇÖÓÀ¸©kklf_cefc__`chmlgcb__bjkgfnrrspnkhghlnk^]gkjfa[UWZUW^_aaehfcbdaabdfghjpnorspoqsslu~a?@ACECA@BEMPRRPMMOOPORRFFYuwrr{zuwwxxuty|yxyusw|wmjz{u{€p[K\plTUgb_YY[\affda_bfa]`fbXY_]ZVMU`^Ycomm—ÄÆ¸º¼½¿ÀÂý¸ÁѲlWdQKq”šŸ’v† œ¤ŸtV\`]^XZZYYYXXXPUUPN<&+$)-?E3.7% 0clY`s~~–™š¬®§§œy_e[Z„¥‘‚yk^]aft……k[b_\[[[ZZZYZ^ZWZXSS_]]\Y\^Z\^_\Y[YRMOPMJOQME@>?<7:AIJLKHFGJOQQSYXTSU^idelN)!#%')+/2110//26:EIavhY_`[Z]XT\bgjgg`TU`fgfefgfecffffeca_bVXs«¯š¤¾·¦¤´º¬ ­¾±¤¯¾·«±¿·§ª¹º§¥µÁ·«²Å»ªª»º¬ªºÀ±¦¶Áµ©±Ä¼¢´Çšd`jecdadced`aacf^ONMPYbeciccgfZv˜‚`ipmjjflomhkpngmoljorqqpnpppt^b™ÑÊÀÅËÊÌÊÍÓרÛßãëëéêêãÞက€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€E‘Ì´“ŠÎïºwcr€‡{ˆ¯âáÅËÛÛÜѲ“‘¡©ž³Øïìéêèæéê¾uU`dr’—„€ƒ}‡™¢œ•”‘‡mqŒ“Štgn|„‡„„…|¥äݲÄŠ°ž²å˃•Š‡Ž˜¡¦§¤¢¥¦›—œœ—™›™•’–ž™’›¹É¿¼ÕØÂ¹§}fcccah_fe^\_gojjfdfd``gkjjpsqrnnjghnomo`^ipne[[XURRZabcaacc`^_baabdgiknoppqqpoqrrriQBFBCDCA@BDKPTRPNJECPNHICJcvwvwwtqsvtuuvy|{tyzuruurmquvzv_]mm^S_j_[^^[]acdbeccdc``c_UV]]\YPT_b]eqsmšÆÀ«®´¶Ã¿¹¼À¼ÀϤbQcRLq”™¡”v…¢ž£ŸtV\`\^XVVVUUUTTUSSORS@0-(*;?668) "-_o]\n€}––ž®±©§›y`d\Y¤”ƒxm_\bju‚iZa^\[[[ZZZYW]\ZZVRVZZ]^[[^_]\[XVYYRRPQPNPQNFA?@=954?A4?ewquzrpuxxxvrr{}wwz{yxyvqtvrr|~tjqlTK^pm^\a^Y\cedb`_cdb_`gfWRXYZYRR[a\aknnÎÔÊÔÚÜØÝÓËȸ¸Ñ¬iUcOIr˜—¥šx‡ª¤£ sT]`Z[WWWVVUVUUUOPTSD=<>BFHIHIJJHILLNUY[`d]^th4!#$&'*-0110.-.035@WkcZ`a\WXTT_bcdejdVT^ceghhfffgbcdefedceYYtŽ®³¡¤¸³¨ª·º©£±¾°¥­¶²¦¬¾»®¯»¼¨©»Ã³§²Á¼«§¶¸¬¨½Á±§¸Ä·©­Â½¦³¿”c`jeccadcaa`cbcbXPNLOXbfdcbeidWvˆcinkjmkkmmlkmmlnmlljmonnqsmmwa_œÖÒÊÍÐÊÉÍÐÎËÎÕÓÊÏÜçêçÝÖØ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€J€®³œ}‘Öô·{qy‚ˆ}|–ÈèæÕËËÈ¿¯š”Ÿž¤Ääîìèéëèëé¾~jqluŒ}~„‘““¢­¥›”’„on…}opr|€}}…†}¥äߵürw¢Œ“˜‚xŽ“‘”Ž”•‘”˜›£©¥žž š–š™—““–—˜˜¦Èм®±ËæØ¬}jgfff`^Y`a\\`dfilkhhgcaa_dkia`elilnlgiomd]bjjbZZWNMX^^a`_]ZYZ^`aehikmlikjlopnnplrm[KB=:>=<=ADHJKLMPRRMH94402Uzyqsvqryzzttuusuuvwutw{|yqvtrzztzo[T[hmc^]^\\aedcbcedbbbdfWQY\^^UV^a^dnnh“ÇÑÈÌÖÞâåÛÙâ×ËÖ°mZfQIr˜—¦œz‹¬§¥¡rT]aXZWXXXWWVVVTOX[D!>^H5=B32;'"%!5al`\brrb~ Ÿž¥›¥œ‚gd\Zxœœ‹zuhal}zqj_X^\\[[Z[ZZYY[\YXWXYYZZY[]^]`\[ZZ]\XSQPOOTTNFA<:;<@DBGJJIJIFIMNPVYZ_og]aO$! "$$&(+.110/--/15;OfdZ`c]XYUV`deggicVT\_dfhhfdfgcdefedcbfYYsŽ®³¢¦¹°££¯®©£±½¯¤­¶²§­¼¸ª°À¹¬­º¿³§°¼¹­­¾¾²¯º¿°¦¹Æº¬²Ã¼§¸Ã”b`jebdadcabaccbbXPNLNWbfdbaehdWv…agmklpnkkkjklljlmmmomlnpnppou_a˜ÓÐÉÏÓÎÎÆÊÎÎËÉÌÐÍÝêíéÞÖÖ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€M}ªªŒ“Îí®vpw†yz—Çáçæ×ÉÁ¦’‘•™™¦Êèîëéèíéë辂qxozŒ‰˜Ž†™¬¥œœ”‰wu‰|jlr~‚€~„‡}¤äàµÁ¹u•¤˜‹u~†“’Ž“‘”˜˜¥ª£šœ™—™—š›’”˜–³ÕÌ´«®¼Ýبuhgdbe`][_^[]abbhmlgggdc_\dqqieedfhhhklmgebfmkb]XRNS\]\_]_][Z^becefdeijhjhjopmmpnscLD?;=><:<@EIJKJKNQQPPLE:5B]puwutspswwtrtwusssxwtsuyyvtuwww|}tfc__]dngZZ^a]_dfcfhe``a]dhYQZ\\]WX^a\bjim·ÄÀÄÈÌÛÝÓÒßÝÑѨhYiSJr—™¦œ~Ž®§¨¢rS^`XXVVVVVUUTTRQcZ-:[\NF?007(;dh^_akra{¡£ ¤ž¤Ÿ‰mc[[x™™Œ~ulgozkd]Y][[[[[ZZYYZ\ZWVXXXTYYXY\^ab\Y\`b^VKNQQQTQIEB???@@AAHMJGHHFFJKMU[ahsom]6 "#$&)+010/..0157F^aZ_d^YYTS_fihee_SS]abgjhb_aegfdcbcddfYXr~®³”·²££²¸ª¢¯¼®£­¹±¤¨¹¸®´ÃÁ«¦´½±§´ºµ©¯Äõ²»Âµ¨¶Àµª´Â»©ºÄ”a`jeccadcccacbbcYQOLNWbfegcceaVu‚akpjhmnljjllkklqnhhmompokmnnr\`ŸÓÐÎÑÊÁÆÇÌÏËÅÅËÒÓáëîëàÓÍ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€H}œ¨ŒÎë©rnt}‡{zœÌÝæîØ½¨‘ˆ‘™™—”¨Ïëîëèèíéìè¾…v|qv‰Žƒƒ“œ—†“§¤™‘Œ€~Š‹{npwƒƒ€~‚…§åâ¼Çº“‚§”—Œ‡Ž“–—Ž’•˜š›¡ªª£œ˜˜•“—•’“˜˜ÂÛ讬µÒÌœndf`]a]YXYZ[]Z\bfllijic^_\cnpld\_cecdillmh`cnm_USMPZ_^]\aa_\\`cdfihdeikihijmnnnornW@==:;A=:;?DGHFILLMPQQHKNPMIO]jsupqsuusuywtvxvrwzwuuvwytuxxyxqXTZiidgc[\_a^]`daceb`cc]cj[QY[YZURZ`]aikq‡¤¥Ÿ¨±¶ÄÌÌÊÒÖÑΤfYhRIr™›¥œ’­§«£rS]aVWVUUUTTSSSQNXI'!+>LRQA05=) >eg___gm_v›¤¢¥£¢¡rcY\y–•Žunor€xg_][][\[[[ZZZYZYYZZZWRUYYXZYZ^aZUWZ]]XPQSRQRRMDCAABA?=BKNHBEHIJLLMU^hrpqvT!!!"$')/010//0255?T\Y^`\XYSR\ejccf`TS]bbccdeddcedcbcdeffXWp}Œ®³˜›´¶«§³º¬ ¬º®¢®½·§ªº¹­¯»º¡ ·Ã³§¶Ã¸©®¿º«¬À±¥·Â³¤²Á¼ª¹À‘a`jecdadcfeababd[QOLMVafed__cbYyž‚blqjgjiijlllmoojjkmmklommomls]^šÍÊÈÌÇÁÇÐÎÊÇËÏÏÊÕãìíêßÐÈ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€H‰Š—Úïªqmt~Œ‚~£ÓÝãíѯ“‹Œ”™œ–¨Ñìîëèèîéì辆yrp…}’˜ˆ‚‘¢¥ž—‘Š‚‡“yjs{…}€‚†…ƒ¬æäÄϽ‘‰‡‘ª™Œ–œ„†‡ŒŽ‘––•™—–›§«˜›•”–‹••’Œ¥ÒØÏ¿³¬µÌ¿gae`[_ZTVXVTUWZ_eihfjlfa_\ajooh\^bdcachmig``ii`ZRKOY[^a___]\_dgfdhhddhhefjlklppmtgM:;>95D@;;>CEEAJMJJOPNSMORNKMM[oupqttvsstsopuwvwwvvxxwvqnt}zstiWWptbZY[]\\__`fgaadefd]]gYPY\Z[\U[da`hlb‹¶²œ˜›ž©°°¬µÅÌɪjYfOHsœœ¤œƒ”®§­£qR^`VWVUUUUTTSSNV]K2#!.A;/9A%#>dg`^\ef[o•¢¢¤¥¡£”ubX]{•“Žƒupstwd]^\]Z\[[[ZZZYZYZ[XUUUVWWY\ZX[]YYZZ[\ZPOQRONNLID>:;>@@EMOE>BILILLLQW^fksn? !!#&(/010001334;MXY^\WVZVR[cghhi`QP]ecegfdbcd_acefffffXVp{‹­³™œ¸½¬Ÿ­»­Ÿªº­¡®¿·©­½º¬­¸¸©«¹¼¬£²À·ª°¾¶ª¯·¾°¦¶Â·¬®À½«¶¼Ža`jecdadcgfaa`bd\QOLMVaffe``eeZv™€^gomklhgopjgkljlghllmnlmqsmmxb_–ÎÈ¿ÅÍÌÏËÉÌÑÑÌÎÕÔäïïêßÒÌ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€J†—„—Öè¥nr‚Šƒ§ÉÚæàÀ ›  Ÿ™°ÓéèçêéçâììÁˆwyltˆžš†€}‹¢§˜‘˜Ž‚~‰’Œ}qt|„†ƒ€‚†‚„¨áÝÈÓÈ’„މ›¦„ˆœ‘€|‡Œ”’“••”™ ¨ª¡““žœŽŠ’•‹‘¶ÓÒ¾²©³½¥|feb_[XWUKPVWUSSTcehknnjg^\_hprlcZ^ccadhgbgecgg_YQFN][Y^ab_`a`cffffeddfikgpslgimmrY@899:=?>:99=AABKLFCDFGKLLLQXYUjwZ( #&)+.--/231/26=HRX[]WW]WRY`ehde`TRZ_^gkfacff_addcdfi`RXwƒ“±°—Ÿ·º«ž®»ª¢°·¢ž±¼²¡­¿¸©¬½»°«µ¼±©­½¸°²½º¯­»¿¯¦·À²¨³Æ¼¦¸¿d`f`bfbeecdbbaad\PONPXac`fgbdfZx›€cnsnhjmjkiilmklifinlloqnssnqx`bÈÆÉÌÊËÔÉÍÔÔÌÊÎÎ×åëëëßÒЀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€N…”Œ‡™Øîªx~‰”ƒƒ®ÑÜßØÃ±»»º²¥šš ­ÍäêëêææàêêÁ†t{xx……„•¡zoq„¡¨›“—…‚Šƒums{ƒ†ƒƒ‡{©çßÉÜÑy™²˜‚–“„‚ˆŒ‘’‘“—”‘’—££›’•Ÿ“Šˆ~гÏ̾µ­®·±jjhd_ZWTSPMKNTWURY^ejkjhha^`gmpmf__acbcefghb^ehaZKEP`^Z]^_^`cdefdcdedcejoqsqkfgkneQ=7889<:;:<@DCDLEADGKR[WOLQPJKTN^pvrqrotssssuwywruxsruuxrqvyywqlddg`ceRW\]]`_\\`bca`bcca^WR[_Y\aXX^]dnhfŒÂ;ÁĽ¼À½¸±¦°Ë­o^gPKuš ¢žŒ•¨¦²¦rTZ]VUWUUUUUUUU[LX_>(=<27>)Dfa[cbac[f” ¥¤¦£šƒm^`y–‘†€zz~uuwg]]Z[\Z]][[[YWYVUWVWURPWWTUUUX[YYYY\[VTQQRQRPKEC?;;?@@CLNGCCGMHJLNRXYYgbD! "%)+.--02320407GSV[b\Z\VQ[chb]aaTPZehfgjiecedcccddddcTYw‚®­š¦ºµ§ ®²§¢²º¥Ÿ²¿³¢«»·®¯»´©¨·Á·®±À·©¬»»¯«¼¿¯¥¶¿²¨µÈ¾©ºÁ‘edibce`aaccbcaad\RQOPX`a^dfaceYwš`ipnkkkkjjjkmmnlmnljmnjinmiksZ]šÑÍÅÆÎÍËÈÊÐÒÍÍÓ×ÜèíìèÚÊÇ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€O‡žŸ¥—£Ûë¢s{€„Œ{ƒ®ÒÚÚ×ÓÒ×ÍŽ©•—¦±Íæïìâáëäçå‹sts{}|…˜™†wlrˆ¢«Ÿ––ˆŠ”‚wsw~„†…ƒ…ˆ‹~œçâÆÝÐ’|•Ž”Ç¸}ƒŸ¤Ž€ƒˆ‹’’•˜•‹Ž’˜œŸ˜—™“‰”¶ÍÊı¥¯¸¨†mnje_ZUSQPNLLNPRSSYbhkkkkga_chmnjb_`bbceeffa_gkaUJFP]\Z^a^]`dfhgdhgd_\_hpklnomgc`SF:7878;9:==?BDABDEEHMSTTMLPPIIONWlxsnontsrrsssrutvyxtu|xrpswzulrtm^ZhjNR]_\``\[_aa^]]^^^\WS\^W[]V]ia]jkfÅϸ´»¼¾¿½Áü¿Ò¯p^hQLvšŸ£ Œ–ª¨²¦qSZ]WVYTTTTTTTTTMW[? $&#-?=16<) 4U]Z^`ec\`o„˜¡Ÿ¥£ ‰m^dy–Ž‚}z|€xsrd\\[[\[\\ZZ[ZYYYWWZYVUQUWVVVXYXXZZY[\YQOQSRPLFCB?<=@A?AJMHA?FPOLJJNS\dfM/!$')../03332657@LV[]ZWXRPY`deaecVP[efdgjgaafheccddb_fVYv€«©˜ µ·¬¢®³© ®¹«¦³¼µ¤¬¸´­¯¹º­¨µ½³ª¯Ä¹ª­¾¿²­¾À¯¦µ¿µª´Ç¿©ºÁ‘dagabfbddbcbcaac[NMMPXadacc_bcWw™|^gnmklklkjhhhjjlkkkkmmjknnjns[_ÕÐÁÀÇÆ¿ÍÆÇÌÌÌÑÒÞéîîëÜÎÌ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€L‰©°³¤®áç›mzyx†~‚¢»ÂÄÆÉÐ˹­ª Œ–™¬ÇáîèäíæêëÌ•rnqyyx‰ˆvz‡˜›“‹Š†‰…zspy}‚€€†pŽãݺÕÎ…™‹”ÜÒƒr•¥™ŒŠˆ‡ŽŽ‹„ƒ†™¦¨ šœ¡£¦¤Ÿ£²½¿ºª£²½¦mnke_YVTSQSSOJINSTV[bhllkfa`dimlga````dgfgf_[bibVBFT`_\]^`^`cehheec`[Y]goolhfb^VPD>9:9779<<@B>AB>;?B?>@>@?@BGIJIFIJFGJJGAWszssywuutsrsuv{wvrrx|vrnpttrqppgc]Yit_R]`^`^[]Z\]]_a_]_dbY\^VWWZX]^dsihŠ½Ë¾À¿µ¾À¾¿¿¸¿Ö¯o[eOKs”𩍋–³±°¦rT[^XWYUUTTSSSRVUNNUI1%+$1HC369(7ek[^c_`ZW^m}  ¢¤lbm‚…z{}€…~ojbYUTW][ZZYYYZZXUVXYXVQPPRUTSRPTVZZX[^]WTTUTSPKA?=:<@CBDJMKIGKSWSRQQPW_W@3." "&',.013344722:FQ[bZVYUT\ab`ci`PO[bcffaadgebcdcbabceUWt~­¬›¨º°¡ž±·¤¡±¼«Ÿ¬»³¡«¹²¦¬¾¶««º¾°ª¶½µ«¯¾½°«»»®§µÂº®°Ã¼§¹¾`dibce`ba`bbcaabZONMOW`b_cb_dbXy™{bmokillimmkmjhliklkkllmrrrqtw_eŸËÈÉËÈÈÐÎÊÏÕÒÎÓØÞåççæÙÐÔ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Fˆ«««¥­ÏË¢Ž Ÿ‘˜šœ––›—”‘’–—•“””œ³Â»¶À¿¼µ§–ŒŽ””–”–š™”Ž’””˜—’Œ‡ŠŠŠ‰ˆ‡‡†ˆ‰›­“†ž›‡„Œ¡³Ÿ„|„‰’›š–š˜–•˜–•𡧬³¹¼¿ÅÌÎÆ¿ÃÌÊÇÊÈ÷¶µšxnokd^YXXYTSRSUUSPTUVWZ_fkfdcccgklf``eb_ae]``]_f^MBMZ^[\`caadfddca^]\[ZYZ[]]XSTWPF9:;<;988<:;?>=>>?>>BFIHEBGGCCGFBA_wxtvwtutrrrsssvuuvvxxxrmnttqpplc]a`chbX[[]_`^^`bb_^^_^\baZ\^Y^bf[aa_mmb‡¾É»ÀÈÅÀ¾º½Âº»Ë°nZdOKr’§¦‘𳝴¨tV\^WVXVVUUTSRRPNOQTVNAABJO=2::' 6oz`[de_YV^hq‚˜¢¨©‘tho„ryƒˆˆ|nga[XXWZ[ZZZZYXYVVXYVUTQPQSSQOOSUW[[XZ][URQRQQOKCB>;>======@FHGFECA@?>?Snystwtsuvvvutssruuvxtptrnptsqpnjg]^d_`e`\\\]^_\\^_^]^__Z[[Y\YVb†~\Ya^knh‡¹È¹»Á¾»¿ÀÁÀ¶ºÎ²pZeQLs“œ¨¨‘œ´±´«vW]^VUVWWVUUSSSQQWWQSXVTV[S:0<;& *e}eZaf_ZV\fit‡›¨ª”}opƒŒ{nz‡‹‰{ob]YZ]XY[ZZ\[XVWV[][YTRUWVQLKGGOTVYZY\^\WSSTTTRNHGC@@BB@EIGABGNTXYZYYWSN98<<4(! #%'),/1113539:8>O\^ZX[TPYageac_SQZ_fcbdfca_`abbbbcceUWt°°›¥º¸ª ¯·«¡©·¯¤¬ºª™£¶´«®¼Á¯¨¶¾±¬¸¾µ¨«»¼±­ºº°«·Á¸§°Ä¾ª»ÀŽ`_e`bfcff_aacbaaXMLKNW`c`b^^c`Wz˜z`ilkmniigjkjkkhkkjkmjhmommnrrZc£×ÒÇÆÉÇÅÑËÊÏÔØÛØÛâæêéÙÎÓ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€K…œ‘–š–›¡­¦£©ª¬ª¨©©¬¬¤£°ª¤ ¢£¢  ¨¥¤¬±§¢«²±© £¨ª©¯ª£¤§ œ£¡§©¤¢¦£œ˜ž¡žž¢¡œš™™›ž¡££ ™¤¡”“™¬ ¡›—™—–¡™Ÿ¢¤§¥§±®±¹ÃÇÇËÑ×ÜÞÜÛÝÝÚÚàØÏÖÛØ×ÓÖÒÓÆ–mlvqg^WTTUWWVUTSSRSRQUZ`celd`cinojacc`agf]\[[Y_h]CDT_^[\`dgfgd]\_aY]`^YUUWXURQOJA;88889;;;AB<9>?<;;88=@@CJQF><96:Ci}{ntwsvqtutqqtxwuvvtvyxqqstpoomlf]]\[`ba\\\Z^b_\^^^`a`]_[[]_XVh‘—nV[`mhdˆÄÕÀºÄËÆÄÀÂŽ¾Ïµr\fRNt”˜¬¬Ž™¹µ±¬wX]^VTUXXWVUTSSUSSTSPQUNNVV>1:8&*^xf`b[_[V[dekz‘¢§”ƒtpƒ‡yp|ˆŠ‰}l`\WVZY][ZZ]\XUVX^ZX]XPRRPF@DCEOQRVYZ_b_VSSUTTSNKKHDCCA>BIJDDIORX[ZXXYTL8:>B>0! #&')+/001357:;<@JV^UU[UPW^cceg_QS]_cdfhihebca`acdb`gVXt°°™§»µ©§³³ª¡«¸°¤®¿­¡®¼¶­°½½©¢µÀ´«²º¶¯²½»±°¾½µ¯ºÃ¹§­Á»¨¹¾‹]chbceabb_aadbaaXPOMOV^_\`\\b^Uy–u^jlhjmkmfjmgjnghkjhlnmlollnqqYbžÐÌÈÉËËÍËÍÐÎÉÍ×ÛÜäéïíÛÍÑ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Fž–“”“–³ÐÛÖØÛÙÚÙÙÙÙÙÙÙÙÛØÕÔÖØ×ÕØÏÒÕËÉÓØÙÙÙÛÝÛØÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÏÏÏÏÏÏÏÏÌÌËÉÈÈËÍÍÊÌΟºÇÄÀÀÄÄÀÃÊÇÇÈÉÊÊËËÖØÚÝàãåçæåäãâáààÝÚØÙÛÜÙ×åßÕÜÆˆkusia^[WUWVXXVWZYVVUSSV]beihfcejmmifb^]ab_Y[\YZc[DCX__`bfdeb_^_`_^ca\WY\YRPWWPH?=CB=9;=88AG=:?A<:><<969AHKQJEC=9CRm}zrz{tvvutssstusqsussvxtpqpmrvrndYX^_`d_]]^]^abaa^^`__d_X]]`^Ta”¥pVbbkhgŠÄÒ¾¿ÇÃÁ¿À¿µ¸Ë¯r_fPMt’šª¨‘ ·°·¬tW^]WYXXWWVUTTSTRPNORWZTPRR?6;6$!&[wi_^YZ\[\chikƒ–§™†~ut~wr~‡ˆ†xi_XXWX\_ZYZXVXYT\[YVVWUQURDKVZ[XXQO[bceac`TRY]cfifa^adeeddccbbeVVsƒ’®¯˜ž¶µ¦¤´¯ ›°¼§®»¬ž©¼µ¤©¸º¬¥¶Ãµ«µ½¹³´¾¸ª±½Æ·©·Á°œª¾¸¦ºÁ]cfacb^a^c]]abb_XMKJMV_`\abcc_[|Žr^klikmhknjfikhghkkknnkjknomor\d¢ÒÍÉÍÑÐÑÍÌÐÔÒÎÓÜÜéìéåÙÎÏ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€C~¥¦£§¥¡¬ÎçéèìîïêêêêêêêêëèæéîîçààãåæáÚÛãéçäãåçéêééééééééééééééééêêêêêêêêíëèççèééååéëßÓ×åáßàäçæååãääååææçáâãäåæçèææåäãâáááßÜÝßßÝÛÛßàåÅ‚gswlb^[VUXVXXWVVVVRTUTSX`ghgedfjjigcba`ab`\ZYY]bXDAV_bdehfjd^\^`_]\]ZWX[WPSVSKC<:?C?::<9:AC=:==99=?<:<<>ENJMOOLKMQ`swqsurrttttsssrytrssuxzsnnmkptooja]]\[^_`a_]`a]__\\``]]\X_^a_U^Ž—kW`aloeˆÂѽ¼ÂÀÀÀ¼¾À·¹Ë¯r_fPMt’œ¬«“¢¹³¹¬tW^\WXXXWWVUTTSPQRTUTSSOPVT<099"!" %Wsg`a`caZYaedfv‹£Ÿƒwt~zwЉyi]VY[[[ZZ\ZY[YWZXYYXXXTOURE?IPNNNPTWYZ\^\TQWWRPSRPLGBBBBEHJIGINSWXZ]\WOHA8132(  !$'-,,,-/246888>JUZZXXQO[bcb`b_TQZ^ahic_bcbedddccbbbUWu„‘«ª•Ÿº·¢²¶¡ ³º£¯º¬¨½µ£©º¸¯¨³¿¶­²»²§«¿¿¬ªº½¯¦¶¿³¨±Ã»§ºÀŒ]`c_ccaecb_acaa`\MLKNV_`]_`ac_\}‘v^ikiklinkggigfjlhjnlkkjkmomor\d¥ÓÌÅÈÍÍÏÐÔÔÑÒ××ÒØèîéâÕÎÔ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Gz¢£ §«§¢¹ÙëêçéêææææææææéåãåéäÖÊÃÅÀÅÒ˽½Ùáéìéææèççççççççççççççççççççççççéççèçá×ÎÎÍÐÓÍÄÇÑæèéæäååäããääååååéééèèççççççæåäããåäââäãâàßáãå¼zgvuj_YVRSV[[ZWTSTVSUVTQS\ddghfcdhkhcaa``cd_XUX^aTB@S^dgdeccb`\ZY[]``\XX[ZVTSKB>::>CB=9;;BS^gidb`[]_^[YZ\_^[VUVVURNC<;;CB?@@<;:<=<;:986:;;>EKMOPLEFOPLO_szrsvssttuttssrrvwuttsxojihptnficZX]be\`b^]bb\`b`^^````^^XX_]`\^Z[]`gjh‘ÇÔþ¾¿½À¿ÀÀ·¼Ð®q_fPNu”šª¨‘ ·°·¬tV]\VXWXWVVUUTSSSTTTSQPPOUT>396#!Poeaega\UW_ccfam‡—™Žztyts‚Šˆqe[WZ[YXVWVZ[VVYZYZYWWXXWQUOHIOPQMMOTWXXY_]ZWTSRRQQSL@AGDDHKJHINTWY[\\YTQK>40-07=?3&#"#&+),.-+-274578==CLPNKILNMJMYq}wsvsttssssttwvwwtvxxtmkjjprkfjf]\`bb__^\[_b`_^^__^_`]^`\[`_\a__\Y`jij—ÊÑÄ¿½¿ÃÃÀÂŽÀÒ­p^fQNu”šª¨‘ ·°·«sV][VWWXWWVUTTSRSUUUSPOSPTTA7;5" Qqh`bb\YWZaabhcez›”uzooƒ‹ynf\WYYWXXXY]\XX\[VXZYXYWUQWVNKNQSNNPTVVX[da\VTTVWWSTLA@FBBEIJKMQTXY\\[YWVQE;40<<>??;98:=@CEKHGKMLJIIXp|ursqssrqqrstwtsrruxvnjjkjopiehbZZ^__^]_a`_^]`\]aba`^]^_][_`\Z[^^Y`g`jžÌÌÁÀ»½¾ÁÀÁÀ·»Ð¬p^fQNv•œ¬«“¢¹³¹«sV\[UWWXWWVUTTSUTSRRRRRRQWWB6;7#Psja_^^[Y]a__fecrˆ˜˜„y€pn…‹}tmi]VWXXXXW]\YYZY[VXZXWWVUTVUQNOPRQLLSTRU]_\[_`[VUWSSOEDFEGIJJJKNQXZ\\[ZZ[TKHEANeoXG1#!%%$+,-,+,035579:>HQUVZSOX_adbc]OMV]dedcbedaaaabbcbc`SUt…”°°•ž´´¨ ­³¢Ÿ­¸«¡«¶³ž¢·µ©«¶¹®§²»¯©´º¶­®¾¾®­»¼¯ª¸»¯ªµÁ¶¦¸º‡^cfbddaeb_`b`^a`XNNMNT]abc_^b]Wz’vamogdhjkhikhgjnkjkkhillilmlmpZb§ØÓÐÓØÖ×ÛØ×ÚÛÙÕÔßæéêèÚÑ×€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€RµéÞâíêëãêéäåççèææææææææääåääæéìèèèåæììåççèêíìèäèèèèèèèèèèèèèèèèååååååååççèéèæâßãçêéææéìêçæéêçäãççææåäääççèèééêêèèèèèèèèçéêéæåæèäèêÏq~yYSPTVTTVOLLNPUam`YUVUSV^aceebbgmmc]^_acd^ZQR\ZH9BQTTVWXSUX[YURSUVTRTUTOKA?97<>=?BEB>?><<@@AB@??@?;65?=;=@ACC@=?DB>::;<>AHIJKID?(%**('')-145679:99BLSV[TOX^aa]^[RR\bdggcacc```aabbcc^RVu„ޤ¡”¤·®ž›¯º©¡¨²¨Ÿ§´¯¤«·¯¤«¶³ª¤®·­¨´¿»µµ½µ§®½¿¯§¸Á´©·Ã»­¿¼†]`c_bb`dabaa_`fcVLMMMR[`bb]\a]Wz”t^jnnok`chmkfhkhihehmnklhkmklpYa®ÜÒÊÌÒÓÖÌÔØÔÔÚààáèëíéÖÉ΀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€O¼ùèÝäèìéééééééééèæååçéëçççèèèéééèèçèççææèéèæåæççèééèææççæææèèçæèèèèèèèèèèèèèèèèééèèççèèèèèèèèèèèèèçççççççèèéèèèééèèèèçççéêéçæèêëèðÊ‘ƒz_V[PLWTILMVXY_\]iifaZUTWYb_^`_\aik`V[^^ce`SOV^UHLXYTLKPQKPQRSSSSTQRRPKE?<9426;>???A?;=?@@DB>?DEA?<=CC;9@DEFIKG?;>8469::;=?@?@;:67<=:834:@>?EHFHHD>=@Dizxtttuosnmrroosvwutqqurfahnoonrgda\]]W[_`adhhfe\^aca^^^^^]^a`]\]]]^Z`eXq°Ñþ¿¿ÂÄÁÁÁººÈ¬o]fQNv–œ¨¥‘ µ®¶¬rQWYVVRRTUWWWVUTSRRRSTUSQQTE247' Kpj`eda^ZY[]ae^bfeizˆˆ‚yv~|rmg`\YXYYWUWWWXYYYYZXYZXYYVUQRUQNMLDGCEOUTS[]][[]]\VSV\\UNLOONLGFKSQXZZ[]]``^[YPSbe\WB)!%%$'()+-023568856?INWXPNY`_dba\RQ[dddddcbbc_baacb`bhTSq«¦’œ³³§¤³µ¦™«¼ªœ¬½© «¶°¦©¸¹¤ž²¾°¨²¾´«²»±§­¹»¯«»À²©¹Å¶¥»ºXad_ba^b_]ab]]ecVLLKOW`b_`_\`_Z{–x^hlhfiihhiiijjjfjljhilnlnlkppXg°ÝÍÈÊÊÍËÎÕÓÎÐÖØÚÙçëêåÛÓË€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€&|ÙôæåëäèèèèèèèèèèèççççæèèèèççççéèçççççææçèççæçèççèèèçççæçççççèèéééééééééééééééééèèçççèèèèèèèèèèèèèèèçççççèèèèèèèèèèèçèççèéèçæèéâêêÅ’n]a]YY]_agjfhbWTQVcefc]YYWTZcaYUMN\gi]TUV]b_STZZMFRSMIKLJKNNQTSNJKMJGBAAA?=7447;<;:>><;;98:<92046454138;@FHINME@CLPctxvvsrlpooqsrrswvrsuvxrgaiqrolnnh`XZ\[`he_`jmigbcff`Y[`^\_bb_^]\[\\Z`f\t²ÏÀ»À¾¿ÁÂÀÂú»Ê®n\hSLt——¤¤±¬¶®qPWYSSQQQRRSRQPYXVTTTUVPNQUE247' Hnh_fg\]]YWZaecddbdr„‰z{yqnh`]ZWXY[[XXXXYYZ[[YYZYXXVVRQRQOLGAECBMWWQW]^YUW]`WST\_ZSQONNKGFMUX\]\]\]ab`^\TUbe_YC)!"##'')*-024568965;DLUWOOY`^`^_[SRY_dcdec`adbda_ba_bhTRn{Œ«©•ž´±¦¤²±¥Ÿ¯¸¦¡³½¬¡©µ±¨¨µ·¥¢¶¿°¨²½µ®´»±¨¯½½°«º¾³­´Á´¤»ºƒ[ad`bb^b_`_`_^a_VNLKMV_b`b]Z`aZ{”v]hlhfhhhjifjnmhkjjkjhjmknljppXg¶ÝËÇÇÄÇÉËÕØÓÖÚØÔÜæéìèÙÏË€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ Y¹òéâëèçèçèçèçèèèçççççæèèèèçççæèççççççæåççèæççéçççèççççæçèèççèéêêéêééééèèèèèèèèéèèççççèèèèéèéèèèèèèèèçççççèèèèèèèçèçèçççèèçææçéäé纂ja]fqmbbddh_`\YVPPYflme]ZZX\`]WQKKS_kaTRTZ^VLQ[YLFRPNKJJKLLQSSPLHFF@ACCBA?=:7578:87>>>?>823:955873283147—çðâçêççççççççèææåçèèçèèèçççææèçæççççæææççççèèçççæççççæçèèèçééêêêéêéééèèèèèèèèèèççççççèèèèèèèèèèèèççççæççèèèèçççççèçèçççççææçèæêä°vegkwxnbbededhf`]XQLU_hie_XSXX]]SKKJUgeXSTYZNFNXVJDMNLJKLNOOSSQMGCAA>?@AAA@@87669::9;;;<=85777559:8853358:>BMKLNPOPRNYnyvoqynpssrrtvouxytqtrjgkjjnnohjwuc`g`\aaahllmhdcec]\`^`ec]]a`\[]]]``Yz¼Ò¿¿¿¿ÁÅÃÀÀ»»Æ«q_ePOw”–¦§‘±¬¸®nMVWOOOPPPQSTUVQRSRQOMLMTZVA9@8( @jiaeecbbYLN\eea_`bgtƒŽ‹}trpne^^]YWUWXYZZYWWY\YXXXZYXXVVTRRPMJG@@HQUTQWZ`aVJP_ba^WVX[ZVSPMIDEGSVYZ\[]b\[XYUT\a[R;&!$&'&'(*-0346677536A><<>AA@=;;:99975;:76889<><647:;?775588>>==<<>AA?<@?;76898<=<:;<;<@?;9:;:<;;7588;BNKJIJJJJFQmvstqrtsqnoqstttsuwyzscelljnpsxxx}r\[b__ccahlfggfebaabbccaa_]]_[][[_][ƒÅÑÁÀ¿ÁÁ»À¿¿Â¾Àͬp^eQOw•©¦Ÿ²ª±§lLQSQQMPPONOPRSSSUX\`dgdjl^@:D8!!Fqk]adg^bcRLXbbcbbbaix…Œrsupb[WUTWYYX[YWX[\ZWWYWWZXVWXWSRSQQVH9;KTSRSPVY[cljb_\\^_]]^]\[ULCDHHQWX\^_`^\UVURY`_N2 !$#!%&(*-1457422116>;88:;::=<:;<;:==979::<9978=<<@DHHDBBB?@Rswqwvvonmortrptuuurswtkhlidhoxyzx~xd^^^_bYMXlqihfdbb`^`ddcc]Y]\Y]\]a\Z‹ÆÊºÁþ¿À¾Áû½Í®n\hRMt—Ÿ©¤ž²¨­¤lLPRRSMNOPTX]bemoprssrrpqqbA8A8%! !KukY_fdZbgWNXaa`[[``eoŠrsvo`]\[ZZYVTZXWXXWURXZWVYXUV]YSRSPOUM>>NUSRPQVY]grrjj_[aaYVY]\[ZTKFFLOU]`\\bc_XXVSZb^K.!&$"%&(*-1458300016=BMRNOZ_]]_`ZRU]`adeb`aba]`abec`biSPn‘®ª‘¶µ£œ®µ­¥«²§ž©¹³¢ªºµ¥¥·¹«¦³»²¬µ»¶®³½·ª¨´µ­§±¼³£¯Àµ£´±}Ydfbddadabdd_^c`TNLJLT]_\^]^]X\Žp\iieggbcghefkljgknmihjmiljinnVe³áÐÇÉÍÐÍËÍÎËÌ×ÚÐØêéçéÛÏ΀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€&,3qÐðáæíåäèçãåëæçèççæçèæçèèççæåèçæççååçêèçèèææèèèçæææææèèééêéééêêêéèèèçèææèèççèèèçæææåæççèèèççææçççæçèéæççæåäåæéèçæççæååååãåççåæìæ¨eo|\^``][ZZ_efcelmhnmjcYQPRPX\`bXG?JTbeZRRU@BLM@@LRQRQOMKGA==;89=?>9<=>@?=>DB;427978;=<<=?@>><99;<=@98=>:BD9@`qpuwuvusqqporwuvuvuuwrfbkkeiszyytxp]\`acWJShoiojcda^bfdedb`_\X[[\]b]^ŽÇÌÁÂÅÀ¿ÃÇÅÃý½É¨q^bQPv– ª¡ˆš°©µªkENUPMOJPJCHMPUTTVXYYZ[aYSJBGF8%! !Ryn\agddec`]]^^b`^bbbh{‚|oqzq`ZXXZYUTUYXWY\ZWYYYYYYYXXX\VQTROTSFENSRQMRLQ[akuwqrj_\aa]]ab^XRJCEQWX]`__`^ZZVOXdY=($$%$',/1479752/159;FPSMNY_^a_]WQRY\cedcec`bgd_ae`\_bUTl~˜±¡‹¡¹°Ÿž°µ¬¥¯µ¥«¸«œ¦¹´§¬µ¼©¦µ¿³¨±º¶®¯µ°©ª·¸©£µ¼®¤²¿±£½·|Zce`bcafd[_c``eaRNNIIT]`ae^Z[XY}l^kigiifhiiiiijjkiffkkjmjkijnlVj¹ßÏÈËÎÌÍ××ÑËÎØÚÖ×åìéä×ÌÌ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"12]¾ôìâëåçèããçæåæççååææèéèææçèççççççèèééèçèèçæèççççççççèèééêêééééééèèèèèæçèèççèèèæåççåæååæçççççæçççææçèææçæååæçéèææææäãåçèæäæçèàñë©n}‹iY]ab_\YX\_dhklkimjknk_SNPSV^e]K@?I[d]TNG>CNK<=LSSSOIFFB>;>>==???==:;AA>=:=<769:959>><:;>B?<::;=@=978:<=@BC>AB@=5Dgyomvxssqqrqpqtrtttrqtqbdllntuusxzz{wi\^^`aPFYmrkehidbfgeeda_]Y[^\YYa]^ŽËÒÆÂÄÂÄÇž»¿¼¿Ë¨q]bQQv–Ÿ¬¤Ÿ³©µªkFNUPNOLR?! #! !#$&' '=>????>;@>:;AC?>:>@=<<:8558==977;88::89<:50025565:;><9BGPcsqjnsqqqstsqqrtsqrttun^bhipurrux{vsyr\]]\e`JNfojhifdfhgefeb`^[\a_[[b][‹ÈÏÁ¾¿¾ÁÄ»»¿»½Ê¨q^bQPv–š¨¢‹°¥®©kGOVPNPQXJ-"%!"!0BBLSG)" !Nxphoghdbdda^]c`_]\_fhpyzrqum\WYZYWVVUWXWXYYY\YXWVVVVWXWYVPRTNQOMPTMGINQPNR[hurvwpf``bc__bb\UREEKU[^_]a]XZXRY`Q3" ""%)('*2750/01/-/7>FPTMNX_]]ZXSMPZ`fbcc^_b_\___`]]dbORr|‡¨¬” ±¬¥¨³¯¢¡®²£ ­´®¢¦¹º¦§¼²¤¨¸¿±§²¾¹±³¼´¨§¶·¨£µ¼°¦²¿°¢½·|Yce`bb`eb\\`aab]RJLKNX_][[Y\^XX’p`mmjhgdjjjhgghikmmkhhjijkijnkVj±ÒÇÊÐÍËÓÎÇÄÈÊÈÇÉÐãææëÝÊÊ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€/+3fœ·ÅæêèååäåêèèççææååæååææåäåæççååæåãææçèçççèåæçççççèçèèéêêêêèèèèèèèèçççççææçèèææççäãæççèèèçççççæåååæåæççççèèæææçèéééçççæåååæÝìè³uekc_^[WVX^ccadlmihlhmmffmok]UOTadYLB?Qb^UNB:FMC5;IMFE@<<@A@<:8<@CA=@?<=AB??>??=<;72238<933720278547=<6015525<<<;E]mcao{urvtpqstsqqqutqstvvnbckprsrxzvxwsyvc]d_ajYGUikljgfggjiihc`^\Z^^[Z`XVŽÆÈ½¿Ä¿½¾À¾¿À¹»Ê¨q]bQQv–™¦Ÿˆ™­¢­§kHQVPNQlh\QLJFC9<;5/--,++8>=OT<% ! Rsjnehkkgcaa`b^``[_feirwsopi[TY[ZWVTRYZYXXWX[YYZZYXWVYX\ZQQURRKKOKE?9EOPMOT^lkottngfjle`ac`YTH?DS[_a``]Y[UQZbJ,! !"&''*-0013////.08@GQTNMX^][YYWSU[^cdffa_``]``_a_^beTSm{®¦’¡´®¤¦³±¤¢¯´¤Ÿ«±©¢§´²¥¦µ¬ž¡³»¯¥±º²«¶¿±¤­º¸¦¡µ¾¯£±¿¯¢¼¶{Yce`ba_daa_`a`a^WKMJLV^]\_Z\`Z[~palhejmjefffefhjggjjgikijkijmlVj¶ÖÇÇÍÎÐØ×ÏËÏÒÑÑÕÚÝßäéÝÍÊ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€+00Ebw„¾åñçéèäëèççæææååèåäååãäççæææççæääåççççèèæçèçææççèèééêêééççççèèèèççççæææææçææçæååæççèèèçççççæåäåæääåçèèèèææççççèèçççææåææÜíì¶q[cbZ[[ZYZ]`ggikkiggcba`^^dkjkbTT``UG6>GF>>=:<@A?<:9=BCA=??=>CC?=?>=;;;975359844651155226695,*02-994>C2((++,+(++(%')''-S}tjspglldafgd`]ab^_dbcksqjig\VY[XXXYXWYXVVVVYYZ[[ZYWVWX\]WRQSSPROC94/8ELMOOR]cekrtqqtvsmgda]XM?AOY\^^a\XXSQ\aB%!!"#%&&+0/+.63/-/239?GQTMNX^\[]`\SQW\cedcda_`bc`_cb_`dUSk{”¯¡‘¡·¯££³³¦¡®¶§Ÿª´­¢«·®£¨²¯¤§´·¨¢´½°¥²Ã´¤ª¹º¬¤³¹¬£±¾¯¡¼¶{Xce`aa^c`b_``_`^WKMJLV]][_Y^b[[o\komihidhljfeiojghjikmljkijnkVjÃç×ÐÖÚÜàßÚרÚÛÚÙ×ÒÐÜçÛËÊ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€.4-8Ugg…ÆìééêåæææååååääéæåææäåèåååæçèæäáåççæçèèæçèçååçèéééêééèèçççççççççèçææææåâååæççæççççççæååæææåääåæääåæççæåääåæææçèèæäåææååâçëÃzX]_YZYXXZ^beikjiifbba_\ZZZ[bjpgVORSK>BW_RC:==@?<@?ACC@<;??<>DD>;???=;;<=>625;:6363243/.02/.-,+-03,6azvstdZgzvoqrqssrqrrrsuuvssurifmnjrvstwzwsvyxe]]]htcT]jmjmjefggigb__^Y[[[[^VWŒÅǼ½Â¾¾ÂÀ½Âƽ»È¨q]bQQv– « †—¬¤±¤kJTXPOSVNKPQOG>HFEKVXG2#!(-(*0/'#')%)/..,'&*-/4-8c…{ptrmpokkmia^^ab``aa`fomdce_XYYYXYXWVXXVWXXYYYYYXXXXXXXZZSORORRQMA2,.7CLOKJP[[`jrtuxtywnc^\[O@HRTNMX]\\\]XPPV[dd^]bc^_cea^cd`_aQQn|ލ ‘¡µ®£¤²²¤ž¬µ§ ­¹¨™£¶¬Ÿ¨µ·¨¨¶»®¦µ½·©¯¿µ¤§º»«¥µ»ªž°¾¯¡»µzXde`a`^b_]]__^`[QJLKMW][YZW^cWZ…—takjffhhjgefhifcmgefghiijkijmlVj¿æ×ÐÔÙרÛÛÚÙÛÛÖÐËËÇÔæÚÈÍ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ .1*5WlheÅåêçåãæåääææåäçççæææææâãäãæèæâàäççæçèèæççæäåèëêêêêéèççèèçççæææçèèæåææåãååæèçååååæçççççååååääåçââãåççæäâãåååæçèççèèçåçêæàèÊ}TZ]YYXVVY_dbdfefggedlmgehbVWVcqkYJBB?CRZN>8;A@;;@?;@A@>?A????=>BB><=>??><<<=:77775321110.,+/*)-.++/,"-Zvqosl_fyzpqwrtusrstsvustuvwpmhjghqutwttrnouxzh\]grn]Rdmieefhffhgb``_Z]]\\a[ZÊÏÀ½¿¿Â¿½ÃǼ¸Å¨q^bQPv–© †—«¢­£jKUYPOSYRQQMIE=JHGMZ\G-*$$*,)*-(""$#'.*&)%"&,,,.Af~{uslnkhgfb_\^``_`__b_bki]]dc\YWVXWWVVYXWYZYXYYYZZZZYZYXYZUQRNOMPVN>4./;KOJILSSV^fkoqqvysi_[YSE=GV\_e_XVXTT[X4"!&($%(+-/1335/-00/4=HRUNMW][_\ZVQTZ]ca_^aaa`^ca]acaa_OSr~‹¥  µ­££²±£Ÿ«²¤Ÿ®¸¨¥µ¯¡©º¶£¢²»¯£¬¶´§©·® ¦¸·ª¨½À©–°½® »µzXde`a`]a^cca]\a`VKMJKU\[ZYU]`TW…˜nanjgihbdfiigfghigfgjkihjkijnkVj¶ÙÊÆÊËËÏÐÑÑÒÔÕÐÊËÑÎÔãÛÎÕ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ '-+2M`^b`˜ÞìâäææåååççææçèçââæçææèçååèåÞßãççæçèèæææåäåéìëëëêéèçæèèççææååçèèæåææäææåæèçãâççèèèççæääååäåæçäääåååãáäåææååæççåäæçæçèàâíÅsT^WTVY[[\^```__aehjlpmfeihbZSVagg[J;ABDHB:=9?@<<>=9AA@>?BB?B?>?@>=?>@?=?>=@==@CDB?=<;97652/11/--.//*-,(*0.&$)Vvvqmnffntwuporsrqrrpstrtssupqmnosvu{xmmtrqvx}u][bgpiW]glhehmiikic__^[_\XXa^^Êͽ¹»¹¼ÄÁ½ÀÀ¶¸Ë¨q^bQQv–ž«¤¯¤­¢jLUYQPTWMNRJDEFBEGMWZH2 $%'+($&''$&*+($&&&(,+'(3BRVSVWPRG@>;8?K_b_\__^d_`hgZZde]XVY[[YYWYXVXYVTTVXZZYXVXZ\][WRQUPONLLJB2,8KOLMNNNOSZ`egjmsxuldaVI>DSXZb`]\\SOTP1"!')$"*.+-3633..0-*1=IRUNMW][\\\VMMV\__de``cbX``]^aac_RVs€¨žŽ ¶®¡¡±²¤¢¬¯Ÿž¬´«¨¬²¬ £±¶§§µºª§º° §¼²¢©·¹«¦·¼«ž°½® ºµzWde`a`\`^^aa\[a^QONHHRZ\]]UZ]RV‚’o\hjhfhiefhijihfhifdijgfjkijnlVj¹ÖÄÂÇÇÊÔÔÓÓÕÚÜÚØ×ÜÜÛßÝÙÝ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€+303BQWRNoµæçÝáåæççæãàÞäææããææãåäåäéëãââêåãèéêåããåèèçèëéðïèêïëäéçèêçãåìëéçæåäåæçàççääâçâæèçååæçâäæççæäâìëêèæäãâåæçèèçæåãåçéêèæåäáæ³gS[XYXWX[afjjjgcekoomlklic]ZSOLLJKLJ=A@>?@AB??@CC@>>=@BA><>AA><;:;;82.0).Lab^ab^_`cchdWZeh^^]\ZXWVYXXZYVUVVWWVWYYXTTWYYZYRTUUPJNOH905BHHJLILNOPTZ_cehilmjd]PFHS[\Z^_Z^UPWJ"!###$&*-..///-0.,--3=KUTNPTVZ^\[YRPU[`^cgc__`a_`cc_]_hQSr~§¥“ž¯­¥ ¬³¡°µ§ž°º©Ÿ¥²®¤¦«°ª§´º¥›­·¯¥ª·µ©¥³¸¥¤¸¾§Ÿ°¿¬šµ´ySdd_ab`a]a]\]_a^UKKIKT[]\ZX[\RY†‘nbhhkfdkkeeiifeclkeafkkjkihkojUl½ÚÇÇÒÒÏÕÐÖÚÝáåãßÞâãáãçäÜ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€*1-0>MRPM[”Õèâéççççæåääèéèçæççæçåèäåéäâæíæâåçèãåãåéêèêîîéæçèæåèæååçåäåéèèççææææãçêãåíæâèæåææææèççææææççæåååååååæçèééèçæçèèèçæäãâêè©`V`]XWXZ^ekojkjghkjhgihc\TLGEDDCACC@C@=@DCBE?@?>==<<@?>>>?>><>AB@?@C=?>=@?=?@@@AEGC<;87886332221/-+).0,&!$&(Ajzronhgpxxtsuplnoorwwuttsrstqnrwvsplosw{|{xwzxe_fmpgY\ikhijggijf_[[\W]rqh^bˆÃͽ¾ÂÄÀ¿ÂÀ¿Â½¼Æ¥m`bOPr”Ÿ­Ÿ‰š¬¨±¢jKTVNMQYOLMJJHBIPRPQRLCGGGE@:4054333445667778887>>IH===;I^caa_Z[]`]a`WYa`\]]ZWVXZWVVXWUTTQPRUVUVYWSSXYYVSRMMPOPQOH<2:INJIHLOOLKMPW\_`befdf\KFRYYYb`X[WTT=##$!!&),...022-/.,-.4?MTRKMRVZ[\[WOOV[dbba_ab^]]^aba`abPSp}¦Ÿ‘¢³¬¢ ®´¤¡²¸­¤°¶ª §³ªž¥²±¥©¸³¡¡°·© ª¶¬ ¢¸¹©¨¸¼¦˜¯¿­›µ²yTdd_bb`a]Z^a``e_RGIJNW\ZX^Z[^SY†“h[fikifejihghihgkihimkhhkihkojTlÂßÌÍÖÕÐÕÐÓÕ×ÚÜÜÚÞàáßàâÞØ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€)0+,:HMNPNyÉìâßëêèçæåææèççèèçèéêéìæäçäæáëçæéèêçäãäçéèéëïëèèèéèçììëéêëêæåçèèèéèçÝçéßäéàâëæåæäßâèäâàÞÞàâäßßàáãäåæãäåææåäãéçåãâááááêÞ›aY[WXWXY]bgjddccecYN[]XLDDED?CGECEC>BCB@A@@A>@A??@@>B@>=???>@>?BC@?@<;76:;;=DB@CGID>8556531010/--,--4<3$%&:auqmoihowxursnntuppssrrtusrrnmswsonmvtsvz|{xy‚k]dork\V_hhgihghgd][\]Vf„{dV[‰Ãξ½¿Á¾ÀÁ¿À»ºÆ¦l]`ORq’ž¬Ÿˆš¬¨±¢iJTYPLNXQNMKJID?9447740***)&!#"! ####$$$$'(*,,,+*,330333CU`a`^X[_a[^_\]_[Y[\[XVVVWVVWWUUUKOQPQTTSWWVUUSUYTNNRQNOOMKEBEB??;:;AIOOMMRVUVZ]_bcTIQWWZ]]VWXYR3!##&))+,,-023-.-,-.6CSXUMNU[^Z\\UNPX[d`bc_[_d^_`__`_]]PUo|ަ›“§·«Ÿ ­¯¥¡¬±© ©¯­£«·­Ÿ§¸¶ª«¸¸¤ ®¹¬¤°º®£§²³ª­¸¼§–­¿¯œ³¯wVdd`ab`a]_`ba``]TMMJJS[]^_Y\`UX‚h\ikijhadhhfigefgllgfhjkkigkojTk³ÏÀÁÈÅÀÂÄÃÄÆÈÈÉËÓÒÑÏÏÐÏÌ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€+1,,9FKTVKe²èêáâáàßÝÜÛÛÝÛÚÜÜÙØÛÔÖ×ÑÒÐÎÚæçÝÜÜ×ÙÚÚÛØÕÚæîîìçääâáßÙÕ×ÔÐÐÔÏÈËÍÎËÊÊÇľįÂļ·ÎéÔÃÀ¿¹·»¼»¹¸¸¹»¼¹¹»¼¾¿ÀÁÀÁÂÄÃÃÁÁÉÇÄÁÀÁÂû¿°`[VXYXWVWY[]^[XY\WF5?ILE@BB?BDFC@CEC>CC@?@@AED@>=@BCAAA?>>?@CAAC@<=B@;986:=<@@?@AA@?:7554100-,,-048:?J: #$6[ttnokhmuxurrnotuqprnpruvtrswonnjhmqxtprvzzxyyt]aomlcWVajifihggc^\]VPhdV[‰Ãο½½¿½ÁÀ¾Áú¹Æ¨m\`QTs’ž¬žˆ™¬§°¦kJU[SOPVOLPMGBB=&""/N^a_^Z\^_[\a_^]Y][YXWVUTWVVWWUUVRPQTVVUTVYVSUVTVWWWUPLLLJJNOIFB<82.222?HFCC@:BAA@=>AACA?ADA?AGDA?>=>??AB@=<>@B@@@@>>?><=<88:98876557:32120--.3457;AEHHP?$4Xuxoplilsxvqqonopppprsstvtsvqebfhkrwssttwwwwxs|zfckhlm`S[lofkiihd_]^]SiŒ}`T[„¿ÌÀ¿¾ÁÁÁÀ¾Á¹¸Æªo^bTVu”«ž‡™«§°¨lIRYRPRXLGMK>;CH&  Mab__\ZY[X\`_ZYX\ZXWWVUTTSSTUTTUSQRUXXWVXZUOQSUYY[[XSNMNPJJLNQRNGD>969?DHJKJLNLHEQ[TLRYVT\]WSN?%"# %(%(+-.0221--,-./BBAAA@=>BAACB?<=?@@?=<==><;>BC>99<;874364211001431000037BCDEHKNOLOC&#1Rt{oqnjkrxvpnqrppsrmqrprvuruqdclqpqrstuvuvwywux{tjgiingWVfmfjiijf`]^[W_ria\`…ÀÎÂÀ¾ÀÂÀÁ¾ÀÁ¹¸ÄªqadTVv–«‡˜«¦¯¦kHPUONR\J@FD78KJ(F_b^`^[YZZ]b`ZX[UVWXXWVVUSSTUTUWQSSQRVVSTWXZWTTX[ZYZXRNRJMMOTVSTQOKE@@CFEGGHLNLGJOVRIRYQSWYWSK6! ""%&((*,-/10.-,+-/0>SVWVQPW\Y[ZXUQSXZ_abca]]b___^^_```ORnzŒ¤“§º±¦¤¯±£¤²³©¡¬³¬¤ª³ª¡©µ±¥§¶´¤£²µ¬¤­·°¤¥´µ¥¥µ»¦š¬¼®ž³©tYdd_bb`a]\\]]_c\PKKIKSZZZYZ\[QX~c`hdgiffbcfgeijdchjjkkihjgfjmhSj¢º¯µ·¹¸¶³¶»¾¾¾¿ÂÁÅÉÊÇþ»€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ -3/0=KPQXTa“¿ÇÁÄÅÇÈÊÊÊÉÈÊÌÌÎÑÒÒÍÐÕÒÑÓÐÖÛÖËÏÚØÖÓØÛÛÛâììäξ°¨®ÎèæÚÜâçéèèêîñíãâéëçéêìæèïéçåçëîìéçèèèééééèèííììëëêêèéêëëêéèëìíííìêêéöàŽRPTPPPPPPONMDC=648<<;>@ABCDC??@A@BB?;AB??@@ACBAAAABC@@AA@?=<8>A><<;89:8564243102200120...05;JKLNNONNMNJ1 *Ioznqokjqxwpptsopttonqpqurotmabntsrqsttsssvxwwwzyoijghi_TZfihhijf_\\]_[[X_\X‡ÂÐÄÁ¼¿Á¿Â¿¾Àº¹Â¨pbdRSt—ª‡˜ª¦¯£jJSVMMRYI=@A6;QI&<[b]_][[\[]baZX\VVUUVWYYUTTUVUVXURQSUTUWWTUXYWWVWZZYYTQTPPIDMWZ[VRMIGFECGJJJLOPNQSVQKRWQSRTVTF0"" "$$%&)**+-//,-++-/1@WVTRMKTZWX[\VPRXY`eb]_b`\ca`__]^_]PUn{ަ𣵬¢¤±µ§§·¸ª¢­°¦ «·¬Ÿ¥±²¨¢­´¢›®¶© ª¶®£¥±°££¯·¨›­»¬ž³ªtXdd`ab`a]a^^__^ZRJLLOW\ZX[Z\\RY‚g`kihigfehifeijhgggigcemigeimhRj¦¼°´µ·¹¶µº¾¾½¿ÃÆÊÑÔÏÊÆÀº€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€+2-/=KPQRGe¸êæÜåäããâââããææããææãââíçßèèàßêèææäæåèãßáçëêèǰ¥¥¯ÏíñÞßäêèââèÛßÛÓÕàæãàãíêæëåáèèéêíîëæêèæååæèêççççççççèéêëëêéèêëìíëèåãêîݘ[SUSPPOMJGDB9744:@>8??@CCA?><=@@@DC=BBABEC@ACCB??ACBABDDCA?>SG":]e][XWX[WX^^XUYWVTVYYXUTSRTTTUWSQOPTXYWSSUTQTWTNY\VVWVWSRNHIX_Y\[XRMJJLMPPMLOSTQXYSOSVUVRUXS@(   #'(&,,++-0/.,+*./1AZZVRLJU]ZV]aXPRYY^bb``_^ab^^``_`d[RYq}“¨˜Ÿ®¤¢°²ª¦¶·©¤³µ«¢«¸®Ÿ¦¶¯¥¥±°Ÿž°µ© ¨¶²§¦±°ª«®¶«ž­»«´ªsWdd_bb`a]]`a^]`]SHKLOW\YVZX[^TY}c[jjdeiidhhgfdcfjjhgihfgigeimhRi¯Âµ¸·¹¼¹¸½¿¼»¿ÅÇÖÜÚÑÉÆÁ»€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€&003BMLMMHÜéã×àßãæâáåèêæãäåääåæâäæäãâÝáèèåæåãäèæäêèæëæÅŸ›œ§ÕíæâÜÞÞÙÜáÞÅÂÈÏÑÚããÞèäèëæëéééêêêêëíéééèèçææììëêéçææìëëìììëêêêëëëëìíëôã›PGULIC;64321::::::::<<<<=====;=@BCDEB?@DADECAA@?B@@@A@<98<><9986.35300/.1/14630/53.1646DIJLOQQPOQRT? &>buropnkmsustsqkhouspuustrrvo\U^efdbfnqqronqox|ulhgekimo`QZqmfifca\bZ[\YX^^W…¾Ë¿Ä¼µ¾ÂÁ¿Äƺ´¿¢racPQx•¡­˜‚°¦®£jJTYQQUWFCF;3@PB$ 7Yb\]ZY\\ZY[]]ZWWSRVZYVSRPSY[WTTSMOSRUYVVWWUTTTTVTRVZTPVWVQKLSXZ[]\XUSPLTQRUVUVZZWWSKLSUOPQTQ;$ "#!#&)*,--,+++)/.-/9UZXUMIU_ZY[\XRTZ]\]ab^]__`__]`^Y_\OQhx¦—¦µ¥“¯³Ÿ§´µ§¢«²¬¢¨±°¨ª¸±¤¢²µ¤£¶º­¥¯¸±§©°±©¨µ¹ª›«Â®š·®rYfd^adcb\\`_\`c\QKLKLUZYXVW\ZOZ‚‚^aqg`ehedhjhedeeiggfehkhflhfkhSl®Â°¶¿»´¶¹¼¾ÂÁ¼¾ÊÌÑÏÊÌȾ¶€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ '--1=ILMFd»îçæååââãâäåààèèáàçéæççéèæèçÞßææãåæåççæãèèéí俤–£ÖñëíèééäæêçÞÚÞáßäêèèíåæîëçåäêëééìëæêëëëëìììææçèèéêêáâãâááãåßßßÞààÛÔÓÔ‡I=E>;8448<>?::::::::;<<<<===;=>??@?=DDCA?@BDBDCBABA??@@?<;;<7679732342//./12-0343211.224757CKLNQRSRQPQWG" %6[sqnqoklsusvrpolostmqsssrsun`X\_bb`dlpmnqtuwwk[YgolkiilgWUfmfhic^]`[[\YX]^V~½Êº¾½¶ºÃÀ¼¾Á¹¸Å¢racPQx•£®™ƒœ¯¤ª£jJTYRQUPEBB61@RG& 7S_]\[Z[XXY\^\WRUTTWWURPQSVWVSTVXVSRRVVQUVXYWTRRWUSX\WRQUVSLHLU\[_a^[ZXUQPSX[ZZ]ZVXXPLORPQSVN6  "#&&'***+,,,,)+,-63.ASVQKOVY[XYYUNOUW]aa``^[^_^^]`^Y`^PTo~’¦–ˆ¥·¬›¢­­¢¨²°¤¥®²ª¢©³°§¨´± ¡±°Ÿ °µ¨ ¬·«¡·¯£¥¶º­¡¬¶¦œ¹±vUfd^adbb\^^``_a]SOMHIRZ^`ZY\[OZƒ„hbjbbikgehjheeghhghfcfjjglhfkhSl¨Çº¶³²·À´¹½ÁÄÁ¾ÁÄÅÆÇÅÀº¸€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#(*,3@IM>BŠáîÞåëâäçäßâåáßãäàßãåäæèêçæêéÞÝäæãæçæçæçãæèìîß¼«¦Ÿ¬ÕîìíéêêçèêèåáàÞÙØÙÖÐÖÒÉÌÉÆ×èм»ÃÃÁÁÀ¿¿¾½¼¼¼¸¸¸¶¶µµ´¸¶µ³±¯¬ª°°®«­±¯©¦¬§~J573;855:=?@::::::::::;;<<=====??===FFD@@ACBBA@>@A@>?AC@<888977996441/.01/02021.-156.455768@MNPRTTTTPPYQ,$-Pprmrqjksvqtqssrqrqpquvtrsslb\]^adaegjkotuprrgXZhoijieim`SXjffib[]][[\YW\]U€¿Ï¾Â½ÀÀ¿½¿Âº·Â¢racPQx•©—‚ž±¨¯¤jKTZRQUPE@:11BRI'!$$7J\^\[\Z[YXY[[XUWVVVUTVYVVUTUVWVYWSUYYUSVWXVUUUUTSUWWXYXQSSNGGPZ[_ca`_]ZVVY]^\[[^XWXRKMRPPRTH/ !##%%&%+))),-.-*++-82%+IYUKRXX[XYYTOOUWacb`b`^`^\^]`_[a^PVtƒ’¤”¦µª¤¯¯¦©±­ŸŸ¯ºª¢ª³®¦§³¸£¤³°¢¤°¶¨ž©·©›£¹±¥¥²´¨ ¬·ª¡¸«rUed^acab\_Z^a_a^SLKILUWWXWU[\QX~b_jdbdffcdddefecgeedeghegkgflgRl±É·¶¾Ã¾¶¶»½ÁÇÇÂÀÊÌÈÃÀ¹¶»€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!((*:IKG.X´ëáÛæéßâæåàáææèåãäååãããäæåâçåÜÜäæåççääèéäåçííÙ¾°«ª­»ÆÇÀ¾½»¹··¶±¯®¬©¨§¦›¢§¡¡žÁÙ±“•š–›™š›žŸ¢£¤¡¡¢£¤¥¦¦²±±µ¹¹µ±ºººº»½¿Á½ÇÀI19=A=989;:9::9:9:9:9::;;<<=?<=??<;=<>>@ACBADDB@@CBA?@??<9535653464/,/241..0/0//14546645756=LNPRRSTUQOXV4$%Howltsjisvqtutpmpstsrtwrrtslb^bdfgegehmmopnlmh`^dggiieflhZQ`gddaZ\Z[[[XV[\T~¹Ê¿À¾ºÁý½¿¸¶À¢racPQx•™¦•ƒŸ´ª²¤kKUZSQURF7.*1@LG'"""*4AYaYZ\[^[YY[\ZXVWWYWVW[XWUUWYYX\WRRVVUVXUTUTSV[RRWXVXZUQPQPKGKQX\^``a]YZ[]`a`___ZXWRKLPNMPO@) % %'%%(*('),.-,.+,01-$ 7V\KMWXXXYYUPSXZa^^_]_a_^[]^__\a]NSs ’¦´«¡§¯®«¥«°§¡ª´«¢ª²¬¦ªµ³  ±²¥¤¯´ªžª¹­ž¨²±¨¦²¶©ª¾¬¸©mXdd_ab`a]]XX\^b\NKJINVZY[ZVY]QYƒ`_kggifcbcddfhhghihfcehkhkgglgQm«Ã¶¸»½º´½¿¾ÀÆÇÆÉÐ×ÓÎÍļÀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€*((>BCC@?@AA=;989864121/020-/230.-///./245448547846>JLOONORUSNUV9#$Cn{mstkjptrsutolmrurnqsqptto`]eifebahnmihlmdgf_\`efgggefkdSTfa]`[ZYYZ[WV[[T{¶É½¾¼»ÀÀÁ¾¾À¹µ½¢racPQx•ª™…¡³¨®¤kLUZSRVTG4''.;FF&  " /07VbYX\\[ZZ[^]YVWVVUTSTVUVWXXWY\WUROPUWTSVWSSVWVQQTVUZZSSPPOLHILUWY\cfc]bbba````[\ZXTNJJJLPN;$#$&$%(('')-.,*/,,00*$!BWPJSYUXXXTPRWX`]__^_a^^Z^^__]a^MRo~ “¥³«¤©®­ª¥¬³¨Ÿ§³¨¡­³ª¥­¹³¤¡°³¢š¤¯ª¢«»®Ÿ¦µ±¦§¶¸§—ª»£’µ¯rWcd_aa_a]__]\cg^QKJILUYZ[ZUY\RY€‚`akcdihefiieacgkhggffegiijfhmfQn°Åº¼·µ¼ÀÁÂÂÅÈÅÇÑÔÎÍÍȾ»½€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€+**:@3*V¯èíêãßåçâäæâàáâäâäéçãäéâßáåããâÞåéäÝÞáãèéêæèèèçÕ·­¤¢¢·ÒÐÌÐÑÓØØ×ÚØÛÛÝááßâßÝÞßßÛÙåçÔÆÅÀµ°µ´³±°­¬ªª¤¤¢¡Ÿžœœ“›¡ Ÿ§»ÌæçççåããäÜæå©[VgR;978:;97776767776779:;<<<>=<;=<;@??AA@@B?AA><===<<;:8743310220/1231.-00.0/144348425:948BHKMMKLPUTNSW@"#>fzossnkmrtqrrsqlmsuqprqpruqa[ce`\[Zhonnkc]_fd\^ikdfehe`hiZOaa\^\YXXXYWU[\T}¾ÒÁ¿ÄÃù¾¾¿Ã»¶»¢racPQx•«™‡£¶ª°¥lLVZSRVXO>315>KE%#" 3-/PbZZZ][YWX[[YVWTRSRRTVSSUWXXXYWUTTSTTRQXXRQVUPMQUTSWZYVTQNJHILRTV[cjifhhfb_`_]\]YSQNJJILSM6! !"$%%&''*,,*),.*04*!+FRPU]ZZYXTORVV`cbbca^_`Z^_]_]`_ORn}£–¦¯§¡§®±¦©²° ›ª·¬£°°°¯¯±¥¡®³¤Ÿ­°¬¥­¸¬Ÿ¥°¨ž¤´³¦žª·£’«¨sSbd`aa]`][`^[_bZPHJJMTYVTVTX\RY}|]aj`agfeggeb`bdeihfimlgdiieinePo²¾°¸¹¸¹¶¼ÀÄÉÈÁÂÍ×À¾Å¸±¹¼€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€*-1;5.7ƒÒæáéßÛáääèçàÞáãâÞáçæßàçáàãäãåäÝâçãÝßâäèåæåêéææÚÁ«š–—·çêæêèæéåàâåêèçêçâääèèçææáί’~|xjgpdefghijjgggffeedchlidiwƒµÒèèãæéèçæë´fi~Z<:878741555555555678::<<=<<<<;;<@@?=<;=?@BB?>>=;<<=;830.1//10-.11111100/.0477544436975;CHKNMJKPVTPU[I$$8[sqqrqmjovtrpqsnmrvtrstqptpb[]\YYYZfjkm_NLcgbY^knefcdeace`SYca\[XXVWXVU[\U}¿ÔÁ¾ÄĽÀ¼º½¹·¿¢racPQx•œª›‰¦¹­³¥lLV[SSV[SHCDBDNA#!5-)I^^]X[^ZVVXZZXSSTVVUUVSSSTWYXVYTPQUUUXUTTUSPPRNTWXXVUVYXTNJIKKMRVX]cggdffcbcb^`]TONKJOIMRG0"%()&'()*))))--42" "/CMX^Z[ZYTQRWW^aa__]\_aZ_`]^]^^PTn}‘¦—¤¯¦¢¥¬¯¦¦­®¤£¬²¥«²©¦¬²®¤¤¯¬ž °²ª¦¯µ¨ ©²ª¡¤°­¡«¹©˜¬¤pTac`a`]`]]_`^^`[QILKIS\]Z\Y[ZQZ|_aichkfdedbcehgdghgfheehjieineOo°Â¹À¼½¾·¾ÆÎÒÐÈÆÍÑįɾ¹ÁÄ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€'/9?23N§ëå×äàáäããäãáäæáãããâãäâÞÞáãâàæåÛÛãäâäåäåáâãìêåçàÒ¬‘ЧÞéàæååëéäèáçååêèãæãæâãäãÆŠ^XSROLLOSTVY[^_adca_\ZXW[[[[[[ZYhªäìâäçââàðÄom|N976787414444444455689:;<:==::=>;><899752/-,.11.-.//00231.0423335774:65546?99=@=9<=;::97522441/1..120,-10/11./3368743664356558?FLKJJKMPRWROYY3!'OsrjnsnjoruttspoooottstomtobYXWZ^_^cdYH>CMZidV\eed\_a_\\`eWL\naUXXSX[TOUYQ¿Ò¿Á»ÂººÂ¼³¶ sf_KQt–¡¬˜‡¨¶¤¯©nOVVTXXQKHKJECG?#+8) 9Z]X\^\ZYY[]\[ZVUUVTRSQSUTSUWYWVSQRQPQTVTOPUTNQPPRW\^]RRTSNKIFFMMLSVUV\`^\aa[YVPOSQIFJJLG4"! !##%%'*)()**(*-))24&"  =X^XYXURRVZa`^_a][`]`^\]\\a[JQn–¥– ®ª¢¦¯²¬¥§­¨ ¦²¨ ¥­ª©¯²ª¡¤²± Ÿ®««¬®³¯¤¥´¬œ£²³¡š­·¤”®©sTbaaabb`^\^b_\c`OJNHFS[XXXVYZT[yrW\heghhdchfdjjeegeggfgigklggkfTn©½±¯µ·±µ­³¹¸½Áº¼Óâκ»¸¹Ã€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€0920)P«äâßàãâßßáäáÞàâáááààââáßÝáäåâáåâÚ×âåäååäçàááäæâÝÝݲ–’ƒˆ¶ÜéâæíéäååææææææææäããèÚŸ^BLMMOPQRRPUYZ[]__^\aio{‡Œ‰„~ytoljZi¡ÜæÙÜèèäëÚ§‚hG67887531/////02354444567876788889;;;:;<=9;;8678722220/.032/,.11.440.12138765545688878=EKLKKLLMPTWUQXX8 &Jnslnrmjosssrqrvskqrqrtsruq_VZ^`dga_TEBJMHXfbVZcbaga]]\[[\TFN^\XXTUUUSRZ^Zs³ÎÀ½¾¹¿»½º¾Åº¯´«s][PYu‘›¨šˆ¢²¤ª¤lPX\[\WYQKIFBFOA$+6(-Q_[Z\_][[[\ZYUUVXVSSUVVUUWXYXVURPPPPRTSSUVVSQNQTVVXZ[WUWWRMNNILQTRRTVSTVXZ^]XRLLPNHFJKME2! ! $('&))*+)')-+.53#":V\UVVTQRVZ\_^]``_a]`^\]\\a\JOk~•¨šŠž¯©œŸ¬±«£§°¨§¹°¦¬·­£ªµ­¢¥´²¡ ®­©¯µ³ª¦¯³°£¦¯®ž™¤²¤˜­¢nWeb_^`aaa^`a][`]NKPNLTYXWXVYZR]xa^efjhecacffcdghgeffdfhglkdcfcTo¦¶¥£®­±°´¶¯±¹¼ÅÊνµ³¬³Æ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€55//9}ÔëÛßèààåÞáäâÞÞàãèáãäãßÝßâÛßããâäâÙÜäåãåãáâãßàâååÞÑÔµ—‹‡˜ËêâåëçãããååååååååæÝãëÆwGILMNOPQRSOTVSXbgdieerƒˆ‹’˜ƒ}uppf_‰ÒïÞÛíèáä὇X=677764202231002422333445;746889:6:<99;<9898645660010123210-,055266326668955764477678 $Cftmnqmjouysonqtqlnprrpoqupd]__ade^LAFLIHKS``X\a^[[XWWYYVRIDIQQORUUTSRU\^Yn°ÖÌÂÃÁÀ¿¿º¼Àµ±¿ŸrkjTPmž¥™Œ¤®¢¬¤nPVYXYVXOIIIFIOC$+4+(Kb_Z]^][[\][ZWUUTSRUYVSPQTUTQTTPMNOPSVXXURRTUQSVVUTWZ[WX\XRQRKGLSOOSSRQUVSVWONIILKFFIKLC.  #" &*)&*+-,)'*.-380 # !7SZVVVSPPTX[`_[_a`_]`^\]\\a_NSn“¡’Šœ«¦œ¡«­¡¤­¯¤Ÿ§±¡›©¸¯¡¥®«ž¡°®Ÿ©¬¤§±¶ª¡ª´¬ ©·´¢ž¬·ªŸ± mZaaabcc`]\_^Y[a]SJLLLQWWUXQVYNW{u[akcbacdfbdfdegehfhhghihjjdafbRmž¯Ÿ˜Ÿ«§¤¡¡¡ ¬¸·ºÅµ¯¨¢²Ç€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€*5213Z¯åæÜåêÝÝåáÚàããâàÞáãäáßàããßÝÝßßÞãäÝØâäáââàâãßáäãèáÏËÁ¢‰Œƒ±ÝååáâåææååååååååèÛåë´aDVMNNPQRSSVXRLRbe^_bcrЉŒ–‰„~wtunazÀïëàèéääéÔ•U:77654200.//0/12401233333755665555:;88<;7677654331/-0463110244101//25358796677568458=AEFFLJKRTRQSY[WY[F"$=_uompmjnutpoppqqpqpprprttnhc``c_SHEFJLIGIMY]Z]^YUXYXWZ\THAHLLHFKSPTUSRURJY«ÁÉÇÂÀ¼¿¼ÀÁ´±Â¥secMOr›¥¥‘Ч«œ±£oQVWQTWaRFGJJKNB$,2*$(A[^Y]ZYY[^`_]XUSUVUUVXSPRVVTRUTPMMOQVVVUTSUWXVUTUTUX\WRUZYUPMPGEKPTSOTTVTQQPJNJIJIEEHLL>*"! $('&()*)'&(+-69,! #6S[XXWSPORV^ca]^`^]]`^\]\\a\LRo€”¡‘ž«¦£¬«ž¥¯«¥¦Ÿ›§´­¨­³¬ž¡±¯Ÿž©­¨¡©¹¯¦³©ž¬¶®›ž°¸©¢ºªoVdb``aaa`^b_[]aZRMJHKQZ]XZTYZLYuXbkcdffefeehgfefccceegijgiefidQi•¥šš ¦›”––™ž¯º²®¹¹®£›¥ÁÑ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#84+?†×ìáãæãÞàãàâãâàáààâàßÞßâåâÝáÜÝÝÝââØÑáçàßáâåàßäæãçæ×ÂÁ®‡ÃåîàâçæêääääääääëàéÞ™Q@PNNOPQSST[\VMR`faells‰’ŽŽ’–•‰~xwvq_i§åêÚÛâããéÛ›T7875310//-,,-//000112333266433565878:;988666543332.-142/-12685/.0-.476686898679988:=AEGHHMJKQWVSQZ[XZ`M)$7YsomonikstusnjotttrqpoprqmfbaddWD>IMGEJLIIRVVXYVSZWUWZXMBCIKHJJJMMNRTPF@@HP^y¤É;¾ÂÀ¿À´³Ä¤sfcPSu™§ªŽ¥­š±¦pRY\TU[]PGIMLJK>#/0"#"0LYWYWWY[_`_]ZVUVWUUUYVTVXWWWXWTPQRUZ_VQUYVUVUSSSSSW\YTTY\[VMRNGGRVNGNSSQRRNNQMKJHEEFKJ9$ !!!%&&&((''()*),66(! 8U]WXWTQQTX_b`]__]^]`^\]\\a`MQk|’¢”‰ °¨š ¬®¥£¨¦™™¥«ž˜£¬¤œ£¬ª› °­žž©­©¤©¶ª›§³©©¶°žœ­±”²«uYdb``aaa`^ba^ab[RMIHKRZ]YWV\WL^†vX^hdifdfdbcefdefhgecddfggiggleRj–ž”—››’‘”˜™£«¤¤¡©¨¡›¥¼Â€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€6,)g¿ëçàæáÛáåßÜÛÛÚÝàßÜÞÞÛÜàáÞÞáÝØÛßßãàÔÕäçàßãâáÞàãåãææá¿´«˜Š“¥ÔîéæäãêääääääääéåìЃLGNNOPQRSTTXYUR\sƒ‰„‡w}†ŠŒš›Ž}uqov^\™ßèÔØÛßÞâÔ•O48741/...10./00/.001122235532488687789987764321252/0430/1145323203668<;779;;88;<:===>@CEHOMKMQVVTZ[X\bU1$1Rpnlonhhptuvtpprpruvurrrsmede^SJCFFFHJKJJIMPRSUVWUUY^VG?ACIKIJKKKLGJVR=5@IQPNQQMORPLIGEEFIG4  #" "')&'*))(*-,+.51$!;W^TUUSRSW\\_^]``_a]`^\]\\aaNRl}Ÿ‰ž­¤™ ªª¡¡¨¥™ž«­œ•¢°¡™¬¤–ž®¨š¨®£¤±µ¦š¤¶° ¦¶¸£˜¬±›­§s[aaabcc`]]_``ad]TJJJMRVWWTQWZP[{nU`ibfe`ahddfdegfdeefggfgjkfeieSlŽ”Šˆ‡‡ˆ‹Œ—Ÿ—•”œž šš¨®€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€(.O¥æêáàâÝÛááÜÜÞÝÛÜßÞÞáâÜÚÞàßßâߨÚÝÝáâØÕâäÞáäâàßàßàäââæÐ·§žŒˆ„ŽªÑêêããçääääääääâæîÆsKSTOOPQRTTUURUeœª­˜“Œ€uz‰‘’™–ˆ{spxc[ÜëØÛââáãÎO99730.---.../////00//0122.03676417764688564320/14211221366640021/5756:978;;;:;<===>><;<@DFLQQSVUQX][Zc]9"+Jmmlopgdmvsrrpprroqootvtsnda^PCBFGFEGKMKGKMRWXY[\[^a[L>KWXf‚¨¸½»¼±¤£‡ZPQKR\`}xlz„~‡ˆdMQWVWZ\TLG<0-10#41'% 2IUWUVX[^^[YVWZ]\XVWYUTVVRSVVWTPPPSXRVYWUUTSPMNQQNQWWOMPSVUQIIFA>=>@JOQPOONMPNKGEEFGFD/ " !! %&%%()('(**(25,! #=W\TUURPQUY[a`[^b`_]`^\]\\aYIPm€”¢’‰©¡˜¡©¥˜Ÿ¬¨™Ÿ­ª” ¬Œš°¢– ±©š ­²£¥±¶ªŸ¤­« ¤±³£ž«±¢·§mTeb_^`aaaa`a`_`\QKMKNVXWZXSW\V[vjYek`fid_defc``cddghikieehiedicQj…†Š‰Š‡…‰ˆŠ›¤™•ž˜–•–§´€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€%>‡ÒíßäßÞßáÞÙÚàááàááÛÖØÝáåäàÞàãâÛÝàÜàáØÐàæàÞÞàäáàÚÜäàÝæÞ¤£›‹’„ƒ®áêäæåääääääääÜäî¾eCQROOPQSTUUVR]‚¬À¹ª¢˜–wuˆ•Ž”—Ž~trqf[†ÕîÜÚãÞÝßÀG7973/-,,-/010.---0/.../12236752368534655642231//2430..13452012124768969===;:==<=@>ABA=!&Ejllopgbjutrompplrupknppum^SLGEGFIFEGHHJMKOX`b`__b`TCWZWWVRNMPT\ecZ\b`[]`^\]\\a^LPj|‘¢“†ž­£–©¨›ªª˜—§­™” «˜¦ž“Ÿ°¥—Ÿ­°§£¥«§¡©´«¦²¯ž°°›·§oZbaaabb`^a]^_\`^SKKEHUZX\XZYSPa~mUcmbb_`gdhdbghdeegeefdbccfdfjcNf™‘’–˜–‘”—–£Ÿ«®£›š›§±€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€)f¾ðìáæåÞÚÛÚ×ÙßáÞÜáåÞ×ÙÛâãàÞÞÞáßÚÛÝÜÛÚØÒâæÞÜÞÞßÜÚÛáâÞÜÞçÖº¡™›—Š~ƒ­Ýíæäçâßááàãçàãï¹`CNRPT[WYXPXUPÀÖÈ»À«¤™–wq„—Ž˜ŸŽ~xpxu`€ÓðÝÜßÞßäÉz;563/./110210...../////023666566663432321241/010/0.*-102773001145358:==>?@@?==>@BDEFDJOU[VSXS[eceeF#%:dqjfrlajtsswuppqrqtsmouukWFBDIHAHEDGIJMQMNYaacd_TLC><<@DKMRSH97?GHFTcS;9C=:BJFGRRU[VMME1/=A?@BEKKFFKKFEIB?AJTXYZRLHGC<9;-%&5-#$##5CMPPRVWY`[TUYYZ[WWVTSRRRROMNNKJNQSQQSTSSUVPLMLKOUTRQSVVSNFED>59EMNORURNOTSGHEEHAEK; !#" "$&''&'&%$),*+12) ## ! -DX^RUWPPRPT^b_Z]_^__``][\^_aOTn|އž«¢™œ£§ ¤¬¥—™§¬ž“¤²Ž›¦¡–¢³©—¬®¥¤­¯¤Ÿ§­­£¦¶°žœ¬±–¶§lV`ba_`ca\ba`^ae^ONLHJT[[ZZZZRH`|kXdhbficeiebadggfigeffeefjiikn^Th–Ÿ–“˜“”›žŸ›ž¦£ž¡¡¥¨¦ž˜œ¤€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ .Z–¾ÊÓàæäÞÛÝàÝ×ÝÞÚØÚÜÜÞÜÜÚÚÝÞÝàÞÛÚÛÜÝÜÚÕÝÞÜÝÞßâßãäáÜÛÝàáæÐ¨“š™Œ…„ˆªÏàåãâåçåáâæâãë°T==?BCCC=>?ACEEFHJKNUVVYX[a_`dM%!$7`oieoj_fpyvrspoqnlpusqtwgL=CEBELEDFIJKKMONS^ecVGA?@DEDCDKNOROB64<@COa\C47ADB@=@IMGHLLJ<&)7<;>ACIICAFKIC?<:=FORUVTSPKF@:7@80-+(')'&'%! !&+/1467/42&&1+!"" !&):GPQRTX\VPNPPPPOSOKKNQRQUNJKJKNNONPSUTSTWRPQOKKOTRSXYUOMH>:921?LQRSTQNMNLGF@@C>EK: !"! !"$%&&&&&'%'*).1.#"$ !0JZZVVSLNTQU\]]_`\]fa^YY\``^aNTqƒ•ŸŒ‹Ÿª¡™ž¥§ §£˜œ©¬¡š¢©™Œ˜ª¡‘˜©¡‘–¥­  ±³ š¦µ«›ž¯«›®®™™»ªjScbbccbaa^]^`abZMNMJLRUUUWY\XK`zjYdlfdfccehhdbeebbhkhccegeeehl^Ti—ž•‘”•œœ §¥ £ ©¨ žŸœ›€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#&/;Ka~”µÒèãÚÚÞÜÝÙ×ÖØÜßÜØÛÜÝÛÖÕÛÞÛÝßÝÚÚØØÜÝÝÞßßâÚàáÚÖÚßáÛâÛÁ¨›—”‚ˆ†ƒ‰œ»ØèâßâåäãäÞãïµ[F[eNT^\_\RXg¦âñèáÜÑÆ¹«ª¥Žvo—›œ’}oqo]yÇæ×ÕØÔÖÛ½q9373102321321//.///00-/45234566544652132/.0--031.,.//14335324547998::;>?=>@@@ACEED=?ACEFFFGIJLTXWW[Y^^]eU,"3[mkeni^cruttqlnottqopopsfMCIIABHDFGGHJJJJLMPTNC<<@E?ABBDD?987;BHKOS_gmidb_ZYQKJJGGJ69>5'(-(6@FEFJJFIRSIA>7-,(!'4-$!$:NPMRXXSPLMPPOQSPNNPRQPROPOLMQTPOQRRQPQRNLMMKMPPNQVUMIID97<85<;:;?EDCCDDCB?ADGHHGGGKLLQWYXZW]b`gZ/ .Uloink`aupospjmposqnpqptiREJHB@CFGFCDHKJFMKEA;;B@>>???AFGDJNLSYS?57FWd[C7<<:66F_zq]G<<>>?DFLRTROQRQLJB>CCCOL4!##"##%&(&%&&(**/GSL0!)K]VPUVOMPPW[ZSPUXVVXUUY[[[\]OUmzŸ‘ˆœª¤›Ÿ¤¢›ž¦£šžª­—’¢ª—Ÿ§šŽ›°§”›­«›©°¢™ ­¢›¥²¯ ™¦°¢Ÿ¶ŸfYcbbb`^^a^]_^]]ZRILKKRYYXTRWYN`~t[dle`dfhcdccfifaeddggeegddein`Wm—‘’•“˜œœž¢¦¦§«­«­°ª£žœ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!(*)*.1;Ha„¬ËÜààÙÖØÜÜÙ×ÚÞÝÙØ××ÙÝàÞØØÝàÞÎÑÚàÝÜÞÝáßßááÝÛÜÜÛÞâÝťޗ’‡‚„€†Ž¡¾ÔÛÚÞæäæë¬TBPQNT^\`^U[šèóàìçо¶»º¶º¶‘cp•£ ¤–{rgh\s¸ÜÕÒÔÌÏÒ°i;87544653122210.--/02430/021111122010/0/./--.00//0243352/152368;;89==;;:;@EDCCEEDCCDGHJJJJKNOLKS[_ZX^daf]5)Lhqjnka_msnknmnpnqpqsmmulM@@@CHPHFKLLWdXD;?OdcJ7:96=Os–•i?7?9(-7859;:;==946<91101578;@CLYafhhglfaa`]\]dabdirmXO]bYXekg`\TJB=>A8CLMJHD>@50/.,+(%#  "?PHGPPMONORMHJKLLKJKNPWVVRKJOQRRPMLLLMNMNNMIGFIKNNKIIKE?@EGHGDKT[YURPMJIB?@>GXK/ ##""#%()$%)*,+).G\eN-"'@[YOTWNMOPX^SHJPLJOQLJKLIIKRITm|¡‘‰š§‘˜¤¥—¦£—›©­•£ª”Œ›£Ÿ™¬¡•©¦œ§«Ÿ™ ®¥œ¢¯­Ÿ•ª±Ÿ˜´¢iUcdb_]_`_[]_\Z]ZQGJGENXYTWSXZQ`zmWdlffgbdfgfbadffbcfhfbchfffim^TiŽ’ŽŽ’”—”“•””—šš¢ž› ˜–¦€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"(+*'&'/08G[z§ÌáßßÛÕØØÑÏØÛÙ×רÛÝÜÓÒÙÖÓÜÕÍÓßÞÚÜÝØÙÞâÝÖ×ÝÛÙØÜáÙ¾£˜˜€}}~ƒ}|ƒ”§µÀÇÇÔä¬WERNOT[Y\]U^¢åòêíè×»¬¶¹µ¹¿ og¥§¨—|shj^r°ÕÐÌÉÀÄɤc;:765677415433222210154/-/-.01221000-.00.-,+,/2333332331/153589;;99:9:>??ABABDGIIHHIIJKMMNLORPLPZ^[\]a_daA %Aaojjja[dopnnnomnqpnomnvjO>@DFGHCEFFGIIINPMF?:DKHRMAGRWXc^WIDU^P@KTeƒ“‰xw\9.73#/6539;87/9DD8-.60+).368;<@DL[jleb]\_a`_a`_UVdbQI^kpg`cfcT]a[WYVOHGHJJIHJSga?.43%'$ ?98<>;=>?CCBCFFFHJLLLPNLLLORTQLMPMNTXV_[__bgR$"!6]rlknf]cjkormkknmmopnothPCGFACHFCCFHHKPOKKIA@C@BBCCA@EKPLONFLXXSZ`VEIX[cghmvwomeP85;0! +3218;87748CF;.''!%,1358BGHRdjefa_aa^]^[^TWjbLHO\b\TUWV```_\[]_VMHLPMFBWiiP8001&" ""!CaSJTTICDD??CCCFIIHHKONSXUNMPPLONKIKNPLPTWXWTRUPNPPORXTUTMJNL@D<8=CDDDDECHPoŽ„E#! #$$$$%%&&)(*)))-8=H\g^M6 4RWNTVMJMQ[VB-+0,)/2--6<:7667823653441130.10/2+*.0../++****++,/2676544011357889<;9::;>A>@DEACHHGILMLNQQQRRPNPTVRNPQNQ[Z^X^^^fY- ,Yrkhnh\`kpooonmlppmmprvkPDGBADBEDCDHJJJJLJECCCACA?>@DFFLJMVUFGZQT][E@U]lld^bbZTZQ?100+()45-.6947::++(%#!!!!GjYMOOJC;8:?A@GIIFFIJHLGPYSJJKHMOMNTXYQRTQMPSQQUUQSWWUWWSNLLJGFD@=<>CGKMO\e}—„F!%!!!%&$%))%#)&%&)49>;E]^QI3 >XZSQQNINTP;1**,+)*.,**.4;?G[mp|™ ‰‚—¦ž–¤¯¨ž¥«¨¡ž¤«¢˜¥­—ž«‘‡”¨Ÿ”§ª›§«¢ž£®§•›³¨“›¬¬œ¯›mXSTTUUTRRQNOPNNNJIAFNTTQUVSVXN`zjPafba]]d[X[__^^]_`aaaabceecbg[Qg‚’˜¡¦¡ŸœŸ¢¤¦¦¦¥£« ›¡Ž€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€%&"#'&$%)++.560-4:DZ€¬ÌרÔÎÑÙÙÓÐÐÐÑÓ×ÛÞàÞÛÙØÙÚÛàààáàáááßÛÚßÞÚÚÞßßÜÕÅ­’w~ˆ…z|y~rXMRVd`b][YS]¡çîäæÐ¼°¡œ”Žƒˆ”„e}¢ÀÀ¦…qrjjv|xxrppxtS9==<98677875542221042/00.-0/12-,,*-+)((+.16300220-/255458;9;::;<<@A@BFEBBEFGILMNPSSTSRQRRRROMOPLNW[]X_^]e[0 ,Snlhok\cmrppommnpnlnpppoZMGAAFFDEEFGIJLHKJD??AB?@A@?BFJKFFS]TGELLPWOENW_aZRRQMKKH:-***+-*,028:516:FLKKJHIKKJEGIMRNJMQSSQQTSPOPQONSYZY^^XUUSOVXWRMLKIEDCCBCEFJRRVWq{A%"""$%&&('&$*()()49>;@LLPS=$+JWQUSQMLPI6##%''%&(''&&'*-/7@JQb‚”Ž…š§ž“ž¦™¡§¤œ™ ¨Ÿš§ª”‹›§“Š—ª¡Ž’£¥–”£©ž—œ¬¥”›³«—«¬˜™¯šiUUTTSSSSSSNOPNNMHA>DJRWTWVSVWM`{j[hkc^VQT[ZXXZXY^ZWX\YUYcddegjZSp•£¡£°¸¸­¸¶³±³¸½ÀÅÓÝÈ›„š€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€&% !#"!('.LhpqrO48Jg‡±ÎáÛÔØÜØÙØ×ÖרÚÛÜÛÛÚÛÝßàÛÛÜÜÞÞßßßÛÙÙ×ÑÐÑÖÖÖÓÉ·¢”Œ†ƒ€}v„yfbgVQg~pkc[WSU“Ýôìä˸­¡“Ї€‹•g~¥Á¼tieeimkkmkiiqpQ79<;97777742474211/2/+,//.,)*+,./,%'+.23339730..131477558;:;::>??AA@AABDHKKKLNOOQSTTRPRSRMRQOQSOOV\\X_`]d_7 *Hhngnn]]ionnonmimlkoqpqpdVKDCFHDFHGGGKNILLD==BEADFB=;BIGIPW\^R?DGPZREKRQPHCFF?CCLdmkjigfecbfbei`LBBCA>?IUZYPEA@@?=C^XI=;:Pm~‹”£¤–‘›£š£ª§ž›£«ž©«•Œ›¨œŒ“¤›‰‘¥¨•“§®¡˜ª¢’™²¬šœ¬®—–°šeRWVSRQRSTROPPMLKG>>DHQYWVVSVVM`{jVbfb`XQTPVY\_[X\Y]ZQPXaeddgkmYUw¢«§ª°°µ¶µ´´¸¼¿¾¼ÎáÚª€˜£€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$#! !)/&H£Ú×ÑáÝ®a1.CWi—ÆÚ×ÓÓÔ×ÖÔÒÏÎÌÌÐÐÎÍËÊÉÉÃÃÁÀ¾½¼»À¾»º¶³±±³´±¬¥¡¡¢“‘™|y|oVT_QU~šmd[ZXQ}ÉïéÚǸª •z”qk–¾ÏÄ }tihdcejjghfdmnR75::98777775551/00*,,++-,++))**,,,*,/23432320,*+05666789::;<:;@A@ABCCCCEHJMNOPPPQSVVUUVVRNQRQSTPOT\[Y_`]bb@ %=dqejo`]hnmmmkjiopnnnnpngZOIDBEEFGHGIKNLOLD>@DH@CEC=:0*$ ,9;=979:99:>KK9%$+28?EC@?CGNZfYKFFGC>BHB5.26=IDXukJ5)/$" -Znf_XWOB7872;NRLILMKJJOMLLMPRPMNNQSUTRZZ]^^`ca]_^VNNRTQUWSNKHFFEEFGHHHOROU]xŒo2$ ###$"#((&%('++-).@G=9;EEDP\H.$!*JZVSQRQE4)&#$!!$$!$$$$$%%%))+/2=O^t‘¥šŒ™§¤•ž¤¢š˜ž§Ÿœ¨®›Ž›¬ˆŽ¤›ˆ§ª–•ª³¥› ©¢“™®«š™°²™—²œdRZWTQPQTVRPQQLJJHBAGJQXUUUTVULa}k[egdaVLMYZZXVVX]ZYVUUZ`eeefjl[Uu–›•—–Œ–™™šŸ¥¨¨¥ÄÒ¹ˆ˜œŒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!!"""$*.<áÛÆÎÑÌ©oD76H\…±Çú¸¹¸¸¶µ²±°²±°®­ª¨§ŸŸ  ¡¢¢¢Ÿ ¡ ¡¢£¢ª««§£¡£¥“‘¦¿¹œ„xkbSOSSmš¥‰rh_\\SgªÕÒŽ·©™—›‹}‰‡iw²ÖÓÃyrokhggfhkhfckoV:4888887767542011--++,+))*,.0-+)+/001010003/,+.1228889::;:==<'+1/2<>D^ovxywspqstovvZ;7A?=@GOVajaQKMOMKRWPD@A=EUpŠŒŒœ§Ÿ“™Ÿ˜—œ¢š•Ÿª–ª”‚«§¢¥”“¦­¡™ž«¤™›«¨™–±³œš³œhT\YVSRSUVUPOPNMKEDAFKRVSTUTVTKa~kXbedcYPSMOW[WY^\]YVVWYahggfej]Tl…xtyzzuy‡‹‹‹“¥ ‘€ŠŸ‘h€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!#%%$&).##Y¢· «œ ©š|Z<>EUq’ª©ž£¤¦¨¨¨§¦¢££¤¢¡ž›œŸ ¡¢£    žŸ™˜–’Œ‡ox– yjic]WTd‰¨Ÿype\]XX‰·Ãº¸´¨›‘˜–Šƒui‡¾Úη”toekmhdglptpjpt[<3678888666311252+0+*-+*,.+,+,//./,.0210-+210013559;=<:9;=<>=>AA?ACDDEGJNROQRRRSTTXWUVSQRUNQQPQOMPY[Z[]]_eS'/Yrfdjd[gnoppnmkonmoqpqocXPHBBEGECEILKKMMHC@BDCFB@B@>AGOUIDV]W[cNG[[F=>53..3204-33387/*,)$!#5779<;78;85MLKKKJJLKRSWZPPebba`][^b^[[]\\]\^^b^SPTTTUUSRSPKPLGFHKLMMKL`ly{V$!#!"!###$'''&''*(%(@[\C>76BD@LM;6-,HUINXS@."!+.-(#"##! !#%!((&')-5?BYyˆ‘’‘”–—–—šœ“•ž—‰œŽ‚¤ ‘Ÿ“’ž£œ™ž¦£›œ¤¢—”©ª™›­šlW][YVUUVVXOKNQSNC?=CIPVSUTTVSJblV`ddcYSYTQY\V[b\V]YMKYcdfgdch]Rh~tu{}†ŒŒ—¢£›¡©ž‹}‡™’rV€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#'*'$'&&# @ˆ®Ÿœ§¦œ¡ª‘fAEEKf‹›˜•–˜šš™—–˜˜—•‘Œˆ…ƒ‚€~{ywvtwuomnmhkgb`_]ZWUMR\ZWY\`[[VVo‘Ÿœ“{qj]^\Skš¸¸²®§¡‹‹‘Ž}mv•¶ÔÕ¹tkdmogcgkirngms]=156789765:40/011,-*,/.-/.,,*+22-,0010/-,++.00/16;:=?>;:;>:=>?AA@BEDHLMKLORTUSSTUTUUUTSQQRQTRPQPORW[[X[^_dZ+ +Qnlfga\hononkioqnkmnmnof_UGCFEEDEEGIKKKLKEAACCB>>AB@DLRaR?GRT][ECZX=9C>ADIKC;DIINWaf]OMQSV`t‰•›’|pv~yŠ•l7''"  >eja`UJ==@IG40BTVWTQQSTV]]_^LGZebbb`\\_\XZ^^]\ZXW]\RPTRSVVSRSSQQMIIKLKIPMM_o~yH "# !""$&%&((&%*($*Hd]H?<47BBFNB1+KTNQUF-"!"# &1:<72/+*)'%"! '%()'*,2APbz…‡……‡ŒŽŽŒ‘‘‰†‰…‚‡‰‰ŽŽ”Ž“”’”š•—”“–”Ž™˜‘–¤”oY^]\ZYWVVWOLORSOF<=CGOXVUTUVRIb€lU_ccaWT][Y]^Y]a[Y\\XWZafeedei[RmЉ‚ŠŽ‰–¨¨ª«ª¨©¬¯‡{|‘™|`\€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ %*-($&$$#-a‹„‹…ˆˆzqePCM]jyˆpqqqnjfcbccc`\XVUUVWXZ[[RVUONQPKJKLKJKOTJNXZTRUROOTSXv”› –vlk___UW€¨­§¦¨Ÿ‹ˆˆ‚rm‹ ¥Áί†rkkedklfejsogls]=====<<7<>?AAADECFLNLNTNQRQQSTSQUWWVUROORPMNMMPU[[VY^^d^."*Jkpid^\hppqqnmkonjjlnqmjh\HEICCDFFFGJLINOIBADFC??BA>BKSXTJDBHSP;B_\KPVY``XLEQfsiVLQSLFJDD@775*&&$ !,563:JG/$/84055:IOFFECA?>=;26:;A@BJPV]cVLMQQR\q…šš‰pjwzp{k3'&" AgkbTEFA>=FJ:3APVZWUX]`Z^cf_NJVb__ceb``a[[__^^^[Y^^USWUPUVROPSTTNGDFIJJNHBTlw;$$ !!%&$%)(%$+)$+Nh[K>C;2=EHJF-+MRRTM7 %/316BLLIG>>=:5/)%%'$$%+-.4:D_y‚…~‚‰‹†—”‹‹Œ…|v~ƒ}yƒ…x†……„ƒ…Š…ŠŠˆ‰ˆ†‡‹Š‰’œqZ^^^][YWUSPQRPPPL=AGGNZXSTUVRIc€lXbec^SP[XY[[[_`[^XX^^Z]fcbeikXSt‘’ŠŽ––›¤ž›¡ª©œwžy[^a€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"$%)*''"$$ &?ZgVVVWWXYYX[SEG[jmpdRSb`UTQRSTTSRQFHLOPOLKOOOOONMLKJJLLKLMNTVPLMONVLOSUlŽ£—~rtfTW]Tcƒ•™Ÿ¥–‡{~yivš¨»¹˜{qmlhhllhhlnqjks_?26554332253223111.-,,-.--//00.,,//.-,---,3213;CEB@@>=<<<<9?A??@ACFFHLNNQUTSQOQUWWSVXWVUTRRQPOONNNPYZW[^^^b>"Eklgmb_hrojlllqmjkkijlllbUMGDHDIIDFMOLOIKLD@DFE@AFD?DPX]\ZSBATS<O[NHJLMKF<5JL30:;;;BINU[[QEGNONWlwŽš“…xsvxksc5%/" Fc^ODBFDACGC:=JZ\]YUX]^X\cbVKNX_cb`a`\Z][Z[^_]ZZ\`]USVUTRTVTUWUPJDEGHKNKMRUe|g3"" %&"'&'&'&'&&')'5XfTHRSA.-8>FE2/LNKN;&"*/:KQOKDAENVVUTSQLFA5,%%&$"#))-16BZomd_gomimwyww|~|{}xv‰‰€|‡ŽŒ‹ŽŽŠ‚‹‡€ƒ„‡†ˆv^aed`\[ZWTSWUMORL@@AISTSVTVWNIdyfYacb_UQYXZYWX[`c\[`_XZbegfbblaUkЉޑ–’”“š‹z}|‘ˆ]RbW€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!#$)+'&#"! #1FTLLKLMOPQNW]WKELVcvoYW_ZORSSSQOMKGHKMNNMLRQONLLLMJKMPQPPPNRSOMOPNPJLOQb‚š¡œ‡uqgYU\RWj{‡ŽŽ„}xtpwŠ›ž¯¼®ulimjjmmjjmmpklsaB3444433331563/111/0110/..,,.0/-,-1/../00//5<@DEB=;<>?@?>=;??@AABFGHKOOOOQQSTTTUWWVUSRTWVSPQSTSPMKNY]XY\]`dD"=dlimc\erpkmlkljilmnnpnpk^QIFGFGHHHJLNLJLJA>CEFDDEDAGOXagibOENO?AS^^adeeinrz}ptu|ˆY:DGFEECCGB=950*''+*3?=0.7@?<@DABK@07<:98=DIS[^LBEJKLSdqx„‚rccgew„f7"&'!$$(ANJHGDBLIHHB=CPY[ZY[^\Y[^a_WPQU]ca]]]]^_^\ZYYXY[Z\[TQRQTRTUSTVTTNIIIIJLKOQTfv[+"" !%&#&'&'&'&'&(&&=_gXIU[M5-03@HQRPSTUVOIcygT^cc`TNU^XW[\[\^\[Z\]\`ifecdk]SkІ‚ƒ„~‚~{ysr}‰‘›sW]VU€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!!#*,'$# "%->QJJKLPSWXW[_^VH=9@_tpeZTTXXXVTPMKKJHGIMRUPPOOQSVXJLOPQRRPMOOLORRMOONPRZw™›xmjd[]YY\fw~tmns}“Ÿ—ž³µœ€oihgeeggeegimikrcE42233444424530.143320.--..,*,--.0../////05>EGECA?>??@?><;===?BBCHHKNOPPQPQSTSSUVWRW[ZXVTRUTSQPOOONX\XX[^`gM!" 4\kileXaqrlmljljkmnmmloroaOGFEJFEIKIJMHJKE<<@AACGHFDEGKWafcRCCJFKXaddcbdhqywrszƒ‰œ‹ZABEFHGCDMJGEDA>=>FBAC@:>HFFEEHC?ATJGHHIKICMXD.3:;;;AFINSSJCEFHLTarŒ‘ŠtcbxqwvX4%'&%3;9@CKTVSTTSUQJbyiZbdb_VR[`YU[a`^_]YW[_ZZcgddgiYQm‰voqvvsnplht‡†uŠ˜{[\WYo€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ "*-'"# !'.AVPPNOPSVXXWTU\`UD4=UszhXW]]]\YVSQGFDDEIMOQQQQQQQQLNMKLOPONNLLPUSNMRPQTSj“—›”}kmoh^ad``o~~towˆ•œ“¢¯¦ŠwlfiffegffefdgegnbG51113344552011015//./010/.++-//..-./.,.48@FIEBABBCA?=<<=>>><>BDFJJMONNRTTQRRQSUUSWWUTSUTSTSRQOOMMPVYWY^_]iV( !.VkiieV^orlmmkmllnnljhrxxiTKJHMFDJMKIKNQOF@BDABBCDEEIMDKPRTPKLOPT[_`_]eeiu{pm{ˆŒŽŠƒd8)1455634:A>=?@ADHGGILJGHLGMOMLKOYRFAEGHF@-9[bKDB<@AGMORUSNKLKNX`jpˆ–€na_c[[YF0&##93/,,4ANSU_ipmaUJC4*"#').33K^U>9?CB?CGEDHJHJJJIJLMRRRPPQSTPSTRNNPQLNPPLLPRKNPQUXWSRKKNLOL@;>AIRTQQTPURJazjV`cb`UOW[YWZ]WWb`ZZ^][]bb_cij[Wt—„|~„xv}yxyszšŒe]ZLd…€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ !*,'""!!&+:NMKJIKOSVTUSQV]]YH?AUmwlYRSSSROMKCDFHHGFEFHLNPONMRSOHHNRPOONLQVUOIQOOSM]ƒ˜›–ƒokqrccecbo…‰’™š’‘š¨¦“}rg`dccdbccdc^`^`f`I600123344110.1440210000.-/,*,.-,-0/..07@GEHHEBB@>@?=<<>@BABA@FIKMLOQOPRUTOQSTUVTQSUWWYYXTTRPMLLMNOUYWX^`]h]1+QkhfeU[lqjlmkklnoqpnlv}{hSLMMIHIJKJKKOROJNWXTRNLLLKNTUYXWZZXX`^]]^]_ce`_gh_nŒƒeG813.1/,./--,+-00.-.-/3565567<<;@BDIC::@B=5+.+@JCCEB87;?AEJIJIIDDKMQgol`YTPPGDIJ<-$.FN@./FPJKOLGPLIB:?JOT\YV_^YZ`\[]\WVX]aa^`_ZYZYXXYZZZ\ZZ[XQPUWUWXUVXUPMMNLHGIJPO[p_5!!"#$$%&'&'&'&'&)%*6JbiZHO``M>3#!1&>L52OPLJLJLSZLBBB;7973-((,49;H\jlfdf[J6)"#)1->QPD<5915;6488:;<CDCACGHGKNRQNLPURPNPUUQNYUT]mvl]RDBIMPMC;?AGQTQQSOUSIa{kV`cb`UOWYX\[NEJTZ[\ZYZ`efbfjhZVoŒ†{tx~|tkqkflp|“ŒbgcP_{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ !)+&#!!%,,4HRPMLLPTW[ROSSMOWQPPOP]kkbbcca_]\OLIFEFGIFHKORTUVSWTKKTWTQSRPQVUQLSRTXRYt•›˜Šxmnuriffjx†‹‡”–’“’–¤¨—tl`Z\]__]]__][[YY_^M911122223.//1231////.--.00,**++,/..05BB@DHJKNQSSRRQPQTVUUVVURUWVTTUUTQMJIKNQLT[YV[`_d`;(HhjecTXkqjklkegijlnliu€zeTLJKDJMLIILMLNJIT`b_d`^`_]^bhhgeeedcca_``]]ce\WZWWq–‡hRD=A@;9768:93//30..,**+'--,/1./1/7A@:1)05;73536--1669<:67<:BEKRNIKMFD@;BLMRZYW[\Y[^Z[_^WUX\_[WYZWVSVYYWVWX[\[[YSRVYWXYVWXVNLLLJGGJILO`mT-"!!$%$%'&'&'&'&'&%.33EVSJRcbNF>,#+%!184DQNNJABLRQG@@@>;;4542-)'&%(3FT^hrrhZJ8("$("*=>;:<>=;;:9;>><>B?CDCGIJLQZ_XOJ>>GKOLC=ACGPUTSQNVSGa}lZbdb_VR[ZY^TBGL?>OTQVYY`eaefdZVhqi_Y]cdagaWZt‘{d[[TVw‘€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!"')%$ *2,3LTQNKKNSV^ROX]Y[blpymJ>YvŒŒŒŠˆ…‚€ƒ|rf\VRQ`\UNJHIIJRTOQZ[TSWXSRTUSRVVY^ZZf†•˜„uovzrnor~‰‰ƒ‡‰‹—›˜ƒrkc\ZZ^aa^^aa^[ZVTZ^R>222211110..11/.0,-/.-,++---//-.105>@A?CBA?>===CGHHKKMQPQSTSPPPSUVTSUWWXXWUVVSOMNPQQONLLS[YU[a_`aD!"=engaRVkrjjkhjlllmonku…j]QGHDHLKKLMMOPIFOVVUZXUUW[_bc`]\]`dh^aaad`\^b\]`\]kz[JC>;=?GCFEDEEDFFDDEEBABDBCGE=873;<:<>==627@A>:41?KA8747018>?@A=;:>FQQQXZWUVZ][Y[__ZVUZ^\XYYXYY[[YVUWZUWUTVTQSYWXYVVXUKIIIHEGLIIObgH&# !%&$%('&'&'&'&#+5/"%6@@Nc_KJI6)*1'0CLLLKEAKSPOKD>=><8@;64651-+(&*4CQZfglpeK1"'(*$6s¤§ˆƒ‘™†€Ž—ƒz|‡ƒtsufbliXPV^RKLNHA=CE@;=:694;?>>BDE9;ELMPM@<@?BKRRRONWRFbkT^cc`TNUZ][H>SYTXVSVXW]^__\htqpuz{{|‰‰–«¯˜qR\hNOo‚Œ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ "#'(%%$ )1'/Mbbdiq|‡’‘“˜ž¢¢Ÿ„T?Skffeb_ZVTX^hqvvtrkaRC:78:>KRPT\[QTZ[VRSTTQSTY^\XZvŽ–’Žszuuwut|ƒ€zz‡“‘‘ކrhe][^]Z^^ZZ^^Z]ZURX_UB3322100/32.,,//.-,,-.0001//0/038;BIJGEHLHHE@>@A@CA><<>ACBEGJKIJPQPQSRPQUSTTTUWVTUWXVTSRPLNPRRQONNRXXV]b\\`I!#4bri`QUktljjehiihjmli~‹z]SKELHFFINQNKNOIELQRSQTSPPSRNRQTWURQQOSQORPLLKFHGCFHB=?@=HQHAJLLKIDCJFDEGHFFHHDEJG=67=A>=GNNMK>8;=><607LNB>7154685563:6635=?BEOPLMOOQXUXR9$ %.;826O]UKGLUK<799DOOQTWXX[ZVYY[^_]WQRZ]ZYWVWTUWXXYYZVXTSWVQPXVWXUUWTQOMLHEGLJFOca? $ !&'$$)&'&'&'&'&/3.'$(02F`\GJO>+;A'9NNJLFBFGJPTJBA?;;@85236886;91&#+6;NKThulTA% &',U‰œ‚—ž†~“£Ž‚‹£ ‹«¢Œ‹¡¡‰ŸŒ€…ŽŠ}tŠokqgN>GD=77;946?JKHPQE>BABLTUTNOXREckYacb_UQYW_YD9?JOL[a__cdf\Z]YYZUZ``gv…𤧲¯œ_TejTO`‚‘~t€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ %#""$)"/65AUp‡ «§š’”š¨´²¨›Œjb]UHAEJEBGK@558.4?LTUPKD>758=><>KVXVWWUPTVUW[YRRSTTSRQP]}’†y~ttvy{|†‰‡Œ‘‹Šˆslkb]d_QXX\Y_c\^RWWQSa[C63+,52*/-11--00-/.'050867424;@CHMLNNHHJIGFHF?>BABA;9?BACCDFILMNNPQQRSSSRSSTUVVWYVSSUURONNPQPPPOMLRXWVX[[bhO$!2Wmh`VReqliihflojhklj}{`EFGAAKNNJIKLKPNJGNX[XQVZZXVVXTUXXURPLRONLJKJFF=9999::AGMLJNPB87855873JbRDF;9;;:;?A@C=;<>EJJMZ[]XR\\UQXQ5%%!! )' 5[`PJLTUK>98>JNNMMSVSV[YWW[ZTTUPTZ]ZXXXUWXWVWXWUXWVWYXTQTTVWUTUTMIIKIEFKJFVdO-!" !$%$$'$$&(&##'&/.'&*+-9J_\NOH5<9EPZ[YZYWSWYZ]a_YWWXXWVTSWiƒŒ‹‡zustz‚„†‹ˆ†‚ztkg`S[g^ccgbafelcee``kjY=3,-3872/.-,+,.16BIW[X_^SJEKPOPUMKMMHGIHHFCABA?>?==>>BEFEHKNOPQRQONQUVQMRTUVWWVUVSOLNRROORTRPOLJOTWVUW[]]fV,!.QljaOSfngjmkdgjkkmprl\KCA?@FEIKJJNPPOOKGHNPNPQPOQVWUXYZZXXXXWXVSRSRPQMLLFEO[bjkr~uYGPRMILKIMPJGJLKJJJHFFB>=@?ACHLJGKI=578657:6G\SJOI=>>?DJKHAAEIEEKP[hqkb_]]Thw_0%% "!5Y\NJOTSG?>; ,LSKLNHDDDITKHFCA@>;>>?@;8;A@CO\]UB..,(-B]mohV8*)'Aqwnnsronlmlpvslnx€vt~€yw~‚}v|†x{Œ}œ†UGPONLFAACKNLIJMJD;@BEOTSQQQUNHfiW`cdaTNVVWSE88:59BA==>?><>A?@CDGGEHJLMMOQTUSPQTVVUY[YTSVVSQPPSSSSUSRPMLOPOMSWYXY[^Ycc@">dpcOQdnjhggjedhihjobMGIBBHEEHJKLNOPMOMHDDDCEFJKFBISNOPUXQFBFDIMOVZT]fg_WVapt|‰‰v^LAFFFILKHIDFJLKGC@B??CDB?>@BDIMJHKD:0---/20'1SYBIUULIPUUUVTUUUVVTPUVY[[YXY\WTUXWTRYWUUVVUTWVWXUTRNJIIJIFFIGNaZ2"%$##&'&')(''(%#$(22.*(# #-M^_LFSE5C>#2RNPMNJDCGJLPHCFF?>HLLMNMKMRRPPMHKNKJH@3')9J\hnfJ*3Zjikjgkqpqssrtwuqtz{wy‚|w€zsqqrpsszpTGRNMPOKKOOQQMLPMB>@?CMRRTQMQOId|hUde]ZVRTVSPI?>@?98666:=??==A@A?>?DHIFHKJDF^|„vtldx€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"%!"  #'6>;9:788BDBQ\PGY_[U?(!%(*$"(&$!$)))*(%')'&'-1004997?@CFGKNKHKH@8455799:>NUG>?AEGDB@>;=;>?>?BADLPW[[ef]d`B% &&"?[ZQX_]QABID;?ISXNIOVUUWVTVWUWWQTWY[[[ZYSVYXWVUUWUTSTTTSUSUWVUSOJIJJHFFHEP_P*##%#$''&')(&&'%#%*0.+*)$$,-4F_TGTL887$3QOMPOMHBBJPKNKE@95;A?ACDCFKLHKNLJKJNPOG:016>O\ikI.7SONOQWZVWXZ[\\\\_dfceikhkrvqnrtpmorxxiVNQOPRQLJKJLPMIMMD>?>CMQQTQOSNFa|lY_`a^QMXRNNKD@BA<==::;AEHEDEG9:axncYQIDBEGHOd€Šqvodv–‹\€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$%###!!%3:5..39?B@?EFFIIINLKJJMPSTNRVVTSUXTUTPOPPNORTUVWTPRQONOQOLNQUXWX\b`adL .Xn`HUikfggghiihhkmmXHADEBDHDFIMNMOQQNKIIIFDHJJHHJHCMW\[TGBMQ@BPRUUJ^”µ°©ª¬²¯«§¬³«‘zUIJNIJKDFJKGCDHKHECFGFGIPRRTVQLOOMJIIJIHMKBCC833-4::7777448=?EJIKRQ[[Vflo|mB###C_]U[a]PCBHD=AHPVPKPWVSUYUWWSVYSPU[]\[[ZUXZVSTVWTVWVTSTUUSUWVURMMLJHEDEGCT\C!#$'%%''%$&'%%&&%(-0*$&(#%06%-RUEMPA2)$9SOINRL>>PP>7MN>::4/1//3457:;56;9:?A@CEFC=3+-9BK[f\KNIJNNOPLNOPSROOSQRSTRQRUPRVVV]^W``_``YSTQOMKJJIGEFMPJKKD;=>FPQOQRQVOEboV^bc`SLUTOOSMFB??AA@=?DIIJHEL??rœƒ~xoe`[]gxˆ~cmxiy¤]Y€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"#!$$"" *---'-@LHFFGILMU_F&%& &#(,+(&!&&)(#$''(%%(/3310.1421>PPLKNNLMPSPQVXTQQPQSUWXXWQX]WTf{ƒ}{{{wutppqniihaYm€u^t­Ì¯‡ŠŒ™¢¦™š¡¤ £¦¢¢¢¡œ—’˜¢¡¤§§¦¦¥¤¢¦£–¦Œi\NKPMKMMJJFDFDAADBBBBCCBBFHHHHKONNNOOOQRTTUVXXVTRQONNOQRSUVUVWURMOPOPQQPPRUWWVZ__`eT)*Rk]NZjhadfhgjkjijll[IAFEBEIDEINOMNQRNKJKKKJKIIIFDHOU\]XPA?NSDBNUPJH`‡Ÿ¢§¨§­¤ª©©®¯·È£^FUNLVRUXYVVZ]]YXYZXUTVVWWXZTORQQQPQPNLKF;95*)+-4;<===;A?CGFGKKJSWUXboswfM7(!#Da`V[`[NCCIE>BHNTRLMSTRTVVYYVVVRSV[^]YXXXVTSTVWWTVXXVTTVVTUWWUQKHIJIHGFFGWS3$%'%%'&$$&%$$&&&*0/(#%% &8E3(8IHGLH4#ARNKMQB(/QR14KJ97;5.-**,.-.051354574232/39817,/7;IYY>:>EDCFIKKMONLLNONPRPLNSUQSSQSSJKOQSVQNSVSNOYaZMKDHLHHKF<<>FPQORQRVNFe€kRae_\VOQUPSWQGCBGD@<;?FKMOOFLD>f|smpz|wmlsvljv€~f¬œeO[€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ "# $-*(*#(@SHDP[XRVO+9D2)53,-0,*,-&'+)"#)*&,48854361145:Phkecghfgknjlruropmnqtvwxx|z{|}€{tngbchfabd`\[ZQ[pqgy£Ç½“ˆŒ™›—¡ ¢Ÿ›¡¤ž˜›£¡›¢©¡¢  ¤¤¡¢¥ ¨§Ž¡‹l[OJKJMOIJKFDGE@ADFCADDBEIGIJGILKLORRQPQRTUUUUTTSONOPQRSUTTTUSPQTMQSOLMPRPRWZXUW[\_gZ/(Oi\OWeifeeidgjjiikmXGADADJIFFJOOLLPQNKLMOPQPQQMHGKOLQPONDCQRHBNYNELg•¢Ÿ¤£¢§¤¤¦š˜¬¥wbiiehicddbdeb\[XVSNJLPOQQTVQMOKKIGEEDB8=86433.39>ACDA=@?DF@BTeSNTRYd_aZ[N7%$ "DaaVZ]YLCCJF?AGNUTLHNRRVVYYVUTTUWUW\^ZY[XVVXXUSRSTUVUTSRSQSVWWSMLLKHEEEFMXJ'&$$"#&'%&($##%&',2*'&)'"0IMH.!L\ih\V]\RNRRLBIC>CB@GA63985796789;;;:==@DC@CJJEINMQSLJOOQVSR[\YWc{‡sWKBFOLJIB>=?;76637?@>?==A:8CECIJIMV`b[S@?DJMOJ@9=@FPSPPPPQKHdxcU```]QNTVOQH?bZQ`jieccghhhkigkhWJGFEHGFKHHMRSOLMNKIMONMOQQRUWZ`^`bcgnrrty~ƒ†‡‡†z{xpnpnijje]WWTQRQPONMLLKJIJLNMLMKKKIFGJMEDNSOKMJKLMMKJH=93/-,*)').6989<@DJOPNLLPQX_]\hzƒlE% "I`[TZ]VHCCHH?=ELQRSOKRWTUVXWUVVTUTX[ZY[[YZZYWVVVTTSSTSRPRPPTSNJJKMJFDEEFNK3! &$&$#%&&'(($$&'.2-"#("!>YWDR`D#8PGJ:!%FOIVM18@5FWC/88422.-1//641Fbs†€y†’‡z‹™}‹œ•ƒ‹š—‹Š””…†’–~~ˆ}ry…zjemk\W`cXOPRLEEE>=>;89:<86:@B?;69AHKMI@8;>EPTRSRRSMJfzdXbaa]OLQRUVD7FQOPPQQQRUWU[[[VLPdmdYV]ebZ[aZ`pij‰ÂÏŽQ__Na€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ #"!""!)2+%-#4rŠ]t¡ŒH"2TF3/563521/-,,,,*)'$%)06987544442230J¶©›ž¡£¦©¨¥£¦«°±­¥žŸž ¢¡ž ¥­¨£¡£¢ œœœšœœ¢œŽ‰ƒ~ƒv‚¨Õíà±¼½¥‹’’‰–Ÿ£¤¢¡£¢ž•˜œœ›œž¡žŸ¢¡¡¡Ÿ¡ª¥–™ž‘bHFHGIGFHIDADECB@ADGIIHGJJLPPNOQSUUVVVURONMKMPSSRRUUQRUUVTVXTSTQPQRQOMNPNPTWVSY``X^bG8[ZTdmidcdfeffihgjfTHGFFGDCEDDHPUSNKNMLPTUVUWVVWUUY^`abdghfeeffa\Z\]YVWYXXY\]\XX[\YWVVUTTSSTUXZ[WRNTQNLHEGKQCBS^WOOPOMID?;820....--.-3@EB@B>EHGHLMISRW^`^epjO6(! $G_]U[[VLFEGF@@HMOQXSFLWTSUYYWWVRUSX^]ZZ[\\\[ZXVTWVUUTSRPPQSTTSSSNLIFFHIINA) !$$#%&$%&()'%$$(01)%&"1VfXCOfY((JID>,1LQKUA.=6RlP8:6<21./2127:6G]k{ƒyqoqk`htrgn{wim{~uu‡}|Ž“ƒŽš‘„‹š—…ˆž ‹‡–œ‘…Š•Š{{…‚oo{d@;B>977998;>DGHLMG<>?DMQPQPPRKHdxbV```]PNTQSS?7ITQ[]``^[XWYVTVWVY^pw}}ƒ…„ƒŠŒ—¹ÞÌ‚W_]L[~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!"!! $.5///>™a‡Ã{+WM2-4026,********)&$'-6;>:86424567706_”¤—–—š §ª§£§¥¢¢¢¢ ž–••—”‘•‘“—šš•‘ˆ‡…‡‡ŠŒƒƒ‚~yvvxryŽ»ÙÒ¹´·¬Œ†Š“𠣡Ÿ Ÿœ•˜››šš›ž™š¡¤¢¡£¢¥®¤•¢£…QEHKGHGGDFDBDEBAEDDFJMLLLJMSSPRWUUUTSRPONNMOQTSRUSPQTQPURNQSORURQQQPOONONORVWWY]_X\eP%2S\WdjhghfdcdehghjeQGFD>;5406=?DPA?OYRHFCCBA?<989876530///4<>:79)2JQQS8'@@PnlM83=3101212697DXct~xyjcc``dbbafg`bkm\^kpffpsslnwunp{|os‡‰zw„‹‹”…‹¡¥‰ˆ¤‚D8C@=9779:FGIHGMNG;<=BLQRTOOQKGcv`T__`]QOUWTRB5:BFPSX[^`bdheff__^X[fw„‰“¦ºÄÁÓÙÐÜßÀ€^[bMMrŽ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!! ! (:/#.3 E˜‡h˜ACF-34220+(()*++*('$'-4;=<:87533467:26S~•”Œ‡Œ’”‘ŽŽŠ†ƒ„…………ƒ‚‚~xx{||~‡‹Žƒ‚‚†…ƒ†ƒ€‚€|wqlnnq†—• ´¸³´–‹“› žœœœ™™šœš™˜šœ›—𡦥¥§¦¥¬¨¢«™gCEHFFECDBFFCEDDDGHJIJKPSMPSSRSTTVUSQNMLLLOSTTSTUSSRRUTPQTSVURVZTQQQPPNOOLOTWYWXZ^Y\dX-+L]]aeilhdefggiijkdQHG?3*#"!(17AJPPNPKB?>@DADB@EHJKKNTWY\afhmoorurkjlcWZgg[^_\URPMHLLKIHGFECBA?ACGIHFFFDBCFKDCMVSMJEGIJIEA>973/,*++)-268940*++***-./6CLPOPPQRMIdv^Vaaa]PMSONMA762259=ACDFGJOVTJN]eillkjkf_[accb[X^dYNL`ƒ„d€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!"215/+",h¢w]‚j/7>0-/0,'*+$'&$$%'*,:;=;9789777765327AdŠ–‡ƒ†|€‚€|{|zyxzzxvonquutw|wxyyyxxx{vwy}ytvtonprq^^d^ZVh ½µ¹µ–†Šˆ”žœžš›œšš›Ÿ¢¤£¡¡¥ª¬ª§§ª°¶¯„LFHC@CFEBDGEBEGHIKJJLPQPNVPNQQMMQNMNPPPRVWSRSUSRQUTTSQUWSRTVUUVURQQQPONOOPRUXYYXW^`[^_<!;UfiheecbcaddfgjjaN>70/5:>?91+).;GMLFBDFEEFDCGLHFJLJJMMJHIMGHQSOPWV^^VVbkkpsspnnkgdcb`_]\[VVUQMKKLIFDB?=?CHKNOMF?:531/.../147899;<:@JSWWWYYXY[\]aeddefkrx{uN%#!.Tc^Z_YPHDFIFBFMLIQUNFIRVUVXXVWXVSTY]\[ZYWXYYXXYZYXWVVTRQVVVTPMMNLFGFCFID1! !"&##)&%%&%%%%%$*1*#%,")')-+&%()&$#'.6;=:8788658999740.LmŠ›¡”„‚…ƒ„‡†ƒ†€€€‚ƒ‚{|{|}{wx|y{|}||}~ƒ‘ˆ‡‰€}€ytuxyncf]^]c™°¯±¹¢†Œ‹†“žŸžŸ¡¡˜š›šš¢§©©¥¡£ª¬©¥®®¦­°ˆRCA@@ACFBEHFFJLJIIKLMLMNPONMNOPOMNNPQQOPTSRSUSPORTQOSXTQTTTSSUTTUSPNOQQOLPTXYWVXZ^bZ\`@!5Plgcee``hfhghhji^I:68>EEEDDB;.',7LKC;;<<>BB?@DFFHKJLOOOU]`dmx~€…Ї‚…‰‰…€tvslfb\USRPNKIGFACEDB@ABC?:8547=><97545712468:;<>?@@@BFIHIQ^da_bbcda]^djlmkgfkqtwP."!!/We]Z`YOEAFJGBFLLHNWQCHUVTVXXVWXVUSW\[XY[\YWWYZYWUTTTUUTSRNPUSKIMIFGFCIH=-!$$%!%(#!$&$$%%$%-1' '9KH@NULIC:+,75* .J:,01;==<<85:=9844ALHDFJDHMJILJLMPQMMONRPJFMROJFMPORUTRWUZ`]_fjfmhentoknoqqpptxrttpmsskgoqwzcHEEEGIJIFCFMQMJNJ=7;>EOQNNPQSNJcu]Wbaa]PMRUUTJB>9<6654358:>;:<=<<@?<>EJLOTWZVW_\TUJGMftebw€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ " !+<3-,2)6uk_rgA4,&*(%$$#$&)''+39<:==<=<?>@GE>CNMJKPPIJOOMHLPLLOOLLJJNNLMNQPPTURQVVY^a``cljkonklqoutswnUBNOKGJIINHHKNNOKA<<=DMNMPPMPKJgu^Raa_ZNMRRPRNF?8:<;9524;BCBDC;6@MWPJIHEDE?@CFHHGECUnud\{¤€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!$0:50.2-!%6IXe`S:$''()(%$%($)18;<:9;;;:987676;;/2Y„‘ŽŠ›¬š€‚†ƒƒ~{y{zxwurqnkkostwy}ƒ…†‡‰••‘‹…„~~}yuszysqtލ­±ÃÛ‰š¨°´¬•—šž¡¤¦¨¦¦ª°³±­±°²µ¯³±’fQCA>>BBGGHHIJJJKMNNLMPSNQSQONPQQRSSQQRSQPQQPORUUUUTSTVWXUTSQSTSSSRPOOONORVXXXYZ[^\adN'.Rnrh`acc\bfgfdllY@>FIFIHDGQRNJ7'-HJFHNLIFMMLMQSSU[XTSSUUTVUSSQMIFLKKLKIGHGEDFEBBE?ABBBCCBEDCDEFDBHGDCBCCDDDGGBBEECEFHHDBDCDFFFFGHFDM\```_```aabeikkkjgirzoA# " 5\dYX]SJIECFGACKMKLQMACOUPUXYXXWUSUXYVXYWYYXXWWWWWUSTUTRRSSSSPLKKJHFEFI@/"!"$$##$##$&&&$#%%//)/:FLNF?CFB>AB=-$.6/!&)(,/787@CD?;8/.982266215759<9<@?ADBBEFEFIKKLMMMOLNOPRSQPQQQRQOMMNNOQQQRTTWXXXVOLKMHEHGCBGGIJJKI@9;>FOPLMPMPJJgu^U`^][QMPPPVTKA8:888768>DADFKH8Bf{pfdd_WRTNGCFLQS_qt\S{­Â€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#&7:66761,$2LQXX7!*%)'! &&!/5;<:778<:7558;==78=Kn“‘އˆ‘…„‹ˆ‡‡‡„ƒ„ƒ‚†Š…}zspqtuu|†}‚…‰‹Œ‰‘–“‘‘މ‹‡„†Š‹†ŒŠƒˆŒŽ›¯®´Ê²‰„Ž‹—§ª¥¦§žžž¡¥§¨¨ª§¦¨««§£¢¤¢£ ¡¦›ŒpUE>AFFEFGHIJKLLLMNOOPPNRUSQRRQQRTTTSUVRPPRTSQOSTTTTSTUUUTRQSVUWRNORROLQTXYXWXY\_]]dV0)Mpre[]`dc`eggfljT==?@A5&&/1'!! ##(+.114@B=>;<:69932<916844668:=?AAABFIKKLMJLMNNNNLSSSQQQQONMPPMMRTONGFT\WOGEGGGJH@9;>FPOLMOMPJIhv]U`^][QMPRRVOE=9=<=;879>BBCDKI><978968:;;9756=Tq‰˜—Œ‰‡…ƒ‚†……†‰‹ˆ„„ˆƒ‚ƒymllsz~||€†…†‡ˆ‰ŠŠŠŠŽŽ‹ŠŒŠŠ‘‰‰‰†‡‹‰‰¨«°Ê½“ŒŒŠ’šˆ’ •’‘““‘ŽŒ‰‡‡‰Š‰ˆŒ“𦩭 …`B?EDBCDFGIJKJJKNQQMJMQSSRRRQVUTTTTSRPRUVURQPRSTTSTUVSTTTTVVUSQQRQOPSQTWYXWWY\`][c`;$Ffia`b^bjc_aihgdV>=@?>5&!+)&($!&(*--7AKJ2 &$%).;RZO5+Dah|Šyqvwkbhh]R^]OGJIC=::=;>>;647;746678;=?@@@CEEEHMLJQOQSQUWSZ[W`v~lZDCFHIKIA;<OixqmlkjmrqmhghjkjladŽÄΠp€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#"0<<787585,&%$IvW#$)(*(&*5AFB@=<=;8587555689So‹™–‹Šˆ„†…‚…ŠŒŠ„ƒ†‰ˆƒƒ|uw{‡‰ˆŒŠƒŒ‹‹ŠŠ‰‰‰ŽŒ‹‹‰†‰ŽŽŽ‹‡…Šƒ„Š„†“—ª·Á rtvmmpkflqkheeffc`achpzƒˆ‹˜š’—žœŸ¡¢ž€WCBB@ABCFGHIIJLNPOLJNORTTRRSUTSSTTTSOQSSSSTTSTTSSSUWVUUVYWUSSQQRQOORORVWXWXY]`^ZcfE >Yffghbbif^_ijfdX@<@CEIGHNHKLSK>LcQABFDGFABA@A@@ABCCCCCCDDEEDFGFCHFFFFDDEIFGIJGFFGIIGGGHGJHHIKKJHKJIFDCDEEEBBGFDCAEEDFGEBEDCBDFHIGBFTbc_][_ccfhhdhgknhcod2"!$C\^UTVQQNHDHKDCKOOKJHHKOPQQRTVVVVVTSRSVYWSTUVVUTSRPQSUTRQNQQLIIIGFCBDE;,"!$#!"&'%&')(&%%%#4QYOA@A?>=0#"*! /1& %'%)(.AWV;! %%';Yg[7Ah|”‚ƒ•›‰“…‰”ˆwŠ€sqwsgdih]VZ\QIKKDA@CA;8;<:88;<:7?<::>DFBEGFNbfXI>?EJKMI?<<=CMNMPNMQHHhv[Raa_ZNMRNTR=5BKNFKMKKMLJFDKOG>J\d]VSSU]fec`]\\^`[~¬ÜëµqX€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#!)7::6:6244/-!#Vƒ[!$8#&+9WsviaZPKIHDA@=;>@CEGMMJOQPI?D_TGFGEFFCFGEDBCFHGEEEEFFGHFDDGFDDCCEEEFHFEDFGGFEHHFFHKKIJJJJJJIHJJIGDDFHFBBEFHHDBEDCFHHGDDEFGGECECES`b^_\^aegigdiikmihs^/#&HbaVTRNOKGCHLEBHKPPONLLORSRRTTSRRQRTURUVUUUTSRRSSSSTUUTSTOPOKHHHHEDBEB5&"###!"%''()('$$'*BtrL?AAJE==A>:=DA?;8;3"&%&0/,#!'$*3B\[; "*,(9YlZWg|Ž„uŒ–ƒyŠ”‡|„•|‰™…Œš˜‚Ž”‰‰ƒ}‚„zpowtgckd[UVVOIHMH<9><798857>A?A:=CIJKF<9;>FOPLMMMQGGhv[U`^][QMPPUP:4HSWX^`][ZUNKNNRRFPr‰wttstvpomihp~‰´¿ÒæÓŒY^€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€! !/8899798448:#,o’Z"$<,+Fxšžšœš”‹ƒ~}}~vvx|„Ž—””–šš”’—‹Ž’“’‘‘ŽŽŽŠ‰ŠŽ‹’”’‘Ž‘‰‰‰‰’‘‘‘‹Ž”˜™——˜ŽŽ’’މ…‚„zƒ˜”’¨¸·‹NFICGLJHKMKNPRTVY[cgmqsrpnsuu~†Š‰~›½º“gLDDEEFGGGJLNLJILOONOQRSTTQRSSRRSTRVXWUUUUVWWVVUUVUVTTWVTURSRONNNMNQVWXXYZ^_`^dkQ& -PjkejiaYbddffibI9C@=98>=1" 1@A%-,/EXX6'#+%+?QfnhqŠ‚~—‰€Ž–Œ„ˆ’Œ‡‘‡y~}~•‰€Œ—‹†“–‡ˆ™™ˆ‡–•‡‚‹Ž…„‡{jlt[???<8:<417=?DHIJE;9;>FPOLMLNQGFhvZU`^][QMPSTM84AJLV`impsnfZ_[[\U]w•–Ÿ­·¼¾À¶¼¾º´¸ÇÕßäçÎYQe€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"'156;8+1<7366#1‰¦\$!/)Wˆœ™’‰“—šš—•–˜š˜—••–—˜•’”‘‰“–’Œ’ŽŒŽŽ‹‰“’•Ž’“–™ˆ‹ŒŠˆ†…†‡‡‡ŒŽ‹‰Š‹†}u|{~†oy–Žž¶½‹IIWKIQRRVYRVZ\\^bfafnv~…‹Ž–˜–—”•šbt¾¶hOHHHHHHHHIIJJJJJJLNNMORSRRQQRSTTSSSRQRVWURSUVUTTTTWVTUTQRRSQOOQQOOSVXXXYZ^^`_dkS* (Wg_Ybea^`bcede[@6=EFHKGHIPNJJGB=DOMJKHEEGJJIIHHJHFDEGHFCGDCEGGGIIGFGFEFHGFFFEDFIGHIIIJHEJIIIJJIHHFEEDC@>?BBABAADECBEGDBDCEGFDB@@CCEQ_`]a_]^eihghgiiggmu{U,!"  .R[ZUXUQQJDGOMBBKOOQQQRRPQOMNRTSQPQPQRRUURUTRQRSUVWTSTUTSSUQOMIDDGEFEE>,!%%! #$$&+('%&(*)(3k™€M;::;?<;B1  8F=$ #!(58BZM4#%,,;Yqpr‰|†–މ“™‘Œ”‘—›”‰”—‰‹–“„™‰‚‹Ž‘—˜…„˜œŠ†”˜‰¦–„•£v@8D917?95=CCFHHIF<<<=DMNMPLNQFFhvZRaa_ZNMRPOK<4866FLPQZgnmlopkdb^Z_bkx„’¤³ÂÑßàÙ×áìäàÌWYfT€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$-/-/2-..58464,>ƒ«m-3Ddƒ—•’‹‹Ž‘’‘’”—–””–˜•’’–—“”˜¢›”’”•“–””••““•‘Œ“™“‘–”–—‹Œˆ‚„‚ƒ„ƒ„‡‘𣠄™““ˆƒ~~ymuvЇus”¤”“°¹†QIPQSRRRVXXUUXYXY^ahr{‚„ƒ‚‚‚uwwrvoSk©Ç±˜wOKMKFFIF?BEHJKKLMNLNNKMSTQQTURSWWUWVSRSUUSUSRTSQRVUSSVUVXUSPNOQPMLNTXWXZYZ]`^Zf^.)Ne][b^bc`babg`K98EGDHJHJOSOJLI?9EONLMKIGGHHIIIIIIFFGGDCEEFGHHGFECEGGFEEEFFFIKHDDGIJJIIIJHFIMJFHKGGHFBBEF@CDDEEDABBDGGGEBAACECDGFDFDK]b^`_^`effjonefmcfxsG& # $ =[]VXZTQPHCFOPFBINONQSQRRPQSUTRQRTSRRTUSTWPRUUSPOOUQPSTSSVOQNHDEGFDCFA/""# "%&&'),&!-'#)%)C~˜ŒY4>6<@?=A@=?>==8:<:A9" 3HA5! #$ +=FLC+%#!-6Hcloˆ”€•—މ˜‰‘—‘‰•’‹‹‘’ŒŽ““Œ”šˆ™–ŒŒ–•Œ‹•š‘Š’›”Šš•ˆ‘vB5@???=9:89COOMQLOSEGktXV_^^ZLJPOPKC=:859;>?@ELRV[SMXgmnnj^Yadbgv€Ž™¡©´¼°’lW[bZK€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€(-+(,0/-,48455.3„ Z@hŠ”¡¡™™š™›’”–™››››Ÿ› ¡ žš›žŸœœ ¡˜—˜˜–“’”–™™˜–•–•š–•—““–’Œˆxy|€}„Š›®¹®—™˜’ˆyyukktƒ‹‰zu¥•Ž®¾„FCOOOLIHJLNJJNPQUZijkhfgkpdebkor{uu‹´Á®œ~WKLF;35=DLIGGIKMMJIKLJMRSQRRTUVUVWWWWVUSSVRPPRTTSVVSRTUUVTSPNORQNNRVXXWWXZ]^\Ye`5%Ea_\^[`a]abbaVC7CKHCEFFKJPMHIJA9BMKHIHIJIJKJGFFFGEEGGEEFDDDEFGHHGGGGFFGHGFDEHGEFHIIJJJIIJGGIHHJJHHIGCBCBCBBBAAABA@BEDCDEDDB@@ADFDFCK[a]__aehhghiogiofj{tC% # &!#Fa[WXWRRPGDGQTGAJSNNRSQQSQQSUUUUVXVSQTVVVVSSTUUTRQRUUQPSUSQOKHGHFDDDE>,!"#!$%&(*-(")*)\‡–aC><=;B?>:;<9A:$!"0F?:5 #'/9GI;(! ,-:Xkr‡‘ƒ•”Œ‰‘—Œ‡–‘‰–“”•Ž•–ˆ…Ž•‡š–ŒŒ––ŒŒ•œ”•ž– šŒ”žvA5??@>:9AKIHHFFKG;99:BMQNOJMSGJnrUV`^^ZLJPNOH=9<:4679;=@ABCACDCKYb`fffifbea`_bfhge`Z]hfXRV€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$.-'%)/2-*38456,F‘ƒQt¤° ¥¤¢§¦¤¦Ÿ¡£¤¤¤£¢ Ÿ £¥£¡¤¢¢¥¦¤¤¦¡Ÿ›š™˜—–••–——™š™“•š˜˜—’Ž’‹†{qosw{yvw~…³ÖÝÇ«›—І|tsqicq„ŒŒy ™Ž§¾ˆGAEFGFEFIKMKNTYZ^chlppoqy}{}††ˆˆƒ¤¾·¤—€_GGE>3.5>@@ACFGGFKKNNLJKJMQQQUTRSTPNPQOOPQORSQRUTRTUTVVTRQRRQRQNJKRTUXVTW[\\ZWdc?!<^e`^[`a^acc`RB?@BGDFDIX^]^_cghhiihmgiogm{o<# ! !% .SfYYYTPSQFEFQTH@JTPPQRPQTTRSTUVWXXSRSTUSTUUUVUUTSRVTRQSTSPPMJJJGEDEFD7' "$$%&&&&'((%'),$%EyŠ“—k7:C2).<=$ /1%'35?A6*$%(#.Pmw‡†”‘ˆˆ•‡…ޕЗ”Ž–——˜‹ˆ‘˜Š“œ•ŒŒ––ŒŒ–””ž–—Š”ŸwD;E=7;CFHIIKLGFJE58;>9;8558;<;B?BA9=EBBJPU]][]fjnnkiiknie\IDd€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€*3-'&(,4-)39567%V~dcž®›¢§¥¤¥¢ §§§¨¨§¥£¢ž¡£¢  ¢¥¤££¥¥¥¥¦£¡ž™–”•–•“”™™–”–”‘“—•••ŽŽ‹‰†~tostspmntz†µåõã¿¡•‹‡‚zpqpjao„‘ƒ|”𔡴ŽTDKMOPQTW[_^afgdceorvwvwy{xsw{tsvmp¨Â¯˜‹{dJFFHE=9::>BEFFGHHHIKIIIHKOQQRQQTRPMNNNNOPNNPQRRPVVSRSTSSTSPMLNMKKPSTUTSU[[YWVadI3Yfb_^`^___a`TFB@DCEGGHMOONMKF>:@KLJKHFEGHHHFFGHFFFFFFFFDEFGGFDCEEEFHGECIHGHIGEGHHHIJJIHEGJJFGHGGEFGEEEB>BB??CC@ACCA@EFBCEDCCBBDDFCGT]\]`dgfgkmljeglfmxf4!  $!>afX[YQOTQFFGORFBJQQOPRQSTRSSRSTUUUTUVWWVUUQSTTRSTVTUSOQWUNMLLMIDCFEF@0""%$%%&''()&('&*"-[Šˆšq43E:3('4<=A<548=;7C="&/"9?B8"(8.%-6<4$ -,5?<-###+QqzˆƒŒœ˜Œ”™Ž„Œ”‰˜•ŒŽ––ŽŽ–˜‘”š‰™•‹‹•–Œ—š‘Š’›”Š™“†“uD>B==CHHHIBGIGDIG=9;;BMQNNONOBHotVWb`^YMKOMSRH>>??@<87:=??>=?>86@MGD@AFIFEFP[a``di_ZNBEc“·€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€.2,('&'3/,59677-BSl˜³¯¥¢¦¥¥¨¢ž¡¤¤¥¥¥£¢¡ ¢¥¤¢¢¤¦¡¢¢¢£¤¤¤¤¡œ•‘“Žˆ‰Ž…„ˆŽ“•’“”’‹‰‡ƒ}wso{umebbef…¼ëóáÂ¥—‡‚xrssk_k…˜š„z“œ—¦†XFTUVTRRTVRPQVXX[_voga^\[YYUYXPMKFh¬Ã­”„yiQIFKNJED:=ADDCCBEEDDFHJKJKNOLMPQNPRQRRSSUTRQTTTTQQQRUTSSQRQOOONKOQVWTSSRZZVUU]cQ$*M`^]]\W^\ZZZOFDEEEEGGHKKNOLJHC<@MNLKHGHIGFEGGGGGGGFFEEDCDFHHHGGGGGHIIGEFGFHIHGJGHIIIHIIFFIJGEGHJGGFDDCADAADEBBFD@ACBACEDDEDBBCBCEDEQ[^]`ehggklkifhkfou\,! ! &#Pk`Y]YPPTPHGJRPECLOPNOSTUSNSRQQRSTTWSPQVWTORSTSRQSTPTURQSSRLKLLIDCFED:*"%%%%&'(((''%&'"1  /Wsy…އ™—‹†Œ•ƒŒ”‰—•‰••‹‹“—‰‘–…•”Š‹•–—š‘‹‘›“Šž•‰”qB>FA@FKJHGBEIFABEB<9:CONLOLMQELpsSVca]XMKNKOQME>>@===>@AAAC@?D=,I…ŸwcUMHCBAABFGGFGIKUt𮝀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ .0)(&"#0117:797:.C…«¤¢ªŸ£  ¦¥›—šœž¡£¤¤¤¢Ÿž £¤£¡¡£¤¢¢¥¥£¤ ›•’‘‘‘’‹ˆ‹ˆ€…‚†ŠŠˆ‰Š‰€yibdgvoe_]^^^…ÄððÜÁ£”†~{wzvk]i…œœ‚u£›“œwMCLMLJFEFHGDDJQXaiaXMHHIHE==B?=>:>¹Â¬•‚yiOKHJMMMMBBCDFGGEDFEGKMKMMKMNMORPPSTSQTUUTVTRSRQURQOPSTTWTTQNNQSSNOTWRRTRYYUUTY`U)%E[^]_ZU]]XSOIDFEGIJKKJIIPQJEIE9:ILJHEFHJGEEGHGFGHHFEFEDFFFFGGHHHGFFGGGGEFEFGGGLFHIJHHHJJGGHFGHHHGGGDCDBEA@BB?@DAACEA>@B@>AB@BFEBDCEN[`_bfjkjigejjklhqsS&!"""&.bpZ[_XPRTPLHOWRCCLPSOMOPSTQQQQQRSUVYVRQSWVSVVTSRQQQRQRTSQQSNKHIIGEDE@2% "%('&&'('&*$#)()PˆŽ‰’qB6<;87-/=+ $2;4,83$8/+A>&9B% .IP>-&'35(")5WrvƒŠ…˜—‹„Œ–„Œ”ˆ–“‡Œ••Љ’—Ї—މ’›“ŠŠ•–Ž˜œ”•–ž•‰—ŸtFFOD=CKMIEIIKH?>@?<99DONKOMNQEInsUVca\WMJLMLNQNHDDA@??@ACDKLGIE4Q•µ²±«ž“‰€rne\USUXRf›®³§™€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!./))% #-46::9;7.2fž¬¦¥¬¤©¡—š™–—™œ £¥¦¦¢ Ÿ £¥£¡¡¥¥¢£¦§¤¢Ÿœ›—“ŒŒŒ‰ƒ~z~€€}|~vaX^bkhdaabccˆÆðïáÇ¥‘Šƒ~~€xh`lƒ’’|rФœ˜žtE>EGGFEFIKLIIMQTY`OKHHJKJGINSNV[Vc—À¼¦Žwp`JJIGHLNMNJDACGKMEHHIOPNOPPQRSTUTYXWUTTVVXVTUWWURVWVVXVTSSTUSRRRQJMRTSRSSWXTUTV]V0#@Z^^^YWYXPGFDCEAEJLNPOJLPSMFGD9=IKJJHHHLJGFFFFEFHGEEFFDGGFFFFFFFFFFEEFGGHHHHEDHGHIIIHIIIHHGFHIGEEHHEDDCCCCBABBA?BDA>@DC?ADEDBA?ACCDM\cabeimkgedjkkkgqnJ#"$""% ?poX^_XRUTOPKPXSDAKPRONMLOSTRRRRQQTVTUURPQSSSSSSSSSSSSRQSURNNLIFFGGDE<+!"!!%%$$&)++*)$'+);iŒˆ’l:2A@13<1 ",+$3;.",)$76$)@@'%A>! )CWTF3/2)$.;9Tq{„‹‚“…‚‹•…”ˆ”‘ˆŽ˜—‹Š”™Š’š‘Œ”ž“‰Š•–ŽŽ™””ž–›’ˆ– uJLIFFHHFHLGHJGDFE><:;CNOLNMORCGltXUc`ZULIKMLNQSQOMMICABDEDBFDEE>V†¢ž ¢Ÿ£©¨©ª¨Ÿ•’˜Ÿ£«³´°­¬¬€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#02,+%!&*5:<;:<7/L•¯¤›ˆˆ’¤©¡¡¤¢ ›Ÿ¢¤¥¥¥¦©«ª¨¨ª­¡¥¥¢¢¦§£ ŸŸ¤§¥•ŽŽˆ……ƒ…ˆ‡†ˆŠ‡‚„…‡~jbgihiiigffgÆèêæÑ­—…ƒƒxeep…„vr‹ž¡“£}G=BDEEEFILONQVWSRSVWWY[]^__edYabXjœ½´ …icUNLE?BKOMROJDABFIONGDGIHKJOQQSQPSTSSVYYYZZWXXUWXWWZZY[\ZXUWVSQQPNLRTTVSQTVWTUTSZV5:V\ZYUVQNB:>BA?BEHHJPQLNMPQKGE@FLGEIJIGHGFFFHIJEGGEEGGEBCEGGGFEEGIIHGGGBEHJLIGJHGGHIJIGEILIEHIFEFJJEBBA?>@CDA@ABBDEBABA?CCCECBD@CCDL\ecccfjjggjhiihdniB!#%" "$%LxnX``WSWSNRNOTREAIMLMRRNNQRSTTRONQSRUVUSSROPRSTRRSUTSSSSRPOKMKECEGGE9' #"!%'%$&)*)(&',*)L}‹ŠŽˆe>4999:>=, .!&6;*#" %59))>=!$F?! %9S\UG=+(;J=Qt‰…†”††‘™†Ž•‡Œ“Šš™Œ‹•›ŽŠ‘—†–’‰Š•–Ž™š‘Š’›”Š“‡•pDGGCCJNKHFGIKHGMI;:<ADFBFHILLLOOMLKKID@FIIIJHEGGEGIEDFFDFDDFFEFFFDBDHIHBEGGGHGDCDIJEBFIFFHIHFFGIHIKJGFFGGGFEDCC@?@BDDA>ABDDBCDCCACEA@CDECDEIV``fhgiookjhijegr]. # $)3iwcXd`SQROPNJQSLECHPMNOOPPPPPRRONPRSTQUUPRVTVRPQSSSSSQQSTRPOIJKJGDDF?/$  %&&%$%'('&",-"/cЉˆ†’€S936;96;;5/$,067&"",130/<<$9. ##3HTUXE4KS;Pw~ƒ††‘ކˆ’–Œ‚•…Ž–‡˜•Œ“˜‹‰—‘‹’”‰ˆ“–ŽŽ–—†ž•Š–’†•sLGG@>??@>8=A@<=@?:9;>K`“³¨£ª¤¡ ¡¡¢¢¢ž£¤¤«­¨£¥ª§¥ª­«ª¦¦¡›˜šš˜š–’•šš•’˜””—››™ž–‡}‡ƒ‡Šƒ~„Œ™µÚíݽ§¢™——•‘’††‰ŠŠˆ„Š˜ ›˜— bOTVSVXVVXYXWY[[ZY\\\\\\\\^]_Za^Zz±³¦¢ƒRGJIFFJJIJMRPPTVSOMFJJJOUSKGIJIFEFGGJJGFHJIOQSUVVUTY_a^\\ZW[UNKKLKJJPWZVRRUVUPMNLOY?!,GWWZ__mbG5;A> ".82*" 5JS\QCRN;Os~ˆŽ€‚‘’ˆ„•†•އ–‹•“Љ’›‹‘™‘†Š–’‰‰•š’ŒŽ—“”ž“ˆŽ™”†’˜oKJUOMONONGJIECGKE:<<;BLNLLJPVFInqNR__^XJJRSJHMPRRRPSSQSZ^^_^[\UEYŒœ˜”“”–˜šŸ›™™–•šŸš–˜ž¡¤©€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!/5474.,+168::60RƒN?DD@AC@CB@BAACDCDDHUacfjihjgdgijhksf@"#"'#/Z‚{^SnjYUXURNPNMMJDFNQNNQROOSRQRSSSSTVWTTWRPWWTSSSQQRURPRSQNLJIGDCBA@3(""!#&&('&')*)(,/(+Nz‹ˆ†Š’vH449?:6<=:9,/=3 ($%-374/63,AICGF4#""!0DWVINI?<?CDBCCA@DCDDGTaeekmllhehjjdjs]3#" #&";BKKINLJKEPrqRYb\Z^ZTOMNPPHEGIJJHDFOZ`^`^`WCSƒ˜’’˜™–š¢Ÿ—¤žž¡œ ¡¢¤¡Ÿ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$0436622++/5:71,7DD:9:7554?==a’©žž œ› ¡˜›š˜šžžž£ ¢¦§¤¤¨«¤ žŸŸ›ššž˜˜œœ™˜”“•”“—˜•“–‘‘––‘Ž‘’’”™›˜£««©¡ž£žœ›–’’“ދޒ”‘›žš— “eOWXTUWTUWTWZYXXZ[YYYYYYYYX\Z[]Qb˜±›†dJLMKMNNOONMNNOOQRRQRWXVVUOFFC??BGKMMMNOPPSVRRRPNKHFIFDFFDCCBDFDA>==8::7:AGHLMKMRTZfc9 JjbZ]T=3>648;BMOKJOQTRPLLLJLKIIGFGIGFDDGIEBEFEFEEIGDBDDCDEFEEEDDEEHFEFIHFEGFFGHGGHGEFGGFHJIHGEDA@?@?>>?AABAAA??CD@>@DDBCDACCEDFSbffjjhhghmjibgoR,!# "# &Nx†rZ[|y`QTRONPKKPNCERQQPPPQQRQPRRQOQUTQSSPRTPPMMPTTRQSRQQOLKLMLGCEE?7& ###''&%$%'('&/)&?l†…‚‡‘`606<<52:;7<7)+5'"-$(1334/-%!4CDEFKRXYQB2%")"?U]SCRo~‡Œ„ƒ‘‡…“‹ˆ–†‹’†‰”—Œˆ“Œ‰š•‹Œ”‡‰””‹Š“–‘Ž•›’Š–…”™nOV[WXXVWXTQVYUTRKAD>;CLKINKPQCMrqNSc`Y]`b`\YZZXVXXYYYXZ\]\X[[`ZHY‰˜’’—š—™ Ÿ£Ÿœ¡§¥¤¡š˜Ÿž€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€".1/21--+),496/+<>;79=;6;7>@9=bš¡˜œ’–Ÿššš›¢¦¡Ÿ¥£¥©¨¤¥©©¥©§ š™™™Ÿšœž™˜˜”›ž—’“—˜’‘••‘‘–ŒŒ–š›š¡¡”•Ÿ¢ššœš•—˜”’”–•’œ›–Ÿ‘bJUVQSTRSUUXYWVXWVXXXXWXXX[]\^[Rl ®ƒ~cJIOLOQPPQOLNLIJNRPMRRRSW[XRSLDABEFEEDFHHHKNOOPPPOOOQNOSRNPVQOLHFDBAIIGHLTY[^_]^badnf? :[YURC1?ADE@@EDABD@@CC?@DCCCDDESbhcggfhgeijichhI($"#"2aƒqWX}eTVTRSSOLPNEDMQQQOPQQRQQSUUUTUTPORQOOPURQSTSPOTRPPOMKKLKFCEFEKNUSQQURA0*!"'9NRBNn‹‹‚†‘†…“Š‚‹’ކŒ”’†‡‘••–Šˆ˜•‘˜–Ž‘›™‹”–‘—˜‹‡œ”‡—œnMS[XYZWXYVTWWUUVMBB?=CLLJMGORDMopTUe`X\^^Y\^`^[^^Y_[XY\^^\\^^a[HY‰Ÿ–‘–š™––•—œ¦¬­«««ª¢œ ¡¢€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$16574-++')395-*EJB8865:<:99=5E­¤  ¡¤¥¡¤¥¦ª¬¨¥ª¨©«©¨­¯©¦©§Ÿššž££œ—š›Ÿœ  œ™™–—™™•“”ŽŽ’‘Ž•–œ¡°²¤ £—–˜˜•—–Ž’ŠŠ”•—˜•Ÿ’bHUVRTUSUWUVXXWWXXXXXXXXXXYZZ^XTv¤¯|r^KFKMQSQQSPLOMKILOOKOOQTUVWZUTTTSPJFGEDEC@AELKIHHIJKOMMNLHJNMMLKJIIHMMPQQNMMQSRSUPOW`D1P\WI60?DDKF4*.5@AA??AD@ACCBCCAECBBBCCCBCECDRcjdgggkhcbjihkcB&"!#!"Cq~~qVUu}hWYUTVRRQOMGFKRQPPPOPRQSTTTSRPSQORUSRUTSSTSQRSTRPPPNMMHHEBEE8'"" !%'('&')*)(,&8^x~€ƒ…’†Q0564:32>=597 ""(0/%+2.2>6#&>GC>Ro€‰‹ƒŠ‹’’…ˆŒ†Œ”‘“ˆ˜”ŽŽ‘’”—“Ž‘™–‹——ŽŽ——Šˆ”—Ž‚–žqNRYWYYVVXVUUSQSTK???>CMOKKHKLDQqpW^f]X]^^\WW]a]Z]aa^\]`_[WZ\[_ZI\Ÿ˜”•šš–’žž¢¨¨£¥¬ª¯®¨¦¥¥§€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€.=DEF@62+&(394,)BSG4;>68=:8;D87h¥²¨Ÿ©ª¢§ª¬©¨ªª«¯¬««ª¬´´©­¨£ š›Ÿ¡žœ ¢¡¢§¢¤¦££¥¤¤¡š™™˜–•“”•“”•“«Ê×ŪŸ™–——–—’ˆ‘”“‹ˆ›œš”’cKTUQRTRTVWY[[XUVZYYYYYYYYVUW[TT{¥¨ŽvdWROPMRTRRSQLMONJGHJJEJMMOVZZYYYYYXWVWSQPLFEICDEGGHGGHHILMLHFGIKIGGKOLJIJJKQZVWTUXX[ffP*-G[V?2:<@GH>1+,4:AHJJMNMLNOOLIIJKIFIKHDFEFGDBFFGEDFEDEEFEDDFFDFFFCCEFEFHFEHIEDJGEEFEEEJFCEFFFGJJHFDBA@@AABAABB@@AA?@BB?CDCC?AHBCECDRckllgfjhddijmo`>$ # ,QyyxrWTkxgWZVSVQQQSNEFPSPNPPNOSQTUSQRSSRQPPRSRRLORTQOPSQPPPMKKNDEB@DD4!"!%(&%$%'('&,&?iz{€…Š•‚H*486:44A?698!&.$./#-701?8%,?AFMKB5%"!$,;Zr{…Šƒƒ“”Š…Œ“…‰ˆ•‘‡š™‰Š–˜Ž‘“’–“ŒŒ“”ŒŠŽ™ŽŽšš‹…¡”„–ŸsRWYXZ[WWYXXYVSSTLA=??DMPLJLOK?QwqMVa_^^WW\Z[]ZVY^^_\[]``]Z^_]_YHZŒ—•““•–•’• ©§¢£¥¢¢£¢¤¤¢ €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€H†¦¡špA3'.-/4'(CRK<6:A:4::1;?8L’±¥¡¬§©«¨¦¥§©¨¥£¥©§§®²°°«¤¡¤¤ŸŸ¢¢Ÿ ¢£¥¨£ £§§¥£¡¢ ›™›š–“’‘’“’‹’°Ð×Ä­ ž™–””–”†‹‘‘“‘•›š“’žbFPURQQPRRRSUVVVWXZXVWYYWUTZ[`SU„¦¤‹t\NMMRRTVUPLKKMLKKKJGEFEGLOPSV\\[[[Z[[ZZYVSPPQPMKJJJHEGIHFGKNMLKLLNQSUWWXY\_bdfhgdejmlpY,>aV80?@BJL<+**2?EJKLMQNN>MypEPc_Y]YX\[YX]c^Z\\\^^ZWX]`]\`XH\‰”Œ‹’•—•˜˜œ £¤ —›žž›œ¡¥¤€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€gªÄ»»¿µžR.%0..21FYSFA>;3;==5;=6B{®°¥°³®ª§¨ª¬ª§¥¦§ª««®³³­«¦£¤¡›—˜ žš›¡¤¤¦§  §§¡ ¤¦§¥Ÿš˜•’˜”Ž‘•µÉÉ»­§¥›š˜—˜—‘‰Ž”–––’Ž’–“˜ŠaIQSQRTRTURTUVVWWXYXWWXXWUWYX^SX‡§ ‡nYPTPMRSQNIGGIJMPOJHILFEGKMNORXXYZ[[[[YZ[[ZZ[\XWUUTRNKIKJHHJKIEGIMOQRRWWWXY[\\`cdbceebaS.E`K/3>ADJI9**+0:CHJLOONOQQNMNIHIJIGGJIIHFEFHGEEEFFFEEGFEEFFB=DBACEEB@DCDFECEIGFEFIJHDGGFGIJIEFFFHHDAA@??ACCA=@AAA@ABCDAEF@CGBAACCGWfkhgghecdhihir^4"!##"$#Ht€sxqYRZ[[[YVSQSQQRNDFPURQRRQPPTSVWQORRRNOSSQRSSTTSQPQQTQOONLJJFGFC?7+! ###$$%%%&0Uwzw‡‰“zB-437:62:<;<0$)<3-,"06/0<9("3DA," '-..16:<@PbZ<&#5]ƒŒ…†‘ŠƒŒ•Š‚‡Œƒ–†Š‘“–˜‘‹Œ“–Š’”‹–“ŠŒ”“‹Ž”•’›—‹––jMU[VX[WVWWUUUQUUJED?>ELOMMOOPAMwlBH^^X]]\\[XXYWZ\Y_\[\\[]``^^c[K^‹ŒŠŽ““”’’•—›˜“”—šššœŸ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€c¬¾©­¶º¹ _+ 'CU<=WSHG@>?<9;9;>9;\œ±¡¨®¦¢­«ªª§£¥©¡£©ª«´¸°®ª¦¡™šœ˜šœ¡¥ œ ž £¥£¢££¥¥¡š˜–”Ž‘’’œ±Äĺ°¦žŸžœššš”Ž”•”•“‘“”™—‘—‡_JRSPRURTUTUVVUTTUWXXWVUVVYWV\R[©’oZOTSOQRSQMIGGCFHHGFGIKHFFGILPSUWYZZYYXY[[ZZ[\Z[\]^\YVRTTQPPNKNNNNPRTU][XVWY]`^aa][YUPTO2>R;(4=AGJE4)*+.8CJKLPPMLORPNNNIKMGFHFEIIFFGGGFHHEDEDABCDDDEEDCEEEEECAACFFEEFFGEEHJJGEGGFGIKJGGFFGFCBBAA?>@CC@CCCBAABBBFEACDCCA@CEIXglffhihddgjfgqZ/ "#$!"(Ry}r{v^UWWWVVUUTRQQSOGFNVQNNPQRRSQSSOOTUSQRRPOPQQRSSSRSTUQNMLJIIGECA;0&  ####$$%%&:c|wv‚…‹’wA,5459529<;1" &('&%$&+/1159BQXG0! +5h–†x˜Ž†ƒ‰•Œƒ‹“Œ‚Дމ‹‘‘•™“’“——ˆš“‹Ž˜•Œ”œŽ“—‰Œš•Š–—jMW[VXZWUWWSTVSXVICC=;BKNLJHKPAOvmFB\_\a`[W_]][YZ_^_\Z\^\YX[YZ`ZJ\‰•‘‘‹‰’’’‘“•’ޕ𙙛žž€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€eµÁ§©®®µ¸¦t3@†17URJJ?;E?8;>8G‚ª£¡©¦©¬§¥§¨¦§«¤¦¨¤£«­¦££ ›––™›—›ž¡¡ž›žŸŸŸ¢¤£žš›žž›˜–“ŽŒ—¢±¾¿·®¨¤¢žœœ™”’‘’’’’’‘’“—‘Œ‘ƒZDSTPQSRRQPRSTSTTUUWYWUSUWVTTZO`—¯„si\PSSRPQSSQNKJJJJIHFFEJIHIHHHHPRTVWWVVWWVVTUVYYZ[]^_^]Z\\ZXXURSRQRTX\__]YXX\`cZ\[WTSPKa_A,:2)1/(*+-6ELLLQPIGLQROLHGIIEHKFFHGEGECEDEDBCFEAEEECBCEGHFDDHJGABEFEDFGFGFFIIGGHGGFGHIIHHFFGDDCB@BCCBCBBCCCA?>??BABCABCBA@DHLXflefhkiedglfhqV+ %!##".[~v|nWPVUTSRSTUSPPRRJGLTPMNOQRSRSSSPMLNOPTSONQSSQPQTVTRRPONKHHJIEA?7+"  #####$#$(Emzot…ˆŒwA,554741:<<;/);>%,(#45-3;2$,5.%-5692/064-,2*/335@MV9'#=|Œ~†˜’ˆˆ‡€Š“ŒƒŒ–’—œ‡“™‘ŠŽ˜šŠ˜“’–‘’š–Šˆ•‘Š”„“•jNYZVWZWUWVRTVUXWHBE?>EMPNMFJOBOvnLPa^X[\\Z]\Z]_[Y^`]Z[]_^][Z\c\L_‹™““”‘ŽŽ‘‘’’”’Ž—›˜–šžž€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€_²¿¦®¯ª¯§º²hl«~)9PNMSE:?F>@C>?@6Ap¦¨›¡¤¥ŸŸ £¢œ˜˜› –™ŸŸž £ šš™ž Ÿž£¥¥¦¢œŸ¢  ¢œ›š››˜“•““’Š“¡¤«µ¸°¦¤¨£œšžœ•’•’’”•”‘ދޑˆ‚\HRUQORSTPQRTSSRSSTVXVTRTVQQUXMg£³d\XTUTPPONNOPQQKLNMKJLNJKLKJHGEJLORTVVVWVURRSWZZZYXXYZ[Z]^\[\ZVSTUWZ\^_[[\\\[ZZTWVTUZ\ZfgL!  ./-1;FF;6;@??C>635417CNB8$H|‡„“’‚‚ކ‹”Œ…Ž˜”…Ž—„‰“’“—’Ž’˜’“—“Ž’˜˜Ž•‰”Žƒ“–hMYZUWYWUVVUUUQVUJEA=>CIKKLLORBOtmOYb^[\Z\^ZXW[a\X[[ZYXY[\[\Z\b\L_Œ•”““”“–’’•–––’“–šš˜—šŸ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Z«¹£©­¨«¤¬µ€}¢o@NUINYODB?;;@==D<:cŸ©–𔋒™›š™›ž¢ž™œžž£¥¥¥¤¡››šŸŸž¡¤¢¢£¡Ÿž››œŸ¡ŸžŸ™–•˜””——•—š ¥°¸²¥ ¤¡œšœš“‘•’‘“•““’Ž’‰€]LOUROQUVRPQSTTUVWUUVUTSSTNPUVKp¬±uZUWPQRROOPRUWVUONMLLLLLMONMKKIGEGIMQTWYZYVROPRUTTSRRTWZY[\[[]]ZZYXXZ]_aaa_^[YWVXZYWY_cb[aO)"./.4=CJE4(%&)/;GKKLQLJJMMMNQJIGHIGEGFGFCFIHFEEDEEEEFDCCDCBCDFDAACFFDFFFGGFFFIFDEFGGHHGFFFFFGFEHHDED@B@?AA@AC@AAA@@AB?EB?DFCDDBGNQXchffhjiffjkhllH$#&! #".b~urxfXWXVTQPPPQPOQTQGFOTSSTSRQSTPPQMNSTQPQSSSRPSQPPRRQONLKMLJGFIE?9/&"" ####""!!0Zvuqw~‚‡Ž~K.562310:=<;-#0@<""&:7,7<-!$6C@9=HTMB;72-<4Y•ªž¢˜“› œ ¦¨Ÿ¡¥¨««®²°©¥¥£ Ÿ¢Ÿ Ÿž¢¢¡¢ž¤§¥£¢ žŸ  œ˜™žœ–’”š›™–¥¥ª°¯¨¤¥ŸŸ™–•”“‘‘‘”•‘Œ‹„‰|ZHNTROQSUSSSUTTSTTUTSSTTSRPQUSLy³¨kTUTJLRSPPRWZ[XURPNNOQPPNPRQPOMIFFGILQUW\[YVQNMMKLMMNOSVUWWUVZ[ZYWUTW\bfgd_ZXWWX[]]ZZ^^\ZaU1"+,/7>BIC1&%#'1?HJILPNJHJMMMNKIGHJHFHHHHGFFFCEDDEFFGHDDEDA@CGDDEDCBDGDFGFFFEAGFEDEGGGHGFGGFGIHFHFBDFA>?ABBA@@BBBBAABCCABBBDEBFDIQRWafgfgihfhlggkf? ""!!# '[€xop^TQVUTRQPPPMRSQMHHNURPQRRTVRNPROPTTNRTQPTVQOPPQQQRSOLKKJHFFDC=3)$"! ###""!!!?hxqvyx€ƒŽ„R0462200:><;- 0G@%&;6*8;)!0@A96>FKSXOA;BJTTV\^WI>56:>:&/^Ž”‘‰†ŠŒ„€’ˆ„•ˆ“šŽ„˜’’Œ“™•Œ˜•Œ”‘‹‹•Œ„Žœ“‡——eHVYTVYVTVURTVUYWHAB>=CJLLLJMNATwmQX_\]_]__^Z[\[^_\Z\\ZY]``c_]`XJ_Ž™’’–•“’Ž‘”š›“Ž’——™––šœ™€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€\«À©¢¢¢¡«ª½phQ5.*!'( !" &!$%$125UŒª£ ¤Ÿš¡£žž¤¥¡Ÿ¤«§£¥¥¨ œŸ ›™œ›•–Ÿ¡œ™ Ÿžžœš˜˜—šœ”Ž“œ•——–••–—žœœ ¢¡™¢ —”——‘Ž‹“‘’ŠŒ†‚„`KOTQPPOQQRSTTSRRSVTRRTUSQSSUPM€µ jQNNHPSMQPOQTVVTSUVRMKMQRSRPOQQOKIHHILPRY[\[WSQPHJLLJJKMNOOMNRTTSSRRTWZ\`^[WUTUUTXZYZ\ZW[aW4 "(08?BIB/%%"&3BIHILPQGAEMOKGJJIGHIGEJDEHDADFHECCEEEDFDCDDDEHEDDEDBBEECBCDDEGDFGEDFGFHFFGHGIKFEHHCEE?>BDA?@BBCCCB@?@ACB?AEA>CHEJRSW_dhgghgfindfja9!"%"#!GzzmjZSOTTSSRQQPPPPQNGGNVROOQQPPNNNOPQSVSSSRQSTPPQQQQQRSONLKHEEGAB;/%""  ###"!! Ntxkvyv‚އV2463100:><:-0I?% %;5)7:'-8<>@98GPMPWSD8578IF-;w˜‘€…Œƒ’‡ƒŒ‰…‹–—‹“—†Œ—›‘‹’›•‘“–‘Œ–•Œ•šŽ„‘˜ƒ••dHVYTVYVTUUUUURVVIDD>>88+0OA%(&*D2'89+%09<@;6EKPRPRVSL>33::AQ]Yc^HLYE*\•–ƒƒŠ~—„Œ’ˆ•’ŠŽ”‘Š‹–šŽŒ“”“š˜‹••Š‘”’”‡—”fLU\WXZVTUUTTTRVUIDB=>EKJJKJLNBVwjRY[X\`^\Y]^[Y^_]\^^_`_\[]^[ZbXHdš’“˜——˜™“Ž‘––“—‘•–’”š€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€R’Ÿ•š™š†gD0(#  !!"""#$%'(())+:g“˜ŠŠ‘ŒŽ’’“”–•‘’“’“‹Š‰‰‹Ž‘‘‘”ŒŽ–”ŠŠ”‘‹…‡Œ‹ŠŒŒˆ‡ŠŽŽ‘“‘š›š˜™™™•“”•“’އ†‹Ž‰‹`JOROPROOONOOORTSPSRQRTUTSOSSMV‘ºiPPPJKKPLLORSTX]YTUWSPRTRRSSQPQROOJFHHFJPPSW[\[Z\WROLIIKGEFIIGFHFJLLLOSVVTQONNOPTSUWWUUXRST> (49>DD8)  *7>CLPLIJ>>FFEGGHKLJHHHGCEGGFFGICEFECCEHGFDDEEDBDCBCFFDACDEFFEDEGFFFFGFEIGEGIJIGIGEEDBAA@B?=AB@@C??B@@BCBDCAACCACKPPQX`e_`ejjeejjmnU."$ ! F[N@DOXTTROOQSRQMKOOHFLQSROORRPMOPQQSVYVTRQQQRSOPPPOMMLJLJGHJHEA7+(&!  !!! "# (#:gwsrrp{‚ƒŽl:.974.0==:9*0M=#)*(=3.4-#,::;;:BMOQSUWTQSF>8.-5J€”‰…†‹Ž„€Œ•‘‡“ˆ”’Ž‹”‘•˜”ŽŽ‘މޗ˜’‰‹‹…‹”އ—”fKUZUVZVUWVRUXVXUIDC>>FLLKKJLNCVwjRY^ZZ]]]Y[[Z\__]]_\[]^^]\c`]cWE_‰‘‹’•“•”—••”•˜—“’š˜›  š˜š€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€F€‘†‹|YC2$#%# !!""!#&()(&$'/Ch††‰€„‰‰‰ˆŠŒŽŠ‰ŒŽŽŽŽ‹‰Œ‹‹‹ŠŠŒ‘Œ‹Ž‘ŠŠŽŽ‹‡ƒ†‹ˆˆŠŒ‹ˆ‰Œ——’˜£›š™™—”‘“”“‘’“‘Œ‡Š‰…bJOQNPQNNNRRQNNPQPSQPQSTSRQSRL\—ºiPNQMLJMPNNOPRTXUUZ\XWWUQRTTPLOTTSNKMLHHIHLUZZZ\b]YXWSPONLJIHEEFFEFIJLNPPLIKLKOTVQPUZYTQNOVH#(49DDGPOIJH?AGFCEDHIIHFGFDDFHHFEFHFEEDDDDDBEGGFCCDCDCCEHFCFDCDEDEFEFFFFFFGHEEHIFGHEFGFFEDBCA?@CA@BB?@A@@BBABCBBCCBGNRRQW_dhddggfhmemlN+$'!!! 0?;6ARWSRRSRPPQPPLLPLGJQOOQQNOQURPPRSSRUUPOSPMPOPPQRPNLNLKKJIGD;0(%#!  !" !"&%Jotqtuqy„†vB.77303<<<;( 6N9!)(.@4##'<=::>EMNLKILODXxjQX`]Z[\]Z\Z[]\ZZZ[\]]^_aa[[[bWIe”“”’’’‘”–•”‘”š›ž Ÿ›šœ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€It……~bC.$%  ! ! !!!!! !$&'(''())=cy|~{ƒƒ€€ƒ††…†‰ŠŠ’—’Š‹ˆŠŒŠ††‰Œ‹Ž‘ŽŒŠ‰‹‰††‰‡‰ŒŽŽ‘“›—™›–™¡Ÿ››š˜”‘‘’““““’ˆŠŠ‰dJLRONOPPMNQSSRQPPOQRRPOQRRSOJ`œµ—fPLONMIHKJJKNPSTQWXW[[VTXXWWTQQSUURQQOKJFEHOUX[]Z[[\]^\ZWURPMKJJMHGJKIHJJGFGHIKNMORSOJKPPTaX0'498BB3$'6CLHFKLEDND@ELIFDDIJJHHIGEEEEFFEEDIEBCEGDAADGHEDDECEFEDEFEFDDFGFEECEGFEDFHEEFGFEFHHIFBADC@C@@CB>?EB@ACABDC>@BBBCBBJOSSRV_fhggfegheeqhD% "" ! #%/43CTURPQUTPNPMPLLPLEIQQPOMOPQRRQRQRRRUVSRWTNORQPQRQNLIFFIIHEB7-&# !  ! #%.Ysrrwuov‚…‚‘ƒL,37324<:=<'";P7!*'1D4 ":A869CSQNLMPRSPSWXUTSP?;9.5V`UGMu‹…Ž‘„”‹†•‹–‘‰“ˆ‘˜”Ž•˜‘Œ“š•’“‘‰ˆ’Š•…•’eKUXTUYVUWWRRSSWVICE>]qutu{}€‚……†‰‹ˆ†Š‘‘Œ‹Œ‹‡ŠŒŽŽŽŽŽ’”‘‰ˆŠŠ‰‡†ˆŒŽ‹’•–™™š›š›ž¡ žœœ™–’‘‘ŒŠŠŒŽ•fJKQONPQRNNPSTRPPQOPQQONOQRRNHf ®eTLLMNKGEIMMKLOSWZWUZ^[XZZYWVVUSQRTSPNNMLKGEIPVW[_`ZZ^`^\[YVTRQOQLILMJGGGIJIIKKIDFJJEBGOZ_nh<&4::@=-%1ERJCFLIDHNAAHMKFFGHIIHHIHFEEEEEEDDDDDDEEEEECCCGGECEEFFECDFEEEDFGFCDDEEEFFGCFHFDEGGGGEBDGGC?@A?>?@@@?ABABDB=?ABBACDLORSRV_headgeefcfqc;#""" " +32?SVUQOQPNOSRPMQVLFMRSRONNPPKOSSQPSURSRRTTPNSQONNMKIFGHFEHE:3'#$"!"##""!  %$7erntxsmt„…‚”X..7324;:<;&@?@A@=>@A?BC@>?ABABDIMORSRT^hlbelfadego[5&(&$!! $17FUUSQPQPOOPPMIOTLDHRQRTQNMPNOOQQRQQTSSSSUUQTRPNMLKJKIJHDE@4)&$$#"""!""##"!! &$?kpktxpnt„…‚’”h8,6312<:98%!BQ2#/(CB?AB<=@@@BC@AABCCCHNQQRSQR[fgdii__d_lqU0&'#" ! ! -;LVRNQRRQQOLNMMORMGFNRTQOPPNNNONOPQRRPQQPQRQRSRQOMLLHCEFB@;/%)(" !  !"#$$$ !&$!Elpgrsnrv€…Š“yG/44.0<:65%&HR. .'79##'-%'/.1@A<>A@=>AAADEADCCEDEJQSRSSPOXc]abRH[jaijL*&($$!"!"+6EOQQSRMMQQNONOTSLHIOPQQONOROOMMMOQSQPQRRPPPMPQQNLJJJHIF@A:)%(&! ! "$%#! "&%#Ilpdnpnvx}…ƒ‘ƒT235,.<:43%&HP*/*#7. "$% '+(1014;BIMOVURUWPO[JAXv‚…„†|†‘…‹’’ˆ…‘•Œ‚Œ•‡‹““Š“˜’Ž’•”‘Ž–”ŒŽš’‰Š””ŠˆŽ•ƒ’ŽcKVVRTWUTVVWUTRTRE?A=>FLMMNIKL@TuiQY`]Z[]`^[\ZZ]\[_]\\_`^]]W^aaSHg—‹ŒŒŽ‘‘’—™—–¡œš››™—€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€%*)'#"& ''$'&%#(% ""(1BQO@77?atqqtuxkt}…Ž–•‘ŒŒ‘“Ž–ˆ‰“’‹‰‰‹ŽŠ†‡Œ‹†Š’”’’–œš¡¯·¶¦¢§ª§ª¯«§§§¦¦¦¥¥¡œž££—“’Œ’„\INQMNQQPNOOONNOQRPPONMMLLJRFSŠ´«†cNKQOLKPSOJHIKKKNLLNPQTW[[\]^]\ZYWTTUWXXXUTUTQQTOKIKKKNSXWXZ\[XU[XXYYWX[``acgkoqqlkopmklqa[`P% !-<85,'4JODELPNONB38ISOHDA@HJIGFFECCDEEEDEEEECCEEDECEB@BBACFFFEEDCBGFDCCDEEDCEHGEDFGFEFGHHGEDDEGFDBB??ABBBC>;=BB@?=@@BA=?DCB?=?FNUXT]X97]menj@"$#"'$ !""'7IRQORRQPRQNRMLRSIEITPMOSROONNLLNMOUSQQQQQRSQQQNLJKLFIKHB:0)$#"!!!"#"##!"%#%$(#&Mpllmoopxˆ„ƒ‹‘c(*2-//+0.!+@F' 0(#/()!" !%(,))-/4<=@IHRUSUSSZJ=YyƒŒŠz‰‘Šƒ†„†Ž”Œ…‘™…Œ’ŽˆŽ“ŽŒ“—•‘‘•˜”Ž’™•’™“Ž•”Œ‡‰•‰ƒ”fNUZYXVUSRRTRNOSPFAC=:DMMMKDJNCWufOX]Y_`\X[[_^ZYYZ]]\]^][[]a^\aTIh”ŠŽ‹‰‰Ž”˜˜–š ¤ž›žŸ˜€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€*+#"&%$!)/(#)++-+'%&+5?EKJ@:>@?^{‰ƒ€‚ƒ†ˆŠŠ‰Ž–˜•‰‰‹Ž’•œ—Ž‘’“Œ‹Œ‘‘‘Œš›¤¤£¢¢¥¨¨§£¦«­®®¬©¦¢¤¥Ÿ ¢ž™˜–”‘Œ‹Š‰‡„~}‡‡…‚‰}VDMPKKMNONNOPQONMMPOONMLLKKQDR‹µª„fPIMNPNNONMLLLMMLKKNPQSVSW[___\[\[ZZZZXWXZZXUTUWTQNMJIIJRUXZZWUS[bfffijjdfilnonnolkllife]TU_S+ ,<>5+)7LOBEPQLLE:4DNQKGECBFHIHGFECHFDEEFCAFFDCEECCDFDCDDBEDDCCCDEFEFFGFFDCFFHIEBCFHGGIHEDEGGGHHGFEC@>>=;:::898679844895687:88?ISVVYVN:=[f`lc:!$!$# ""(8IRQNQRPPRQOOQRQMIHKQMJMPPNPLQQONNMOSUTQQSROTRPOMLKKKGCA?8.&'!!#"!# "" !"#%$(#'Lollmonow‰„‰–s5&0,,-,++(*00!$-&/3&")"#*..**-049=>EOTQORUG@Yx‡Š€y†‰ƒ…ŒŽˆˆ–ˆŽ†‡‘“ŒˆŽ“”‹Ž˜˜Œ•™’˜””’ŠŒ–•Ї”Œ†–ŽbLUYXWVUTSSSSQTXTJC@<;EMLNLFJJ?VveM[^VZ][Y^]\\\\^^ZY\]]]]]]_]]bTHhŒ‘Ž‹‘‘Ž–™™›Ÿ˜˜™›œ›™˜€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€+) ('#,2.&%*,+).:FNZsŠzI0?C2:W~Ž‘‹Ž••“™šš™šœš–‘”–••™ž¡›œ›™—™œ œœŸ£¥¥¤¦£¥«®«ª­¬¬©¤¥§¦¡Ÿ›œ ”‘‹ˆˆ‡‚~~}{xusqpmmnnnprs|~}y‚wR@LOLLONOMNOPONMMMOONMMLKKMOBSµ©ƒeSMLKNOPMNPOMKLMQNKJKMQTYZZZ[\_b____^[VSSZ^[XXYXWWVRQONLKQW[[YYYU]fkorrnlkkklmoqsrmhd`YSQNQXO. *:;/#(>NKBHROJI<17KOLGFECBDHJIGFECGHIGECDEDEDDGGEFEFFDFDCCEEFFGEEDDDDDEEEEFGHHFDGJIDBDC=<>@ABA@>>>;878988936:97:=;=;:967::646?KQPLLHD9@\gejY2 %"! !")9IRQMPQPQSSPPOOSTMHJSQOQSQORQPMJNPPOURRTUQPPQOLKLKJHGCA?:1($%%#  !#! !"!#$$(%(Mnllmonow€††ƒ‡—ƒG$+*)+,''.(*')+!,?+)--.-1.2:=68:6587?:DQTTVRBB\v„І‚““ˆ‰‘ˆ“‹†‹Ž‹Š‘‘‰‰’‘“’‹’™’’”“’ŒŒ‘‰‹“”Š—^JUWWWVVUUTTTRSVQF@@>=GLJKJILL@WwhPY`Z]\YW\]\][YZ^^Y\^^]]]\[[^cSFf‘‰Ž‘’’–˜••˜š–“’”’’–˜•‘€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€%&-CU[cmnhdWKXknr‚”šœsI63Bj•¢Ÿ”“™š—–˜œŸ¡Ÿš”Ÿ££  §¬¬¥¨¬­¬««¬­­­®¯®ª¨®§¢¡Ÿ›˜˜•“ŽŠ‡‡„€ƒ|xzxrrxpooonmmllkkkjjiimjghlopoz}xwTBJOLMONNLLMNNMMMNNNMMKKJJLNBU޲¦„eSNMJMOQNPPOLJIIONMMMMNORSTWY\^```__]YTPMTY\[\ZYX[[YWXVRPSWYYXWW[UT[djmpqnjhhjnqfe`XTSOHFEBC>+ (76*.KODDMNJIF5/<667878::;:;@EHD@8?D8=[kkhO*!%! !!+8HQQLOPPQTTQPQQPPONNQQQSTPNPQPOONMMQOQRSSTRPMLJJJJIIFFE?7/)&&$""  """!"###$#)%)Lmllmomnu€ˆˆ†’ŠY'")**,&%/)+&"*')A,&)'>DFJBAKI?:<=>>;;38FMS]dJ>Wx€…y†—“……‘’ƒ†‘…ƒ‹‘“‡ŒŒˆ–‘Š’“’–‘’—’ޓޓ‰‰Ž’Œˆ—Œ_JUVVVVUVUVXWSRTOFA=;/3BIHFDDA=>HJJHGGHHFEDCEEEECDCCEDBBEEFFEDCBFFEDEDEECBB@@?>>=;978998952269;;;<<;989:9655755663588897<@@>>?@@AAB@?<;:5@I<:TeieF&#&   !,9GPPLOPPQTTQUPJKRURPNNORSPNQNNQRPMNPLORRRRRPNNNLJHIJGE>4-,)$%  "! !"#"$%###)'*Lkmlmnmmu~ˆˆƒ‹i-)-)*(%+-&!,#,6)"$+?BCH@BNWPC843;GBA=:9;PjYCVx…†ƒƒ‹ˆ…ŒŠ†’‘††‘‡Ž•ˆŽ–“‡‹––Ž—˜Ž‰–•’˜Š•‘††‘‰…•aLVVVVVVUVUUURRTPHDA=;FNKIFEKOCXvgP^bY]``[ZZ[YWYXXZ]^^\[[\\YZ^cREf‘’ŒŽŽ”“•›Ÿžš˜Œ•“€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€3>P³·¡ž«¨³¶sE¼¬©®°­µµ¥rM62;CFVjЧ·¾·§³­©ªª©©««©¤ ¡¢ ”Šˆ‡…}xvsrpnjhihgggda_d_^bdccfeggffiihfhfehgfhlllmmmnndhkjhhmqy‚x}wWEIMKJKJLLMNOOMLJJMLLKJJIIILE\Žª ‡fQKMMMLMPQQRQPPPLNPPPQPNNNORSUVV`_```]YVSLHMQTUXUWYZ[\\ZWTPPRUVVVWURSZ`bccb_[UPLOMGCBCCA=A@AD9!-,,IKFFDH@CD4-;IKIEDD@>CJKIGGHHGHIHFCCDFCDBBEEDFDCDEBCCA>???=<:9:976679:9;;::<==9<=<;<>?;;:876777447899;<9=CDCA>HOMC@CDCBCC@<99;;@H@>Qbj_?"#$  !,7ENNMPQPQSSPPNNRTQPSRQQRSQPTNOOOMPRQONOSSPNPOPOLHEEFDE>0)*)$""! !"! !""#%##"*(,Ljmlmnlls}‚†ƒ€†“z;)-)'(())#!*%($$!3@@CFAEQPWWQI916CKMMI>>BEEEEDD@>A7 ()*@@@A>;<;99:8;:999:;;:;<=>===9:;9:;:868;:7347;;::<=>?A?>?AAABDABBAABAAOPDADDABBB@><;;:@H??VgnX8 !   !,7CMMNQRPPRQOORPMQUTPURPQRPOSNQTQMMPNQRQPQSPKNMLIGFEE??8,%%%"$!!$"!! !"#$#"!)),Lhmlmnlks|ƒƒ‚“ŠR'(*(#%*,%" $(#%:@?CGDHNSONRTL@92:HX`YJ?@Rir‰z‹”‰‹†‡ŒŽ‡…’‡‚ˆ‰‡–—’Ž‘’‘’‘‘”Œ‰Ž–”’—‹Œ‘ŠˆŠŠ‡–‹]JVYXWVUTSSTVVVVPGCB>;DKJJGHMNCZyiPU`\\[\]b^XW[]^^Z]^^[[\]]_\[_QHk”š‹“”“““‘ŽŽŒŠ˜™’’€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€)&>‹Á¼«¶¶Ä¼lV£Â²²»§mC70'.31,)))''.02E^htmijhb_`[Z]`^Z[``^^`bcbaec``acdcbddb_`ceab`^aefbabcdddca^ca`gfdighhijkllgiklkigfr~t{z]LHMKJJILLLMNMLLLMLKKJIIHHMJA\‘«ž„fTKFFMOLJQWXSOOPQTTQQRQNINQOJJOUVZ_ehe_[Z[XQNLJFJGFHHEEHFHHGFEGIKJKOPPRVWUPLHGGGHFIPTPMNMH<8<8'%5JQMI>:FEEF;0<989:<;768::<:89:8:=<;;<<<<;;::::9876899:=A>9A?@C@=>DJHEDEEEDECACCCBC@BDC@BECAQQA=BDACBAAA?<96EN=0'&)'"#" !""!"#"!!#$##"!**-Lhmlmnlkr{€‚„…”f1&&'!,/')&"#+!*A@=BEDJNQNRWSPRP913G`yŠ„xБЋŒ†‹‘‹ƒŠ‡‰’‹’—‘ŠŠ’•–™’’–’’•‘Š‹”“‡ƒˆŒ‹˜‰ZHVZYXWUTRRPQPPRNGEA>;DJHJJFLMAUugQZ`WY\_[ZZ[[]^[Y\]YZ_^Z\ab]Y]QJl–˜‘‘“™•’”•”’‘ŽŽ‘ŽŽŽ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€.12e«¸•”¥®–]PŸŽ[;9>822001-'&'%%'()/6LYca[[]^W\ab_^_b_abb_]]^ba`__acddcba_^]\^`ba__accdec`^^_bbbbbcccaceecdhlghc_aca`l}swz_FFMLKKJMNLKJLNNMKJJJIIHHHKLD`•«…gVMKLNJJLTUPNSUQPSSTUQQUPPQQNKNRUZ`cfgeaYXXVQKJMKGEFEA?@=AB@>?@?BDGHIKOQUXXUUZ]]b[TYdaZ\_J=;;;/ (Hb^ME>AILA>95DQJE<:?BCDDB?==>;9;9;949=9;;9<@=;;;=>;:<;898:97:;98;9;AGHGFEEGGJMJLHHHGDAACGIIGFGEAEDBBBCCCCBCEFDDEDNNC@CB>C@@B?:8;=EE>>SlmP+"!! ,4?MHMPQPNNQUOQRPMLNQSRSTQRTSQRPPQOMPPQQPPOOONMJFEGFCF=+!')$ " $#"!!$$ #&'#&+%1Riiioqmlvˆƒ„€ˆ”u?",-!(3)"+%.1%&:B=?FFAFQPRSRQPQSUP>49`jbRGFMXZQ52100.*&!"#%%$'*1CV]\]\Z\^^]\^]\\]_bdd`\\]_abba`^^^^___`b`^^__]Z_`bb``ac]]\\\\[[UWYYXZ^abca`chhgoƒw{€dJHOMLKIKKQOLLLMMLJJJIIHHHGHB`”¨™‚hWPMLMKMLNOQRSUVRTTVUQOSVQMKJJLOPSW\bhhea^[ZVRRSROMLKGECEBACB>=>A@CGGFIOOW^beiiggc\^ffbd\K@;9<0 'IdZEA@DKF@=:>OVJGABFC=989<<;;><9<=?==;8?<:;>=<;;;989768;@CDDIKKKOOQV[][WLHMPPNLRJIJID?>AKNOKGFGIDFGFCAABCABGIGDCFNMFCDEG@ACC=78=>FE?>TllK%!" #!-0:KMLORQOOQTRQOOOONMQOOUXURSRSRSTQOPPQQONOPOMMJGFHGDE:*$((#! """ "##""$$"&)#2Tjkikoopv|€‡‚…€…“|B'4;.,+1%$-%67'#(B?===<;<<;:;9;94787679754428?<??<98>FF??VniF#!#%#" #./6HOKNRSQPQRRRRPNNPQQTSQSQQUUUTTSPNOLNOMMPOMLLJGGIHEB6)&*&!!!%$"" !"#""#%!&'!4Wmkijmopu|‚…‚†€‘‡S+0?B?/)!$.$>;% #9F<<>BCCIQRQPPRSRPUOSWOID87MdqgJHf‚Ž‘ˆ„‹‘ˆ‰Ž‹‚††‡Ž‰‹‘•–ޕ𑓖Œ‘“‰˜“‰‹“’‰„”‰ˆšŒ]LWYTVXUSTTVURQRNFCC>?GIEFLHKI?Zt`OZ]XVXX\]XZ\Z\][VY\]]`]Z\ZX\bPEgŒŒŽ’Ž–””‹Ž“‘’’——““‘‹€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$-38COXQPTK7=NH>IVYTQUYF2/61/0)%('$#%%#$%&.BY`\WXZ\\\YWXZ\\ZXXYYXWWWYZ\WWVUUTTSPRUVTUWZ[]^_]]_afgghijkkmnnnoprtsrqoorrmtƒz„gFGLIIIJMMJJKMMMLLIIIIHHGGJGAd–¦™‰lWPOLLLMMONMPUTPPRTXYVRSNMMOOMLLNNNRX`dghd_ZXXZ\\^]ZYXUPQRQPOPMIJFDFEBDIFJMQV]bfdjhbbhifZSLBA>;;=<>CF?DGCDJB:KF9222141/;C;FG@?Yoe=##""%##"026EMJMQSRQQQSRPQQRQQQSQQSTRRSRRRROMNLNOPRRQNKLJHHJHE>1')*$!"" #"""####$&! &%!8\nfkmomlr„ƒ†€~Žc0(:FE0($#.& C; $$2CA<=?ABCIOPQRRPPQRWNPSQSRG<7BWgdUMaˆ†‰ƒ‰‹‚…ŽŒ…†’‘ˆŠ“•’”››”‘’“•“‘Ž‘–“Œ”‘‡ƒ–ЉšŒ]LXXTUXTSTTVUSTWSHAB;;EKJIKJLI@Zt_N[`\ZYZ^_\]\ZZ]^^[\[\__\[][^aPIl‘’މ‹ˆ…ˆˆ††‡ƒ€„„ƒ…‡…~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!).4?O[ONXL-+:9CRTOLJC?>=>@?7:>=?JSRKW`VQSK>KE4(+,,243=A69EDMTWUTSTWRPPUZ\[ZNHOQIFGIHIMOKDCFNLKLKHGIHIIHGFFGKKJGFGJLRWO@=BC??@@>=;:9>EG??[p`3" $"#263@JILPRRQQPNOQRSRQPSOQUTQPPSPOONNPQNMNQRPNMJKJHHIHD;-'*)!"#"#! !"###$%%!!&$%@amekmmnkq„†€|Š”h5-;C=.1.%%1+$F?#*6?C==>@BBBGMOQRQPOPRNOQQNPSSJ6?EFcp`N`„Ž–‚ˆ‘‚…Œ‹††••‰‹”˜•‘””Ž‘’–”’’˜ŒŽ‡„Ž–‰‡—ˆXGSWRTWTRTTRSSUYSHA>9;FNLIIIKH?Yp\L[`][[Y\\UX[[ZZ[\XY]\YZ]^[[_cRLo’•ŒŽ‡‡‰‰††ˆ…ƒ‡‚…‰‚tpu€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ .12f—¡—sTJMLMLINIJPRPPTUVW[^\XYYVTUUQNMJKLNMOU[\bggc_\ZVWWX[^_][[\]YSQRQRRQPNIE@ADIKMPT\bhgekkdbZTMHMH3:iiG8;>997=JTPJIHA<>?CD@05=ACNVUPUYRKLC9>?1(/1/7:6<=6=IIOSTTUUSSURRX]^]\TMOPNMKIFLRQKEFKIJKLJHGILIGFHIIIFIJKKMNNNRMEAB@>A?<<>@;6>]p[/ #$&% #460I@,19.(41(JG&5HE?@?>@CCBGNQPOOQRQOMPPPSRRWE=[fJAY{hQ_ƒ‘Šˆ’‚†‹ˆ…‰ˆ–˜Ž””ŽŒ”Ž’”Ž‹“œ”މ„˜‹ˆ—‡YGTVRSWTSTTORSSTNFC@<=DIHHKILJBYp\NY^ZYYWXWXZ\\ZZ\_]WVY[^_[[[]^MIm‘‹†ŠŒŒŒ‰Š…†ˆ…„††‰‹ŽŠ€zx€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$00/8IVPKWG-6JUROKOUQLQW@028622,)'()'&%&'(&%%,3P[`\[_`]a``beggfefijkkjiklllmnnnsrqswyxwz|€‚ƒ‡‰Š‹ŒŽ’”•›˜––™šš™•““ŒŽ„p{‡€„lIFJGGJJKIGILLLKKLHHHGGFFFGAAm¢–ŽtTLOLLMKNJKQQLNTQQSW]][]ZWTSRONOKKMONLMPW]cdeeca^[YYZZZ[][]^\VSSVRPPQOMMNJIIJKQXVY`bcknhfZSPMPJ74epP77?:;7?NRJCDF?;78963)63)LL) 9KFAD@=?EEBGQQPOOQQPOSSRRROPXB=a€~eNSypOb‘‘‡‹‰’Œ‰ŒˆˆŽ“’‘—šŽ‘—˜‘‘••’’“”˜š“‘’”Œ†‘˜‹ˆ˜‰[KWVQSVTRUTPRRRRLECC;:BKLHEHLLD[p_T\_ZXZZ\ZY[][YY[\[[]]ZWZ^]\\[IEiŒ‡…ˆ†…†ƒ†‹……†‚„ƒ†ˆŠŒ‹ˆ„€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ .348BI\OQ<*>PTGNLGKMKLWF2.7:415.)))(),*'%&''')?]qkchmjmmmkiknrooopruxzxyz}ƒ„‚…‰‹ŒŽ’•”–˜™™™œžž›™—•“’•І„‚~{uoqpghg[bo}wu{eDFJGGJJKIJKKIGGIJHHGGFFFFFAFu¥§—ŽuVORLLNNNOPPMKLNMNOV^`adba^ZTPRVSPMMKIJNTWYZ^dedc^ZZYWXZWYYYYYUPZTQVXTSVXSOMKKPWWV]bfoupgXQPOQJ80asV54A=@?ENNID?@<;=@ED?6:A@BMLHHA:?F9.441;>5499=EHLTXVSQQTSTUW[]ZURMLLNMKOPTUPLJHEIMOMLLMLLKIIIJJJINPMHC>:@LMA;?BA??=;=?<6;CF==^pU&!&& -61;KJIIJMOPQRRRSTSOMNOOQSQPTPMORQPRQPNLMOOMKJKJGFFC>4)&& "%# "%$! "&'$"$#"$&5Yndcmkjokm€„€~ˆv<*;G;'2>3)51(MJ,#7DFEE?;>EFCHSOPQQONPQSMKPRONRD9\z…ŽvSUomXn“Š’‰€Š“‡Š’‹––‘–—•’‘’’Ž–™”Ž’“‰„“”‡„•‡YJWUQSVTSTTSTRSTNE@?;=>DOJ=?DB>BA:8;;77;GH?=]nH & ($ &+ )11>IHIJKLLLKLORRSTTTRKKRTOOTSNPSOLNPPNMMOOMJLJJHEEA9/+'$#""! !#&! "'$!##(#&?\ijiffijlry~‰ƒ€~„Šs;%9I;(,<-(5,,SJ" >CDAELOOPQPONNOPPPOOQSF=Yv„Œ†ecpoez„‰„‘‘…„’Œ’”’’”•“Ž”•‘Ž•“‘‘“•‰‹ˆ†“•†ƒ•‡ZLYURTURSTPQRPOROF?@;?GHEHKFLG?]u\M[`^[YX][Z\\ZYXXWY\[[^\XZ]Z[aSHa~…}|ƒ„…‚||~€|…„‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ (028D@CUS6/JWNMQTUY\YTdbA*3<:6=91)')+,-+)''()*.0ClŠˆ‚‹ŠŽ”™›ššš———˜™›ž™•’’ŽŠˆ‰ˆƒ}xwxkifc^[XVTTSRQPPOQRRSTUVVUUWURUVQQkwuw_FHJGINLJPJJJIJJHFGGFFFFFFI?Dq¡žŠŒ†_LIGLNQPPONMNNNMOPORX]_aacec_\[VWVQMLMNSPPSVXZ\___^Z[]\ZXUTVXYXY\`dgijjeilljhfdgeccinlfe]XRJHE<""Otb:2?A;FPPH@AJFKNGERSG=COPHLURLORHEMKCGO?.44/5<=<89>DGTUTTUSPQRMMU[ZVTMOOIHLNT[^XOKE??EIKKKLKHNLJJLPOLEB@A@>==CHEA@??BCA<:=<88>HF==]i>#$%%+6'#(/.9EJKLLLLKKGJLOQSRPOLMQPLMSUQRTPMNOONMMMLJIMIGGGHA6,'$&$  $ "%# ! #%#"$'$*E`hgggijiir|~‡‚}ƒ‹v=(>J;)/=@EDBHRSOLLNOOOOPPPOOQSHA^x‚‰ƒ€‘†xokrŠ”Žƒ„‘„…Ž’Ž’“’Œ”–’‘“Ž“˜“Ž……“–ˆ†–…WJWWTTROQUTOOQUUKBAC9:FMMHDELG@^u\MZ\XWXZ]ZZXX\]\YY[[YZ]]\[]]^_OHd€…|z}}~~||}~{z€„€„ƒ€|}‚„„€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#,07B<=WZ43[dZZZXVX[[XXhU/,88<;83.)%&(+++)'(+.000M…¤¤£ŸŸ ¢¢Ÿ›˜‘‹…}{zupkhifa\TTUSPNNOOONLKIHHPPQQRRSSSSTTUUVVVUVURTVRH`urqs]DEKHDIKHIIJIGGIIGGGFEECCBI>Bt¦ž‡„bOLLNNOOONMMMNNMOQNMPW\`__abaac]YUTSPNLRMKMQUY]VY][XY\ZZ[YXZ\ZVVXYYY\aeifddefggllkiknmilf\NCA?8%!JsmF38:9ELHDBELGOVJGOKG@AJKEIOHHKPHDGB9@I;+01-4>>;78>DFLNPRUTQRUOOV[YWXIIMKHIKO[\UNMICCIHFDCCCD@BEHLKE>>=>@B@?>BKLB=@A>A@<;><76ED@=<>CEA=EPOQQOLLNQOPPOOOQSB>_z‚…}ˆ•|rozŽŠ€…“”‰‡ŽŠ‹“–“’–”‘””’‘“”Ž“˜Œ”‡‰“”‰Š˜SIWSSWVQPSSORRQQLDAA9=GLJHFFOMB[nYO]]YZ^]\VTUVVXY[[\YXYZ\]\]_a^KHjˆ†|z{{|~|ƒ‡‡„…ˆ†‰‰‰‰ŒŽŠ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€%*4@:4LR.9hjcbdfjptts~Šw>(6889765/'%'#(,+)(+/,2.1U‹œ…€zvtromfd`\WTRQNNLKHGFFJKKKKKKLLLLMMMMNNNNNMMMMQRRSSUUUVTVVRTURH[qrqs^FBJMHEJJEIJKKJHEBFDB?;8548+1k§ †ŒmSKKKKNQQPPOPPQOQQOKMQVYZ]abaadea^]YTRSQPPQQRV[VX[[XY\[[\\[[\\Z^_^[WX]bmifgjliegjkiilmkqiXF<>>9)DqtQ:99@HMHCEHECKMCAD>>>?ED@IMCEKQJFJD9=F;-22-0;;735=DFLSTQQTUUWRPV[\ZYLGNPJHIM\\TNQOJHNJECA>>?A@?@ABB@>?@BBB?>BKNE>::=;438FF==^g8!"#"$<@)!*+8FLLMNOONNMNNMLOQRRPOPQRQPMQSQMNPRPOONNLKJGGIJFE>3($"$#  ! "%%#" &&'8Wigbfgjkhiq}€zƒ‚{ƒŒp9+@D4(02,++7H6!*?FGDA9=BD@>EOSQONQSQMOPPPOOQS@=]y‡‚€„Œ„{|‡Ž‡„’’ˆŠ‹‹’”Ž‘”“Ž‘‘’‘“•’‘“•‹Ž•ŠŒ‘ˆŒ™~QJXPRYYRPRRRTQORPG@C;]u^R\[WZ\[YSVZ[ZXZ[Z[[[ZZ[]^]]a_JHq“•ŠŒ’’ŽŽ— š’’–šš–’‘“‘€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$/?;8EF6[†€ŠŠŒ‘—š›œš “U)085:875.&$&%'))(()+0/205Nc_[WSRRQOLLKJHIHIJIIJJKKLMMLLLLLKJONNMMLLKKKLMOPQQTTTTTTTTWSUVTSUSHVmrqq]EAEIIGHIIKC=??;87321/.,,+3&)f¨¢ƒtUKMKKMONNMNNOORSSQOMNPVW[__^`ddddd^VSTOPSUVTTVYVWYXWZYXXZ\[YZ]XZ[XUTX\afihikhbehiedeedi_N@?BA>-:iu[EA=AA=7FINUURRTTTVQORY]ZVNIMMIIKNWYTSYYRPPJEDC@@B??@BCB@>??@?@?><>GLB;=@===:9=:42>0)03,*&8M9"*>EEDC;BGNQQOQSRNOPPOOOQSF?\vˆ„‚ŽŒŠ‹Œ‹†ˆŠ…†“•‰ŽŠŒ”–“ޑދޔ–“’””‘”––”ŠŒ‹…™{PLZSSWVOOSUSRQUXPEAA;>FIGHJFIE?`v^Q\[UVYY\[]ZZ\^\[[\_^\^\\_\Y]`JIw˜‘‘”•”ž˜›žŸŸš’Ž“”€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!,<:7:5?~®¢›¥Ÿ››››œ”’e0,97:9972*%#-)&%')('73591-9IPNMMNNMLNMKKJJKKMIGIMPMJIHGIKLLJMMMMMNNNLLMOPQRSVVUUUUTTWSTWTSTSHRiqonZCCIFCHIGII8+-2312/00001115+.h¬¤~‹uULQNLNMMLLLMNOTSRSRPNOUTVXYZ^bdfiie^YWSQPSTUUWXTTWUUVWUTVYXVW[VXZYWUUV]gkd_beeadda_``^]UHBED><12`vcK@:BKSL@EKFAC99<>@BA>=?@???@?=?JKA:=?=?>:9<;54DHD=AalA  #'#!?I/ %'4DHJLNPRSSPPNMMNNMMOPOOPQPPUVRNMNPOMLLNNLIJFDDBA8+%'### !""##!$%  "'%,Daicbifeijmryƒ}z~z‚ƒb60>:3/3/,+)8K9%.AD@:677787888\y‚…}x†’„ˆ”“ŠŽŒ…‡ˆŒ‘‘ŠŠ‘•’ޑދ“•“——“–”ޓމŒ‰ƒ˜yOMYRRWXRQSRQTTUUNFC>:?IJGGIELKF`rYN^]YZZX\]\[YYXYYZWZXW[YUX]V[`JJz¡›••—“‘’’‰ˆŠŽ˜Ÿ˜œš˜™š›€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"#*97<@4Eƒ£”†€|vmfd`]ZJ.*74466430+&+)'&')*+66541*/?OONMKKLMMLKJJKLLMIFHLMKGNLJJLMKIGGIJKLNNMMMMMNNNLMNOQSTUXRTWTRTTLRjutr_HFLIDHJHHG8-.4432100.-,++..3iª¢||{TGNKLOQQQPQRSSSQQSSQQSRQRW[\\\]bgfb_]\]XSRRQRTVUXYWWYXXUSSTVWXVXYYWTQOV_eb]]`b^``^_aa_UOFEG@9<4 *XxiJ80@IJDCHIF@??B@:=FECJOKNURIPUKFLD8;A7,.0*)4;=65=FIPRRSUTRTTQPSZ]ZUNFFMQLHPW[Z[_\PKHECBB@=;??@CC@>??@@?@AA>EKIB>;;@@>97;955CHE>>\oO$ !"$&% "AL4 "$#$1BIJLNPRRRTTROPQQPPONNOQPNRQNNSTQOONMMMMKILGCA?=5("#!!!!#"$%# $(#'%.Hbfbehfhjjjr{ƒ|{zƒ~O*(0*())+...))8D4'2>;60)+,-/13446:>AKTRJOPPOOOQS<;^z‚yt‡‹ˆŽ‘‹†‰ŽŽˆ‰‹‡’’•’‘“–”‘••’˜—’•Œ’ŽŠ’‹„˜wOMVPQWZVTRMPUTQQNGBB9;FMLHEHIDAcx]O\\Y\[WXX[^^ZWWXWY[ZZ\[Y[^W\_IL{˜”—™”‘ŽŒŠŒ–›˜š›˜˜šš™€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ &%*74400/..01368;=>>CGsªœtsŠySIQNMPMMLLMNOORPPRRQTXXSQV]a`_c`]]bgd][ZXWTQQTPTYYUVXVWVUUY[WQTTUUUSOLQUZ_`acd``_^_ba^NIBDG>:D6! OxoK4-7GIDHHBA7=IE=85;>ERSILQMEHLD@FB9?D:--.,-6>@84;CEIQUSSSPOSPPTY[XVNJFEKMHLZ\ZX\XNJKGB@AAA?=?BC@<=A>@@@@A?<>LI;:>>=?=758744;EH@9Vr]2 #%'(!'EM6&"%"$1BJKLNPQQQSTUSQPPOQRSQPPPPPRPOQPNOPPOOMLKJKHEA;83)   #%# !!#!&%/Iadafegjkhhq}„}~y{ƒzO..4,/1.-1../1;B3)14,--)+-//023374..=PVQOPPPOOQS@?`y~‚€†ŽŽ‡ˆ‘‘‰„‹ˆˆŽŠ‰‘“‹‘”’‘”“’–—“”•“Ž”–Ž’Š‹…Ž˜vNKSTRTVTTSOQPORUND?B;=FIHHILJB>aw_R]\X\]Z\\\YXYZ[[\Z[^^\\^__Z^^HM{˜’–’‰Œ’“Œ‹‘Œ“’€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€%&'--,458>21IPHJKHGJJFBAEA<:2!!"&!'0+%*2=75784/-9INLMLKNMMMKJIIJJJKKHKNMKMLKLKKNKLKJMNMPMNONMNOPSQRUVSRUSSSSTVUQHN`rvq`KAEGFDEHIFD>25FLMPQSUVWWW[WWy§¤j|ZHNLLNTLIOSPOQSQPPQUVQSRQTY_a``ca_accdb][][VSUPSQOUZYVXUVZZWVXZVRRSSPLOW[\aa__[]`_`daWHIHDFBFDJRVTUUPMQOQUXWUUMEEEEHGHUYWUVWPGFGD@>=<>=?=BD=648:71=EE?CTgqF!#'(,)EN6'$$'(%)5>IGMQMPVTQSWVQQSQMORQLKMOSQTUPNPPORQMKMLIIHFB<5-& "!#'$" &%%;)+1,..*./111.,*2)&'):MRTNMPJIPMA=\x‚ƒ|€†ŽŠŽ‹‡Œ‰‚‹”‘‹Š‘Œ‹‘•–”–‘‘”‹’•’’“’‘‘Ž’”‡Œ‘”†—vMLVOUUPOSQLRUVWTJA?@;>FIHHHINE?`rZO`_WWZXZ]Y[YWXXY]\[]YY\ZZ\[][ILw—‘Œ“”Œ‘“‘Ž‹Š‰ŠŒ‹ŽŽ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€1<-$/55892-9JNIJFFFHIIFCBBAA;+!#)0-*.0./59731.9GNJHKLHHIJJJJILJJKKIJNKLJJKKKLMLILPNLNNNNNNNOPQSUUTSTUSUVVVUQNIK^qup]E>CFFEGIJFDA;E[ba]\[Z[]_a[WWy§¥h}_KPQOORMLONIIOVXZVOQWXQPQSWZ]__cdcffdcb`\XUUUUTTSTWUTVTUVUUXZZ[XVVWUPLU\_`aa_`_]^_]ZTMHGFEHD;AA*ArzW8003:FMG=:@JJA45BE?9:;>GKIELPLCBB>EOI525..47833>GDIPROPQOMURQTXYXXLGECEHHN][XYZSHDBCCBA=<>?A@AED?;<<=9669724;?GEJJOQNOTRSLNUTQPQMMNNKLOPMPSRPRRPNPPMLMLIJHFC<1'"! "&# !'$ %=[uƒ|}Š‹ˆŽ‘Š„‹ˆƒ‹‘Œ†ˆŽ”””–•‘”•‘“—˜‘‹Ž—’‘ŠˆŒ…Ž™vLN]LRSPQUUPQSSTRJA?A6' ",0+(,)'*-.--,.CRKEIHLJIIJJJIEKIFIKKLNLKKLMMKMMLMPNLLPONNNOOOOSUSRSTTTVWUTSRPIFUion_HCEFCCEIJGD@;H[_ZYYZZZZYY[VWz§¥gnlNIILQOMNQOKMTSUYXSSUTPNORTTW\`ddcghgfbb`\YWVUUYXTUUTTRPTYYTV[[XUUUTPMQX\^```aa^_`\VOIDBDGMG>BI25j|^;.33:GMB9:FFA;44:6:9=EHFGEEJQRRRNFENH3/1,,15712?HDMSSOQSRQSOOTZZWTMKGCEFFP`]YWTI?>@AA@A?>@BB@ACB>?>=ALJ?>?=;<5378314>GF;>Tioc;#" $'"*ENC2%/-(("&;KLPROORQMPUTOMPSSQQPMLMLPPPPRQPQNNNNMLJIHHHF:*! !$!$'#!%>Zc_`cdfghjmrvx€}|{„~O)#%%&'"%#""'%"("$)')363/.,*)'&&!(&&+$';NSMKPRSN?A_v€†€}ŠŽŠŽ‹ˆ’Š„‹Œ‡Š’”Œ”””—”‘‘“‘’’Ž‘–•‘”ކВ‹„’oJMYVXVQORQNQQPQQIA?>:=FIHGFEKDCfv[M[\Y[]WVUZYZZXY\\XXZY[]\\WW\\KMv””’••–‘“˜—““™›Ÿ¢ ›™˜•€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€B?AC8.18BGDGHGMNKNQONROFBJF3,1-,05722@HDMSSOPSSRTPPW]^XUJIEBHJHSac\SNG@@CEB?????ECA@BB@?>?@?>?>=COMA>A><::96310/;FH>>UgihH"! (*#.FGB9&/0/-%);IKOQPPQQKMPQNNPRPOQQNMMLLMMPSQNPONMNMKHHGHKI:& !%(!!'A]d]^ddeghjmrv}z~}ƒuF" !"#$"$$""&&&'$"%&&.62*#$%&'&%$$)$%-'"/FTOIPRRP@B`xˆˆŠ‹‹‘”‹…Œ“Љ’ŽŽ”•‘Œ‘“’“’‘’‘“”‘Œ‘””””‘‹‰Œ‹Š“•rQOPPSTRSVVSQPNOPJB@>:?HKIHFAIEDdqWLZ[X\]ZZYYZXWYYXZZZ[ZYZZ\XX]^KLs‘ŠŠ‹”•“Œ‘‘“’“—•””“”•“€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€*56.+9B?)(>KGFIIHHIIGHJEDIKGD>3&  (,((('((&$% )>KIIKIJKKKJJJKIJLKKLLJHKLJKOMJNOKKNPMNMMMOPPPOPPPPQRQOSWVTSRPKDSimfYF>BFFGHGECBA=GY[V][YXWWXYYRVz¢¢‚jp€xWJNONOMMNMLLOSSXZXX[[UNLOQOORUZ^_egffjghjib`b`]WUWWUWUVWUSSVYVVWXYWSPOPU[`a^ZZ[\[UQKC?@HKJC=AJ;'VxjH7.3BRN82>?:GJ5'1;JPGBIMNEEOWQJIF==FE2*-*)15834@HDLRTQSTSQUQPU\]ZWNKGCJJFM`bZPOIAADDA@A@?AAA@>?BA>>?@>>??=CPN@<>=<88742100;EI>>SgfnV+#(#)==<5&(./("+;EIMPQQQRSQOPSRPNMNQRPPPPRSOKORRSQNMNMJHHHHIH;(""%& )E_c]^dceghjnsw…€||~‚n?"%%%&')(&#''$))%&&))$ !#$%%%$%!!('$&>SQJMOPQ??]v€„~~‰Œ‰‡ŽŠ†Š‘‹ƒŒ•‘ˆ„‘ŽŽ””‘““‘’•”“–•Ž“–‘”“ŽŠ‰‹Œ‘Š’•rOPVQUWWVUQMQPNOQKCA?;>GIIHGHNFCbpYR\[Z]]XXUY[YXYXWXY[][YWY\ZZ_^KJqˆ†‹‡‡‘Ž–’Ž‘ŽŽ’‘‹‹Œ’‘€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€'.:9-2B>0-=JHEJEDFJJIKPMLOPOPPO:." ".&((&&&%#(%#2GKGKFHHHGGGHHGIIGKLGIJKLJKMNMKKLKLNNLLLMOPQRPPQRPPRTQTUTRRQOJCNdkcUH?CEGGHFCDEEAIZ]ZXXWVVUUUWPWyžŸ…qky|aHINNLNOOMLORSSX[ZY[[XRNPQPOOQVWY^cdeefhijjfbhe^Y[[XWVTUYXTU[VUUUVVTSPNQY^_[V^YYYPF@=ACJJE@$$NvpM6.6GUK3.=>:JF(%59NTF;CMJAEKNICFF@7@C4*.,)24766?FEJRTSTUSQROOV[\XULIEDJLHM]^UQSL@@HB>AB>>DBBA?@DEB>?@??@?>DPNA<==>;4144004?EG=;Qfgn^4" #"4BB91%"'&$+2BHLNQPOROPPPQQPRNNPPMMNNMNMMNNKJQNLMMJIHLGDC;- )'##,I`b]_ccdfhjnswƒ†y}„f6&-+,+,1./.30))% ##&&##"$#"!!#%&%$##$'((;RSLLLNQ??]w€…~~ŠŽŒ‹ˆ†ˆŠ‰–’ˆ‰’•Ž‹‘”’”—“‹Œ’”•”‘••’’Žˆˆ„Ž˜qGL`TUTSSSSSQQPRRKCA@:;BEFHHILB@aoWO[XVZYWZX[YZZYYZXVZ\^ZWY[[[^^JKr‘‹†ˆ†…Œ‹ŠŠ‹ŠŒŽ‹ŒŒ‹‹Ž€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ *0?C0/A<23AKIGJOMJGHLU[][UNKJJLKKJD;.!'(*($"#" $%!*BMLMGGGGHIJLJGHKLJJJKLKJLKLMNJKNLJLMMNNMMMNOPPQQPPRUQRRPQRROMHPgqdOCDEEDDFECEEE@HY\YVWXYYXVUTOWw™œˆxmp~mQORNLMNNOQSUVRU\_`_[ZVSRQQPORTSRX]adbbcfjkhdilg``b^YZZXUTWYZWWXYZYVURNQX]_^ZVQQSMEBB>AGDABABFC+BptQ4+2@KB-.@;>L?',AC@>@@??@@>DNMB?><=8436427@@CF?;OdfjfB$!$$ 1FE>>0&+0+',AHKMQNKOSPNRUONUQPRRPPPOMJJMMKLLQNKKLLKKLHD?7+&/-!"0Na`^`abdfhjntx†y‚X/)300..519<;/+(#&&**')$#" !"'&&(((+/=PSOMLOP?B`v€‡~ˆŽŽˆ‡’‹‰”‘‰Ž•”••Ž‘–”‘•Žˆ˜–ŒŒ’‘“’‹‰Œ‹„“ŸyKL\VTRQQRTUOQRSRJA@A;>EHHIIHKDDdqXP^ZVXVUYWZWXZYZ[XXZY[ZW[\[Z]\JLv–“‰‹‰ˆŒŠ‹‹‹‹ˆ„†ˆ„‰†ˆ‹ŠŠ‹‹€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!)1CI82;;16GMJIJLMJB;::9582+-.**.258@GB7*%*,*('$"$!&:HHEIIHIIIHGJLJILKHGLMIHKJHIKKNOJIKKMNNMLLMNPOOOPPQRLNPQSUSOJCH^maJ@ACDDFGFDCCB=FX[XWWVUUVWXSNWw–›Š}chvQJPPPMJKNRPLSNOV[^`_ZZWTQPQPPSRRW[]`f^\bhiijikjihd``_[XYYVUXYYXWWWWVRMOUXZ\ZUSQNF@=9?AEA?CCAGG07iuS4/4?H>,/BCED518;BGHB@@>>>@@??@@?AJHA?<9971-0;EHG>AFB>ObdkpQ%'&&!.?:9?@;<;*#2AILMPMHLMQPNQRRSSRSUTSQMOMMLILOMPMJJKMNMIJG>1%*30$ 1P`__a`bdfhjntx~}~‰yJ-*511/.612;3!%'#(*/,*.)""""""##(&$(,))0AOSQONPO;A_r|†€y…‰ˆŠ‡„’‹ƒŠ’…†’‹Š’•’‘š—Œ’›•‹‰‘˜“’‘’’‡„ˆ“nJLWQRTWVSPOMPRTQH@><9>GJHFDEJDCanYT\YX\ZXZVVWVW[[YZXYX\\YZYYX[[JNz›šŽ‹‹Œ‡…†……‰Ž‰ˆŒŒ‹‰€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!05?J7)9>59FKJJII:,&$$%&$%&%$$&('(" &,2;H:( &))'"%#%*?MEHGGIIFEEJIHIIIHHKIJMLIJNJKLKKJKLLKNQOMNNQQRPORRLNRTQPQRPLCJ\i_JADEDDFEDGBBCEKUYSWXUPPUXVWLSzšœy\c€rMIPTPOMLMNPRLNRW[_ab\XXWUUTPSPOPRSW\_\^_`ekjgihcchhd\[XVUVWXVVTTWWVVQNKLRYYURRSLA>@==?@33@A=@948=BIF=9;:8346?GMOECBD?9G^gam`- "#$%(.6<3@=<@/!,BGKLNONJMOPPPQRROOPRRQNLKMOONOOOLMMMLKJJKJF:)+4:9'$#2Va\\]achhinpsx…~~‰qA&+*&&+.-.2/#$))&*01/14.-+(&'((&'('(,01LROKKNRL>Ebt|‚~€‡‘Žˆˆ…“Œ„Œ•‰‰‘‘Œ”“Œ”•’‘‘’‘Ž“ŽŒ‘’Œ†…Ž’Œ“•oJNZTSSRQQPPOPPRRJ@=:9?GIHIJFHAEgnUT_ZVVYZZ\ZYUVZVTZ[WX\[[]]\UYYFN –‘•——“Š‹‰‰‰ƒ€†Šˆ‡ŒŒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"+:F@0/=?08KLJH@) !"!**)'&%&&$(('($)8D@.%&$  # $7JFEHJIHJJIIHHIJJJJLJKLKIJLJKKLKKLMOOPPMMNMMONNQRPPSSRQRRPMMHKWfaJ=DC@AEFCCD@=@IVXQWXVTSUVU\PSx–™}^\zvSJNQUTRMJJMPSSTWZ_cf`][ZVVVTTSQOOQSUX[YZbgedbcdehhc]_^[YYWUUUVUUXVSRVLHOVVTTMLJHECABCCA?>ACCAE8)_{`<:@=:978688867=;::;;;BDAINC7GVJ;6:EC3),,&340*0@IIKSSRRSUONRVXZ^^[VNE@@GMNXYPIKH@>BCB?>=<=>??C>??FD;8:979?DKLMNF@EG=7J`dbke9!###'08>?9>AD@@A@><=A>BDAAA@=@A?9648?MOONJJNIBBE?:I_fdhlK"# ")/=936<835>FLLKKLLIJLOOMMOPOONONMLNONLMNONNKKMMKKMMH=.!'7BC:'(+!5<% 6Yc^]_baefgkmpu…ˆ„‹l6 #%'&&"#.588610674101110486596;KLNLMNNRP;A_s€†{v‰‰Š•Ž„„ˆ‘ŒƒŒ•Ž‚‰™˜’‘•”•–Ž•–‹’•Ž‘•ŠŠ‰Œˆ“nLP\TTSSRRRQQQPSTL@;97?KOLIFFIBDemSP]ZZ[\ZXW]^YTX[ZZZ[\ZXY[ZY\a[GR—’’“•”Œ’ŠŠŠ‰‡ƒƒ…‡†‰ŒŠ†€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€.2+*.4<7;AIMD.$%'(&"!#&"" #0;B7*!!'$#" 'BGFDDGIIIIKKJJJKJIHKLJIJJHJKLLLLMNKKLKJMPPPNORQRSQSRSTSOORKGEPgdI>BDDBEEDDDCBBHSZWXUVZZWVYYTWw””Œ„gTkxYIMOMOQQPOPQQQRTW\`bbaba[YYXSTRONNONKMRUTY\Yabdfecccc`b`WVXVXXVTVVUWQKIOSSSTKIA>>@EMIFCDEC@=?HD*N{f4#368;7326;ADOD4:6??4*((%'+.19AECMUSQSRTTPTTZfcUNVQDAGIFFGHFFGC??@=?A?>?=>=?BA=>BBB>99866:;95325777@KSMNKNNMQP>?]wƒ‚x{‹‘……”„†‘”ˆ•‰ŠŽ‹˜—‘”ŠŽ’Ž‹”‰‰‘˜’‰‰‹‘Œ‰”—qKOZUUTSRQQPMPQSRJBA<:?GGFGHLLCGgnTT\XTVWWTSTXYYYWVX^ZWXZ\ZW\Z^^IQ~›’ŒŽ•—ŽŒ’”‘‹ˆŽŠˆ‹Œ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€%%'.+,;59DNJ3 &*,5FI;.(&$!$-BIOD6.%# ! $>FECBEHHHHIIIIJLLJIKLJIKLKIJLLLLNOLJLMLKMNMLNOPQRORQRTROORIHENffK<@EECDEDDFB@CLY\UWTTXYXY]WTVs‹‰iVivZINONNNPRRPNQRUW\_bdabeea^][XVTTRPOOKJOSSSVVY]`aabcdcb`^ZWVTRTTSTSRTSMJLPQPOGDB@@EJIHGDBABBBAGE.Dvm<7C?8:94,6;6135/,,*+*+/5:>C@<=?@ABCBE>;>@=:9NK>>HOE=BFJEE:3AH<9@<60-,*(,)(*1:BFJRPSN?DZZVUY]aefUJ@CGC>?AJMGDDA:==>>?@;30003579;?@AC?:9<>BFJLJFEAFHKGFIC?BFA>LQLMICGHEIMF?HHA9::7@A@91;E@@@:4111005999BPYY\abdaZ[]LLS]cca_PE@DFDB@DLOGACB;?BDD>53841021-.1.12248:9:LVQJHIJGHGHEFIBA@DD?J_ichgmZ-!! "($ "&-6=ELLLMONNPQQPOOOLNPPONMMPQQOOOPOQOMMNLJHB?.(7@HI;(-GD%3O_J%"%:Zb\]`eeiiimnou~‚ƒŠ„T*(/+23(&+$'(!%(3<7+$"&,-+.5;?HKHFCJJBEflSS]XUWZZXVYXWWXZ[ZV\ZUX]\YW\`UBT„˜’–‘”‘ŽŒ‘”–—™š˜•—š€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"&+,11.9MTI@:7-,3/&)./1112573/00-0424467640.-.)/F: " ,CKFCEGGEEEGGFGKKHIKLMLJIILMMLJIIJKLNMKMOMNJKPONOOMQRPOPPOMIFHZfWD>GJFDEEEE@=>HX^ZUZ\YXXTNYYUh~||„|aZjbLJQJJKMNOPPOPQSUY\]_^bgikjf`bdbbb`]\VUTQRTSPOQUVW_ic`dbXW[XVWVSRQPSOIGNTSJCDFGMSOFDMHFHGCDH>FXS+)_rTCDCIG<;@@,073345=9.,>B7=E:0+9GCDCBBFHIKNNURKQbjebimmlodF>BFTef]\TGAAABD@FMOF?AC>?BDDA813:<>=;::;<=<941/.4;=:>DC@HFBEIMPF>BGA98?HHFEFDJCDeoTO]ZXWWWZ]YVX\ZVVXYZYY[YX\YZ_ZFP~––’’Ž“š’Œ‡ŒŒ’˜›™——˜€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"#!!""%&+,14-.$  !""! """!!!#$!).(&12# ,>IDEGEGIHBHIHJKKLIHJLKIIKHIKMLJKNLKMNJJJHIKNMLKMNQNMQRNLMKKIEUgX@>CDBCCBBFB?@HV][WXWTUXWRQTYgvx|Š‚gYfbMKVPMNOKLOLNJJQUWZ^^_abcfikfecbaabb]ZWVVVSPQRTW[^`_acfe`[ZZWWVRRRQMNHCHTUKEGGNWVLFGJHLMIGE@BK]\3YsN0;C6.5:=C=4>A/0HM819NM9@F:/0:A?9CBGJC<::AFKKXkplhdhqmYG@A?CGN[_VL?=BA?CFFMKFJMGA@A>:9=??<99<>==?FCBCA==@<:6322343:7?IGECAGJA=SfabecllD!'* $#+/!,;>GJ@.!";K=% ;R\J)#!5T_]``^`hljkpsp€ˆ€†K&-+(,*(.*&*% *3:?8,  $%(/8HUPJOIONKGKSNCFFFGD@KCEejSS]YXZYXYXWWXZ[ZXWZZZYY[[Z]^]RAP{†‹Ž‰‡‰‹ŽŽŒŠŠ‘”‘’•”€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€" %"$)+*! ,FJFFGDEJKHHJLJHIKHJKJIJJJIJLLJILQIJKKKLLNHKNPONNPNNOPPONOIIIESfZD/PS73CFHGMHIMGEHPOPLNI75D>22>B>>DB?CFENTVYTHB<::?EHC<@CFFCA@?@DIJE@@DCDEFEB?=68675387VjgbjgeldF..! !" +=DIMPNLONOPPQRRQTSSSSSRQRQLNSRNPRPMNMLKG<+.Ebs~„z~†ˆ‹ŽŽ‹‡Ž“އ‹‘މ‡‘‘‰Œ˜™Š“Ž’”‘Ž‘•“–˜”’‡ƒ‡Ž‹ƒŽ’jGLVSPSTPNONONNQSLA=:CECCCBCDA==ET[XWUVXVSTWWQP_mjo‚†o[^\NMTPNNNLMOMJKLMORTT^]][]`eihfeghhfchie^\]\Y\YWVW[_cfhgcbcb][ZWTSSSQKHJRXQIIKNZ`UIFFJJLLHEDAIRaa=JeJ=JRHDIHGGGDFC>ADNGA@B?86@?30=A=?BH>/18=B:9/18=B:@YgYGEKMFCGHCCFAA>@CAAGL^bb_YK>;BE>>The\ceciqoe]I+#(&!$5>DINPKKRQPOOPRRQPQRQPOPQNORRQOOOOLKLLKMH8&$1?FGC4$*?G7"(BUZF% 7V^[]_bdimkmrusw‚ƒ‰xA!)+',)(,)$&!'.2*" (.=D>1"!'0?WcZOLJNKINF:Cbu…{~Š‰ŠŽŽ‰…ˆŽŒ‡‡’“‰Š–˜’•’ŽŽŽ’‘Ž”‘ŠŠŒŒˆ†‰Ž‡‘”lJPZNOSSOPRQSQPRQF<;><@EGHGCGL@AdiQP\WWYWWXWUUXZZWVW[VUWZXXZX[^VEV‚’‰†‡ŠŠ‡‡Š‹‘ŒŠ‹Œ‹‘’‘’˜€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€2SA!$%',08<=;547=?>855-"!&)&,AFCCGGIJJFGHGGIJGIKKLKKKLIHIJKKJIJMMMMLJLMMMMLMNOOPPPNOOOLJIFN`\F=ABABB@@A@@AIVZTVWUTUXWSVTT_hel‚„r[WULKPPOONMMNNSPMMOQRRSVZ^afilkjigedddcffdccb`a^YVUVZ^adedbc_ZTXYXWXTNIGJQSMGHMR[YJEHIHMQOHDEGNWceE 8VM9BKD=DFE<@?;22<;::;=5-39B@609CC?EM;0@E98MG9BGCLJIRUMFHHFEGEEHKHEC@@CITbkikeWH<=Rechihebdo{„sE"!"=J=+(6@EIMOLLRROMPPOORPRRQPOPRORVVQSRNQOMOLLNI6#!*5BIG?-0AC1 .GWYC#7U\Y\_ebgjkmrrpyƒ†‰q;$/+'+(&,'##" ##11)&)#"-:IL4  )1BZjdOFLILTH6Bbv…{€ŠˆŽ“‘Š…ŠŽŒŽ‹‰…‡‘–“‹‘“Ž’”“ŽˆŠŽŽŠ’’Šƒ…‹†ŽgGOXKPTQOQSRMMNPNG@A<9#&)+05;>>?DHFD>3($)/+/.09954**+-,)3GFDEFHHIHGHFEHJIGFGHHHGHHGJKJHILOIILNLLNLLMNNNMMMPNNOPPPPNIGFL^^F:BEB@?@CDB?=EU[VUVUSUXWSTUU^gek{v_SQKLNPPONNNNOKLORNHEGNPTW[^bdiiiihhhhffgigdce`][ZXW[__aefea]ZRRRRRQOLJDHSSHDIOW]THGMLLOOKFDHNT[chQ%-CD;C@6=?429?EE<JMDALRMF=58FKA=D<286/1;71H^`^N>HOKFEFELNHDH>7>GEBAHQZ^d\NDFKLOC83=KOF;5;FNNGA>LLKLSZXQ=AL[gfZNLOIMURPLDCC>>Sfddie_dinv~tM2;:'$7Y`F/,6BHIINPOOPNOQQNOQTRPPRSRQNRRPQOMNNLKKJHKH8%&0:DIG<(4B?+2KYW@"&?Z^[\^efghhlpssw€‡‰k5#.*&+'&*&!$! *:2''-$"*?UN3!"&+Bay^FIMOSL9Car}ƒ~†‘Šˆ”“ˆŒ’Œ†‰‡‰Ž‡ˆ‰•”Œ‹’’ކˆŽ‰„ˆ‘‰„ŽhGMSPUVQOONMMPQPME?=>:>DHGFCBJAEegPQZVVXWWWWUZ[XY[ZTZUUZ]YXZYY]SA[Žœ‘‘ŒŒ‘Ž‘”•ŒŠŠŒŽ‘““€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€1K9$.120//149=BEGCDEFEB=:)($ !+78=>?A??CFEEECCDFIHEFKJHJIGHLKHHLIKLKJKMMJILMJLOMMMMNNOOPPNMOPQQQNGDEJ]bJ=CECCBBC>???GUXPTSTWUSTXTSQ[hhfo}{eRNMOOPQOMONMPPMMPPKKOOOPQTZafhgfhihd`gccffccffcbb_[\`bcfheb^]YRNQOKJNGFLUQHEGNY[QIJKJNNIFFGJNY^aj[06FG83?OM<:KLPUTTVOLMPTVUU[TIB;6?E<57<;0.11./*8MVO81CPMHIJHGME@GC77EHB==<50<84ALT]dbYOHYfc]XPXcJFD?>Sdcfke_dhjr‚uP7;;6>>G_^A25?DIHGMQPOPQRQPQRSRQOOPPPPSRRUSOMQNOKLLKML=,%+5?FGB7%#8C:%6NZU>!(@Y\[]^eghhkorttvŠk5$,*&*'$)% ! "5;/%*2, *DYN5 ,Aiq^KJLOM9Cbs|‚}…ŒŠŒŒˆŠ“‹ƒ’Š„„‘ˆŠ“’†’“‘‹ŽŽŽŽ‹‹ŽŒˆ‹‘…„‘”lKMPRTSQRQNMMPPNKGA?97=HJHFDDKADcfPU]YXZXXXWX]]XUY[ZUYZYWYZ[UW^UB]š‘“‘Œ‘Ž‘•“Ž‘’”””—€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€;P4(0;CGGFFFFFEEEEECDDEA8+! !  !->FCEHE@EEDDDBCEJHGHIIHJHJKJJJKJHIIJLNMJKKLLJJKLNMLKLMOPQRQNNOPNNGEFHZcL?CDCEECBCCA?FV[TTSTVURTXUQP^lf_eu{fNIJMLPROMPOMPNKKORQONNOQQSUY[``bfijgdeaadgfefdcdeb^_c`beffc]XUPOQPJGHEIRTLGGHTYSGEFHLKNKFEFKT]__ke85PXLMRUVSRNOJHINQHDDGDDA?NXLGC7146=:<<=FQTIE91154,:FLGGLJCLRNCFJ@13<=9<<50'%!%-.+,3IO=147?EOR>;DEW[RML=((67<99DJJNOJIGC?=BKIC=?DA97ANOHF@2)5859??>;- $!!"+/+,6DKBINJEFKO@:9?FHJLEA?CJMIDHMWdebbWJDB?BViid`fjdgoosrW3)/7>47VbK=?DFIJKLJMVPMMQRQQSTQONPRQPRVTOOQONLPJHLJIMH;23;EH@5- #/;B3#9Q[S;!1GZ\^`^dgeeimprrwz…ˆa.")*&*&$($3B@.&),/.%#!/LT:% !;MjrUEMG;Fdsz{†Œ‰‰Ž‘†ŽŒ‡‹‘ƒ‡ˆ†Ž’ŽŒ‹‹ŒŽ‘‘‰‰ŒŽ‡†ˆˆ…‡Ž‹‡‘gJPVTQLOVSMOMMNRRH?>>;>EDBEGHLAFhhNO[VVWVUVUTWXTRTVUTXZYZ\[XYX]R=[’œ•’’””’’’’“““’’‘‘‘‘’“–—€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€  F8/ADEKE?>ABA>@ABCCBBB<4-#!#" ,CK@AJHCGHFEGGFCIKHHJJGIHIKKJIJIJLLLLLLMKIJLMMKKNMMONLNMLNLLNPWUKDDFWbN=>DDCC@BBA@?FRUMTWSNQTUXTRTfn_ZbjoiUHJONOOMNQMKPQMNRQLKNMNNMQX]]accabffb\_a__beeda^`a]Z\`bdb`a_YSPMKLMLKEHRRHHPTUPJDCDGIMNNLJLU_`^`muM#/@BJ\R:>KSL=?J=0=D><8@F;5HTKEB+#3/0687DMEED><:7=CEQL>?D@8819EGFD<=?A@>;99;<4*$$$ !&*089579;@=BHKJEA>GLOIAAKVhndTUWNGBBD?=SihcfigcdltusM$#059;BOYMAFIIKMNMLLLSSQOQRPNOQQQRSQMRXUOQSPOSQLKNMJKIF?@ADI?4+  '1?A/&DU_U:";U\Y\_bchifdjttnv~Œ‰[*%.(()%(*  4@?0).1.,/%%9OR4$ !!(6XtgONK8Cdt{x”Š’’…Šˆ‹‹ˆˆ‰‰‹Œ‰ŒŒ‘ˆ”‡‰ˆ‡…‡‰‰ŠŒ‡‹ŽcCMURPOPQPNKRQNOPC;A;6;DGIHBAGAHdePT^VUZXTTWYWYXTWZUSUUUY\[[U[aPCf’—“—™™˜—˜˜™–’–˜’‘”“Ž—€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€*1%*BKGAFC@ACDCA@BDCA=;:.'!" !#"'9FFGIDBFHECEFFFHJJIHGGHJIFEIKKLJHHJKJILKJJKKKKKJLMKLMKRONKLMMSVJCEDR_M<>EDBB@C?<<>FQUOTURSVUQRTQRgp^TZekgUJKOOLOMMPPOQQRPLKOPOMPQPQUZ[b_`fgb_a[\[YY\_`aca^^_^_a`ab`_[UPOOOONLJLLRRKLTVUOIEEFJMOLKKMQX_b`bozX""0?BFJE@B@99EEKXM57@A@HH@>ED969:=GMC5??<=<<<2;=<91%&" !"$'&$'05:>@@ABKVUJMajdh_PFHHECDCE?=SgecfifcdlsrI''--33?BFJJJHIKMNMLLMPPOPSSQQTSRSSQOMTSTTQMOQPNLLLMMJKIDFEFG;-%%-7>>- ,DS\Q7&@X]YZ\aecilggnsst|‹ˆV% *(()%(*  3@<0)-1/.0-  ):PF."*CfkWNL=Ebu€x„’‘‹Œ‘‘ŽˆŠ‰ˆ‘“Š„‹ŽŒˆŠ‘ŽŒ“”“Žˆ†ˆ‰Ž…‡‰…‰ŽˆƒcEPVQOOPQQOMRSNMMD=A<8?FEFFBBE@JgeOSZXWUSWZXWWUWZWTVZURVYVV\Y[_O@b—ŒŽ‘•–––•˜˜–’‘–˜–“‘–˜’’—š€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€",?EBHHBBAABBA@CA?@A<0''!  #,8CHFBCGIFDEGHFIJHHIIFFGIJJIIIIJJIGGHJIIJKJJJKMKLMKLNMMLMMPPMRYJDGCM\MEC3,48;EMC3413@CBE?78@HI@EEE>>Tfcdfhfcdkr|wO)/>;5679?AFNLIKMMLLLMMORSTPQTROPTURRTUSQQQQOMMNNKINNFKLJLJGE8)!")4;?;,$5ERVJ3,I[\X[]bedijghnsst|ŒˆR&())$()"2<:0),11003''CP@$#/MfcUH8De|ˆ‚uƒ“ކД’‹ƒ‰‹ˆŽŠˆ‰‰‹‘Œ‰Ž’ŒŽŽŒ‰‰‰‰ŒŒƒˆ‰ƒŠ“‹ƒeFOVPONNPQPPNQPOOF==;8?FFEFBED=IhdNTZXWTTXZVXYVV\YTW[YWWYWWYYY^PA^‰’‰‹‘’‘‘—™•““““›–“–›™˜™€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€%6CAAHBAAA?>==>?AA;2*%$(/5@FDCCFGECDFFDHIGGJJGIHHLLJHIJJJJKJIHIJKKKJIIKMKJLLKNMMMLOOMS[MFHCL[O=?DDAB@C@==@GRXUSWY]_ZUVXQOl~hTW`ebVLKLJMQOMOQOPLMQTTQNLLMMLMQW[\`cehlkhgd^XVWUSYYZ_a]\aa`bda_ZUSQNKJLPSILSXWWXVMIECFJMNMHFMV]`agkos}m7(GVUZRQ[VNLPVLEH@7=BCOQ?9EMDFQME;$=:&.;73AALL<7D?DCFHD@?D64238A@6.'$#!#""""  #%%+7?@ADBEIFCLPEBED=@VfcdfgecekqupR;AFJNKJKMMLLLMOONQUURRTQQUTQORSRPQSMJPNNOONPOJKLKMJGF9*! %.7<@9*)@ADF;A@?><<=>><7-$ "6BBEGEEEEEDDEFFFEFHIHIJKKIFHJJGJJJKLLKJLLLLKJIHLNLKMMLOKNNLONKS\OGFBKZO@?CBBC@A??>=COUPS^eeda_b^TPo…kSU^b_UMKKJOONORONROMOSTPOQOMJHJNSW[]afjnnlhfa\ZXUPRUVW[\[[^ad`\YWQOOMLKLNPLMRWZZXTJHFEHMOMMKLS\behiourwn?!=H?@COWG;@IKD7=KB0=22;?6=B0,5/5E>746;<9>51/+)("  ! "  !"#!!##!+&+105>?=DD:6=EGGHCIG@@?>>===<;5.'##!",AJFDDDGGFDDEFGFGGFGHHHHKIGFGIHGHIJJHIJLJJJKLLLKJIJJIJLJJNOMPNJR]REDBJUOB?AABD@@@A@>BOUPU`b]Y\bjj_[|‘qST`b^TLJJIRQOPRNLPOOPQQRRSTOJHIJMPU\achnmgffd`\ZUPSRPRVXX[[_b^WWUPLLKKKKKKKLOUYWPJKIHJNPOLNOSZ`dhlkqwponH%19?AE?7=ND0:GGPOKERG4J^]MKSb\OD4*0+$,68:7=IHIJ><@A>@HD5.169779;=7=F;4''6CQQG3!,CUYY_a`defghhjnqsuy‹†J '&!+)!"(2:>4,-11/.-5<9)!0IE+%2Tl_=C`tƒ‹~}‘‰‹’މ‰‹Œˆ‡ŠŒŒ‰‹Œ’’Ž‘’‹““ŽŽ‰‰†‚‡Œ…‚‰„‹š]CPTRRQOMMNOOKMSOD=>:9AGDDFCEF?HgdNRXVWXTSVYUUWYVTTWXVUZ[VU[XX]PA_Š”ˆˆˆˆˆ‰‰‰ŠŒŠ†…‡‡‰Œ’“’€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€=EBAA=><==<==81+!#$# !!!#!(@DEBABDFEDCCCDEFFGGEGIIGIFFHHGHJKIGGIJJIGHIJJKMNJIKLJKLJOQNJNLHR`UDCFHQPB@BABC@A@@??DQXVTZYSQS\gmddˆwSS]^ZSMLNNNPOORQPSNPQPQSTRTPNLJHJMPY^^cmmfkmkfa\WRTQOQUSV\]^_[URQMLJHHHIIHGKPTUQJFMHHOSPLKLOU[_bfknpulkpR'8HNUQ99UeZBJ_]YYXY\ZVVVUPTOMRTK9//'$-//677HLJJFMJE?;;:;FB90$!0?FQOA-3NZZY^_\cfggghknqsww‰…J%$ ,* (4=>2*.20/1028;3# $;G8#!)>\fBAax‚‰‚‡Œ‘ŒˆŠŒˆ†ŠŽ‡†‹‹’‹ˆ‘ŒŽŽ‰ŠŽŒ‹Žƒ‚Œ“‰‡Ž†Š˜^BNSKOSUSOLKMKNSOE><:9AGDCFDEE?KhbLSWVWWTUWVVWWXXUTXWZZXYYYYVY^NAc‘™ŽŽŒ‘‘ŽŽ‰‰Ž€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ =A?>;:=8=<<<:1#!! !#!  (>NE@DHGECFEDDDDFHGDDGIIIJCGJJIIJKIJJJIHHHHIJIHHJMIKKKMLJKLNKIPOJSdXEEIHOQA@CBAB@B<;;>DOXXQUWWVSV`f_c‹ wOO``[RLKLNOSQNPQOOOOPQRSTUQPPPLIJNRTW\cimnjmnkgdb`QSSRSUVZZXWVRONLKHFFHHGEHNTTQMLONFFRVNHIQTZadfjnporjjtY/$NcVMWSPWSMPWSJHIF@ICBLOG<=0 +$"3.!9MJD>IOKMNHIRVWSTQGGIA:53;29M7+5.+=E?A928@>>9, ,("'/*+,+))*,&$""" !"!!$&6IL>?TdggfdcceiktrT87;9?NHD=4,"#6EIPL>*!9Ua\W\]\bechllhhpxyx‰‡M$# ,*!(4=>0)/4103334660$#-FFFHDGE>Lh`KV[UTXYWTPVXWUUVVVW[YTTY[\RX_PCh”š“’‘‘‘‘™‹“”“’–”“•—€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€(?A=9::9<;84-#!!!" "! !#$" '#"!"5FFDEFGEEFEDGGCFJFHHHHHIIIHHHIJJIGHHIKJGGHLLIIKKJMMJIKMMKKKLLJNMKSeYFFKILL=ADDBAABA<CUL>=ELE9CJA7;E?67HN@2@RM@C3 '%0'+GME>6EFKSULIRPI>55995011-/@JF@ELEFH><561/7>@A8% *&%) +, $/2.*//++(&& !&%"!!6EH>BYijceecbelqxsM*/<>@L>9@HKLQRMJLONLJNOMOUUONRSRRQQRSSQPNKKNNNLKKMNMLLOOLJJJJE>99>CB;/$ !&:JHPR>%$1@O[YZ^a``adehkoquxu€†L !(# #'2=81-/341/12873;8#$%,=>, $.AXTD^~‚€…‹‘Ї“Š‹ŒŒˆ…ˆŠ‡ƒ‰ŒˆˆŒŒˆ‘‰‘‹‹†…Ž•‡„ŠŒˆ‰ŠŠ…„“aCMSMQQMMQQLQONQPG>><=ADDEEA?C>Lg_MUVUY\ZWWVQTVVWXVSVUVZZVUV[XZLBf’›’’‘——’‘••‘‘•••™—™š˜—™š€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€*=<;=>76?95,# #"$"!#&'$!$% *;DHGGECBCDEFCBEGECCHGFEEEEFIHFFGHIHJHFHJJIIHJKHFJLHJNKFHOPKJLLKNMIPi\ECJIKJ?@BBABDF@;;=BOZYUVX]^XZei]b‰¤…XM[aWMLLMLORPPRRPRSTRPPRSSWTRQPMLNHKOSX]cgmoponnljg`XSQQU[][VSPNLJIIFFHHFGHMQOGEHLMPONOLKQSYagijmqrpmlkxm=1>34??BA7:G@/8ECHTMGQJ@L[]XPVd^HF>&"(1+,026BE:3DONLJ@2>@<2/598;ACAACHLDGRF8>>5BXhgfggdacinusT20;?BBAAFMIFMTOKLMMMNIOQOPSROPOOQTUTRQRSQLKNPNMLLMNMMMOOMKLKJLC?CC?:6-!$+:IJPS@)(6HW\ZY[]]_acfijlptwvˆP "'#"%'0:9/),1222*286497.  ''1;7#"!)>NTKa~‡†Š—ŠŠ‹Š„‡ŠŒ‰‡‹Ž‰„Š‹‰‡‰ŽŒ†‹’’Œˆ‡‰Ž‹Œˆ‡‹Ž†„‘ІˆŒˆ‚’cAKVPRQOMNMLJLORNB:<89?EEEDADI@JgcNPZVVWUTUTTWXXXWWVWVVYZWWYVY]MBg’˜‘”““–•’”˜•’‘”—šœ›˜™š——˜™€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€.@<9=?96;)&!  #%""""!"$%$#"+>JJHEFECCDDBBFDCEDBEEEGGGFFEJHFEEEFFJIHHGFGHIHIIFGJIKIIKLKLNJLNLNMHNe]GCLKKFBAA@@ABCA=;CZ_ZZ[\YRS[ZQTWOQWO@A4'(*462+-:CB2;@FMH:14=A?BJKE>JMIF?:=5>QNFX_P?IK?0*097@B<+%*"$# *'$# "$ "#!'+*.429HJ?AWfffggdbcintqW83IfcORWSSVVVWUXWWVUUVXZXWXXVVXTX]NFn˜˜‹‘’‘’“˜“‘‘““–™•”—™˜—˜˜€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€1D?87;;5.  "" "$&!"""""#$"#0BIHGFBDDDCEDCBDDEIKGBHHFEDDEFHHIIJJJJJKKKHGGHGLKGIKJHIJJJIKLNLMOMNNKOgdLBHIHD@@???@??C?;:APXUVXWRPValh\c‹¥Š^Ocj]QNJJKNOOQRSSUPQPOQRQSTSSSQONOOOOOQU[_ccgnponpomicZUX_^][YWVTSRPOQQLKRXWTNGIOQVTQOOPRVZdmqstrommkkjsoN3QYTV^bXVYRUWSRMFHEBCACNK?EJ=;FIA@:%&)+540.027??=59IJDFKJFDHKC65@A;>FHGMU`^[eaKIEA>80**29AWffbdeecfkpvoT85?B@JF53EMMPNOPQOLLNLKMMLPRNNPPONMPRRPPPOOPNOMKLMNLIOOMMMONLIKLKIG=0'!$/8CJJKRL?2-5:513/563,#&"!*>A*#" +8GR`q{s‰•‹ŠŽ‘Œ†Ž‰†‹‘Žˆ„‡ˆ‡ˆ‹ŽŒŽŠŒ‰Œ‹‰‹„…ŠŠ†‡ˆŠ††’Œ]COTPPPONNNMOMMPPF<;96;DEDDFEE>>>@@A@A>::CRZYY]]UT^jnn^`‚œ‡`MamaQMJKMMMOPQRTTQPRSSRSQSUUSQPPOONMLMPUY_^bilkknmnplcZ[`_ab^YVVWWUTUUOOUYWQLKLS\YRPSSSV[djoprttqlnnomnkQ#*L\QFIMEOMB@DIMA@ANK+'GPIMONONLILONPSQMOSRPPPQQQPOOPQPLLOPNMNNONMLLMNNPQOKLOOJIJA0(',4?JNJNRNDCIRXXY[[]_ce`gkgflrtz|†‘l)%&&,&"/A>3/6:537065&'&!#2C5&!#!'4=M`pƒ}u†Ž‹ˆŽ‹Œˆ‘Œ…†‹Š„‡’Œ‡‹Ž‹‰‘ދޓˆ†‰ˆƒˆŽ‡…†‰††’‰[BOSORRMMOOKKMOQMB;=;8=EFCEFIFA@??>?AB@=:=FPVWUZac`cecaVZ|™ŒeMbuhOIKMNPOQSRTVUSORXVSSSTWWTQRQPMMMMMPTWZ[^befhilorqi`]`cghd\WWZ[YUWYVTW^YNKNQU_[RQVXY^dlmnnopqpnqqsoliW+1A;2?G;CF@DH?7:LHOMBLSDENVWZ_a_RDFA*#*11.*&+25*-@F75@AKE?;8;EOWZbd][\VC<>C>HSF<>DOO<;JLMMMNNOMJJMONOPNMOQPQRQONNOONONLMOONPRRONMNMNMMNPPOPNLJIJC8-05LULQQLLRRMNNNOMC=>:9@HGEDCHG?@A>;=@BABCCHJHHID>@Ru’ŠiP[tjPHHIKOMOQPQTROQTTTUURSWYXUSQONNOONORTVXYZ]befikpqmedfmoojc][\YXVVYYWYUSOJKQ\g_USWY`jnmnqttpkinqpplhh^5,@=5ANM:29R`F9QZZTVa_WYWXWUSQMIPJHF4!#+0,/.%%18%0MF56@>CILKKPVVUQKFECA<:9>>I\XMW`S:;JNFLNIK]Q*#2+()"/:'(,$5DG=@WffcfhgedhksrP7ACAB@>>??<:=>9667688587.4@WuˆfQ[rhQJHLUPNPRPRTROPPRURPSXYXVRQRSMMNMKJJKSUVUX`dddgkonjjmvvtpid`^X\\Z\]]`ZTPLMYegaYUVYfruxsopommolokkfcgb<0EHKQTZ[NQW[]SMSTMHID>A?IOG?AB=>HHLB)!%#$..,1)#(>OG::3:CIKIB;HJ>3:CB>IUUX[WWPHITVHDMSLJH@IRTQQPMKMRXZVY]_\Z\^__afknoqs}~}€?($&/+#!$'$"!&7C4" &($"")67' &*.0RnxˆŽ‡‰ˆ‰Œ‘‹Ž•”‘ІˆŠ‰Š‹Š‰ŠŠ‹ŽŽŽ‰ˆ†‰ŒŠŠŒŠ…‹‹ˆ‡…†ƒ„Ž‚S>MQOOOOONNOKLLNK@:<8:?BBDEBEB:Mk_JSXUUVTTVXVWUSTVVTYXVUUVWXVWXICl“‘Š“–”‘—‘•™•”—•”“–™˜—˜˜€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$%000.&%*/21230+!!# $%"!"$,6?HMJCHGFEEDDDAABCCCCCCCBBBDFGGFEEEEFIFFFFFGGFHHHIIGGFFGHGHJJJIIJKMNLKKKMIHKLNdmX@FQNC:?@?AAAA><:7<<;:86549BRm~xiXWloYLKHKRPNORROLOQONQSTVSUXXURQQOPOLKMLHNPOMPX^^a`dkomlmuropqng`\XVXZ[^b_WRSW`hjeZT[fnppsojiousnmngadefjG8_^WZMEMJLMH??BNIB?<55>ECLI>AC>1;PME@,!-.#$*/15+5LI@A5+4CHD7-:<=>FQY[a]ZVJ;7@UficfgebchmxnN;DG@BKC16JNJJJNPOOONLLMNQRSRQSPPOLLMLMLNRPKLQQQPNLKLMOQNJLMNQOMNMKJJIECGMMPRNKNQRRSVX\]\\^^]_fceknmnrz}}‰…J""*0'$252.*%7VI !"'# %).-%#+/+Fy‚–‹Œ’ˆŒ‹‡ŒŽŽŽŽˆ‰ŒŠ‡ŠŒ‹ŒŠ‰†Œ‘‹ˆˆ‹ŒŠˆŠ‹ƒ„‹Œ„„Šˆ†Ž€Q=MUJMPQOMMNMKMNJA=>87@FDCFDII=Lh]KP^WTTRSVVUWWUUVVTTXXVVVWYUW\L@f‘“‘”—–’‘”—’––”‘’”–”’—˜—˜€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€+#!../-"'/430.05:<83*!!!! "&)+5A@>?@@A@=<<<;:;;=@?=;<=DGMaqqgYYou[GILPPOOPPRRSPMNPQPRUUVWXYXUROPNMLLKIJLLKMSUUUVZadglrqnkklmlj_][ZXX\bd_XRTakl`[Y]ekllmmllnqplljc_a`ahM 7YI6@=4CA>SX>7EMM?7BH<2HB/0GVN;6F[WHF:',+"%+/9@07QF39B.+4=DA?CDLY`_XUEA?A?;@UfhfggeccgjtmM9GO=/::/6INLMNPPOPQOLLLMORTTTMNOPQPOONPQRPNNPMMMMMLLKOQNJKMNQQNLKIKNOLHIQTPNRQOMLOTX[[]]]__^_bdinppop|‹ŠR%#  $1AG<970.,"+T[3"''&#&..,.4/?m…‰•”„”•ˆ‰‡„Œ‹ˆ‹‹††‹Œ†ˆŽ‹‹‹ˆŒ‹‰‹‹‡††ˆŠ†‚…Іˆ‘yGLg]LRVSUXWVUSUVWXXWWWUTYZVVYXRTXJ@g“—“–•’‘’’••’“”’“——”•€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€'1!$,02. !/242248;@DC@;5.)%#$'()/:BDEIKIGGHGJHEDEECACCCCBBAACBBBCCDDDBCEFCCEGFGGGGGHFGGFFHIHKJJJIGGHLIHKKIHJKMPLLNIF`m]CDRQC>AA?@?>>A=;;=>?A?ACEEDDDHMS`jiaTQes`JHLPQRSQPOSVSQQNLQVSTUUVWXUPQOOONLKLKMNMNOPNPQUXY[biiknprqpoib\YYZ\][\\Z\dhefc_\_ejkjorqoppnnibacacmV%0TI2684BBLER]HPRFGRZZJBJVSDCD/! )+('+37=,6QA*3@@6/:>=NOQROOLD944:CHDBCBCCDHHJNOLMJIRI,#+.!$)&++/>+2;#5EI>@VghhgfdddfhtoTBHF72=?69JMKIQQPOPRQNLLLLOSSPPRQPRPMOJKNOOOPRQPOOONMKMPPNNOOPMLNONNNLPPNSYSNTPNKMRWYZZ]]^a`_`acefhmrv{~‹ŽZ '&%,,,.6B@:621=A5'FW@ &0* !072++2B`vw–…‰ˆŠŽ…ˆ‹ŽŒŠŒŽ‘Œ…ˆ‹‰‰Ž„‹ŽŒ‹‘‘ˆˆ‹ŒŒ‰Š‡†Š‰ƒƒŠ…‹šyFAPTMOQQPONNLKNQMC==;7=EFFGBCF>Mh[MVXTUWVTTSVVWYXUTUUXWVXUSYSVZK@d’›‘’’‘’‘’’“’’‘”’‘‘””•˜€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€.1&,/2+ (/2005=@??CCCCA?<977:<>BHKLHJJIFGGHHFCDEGECBBCCCCBAEDCBBCDEDEEDEFFDFGHGFHHHFHGEEHHGJIGFHLIDIJIGHKLLHFILMNJJ]l^B@PSD=AA@@?==@<9<@A@?>;9:==848HUadb_VQ\mgOFGKQSTTQQSUROOPNNPPORSSTVWUSQQSQNNQNOONNONNNPRSRRUYdgjllmnpof\YZ\\ZYWY^bgjhffa]aipqkpsqooonle_bfber_, +QU?765=II;-A_\>31:BAGE<:AD@B?>AA>;<>CEHMKIOK>85=LH4-43,(%#)/+$%%.=-+8%6EH>@WgghfdddfghwrW?=83A@2"$5<808EA* !,.)(3:2)%,4BV[`x‰‹‘Œ‰†‚‰ŒŠ‰ŠŽŠˆˆˆˆˆ‰Ž‰†ˆ‘މ‡ŠŒ‹Œ††ˆ‹‡€„ކ›vDDPTOPQQPOONNLMOKB>?86@@=>??@@;8;?>;86201441-:O]a_^a\SXhcOFJNMORTUUUUPQPQRQPRPRSRSVYZVUVWUQRVQONMMMNPLLMMNOQQTY`cddgilh`ZXY[\^XX\bjoohigehnpnkmljjkkha\Y^dadqe4"HZOGHIHQZKCNRQFNMGF>9?@?@?OQ=BD@7DJEI;!&.)$(,0<7.>M:).*(?937;@ACB?;;<43566457BIGCKMF?91-(6PJ3,3113(")*,+(#!)/&!.&7EH=AWgfedccehjkxrN.0744DA67FOQMJNPNNPSTOLJIMQQONNQSQQPMQONOMIIKOOPOONOOOONLKNQQOMMMLMONNORRRVUNNPQSTVZ]Z]^_bbabcdhlkilrv|…i+%$":73.+)./2AJRcw‡“ˆ‡ˆ„‡‹Š‰Š‹Œ†‚…††‹ŽŒŠŠŠ‹‰…‰‹‹‹Œ‰ˆ‡‰‚†††‡‡ˆ“c;EPRPPPPPONNNLMOKB=>76>ECBEBCC:Mi[LWZUTVVVYYWVTTVYXVSSVWVWYWXYZL?Z„•ˆ‰•—˜—Š‹’ŽŽ’”•”‘“”‘€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€-1)(10+ "/0/6=>@DEDBC@ACDEEEDGDDHHFFJIFEIJIEDFGGFCBCDCBBBBCCCABCDDDCCGCBEFEDFFFGHGEFIHHGGFFFGIHGHIJIHHHIJJKMOLMNIIMJHXjeKBQWG?@?@@<9;=<:977643468F\fd\Z\UMUbZHHLNLNPTUVTRQURNOPNNTTSSSUWYXYZZWUVYWTRSRQRUNNLJKOPOPV^ehikljf_YWYZZ[YXW[flionkijkkilkighkhd\[[`gefof= ?ddPMZN=GFBJC<;BOL:;DB78GBIP=>IJ@DHJRK)!/1/-013-=L7&-'%$)6<7>@@@A?:426421/147@E:-6IE3499'2SI+/3131%"'&&)*())$%$"",- 7EG=AYgfccccdgkmwnJ/4833?=49FNPMFLPOMOSURQLHJPQOQPRROOOLNONMLMMLKMOPONMNLLLJIKONJJMOOPPOOKOTSTUQNRVXWXY[\^]^`a`b`_agiinvw„€…‘p4!>?;9;NUE8BNM?<:8650146762//3.$/GI72MfYJTXTVXWUURRSRRSTVWYUWWTVYVUTUKARuŠƒ…‡‡††‰Œ‘’“’ŽŒ–˜’€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€*5/-2%)53493ABDFGGGGFHGDDGHFIGHIGDFKEEDDDDEEEDCBAAAAABDEFFFECBBEGFCBEEFHFDEIHEFJJGGIDIKFDHIGFJKHGJJHHJMJIKJKWhfOANXJ<@?=>??@@;8;??:6/.,,.4;@Vs€s^W\ZQORNIJIJJKMOQSTTSQRQNQSQXTTVUQPRV[]YVWYYZXY\ZURSSZ_\YXXVSSSTX^cfddaYTTVVSRTTRWag_cilhbdicegffe`ZW^`bfe``dH)WhH0351EH9D@:7@DVE+'0*+2002.275.()--(-'(3108EF=ADCC@BBAADEDEDEIHEEHFEDCEIIFDHHGHIIKIHIIFGIFGHKLKHIKJKLKLMJGXhiWAJ\M<=A>=@>?@<79@<1-/-.5>@EP]u…xaVSNLMMLIGIJJKMQSSTUVSOPSPNPSUUVWTRVSV[]][XV[_^ZZZYZ^\[\[ZY[YWVVXZ]^adc^YVTSRVWPNW``]`cb`bcabegfda]Y^bdcbb`\fT((GaV@=::;CH:2>7FUB*0/+)++)(+/1002.'#(+))/227FJ>=UhgddcbbfkpxoK1:A95.'&4HNLNMNNNNNNORUOJMLKNNPTTOMQSSMLNNNMKLKJJJKLMMMNNLJKNNOONNPSUWSQTZ][XXYZZZZ\^]\]`cdca`cgjlmoqu‚q1 ;E-&50$/5/'-0% +0/04@NM>@OLGF7K…sq™Ÿ„„‚ƒ†…†”Œ’ˆ‹ŠŠ“‹‹Ž‹“˜‘‰‹Ž‹‘”’„‹‰Š…Š™‹Z>@<;??A=<89<945138DTYVVe~Ž€cUQLJJJIIHIJJKMQSSTUVSQPPTVSSSSSSRRUVUX]\XX\XY]_\[]_\\]^\Z[^_\YWWXZ\_`^XSQRRTSTQLOZb_]_b``cffffc^[[\`cecbb_[eX,#E`[JHGIGDEGJNLPQKJLMPPLIIKNLILIRSKIEB6*%! "%0/86%"*-.2('-$#5D@3--.21*/-+12+&&.735HH,5;?9@L<$01/--,*+(,/.+***,,++.2317EJ>=ThgbcdddfjmuoN4:=0)$"$2GQNMLLLLMMMMURNMMKLQPNORPNOPMOSSNNOOJMNMIIJMLMNNMLKJIKLMORTTWUSUY\]\ZYXXY[]_^^^^_`abbehijmquv€ƒp/5@2++  $/:1$&)"'7842106==9CBDE14Xˆ…z‹¢£›Ž‹Œ„~†Œ†|„ŠŠ‰ŒŽŽŽŽ‹Ž‹•“ŽŽ‰”’ŽŠ“‰„š«€H?ONMSPQQOMLMNNLMNJA<=88>DDDEFCD>Sj[LV^SV[XROUTTUVVTQRWVTSTVWYVT[ZCBf†“ŠŒ‹‚„…‡Š‹‹‹‹’€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!02 "''5604889>BBAABBCC?@BBDFCFEFGGEEFHIHGFFECDCBCDDB@CBCCABC@CCCCCCCCBDEEEEFEEFHJHEEFGFIJFDHIGIHEGIHFHGHIJHHHIJKJKKJFTek[CGYM<=A>=@>?<;99<=?DCDKTTFCNl…™ŠhUQMPNLKJIHGLLNRTUUVUQQTTTUTTUWWVVWUUWZYZZYWXZ\[[__YWY]``_`bbb`^][[Zba[SNOTWQPSTMKU^`^adbacdgec_YVZ`befcba^Zd_5>VVONID@?=;;<>E@;DMNMTNHFJJE@?FK;*+4=9.+%$,:8"%.23,-()=??/(043.&'&)12+%"1;55DE4-0;>DM?()+,+-,-/*,.-++/4.+*,.-,,8DI>=SggaceffgikupO354%#$(5JUROKLLLMMMNRQPLJMOLONPRONOPPPPOQUSLLLMLKJJIJMNKIIKKLLOSRNQWTUXZ[\\\YWVVY[\\\^`a`_`aecdfloqpx€„Žm,2?5,"$0:1##'!5C7002-'(),SlZIPUSXWWYUPVVTSWTPRTVSRUUVYTTZXH@[€‘ŠŠŠ††‰ŠŒ‹ŠŒ‘’‘“€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"0/!&05313448>@??BCA@BBCECEFFEEFGFEDEFHHGFFEBDEEEDCBCBDB@@@?BC??BB?@DFEEFEBBEGGEBBEHHGHFGHGEHIHDFJIFGGHIKJIHJIJIIIKIFUgo`EFVL;=A?>@>><968=CJRPKIPNBAQm‡ž“nYTOKKJIIIIILLNRTTUVWTQSUSQUQSVWUWWRWUUZ][WVUXYYYXX]]\]_``abbddca`][[\ZTOOQRMOSSNMU[Z]`bbefdba_[XX]cdgfcaa^Zdg?5GLIF?<:>A<64=>64@NPFCLHAA:,')68)!"'68/00&+3'$+0104(3@@;-*2550""#*00*&!155==796IKHKK>0:Lf{†”žšŒ’«¶¦¤­ªž˜œ““••ˆ”’‘•”‹‹ŽŒŠ‰‹Ž¥§|B?QMPQLLOQPMKKMNLLNI@<=68?FFDDCGEA=<@>@?;::;=DIMPNLQTY_p†¡™u^WNGIJIHHJLJJMQSSSUVWURTTRSVUVUTVYVVRSX]\ZYX[]\\Z[ac`^]^^addfgcaa`_[\[VQPQQQOPQNOX_Z[]^_dge_^[XY^bdegfcaa_\ahI/AIE=:BAQegeeeccejmxqK'$$*&'4FKKNLLMNNOPPOOPPQNLMLJKMOQQNOSTQOOQRNNNLKKMNKLNNNLNQNOONQVVRWWYYYYWWTUWXYY[[__`aacdeabdeimswy‚†g'.B- ,92# $!!  >@>>@=<<;DS_Z[XVVUW]u† ž}fZKLMMKHGHJKLNRTTUVVTVXUUUSXVTSRUWVSUWY[][XXY[\[]^[^_`a_^_cfjkhddb``a]VQQTUTMNSQOWa_\^bccdd`]YW[beeegfbaa`^^eO!+AIB;57:7/++-117B94;.76*.02D6/.&&:?5.-3301)"!&/53%8,%9B=;3+)3:-$,0,,-,/14:CJKIHHEENL7.+/022.))$&)*,---/--01/+*8BF?>QdhgfdbadinupM)$#*&'6HMNTJJKLMNOOOSROPRPONIJPQNOQQSRRSSPPRQONNOPPMJIKMMMOOMOTSPRYWWXXYWURUVWXXY[^]^_abcdd`bcegjnqx†e&+?- '61$"&"1IJ@;4379?GKIIJIFEFF>537DRc𙦰¦šžŸ™šœ–’˜—›¡›œª§¢¥©¤¡Ÿœ•™–”›£‘g?FLPQPRQPNLMOPMJMLNQLB<<::@DCBCCFB:QgVGUTSURRYVQSQTUQPQQOQVXTSSQZXXUTHCe„‘Œ‘‘’“’‘އ„‡‹Œ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€1.,10121/2578:>@ADDDDBDDCBACEEEGGFEGIHHGFFGHG@CEDA@AC>=@CBABAACB@@DECBFFCBFGFEDFHIHHJGFHHGGIHHCDGIGHHIFEGIIHGJJIHIJJGR`ibJHYT:0'(16-%*1/*/77PchefedcehltqO,%###&4FLMPJJKLMNOORNOQPNOPMLORPMORNRRRSQPRTQNNQQPMNOOMKKOSOPPRVYYWUVXYXVSQUUVWXZ[\\_bccbcd_`bejllkv}€‡e&'7( &41&$($0JRNKMEFLMLKGIKIDDHKJ@=;0387DTbdm}Šž ŸŸ£ ˜”ž“‡ˆ‹‚}†‘‰‹“•––“™Ÿ Ÿ¦•c?ANMNQNOOLMMLKKKMMLMOJA<=88>DDDEFE@9Rm[LXXQTVTRPSRQSUUSRRSUWWUUWXWTYVXL>T‘……ŒŽ‘Œ“”‘–’”‰†……‡€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ /++22252142/39@DCA@ACEBBBACEDDEEEDCEHFEEFEDCDACEDBABC<=<>A@@CCBBDDCBCBCCCCDFGFFEDGJIFIIFGJHFHGGJIDEGFJHGGHHIKKKIHIKJHR_gaIFWR<=A>>@>><8:<:;??FC=98?Wsu™¢zjRJIIIIJJJIJLPRRSTSVUTVTST[[XX[XUXZXWXZ[ZXWVTV]^\\Z[]aba`abghdabbaab`YSRRRSTUPJNY`a``__bb]YWY`fhggdfeaaccadf^4!/%$;1&5(1?.0--?:'.2&)-0/-3=3-;<) *9/*//+-.20% "$)-/'49*,AEFHC92'!),)',.,+)*/-,.1/)')$,0/.10.8AE?>PchdeffeegivsQ-$"#'+7GPNNKLLMOPPQPNRSOQSMMNONMOOLLPPOPPPSQQPPONMLOQQNLMOORSTVXYWUVWWWVUTTWWX[]^]\_bdda`cgbdfijloqu|€‡d'"-!(84% $#!$DTKELJFINJEHLHGEHKJGHIDI;0644-887BFCFWaaf’Š˜ŸŸ ¨¢…œˆzwuw{{‘ªÁ³`9ADBAEC@CCCDEDDFIHGGGGGFDJKIGIHGHJHGGFEEFIJJGHKKHGKKHGJIESflfPFTO<;?>=@????88>4##3YtrŸ£…pTMLLKIIHFCGMPQRUWVVUTTUWYYTRTUUW[WWYXRRWYXXWVWYZYXY[\]_abefeccddbda]XUUTNWQLMQQV^ac`[^`][YZ^cddehfccffa`bacbA '3$"9/.2&9;)**.?6'10*,%//(5:.*/94%%20(+20-1442+$ "%'(4@7%(9@8..1+(.4=>><989;CHKT\ekw…Ž•¥¢•˜¤§¥¡™yQ:=IMNNMLLMNOMLLMMMLLLNMGA>?99?DCBBBHB8SkVITVRWZVWWQOOUVSSRSRRUURRUUTWWTTUK=lЇˆ‰ŠŽ‹‰‹Ž‘““˜—•””“€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"0, .4122222333:@B@@ABCCBBDCBCEEDDEGIIIHFDCDDCACCCBA@@@>@BBAABD@BBBBDCBCBDGGFDCAFJJGFHLIKIHIHEFIFEFGGFEJIGHHHHHGJKHGJIFSaghTHTR>;?@?A?@?;46<0 &A_sq~œŸˆw]PLIIJJIGHJLMNPSVVWXXWWXZTSSVXVUUW^ZSUWWZ[YXXXWX[^\ZZ\_abefgfdcdfc_^]VSTVRUVVTPT`b^]]\\ZTUZ`cddddegihc__b_cdG  ,!1,/3(56*'-180)2*00!*5,.3%)+)%%-5.+-/-/32032*$$&("%28/-9A:48??>><999878:;;7200/+)**'$&*,*(.-*+,)(+%&--&'.0,(&&')+6AC?>LbcbbdfdcgmtpO/)$" #*9JOOQPNLKMOPPRONNNQRONMMKKMONTQOPSTRPPNQTSRQNQPPRQPQTROOTURQRSVURSTTTYXWXZ\_`_`aabdcagddhjkmmv~‡‰Z#):5&#*)4HMLLKIJJJKJKJJJJJJIIIIKKIHGFEDCBBAA@@@<;:9888958;=AFHHQ\hjiuzq^RC=@GKLMMMMLLMNLNPPNLLNGILMHA==67=CCCDDGB8SiVLZYQSVSTXVTUXTRTSQUVSSWWSTSWWTUVMASu‘†Š‘’Ž‘‹‹“Œ‰Œ‹‹’€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!.)!06444333455:?BBB@@CCCDEEDEGDDDEFGGFEDDFGGEC@AAA@@@A@@@AAAA@@BCAACEBFEDFGFDCGGHIJJHFFGHGIGFGKHFFGFEDFEEFGHHIILMKKMMJW`ejYGPP>8=?>>=?=:6<@/ $''''0B\oq}˜šŽŒhUMGGKLJIIJKMOPRSUWYXUSSTYWUTTTSS\_XV]]Y\]ZYYYXWYZZ[^`a_]ccdedbcgfbb_WSUXUXYXUQU_ebcb]YWSV]defffdafigdcef\bhO!&#!,#0/,;9.,15;/'/+67!%5) '#43 4=3+-/,+14/0671+)(%# %,/8@A?:9::Ncdda`abbfkytT2,)%)'*.:IMKMNLJIKLMMMNPOMOSSMNMNPONPLORQONQSQSSPOTUOQPQRRPRUSSUTQTWSSTUTQRSSWVX[]\^```_^adfegbcgjkort}~‡‰Z# '43%"+-"-IULJNMIHIKLLKJHJJJJIIIIJJJIIHHHIIIIHHHHDEEEDBA@=;;<;99:8:?>9=@:=;:;AEIJLMMLLKMNNMLJKKLLKLMLF?;<66=CDCEEC@;ViRHUXPPTQPRRTRTTSUSSVVWVUUUUSVWTVWQGFd€‘ŽŽŒ‹Š‰‹ŽŽ’’‘“’€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!-'"16534454445;?BDB??C@ACDCCDFBEFHGGGIFEDDDDCABBBA@@?????@BCBBBFDABCABGFFEDDEGGHIJIIGFHJJJIIIJIGGGGFFGGIHFGKKHGJJJJLKIWael[GNO>6;@=<;>?=7;=/&/6965:GYkn}•—Žƒm[RHGKKJKJIIJNQRSTWYYVTTTSWYVPOTXTW[\ZX[^^][Z\^\XXYZ\^___dddfggghddc^Y[][YZXVTQS[`b`\ZWSTZ`egffgghkjfdec^]biU)$('*$0)+<7*20-0,*2/3;+*80(.5=?:@:7:;;<89?EDCDDFA:UfRHUXQPRQSWXSRVVUVUTWTUVUWWTSVVUWYTN@ABB>@EABCCDDEFBDFFEDEFGFFEEEDCCCBBAA@@;>AA?>@B@CCBCDEGEDCDFGFCEHKJGEFGKJJHFEGGGEEEEDDFFGGDFIJGFHIHIJJHR`fl\IPSA8>B>=>??=67:0%)/-'):JWck{’’‘ƒmaYMHIIILJIIKNQQQRUYZXVUTXVRPQTVVTUZZX]_Y]\ZY[_^Z[[[ZY[_bcefghjjigggb\\^ZW[[XUPRXZ\XSUVVV\_cffddfjlkfdda\_biY0!*)&",3,+0,(60#&5;17A<9?>;<>=;:=A<4,-,+,.//,../372)$!!#!#.:CCBCCG@;WjVNXWSRQPQSRQUYROTSNSUTSWVUWSUVUWXVSEBgމŒ„Œ‘‹ŒŽ‹ŽŽŒ’€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€".&&2322210/269?AABBA@D@AAABCCCFGGGEEDECCDEEECBCBBBBBBA@BDCA@ABEBDE@AEE=BGFCBDGHHGHHHGFLKJHDEHIKHFGHGFEGFEGHIIIHIIJIJIIRbgj[JQR@8>B<=>=>>77>4"3ESbgxŒ‹ˆ‚me`RIIIHLJJKMPPONRUY\[ZWVQV[\XUTVWY\[X[^^^ZYY[\^a]_`^[Z\_`ehggijjmkki_XWXZ[XVUSRTY[[TNSZ[^`chhfdedikhcaab`ag]7'*&(+02,#%/A=515=@;6:;9:<;62;>9:@;.,,*+-,+0.../11.**#"%# %/881*((#  !"""%((')-.+,-,+,.,()-))//)+1-*+*()-3,(*+'$%3CE>=PfdfcbcddhmvrV5*.-*)116HNJLPNKJKMMMLMKKNPNMLOOOONLLPPOOOOOOPOONNSVSQPPRQPQTTTRRSNMRSRSUSTX[XYYXZ]\Z_``^_bdefhhedkpooz~ŠŽ_'$! (34(!!#2BNPKHLJGJLKIIHJKLJJJJIIIIJJJJJKKKHHHIIIJJKKLLKKJINLKLKIHIJEINLMLGEKPPKIMRLMMMKLLNNNLKJJKKJKMLF>::45;AAABBE>;YjVLTSSTUWWVTQTWRPUWUPTUUSSUXTUUUVWWVL?O|–‡ŽˆŒ‡ˆŠˆ‘Œ‡†‰€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€+$(5444431149>@ABCDCBCCCCBDFECCDEDDDFGGGFEDDCCDCBBBB@?@@AAAAAACADC>@EDCBABEHGDEFGGHIKLHGIHDEIIFDBDFFEEIGFFGFFFGGGHHGFFUdfi\JOQ?8?@:=?;@@86<4# &$':HUedt…‚Œ‚oheVIIJIKMLJKLOQRNORUXYYYSUX\ZWVYZWVXZ[\\^\\]^^`d`aa_[Z[]beijiijlkikjd\ZYZYTRTTQPXXXSNRZ]bbdfhhfefhjhc^^a_^ea@(33:89>:26>><=<:76:99<==<99==95331.,,**-+*/0/01/,**/-'#$%$"&'"!" $$#""#&(*,/-++-/./.+,..*,,*,330/,+)(''((! ! 1BE<;PfcaacdcbfksoX9/54.*437JQMOSQNMNOPOJNOMNNNPSQQQONNNNMMNOOOORKLSSPQTPOOPPOPSQOQWTKLTSTTVWUTWYVSSWZZYZ^```bdecdfffkqqo{‹a(%!(14' "$/;VdOIRVTRRSRRSROSTSTVYUQSUTVXTUUUUUUVXWF6TŽŒŠŠŒŽ‹Š‰‰Œ‹‹‹Œ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€+$*5321232249=BCAACDCDDDBBDFEBCEGECCFIDEEEEDCCCBAABBA@?BDB?=>@@CC@>ADDCEFEFHHGGHHHGHKMJIKJFFIIHFFFFEEFHJIFGJJGJIIJIHGGUbbg^MQSA:BB;@B<:=87;2$!()#)@NS]bqz}‹ƒrigWIJLKKKJJKMPSTPOOQUY[\USUXXTSUUWYYY]_[Z[\[]__]^__^\[[[cbdhihhijjjhec]TQUWUSPLLXTNNUZ]`ccbadgfdc`affcbe^\ddE ,>CB>888:;3<9637>;:=;??;3.41/(!#*)#+-*)-,*..,-11-,.,1/&""" & #')'&&'.+,020./00.+,//,*,.,)%%'&'&" !"!$*-2CF==Rhd^_ceb_cjoseOGJD87?99IOKNROMLLMNNLPONQQPQSNQTQNNMNOOOOOOONRRPSSPNNPPNNPQQOPTSNOSRNPQUYWSVWUVZ]\[[]ab`_`cfabfhgimnq}‚“d,&")14*'*(2AQOMJIMNKIJKLLKJIGHHIJKKLHHHGGFFEHIIJJKKLMLJHIJLMJNMIIMMILPJFMOJHLJHIKMMMMNNMLLMNNOOMKKKLIKMMG@<<;;@ECAA@@;b˜ ƒŠ‹Œ‰ˆŒ‰‡†‡Œ‡†€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!+ *000210/26;>BBCDDCBACDEFFECBFFGFECBAEEEDDDCCCCA@AB@=>@A??ADD?@DDACFDBCDEFGHHJJIGEFIKJHHIIHHIMJHGGFGIFEGGEGIEEJKHHJJGRafj_JHM=9>=>C=7;B1#%(AOW]_nwsw‡„nlm]JFHILLKKKKOQPVPOTXVWZZ[YXZWSSVPU\ZY^`^^__][[^Z\_a`][Z\`bfkkgfohffb]YVUVVTROMLSNMV]\\a_b`_cffhiecdfea^^bdiP$(AIA85;?<:;?@@>:86510/..+'$$!"&)+&()((+./,01/153--/10-#)(%" !%(('(*.-)%-/.*,21*-/-)),+'$"  ! ##"&#)''*-3;=:@H@:Qhfbdfc__dirncZ^f_PWUKGPPHILMNPPPMJRNJLPMLQPNNQRPMKMNONNOOMNQSSRQSTLKLNNMNPOPPPQTTRPOSVVSU[YTWZUW^^^[`d__dcabdgjkkknvyq4" ""()3-'%&'0@OOKIKJIKKJIGGHIKKIHIIIHIDGJIIIJIHIIJJIIHHNMGHKJILMNMLKLMMLJKLLJHHMNJJMNLLLMNLMMJLOOMMLKMKIKLF><<77:@CCBAD?=ZjSHTSTVUQPSSQSUVTSRSRQRTVUUUVRTXWUTSTTN@;_‘ŸŒ†ŒŽ†‰Œ‡ˆŒŽ‹ŠŠ‰€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!*+100432359=?@@@A@@@@ABDEEEDCADGGFDCCEEDDCCCC@@??@BA?>ABB@A@?AABBBDEBDCBEGIGEHHHIJKJIIJIGGHHEEFDEGFDHGGGIIGFGFGHJKJIHO_be_OMN@<@>;=;;A>89?2#$(BPUW]jrosnhi[LIJIIKNMLMLMRQSQOOTVVY[[[[YWWVSUZYX[_`^^``^\\\]^]]\]]]`beijhhieegd^YTVVUROMMMPPRY_]]a]abbefddifefggd`_bbiV*#=H@=>A?859241)&()'(&$#$%%%'%""#&&&&()(),//.00./11-120/0+"'%$%'))(.241-+++,-,+-/,'&&" "%)-)(+)(*++-1112209AG@;Qgfbdec``dirhVKOUVZdXTWQGFJMOOLLOOMMHIOOKMSUPQTQQQNONPONOPNLOPPPRTUPNMNPQPOQPPRRQQSRQRTUVWY[XTUZ^][^bbbea`fdccceiklnx{€x:!!""*4.%"#%1AMMJJNMIIIIHHHIJKHGGHJJKKLIHIIIHIIIJKJJJJMMKJKJHIJJJKJKKLLLLMMMJIIJLNLIJMKLMMLIINOLLMLKJIIHLOH?:9779=AAAAE?;VfPIVXTSTTUTPSQRUUQPRSUVSRTUUSPRWWVVUWWTMA>_Ÿ‹—–“—‹††Š€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!)-22255679;=>EDCA@???DDEEEDCCDEGFDBABDDDCCBBB@@@?@@@?=@BBBBA@ABCCABDCCDFFFEFGKLLJGGJLLJIIIHGFHDGHEEGEEGFGJFDGMJHGIIHGTddebTPM>:?=<>>=>>96=3$ANRQVdplirwqde[MJIGGJKHJRQNSTTRONPTVWX[\ZXXVWSRV\\\_][[]`_^\]]\[YYZ[]`bdhhiklhhie_YRVVURNKIIORV[_][]]bccddcchfeegheb`a`h_34?8421,%&,)&" #$"!!$'*+#! $&'&#$$$&*,++,,,,-//--)(.1.*-*'(,/0/-.,)(('#!!!!"!"$%((*,.--.31.,,**--*# %-0.8AG??BAFNOXZQKKHMRPIGMQPOJJMMPTSNLOSRRTRQPPONPQOOOONNPQQOQRQOPQRPOPQRQRSQQPOQTVWZ[YWY\[YZ^`ac``dddddefijny}€‘€B !"!&-0,'%&&.::56:@CB@@G?;?>>>=86<20MUVWY^ceforlfg\NFFHKHMMMPPORWSPQOMOUUUX[XXXVXVTWZ[Z]^^^^^^]^__`_][ZZ^bdefffhjgghfc^XRRQOMLLMSXZ\^]ZZ]bdcbcdeeeddegea_`_ie;*0+('($!  &!"$')+,,*'##%'&%$$##&*,**+,-,+-/./,*,//1210/-+)'#&%" !"&'&((),/0/0,,-///,+-3/))++-1&(2316AG?@Hhˆ§˜œ—›¨©ŸŸ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!'!386789;<>>>=CBBAAAAAGGFFFFFFHEBDHJHECCCBBABABBBAA@AAA@@?@@AACBAABBBCCCDEGHHHHIJKLLIHIJIGHJIFEIHFJHDFHGGEEHLKDGHHKOLDO`aefULJ@<@>;=<;><76=09RPORXY^`cjnj``YNGFGGIMONNQRQTTTQONPPQPUXYZ\YUVYYWV[]``_\[[]_[]^^][ZY[_cehgfhecefec^WVSNIGINQW[\\_^\Z\aeecdeedffdegfb]_aihB"$$#$%%""#!"$%%'*+'),/00/.3.(%&&%#%%%$'+,+&(,..,./,..--)(+$$$$" "!!"!)+,-0465224675311/,+,--,&//(),.10,'0>>QcdbbbaabfhpkI2<:2=ABEKNJIPNNOOLIMSPRPNOPQSORQPQPPTPSOKNONQQNNQRONOSSQNNPQPPRRPPQQORRTUVVWYZVW[\^_^^bdeeeegefgfggikrrzƒ“ŠS!#!" !!%2:1)-0.&!"%.:CC@AGIGHKIIHJJJJIKLLKKJHJJIFGHIGKJJIIIIIIKLIHJJIKJIIJJIHKKKJIIKMLKLLJHLRKJLMKIJJKLKJKKIILIKLE=::89<@BBBCA;=ZfQJUSQRSSTUSSUVSRTVVTVVSQRTTUSTWYVUVWXSTXVLB?LYkŠ¥«¦¢™…~“‘”€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"&$7;9;==>@@AAADDEEDDBAGEB?<;:9989>EHGEDDCCBBBBECBCB@?@===?@@@@BBAABABDBCDFGHHIIJLKJIIIKLKJHHGFILHDFFDGFCEIGGHHFFGJLLIGRbaegVJI?;?>;>=>Qada`__`begvpL4<;-/716FNJJONLMQOJKQKOOMPPMLQRSQPPQQPSOKNNMPROMOQOOQORTTRQPPRPOQQPOPSQQTWWVUZYTU[ZVZ_`cc_`baegijhhikqox‚\*$##" (0--471*+--)$%'-6?A??CEGKLJHHIJIIHIJIIJJJIHIKJIHJHHHHHIJJLIIKKKLKJJIJJKKKIJKKKJKKGJLMMMKJJMMLNNLKLKJLMIGLMJJIB<;<58[ePKWTRRSQRRPRQQRRSTUUTSRRSTTWURSUSSWTURVWRQOL>;ETiƒ”©¨¡¡§¦žœ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#&&:><=@@@@ABCC?ACDDA><0-*&" #)1:CHEDDDDCCCC@@ACBAA@??@A?>=@BBAA?AGCDFGGFHIJIIKNNKHMLLLJFFIHEECADHFKGFFFFHKKJIIIHHHRb^ah\RN<9>=>95<2'HVNNQSSW[^fhc`YQJJLNLLQQMMPRRQTVTRPPQQRRRTTUVZ[ZY]^[Xa_]YY[]][[\[[\^__aabedbcbchjif^TMMLKKMPSTWY[]]]`ccffegiffkkfehgb_Z_dgQ&(&),.00111.+*((+02478778:71+(*+)&&''%%'))&('$##!"!$&&(./11100025992+,33454320/45311320.//.01.(+,.,*++)*61(,,&%2BF=@Q`c_^]]_adennR9@>+ )*)3DJJMOLMPOLLOOQNKNSQKOQRPOPONRQPNMOPONNMNOQRRROLMNOOORONPRQPPUTSSVYYVX[XW\\[a__cb]afcadhijjmolmy}‰f0$$##  ""09:2/133/)00(!!&/9??=?GJHIIHHHJKJIIHHHGGHJGHIJIGJMKJJIIIJJKGHKKKLMJJKKKKKLKKJJJKLMJMLIHKMLOMJLOMJKKKMNLIJMJHJLE=::89<@@@ACC;=YbMJUWRPRVXVQTTSSSSSSRRUVTQTXTSRTWUTWWTVYTRUVRIED?@LXks~Š•šž€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#''<@=?A@??@ABCEED@90'!!0ABB@@B@@BBA??AA??BBBFFEDFHIGFJKLNNMJHIKLJGGHIEFGFFGGEEIHEGGDEGKKHGJJGTc[[e]SL?;?>;=<<<@;4;50KTLKLPQUY]eg`[VOJGIJHMQMJPRQTUVWVUVUSRUTSUUUXRZYW[ZWY\\[XY\]]]]]\[[\]]^]_dfefeehgdaZOMLKJKMQTW[^`a^_ccchjiihbejkecfe`aY\afW* +.+)+0541241*)-0/.157778:5/*)*+($"$$! "$$"%# "''"(++,2789>@A<635940154//475453002133026620100241,)+.--44*3D=,/4,%1BF=@Q_c^][\^acdniQAC9#&$,IOGNONLMNNNNPOPQNNOLNSPLPPOQTPRQLOSNLPPNNPPMONOQPNNPSRONQSPLRTSPQVXVXXVTW[\\_fc^abaffghgfgkoinzz„’m3%%#$!-1' )6<8,-41-15./*$$(.68?CEGGHMIHHIKJHFGGJLKIHIGIJIIIHFKJIIHHHIJHJKIIKLIJJJHHHIKJJKKLMMOLIJMMLKKKKKJLNLLLMKHKKFJHJKE=;;79>BCAABD=?ZcNJUTRSTSSTRQUVSQSTSUVUSRTUVUTRUYWVYVTYZWTRWQTSKDBCACDHLOW`d€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$'#,=>D<0%+?BEFEDDD?ACCA???BAA@??@AC@=>???ADEDDHKJHHHKMKLNLJKJHHHHFDFIGEEGFFEFHIHHIGGHJLKIHP]XWe`NLA=>?;:<=:=86:2CEFHFFIKJIHHFFGJIHGIJIFFHHHJIGHIIIJIHJMJJJJIHHHHKKLNMJKJJKKKKKJJKKJJLLJMJLNMLLLJKLLKJIHKJJLE<<:88AECA?@F=?ZbMLXUSQQRSRRTTTTTTSRSVTSTUTUUSSUVTTVRUWVVVUTUSQRTRLFEEEDCCBB€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"$".>BB?ACDCBBC<@DC@?AEA>=?@?@CC@??@ABCBGFEHIHKLKJJLLJIIIJKJIHGDFHGDEGFDGIFDEHIGIJIHIGDM\VQ`aQJA=@CA>=<;=75;3 #@RNMRRLOSWZ[[[TQMJHHIIMNOOPQTVXURTWZYYUUTRPOTYUVXYZZXTY\^]\\[Zaa`_`ba_]cedddddgkgbdbVLJMNMMORS_b_]afd`befedehjkgeedccd_\\\ff?'00+,36323/*((*))-,)&$"!  ####"$" !&-/.0343355531147:98<>EC8146..16863203446521544332/,/230/0/,,++8AADD@9:-"'3AE?=Ma^[YY[ZY\broG()1-!'HSIHKLOPMJKPQONOOMLMROOOOPNKPTUTROMPNJJOSQMJOMMOONORPQONNOOOQRQOOTWXWYXVXZZ[\`cdbbdfbefeegjlmqxƒ‘{7'+"!%"/7.$#)485,*./04551(#$',3@EFFHGFIIIHHJKIEFIKIGHIJHHGFGHIKJHFHJJIJNLKJJJJIJKJIKKJLLKKJJJJJIIIJJKKKLLKMNLJLOLKMMKIHIIILG?<636@CBDCBA:@^cKIVSOPRORURSTTUTTSSRRTTSUUSRUWWVUSRTWURU[ZTXXWWUTTTSRPNKIGF€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ #3A@@?@<;@FA3'#2AIBCEECBBC@@@??@CDE@>@@>>@ABBCDEECEFEEGHGFJMMLLJIMKJJKJGEFEFHGEEGFEGGDEFGFDIJGGJIEK]WO`gVHC<<>===;<=64<5 +HRNNRMNOQTVWWWRPNKIGGFHJMNOOPQPTWVTSVWVVVWVUVWUUTUWYXUTX\]^_^\]_`___aa]_`agihfjkhfe^SNJLMNPUY[c`_^adc^aefddfjjia^de`]aa]__gkI%..,,00/1/+%""!!#""!#$&'''('%&'&####(.0/06643.-353248<=<7>HG2$2BE?=L_]ZXXYYW[`jpI"')(%DOLMKLOPNJKNMOQQPNPRSRQONLKLMPQQSQOOKNOLKNPOKMPNMQSMOTSQSSPPORTQRUWUXYURX^_^___acdedeghgfilmoqw|{9 #$+& /5-%$(384-.52-.0:3'"$%)3DGHGIGFIJIIJIGHJHGGGJMLIJIIIGHHHJIIJJIJKLJGGIJJIJKJIJHGGKJIIIJKLLIHKMLLLKMKHJMMNMJHKLIHILLKJF@?838ABADB@@8?^eLKZRQUXTSTPQQRRRRRQTSTSQSUSRVYVUVURUVXVSRUXTVXVTTVYUUUUUUTT€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€&9A<<=B??@9*0?DBCEFFDCDEAAA@>?AC@>;:<@B@ABA??BDCD@CFEILFIJJKMLIJJIHIHGGHFFGGDEFFGEDGHFEEFHHGILKFR`TGXgZLC;9;<<<:==44<6 3NSMOOKOPQRSTUUOPNKGEEGJLOQQPONSSVYVRSXVUVWWWUUUUTTVXYXYZ[Z[]__[^`_]]^``aaceefkfdgh_VRNIILPTX\`caaa]acaaddcdiife^]dd][__^cbclS#"&'%%&%$)(%!"#&&&'*.2589;73.'$&'#"%&&(.1003253&!,5335:>??@=95443/20,+*)''+,,/4434430--/001//0/,,-5DFA?:9?D4!1BE>>L\[XWVXWVY_mn@!*&AONNLLNQNKJMPOOPQQPOQSRPPMMRPPNOOONNOLIIJLMOQNPPLLOMMPQPRRPPPSUUUWVVVYWVZ][Z]_ababdfeffegjkkmpv|z7"++(.5/'#$1;3,085/04<8,$#"(7GJHHIHFILGEIJGGJIIHHIKIGHHJLIIIGIIJJIIJKLJIHIJJILLKJJJKKKJJIIIJJIKNNKIKPOJKNLIJKNMKLKIHKIJIIB<<969BCAB@>A9>]dLGQORUVUROORRRSSSSSQTTTVVTTTXXSPUWVTTRQTWVRQRTVUUTTWWWWWVVV€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€)<@;>@AD>."+02369;>?@AEGBBBBCBA@?@?>@B@=ABA??ABBBBGHDGLIKIKONLJHJKJIHIIHGFFFDDFFFFHHGEEGKIFGJKHDR\PBSbXJB<<@A?=9==44<6 9OOLKNOQQQRRSSSLLLIGFHIHJLOSVWXVSSTUSUWVXYXVUWYTWXXXZ[[VZ]^``^[_^^_`_^]dccdfdejcegcYTQJHGLTXWWZbbfeabfdacb`chifa_aca]\`__cabl[+$''&))*.1,(&)-01-28>=?B?74552/////.,)*++,//.0310/.-.02..20*+13$0CE>>KYYWUUVVTX]ll=!)DRNHLLNPPKJKONNMNNNLRURNPRPPPQQOMMPRNMMMMMORPKNQLLPOOMMNMNQQQQSUVVX[UXZXYXY\\^aabbdfceeegkmmimw~ƒx3#(,-4.'#$1;8..30,18>>2'&$*:IKIGJIGIGEFHJJIHHJJHGGHGIHIJGGIHIGFGIJHFIIJJJJIIJJJJJKKKJJJJJJJIJKLJJKKKLIJNMJJKMNLJKIIJIHIKD;:846?CBB@ABBB:1##'%"$((+.259>BECABCC@==<=@A@><<9<=64<5 !=NONLJMPQRSSSRRMLJIGGGGIIKNQSTSSWXURSUVTVWVUUUUVYZYYZ\][[[[\`aa]]^`_]]^`baafihfggb^[SKIJINW[ZZ\acedbefe`ccaaddb`aba_]_aaa_^an`3)/0/49;=?8.((,02.27::;;=950*&'(' $$"$+/./10044484347=?<654/*010/.-*'*,)'),-.2000/,-/2.,/0..0140%'15<;:-0DE=>JWWUTSUTSV\fl?! (BROIMLNQPLIJLOPONORSRTRQONMNONOOLMOPNOMJKOOLJKOPMOQORNOQNOQQQPQUUTUYZYUTXZ[^]]^adedcdghggilnglv~ƒw1#" '.4,$#'278/.2/,.2?C6))(,:JKHGJJHIFFGIHGHJGGFFHJIGHHHGEEGGHHGGIJIFFHJKKJJJIIKLLKKIIIJKKKJJKMMKJKKJKNMJKKJIKLIHKKHHMJHKF><:34>CCBAC>:>X^LMXTQSTPRUSSSRRRSSSQRTTSTTQTVXWUSQQXUTUUSSUWXWURRUXSSTTUVVV€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€':A@>5%!#%(,15;>AA@>??@>>>?@ABAABBAAACCGEDIJIJKGHKLKJIJKKKKKIHIEEEDCEEGFDCFIHEEFFEFHIGOYOBPaZJ@;:;98;;;=75;3 !?ONPNIIMOQSSRPOLLKJIGFEHHJNQSSRSRSVUQPRWWWVWXWUWYZYXZ\]^]\[]`a`Z\_a^[]`]bcabdefgaZYWMFIMOSX]``^bfd^`dgfbbb```_^ba`_^^`abd`]ald?)12.5>?>>7.(),0225:::9:;84/*$"$% &(%&,/-453113558657<@AA?>98;6.+,./.1330')%!'/22210.,,/1,-//,*.3.0--48@=2/DE=?ITUTRRSSRUZkg;+&# $?PNOMLNQQLIILLLJLOQQOMQTOJMRQNNNLLMJOOPPLHKQONNOMJLPOOPQQQQPRRSUUSSU\ZUTY[WUY]bdcbcedggedfhjhlu|€Žw2"$!-5-#"(262,.4310.;F<+)).;JJGFJJIJKGEGIHGHHHHGHIIGEGHGGGGIHJJIIJJHJJKKLLKJIHHHHJLLKKKJJJJJMLJKMMLJJKKLNLJLMMKJMKGHMJGGB<<946?CBB@A@>AA>@@ACCABE@DFEEFHJQPNNOKJOKJIIIGGGIEDEDCEEDCDFGFEGFKKGDGHGJVM?L_YI?<>A=:;;:=86:2$BNIMOJJKMPSSROMGILLJHGGIHHJNQSTRSTUVVUTSWYXVVVVVXYYZ[ZY]\[[]acc]]^bca`aa_]_bbbfd_]YQNMJMSXZ^b^W]hieghebe`\\^`aae_\]^__aahc__hfI+43-3==8;6/+,.//-27:99:<;4.)""%!#!%/1-2025448996459=@@>=;<<406.133330*(*&"(00+231-+,./-)*--+-35/-"&3@G5+"/EE[bMJURQPPRSRQSSRRQQRRQTSRTUTTRRRSTUUUTTUWVSRRXURTWYVSUUUUVVWW€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€-@?-(:C@=;:975/,'" """%',4;=?C>>>>>?@AB??BBBBBDEFFHIIJKLLLMLLLOMMKGHJJEFFEDEFHFECCDEGGHDFHEHIAMXK=L]YJ?;9;=;:9=?;088)FKJMKKIJMPRRPLHGHIJJIGFIIHHJNTXUVVTVYWRUUTUWUSXUYWX]\X[a^]]^ab_bb`aec````_`dd`]a]ZXSMKLKPW\]]^abegfffeba`^\\^adb`^]^`bab^^ccioN!"/3/2;=;51+)-.---0246:<<=7/'"""%!,1+.25435788315;>=;=9:91/465523411//*%#%*,-/10--..*.-.-)&,500-!$269B<%0EF<;FSUNSTPPTWVgjG((" (AQLLOKHHKMMKKLOQPOPSRPNNNNNONONLKKLLOOOPRRPNKOQPPNMPONOPRTTSTSTVWVTTZYUSVVUW]]]]`efegeeeffjnonux~ŠƒA# #,4*&4850142...2@A4*&.@KHIIEDGJFHIIGEFFFGHIHHIJHHHIJHGIIEFJJKJFIJIGJMLHIKKJLJHIKKKJIHJNJLJIKJIKJKLLKKLMLJJLKHGHCHKJA::799?BCB@BC8=_cJJSSSSRPPQSSRTTPRTOTTSTTTTSTUVWVUSQUUUUTSSURRSUTSSUTWWTSVWV€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€/:,%5>?????@@A>=83/,)%"%%%+4=>@@@A=@BA?ACCDHIGGKJGIIJLLLLKMNKHHFEGEGHFEFFECEEFEEEFEFEEGIHGNSKELZZJ@=;;<<<;9>;398 -EKMOIIKGNQQPQNIKKKJIGFEIGGIJLQWVTTWYWUVTYYUTUVVZUUZ\[\`^]^_\VYb^^_`]^``\]^_a`^`_[XWRLJLPRV]aca_^fifcdb^]_``^]_ac`aege`][`ccagoV' -313862.)'+.+),,,,.38;;:3,&!#$!" *-',12//34230/38:8775566325751123542+%$&'(*-//-,.-+(+-)%+48/3,#4F8'95"0EF<;FSTQTUQPSUTejB)BRMMOLIJMNMKNMMOPQRRMRSPNPNKKLMMMMMMOPPPPQQQMOOOPONOPQQQRTTSRTVVTSTWVZXTUXXX[\]`bcddfdeikkhfllsx‹‡H#!"+1'+784002111.3<<5-*1?KHHHGHHEIIIIJIHGGHJJIIIJHJJHIJIIMIFFFGJKIJLMKJIJIHJKJJKJJJJJHHJLLKJJJLKIJIIKKKKLLMKIILLILKIJC9:;6;A@@C@?@7<]`IJQQPPQRSSTPQSSPRSPQQQQRTUWTPSUQTWUVTRRSUTSSUVTTUUUUUVVVUSS€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€" -8;>>>=<<>@@AA@?=952-(%%&-8?BBCCABDDBCDGHJJKJJKLLLKJJMLIJKHFIGFFGFCCEDEGFDCEFDGECGGEGKLHDHW\M>>==>?=:9;92840FLLMIKMLLORRMJIKKKJHGHHHFFGHHLRVSSVWSRTVWYYUSVX\YWWWY[\Z]]ZZ^]WWZ__^`cbeb_`ca^^`][XTOMOPSX\_aa`geege`[Z]\\\]_``aeggffb^_abeebi]4).*+.-)$'''*,*(-*()09=>;3-)&'&"" !)*''+,)*-.,-)(+1578469:8448872245861*%%&%&(-/.,,./--('))*+($*07C>*#*,%0EG=;ERSQSSPNOQQ^d=$?OKJNLKLOOMJMNOOOQRSSONQRONPNNNNMKKLLMNOPOPPOMLKNNMMPPQRRRSTSRRSTSTVRWWTTWXX]\_bdcdfddgjkiijiiqw€ŒŒT #!!+4,!!*693/./144/35860,4@JIHHHKIBGHIIHHHIGHIIIHGGGIHGHIHHIHHIJHGHJHHJKIIJJIJJIJLKJIIIHGIKLJKKJMMIJJIIKKKJNMKIKLKHGGHJC:;;79@CEDAA@9?]aKMSPOOQSTSRSTTRPPRSPRTUUTTTUTTSSSTTTSRSUWUQUWWVVVVUTVUTUXWS€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#*/168:<==>>>@AABB@=<;61.,-08ACCACDCDHHHHIKKKLLMMMKKKIGIHBGDCDCAADEFFFDDEFCFGHHHGHLOICGW[M>>=<=>>;==84831ELNOLIIJMNOPPLIIJKJHGHHHIHGEHJLQSTVVWWWVVYXUWZX[]ZWYZZ[ZY^_[]_W\a`_aeddhfddc`^a]^\XSPOORVZ]`cdd_bca\ZZ[\aed`]^a_egcadebbda``akd9(.,,-)$&&&(*)(*1.*+19>?82*('" $&%!!#'('''(+*)(*,,,-/4673498//4543/147:80+'&%##&,-.,,--,+)(-.)(..6DGFAC@9>]_JLSQQQRRRQOPRRPOOQTRRRRQRRRUVUTVVUWUTSSTUUVSSTVVTSTWVUVVUUT€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"&&'*,/4;?A?>==<;>??>>;999:;?BC@;>?@@B?@DCEEDFHJILKKKLLMNMJJKIHFCFGFCCFGEDEFFGEEDCEGGGEEFIKHCFTXG<==<<>=::;7383%3?GMRNKMJLOONMLKHIJIHGGGFHHEEFHHMQTTVYZXVVYZWXZYZ[Z[\ZXZZTX`_^_^adb_cfdbid__b`\\\_^VRQQOTUX\bfd_^^\\]]\[\`ca][^baaaacffdccdb_^ih>'-+,,)&&''())),---.28;<95+)+##38*%('%&&&&(,00.-),,)+0547784036232-,1485,+*'%#$&*,.-,+*))+'&,,1?FILHEG>$"16/EG=;EPQMMNNNNPS_^:!& %BTOMMMNOPOMLIMPONOPQQSQKJNQQOMLLLKMPMJJKMMNORPOMMMNNLLNOPOQSPPQTUTTTVUVWVVWX\^``abeefccfjklmjkqwˆi-#! )2,#%.9:5-,14553328;3,6CNIGHGHIHGFFGIJJIHHIIIHGFIHGGIGGIKKHIKIFFEHLLJHJMKKJHIIIJJJJKJIIJIKKIIIGGIKLKJJKLIKLKJJJJFKMJ@9;917@AAC@?B:@^aJLUQRSSQPOOOQSSSQQSUSPPQRRRRPQQQSVUSRTWWTSUUSSUVUUVRRUWWVVW€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#&%$%')*,17;==?>;99<>==;;?@<:>=:;?A??A?CA?AB@ADDDEGIKMLLKJJKKKLKIKMHEHCDDCCFECFEEFFFEEGJHGGECHKGFFDSZJ:;====;99<846745?GIIMMIJKLORMHHMGHHIIHGFFGHIHGHJLMOSUWWXXUX][VVYXW[]YZ[XU[\Z[Z\`^_ab`cc^`ca^[ZZ]\a`XRRRPPUZ]`b_ZXY\][XY]Y[_cedb``aaacfgegbacb^fiH&*)*+)(#()'),+*'*-/022130&$(!$9>,'-*'))&))).52)(++''/695862033375.-0341()*(&&'(,..,+*+,,*$%-08HMHLQJJF/"1;'/DG==AE=BabJMVPRSSQPPQPPQSRQQQTSRTVVSQRSRSSSRRURRUURRVUTSQRUVVRTUTSSTT€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$&&&'&)((*/5<=>>?A<9<@@??=@>BKNJLOJFHLONKKLMJIHHHIHFGHJIHGHHJILQVWXYTXZZ[[XUVX\[X^b]^_ZX]ZUW_^__]^`^^`_\]^^]^`_YSPPQRY__]]\YW[\Y[``\Z]`ba`ab`cdbbdeccc_[bdjlR##,./-(%'((*,*)+*,.-+)'%,)%&'#'58.*,,+--+0.''-+!&')('(/55652002464.,0462+*)*)'&',,,+)),.)).346CPHDEJGJL9&,7*!".DG>ED>C^^HKSRRRQQQRRSOPRRSUTPOOQTUTRPTSRVSPRTRRVWTRRVVTRSVWVYUTVVTVZ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$()))'((),06;<==<<=<9<<<=<99>=>>:;>><@BAACA?EBBCEGHIJJKMNNMKJKHIKGDEFFECCDEEEDEFFDEFHFBFJFFHF@IH@BRYK;;PIFNNMLKLNOLKLOQPPPPPQQOMLMOONKJLNOOLKMMKLPQOOOMOQQPMLOPNNOMPRSRQTYWWYXSTY[\ZZ^```aeddhjjiiklqx…•<$ !.70$"+7;5579753.1:;7409MHJMKGHIGHGEFHJJIJIGGHIIIIHGGHGGJLHIJHHIHHKLJIKJHIKJJKJHHJIJLKIHHLHJMKHHIJMMKJLLJHKKIIKJHHJIHB==837>?ADCCD@E^]ILRUSQQQRRQTNPSRSTRQPPPQRRSTTSSSSSTUTTVVTSSUSSUVTSSWUSSSSSS€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€#(*))*,-,-27>=::;<>>=88>?<;>====<=?@A?=?B@?DEEFEDGKLLMKJLKJKKIJKIEEHFFECBDEDCEEEDDFGFGFEEDEHHFFCBJZQ>9=;QIKKKMNNNMLJIIJMOOOQRTSQNLKMONNONMNNMMNOONNRRPPSRPPNQOMQQMKPPNNRSRSX]YTVWWZZYZ^___afeggfhlmnouv|‚…G!"/<." )9:83000-+++/25639FLKIHGFEEFFHHFFHHIEGIHHHFIHGHJHGIIHHJJIIJKIIJJHHIKJHGJKKKKLKIHIKKIJMKGHKKJJJJJJKLGJMKIIIHGGIH@:8858?@AA@BD:C_]KOSPPPPPPQQQRQQRSSQQRSSQOPSURSVVSSVTRRUVTSUUSQTWTQTUUVVSQTX€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$*),.,)+/3::;<<=<<:<=;?C?>ACDB@CFDDFDDIKKNMIHKLILKHFFEDEFGFCBDFDEEDCDFHDFGGGGFGLFDDAETO9:@;8<@=:973388=CLKLOLJHKKLLJLLHHIGDDGHHJLIHKJGIKJLMIMTUSRRTX]^\[[ZYX]_\\ac`YVX[[\^`bb`_`\[_^[\`ced_ZWURONNSX[ZY[[`babcb_bbbcefffbadca``cccbebcrl>&.-*)*++*)(%$'++.21./0-*+03114-))/1..2."'1(#*,'%$!&4?<50...+&)*)'(./**)*-,'$%$$'**+/353139AEEIECCB?BHE8(/CE=;BLNKMKLMJKRW]B#=QIKKLMNNNMLMJHJNQPOSRQPOONMPNOPNOOLQOMOPONOPPPPOPONQROOPNLOOMPRQRUWWYYXXXXXX\^^]`dhfddfgkmlmosu~€Œ‡R""!3='$23-)%$$####'+1317EJIIHGGGHIGHIIIGDEEHLHDDGIHGHIHGIIHGHHHIJIIJJJJLOIIHHJKIHIIIKKKJJKJJJHIKKHJKKIHJLKLLKIIIJHFHHA;9737?ABB@AC7Aa]GKTQQPPOOOORQOOPRSSRRQQRSSQQUURSVVSSRPSYVQSRSUVUTTSXVSSUUTT€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$%(**-00.69;<<;<====<<;<<>=<=?@@?>=AB@BFDDBEHEHLJKKMMJJLLJLLGEFFCDCDEFDEGDFHHGFGIBEFGHGFGGDDCBFTM:6?@?;=>=741588;EKKKMJJJKJLKJJLJIIHGGHIJLJJIIIIGIJJIJKMOQRWYUX]]]YUW_c_Z]``\[^]YUZ_```ab`ba]\]abgjh_WTRPOORX]]\\Z]de`]__aabbddddcbbcda___dfba`bolA$/.)**,)))'&(+-+,24/,.0-*/4/&%,,---,--,"%.+"$+0*'$!&4??951,+)%(,0,(*02++-0/($$%"$)../1110,+-/.2124435:5.&/CF=;99=<9:?@?==>???A?>??BCABEDBDHJJHIHHJIGHJIGGEDCDDCBDEDCCEDCCDDDDBDDEEEDEGEBA@FUQ:7<;:;><=96445:CILJKLJHIKNMLLLKNLGGHEEIIHHJKHHIGGIGHLMKMQRTUTW]^ZZZ\^[[c____]YXYWZ[\_cc____^\[_deeaVNKLLKMQVZ][Z]`_^__`dc_acadeb`c^[_dbacedbffbepN"/-*+*+*++'*-,+*(,330212+*22)&+*+.,)+0-.((*&#*(%##"*8B8541*)+*-.01..2621.**,,*%#&/5533010-+,-,+)(+-++++*&/CE>ABB@AB:D_ZIOXQQQQQQPPSPPRTSQPRQQSRRRSQSUUSSTUUSTUSRSTSRUVSQSURVWUSSUW€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ &(-11..4<>=::<9:;::;=>???>>>?@BA?>@@@BDEDCFGHIHJJJKJHJHEDDDABDBDEDCBCBDEEDCBCDCDDDFECDFABEDBNN88A>==>:<:7545ANPMLMOLIILNNLMKKNIDCDBDJKEIJJLIFGFFJKHIMNKOQSUUW[b[UX`_\]\^ab]VVYZ[\^`a_]a_^^`abbb]VPNMMLLOQSY^]Y[^__`__caacbbgjc`dc`dfc`aacbb^\dmW& +.--+('*,++,((*''/43144+&-0-..,++*((*+,'&)#!*%#$%'/;C;874/./.,.2311442/*(+/.*&(/5744521.))*-,*'&'*+,..-).BF>=BLMJKJJLIJP]Y@, 9RMILLLLMMNNNMLKLNPRRSSRQONMLOONOMNQQNMOQPONQPONPPOOOONLOQRQPOMOTUSSUXTOQSTWYZ]]]]affdefhjkjkmovƒ{„d)$#  !$&$(')**/=KKJIIHHIIJHGGGHIGEHHGIGFIIGIIGHJHIJJHIIIGJJIIKMKGJKJIKIHHFIKJJLKIKMKGIJJLIIJJKLMNKIIJKIHHFGJIB;9936>@AB@B@7B][HMTRRSSSRRQSOMNPQQRTPOQSSQPVSRRSRRTWSRTTUUSTTTTUTSUVSSVVSSW€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"+43./4:=<::<:==::>?=;=???>?@>BBBB@?DE@BHFEFFIGHJJKJGHFEDDEDDCDDCCEDCBEGFDCBCDFEFGFDCJFCECBOQ>7;;;;<;;:5459GTVNLMNMKMMKLNKJKKHGFGGFGIKKIIIJHHFGIJHIJKORPNPPT[]][[^_\ZZ^``_^[WXY^dc]]a`ba][^^Z\XSPNMLLOSSTYa`[Y]de`]__^```acccddcccbbecbb`bb^ah\-(.-***&',-*(('*)',22-31+),,*-/.*%%'%"#$&$""&%%&((.7<>?=81-,.,131-142+-021.,,./14543353.*(*)'))*)('()*-*-BF?=BKMJKJJLIIPZ[>#7ROIMLLLLMNNNKIIKNNNSTSRONNNPNNOPRSRNOPPNNNNOOKKNOMMOPQRQOPRQNOQQSROPWVRUURTWXZ^_`bgebcfhlljjkpwz†h(&! """""!&'))(2CNHHHHHIJKGFGHGHHGHKHEEHGFHHIIGHIHJJIHGIIIIJKKJIGFKLJJJJIKJIJJIHILKIGIKKKNJIGIKMLKJIHHHHHJFGKJB;9858?@@B@CD8Cc^FHQPPQSSSRRRRSRPOPRQRQPQSRPURRUUSPPRRRRSRQQTVSPSUTSTTTUUUUV€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ &-1159;::;=<<;:<>???>>===>>BBB@BBA@EFDFJHDHKHHKLMLGIHFCDEEDFDBBDEDBFCABEFDBEEEEHGEECBABBAML@:>;>?>78;8425GVTKKLMLJNMJKMKIIGFGHIJIHHMIHHGILJGIGFKJHJPMKNSTTUV[_^\]^\_`bc`ZXYXX[ceb`aba`^ZVVXUTQLJJJJORTTX^_[`_ab`adccaadebbf^]`dcabc\`c__b`anh:&0+%)/)&*.+()()*+-12/31/-+(&%*%#%&$$'"%'$!"#!! "#$)25=A?:60.330.,-00,',10+(+/4201587400.+***(%'*+****(-,!-BF?=BKLJKJJLHIPXX86RPIMLLKLMNOPNMMOPPPTSQONNNNKLPRPOPNPPQQNJLPPOMMNNNNPPQQPNPRSPQRQPPMOSROQSTUWWY]acccfdeghijgiiqx}z‰Žh("! ! ! $)&&4ELJIIHGGHHEFHIGGIJIGGHHGGEGIIGHHHHJHHHHHIJFGIIHGGHHJJJKIGGJGHKKHHKIIJKKJKKJKKKKKLMLLLIHHJKLIIG?:9:69@BBB@AB8Dc^FKVOOPPPOMLTSRQRSRPORTRPQSSQUWROPSSPRTTSSTUTUTRTWURSWXTSUUS€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ !$(,05:<<;::>=;::==<=<<>??>=>@B?<@DB@ACBDIKGFIIJKIHIIFCBBBBBCAABBBDFACEEEDDEEEBBEFFGFA@CC?KOB9=>=9;<;=6325DOLEJNNKFJMLKLMJFGIFGGEFHGFHHHIIIKFEEDADIKMHJNPRTRXX[\Y\`a^bd`\[ZWX[^`bdca]]ZVUWVRWTOJLQQMPSWXZ]^^`cc`_]^c_^ac`beddaceccc`a^^_cebdmj>%2+#,.+').-(&*'*,**--%'(%$)+'&&'('&).&)'##%$%$$$$#)/2>>=<<@BA@CDADBABFHHGJIHIJGEHEEDDDEDCA@CFEDDCCDDEEEFFGHEBEFEFIECD@@JOC:9;;=:7;<7/18ISPJIMMKHGLJMPMJJJIIIIHHGFGKKJKLLLHDDEC@CJKMLKLNORSW[ZZ\_`\]``^__[X[]]_aa`X[ZVSTUUTTSQNMMNSVVW[^^]_aec__ba^^bdbbdcaababefb_acccccadjN+/---)%'-/,(++*)*'&('"#&&'))%%$%-31+'+,'&))&'''%*35/6>56A;311/-,*()+,0/)*263101111233.*+./.,)%',)##'&&%-@C=?@@C;F]UELROQPOMOUPOLNQRRSRRRQOPRTSQRUUQQSRTRRTSQQRQPQSSSTVSSUWURRU€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ !"#*0:=99;:9::;;<<=<<===>>?>?@@>?AACDDEEFHIJGHJHFFGHECCCBBCDDCDECBCDCBCEFEDECFIFDFHHFCD@@IND99>=<:;<;9117GQPJKKJJGJLLNNLMMKHHHHHHHHKLMKJJJHIHHHFDDEGIHHMRQORUYZZZ]`]\^]ZY[\Y[]`cc_YVWVTRTWXVVURNMNOPUX[_`^]^bfebbcb`acccdb^_baaega[bcdd`]^bjoT#"-0,+,,)&*32,,*))*+))(&%&$%()+%#(.10/01-'&*)#$')*.9<73:59DA6-.,)&&(**-+*-24432235652021/../,(*'&'('()+'$.AC=>=<<=?=;=?>=@CEDCDFGGGIFHJHFFEFEDCBBA@DECCEDCFFECCDDCADEGGCBEDDBABAAJOA;<;;==;969549GOMLMIMRMJKJLOMKJHJIHGGFGGIIKKIJLJKKKJJHGFGHHJKJJMQRVYYX[`ZZ^`\WWX[\^_ba[TUUVWWVXY]XSQRROLSTTV]a`^`egfdbabbffccddcababe_\baaa`aabagmX)*.--+*)(,032-*)**)($&('$%')+-(%&(*.40+)*+(&&%%',5>=35=BFB4.-,+++,---&-1004521134541.,/0-+*& #&'''(*+*".AD==<<>@A>>B@?ACDCBCEFEDGGGIIGDFBDDCCDCAEDCCDCBDDDDDDDDDEIIFGHGHDC@B@?FKB9:=:::<:56239FQLJJLNLHKKKLKKNOLKJHHGHIIJHKMIKMKJGFIIGFIIIJMLHJRQQTWYZ\^[[_a^ZYWV[_`_]ZVVVW[ZXWYZZXSNKMPPTWZ\]^`cggdca_bcggefda`_ca`b_Z[_aababba`k^2&--.*+(',550-)),+*'$'+(%&('(/+''+00.-(',+%#'%%&-7BA97@LJ5$(1/++.-(&*+.475004:840.//.595-(*($#"%*/5>==>?>;=????>ACEDCCDFFGGGIFEFFDCCCABDCBCDCBCCEEEDDDCCBDEFGDBEFDABB?DID;<=:9:<<75026CNLLKIJJJIKLNNMNMHIIHFGGHHKILMJKNLKHHJJHILJJIIMONOQQSUY]^\\\_`__\WPW_bb_][[XXZ[Z[]`YROOOMJPUZ]_^]_`cdcca`cfc^_dc`_aca_aa`_e`_becaaboh:(-,*+,,*,2543-*,-+)'%(&$(($#)++)*,-+*)(%%&'''(*,1B8)%**.)'('%)/035400:FGE@:762,043,*,,'% #.106F6(0CE>=CLLJJKLKJMQUO7''((!/PTLKNLILMLLLMNOMLNRTTSQQQPNQOMMNLKLMNOPPPOOLNQONNONNOONOPPPSRQSURPSVXVSSSRQXXWX^``abccceghgllmt~…Žk.#$#&(()+-)  &%(/56;BJHGGIIIHFFHHGFFHKIGHJKIGIGHIIFGHIGGIJJIIHHGGKJHGKKJIKIGJHGHIIHILJJIHJIHHGHKLKHHHIKKJJJHHIGJH@:8439A@?ABDB8F_UFOSOSQQRNQTQORTQNOQRQQQRRSSRTTSVSPPRSSSSTTRSRRRRQSUUUTRSVUR€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"&'$'5=:9;;;::<>;=>?>==>==>@@BB@ACDEDEEFGFGHFFFEDDCCBBBCB@BDCCDCCBBCEFFDDDGGCBDDEEBDDBEJD??<9;<;975116JSPGGMMIGJLJKLKJLMIIHGFFFFIHJLKLOOJKKJIIIHJJHJMMJIPQRTY^_\]]^__`]WV[_abca^_^^_aaaba]WROOOOTUVZ_`]]^acdca`aa^]aec`___^`ba`aaaaca`bgfqmA$,,,-+()*-2794,*+*((''&(+,(%)&%&)*(&&%$$%''')*+-/9BE?2,(%**&..*&&+/1/1007FQVOMJGIIB9364/-.,((,/57-(0:.!0CE>=CLLHIJJIILOWR9)'($/RVNKNKHKNLKPLJORPNQTRQQQQQQQOLMONLMNOPPPOOOOOONLNPPQPNPQOPSRORWSRTTOSSSTTRRVWXZ^__`cefffhigjnnr~ƒ†Œk.  ""&'*)'% "!$+0.2;FJIEFLKEHKKIHIIGGIHFHKIDIHGHIIGFJFEGHHIHJIEEGIIJIKJGHIIHKIIJJIIJJJIIKKIIMKIHHIIIKLJHJJHFFEHG@<:72;@?A@;AC9IbWGNPOQMORQROLNRRNOQOMQSQNORSPRRSTTRQRRQRTUTRTTRQSUTRTTUVUSST€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€")'$+7<:;<<;;;<;<<=>>??=>@?=>@?AABDFFFEFEEEDDFE?BCBBDDCECCCCBBCDCBBDDCBDEFDAEHFFFBCEACHG<<>;::>:852-9^hPHQPLLHKLMPOKKLKJIJIIIIIIHIKKKMOMNNLLLIFIJKMNKJLNPRUY\]^b_^^]^^[]]^^beebddccdeeba`\UPNQTPTX\^\\__`cedaabc`aba`acee_\``\]bbba``bdekmK!*-.-*$ (24/681)**(+(&&)*)'#&')+)'')'%'**((+347:>EJI9&"$'**+(**)-44.0-0?R[XPPPLHJPQNIC:1-+(%.8;83)(57/&1DF?=CLLFGHGFHJLWQ9'!.QUKMNKIMNLLMKKNPMMQSQPQRPPQLLMNPONPNNOOOOOPPLMOOPPMNRPMNPONRQOPVUQSTTRPRSQPTWY[]^^`a`cghgjokomq„…Œn/#''##)-(!  !%)*0:BJLEEJJEGHGEGIHDFJJGGIIEHHHGHJIEHEGJJIIHIIJJJIJILIIKJIJKIIIJKJIIJJIILLIIDLNHFKLHLKIHJKIIGFIH@<:62;ABEB=EC6E_TFQUNPRQOORPPSSOMOOKPQQOOQRPTSSRQQRRSTSRSVTQRTUSSSSQVTRRSTUU€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!&*($+;::;<<<;:==<<=>??:<>>:DA4EbWFOSOOTPLQPMNQPPSSPNMQRPMOSVURRSRSSONSUQORSQSQQTVUSSRTUTSSUV€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ !$$$%$'0<:;=>:9<=>>=>@?=????ACB?A@@CDCDEGB@DECBDDCCDEEDC@ACCDDCC@BCCCDDDDDDDDDEEEEBBA?DGE;;<:;<>;;65-;:629>=@A?DB7IbUDJOOMPQMNPMNPQPOPQPOPQOOPQQNORSSUVSTSRQRSTTRRTUTRSTTTTTTUUV€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€! !"#"! #!#&''()6=?;:99<>>>>>>>=?ABA?@??BCBACEDBEDCCAABECCBBBBBCABBCBBAABA@BDDCBCEFDBBEHADB@@CHI@9:;:;<;<=2/1:MRLKKKLKLNKLMMMMLKHJJHHJJIMKJLLJKOLMPOJILLJJLMLJIJMMMNPUY]^_adb\WUYZ\^bhkkffdbcffdfa[WUSRSQSV[_bba]difba`^_^_bcabfcbcedc`_b`^`bda^bbkf9'.*&())((,133>A3)+*$&/1)&,20..014421220.,-.0/10-374,*+--*)(,(%+59AO_RJT^VMPQOOOKKJGNHEIIEEIECA@@?:32,*#-DC>=AMJIIIGFGJMUQ/+JPMMKNOKKNMJMMMPQPPPPQRRQPQPPQQOONLLLMNMNOPOPMJLOONKLNNLNQPRRQSSQRWWWXXWWWXYYXWZ^__`aacdghjmmksƒs2$"""!%*'#'%*24:DIHHHGGGFEFHHGGHHGHHGGHFEFFGHHFGJKHHHHJHFGGHHIIIIJJIGFJGFHJIIIHHIJIHFEHIJJJJKLJJJIHIHDGGIG>973/:@=@C@A>8J_TFMPQOMMPPONNOPRRQONORSQPRRQSQQQRTUSPRTUTSRSRRRRRQRTUUTSSSRR€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€! !%&$$&&#%'$$'&1:<:;;:=@=;=??=;>>==?BCB@@??ADCA?FGB@CD@BBCA@@ABDB@??ACD@@BCCBCEABCDDCCBDEA@@BGHB;;:8::8:=3/37AKOPMMMJGIONLKKJKLGIJJJJIIKLMLJKLKLLMLJKMJIJLNMKJJLKKLOSWY_`ced_[YUZ]]aghddddcefecgd^VRRRRQSW[_aa`]^bffb``b^^bdabfg``db_``b`_]`cdbc`hjC&-+)**(%$*/654HaTFNRNROMQOMRROMNPOPQOQSRRRRQPRUSPQTTTSRRTTTSQQQSTSQQQSUTQPSU€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!$&()*))(%$&&.8;:<<:<==>?=;;=@><>@BBBCDCBAABCCACCDBAAADCAAABBBEDCCCCA@FDBCDEEEHE@AA@EHD<;:9<=;<<9426?KLLLMMKIILLLMLLKKHGHHGFGHIHJNKJKLNNLKOPMLJIJLNNLLKLKLMQUX_`aba_\[X[\[^efcbdefdddddc]UORUTSQT\_]]`]^afhfca]`a__bca`bde`_`a``_^_ceed`hoM #++')*)$#'+787?A1&()+65)$+5.-,+((**,*''(+-/12202@D:1/-/32/,)**'0Na\VTTTPOOPLGHIFJLIGIIHGGFF@EDFJFCLLFB6*!0@B?=BLKIIIGFGJMWS0(GOLJLONJJLNLMKLPRPOOPQSRPOPMNOOMMNKNKILOLMTOPQQMOQOQPNMMPPOPOPQQTUTSTVVWWXXZ\]]\\\]ccbcdgjlijhny|‹w3'-"!#'& #)+/5@IIHGGGEEGIIIIIFGJGFFFIKIGIIHIIIIHFGHIHHHGIKJHHIIHGHIJHKKHGHIHJGFGIJIIEFGHHIJLIGGIGGGGEGKI?9855:>?@@>D@3HbSEPSPSNMTRLOQONOOPPQOOPRQPPRPQSSQSTTUSQRTUTRUSQRSSSTSTTTSSTU€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!$$"((''++(')8=:;==<<<>>=:;==?A@??>=BABCBAACB@@CECAABBCCCBBACBAABCBBABB@CFFC@BEFEDCCGC?AA@GLF=<;:==;<98428@IPNLKLJHIMKJHHIKLJJKLKHHIKHKNKIJJOPONNLKMMKJLNONNMMMKKMU[\_bcc`\YYZ[]`dfeeeeeddfhg_ZVRQRQSPS[_[[^Y_efc```___accbbdb``cb_]`^_accccffluY#!*,''*(##')1327B;)'*-0/''26((*)(()))))),.12/0203<>3464221/10((*'4KY]_^SJIKHLOLEDILJIHFDEFGGFIFFKFBIIJNIB;0-6@B=:BLLIIIGFGJMXT1&FPLJLNLKJKNLMKKOQOMRPPPQPPQONPQONOOKKLMOKKPNNQOMNQPOQQNNPRSQOQQQRTRTUUUTTTTXZ]^\\]^`abcefhhikkq|}€Œv4'* ! "!"%$ %--4@HHGHHEFHIGFGKJFGHFEGFFIHEGGFFFGHIIGGGHGEDGJIFGHIHHHHHHJJIIKIDHGGGJKJGIIIIIIIIIKJHIIIIJIKG=7863;A>AB?A>7K_QFOQRRPORQMMNOPOOOPPOPPNOOQRRRSQOQUUSSSSSSSTSRSUVUSRTTSTUUUU€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$'%#&'&(-59:=>=<=<;<>><;<>>??@?=?BCB@ABB@BA?@CCABBAAAABBBA@@BCCB@CC@@DDBEEDEEFFFDD@??BJOG=<=;<:8;:7117@KNNKKNLIJMMMMLKJJIIJLKHGHKKLMKLLJLJLOLLNONLKKKKKLKNOMJMSY[_bdca]YXWZ`deeghfeghhhhd`]YQQROPQTY\\\\`\]dfb^_b\[beb_`eecbb_^ba`aba``beikt`,),(()'#%)*+372:D5$(+**(+3/'(+.-.-++-.0//..)(*.3>?4362---,0.)'))*;RV^^VPNHAGMKEDIKKGBBHIDBEJGFHHHGFHHJD@A>?:?B<9AKLIIIGFGJMWT1%EQLLLJJMMKKKMMLNONMRPNOPPPQNMOQOMNNLQPKJMONONOONOPPLNNNOQQRQQQTURPTTUUUUTTUWWXZZ[\^_`abcefgills}}€t4& )2(!%"!))5CIEEHIGGGGGFFFHFFFEEFFHIIHHHGHEFFGGGFFIHGGIIHEHJIGHLKIJJIIHHHGKKJIIKJHIHHIIJJIJLJHHHFHBCGF<7625;@?AA>B>;K]SEKSQRRQNMOPNPPNMOPQNRQMLRSRQSTSOPSSRSSSRSSSTRRSSSSTSTTTSSTU€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€! ")168449<<;9:<>=<<==?><;>A@==@A??@BA@@BCB@?@@ABA@@BCCBBBCCA?CCA?BED@CBBDGGD@CDA?>AJQF::=<;::9>:206ALNMLMNLIHLLLKKKLLKIHGGGILJHHLOMMOQNNOMNNLOMKLLKJJILONLMQUY[^^^_]Z\YY^bceifdehjhgg`aaYOQVTOSVX[^^[]]_ba^]^_abaabba_bc``a`_baa_^^adfjgne5',)(+*'),)*5;45EB+&+0,'+1/))-00121-/2210/0,/8AGLC0-.)(02+((()-+$/GYRMTYPGJIEEFEDGIGBADC?BIJIHFFGFCDDE?<@>?=?C>9AHIIIIGFGJMUQ0%ERMLLIINMJKLMLKNOOOONPQRPONOPRROMNNKLOONNNMLNPPQONNQRPNQQONQQQRTRSXSTUVVVWWVWY[\\]`cccdegijfihmwx}‹s1&49/ ! &5FIEFHGDGIHFEFGGHHFGHGGHGHIHGHHHIGFHHIKIHHHGFGHKIGFGGHHHIJHGHJKKJIGGGHHKKJIHGFFJIHHGDEGGFHF>::78:?@B?=D?9J_SCKTQPOOOOPPNOPOOOPOOQQNNQSRQQRSSTSOQQSTTSRQQQRTTRRSUTSSSTSS€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ !"$# #&(19995588:<9:<=<<=>=<====?@@A?@AA??ABBBBA@??>ACCA@BDECBBCCCAABAABEFDBCDEEDDCDB?A@?JTJ<9=<:9;49844;GKQKKMJIJFLLMMLKJIGHHIIIJJKKHIMNKLKNMKMNMNRNMOQPNLKLLLKLPTX[]]^`_]][\`bbbdeddfedfijd`YOOSSPSVY\__\\]__``^]_^^`bbceebbb`abaa`^]_cdbjngmj?'-,*,+'+.**1:=9AG8+,1,(045/021//234553/-./35;@CIA/,20+-+')((),,,29FGEINJIURBAHCDJDKGAEFBEDEG@>B@@=>D@;AFFIIIGFGJMRO.%ERNIMKJLKIMNNJIMQQQQPPPONPRPRTRNNNMLIKMKKLJMONKKJKPPSQNOPPROPSTRSVVTUVVVVVWTVZ]\Z\`abcefghhmnlpy{‚’s/(162+  %5EIGIICCFHHGIIIDHGFHHFFGEGIGFGGGHFEHIHJEGJLJGGJGIIGFGHGFJKHILJEIIIIIGHIHJKJIIJKHHIHEGIGGFHG?;:65>>>>>>>????????@@@@@@@@BBBBBBBB>??@ABBC??@ABBCCAABCDDEEEA@@@BMXL=:=;=?:<74535CRMMLLKJIIMMLKKJIIJIGFFGIJKLLLLMMMNNNNNNNNNNNNNNNNNMLKLNQRVX[^___^YZ\^aceedfhjjhfdcdc\TOORQTW[\\[Z\^accb`^bbbbbbbbcccccccc__abdfggdiejpG#/0.+*+++*,)8A9FIOWHEA><=?@B@=;>BB>GGDBCBBDCHE;9@EC=;AB=@JKJHHHGGIMQS3%ESIONLKKLNOJMOOOOQTTQQSRNNPOOOOOOOOLMOPPOMLNNNOOPPPRQPOOPQRTSRQRTWXUUUUUUUUQRUX[^_`bbcdfghhmhjry|„Žt0!+53)"$)'(CKGFEFEFFGGHGFEEFHIIHFEGGGGGGGGGFGFGFGFHHHHHHHHHIJJJJIHFHIKKIHFJJIIIIJJIIJJKLMMLKJHFECCECHG=9:60C>7K\MDOTNOOOOPPPNPQPNNOPPPPPPPPPQQQQQQQQQQQQQQQQRRRRRRRRRSTUUUTT€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ !!489:;;:<::::::::<<<<<<<<>>>>>>>>????????AAAAAAAABBBBBBBB??@AABCCAABBCDDEAAABCDDDEB@@AEOYI;:A>;:5:96206CNNNMLLKJJNMMLKKJJJJIIIIJJLLMMMNNNOOOOOOOOOOOOOOOOONLLMOQRUWZ]_`__]^^_`abbcdfhhgdcffc\TQSVQSW[]^]]Z\_abb`_ccccccccaaaaaaaaaabcdffgjh_esV  -1.,+++)(0138;;@K?.,58CIA)(+12/.0,,,--/013CG>?MSM2)*2128:9525=====;:;>DHH><@B>BHGGHJJGFJPZS0$CQIMLJJIKLMJKLMMNPQSQQQPONOOOOOOOOOJLMNNMLJNNOOOPPPQQPPPPQQRQPOPRTVTTTTTTTTRSUX[\^^bbcefghimhhpv{„p0 !'-133390$#@E>9P]IESSNNNOOOPPPOMNPPONOOOOOOOOQQPQPQQQRRRRRRRRSSRSRSRSPQRTUUUU€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€!"0478:867::::::::<<<<<<<<>>>>>>>>@@@@@@@@@@@@@@@@AAAAAAAA???@AABBAABBCDDDBCCCDEEEBA?@AEOXQ>8;97<>8<920:EKLLLKKJJILLLKJJIIHHIIIIHHKKKKLLLMMMMMMMMMMMMMMMMMMLLKLMOPVWZ]_`a`]^_`cdefdeghhgedfeaZSQTWOQUX[\]\Z\^abcbadddddddd________eeffggggabafp[*3:8520,(&/316?:9FC/*-2BK?/,+./-/3421/.---3BE=BVa\B55=;7:>5/+/;BC@E9,%&+0388:;>@BCB>>AB=97=EE=88:=<778614<@??>?A=4OcNBOPOOOOPPPPQONOPQPNPPPPPPPPQQQQQQQQPPPPPPPPTTTTTTTTPPRTUUVV€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€  " #"/469::7899999999<<<<<<<>>>>>>>AAAAAAAAAAAAAAAA@@@AAABBAABBCCCDCCCDDEEEC@<:=EQZJ>9<:9;<9;7./;IOLLLLKKJJLLLKKJJJHIKLLKIHKKKLLLMMMMMMMMMMMMMMMMMMMLKLLMNOWXZ\]_^_\\]_acdeffghhhffgea[TPQRRTVYZ\[\[\^`aa``aaaaaaaabcbcbcbchhhhghggbadhm]2 4CA>:60+(-/29?=:@G<.*6HG8,**+,*+-+++,,./0>C@=GWXL>55;704:;7348;:863-%"$''++*,.379>=?CDC@?>B@:8987438EKJDBDBBA=@FIDGJJECHNRK;(%#! "-AOPKKJJIJJKNMKMOQPNPSRPOQQNPPPPPPPPMMNOONMMLLLLLLLLKLNOONLKPONOOPQRQQQQQQQQWXYZ[[[[\^`dgjlnlijpv{ƒ‹t0#%.5=@>A6'-DGDHJFGIFGHGDEFIEGHJIIFEGGGGGGGGFFFFFFFFGGGGGGGGGGHHHHGGGHIJIIHGIHGGGGHIGHHHHIIJKJIHFDCCEEHG@;836<>>ABAB<5K_RIPROOOPOPPPNPQPONOQPPPPPPPPQQPQPQQQRRRRRRRRSSRSRSRSPPRSSTTS€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€                     €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€        €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€       €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€           €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚€~~€€‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€~€€~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~‚‚‚€€€€€€€€€€€~‚€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}€‚€‚„ƒ‚~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚ƒ‚~€€€€€€€€€€~‚~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~€€€€€€€€~~~~~€€€€€€€€}~}}€€€€€€~~~~~~~~~~€€€€€€€€~~~~~~€€€€€€€€€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€€€€~~~~~~~~€€€€€€€€€€€~~€‚€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚ƒ‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€‚‚‚€‚€€ƒ‚€€ƒƒƒ€€€€‚‚~~}‚ƒ‚ƒƒ‚‚‚€ƒ‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€zzzzzzzz{{{{{{{{yyyyyyyyxwxwxwxwwwwwwwwwuuuuuuuuxxxxxxxxvvvvvvvvxwxwxwxwvvvvvvvv{}}zyyyyyyyyyyyyyyyyyyzz{z{z{zzz{z{z{zxxxxxxxxvuuuttssqqrstuuvttttttttyyyyyyyyxy|}}|yxvvvvvvvv€€€€€€€€€€€€€€€€€€€€€€€€‚€~~yyzyzyyyzz{{{{zzyxyxyxyx}}}}}}}}{{{zyxxwvvvvvvvv|}~€‚ƒƒƒƒ‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„†…†…†…††ƒƒƒƒƒƒƒƒ……„ƒ‚€ƒƒƒƒƒƒƒƒ‚‚‚‚‚€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚„„„„„„„„‡‡ˆ‡ˆ‡ˆ‡ŠŠŠŠŠŠŠŠ‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚††††††††ˆˆˆˆˆˆˆˆŠŠŠŠŠŠŠŠ……………………„„„„„„„„ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€‚ƒƒƒ‡‹‹ŠŽ‰……‰Œ‹ŽŽˆ‹ŒŠ…‚„†‡ŒŒ‹Ž‘‘‘‘‘Ž……„ƒ‚€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€wwwwwwwwxxxxxxxxyyyyyyyyxxxxxxxxxxxxxxxxwwwwwwww||||||||{{{{{{{{xxxxxxxxwwwwwwwwy|~}zwuuxxxxxxxxxxxxxxxxwwwwwwwwwwwwwwwwyyyyyyyy||{{zyyyrsstuvwwuuuuuuuuqqqqqqqqsvy{{yvswwwwwwww€€€€€€€€€€€€€€€€€€€€€€€€‚‚€~~zzzzzzzz}}~~}}}}}}}}}}}}}}}}}}}|{zyxwwuuuuuuuu{|}‚„„„ƒƒƒ‚‚‚‚‚‚‚‚‚‚„„„„„„„„††††††††ƒƒƒƒƒƒƒƒ††††††††„„„„„„„„‡†…„ƒ‚€„„„„„„„„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€ƒƒƒƒƒƒƒƒƒƒ‚ƒ‚ƒ‚ƒ‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚„„„„„„„„‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚„„„„„„„„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‰‰‰‰‰‰‰‰„„„„„„„„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€‚ƒƒ„„‡‹Ž‹‹Ž“”Œƒ€‚„~………††‡‡‡†‹‰‚…‡ŽŒ“’““““’‘‡†…„ƒ‚€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€zvtuvvuuvwxxxwwvtuvwxxxxvvvvvvvvyyyyyyyyzzyyyyzzyz{||||{{{{{{{{{zz{|}}}}~}|{zzzzy|~~{xvvuwxxwvvwwxxxxxwwwxxxxxxwvvvvvwwwvwwvvvxyyxwvwxyz{{{zzyyy{{{{{{{{yxvvvutrux{|{xvuvwwvttuv|€€€€‚‚‚‚‚€€€€~}{zyyzzyxy}~‚€€€€€~||{zywvuuvwwvuuvyz|‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ†…„ƒƒ„……ƒƒ„„„„ƒƒ…„„ƒƒƒƒƒ…„ƒƒƒƒ„…ƒƒ‚‚ƒ„…†‡‡…ƒ‚…†‡‡ˆˆ‡‡††……„ƒƒ‚‚ƒ„…„ƒ‚ƒ€€€€€€€€€€€€€€€€€ƒ†…ƒ‚ƒƒƒƒƒƒƒƒƒ‚€‚ƒƒ‚‚‚‚ƒƒ„„………‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒ‚‚‚‚‚€‚‚~ƒ‚‚ƒ‚€€‚ƒƒ†„‚‚ƒ„……ƒ‚‚‚‚ƒ„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚ƒ„„ƒ‚‚‚„ƒ‚ƒƒ„ƒ‚„„ƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ„…†‡ˆ‰‰………„ƒƒ‚‚…ƒƒ…††ƒ‚€‚‚‚‚‚‚‚‚‚‚‚ƒ„…†Œ‹ˆ…ƒ~‚~~ƒ‚€‚„‚~}€…‰ŒŒ‹‘“”““““””‰ˆ…ƒ‚‚„„„ƒƒƒ‚‚„„„ƒƒ‚‚‚‚‚‚‚‚‚ƒƒƒ‚‚€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚€‚„„ƒ‚‚‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€}zxy{{{{xxyyyyxxxxwwwwvwwwwwwwwwwwwwwwwwvvvvvwxxwwxxxxxxxxxxxxxxwxy{|}~{{{zzz{{{}~~{zz{{|||zyyyxxxyxxxwwxxxxxxwwwwvvvvvvvvuuuvwwwwwvvuuwwwwwwwwyyyyyyyyzyxyz{zy{}~~}{{{yyxxwxxx{€€€€€€€€€~}|{yzzzyxy}~~€€~~~~~}~€{{{zyxvvtuvwvvvwyz|‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚„ƒ‚‚‚‚ƒ„‚‚‚ƒƒ‚‚‚ƒƒ‚ƒƒ„„„„„ƒƒƒƒ„„ƒƒ‚‚‚ƒ…†‡‡†„€ƒ……††††††……„„ƒƒ‚‚‚ƒ„„„ƒƒƒ€€€€€€€€€€€€€€€€€„‡†ƒ€€ƒƒ‚‚‚‚ƒ„††„„„„ƒƒƒ‚‚ƒƒƒ„ƒƒƒƒƒƒƒƒ‚„„„ƒƒ‚‚‚ƒƒƒƒ€ƒ„‚€€€‚‚ƒƒƒ‚‚‚„……„‚‚‚€€‚ƒ…††„‚€€‚ƒ„ƒƒƒƒ„ƒƒƒ„„„ƒ‚‚ƒƒƒƒƒƒ‚‚‚ƒƒƒƒƒ~~€‚‚‚‚€€ƒ‚‚€€€€‚ƒ„‚‚€€‚‚‚‚‚‚‚‚ƒ‚‚‚ƒ„…‡ŒŽ’‰„ƒ€€€€‚ƒƒ‚‚„‚}{}€ŠŒ‹‘“”““““•”‰ˆ…ƒ‚‚„„ƒƒƒƒ‚‚„„ƒƒƒ‚‚‚‚‚‚‚‚€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ„ƒ‚‚‚‚‚€€€€€‚€€€€€€€€€€€€€€€€|yy{~€‚€~}|{zxvuuuvwwwwwwwwwwwwwwwwuuuuvwxxvvwwwvvuwwwwwwwwwwwxyyzzyyxxxxxy{}}|zxyz{{{|}}||zz{{|{{zz{{{{{{zzzyxxvvuvwwvuuvwvvwvwvvvuuvvwwxxvvvvvvvvwvvvxxxw||}|{z{||zxx{{{z{€‚€€€€€€~}}{zyzyxwx|~}}€€€€€~~~‚€{{zzyxwvtuvvwvwwyz|‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚ƒƒ‚‚ƒƒ‚‚‚‚‚‚ƒƒƒƒ‚ƒƒƒƒƒƒ‚ƒ‚‚‚ƒ„…†‡‡„€„„„………„„ƒ„„ƒƒƒ‚‚‚‚„„„„ƒƒ€€€€€€€€€€€€€€€€€ˆˆz{~~€‚‚ˆ‰‹‹Š‰‰Š‰ˆˆ‡‡†††„„„„…„„„„„………„ƒƒ„„„ƒƒ€‚ƒ„„„ƒ‚‚ƒ„‚‚€‚‚ƒƒƒ‚‚ƒ‚€€‚‚‚‚€€€€€€€€€€‚‚‚‚ƒƒƒƒ‚‚ƒƒƒ‚‚‚ƒ„„„ƒ‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„„„…„„ƒ‚€„„ƒƒ‚€‚€‚‚€‚€‚‚‚‚‚„ƒƒ‚‚ƒ„…ˆŽŽŽ“†€€~€€€{y{ŠŽŒŽ‘“–•”“““’‰ˆ…ƒ‚‚„ƒƒƒƒ‚‚‚ƒƒ‚‚‚€‚‚‚‚€€€‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ„ƒ‚‚‚€€€€‚€€€€€€€€€€€€€€€€|zy{}~~‚‚‚‚‚‚}{wuttuvuuuuuuuuvvvvvvvvuuuuuvvwvwxyxwutvvvwvwwwxxwwwwxxzyxwwwww}~~}ywvwxxxy{||z{||}|}|||}}}}}}|||{{zyxwyyyywwwxyxutrrrsuvvvvwwwwwwwwwwwyxvwwwutxz{{yxxyzyxyz{{{{ƒ€€€€€€~}}|zzzzxvx|}}|~~}~~~€€€€€€~zzzzyxxwtuvwvwwwyz|‚ƒƒƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚ƒƒƒƒƒ„„„‚ƒƒ„„ƒƒ‚ƒƒƒƒ‚‚‚ƒƒƒƒ‚‚‚‚ƒ„…†‡ˆ…„„„„„„ƒƒ‚ƒƒƒƒƒƒƒƒ‚ƒ„„„„„€€€€€€€€€€€€€€€€…‡„}~€€€ˆŠ‹‹Š‰‰ŠŠŠŠ‹‹ŒŒ‹‹‹‹‹‹‹‹ˆˆˆˆ‡†…„†…„ƒ‚ƒƒƒ‚‚‚‚‚‚‚ƒ‚‚‚ƒƒƒƒƒƒ„„„ƒƒƒ„„ƒƒ€‚€€‚„‚€~€€€€€€€€€€‚‚‚ƒ‚‚‚‚€‚†‹Ž‘‘Ž‹‰ˆ‡†……„ƒ‚€€„„„„ƒ„ƒƒ††…„„ƒƒ‚€‚‚€€€‚‚‚‚ƒƒ‚‚‚‚‚‚‚ƒ„…‰Œ•‘†ƒ„……‚‚€€|y{„‹ŽŽŒŽ’””“’’’”’މˆ…ƒ‚‚ƒƒƒƒ‚‚‚‚‚€€€‚‚‚‚„„ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚€‚ƒ„„‚€ƒƒƒƒ€€€€€€€€€€€€€€€€€€|yxyyyyz{{{{{{||{ywutuwxvuvuvuvvssssssssuutssssswxz{{ywuwwwwxxxxxxxxxyz{zzyxxxxx}|xvvyxxxzzxwxyzzzzzzz{{{{{{z{{{{{zyxyzzzyxxyyxwvvvxytttttsssttttttttwvuuvvusvy||{ywvvwxwwwyz{€‚ƒ€€€€€‚€€~}}{zyzyxwx{~||}~}{{{{||}}~~~}zzzzyxxwvvvvwvvuyz|‚ƒƒƒƒƒ„„………„ƒ„ƒƒ‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ‚‚ƒƒƒƒ‚‚‚‚ƒ‚ƒ€‚ƒƒƒƒ‚‚‚‚ƒ„…†ˆˆ…‚…„„……„„ƒ‚„„„ƒƒƒƒƒ‚‚ƒ„„„„ƒ€€€€€€€€€€€€€€€€‚ƒ‚‚‚‚‚€€‚„„ƒ‚‚ƒ„„……††‡‡‰‰‰‰‰‰‰‰ŒŒŒŒŒŒ‹Š‡…„‚ƒ„†‡†…„‚‚‚‚ƒƒ…†ƒ‚€ƒƒƒ‚ƒƒƒ„„ƒ‚ƒƒƒ‚‚ƒ‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ…‡ˆˆ‡††‡ˆ‰‹ŽŒ‹Š‰ˆˆ‡‡‡††…†……„„ƒƒ‚„ƒƒƒ„„ƒ€‚€‚‚€‚‚‚‚‚‚‚ƒƒ‚ƒ„…‰ŒŽ”’ˆ„‡‰‹‹ˆˆˆˆˆ‡††††…ƒ€~€„ˆŒŽŒŽ’““’’’“””‰ˆ…ƒ‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ„„ƒƒƒƒƒƒƒ‚ƒ‚ƒ‚ƒ‚‚‚‚‚‚‚‚‚‚‚€€‚‚„ƒ‚€‚ƒƒ‚€‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€zxwwwwwyxxwwwwwwxxvvuwxyxxxxxxxxwwwwwwwwxxvvtutuz{}}{yzzz{{|||yxwvvwxxwwwwwwxx{}~{xvvxxxyyyyxwxxyyyyyxxyyyyxxxyyzyyxwwxyyxwwxxxwwvuttwwvvuutttttttttttsstvwwvtw{|zxutuwwwuuwy{€€‚€€‚€€~}{zyyz{yxx|~}{}}|{|{|||||{z{|~~~}{{zzyxwvvvvvvwuuyz|‚ƒƒƒƒƒ„……††„„ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚€€‚‚‚‚€‚ƒƒƒ‚‚‚‚‚ƒƒ‚‚‚ƒ‚‚‚ƒ„…‡ˆˆ…€‚„„„„„„„ƒƒ„„„„„„„„‚‚ƒ„„„„ƒ€€€€€€€€€€€€€€€€€ƒ„„‚ƒ‚„„„„„ƒƒƒ€‚€€€€‚€€‚ƒ„…††††„ƒ€€‚„……„ƒ‚‚‚ƒƒ…ˆ‰ˆ†‡‡†„„„ƒƒ„„„†„‚‚ƒƒƒ…„ƒƒ‚‚‚‚‚‚‚‚€ƒƒƒƒƒƒƒƒƒƒƒƒ‚ƒ„ƒƒƒ„„„ƒ‚‚ƒ„„ƒ‚ƒƒƒƒƒƒƒƒ‡‡‡‡ˆˆˆˆ‹Š‰ˆ†…„„†……„ƒƒ‚‚…„‚ƒ„†„ƒ‚€‚€€‚‚€€‚‚ƒƒ„‚ƒ„…ˆŽŒŒŒ‘ކƒ†‡‰‰‡‰ŠŠŠˆˆˆ‰ŠŠ‰‡…„…‡ŒŽŒŽ‘“•““““•“‰ˆ…ƒ‚‚ƒƒ‚‚ƒƒƒƒƒƒƒƒ‚ƒƒƒƒƒƒ„‚‚‚‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚‚‚€€‚ƒƒƒ€‚€€€‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€{yxxwvvwxxwwwxyywwwwwwwwyyyyyyyyzzzzzzzzzzyxxxxx{|}}~}}|||||}}~~{ywvuuuvvvvvwwxx{|}|yvuuvvwxxwxxwwxyyyyywxxxxxxwvwxxywvuuvxxwwwwwwwxxxxxxxxxxxxx{{{{{{{{xwwxz{{{vx{{zxwvxxxwwvwx{€€€€€ƒ‚€€€‚€€~}zyxy{{{zy}}|}~|~~~~~~~}{{{|~~}{{{zyxvvvuuvwwvuyz|‚ƒƒƒƒƒ„…†††„„„ƒƒ‚‚‚‚‚‚‚‚‚‚‚~€‚‚€‚‚€€‚ƒ„ƒƒ‚ƒƒ‚‚‚‚ƒƒƒƒ‚‚‚ƒ…†ˆˆ‡„‚‚„‚ƒƒ„„„ƒƒ„„„„„ƒƒƒƒƒƒ„„„ƒ‚€€€€€€€€€€€€€€€€ƒ„„ƒ„„ƒ„„„„ƒƒ‚‚ƒ„„ƒ‚‚ƒ‚‚‚€€€‚‚‚‚‚‚‚‚€€€€€€€~~€€€‚…‡†‡ˆ‰ˆ†††……††††…„…‡‰ŠŠ‡…ƒ„†‡†……„ƒ‚‚‚ƒ„ƒƒƒƒƒƒƒƒƒƒ„ƒ‚‚„……„„„……„„‚‚ƒƒ„„„„ƒƒƒƒƒ‚‚‚€‚ƒƒ…„„‚‚€€†……„„ƒƒ‚ƒ‚‚ƒ„„‚‚€€€‚‚€€‚‚‚ƒ‚ƒ„…‡ŽŠ‰‹„ƒ…„ƒ…„„†‡†„„…†ˆ‰ˆ‡†„„„ŒŽŒŽ‘“’‘‘‘’”“‰ˆ…ƒ‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚€€€‚ƒ‚‚€€€‚‚€€€‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€xwvwwwxzyywvvvvvwwxxxwvuxxxxxxxxwwwwwwwwyyxxxxyyyxxxxyzzyyyzz{{{|{zyxy{|{zzyyyyy|xutuuvwvtsssuvvwwxxxwwwxxwwwwxxyywvutvwxwwwwxwuuuvwxvvvwwxxxxxxxxxxxxwvwxxwv}~}||}|zxxyyxw|€€€€„ƒ€€€‚€€~}yxxy{|{{z}}|~~}~~~}}||~~€~}||{zywvuuttvwxwvyz|‚ƒƒƒƒƒ„…††‡„„„ƒƒ‚‚‚€‚ƒƒ‚‚‚‚‚ƒƒ‚‚‚‚ƒƒ„„ƒ€„ƒ‚‚‚‚ƒ„ƒƒ‚‚ƒ„…†ˆˆ†„ƒ‚‚ƒ‚‚ƒƒƒƒƒ„„„„ƒƒ‚‚ƒƒƒ„„„ƒ€€€€€€€€€€€€€€€€†ŠŠ†€~€‚€‚‚ƒƒƒ„„ƒ‚‚ƒ‚‚ƒƒ„„‚‚‚‚‚‚‚‚‚‚ƒƒ‚€€‚ƒ„ƒ‚€€ƒ„ƒ}|€€€‚‚‚‚„ƒ„…†‡‡††„ƒ…‰ŒŒŠŠ‰ˆ‡‡‡ˆ‰††††††††ƒƒ„ƒƒ„…‡…„ƒ„„…„ƒ„„ƒƒƒƒ„„ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ‚‚€€€~‚…ƒ‚€‚‚€€‚‚‚‚‚ƒ„…‡ŽŠ‡ŠŽˆˆ‰…„……‚„ƒ‚„„„ƒ‚‚‚ƒ„ŒŽŒŽ’’‘‹‰ˆ…ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚€€ƒƒ‚€‚‚‚‚ƒƒ‚€€€€€€€€€€€€€€€€€€€xnnx}}€~}}}}zywuuuuvxwwwwvvvvvvvvvvvvvvvvvvvywuuvwxxwxxxxwwvxxxyyzzz|||{{{{{€€}zzz~}zxwwxy|{zyxwvvuuuuuuuuwwvvvuuuuuvvwwxxuuttuwz{vvvvvvvvyyxxwwwvvwwuuwvux{~~{xxxxxwwxz|~|€€‚‚€€€€€ƒƒ‚‚€~}{zxvvwxzxxyzz{||{{|}}~€~~}}zzyyxxwwzzzzzzzz{|}~€‚ƒƒ„„„„………†„„„„ƒƒ‚‚‚€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ„ƒƒ‚‚‚ƒƒƒ‚‚„ƒ‚„‡†‡†ƒ‚ƒƒƒƒƒ„„ƒƒƒ‚‚‚‚ƒƒƒƒ‚ƒ…††…„„€€€€€€€€€€€€€€€€ˆ””†|{~€€€€„…†ˆ‰ˆˆ‡††††††††………„ƒ‚‚‚‚‚‚‚„ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€‚ƒ„‚‚ƒ„†‡ˆˆ„…†‡ˆ‰Š‹…………………………………………………„„„„„„„„„„„„„‚‚ƒƒ„„„…€‚ƒƒ„ƒƒƒ„…„‚‚‚„ƒƒ‚€€‚‚‚‚ƒ„……Š‘ŽŒŒŽŽŒ‹‹Š‰‰‰ˆ‡††††…………„„„ŠŠ‹ŒŽ‹‹Š‰‡†……ˆ‡…ƒƒ‚‚ƒ„„ƒƒ‚€‚‚€€‚‚‚‚ƒƒ‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚€‚‚‚‚ƒ„‚‚‚‚€€‚‚„ƒ€‚‚‚‚€€‚‚€€€€€€€€€€€€€€€€€€€xpqy|}……„ƒƒƒƒƒ~|zwussstttsssrrttstststvvvvvvvvvuuvwwwvvvwxxxxwxxxyyyyyxxyyyzzz~|z{|}}{{{}~~~~~~~~~zzzzzzzzzzzzzzzzuuvvwwwxponnoprsssssssssyxxxwwwwwxxwwyywx{~~{yxyvvuuvxyz}ƒ‚‚‚€€€€€‚ƒ‚~}|zxvuuvwuvvwwxyywwxyyzz{yyyzzzzz||{{zzzz~~~~~~~~{|}€‚ƒ„„„………†††……††…„‚‚‚€€€‚‚‚‚‚‚ƒ‚‚ƒƒƒ‚‚‚‚‚‚ƒƒ‚„‡†‡†ƒ‚ƒƒƒƒƒ„„„ƒƒƒƒ‚‚‚ƒ„„‚‚ƒƒƒƒƒƒ€€€€€€€€€€€€€€€€„Œ‹‚}~~€€€€€€€…†ˆŠ‹‹‹‹ŒŒŒŒŒŒŒŒŠŠŠŠ‰‰‰‰‰‰ˆ‡†…„ƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚€€€€€‚|}}~~€€~€‚‚„„„……†††††††††††Œ‰ˆ†…††††††††‚ƒƒƒ„„„„ƒƒ„„„ƒ‚‚ƒ„„ƒ………„„ƒƒƒ‚‚‚‚ƒ„…‡‹‘’‘‘‘ŽŽŽŽŽ‹‹Š‰ˆˆ‡‡………†††††ˆˆ‡‡†…„„‡†…ƒ‚‚‚ƒ„„ƒƒ‚‚‚€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚€€‚‚„ƒ€‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€}wwzzyzz~~~~~~|{zxwwwwwvvvvuuuttttttttttttttttuwy{zyxwvvwwwwvvwwwvwvvvvwwxyz{{}}~}{z{||{zyyyyzxxyyyyzz{{{{{{{{wxxyyz{{zzz{{{||vvuuuuvwrrrrrrrrtttttsssrttstuvtx{~}{xxxxwvuvwxy}€ƒ‚‚‚ƒƒ€€€€‚‚‚‚‚€~~}{zxvutuussttuuvvuuvvwxxxyzzz{|||~~~}}}}|||}‚ƒ„…………††‡‡……††…„‚‚‚‚‚‚‚‚‚‚€ƒƒƒ‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚‚ƒ‚ƒ††‡†ƒ‚‚ƒƒƒƒ„„„ƒƒƒ„ƒ‚‚‚„…‚‚‚‚‚ƒƒƒ€€€€€€€€€€€€€€€€„ƒ€‚ƒ‚‚€€€€‚ƒ„…‡‡‡‡ˆˆˆˆˆˆˆˆŒŒŒŒŒŒ……………………††…„„…††ƒƒƒƒƒƒƒƒƒ‚€€‚€€€‚ƒ‚‚‚‚‚‚‚‚‚‚ƒƒ‚„„„„…„……‡‡‡‡‡‡‡‡‡‡‡‡‡ˆˆˆˆˆˆ‡†…„ƒ……†…ƒ‚ƒƒƒƒƒ‚ƒ‚‚‚‚‚‚‚ƒ„…†‹‘‘’’’’’“’““’‘‘ŽŠŠ‰ˆ‡……„………„„ƒƒƒ…„…„…„…„†…„ƒ‚‚ƒƒ„„ƒ‚‚€‚‚€€‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚€‚‚„ƒ€‚‚‚‚ƒ‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€|xyzyxyxyyxxxyyyyyyyyyzz{{zzzyyyxxxxxxxxuuuuuuuuy|~~|{{||{{zywvvvuuttssuuvvwxxx{}~~|zyy}}|{zzyyzzzyxwwwxxxxxxxxuuvwxyzzxxxxxyyyzzyyxxxxyyyyyyyywwwwwwwwtvvuvxxwuxz{xutuwvttsuuv{~€‚‚€‚‚‚€~}}zywvuuuvuuuvvwwwxyyzzzz{}}}~~~~~~~~~~~}}}}}}}}|}}ƒƒ„…††††‡‡‡……„„ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚€‚„ƒƒ‚‚ƒ‚ƒ‚ƒƒƒ‚‚ƒ††‡†ƒ‚ƒƒƒ„„„„„ƒƒƒƒ‚ƒ‚ƒ„„„ƒƒƒ„…„„€€€€€€€€€€€€€€€€ƒ…‚ƒ„‚‚‚‚€€‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ„„…†††‡‡‡‡ˆˆˆ„„„…………†‡†„ƒƒ„†‡‰‰‰‰‰‰‰‰‡‡‡‡‡‡‡‡„ƒ€€‚„…€€€€‚„„„ƒ‚‚……„„ƒƒ‚‚„„ƒƒƒƒ‚‚‚ƒ‚ƒ‚ƒ‚ƒ€€€‚‚ƒ‚‚‚‚‚‚‚‚„„„„„„„„ˆˆˆ‡†…„ƒ…††…ƒƒƒ„ƒƒƒƒƒ„„„‚‚‚‚ƒ„…ˆ‹‘’‘Ž‹Šˆ‡…………„„ƒƒ‚‚††††…………ƒƒƒ„„…††……ƒƒ‚‚‚ƒ„„ƒƒ‚‚‚‚‚ƒ‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚ƒ‚‚‚‚„ƒ€‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€{xxzxxxwwwwwwwxxxxxxxwwvzzzyyyxxzzzzzzzz{z{z{z{{|}~|{{{€€€}|{xwwvvuuutttttttt{}€~zwvwwxyzz{{zzzyyxxxwwwwwwwwvvwxyz{{wwwvvvvvyyyyxxwwyyyyyyyyyyyzzzzzxz{y{|}|x{~}{xxxzywvvvxxz}€€€‚‚€€€€€€‚}}|xxwwwxxxyyzzzz{z||}|}}}}~~~}}}||}}}}~}~~|||{|{|||}~ƒ„………††‡‡‡‡†…„‚‚‚‚ƒ‚‚‚€€€€‚‚‚‚‚€ƒƒ„ƒ‚‚‚ƒƒƒƒƒƒ‚‚ƒ††‡†ƒ‚‚ƒƒƒƒ„„…„„ƒ‚‚„„„„„ƒ„„„…††…ƒ€€€€€€€€€€€€€€€€„ƒ€‚‚‚ƒ‚‚‚‚ƒ‚ƒƒƒ‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ€€‚‚ƒƒ„ƒƒ‚€€€‚‚‚ƒ‚€€‚ƒ‡‡‡‡‡‡‡‡‰‰‰‰‰‰‰‰„ƒ‚‚„‡‰ˆ‡‡†††‡ˆ†……„„‚‚‚……„ƒƒ‚…„„‚€€ƒƒƒƒƒƒƒƒ‚‚ƒƒ„„‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ‚‚€‚ƒƒ‚€€‚‚‚‚‚‚ƒ‚‚‚‚‚ƒ„…‹ŒŽŽ‹ŠŠ‰ˆ‡‡†„ƒ„ƒƒƒƒƒ„„„„…„…„ƒƒƒƒ„„„„ƒƒ„„††‡‡…„ƒ‚‚‚ƒƒ„„ƒ‚‚€‚ƒ‚‚ƒ‚ƒ‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚ƒ‚‚‚‚‚‚ƒ‚ƒ‚€‚‚„ƒ€‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€{vw{zyyxwwvvvvvwuuvwwwvvyyyxxxwwyyyyyyyy{{{{{{{{zzzyxxxx||}}}}||zzzzyyyyyyxxxxxx|~~zwvuvwxxyxwsttuvwxxttttttttuuvwwxxyxxwwwvvvxxyzzzyxwwwwwwwwxxxxxyyyxzzyy{{z{~€~{z{}}{zz{|}{~€‚‚‚€€€€‚€~}||xyyyzz{{}}}}}}}}}}}~}~}~~~~}||||||}}~~~}~}~}~}}}}~€ƒ„…………††††‡‡†…„ƒƒƒ„‚‚‚€€€€‚‚€€€‚‚‚‚‚‚‚ƒ€‚‚ƒ‚‚‚‚ƒ‚ƒ††‡†ƒ‚ƒƒƒ„„…„„„„‚ƒ„………ƒƒƒƒƒ…††„‚€€€€€€€€€€€€€€€€„Љƒ€€‚…‚‚ƒƒƒ„ƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚‚ƒƒƒƒƒ‚‚€€€€€€€€€€€€„ƒ‚‚ƒ…†ˆŠ‰ˆ‡‡‡ˆˆ‰‰‰ˆ‡‡††‹‹ŠŠ‰ˆˆˆ‡†……ƒƒ‚‚ƒ‚ƒ‚ƒ‚ƒƒƒƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚ƒƒƒƒ€€€€€€€€€€‚‚‚‚ƒ„…†‡ˆˆˆ‡††ƒƒƒ„ƒ„„„„„ƒ„ƒƒƒƒƒ„„……†††ƒƒƒ„„………ƒ„„……††‡„ƒ‚‚‚‚ƒ„„ƒƒ‚‚ƒ‚‚ƒ‚‚‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚€‚‚„ƒ€‚‚‚‚€€€€€€‚€€€€€€€€€€€€€€€€€€wpr{€}||{{{{{wxyzzzyyyyxxxwwwxxxwxxxxwwwwwwwwwwvwwxwwwwxyyyyxzzzz{{{{{{|||||}~€~|zzz||}~~|{zvvwxyz{{ttttttttvvvvvvvvuuuttsssrsuwwwvvxxxxxxxxwxxxyyyyxyyxxyzxxz~}{xxxzyxwxxz{|‚€€€€€€€€ƒ‚€~}||{{||||||~~~~~~~~}}}}}}}}~~~~~~}}}}~~}~€‚ƒ……„„………†††……†……„‚‚‚‚‚‚€€€‚‚€€€ƒ‚‚ƒƒ€€‚‚ƒƒ‚‚‚‚‚ƒƒ‚„‡†‡†ƒ‚ƒƒ„„„……„„„‚ƒ„„…„„ƒ„ƒ‚„…†„‚€€€€€€€€€€€€€€€€Ž”‘…~}€€€‚„…ƒƒƒƒƒƒƒƒ‚‚‚€€€€‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚€€€€€€€€ƒƒƒƒƒƒƒƒ‚€€…„„„„„„„‹‹‹ŠŠŠŠŠˆˆˆˆ‰‰‰‰‡‡ˆ‡ˆ‡ˆ‡ŽŒŠˆ…„ƒ‚‚‚‚‚‚‚‚„ƒƒƒ‚‚‚‚ƒƒ„„„„ƒƒ……†„ƒ‚ƒƒ„ƒƒƒ‚‚‚‚‚‚‚ƒ„…‚‚‚ƒ„„ƒ‚‚‚ƒƒƒƒƒƒ†††……„„„„„„„„„……‡††††………ƒƒƒƒƒƒ„„ƒ‚‚‚ƒƒ„„ƒ‚‚€‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚€€‚‚„ƒ€‚‚‚‚€€€€‚‚‚€€€€€€€€€€€€€€€€€€ypr}‚‚„„ƒ‚€~|zxvvvuuuttxxxxxxxxwwwwwwwwwvvwyzyxxxyyyxwwxxxyyzzzxxyyz{||€€~|zz}xy{}~~~}{{{{{{{{zzzzzzzz{{zzzzyyxxxwvvvupqtvwwvussssssssssssttuuvxxvvwwvy||yyyxwvvvwyz|€€€€€‚ƒƒ€~€~}||~~~~~}||}}}}}}}}}}}}}|||{|||}}~~~~~€€€~~~~~~~}~‚„……„„„…………†‚„…†…ƒ‚‚‚‚‚‚‚‚ƒ‚‚€€‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚ƒ‚ƒ„„ƒƒƒ‚‚„ƒ‚„‡†‡†ƒ‚ƒƒ„„„……„„„ƒƒƒ„„„„„…ƒ‚ƒ…†…„€€€€€€€€€€€€€€€€Š’{}€‚€€€€€€€ƒ…‡‰‰‰‰‰‰‰‰‰ŠŠ‰‰ˆ‡‡†ˆˆ‡††…„„„„„ƒƒƒƒ‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ‚€~ƒ‚€€€€€€€~~€‚ƒ„…‡‡‡‡‡‡‡‡‹‹‹‹ŠŠŠŠŠŠ‰Š‰ŠŠŠˆˆˆ‡‡‡††ƒƒ„„„ƒ‚‚„……„‚‚‚‚„ƒƒ‚€€‚‚‚‚ƒ„…ƒƒ„…†‡‡†‡††…„ƒƒ‚‚‚ƒ„…†‡ˆ‡‡‡‡†††…ˆ‡†…„ƒ‚‚‚‚‚‚ƒ‚‚ƒƒ„„ƒƒ‚‚ƒƒƒƒ‚‚‚ƒƒ‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚ƒƒƒƒ‚‚‚‚€‚‚„ƒ€‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€wxyz{|~~~~~~~~~~€€~~}wwwwwwwwwwvusrqqsssssssswwwwwwwwwwxxxyyyyyyyxxwwyyyzzz{{}~~}}{zyzzzzzzzzyyyxxwww{{{{{{{{{|}|zyz{||||||||xy{}~~~~ttttttttrrrqqqpptrqrtutsvwyzzywvtuvvvwy{|€€€€€€€€€€€€€‚ƒ‚‚‚‚‚}|{||}}~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}ƒ„‚ƒƒƒ„„„„†„„……‚‚‚‚ƒƒƒƒƒƒ‚ƒƒ‚‚ƒ‚‚‚‚‚ƒƒ‚‚ƒ‚ƒ„„ƒƒ„ƒ‚‚ƒ„†††„‚‚‚„„…†…„ƒ‚„„ƒ„………„‡„……ƒƒ…ƒ€€€€€€€€€€€€€€€€„„ƒƒ‚‚€€€€€€€€……†††‡‡‡ŠŠŠŠŠŠŠŠŒŒŒŒŒŒŒŒ……………………………„„ƒƒƒ‚‚‚‚‚‚‚‚ƒƒ‚‚ƒƒ„„ƒ‚‚€„„ƒ‚€~}€€€€€€€€€€€‚‚‚€€€€€€€€……†‡‰Š‹ŒŒŒŒŒŒŒŒŒŒ‹‰‡…ƒ‚…†‡†ƒ‚ƒ„„ƒƒƒƒ„…†‚‚‚‚‚‚‚‚‚‚‚‚‚€€€‚‚ƒ„…††‡‡†„‚†††……„„ƒ††††††††„„„„„„„„…„„ƒƒ‚‚ƒƒƒƒƒ‚‚‚„…†„€‚…„„ƒ‚‚€€ƒ‚‚‚‚‚‚‚‚‚€€€ƒƒƒƒƒƒ„„‚‚€‚€‚‚‚‚‚ƒƒƒƒ‚€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ„€€€€€€€€€€€€€€€€xyyyyyyyzzzzzzzzzzzzz{{{xxxxxxxxzzyxwwvvuuuuuuuuzzzzzzzzvwwwxxxxwwvvuuuuxxxyyyyz~~}}{{zzzzzzzz{{{zzzyyxxxxxxxxyz{zxwwyzzzzzzzzwxz||}}|{{{{{{{{{zyywvuuwvuwz|{zuvxyyxvuuvvutuvx|€€€€€€€‚‚‚‚‚‚}|zz{{{||}||||||||~~~~~~~~€€€€€€€€~~~~~~~~~~~ƒ…ƒƒƒ„„„„…†„„…„‚‚‚‚‚‚‚‚‚€€‚‚‚‚‚€€€‚ƒƒ‚‚ƒ‚€‚ƒƒƒƒƒƒ‚‚ƒ„‡‡‡…ƒ‚ƒƒ„„„„„„„„„„ƒ„„…„„‚‚„‚ƒ„‚€€€€€€€€€€€€€€€€…„„„ƒƒ‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚‚€€€‚‚‚„„„„„„„„††††††††‡‡‡‡‡‡‡‡…………„„ƒƒ††††††††€€€„„ƒƒ‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ€€€€€€€€‚‚‚€€ˆ‡‡†…„ƒƒ„†‡‡††‡‰……„„„…†‡‚‚‚€‚€‚‚‚ƒ„…‰ŠŠŠ‰ˆ†…‡‡††……„„„„„„„„„„‚‚‚‚‚‚‚‚‚ƒƒ„……„„ƒ„ƒƒƒƒ‚ƒ‚€€‚…„„ƒƒ€€ƒ‚‚‚‚‚‚‚‚‚‚‚ƒ‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ‚‚€‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€zzyxwvuuvvvvvvvvttuuvwxxwwwwwwwwzyzyyyyyyyyyyyyy{{{{{{{{zzz{{|||zzzyyyxx{{{{||||~}|{vuvuvuvuwwwvvuuuyxyxyxyyyz{zxwxyyyyyyyyyxyz{}|||zzzz{zzzwxyy{|}}}|{}€€{|~~|{{||zyyz{|~€€€€‚€€€‚‚‚~}{{||}}}}~~~~~~~~~~~~~~~~{|}~€‚€€€~~‚„…ƒƒƒƒ„„……†„„……‚‚‚‚‚‚‚‚€€‚€ƒƒƒ‚‚‚‚€€‚‚ƒƒƒ‚‚‚ƒ„‡‡‡…ƒ‚ƒƒ„ƒƒƒƒ„„„„ƒƒƒ„„„„ƒ…„ƒ‚€€€€€€€€€€€€€€€€€„„„ƒƒƒƒ‚„„„ƒ„ƒ„„ƒƒƒ‚ƒ‚ƒƒ‚‚‚ƒƒ€€€€€€€€‚‚‚‚‚€€€€€€€€€€€ƒƒƒƒƒƒƒƒ€~€€„„ƒƒ‚‚…†‡‡‰‰Š‹……………………„ƒ„ƒ„ƒ„„€€‚‚‚‚‚‚‚‚‚‚‚‚‚€€‚‚‚‚‚‚‚‚€€€€€€ƒ„…ƒ€~€€€‚‚‚‚€‚‚‚ƒ‚‚ƒ„…ŠŠŠŠŠˆ‡†„„„ƒƒ‚‚‚ƒƒƒ‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€ƒ…„„ƒ‚‚€€‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚‚‚‚‚„„„ƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚€‚ƒƒ€€€€€€€€€€€€€€€€{{zywwvuwwwwwwwwtuuuuvvwuuuuuuuuvvvwwxwxyyyyyyyyxyxyxyxx{{|||}}}}}}}|||{{||||}}}}~~~}}|{uututututtstssrrtttuttttuvwvtssuvvvvvvvvtuvxxxwwzzzzzzzzyyyzz{{{|zyyzzxw{|~~|{{||{yyz||€€€€€€€€€€€€€‚‚€~~€€€~~~~~~~~~~~~~~~~~~~~~€€‚‚€€€}~~€ƒ„…ƒ„ƒ„„………†…„…„ƒ‚‚‚‚‚‚‚ƒƒ‚‚ƒ‚‚€€‚‚‚‚ƒ‚‚‚‚ƒƒƒ‚‚ƒ„†††„‚‚‚‚ƒ„„……„„ƒƒƒƒƒ„„„ƒ††…„‚€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ„„„……‚‚‚‚‚‚‚‚€€€€€€€€€€~~~‚‚€‚‚…„„ƒ‚‚††‡ˆ‰‹‹Œ‹‹‹‹‹‹‹‹ŠŠŠŠŠŠŠŠ…††††‡‡ˆ„„„„„„„„‚‚‚ƒ‚ƒ‚‚€‚‚‚‚‚‚‚‚€‚‚‚€‚‚‚€€€‚€€‚‚‚‚‚‚‚ƒ‚‚ƒ„…†‡††……„„‚‚‚‚‚‚‚‚ƒƒ‚ƒ‚ƒ‚ƒ€€€€€‚‚‚‚‚‚ƒ„„„ƒƒ€€‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒ‚‚‚‚‚‚„„ƒ„ƒƒƒƒ‚‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚…„‚‚‚ƒƒƒ€€€€€€€€€€€€€€€€{{{{{zzzzzzzzzzzzzzyyxxxvvvvvvvvvvvvwwwwuuvuvuuuxxxwxwxxxxxyyyzzzzzyyxxxxxyyzyzz{||||{{zzzzyzyzzyyyxxwwwvvvvvvvvwxywvuvwttttttttopqrsrrqutututuuwwwwxxyyzxvwxxwuz{}~~}{zyzzyxyz||~€€€€€€€‚‚~‚‚€€€€€~~}}}|‚‚‚~}|{~}}||{{{||~€‚ƒ„…„„„„……†††„„……‚‚‚„ƒƒ‚‚‚ƒƒ‚‚ƒƒ‚‚€€€‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚ƒ‚‚‚ƒ„†††„‚‚‚ƒ„„…………„ƒƒƒƒƒƒƒƒ‚ƒ…†‡†„ƒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚„ƒ„ƒ„ƒ„„„„ƒƒ‚‚‚‚„ƒƒ‚‚‚ƒ„……„„ƒ‚‚‚‚‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚††††††††……††‡‡‡‡‡‡‡‡‡‡‡‡ŒŒŒŒŒŒŒŒ‹Š‰‡†„ƒ‚„„„„„„„„ƒƒ‚‚€ƒ„ƒ‚‚ƒ€€€‚ƒ‚‚‚‚‚ƒ‚‚‚‚ƒ„…„„„ƒƒ‚ƒƒƒƒƒƒƒƒ„ƒ‚‚‚€‚ƒ„…†‡††‡‡ˆˆ‰‰ˆ†…ƒƒƒ‚‚„„ƒ‚‚€€‚‚‚‚‚‚‚‚‚‚„„„ƒ‚ƒƒƒƒƒƒ„„„ƒ„ƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚ƒƒƒ‚‚‚ƒƒ€€€€€€€€€€€€€€€€{||}}}~~}}}}}}}}~~}}||{{{{{{{{{{z{zzzzzzyzyzyzyzzzz{z{zzyyyzz{{{yyyxxxwwyyyzz{{{z{{|{{zz{{{{{{{{}}||{{{{}}|}|}|}}~~|{|}yyyyyyyytuvwwvuuqqpqpqqqnooqrstussstxzyyxy{||{yxxxyxwxy{|€€€‚€‚‚‚~‚€€€€€ƒƒ‚€€€€€€€€€{{zzyzyy||{{zzyyz{}€ƒƒ„„„„……††††„„…„ƒ‚„„ƒƒ‚‚‚‚€€‚ƒƒ‚‚‚‚‚€€‚ƒƒ‚‚ƒƒ‚‚‚‚‚ƒ„‡‡‡…ƒ‚ƒƒ…„„ƒƒ„…†‚ƒƒƒ‚ƒƒƒ„…„ƒƒ‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒƒƒƒ‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚‚ƒ……„„ƒ‚‚‚‚‚€€€€€€€€€€€€€€€‚‚‚ƒƒƒƒƒƒƒƒ……………………ŒŒ‹‹‹Š‹‹‹‹‹‹‹‹ˆˆ‡†„ƒ‚‚…††…€€‚‚‚‚ƒ„‚‚‚‚‚ƒ‚€€‚‚ƒ„……„ƒƒ‚ƒ„…€€€‚……………………‡‡‡‰‰Š‹‹‰‰Š‹‹ŒŒ‹ˆ…„„„‚„„ƒƒ€€‚‚‚‚‚‚‚‚‚‚ƒƒ„ƒƒ€‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€‚ƒƒ„„†€€€€€€€€€€€€€€€€|||}}}~~}}}}}}}}~~~}}}}}~~~~~~~~~}||{~~~~~~~~}}}}}}}}|}}}~~~}}|||{{{||||}}}}z{||||{{{{{z{z{{|||{{zzz{z{z{z{{{|}|zyz{}}}}}}}}{|}}}|{{yyyyyyyyuutsrpooooorvxyxtuwxxwutvvvutsuv|~€€€€€€€€€€~‚€€‚‚€€„ƒƒ‚€}}}}}}}}zyzyzyzzzzzzzyyyxwwvuttsxy|‚‚‚„„……†††††„„……‚‚‚‚‚‚‚‚‚‚‚‚‚€€‚ƒ‚ƒ‚‚‚‚‚„„…ƒƒ‚„…‚ƒ‚‚ƒƒ‚‚‚‚‚ƒ„‡‡‡…ƒ‚ƒƒ…„ƒ‚‚ƒ„„‚‚ƒƒ‚‚ƒƒ‡‡„‚ƒ‚‚€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ€€€€€€€€€€ƒ‚‚‚………„ƒƒ‚‚„„ƒƒƒ‚‚‚ƒƒ„ƒ„ƒƒƒ‚‚ƒƒƒƒ€€€€€€€€ƒƒƒƒƒƒƒƒ‚ƒ„†‡ˆˆ‡‡‡‡‡‡‡‡Œ‹Š‰ˆ‡†ƒ…††…„†‡………„…†‡‡‚‚‚‚€‚‚ƒ„…†…„‚ƒ„…†‚‚ƒƒ……………………‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‰Š‹ŒŽ‰†ƒƒ„„ƒ„„ƒ‚‚€€‚‚ƒ‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€ƒ††…„…‡€€€€€€€€€€€€€€€€|||||}}}||||||||{{{|}}~~}}}}}}}}€}|{{{{{{{{{{}}}}}}}}|||}}}~~~~~}}}||{{{||||}{||}}}||}}}}}}}}}}||{{{{{{{{{{{{{|}|zyz{{{{{{{{{zz{|{{yy||||||||}}||{{{{yyyz~€yz|}}|zy{{{ywvwx|€€€€€€€€€€€~~~€€‚€€…„„ƒƒ‚‚‚}}|{zzyxxxxxxxxxyyyyyyyy~}{xtqomnnmmkkjjvx{~‚‚‚„………†††‡†„„…„‚‚€€€‚‚ƒƒ‚ƒƒ‚‚ƒ…„„ƒ‚‚€€~€‚€‚‚ƒ‚‚‚‚ƒ„†††„‚‚‚ƒƒƒƒ‚‚‚‚‚ƒƒ‚‚‚ƒ†…}|{z|€€€€€€€€€€€€€€€€‚‚ƒƒ„„„‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚€€€€€€€€‚‚‚‚€€‚‚‚‚‚‚‚‚ƒƒ‚‚ƒƒ†……„ƒƒ‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ€€€€€€€€€€€‚‚‚ƒƒƒƒƒƒƒƒ„„„„„„„„‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚„ƒƒ‚€‚ƒ~~‚‚‚ƒ„‚‚‚‚‚‚‚‚‚‚‚€‚‚‚ƒ„……„‚‚ƒ„†‡ˆˆ‰‰ŠŠŠ‹‹‹‹‹‹‹‹‰‰‰‰‰‰‰‰…†‡ˆŠ‹ŒŒŒŽ‘‘‡„ƒ„ƒ„„ƒ‚‚€€‚‚ƒ‚‚‚‚‚ƒ‚€‚ƒ„ƒƒ„„„„„„†††……………‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€„‰Šˆˆ‰Œ€€€€€€€€€€€€€€€€}}}}}}}}}}}}}}}}}}}|}}}}}}}}}}}}~~~~~~~~||||{{{{}}}}}}}}||||||||}}}}}}}}||||||||||}}}}|{{{{|||}}}}}}}}}}}}}}}}}}~~}|||}||{zyxx{{{{{{{{zzzzzzzz}}||||||~}}|||}}~~~}}~~~~~~~~~€€€€€€€~~€‚ƒ‚‚‚‚††††††††‚~|zzzzzyxxyz}~{{||}}~~‚~zpjgdgosqlghnu}‚ƒ‚ƒ…………††††„„…†…ƒ‚‚€‚‚‚ƒ‚‚‚€~|{~~}|{zyyxxyz{zxu|‚ƒ‚„‚‚‚ƒ……‡ˆ…‚†„„„„…………‚ƒƒƒ‚‚ƒ…„|xuv{~€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ€€‚‚‚‚‚‚‚‚‚‚‚†‡‡†„ƒƒ„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€‚ƒ„„„„„„„„ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚ƒƒƒ„„„„‚€‚‚‚ƒ‚€€€€€€€€€€‚‚‚€‚€€‚‚€ƒ‚€‚„…‚‚‚‚ƒƒ†ˆŠ‹Œ‹Š‰ŽŒ‰ˆˆ‰‰ƒƒ„„„„„ƒƒ„…‡ŠŒŒ‰†‡‹Œ†ƒƒƒ‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚‚ƒ‚‚‚„†‰‹‰‰‰‰‰‰‰‰‹ŠŠ‰‰‰Š‹‡‡†ƒ€ƒƒ‚‚‚‚‚‚ƒƒ‚‚ƒ‚‚€€‚‚‚‚ƒƒˆˆ„„€€€€€€€€€€€€€€€€||||||||||||||||}}}}}}}}}}|}|}|}}}}}}}}}}}}}||||}}}~}~}}||||||||}}}}}}}}||||||||z{|}}~}}{{|||}}}}}}}}}}}}}}~}}}}~~~}|||~~}}||{{||||||||||||||||}}|{{{||{{zzzz{{|}}~~}}|||||||||€€€€€€€€€€ƒ‚‚‚…††………………………ƒƒ‚‚€~~~}||~€~~~~~€}{wtutllv||xpkmu}‚ƒ‚ƒ…………††††…„„……ƒ‚‚‚‚‚‚ƒ„ƒ|zxwzzzzz{{{zzz{|{yw{~‚ƒ…‚‚‚ƒ…†‡†„ƒ…„„„„„„„„„‚‚ƒ……„„‚}xuw{€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒ…††…ƒ‚‚ƒƒƒ‚‚‚ƒƒƒƒƒƒƒƒ€€€‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒ„„ƒƒƒƒ„„‚„…„‚€€‚‚‚‚‚‚‚€‚€€€ƒ‚‚‚‚ƒ„ƒƒ…†††„„‡‡………†‡ˆ‰‰‰‰‡…ƒ‚ƒƒƒ„„„ƒƒƒƒ„†ˆ‰‰ˆ‰‡……ˆ‹ŽŒ†ƒƒƒ‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚‚‚‚ƒƒ…†ˆ‰‰‰‰‰‰‰‰‰‰‰ˆˆ‡ˆ‰‰‡‡†„€ƒƒ‚‚‚‚‚‚ƒ‚‚‚‚‚‚€€€€‚‚ƒƒƒ‚‚…‹‰„€€€€€€€€€€€€€€€€{{{{{{{{||||||||}}}}}}}}|||{|{||||||||||~~~}}|||~~~~~~~~}|}|}|}}}|}|}|}|||||||||yz|}~~~~||||}}}}~}~}~}~~~~~~~~~~~~}}|||~~~~~~~~}}}}}}}}}}}}}}}}}}||{{||||{{{{||{||}}}||{{{{{{{{€€€‚€€€€€„‚€‚ƒ‚ƒ€‚†‡†„€€€€‚ƒ…††…„ƒ‚€€€€€€~~}~}{ury{tx~€wpou}‚ƒ‚ƒ„„……†††††„„„„‚‚‚‚‚ƒ‚€~|{z{|yzz{||}}|||}}}{yz|‚ƒ„†‚ƒ‚ƒ…‡‡…ƒ‚‚ƒ„„„„ƒƒƒƒ‚„‚‚„…†……‚~yvw|€€€€€€€€€€€€€€€€€ƒ‚ƒ‚ƒ‚ƒƒƒ‚ƒ‚ƒ‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„…„‚‚‚ƒƒƒ‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒ‚‚‚ƒƒ‚‚‚‚ƒƒ„…††„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚€€€€€‚‚ƒƒƒƒƒ††…„……‡ˆ‡…„ƒƒƒ……„†ˆ‰‰…~ƒƒƒƒƒƒƒƒ„ƒ„…ˆˆ‡……„„ƒ„†ŠŒ†ƒƒ„‚‚ƒƒƒƒ‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚ƒƒ‚‚‚‚ƒ„…†‡‡‡‡‡‡‡‡‡‡‡‡‡††††‡‡‡‡‡„‚€‚ƒƒ‚‚‚‚‚‚‚ƒ‚‚€€‚‚ƒƒƒƒŠŽŠƒ€€€€€€€€€€€€€€€€{{{{{{{{{{{{{{{{||{|{|||{{{{{{{{{{{|{|{{}}}}||{{}}|}|}}}}}}}|}}}||||||||||||||||z{|}}~}}|||}}}}~~~~~}~~~~~~~~~~~~~~~}}~~~~~~~~||||||||||||||||~}}||||}}}|||}~~{|}}~}}|{{{{{{{{€‚€€€€€…ƒ€€‚‚ƒ€ƒƒ‚€€€€€ƒ…††††€}}||~~}}|||vlowy~zrpu}‚ƒ‚ƒ„„„……††††…„„ƒ‚‚ƒ‚€‚ƒ‚~|{}~~}~}~}~~}}~~}{y{~€‚„…†‚‚‚‚ƒ…‡‡†„‚‚ƒ………„„ƒƒ‚‚‚ƒ„„ƒ„†ˆ…ƒ~yvx|€€€€€€€€€€€€€€€€€ƒƒƒƒ‚ƒƒƒƒƒƒƒ‚ƒƒƒ„„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚ƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒ„……„‚‚‚ƒ„„ƒƒƒ‚‚‚€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚„„„„ƒƒ‚‚‚‚…†‡†„ƒ‚ƒƒƒ‚ƒ‚ƒƒƒ‚‚‚‚‚‚‚‚€€€€‚ƒ„…„ƒ‚ƒ„„……………„…‡ˆ‡†ƒƒ…ˆ‹Š‰…„„„ƒƒ‚ƒƒƒ…„„‡‰‹ˆ†‚ƒ„ƒƒˆŒ†‚ƒƒ‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚‚‚‚ƒ…‡ˆ‡†…††††††††††…†…†††‡‡‡†‚ƒƒ‚‚‚‚‚‚ƒ‚‚‚€€‚‚‚‚‚‚‚‚„Љƒ€€€€€€€€€€€€€€€€€{{{{{{{{{{{{{{{{zzzzzzzz{z{z{z{z{{{{{{{{|{{{{zzz{{{{{{{{||}|}|}|{{{{{{{{{{{{{{{{||}}~}||||||}}}}}}~}~}~}~~~}~}~~~~~~~~}}}|}}}}}}}}||||||||~~}}}}}}||{{||}~|}~~~~||||||||€€€€€€€€ƒ€€€€€€€€€€€‚ƒ…†‡€€~|{{}}}}}}}}}€xihs|}~}~|snu}‚ƒ‚ƒ„„„„…………‡……„„‚‚‚€‚‚…‚|{{}~~~~~~~~~~~~~|yz|‚„…„‚ƒ‚ƒ…†‡ˆ„€ƒ†††……„„ƒƒ‚ƒ„„ƒ„†‡…ƒ~ywx}€€€€€€€€€€€€€€€€€‚‚ƒ‚ƒ‚ƒ‚‚‚ƒ‚ƒ‚ƒ‚„ƒ„ƒ„ƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„…„…„…„……ƒƒƒƒƒƒƒƒƒƒƒ„„„„…ƒƒƒƒƒƒƒƒ„…†…„ƒ„…„„„„ƒƒƒƒ‚‚ƒƒƒ‚ƒ‚ƒ‚ƒƒ‚‚‚‚‚‚‚‚„ƒ„ƒƒ‚‚‚„ƒƒ‚‚‚‚‚„…†…„‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚€€‚‚‚€‚„……„ƒ‚‚ƒ„„„„„„‚…‰‹Š‡ƒ„„†‡‰Š‹‹†…„ƒƒƒ„„„‚ƒ†‹Œ‰†„…ƒ‚ˆŽŒ†ƒƒ„‚‚ƒƒƒƒ‚‚‚ƒƒƒ‚‚ƒƒƒ„…†ˆˆ‡†„†††††††††††††††††‡ˆ†„‚‚ƒ‚‚‚‚‚‚‚ƒ‚‚€€€‚‚‚ƒƒƒ‚‚€†‹‹‡‚€€€€€€€€€€€€€€€€{{{{{{{{||||||||zzzzzzzz{{z{z{{{{{{{{{{{{{zzzzyyzzzzzzzz||{|{|{|z{z{z{z{zzzzzzzz|}}~}}|{{{{{||||}}|}|}|}}}}}}}}}~~}~}}}}~~~}}||~~~~~~~~||||||||~}}|||}}||||}}~|}~}}}}}}}}~€€€€€€€€€€€€€€€‚€€€€€€€€ƒ‚‚ƒ…‡‚ƒ‚‚€~}~~~~~~~~~~xlku~~||€|uqu}‚ƒ‚ƒƒ„„„„………‡………„‚‚€€‚}{zz{|}z{{|}~~~~~~~~~}{{|‚„ƒ‚‚‚‚‚ƒ……‡ˆ…€‚††………„„„„…ƒ‚‚„……„…‚}yvx|€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ……………………„„„„„„„„ƒƒƒƒ„„„„„„„„„„„„„†††„„…†………„„„ƒƒƒ„ƒ„ƒ„ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ„ƒƒƒƒƒƒƒƒ„„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚„ƒ‚‚ƒ„……ƒƒƒƒƒƒƒƒƒ‚‚‚‚‚€€‚ƒƒƒ‚‚„………ƒ‚…„ƒƒƒ„…†ƒ„…‡†…ƒ‚ƒƒ‚ƒ„‡ŠŒˆ‡…„ƒ„„…‚†ŠŒˆ„‚„…„‚ƒ‰ŽŒ†‚ƒƒ‚‚ƒƒƒƒ‚‚‚ƒƒƒ‚‚ƒƒƒ††‡‡‡†……………………………††‡†††…†ˆˆˆ„ƒ‚‚ƒ‚‚‚‚‚‚ƒ‚‚‚€€‚‚ƒƒ‚‚‚‡Œ‹†ƒƒ€€€€€€€€€€€€€€€€||||||||||||||||{{{{{{{{{{{{{{{{|||{|{||{{{{zzzzzzzzzzzz{{{{{{{{zzzzzzzzyyyyyyyy{|}}~}}|zzzz{{{|||||||||||||||||{{{{{{{{|{{{{{{{||||||||{{{{{{{{||{{{{{{||||}~~{|}~}}}}}}}}~€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚ƒƒ„„„‚€~~}}||{|}}vmpy}€}||uru}‚ƒ‚ƒƒƒ„„„„……†…………‚€€€ƒ‚yyz{|}~~{{||||}}~}}}~}||{|~‚ƒ‚€‚ƒ‚ƒ…†‡‡„€ƒ…„„„„„„„„…„‚‚ƒ„ƒ‚„}xvw{€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ„„„ƒ„ƒ„„ƒƒƒƒƒƒƒƒ‚‚ƒƒƒ„„„„„„„„„„„ƒ„……„ƒ„…†…………„„„„„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„…††††††††…………………………………………„„„„„„…„„„ƒ‚ƒ…†…ƒ‚‚‚‚‚‚ƒ‚‚‚ƒ‚‚‚‚€‚‚‚€€ƒƒƒ‚ƒ„……„„ƒ‚ƒ„…†…„„„„ƒƒƒ„……„ƒ‚€‚„‡‰Š‰‡…„„††…ƒƒ‡ŒŒ‡‚ƒ„„ƒ‚„‰Œ†ƒƒ„‚‚ƒƒƒƒ‚‚‚„ƒƒ‚‚ƒƒ„‰ˆ‡††…††††††††††„…†††……„†ˆ‰ˆ†ƒ‚‚ƒ‚‚‚‚‚‚‚ƒ‚‚‚‚ƒƒ‚†Œˆ„‚€€€€€€€€€€€€€€€€}}}}}}}}}}}}}}}}}}}}}}}}{{{{{{{{||||||||||||{{{{{{{{{{{{zzzzzzzzzzzzzzzzxxxxxxxxzz|}~~~~yyzzz{{{{{{{{{{{{{{{{{{{yyyyyyyyxxxyyzzzzzzzzzzzyyyyyyyy{{zzyyzzyyyyz{||yz|}~~~~||||||||}€€€~€€€€€€€€€€ƒ‚€}€€€€€€€€€‚‚€~}‚„…„ƒ€~~}|zyxxy}~ulqz{{~ƒ|qmu}‚ƒ‚ƒƒƒƒ„„„……†……†…‚€€€‚ƒƒ}}~~~}|€~||{z}||}}}|}||~‚ƒ~‚‚‚ƒ…‡‡…„‚‚ƒ„ƒƒƒƒƒ„„„„„„ƒ‚ƒ„|xuv{~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ„„„„„„„„„„‚ƒ„„ƒ‚ƒ„††………„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„ƒƒƒ„…………………………††††††††‡‡‡‡‡‡‡‡††††‡‡‡ˆ‡‡†…„„„„„†‡†„‚‚ƒ‚‚‚‚‚‚‚‚ƒƒ‚‚‚‚€ƒƒ‚‚ƒ€‚ƒ‚‚ƒ„„„„„„ƒƒƒƒƒ„„…„„ƒƒ„…†‡‡…ƒ‚‚ƒ„…‹Š‡…„…†‡ˆ††‰ŽŽˆ‚ƒƒƒ‚‚…‰ŒŒ†ƒƒƒ‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚„ƒƒ‚‚ƒƒ„‹‰‡………†‡††††††††ƒ„…†……„ƒ†ˆ‰‰†ƒ‚‚ƒ‚‚‚‚‚‚ƒƒ‚‚€‚ƒ„…„‚…‹‹…€€€€€€€€€€€€€€€€|ywwz}€}€€~~}}}}}}}|}}}}}}}}}}|{{{|}}}}}}}}}}~€}|~}}}~~€}zz|~}|||||||||x{‚‚~|zzzzzzzz}|zyxxyyzz{{{{{{{ywvvx{}zzzzzzzzzzzzzzzzyyyyyyyyzyzyzyzzuwxyyz{}yz{|}||{yyzz{{||}€€‚~€€€€€€€€‚‚€€€ƒ‚€€€ƒƒ‚‚€‚‚‚‚‚‚‚‚ƒ…‡†ƒ‚ƒ€}|~vorvzymmx~vmmu{€„…„ƒƒ„„…††‡ƒ„……„ƒ‚‚€ƒ‚||}}}}}|}}}}}~}}}~~}~~|{|~ƒƒ‚‚‚ƒ„…‰ˆ‡„‚‚ƒ…ƒƒ„……„ƒƒƒ‚ƒ…ƒ‚ƒ‚~yuvz€€€€€€€€€€€€€€€€€„‡‡‚€€€€€‚€~~‚€€€€€€€€‚‚€~~€€€€€~~~€€€€€€€€€€€€ƒƒƒƒƒƒƒƒ‚‚ƒƒƒƒƒƒ‚ƒ„„ƒ‚‚……„„…†‡ˆƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„„„„†††††††††††………„„ˆ‡†„„„„„……„„„„„„…„ƒ‚€€€‚‚€€€€€€‚‚‚‚€~‚„„ƒƒ……†††‡‡‡ƒƒ„„……††………………………Š‹‡…‰ŠŠ‰‰ŒŽŠƒ……„ƒ‚†’Œ†‚‚‚„„„ƒƒ‚ƒ‚‚‚‚‚‚ƒƒ‚ƒ‚ƒ‚ƒ‚……………„„„†††……………„……††…„ƒ‡†‡ˆ†ƒ‚‚‚‚€‚ƒ‚€ƒ‚„††ƒ…‡ŠŒŠ„€€€€€€€€€€€€€€€€€|yvvy}€~€‚€€€€€€€€~}}~~|{xxxxxxxx{}~}{{|~{|||}}~~‚|}€}}}}}}}}xz~€}{||||||||€}|{||}~~||{||}||zzzz{|zzzzzzzz}}|{yxww{{{{{{{{xxxxxxxxyyyyyxyyz{{||{zyyyyzz{{{|€€‚~€€€€€€€€~€€‚‚€~€‚‚‚‚‚‚‚‚ƒ…‡…ƒ‚‚}{yqkovx|xnmw€~|slnu{€„…„ƒƒƒ„……††„„………„‚‚‚€ƒ‚|}}~~~~~}}}~~~~~~~}}~||{~ƒƒ‚‚‚ƒ„…‡‡…„ƒ‚ƒƒ„„„ƒ‚ƒ‚ƒ…ƒƒƒ‚~yuvz€€€€€€€€€€€€€€€€„ˆ‹Š†‚‚ƒ€€€€‚€€€ƒ„‚‚‚‚‚‚‚‚€‚ƒ„ƒ„†ˆˆˆˆˆˆˆˆˆƒƒƒƒƒƒƒƒ„ƒƒ‚‚€€€€€€€€€~‚‚~€€€€€€€€€€‚ƒ„„…„ƒ†††††††††††…………………„…„………††††††††‚‚‚ƒƒƒ„„ˆ‡†…„……†††††…†……„„ƒ‚‚‚€€€€€‚‚‚€€ƒ„„„„‚ƒƒ„„…††…………„„„„……………………†‰‹‹ˆ‡‰Œˆˆ‡‡‹Š„‚ƒ„…†‰ŒŒ†‚‚‚„„„ƒƒ‚‚ƒ‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ………………„„††…†…†…………†††…„„‡†‡ˆ†ƒ‚‚‚‚‚ƒƒƒ‚€‚ƒ€‚………ƒ„‡‹ŒŠ„€€€€€€€€€€€€€€€€€{xvvy}€€‚„ƒ‚‚‚‚ƒƒƒ„……†ƒƒƒƒƒƒƒƒƒƒ}zuuuuuuuuz{}|zy{|{{{{||}}~{yx{||{xxxxxxxxwy|~}{z{{{{{{{{~}{{{|}~~~~~~~~}|{z}}}}}}}}~}}||{{{zzzzzzzzyyyyyyyy}}|{zzyx}}~}}{zyzzzz{{|||~€€€€€€€€€€~‚€€~}}}~~~€‚ƒƒ‚‚‚‚‚‚‚‚€„†‡†ƒ€‚‚{vnlrtquvomv€€|wskiou{€€ƒ…„‚‚ƒƒ„………„……†…„ƒ‚‚ƒƒ}}~€€~~~~~}~~}}||}|{|}ƒƒ‚‚‚ƒ„…†††„ƒ‚‚‚ƒƒƒƒ‚‚ƒ‚ƒ…ƒ€„…‚}xuvz~€€€€€€€€€€€€€€€€†ŠŒ‡ƒƒ„€€€€‚€‚„„‚‚‚‚‚ƒƒƒ…‰Œ††††††††‰ˆˆ†…„ƒ‚‡‡‡‡‡‡‡‡††††††††‡…‚€€‚…‡…„…„…„…„‚‚‚‚€€€ƒ„†„ƒ‚€€„„ƒƒ‚€€……………………ƒ„„……††‡„„ƒƒƒ„…†……………………„ƒ‚‚‚‚€‚‚‚€ƒ„…………‚‚‚‚ƒƒƒ†……„„ƒ‚‚……………………‡ˆ‰‰‰‰ŠŠ‡‡††ŠŽ‹†‚…‰ŽŽŒ†‚‚‚„„„„ƒ‚ƒ‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚…………………………†…†…††††††††……‡†‡ˆ†ƒ‚‚‚‚‚‚ƒ„„ƒ€‚‚‚‚‚‚‚‚ƒ€€ƒ„…„‚„‡‹Š…€€€€€€€€€€€€€€€€€ywtvy~‚‚„……„ƒƒ„ƒ„„……‡‡‡††††††††‡…„†‡…€{vvvvvvvvz|}}{z{}|||}}~~~|yvwxzzywwwwwwwwxy{||{zxwwwwwwwwzywvvwxyz|‚ƒ‚€~€|ywyzyzyzyytuvxyz{|{{{{{{{{zzzzzzzz~||}}|z€€€~|zy{|{|||||{~€€€‚€€€€€€€€~}|{{|}||}€‚ƒ„‚‚‚‚‚‚‚‚€€„†‡„‚‚€}vqryuprumhow~~wpjdeou{€„…„‚‚ƒ„„…………††…„ƒ‚‚€ƒ‚}}~€€€~}}}~}}}}}}~~||{~ƒƒ‚‚‚ƒ„…†‡‡‡„ƒ‚‚ƒƒƒƒƒƒƒƒ„‚ƒ„‚€…‡ƒ}wuvz~€€€€€€€€€€€€€€€€„ˆ‹Š…€€€€€€‚~~~~~~~~€€~~€„‡‹Œ‹Œ‹Œ‹‹†††‡‡‡‡ˆ‰‰ˆ‡†……„ŠŠŠŠŠŠŠŠŒŒŒŒŒŒŒŒŠ‡……‡Š‹‹‹‹‹‹‹‹ˆˆˆˆ‡‡††„ƒƒ‚ƒƒ„„ƒƒƒƒ„…‡ˆ††††††††ˆˆ‡†…ƒƒ‚„„„„„„„„€€€€€€€€‚‚€€ƒ„…‚‚‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚„††‡††……„ƒ‚€„„ƒ„ƒƒƒƒ……………………ˆ‡†‡‰‹Š‰‡‡†‡‹ˆƒ„†Š’‘ŽŒ†‚‚‚„„„ƒƒ‚‚‚‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ……………………………†…††††††††††…‡†‡ˆ†ƒ‚‚‚‚‚ƒ„…„ƒ‚‚‚‚‚‚‚ƒ€ƒ…„ƒƒ‡Œ‹…€€€€€€€€€€€€€€€€€xutty~‚ƒƒ„††…ƒ„„‚‚ƒƒ„„……††††††††ˆ‡ˆˆ‰†‚}xxxxxxxx|~~}|}~~~€€€€}zz}~~|}}}}}}}}yyz{zzyxwwwwwwwwwvuuuvwx{}€‚ƒ‚€~|xvssssssssnnpprsttrrrrrrrrwwwvwwwwzxwy|~}{~~~~|zxwzzzzzyzyz~€€€€€€€€€€~}|{zz{|z{|~€ƒ„‚‚‚‚‚‚‚‚‚€€„……„ƒ~vqtyxrstkcgn{|xrmeelu{€€ƒ…„‚‚ƒ„„………†††…„‚‚ƒƒ||~~€~}{{|}}}}~€|{|}ƒƒ‚‚‚ƒ„…†‡ˆ†…‚‚‚„„„ƒ„ƒ„„„ƒƒ„‚€ƒ‡‰ƒ|vtvz}€€€€€€€€€€€€€€€€„‡Šˆ„€€€€€€€~~~~~~~~~~~~|{}‚…ˆˆˆˆˆˆˆˆ„………‡‡‡‡††††††††…„…„…„…„†††††††††ˆŒŽŽŒˆ†ˆˆˆ‡ˆ‡ˆˆŒ‹‹ŠŠ‰‰ˆ‚ƒ„„„„ƒƒ„„„…†‡‰ŠŒŒŒŒŒŒŒŒ‘‘ŽŽŽŽŽŽŠŠŠŠŠŠŠŠˆˆ†…ƒ€€‚‚‚‚ƒ„…†‚‚ƒƒ„„ƒ‚‚‚‚‚‚‚‚ƒ„†‡ˆˆˆ‡‹Š‰†„€€‚‚„„…†……………………ˆ…„†ŠŒ‹ˆŠ‰ˆ‡Œ‹…ƒƒ‡ŒŒ†‚‚‚„„„„ƒ‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚…………†…†……………††††‡‡‡†††††‡†‡ˆ†ƒ‚‚‚‚ƒƒ„……ƒ‚ƒ‚„„ƒ‚‚‡Œ‹…€€€€€€€€€€€€€€€€€vtrty~‚„‚„…†„ƒƒ„ƒƒƒƒƒƒƒƒ…†‡‡…ƒ€xxxxxxxx}€}}~€€€€|yz{~}|~~~~~~~~{{zzzyyy{{{{{{{{{zyyyz|}€€~€€}ywwwvwvwwwxxvusrqqoooooooorrrrrrrrsqpty||zzzzzzxwvxxwwvvvvy~€€€‚~~}|zzz{{zz{}~€‚‚‚‚‚‚‚‚‚ƒ€„…†…€~uopqqostkflsx|}}yohku{€„…„‚‚ƒƒ„…………†††…ƒ‚‚€ƒ‚|}}~~~}}~~|{{||{zz|}~~||{~ƒƒ‚‚‚ƒ„…†††…‚‚„„„„ƒ„„„…ƒƒƒ‚„‰‹„{utwz|€€€€€€€€€€€€€€€€†ŠŒŠ…€€€€€€‚€~‚‚‚‚‚‚‚‚~€€€‚†‰ˆˆˆˆˆˆˆˆƒ„„…†‡‡ˆƒƒƒ„„„……„„„„„„„„ƒƒƒƒƒƒƒƒƒ…ˆŠŠˆ…ƒ……………………‰‰ˆ‡††…„€‚ƒ„„„„†……„„…††……………………ƒƒƒƒƒƒƒƒŽŽŽŽ‘‘‘‘‘‘‘‘‘ŒŠ‡…„†……„…†‡ˆƒƒ„……††‡„ƒ‚‚‚‚‚‚‚‚‚‚„…†ˆ‰Š‰‰Ž‹ˆ…ƒ~€‚ƒ…†‡……………………†…„†‰ŒŠ‰‹‹ˆ‡‹Š„ƒ‚ƒ†‰ŒŒ†‚‚‚„„„ƒƒ‚‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ………†…†††……………†††‡‡††††††‡†‡ˆ†ƒ‚‚‚‚‚ƒ„…„ƒ‚€€€‚‚ƒ„…‚~‚‡Œ…€€€€€€€€€€€€€€€€€usrsy~‚„ƒ„„ƒ‚‚ƒ‚€~~~~ƒ~|~€yyyyyyyy|}~|{}~~~€€€~{xxz||z{{{{{{{{}|{zzyzz||||||||~~}}}‚„ƒ‚€€€‚‚}{||||||||~}zxutsyyyyyyyysssssssssposz~}zyz{{{zyyyyxxwwwvy~€€‚‚€€‚€€~~}|{zz{|z{||~€€‚‚‚‚‚‚‚‚‚‚ƒ…†€€wrqnlowwnlu{y}vmmu{€„…„ƒƒƒ„……††……†…„ƒ€‚€ƒƒ}~~~~}}|}€}{}~}{zyz{{{|{|}ƒƒ‚‚‚ƒ„…‡‡†ƒ‚‚ƒ„„ƒ‚ƒƒ„„…ƒ‚ƒ‚…ŠŒ„zttwz|€€€€€€€€€€€€€€€€ˆ‹ŽŒ‡‚‚€€€€~€‚ƒ……„„‡‡‡‡‡‡‡‡‚„††††ˆŠ‰‰‰‰‰‰‰‰„„…†‡ˆ‰‰„„„„ƒƒƒƒ††††††††……………………‡†„‚‚„†‡††††††††††…„ƒ€€‚ƒ„………„„ƒ„„…†……………………‚‚ƒ„…††‰‰‰‰‰‰‰‰‡‡‡‡‡‡‡‡‹‰‡„ƒ‚†…„ƒƒƒ„„ƒ„„…†‡ˆˆ„„ƒ‚‚‚‚ƒ‚€‚‚…†ˆ‰ŠŠŠŠŒ‹Šˆ†„ƒ‚€ƒ„……………………………„…†‰ŠŠŠŒŠ‡…ˆŒ‡………„…‡ŠŒ†‚‚‚„„„„ƒ‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚…………††††„„……††‡‡‡‡†………††‡†‡ˆ†ƒ‚‚‚‚‚ƒ„„„ƒ‚‚‚‚ƒ…„‚€}‡Œ…€€€€€€€€€€€€€€€€tsqsx~ƒ„€‚„„‚‚‚‚‚‚€~}||}}}}}}}}y}€}xw{€{{{{{{{{z|}|zz{}}}}~~‚||€€~~~~~~~~~}|{zzzzzzzzzzzz~~€‚ƒƒƒƒ‚‚€‚ƒƒƒ‚€xxxxxxxxyxwvtsrrwwwwwwwwwwwwwwwwwsrv}||}~~~|||{{zzyx~€‚‚€€€€€‚‚~}|{{{{|{{||}~‚‚‚‚‚‚‚‚„„‚‚ƒ…~€‚|wvqpv~zomvz{}}€xppu{€„…„ƒƒ„„…††‡…………„ƒ€‚€ƒ‚~~}}||~€}}~€|{|||||{{~ƒƒ‚‚‚ƒ„…‰ˆ†„‚‚ƒ…„ƒ‚‚‚‚ƒ„…ƒ‚ƒ‚…‹…zttwz|€€€€€€€€€€€€€€€€ˆ‹ŽŒ†‚€€€€}‚…ˆ‰‰‰‰‰‰‰‰‰‰‰ˆŠ‹‹ˆ‡‡‡‰‰‰‰‰‰‰‰……†‡ˆŠŠ‹‡††„ƒ‚ƒƒƒƒƒƒƒƒ……………………‡‡†……†‡‡„„ƒ„ƒ„„„†…„ƒ‚€…„ƒƒƒ„…†‚‚‚ƒ…‡‰Š……………………}~ƒ„††ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‹‹Šˆ‡…„ƒƒ‚~‚‚ƒ„…††‡…„ƒ‚€€€‚‚ƒƒ‚‚€€‚‚†‡ˆŠ‹‹‹Šˆˆ‡††…„„‚‚ƒƒƒ……………………„„…†ˆ‰Š‹‹‰…ƒ†Š‰…‡‰Š‰ˆˆ‹ŽŒ†‚‚‚„„„ƒƒ‚‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ………†††††„„……††‡‡‡‡†………††‡†‡ˆ†ƒ‚‚‚‚‚ƒ„„„ƒ€‚‚‚‚‚‚‚‚‚‚‚„…„‚}‡Ž…€€€€€€€€€€€€€€€€wursx~ƒ‡†…„ƒƒƒƒ€€€€~~}|{{{|}|{zyyz{|zzzzzyyy}}xuvwwzzzz|~~zx|€€~~~~}}~~~}|z|~~{wx{~~|{{|wz~ƒ‚€€‚ƒƒ‚€ƒƒ„„ƒ~yxwvuvxzy||wuvxwvwxyyxwvtuuuvvvwvutvz|}}}~€€}|}~}{yxy{€‚€€‚ƒ‚€€€€€€}}|{{zzy{{|}~€€€€‚ƒƒƒƒƒ‚‚ƒƒ‚‚€~€}vpqz‚€€€{smtyƒ„ƒƒƒ„„„„…………†……††ƒ€€€€€€~~}|||||}}~~~~~}}||||{{}ƒƒ‚‚…‡ˆˆ‡†„ƒ„…ƒƒƒƒƒƒƒƒ††…„…ˆ‹…}vtv{~€€€€€€€€€€€€€€€€„ˆ‹Š†‚ƒ€€~~‚ƒ„„………‡‡‡‡‡‡‡‡ˆˆˆˆˆˆˆˆ‡‡ˆˆˆ‰‰‰ˆ‡ˆ‹ŒŠŠŒ‹ŒŠ‡……„ƒ†††……„„„„„„„„„…………………………„„ƒ‚ƒ„†‡‡…„‚€€‚ƒƒ„„ƒƒ†„‚‚„†„‡‡ƒƒ…„‚‚„ƒ„‰‡‡‡‡‡‡‡‡‡‡ˆ‡ˆ‡ˆ‡ˆ‰Š‰†„ƒ„‚~{|}}~€„‚€ƒ„„„ƒƒ‚‚‚ƒ‚‚‚‚‚‚‚ƒ†††‡‡ˆˆ‰‹‰‡††…ƒ‚‚‚€€…††††…„ƒƒƒ„„…††‡~€„‰Œ‹‡„…„ƒ„†‰Œˆƒ‚ƒƒ„„ƒƒ‚€‚‚‚‚‚ƒƒƒƒ„……†‡‡‡‡†………†††††„„…††…„„…†ˆ‡…ƒƒƒ‚‚‚‚€‚‚ƒƒƒƒ‚‚€€€€€€€€‚‚‚‚‡ˆ‚}ˆŒŠ…‚€€€€€€€€€€€€€€€€wsopv†Šˆ‡†……………ƒƒƒ„ƒƒ‚‚€~}|}}~||{zz{|}||||{{{{{~~{z|}}z{}~€€€|z{~~}~€~}||}~}|z{}~|yz{|}}|zyx{~‚‚€€‚‚‚‚‚ƒƒ„„„ƒƒ}|zywxz{y||wuvxwwwxxxwwvvvvvwwwwvutvz}~~}~€€~}{}~~{yyy{€‚€€€‚‚‚€€€€€€€}}||{zzz{{|}~€€€€‚‚ƒƒƒƒ‚‚‚ƒ„„ƒ‚€~~~|wsu|‚ƒ‚€}xqmty‚ƒƒƒƒ„„„„…………†……†…‚€€€€~~||{z||}}~~~~~||}}~|{{~€ƒƒ‚‚„‡†‡†…ƒ‚ƒ„ƒƒƒƒƒƒƒƒ…†„„„€‡‹…}vtv{~€€€€€€€€€€€€€€€€†Š‹†~~~~}}‚ƒ„„„„†††††‡‡‡ˆˆˆˆˆˆˆˆ‡‡‡ˆˆ‰‰‰†…†‰ŠˆˆŠ‹‹‰…ƒƒ‚€†††……„„„„„ƒ„ƒ„……………………………„ƒƒƒ…†‡†…„‚‚‚ƒ„„„„ƒ‚‚ƒƒƒƒ‚‚ƒ††‚€‚„ƒ‚‚„ƒ„‰‡‡‡‡‡‡‡‡ˆˆˆˆˆˆˆˆˆ‰Š‰†„ƒ„~{|}}~€„‚€ƒ„„„ƒƒ‚€‚‚ƒ‚‚‚‚‚‚‚ƒ…†ˆ‰ŠŠ‰ˆ‹‰‡††…ƒ‚‚‚€€„„…††…„„ƒƒƒ„„„„…†††‰‹Š„€€„‡‰Œˆƒ‚ƒƒ„„ƒƒ‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ„††‡‡‡††…………†††††…††‡‡‡†……‡ˆ‡…ƒƒƒ‚‚‚€€‚‚ƒƒƒƒ‚‚‚‚‚‚‡ˆ‚}‚‡ŒŠ…‚€€€€€€€€€€€€€€€€yvrrx€‰ˆ‡‡††††††††……„„„ƒ‚€}}||||}}{{{zzyyy{~€~€}~€€€€|{{~~|}|}}}~}}|~|zz}~}|}{z{}}zvz{‚‚€‚‚ƒ„…„„ƒ„„…†€~|yxxyzy||wuvxwxxwvvvvvwwwwwvvvvutvz}~}~€€~}{}~}{yyz{€‚€€‚‚€€€€€€€€}}||{{zz{{|}~€€€€‚‚ƒƒ‚‚‚ƒ„ƒ‚€~}}{|{wsty}xxxvspnmuy~‚ƒƒƒƒ„„„„……………„…†…‚€€€€€~~~}}||{}}}}~~~~~~}}}|{{}ƒƒ‚‚‚„†………ƒ‚‚‚ƒƒƒƒƒƒƒƒ„…ƒ‚ƒ†‹…}vtv{~€€€€€€€€€€€€€€€€„ˆ‹‹†}|~~~~~~~~€‚ƒ„„„ƒ„„„……†††‡‡‡‡‡‡‡‡‡‡‡‡ˆˆ‰‰…„…ˆ‰‡‡‰‰‰ˆ†………ƒ††…………„„„ƒƒƒ„„„……………………………„„„…†‡†…ƒ‚‚‚ƒ„„„„ƒ€‚…‡‡…‚€„‡‡ƒƒ…„‚‚„ƒ„‰ˆˆˆˆˆˆˆˆˆˆ‰ˆ‰ˆ‰ˆˆ‰Š‰‡„„„}{|}}~€„‚ƒ„„„ƒ‚‚€‚ƒ‚€‚‚‚‚‚‚ƒ„†‰‹Œ‹‰ˆ‹‰ˆ††„ƒ‚‚‚€€‚‚„…††††………„„„„„ˆ…„†‹Œ‰…ˆˆ‡‡‰‹ŽŒˆƒ€‚ƒƒ„„ƒ‚‚€ƒƒ‚‚‚‚ƒƒ‚‚‚ƒƒƒƒ„†‡‡‡††……………†††††††‡‡‡‡‡†…‡ˆ‡…ƒ‚ƒ‚‚‚€‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚†ˆ‚}ˆŒŠ…‚€€€€€€€€€€€€€€€€~|yy|†Š†††††††‡†…„„ƒƒƒƒ……„ƒ‚€~~~~~~{{zzyxxx|€‚€€}~~~~€{y|~||{|~€}|~|z{|~~~~|{{|{yx{}‚‚€€ƒ…†ˆ†„ƒ‚‚ƒ~zxwwvvy||wuvxwyxvvuvvwwwwvvuuuvutwz~~€€~}z|~~{zyz{€‚€€€€€€€~}}|{{zzz{{}}€€€€€‚‚‚‚€‚‚…„„ƒ‚€€xnijmmnnmihikuy~‚‚ƒ„„„„„……………„„†…‚€€€€€€}~}~}~~~||}}}}}~}~~~~}|||{{~€ƒƒ‚‚€‚„†………„‚ƒƒ‚ƒ‚ƒƒƒƒ„‚‚‚~…‹…}vtv{~€€€€€€€€€€€€€€€€ƒ‡ˆ†~|€‚„„„ƒƒ‚‚ƒƒ„„…………††††‡‡†‡‡‡‡ˆˆˆ…„…‰‰ˆ‡‰…†…ƒƒ„…ƒ……………………„„ƒƒƒ„„„……„…„…„……………………†…„ƒ‚‚‚‚ƒƒƒƒƒ‚„‡‰‰‡„‚‡ŠŠ†„†ˆ‡‚‚„ƒ„‰ˆ‰ˆ‰ˆ‰ˆˆ‰‰‰‰‰‰‰‰ˆ‰Š‰†„ƒ„}{|}}~€„‚€ƒ„„„ƒƒ€‚‚‚‚‚‚‚‚ƒ„…‡‰ŠŠ‰‰‹Šˆ‡…„‚‚‚‚€€€‚…†‡‡‡‡‡††……„„†ƒ…‹ŒŒŒŽ‘’Œˆƒ‚ƒƒ„„ƒƒ‚ƒ‚‚‚‚‚‚ƒ‚‚‚ƒƒƒƒ„††††††……………††††††††‡†††††‡ˆˆ„ƒ‚‚‚‚ƒ‚‚‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‡ˆ‚}‚‡ŒŠ…‚€€€€€€€€€€€€€€€€€}|}€„‡††‡‡‡‡‡‡…„ƒ††……„ƒ‚‚€€~~~}||{{z|€ƒ€€~~~€‚ƒƒ€{y|~}{{}}~~~~~}|{}~}~~}{z{|}~€€‚‚‚‚‚€ƒ…††„ƒ€€€‚~zwxwvuy||wuvxwyxvuuuwwxwwvvuuuvtuw{~€€~‚€~|z|~}|zz{{€‚€€€€€€€~~}}|{{zzz{|~~€€€€€€‚€€€‚‚€€€€‚xlddhmnnjgegivy~‚„…„„„„……………„„†…‚€€€€€€~~~}}}}}||||||||}}|{|{|||{{}ƒƒ‚‚‚‚„††††„ƒ‚ƒƒƒƒƒƒƒƒƒƒ‚ƒ‚‚~~„‹…}vtv{~€€€€€€€€€€€€€€€€‚†‡†‚}ƒ………ƒ‚‚‚ƒƒƒ„„„„……†††††‡‡‡‡ˆˆ…ƒ…ˆ‰†‡ˆ†‡†ƒ‚ƒƒ‚………………………„„ƒ„ƒ„„„„…„…„„„…………………„„„ƒ‚‚‚ƒ€€‚‚‚‚„…‡‡‡‡…„‡ŠŠ‡…†ˆˆ‚‚„ƒ„‰‰ˆ‰ˆ‰ˆ‰‰‰‰‰‰‰‰‰‰ˆ‰Š‰‡„„„}{{}}„‚ƒ„„„ƒ‚‚€‚‚€‚‚‚‚‚ƒ……„…†ˆ‰‹‹‹Šˆ†ƒ‚‚‚‚‚€€€‚„††‡‡†††…„ƒƒƒ†ƒ‚„‹ŽŒˆƒ€‚ƒƒ„„ƒ‚‚€‚‚‚‚‚‚‚ƒƒƒƒ„…………††††………†††††‡†††††‡††ˆ‰‡…‚‚‚‚‚ƒ‚‚‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚†ˆ‚}ˆŒŠ…€€€€€€€€€€€€€€€€~}||€…‰‡ˆˆ‰ˆˆˆˆ†…‚€€€„…………„ƒƒ‚‚ƒƒ‚€~}|{zz|€‚ƒ„ƒ€ƒ„„‚€~||}|zz|}}}~~~~~}}}~~|~}{{}€€€‚‚‚‚‚‚‚ƒ„…€€€€€‚„zxyzxvy||wuvxwxwvvuvwxyxxxwwvvuutw{~‚}|y{}}{zz{{€‚€€€€€€€€~~}}|{{{zz{|}~€€€€€€€€‚€€€‚€€€xmghlmmmlkklnwz~€‚„†„„„„……………„…†…‚€€€€€~}{{zz||||||||{|{|||{{|{{~€ƒƒ‚‚‚‚€ƒ…‡‡†…ƒƒƒ„ƒƒƒ„ƒƒƒƒƒ„‚‚~~…‹…}vtv{~€€€€€€€€€€€€€€€€…†‡‡…‚}~~~~~~~~„†‡†„ƒ‚‚‚‚‚‚‚‚‚ƒƒ„„……††††‡‡‡‡ˆƒ‚ƒ†‡……‡†‡†„„……ƒ„„…………††……„„„„„„„„„„„„„„„„……„„ƒ‚„ƒ‚‚ƒƒ€€‚‚‚‚…„„„„„„……ˆˆ„‚„†…‚‚„ƒ„‰ˆ‰ˆ‰ˆ‰ˆ‰‰‰‰‰‰‰‰‰ˆ‰Š‰†„ƒ„€}z|}~„‚€ƒ„„„ƒƒ€‚‚‚€€€‚‚‚‚‚ƒ…„ƒ‚„†ŠŒŒŒ‹‰…ƒ‚‚‚‚‚€€€‚„…†††„„ƒƒ‚ƒ‚‚‚‚ƒ†ŠŽ‘ŽŽŒˆƒ‚ƒƒ„„ƒƒ‚‚‚‚‚‚ƒƒƒƒ„……………††‡………†††††ˆˆ‡‡‡‡‡ˆ‡ˆ‰ˆ„‚‚ƒƒƒ‚‚‚‚ƒƒƒƒ‚‚‚‚‚‚‡ˆ‚}‚‡ŒŠ…‚€€€€€€€€€€€€€€€€€€‚†‰‡ˆˆˆ‰ˆ‡‡†„‚€€‚ƒ„………„ƒƒ„„„ƒ‚€~~|{zzy~ƒƒ‚ƒ„…„‚~~||}|yy{{{|}~~}}~~~~}~~}}}ƒ€€€‚ƒ‚‚ƒƒ„ƒƒƒ€€€€€ƒ}xwyzyvy||wuvxwwwvvwwxyxxxxwwwwutuw|€‚‚€‚}|y{}}|z{|{€‚€€€€~~~~}||{{zz{|}~€€€€€€€€€€€†…„‚€}}}ysomlmpppruvwvwz}€‚„†„„„„…………†……†…‚€€€€~}}||{{z}}}}}}}}z{|}~|{z|{{}ƒƒ‚‚‚‚ƒ…‡‡‡…ƒ‚ƒ„„„„„„„„„ƒ„‚‚ƒ…‹…}vtv{~€€€€€€€€€€€€€€€€……„ƒ‚€~}}}~~~~€‚…‡ˆ‡…ƒƒƒƒ‚‚€‚‚ƒ„„……††††‡‡‡‡ƒ‚ƒ†‡……‡ƒ„„‚‚„„ƒ„„„……†††††…„„„……„„„„„„„„‚ƒ„„„ƒ€ƒƒ‚‚ƒ„‚ƒ„„„ƒƒ„„„„„„„„…ˆˆ„‚„……‚‚„ƒ„‰ˆˆˆˆˆˆˆˆ‰‰‰‰‰‰‰‰ˆ‰Š‰†„ƒ„€|{{}~„‚€ƒ„„„ƒ‚‚‚€€€‚‚‚‚‚ƒ„„„„…ˆŠ‹ŒŒŒ‰…ƒ‚‚‚‚‚€€€€‚ƒ…………„„…………††‚„‡ˆ‰‰ŒŽ‡ˆˆˆˆˆ‡‡Œˆƒ€‚ƒƒ„„ƒ‚‚€‚‚‚‚‚‚‚ƒƒƒƒ„†……„……††………†††††ˆ‡‡††‡‡ˆ‡ˆ‰‡„‚ƒƒƒƒ‚‚‚ƒƒƒƒ‚‚‚‚‚‚‡ˆ‚}ˆŒŠ…‚€€€€€€€€€€€€€€€€ƒ‡ˆ‡††‡†‡‡ˆ‡‡†……ƒ€~}}~€ƒ„……„„„………„ƒ€‚€~}||€‚}{}€€‚‚‚‚‚|y{}{yx|{zzz|}~€€~}|€}{|‚ƒƒ€€€‚ƒ‚ƒ„……„‚‚‚ƒ‚€~|zutwywty||wuvxwvvvwwxyywwwwvvvvutux|€‚‚€‚}{y{}}{{{|{€‚~€‚€€~~~}||{{zz{|}~€€€€€€€€|yvsqpqmikqwyy}{{}€|xz}€„†„„„„…………†……††ƒ€€€€|||}}~~~~~~~~~~~|||}}}|||{{}ƒƒ‚ƒƒ‚€ƒ…†††„ƒ‚‚ƒ„„„„„„„„„„ƒ‚ƒ†‹…}vtv{~€€€€€€€€€€€€€€€€€~~~~~~~€€€‚…ˆ‰‡…„…„ƒ‚€‚‚ƒ„………††††‡‡‡…„…ˆ‰‡‡ˆ‡‡†„ƒ„ƒ‚„„„……†††††………………„„„„„„„„‚‚ƒ„ƒ‚€ƒƒ‚‚ƒ„ƒƒ„…………„„……††……„†‰‰…ƒ…‡‡‚‚„ƒ„‰ˆˆˆˆˆˆˆˆ‰‰ˆ‰ˆ‰ˆ‰ˆ‰Š‰†„ƒ„€|z|}~‚„‚€ƒ„„„ƒƒ‚€‚€€€‚‚‚‚‚ƒƒ„…‡ˆ‰Š‹ŒŒŒ‰…‚‚ƒ‚‚‚€€€‚„„„„„‡ˆˆ‰ŠŠ‹‹‰ŒŽŒ†ƒƒ„…††††…„„Œˆƒ‚ƒƒ„„ƒƒ‚ƒƒ‚‚‚‚ƒƒ‚‚‚ƒƒƒƒ„‡†…„„„……………†††††‡†…………†‡‡‰‰ˆ„€‚ƒƒƒƒƒ‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‡ˆ‚}‚‡ŒŠ…‚€€€€€€€€€€€€€€€€€€ƒˆŠˆ‡ˆˆˆˆˆ‡‡‡‡‡„~||}~€ƒ„…………………„„ƒ„‚‚ƒ‚€}‚„}|zz~~~€‚€~zy}}yxzz}}{{}€‚‚~||~€‚ƒ‚€€‚ƒ†‡‡„€~€‚€€{ttwzywz|{vsuxxyxwvvwyzvvwwxwvvvutw{~€€‚‚{x}}}|yz}€€€€€€€€€€€€€€}}}€~|||yz{|}~€€€€€€€€€€€€‚|yvqichfflu|~~€€~~}}z{~€‚ƒ„„‚ƒƒƒ„„„„†„ƒ„„‚‚„ƒ‚€‚‚~}}||{{zz{||}~~~}}~~~~}}~|{|€‚ƒƒ‚‚‚‚ƒ„„‡ˆ‡ƒ‚ƒƒ‚ƒ„„ƒ‚……}‡Š…~xwy}€€€€€€€€€€€€€€€€€‚€|{}~}~~~~~~~~~…‡‡‡††††…„ƒƒ‚‚€€€‚‚‚ƒƒ…†ˆ‰„„†Š‹‰ˆ‰Š‹Š†„ƒ‚…„ƒ„…†……†………†††………………………„„ƒƒ‚‚ƒƒƒƒƒƒƒƒ€‚„†‡‡…„…ƒ‚„††„…‡ˆ‡…„…‡ƒ‚‚„‚€ƒ‡‰ˆˆˆˆˆˆ‡ˆˆˆˆ‰‰‰‰ˆŠ‹Š‡„ƒ„€~||||~€ƒ‚€„…†…„ƒ‚€€€€ƒ…†…ƒ‚„‡Š‹‰†ƒ‚€€‚ƒ‚‚‚ƒƒƒƒ„……†‰ŽŒˆ„ƒƒƒƒ„„……††‰‡„‚‚ƒ„„„ƒƒ‚€‚ƒƒƒƒ‚‚„…„‚‚„††……††‡‡†††††‡‡‡‡††………………‡ˆ‡…‚‚ƒ‚‚‚‚‚„……ƒ‚‚ƒƒ‚‚‚ƒ„‚‚‚‚‡ˆ‚‡ŒŽŒ†‚€€€€€€€€€€€€€€€€€€ƒˆŠˆ‡ˆˆˆˆˆˆˆ‡‡‡…~||}~}~€‚ƒƒ„„…†……„„„ƒ‚‚ƒ‚}€‚~}}€€€‚‚€~zy|}zy|~}|||||}}€€~}|}}€‚ƒ€€‚ƒ„†…„‚€€€€€€€{utwyxvz|zvsvxxwvuuuvwxwwvvvvvwvutw{~€€‚‚‚€{x}€}}{y{}€€€€€€€€€€€€€€}}}~}{{|yzz|}~~~~€€€€€€€€€€~vkchfflu|~~€€~~}}z{~€‚ƒ„„ƒƒƒ„„„„……„„†…ƒ‚ƒ‚€‚‚}~}}||{{}}}}}|||}}~~~~}}~|{|€‚ƒƒ‚‚‚‚‚ƒƒ„‡ˆ†ƒ‚ƒƒ‚ƒ„„ƒ‚ƒ„…}€†Š…~xvw{~€€€€€€€€€€€€€€€€‚‚€|{}~}~~~~~~~~~…‡‡‡†‡††……„ƒƒƒ‚‚€€‚‚ƒ…†‡ƒ„†Š‹‰ˆ‰‡ˆˆ…ƒ„„ƒ…„ƒ„…†………†††………†……………………„„ƒƒ‚‚ƒƒƒƒƒƒƒƒ„„„………„„„„ƒƒ„…„„‹‹‰‡„„†‰ƒ‚‚„ƒƒ‡‰‰ˆ‰ˆˆˆˆˆˆˆ‰‰‰‰‰ˆŠ‹Š‡„ƒ„~||||~ƒ‚€ƒ††…ƒƒ‚€‚€€„†‡…„ƒ…‡‹ŒŒŒ‹ˆ…‚€„„ƒƒ‚‚‚‚‚‚‚ƒƒƒ…„ƒ‚ƒ‡‘ŽŒˆ„ƒƒƒƒ„„……††‰‡„‚‚ƒ„„„ƒƒ‚€€‚ƒƒƒƒ‚‚ƒ„„‚‚‚„††……††‡‡†††††‡‡‡‡††………………‡ˆˆ…ƒ‚ƒ‚‚‚‚‚„……ƒ‚‚‚‚„‚‚‚‚‡ˆ‚…ŠŒŠ„€€€€€€€€€€€€€€€€ƒˆŠˆ‡ˆ‰‰‰ˆˆˆˆˆ‡…‚~}|~~|}}~€€‚ƒ„…†††……„ƒƒƒ‚€~€‚€€€‚„„‚zy{}{|~|z|}|{||}~~~}|}}~€‚‚‚ƒ„……‚€€‚‚€€‚‚‚€~}zvuwyxvz|{usuxxwwwwwwxxwwvuuvwwvutw{~€€~‚ƒ‚‚€zy~€~||{y{}€€€€€€€€€€€€€€}}|}~}|{z{yz{{|}~~~}}}}~€€€€€€€€€€‚„ƒ{ofigglv|~}€€~~}}z{~€‚ƒ„„ƒƒƒƒ„„……„ƒ…‡†ƒƒ‚€‚‚}}~~~}|{~~}}|||{}}~~~~}}~|{|€‚ƒƒ‚‚‚‚‚„„†‡†‚€‚‚‚ƒ…†„‚‚‚„„}„ˆ„~xvvy{€€€€€€€€€€€€€€€€‚ƒ}{}~}~~~~~~~~~…‡ˆ‡††‡‡†……„„„„ƒ‚€€€‚ƒ„ƒƒ…‰Š‰ˆˆ†ˆ‡…„„…„…„ƒ„…†……„…‡†…„…†……………………ƒƒƒ‚ƒ‚‚‚‚‚‚‚‚‚‚‚ˆ†„‚‚‚„„„„„ƒƒ„†ˆ‘Œˆ„ƒ†‰ƒ‚„ƒƒˆ‰‰‰‰‰ˆˆˆˆˆ‰ˆ‰‰‰‰ˆŠ‹Š‡„ƒ„~||||~ƒ€„…†…„ƒ‚€‚‚‚‚…‡ˆ‡††‡‰‹Š‹ŒŒ‹ˆ…‚†‡ˆ‡‡„‚‚‚‚ƒƒƒ‚ƒƒƒ„†‹ŽŒŽŽŒˆ…ƒƒƒƒ„„……††‰‡„‚‚ƒ„„„„‚‚€‚ƒƒƒƒ‚‚ƒ„„‚‚ƒ„††………††‡†…††††‡‡‡††………††…‡‰‡…‚‚ƒ‚‚‚‚‚ƒ…„ƒ€‚€‚ƒ‚‚‚‡Š„ƒ†ŠŒ‰„€€€€€€€€€€€€€€€€~‚ˆ‰ˆ‡ˆ‰‰‰‰ˆˆˆˆ‡…}}~}}}~€€ƒ……††††††……ƒ‚€‚„‚€€}ƒ……„ƒ€|y{{{|~|zz{}||}{{{||}||}~~€‚€‚ƒ„……ƒ~€‚ƒ€‚ƒ€}{{xuuwyyxz|zvsvxxvwwyxxxwwvvvuvvwvutw{~€€}~‚ƒ‚‚yz~€}{{zy{~€€€€‚€€€€€€}}{{|{{zzzyzz{{|}}|||||}~€€€€€€€€‚‚|smjhgmu}~}€€~~}}z{~€‚ƒ„„ƒ„ƒ„„…………„„‡…ƒƒ‚€‚‚|}~~~||~}}}|}}}}~~~~}}}~|{|€‚ƒƒ‚‚‚‚ƒƒ„†‡…‚€‚‚ƒ‚‚ƒ……„ƒƒƒ„…~}ƒ€{xvwy{€€€€€€€€€€€€€€€€ƒ„}|}~}~~~~~~~~~…‡‡‡†‡‡‡‡‡††……†…„‚~€‚„ˆ‰‡†‡ˆ‰ˆ…ƒ„„„…„ƒ„…†……„…††„……†……………………ƒƒ‚ƒ‚ƒ‚‚‚‚‚‚‚‚‚‚ˆ†„‚‚ƒ„„……„‚„ˆŒ““Œ‡…†‡‚‚„ƒ„ˆ‰Š‰‰‰‰ˆˆˆ‰ˆ‰‰‰‰‰ˆŠ‹Š‡„ƒ„~|}}|~ƒ‚€ƒ††…ƒƒ€‚ƒƒ‚‚ƒ†‰‰‰ˆˆ‰ŠŒŠ‹‹Œ‹Šˆ‡‰Š‹ŒŠ‡‚€‚‚‚ƒƒƒ€ƒƒ„†‰‹ŒŽŒˆ…„„ƒƒ„„……††‰‡„‚‚ƒ„„„ƒƒ‚€€‚ƒƒƒƒ‚ƒ„„‚‚ƒ…††…………††…†…†††††‡††……†††…‡ˆˆ…ƒ‚ƒ‚‚‚‚‚„……ƒ‚‚‚‚ƒ‚‚‚‡‹‡†‡ŠŽ‹†€€€€€€€€€€€€€€€€~~‚‡‰ˆ‡ˆ‰‰‰ˆ‰ˆˆˆˆ…‚}}~€‚ƒ……†††‡‡‡†…„„……ƒ‚€€€€‚„……ƒ‚}{z{{||z|}|{|}|zzzz{{|}~~€€€‚‚ƒ„„„€€€€‚‚‚€‚~{yuttuxz{{z|{utuxxtuvwwwvuuuvvwvvuvutw{~€€}~‚‚y{~|zzzx|~€‚€€€€€€€}}{zzzzzzyzzzz{{||{{{{|}~€€€€€€€€ƒ€€{upkiimv|~}€€~~}}z{~€‚ƒ„„„„„„……††‡…„…„‚ƒ‚€‚‚|}~~~~}~~}}||}}~~~~~}}|~|{|€‚ƒƒ‚‚‚‚‚„„†‡†‚€‚‚ƒƒƒƒ„ƒƒƒ„ƒ„…‚}|~}{ywxy{|€€€€€€€€€€€€€€€€„„‚}|~~}~~~~~~~~~…‡ˆ‡‡†‡‡‡†‡†††‡†…ƒ‚‚‚‚€~€€€ƒ†ˆ†…†‡ˆ‡ƒ‚‚„ƒ…„ƒ„…†……†…„„†……„……………………‚‚ƒ‚ƒ‚ƒƒ‚‚‚‚‚‚‚‚…„„ƒƒƒ„„„…†……‡Œ’””‘Œ‡„„‚‚ƒƒ„‰Š‰‰‰‰ˆ‰ˆ‰‰‰‰‰‰ŠŠˆŠ‹Š‡„ƒ„}}}}ƒ€„…†…„ƒ‚€€‚ƒƒ‚‚„‡‰ŠŠŠŠ‹‹ŒŒ‹‹‹Š‹Š‹‹‹ŒŽŽŒ‡ƒ€‚‚‚ƒƒƒƒ‚€ƒ‰‹ŽŒˆ…„…ƒƒ„„……††‰‡„‚‚ƒ„„„„‚‚€‚ƒƒƒƒ‚‚„ƒƒ‚„…††……………†……†…†††††††††††‡…‡‰‡…‚‚ƒ‚‚‚‚‚ƒ…„ƒ‚‚ƒ‚‚‚ƒ‚ƒ‡ŒŠ‰Š‹‹…€€€€€€€€€€€€€€€€}}‡‰ˆ‡‰‰‰ˆˆˆˆˆˆˆ†‚}~~€€€€€~€‚ƒ„„„„…‡‡†………††‚€‚‚‚‚ƒ„…„€~{{{{{{{~}{{{zzyyyz|}~~€€€‚ƒƒƒ‚‚€‚‚€€€€~|yxsstvxyz{z|zvsvxxuvvwwwvvuuvwwvuuvutw{~€€~~€€€z|{xyyx|‚ƒ€€€€€€€€}}{zyxyzzyzzzzz{z{zzz{|}~€€€€€€€€€€€€|tmljinv}~}€€~~}}z{~€‚ƒ„„„„„……†††ˆ†„…ƒƒƒ‚€‚‚}}}}}~~€€~}||||~~~~~}||~|{|€‚ƒƒ‚‚‚‚ƒƒ„†‡†‚€‚‚ƒƒƒƒƒ‚ƒƒ„ƒƒ…ƒ~{{yxxxy{|}€€€€€€€€€€€€€€€€……‚~|~~|~~~~~~~~~…‡‡‡†‡†‡†‡††††‡†…„„„„„‚‚€‚€€ƒ‡ˆ†…†„†„‚€‚„„…„ƒ„…†……†…ƒ„…†…„……………………‚‚‚ƒ‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚ƒ„„„„ƒ…††‡ˆ‹Ž‘‘”–”ˆ„‚€ƒƒ‚„‰‰‰‰‰ˆ‰ˆˆ‰‰‰‰‰ŠŠŠˆŠ‹Š‡„ƒ„}}}}ƒ‚€ƒ††…ƒƒ€‚‚‚‚„‡ŠŠ‹‹ŒŒŒ‹‹Œ‹ŠŠŠ‹Œ‹Ž‹ˆƒ‚‚‚ƒƒƒ‚‚ƒˆ‹ŠŒŒˆ†……ƒƒ„„……††‰‡„‚‚ƒ„„„ƒƒ‚€€‚ƒƒƒƒ‚€‚ƒ„‚ƒ„†††………………………†…†††††††††‡‡…‡ˆˆ…ƒ‚ƒ‚‚‚‚‚„……ƒ‚ƒƒƒ‚‚‚ƒƒ‚€‡ŽŠŠŠ‹‹ˆƒ€€€€€€€€€€€€€€€€|}†‰‡‡‰ˆˆˆˆˆ‡‡‡ˆ†ƒ~~€€€€~~}~€‚‚‚‚€‚„…„ƒ„†‡†€}€€‚„„ƒ~}|{{{|{z}~~}}|{zzyyyz|~€€€€‚‚ƒ‚€€€‚‚‚€€~}{yxwtuwwwwwwz|{vsuxxvwwwxwxwuuvvvvvuvutw{~€€€€~€€{|zwxyx|‚‚ƒ€€€€€€}}{zxxyzzzzzzzzzzzzzz{|}€€€€€€€€€‚‚|skmjjnw}~}€€~~}}z{~€‚ƒ„„„„……††††‡………„€ƒ‚‚‚}||||}€€~|||}}~~~~~}||~|{|€‚ƒƒ‚‚‚‚ƒ„„‡ˆ‡ƒ‚ƒƒƒ‚‚‚ƒƒƒƒ…ƒƒ…ƒ}zyxxyyz{||€€€€€€€€€€€€€€€€…†ƒ~|~~|~~~~~~~~~…‡ˆ‡††††††††††‡†…………††……„ƒ‚‚ƒƒ‚‚…ˆŠˆ‡‡†‡†‚‚„……„ƒ„…†………„„„………„……………………‚‚ƒƒ„„ƒƒƒƒƒƒƒƒ‚‚ƒ„„„ƒƒ††‡‰‘‘’”•’ˆ†…€ƒƒ‚…Љ‰‰ˆˆˆˆˆ‰‰‰‰ŠŠŠŠˆŠ‹Š‡„ƒ„‚}}}}‚ƒ‚€„…†…„ƒ‚€€‚‚„‡ŠŠ‹ŒŒ‹Š‹‹‹Š‹‹ŒŒ‹ŒŒŠ‡„‚‚‚ƒƒƒ€‚ƒƒƒ„‡‰ŠŒŒ‰†…†ƒƒ„„……††‰‡„‚‚ƒ„„„„ƒ‚€‚ƒƒƒƒ‚€ƒƒƒƒ…†††……„„………………†…†††††††‡‡ˆ…‡‰‡…‚‚ƒ‚‚‚‚‚ƒ…„ƒ‚ƒ‚‚‚‚ƒ€†ŒŒŒ‹ˆƒ€€€€€€€€€€€€€€€€||€†‰ˆ‡‰ˆˆˆˆ‡‡‡‡ˆ†ƒ€~~€€€~~}}}~€€€€|‚ƒ‚‚ƒ…‰…~z{{z{|}€ƒ…„‚€zzz{||{z}{{~}||zzyyz|~€€€€€‚‚ƒ‚~€‚ƒ‚‚}{yxwwwxyxvuttz|{vsuxxuuuvvvvvvvuutuvvvutw{~€€€~}€€||zwxyx}‚‚ƒ€€€€€€}}|zxxy{{zzzzzyyyyzzz{|~€€€€€€€€€‚|slmkjow}~}€€~~}}z{~€‚ƒ„„„………†††‡†……‡†‚€€ƒ‚€‚‚}|{{{}~~}||}~~~~~}||~|{|€‚ƒƒ‚‚‚‚‚ƒ„„‡ˆ‡ƒ‚ƒƒƒ€ƒ„„ƒ…ƒƒ…ƒ~yxyyzz{{zz€€€€€€€€€€€€€€€€††ƒ~|~~|~~~~~~~~~…‡‡‡††………†††††††………†‡‡‡‡…„„„„„„„†Š‹‰ˆ‰Š‹ˆ…‚ƒ„……„ƒ„…†……„………„ƒ„………………………‚‚ƒƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ††‡‹“’‘””“‹ˆ‡‡€€ƒƒ‚…Љˆˆˆˆˆˆ‡‰‰‰‰ŠŠŠŠˆŠ‹Š‡„ƒ„‚}~~}‚ƒ‚€ƒ…†…ƒƒ‚€€ƒ‡‰Š‹ŽŒŠ‰ŠŠ‹ŒŒŒ‹‹‹‹‹‹‰†„‚‚‚‚ƒƒƒ„ƒ‚€€ƒˆŒŠ‹Œ‰†††ƒƒ„„……††‰‡„‚‚ƒ„„„ƒƒ‚€€‚ƒƒƒƒ‚ƒƒƒƒ…‡††……„„…………………††††††††‡‡ˆ…‡ˆˆ…ƒ‚ƒ‚‚‚‚‚„……ƒ‚‚€‚€ƒ‚‡ŽŽŠ…€€€€€€€€€€€€€€€€{}€„‡ˆ‰ˆ†ˆ‰‰‡…†‡ˆˆ„~{||z}}~~€€€€€€€‚„„€€‚‚ƒƒƒ‚~~~zy||||}}~~~{x{~~~~€€€‚ƒ„ƒ€‚€‚ƒƒ‚‚€|zxwvvwxxxxvutx{{ustvuxussuwxxwwvsstututtvz~~~€~{zwxxwy~€€€€‚|}zxxz{{zyyyxyzz{yyyz{}~‚‚€€}‚ƒ€xpkokhlt{~}|}€€}|yz}€ƒ…††„„„……†††††…„„ƒ‚‚€ƒ„‚}||~~{~~~~~~~~~}||~ƒƒ‚‚ƒƒƒ‚‚„†…††‚~}‚ƒ„„„„„…†…ƒƒ…‚{xxvyytty}~€€€€€€€€€€€€€€€€‚„ƒ|}~}~~~|„†††‡ˆ………………………†‡‡ˆ‡†…†††……„„„‚ƒ†ˆ‰‰‰ˆ‰ˆ‡…„„ƒƒ„„„……„„„……………………‡‡‡†…„ƒ‚…„ƒƒ‚ƒƒƒ‚ƒ„„………„‚‚‚ƒƒ…†‰Œ‘’“”Ž‘‘Œ‡„„…‚ƒ†Š‰‰ˆˆˆˆˆˆˆ‰ŠŠŠŠŠŠ‹‹‰†„„…€}|~~~€ƒƒ‚ƒ…‡†……ƒ€‚‚€‚‚‚‚‚‚‚‚€€ƒ‡‰ˆ‰Š‹Œ‹‹ŠŠ‹‹‹‹ŒŒŒŒŒŒ‰…‚‚……„‚ƒ‚€‚†ŠŒŒŽŽŒ‰…„„†††…„„ƒƒŠˆ†„‚‚ƒƒƒ‚‚‚‚‚ƒ„ƒƒ„‚ƒ…††……„„……ƒƒ„……†‡‡††††††††ˆ‰‹‰†ƒƒƒ‚ƒƒ‚‚„†…ƒ‚‚‚‚‚‚‚‚‚‚‚ƒ„‡‰ŠŽŽ‹†‚€€€€€€€€€€€€€€€€{}€„‡ˆ‰‰†‡ˆˆ‡‡†‡ˆˆ…}~~|€€€}}~€‚€€€€€€€€ƒƒ€€€~€‚‚‚‚~~{z|||||}}}~~yvy|}~€€€€ƒ„„ƒ‚‚‚‚€‚ƒ‚‚~}{yxwvvwxxxwwutx{zustvuxxvvuuvwutttssttuttvz~€€}}{zwxxwy~€€€€‚~|}{yyz{{zyyyyyzz{yyyz{}~|||||}}€|vokliglu}€€}~€€~}y{}ƒ……†„„„……††††‡‡‡…ƒ€~€€ƒ„‚€~}|~~~~~~~~~~~~~~~~~}||~ƒƒ‚‚ƒƒƒ‚‚„††‡†ƒ~€ƒƒƒƒƒ‚ƒ„……ƒƒ…‚|xxuyyvv{€€€€€€€€€€€€€€€€€‚„ƒ|}~}~~~|€„†††‡ˆ†††††††††††‡†††††††………„„ƒ…‡‰‰‰ˆˆ……„ƒƒƒ„„„„„„„„„„……………………‡‡‡†…„ƒ‚…„ƒ‚‚‚‚‚‚ƒ„„……„„‚‚‚ƒ„†ˆŠ‘’’“Ž‘‘Œ‡„„…ƒ„ˆ‰‰ˆˆ‡ˆˆˆˆˆ‰ŠŠŠŠŠŠ‹‹‰†„„…€~|~~~ƒƒ‚ƒ…‡†……ƒ€€‚€ƒ†‰‡ˆ‰‹‹‹‹ŠŠ‹‹‹‹ŒŒŒŒŒŒŒŒ‰…‚„„‚‡†……†ŠŽŽŒ‡ƒ‚„„„„„„„„‰ˆ†„‚‚‚ƒƒ‚‚‚‚‚‚‚ƒƒƒƒ„ƒƒ…††……„………ƒ„„……†‡‡††††††††‡‰Š‰†ƒ‚ƒ‚ƒƒ‚‚„……ƒ‚‚‚ƒ„†ˆŠ†‡ˆ‰‡„€€€€€€€€€€€€€€€€{}„‡ˆ‰‰‡‡‡ˆˆˆ‡‡‡ˆ…~€€~€€€~~€€€€€€€~‚€~€€‚ƒ„…†††~~{{|{||||}}}{wvx{|~€€€€‚‚ƒƒ‚‚ƒƒ‚€‚‚‚€€|{zxwwvvwwxxxwvuwzzusuvuwxywvtvwwuvwwttuuttvz~€€€~}|{zwxxwy~‚€€€€€~{~|{z{{{zzyyyyyz{zyzz{|~~€~€€}}}|ytpmjhhmv}~~€~}z{~€ƒ„……„„…………††‡‡†…„‚€€€ƒƒ‚€€~}|}|~}}~}~}~~~~~}}}||}ƒƒ‚‚ƒƒ‚‚‚„†‡ˆ‡„€~„ƒƒ„ƒƒ‚„……‚ƒ…ƒ|yyy||yy|€€€€€€€€€€€€€€€€€‚„ƒ|}~}~~~~~~}€„‡‡†‡‡†††††††††††…†…†††††………………†ˆ‰Š‰ˆ‡ˆ‡†„„ƒƒƒ„ƒƒƒƒƒƒ„……………………††‡‡†…ƒ‚…„ƒ‚€‚ƒ„„…„„ƒƒ‚‚‚ƒ„…‰ŠŒŽ‘’’‘ŽŒˆ„€ƒ„ƒ…‰‰‰ˆ‡‡‡ˆˆ‡ˆ‰‰Š‰‰‰Š‹‹‰†„„…~}~~}‚ƒ‚ƒ…‡†……ƒ€‚‚‚€‚‚‚‚…‡†‡ˆŠŠ‹ŠŠŠŠ‹‹‹‹ŒŒ‹‹‹Œ‹‰…ƒ‚‚„††…ƒ†…„„…ˆ‹ŒŽŽ‹†‚€€‚‚ƒƒ……††ˆ‡…ƒ‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚ƒƒƒƒ„‚ƒ…††…„…„……„„……††‡‡††††††††‡‰Šˆ†ƒ‚‚‚ƒƒ‚‚„†…ƒ‚‚‚‚„†ˆ‰‚„……„‚€€€€€€€€€€€€€€€€{~…‡‰‰‰‡‡†‡‰Šˆ†…†ƒ}€€€€€€~~‚€‚‚ƒ„…………€~}|}||||||||zxwxz}‚‚‚‚‚€‚€‚€~zyxwvvwwvwwxxwvuvzzusuwvuwxxwwwxxxxyxvttuttvz~€€€€~}|{zwxxwy~€€€€€}{~}|{{{zzzzyyyzz{zzzz{|}~}zwutsqppomkjilkkpv}€€}}}~}}}}z|~‚„„…„„„……††††…„„ƒƒƒƒ€€‚ƒƒ|{}}{|~~~~~~}~€~}|}|{~ƒƒ‚‚ƒƒƒ‚‚„†ˆ‰ˆ…€€‚…„…„„ƒ„„……ƒƒ†ƒ}zz€€}{{}~€€€€€€€€€€€€€€€€‚„ƒ|}~}~~~~~~~…‡‡†‡‡††††††††‡†……„…†‡††††…†……„†‡ˆˆˆ†…‰ˆ†…ƒ‚ƒƒƒ‚‚ƒƒƒ„„„„„„„„…†‡‡‡…ƒ‚…„ƒ‚€€€€‚ƒƒ„„„ƒƒƒƒ‚‚ƒ„…†‹Œ‘‘‘ŽŠ…€ƒ„„†Š‰‰ˆ‡‡‡‡ˆ‡ˆˆ‰‰‰‰‰Š‹‹‰†„„…~}~~}‚ƒ‚ƒ…‡†……ƒ€€‚‚ƒ‚‚€‚„‡‡‡ˆ‰‰ŠŠŠŠŠŠ‹‹‹‹‹‹‹‹Œ‹‰…‚„„…‡Š‹‹‰‹Š‰‰Š‹ŽŒŽŒˆ„ƒƒ„…………††‡‡†…ƒ‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚ƒ‚„„ƒƒ…††……„………„……††‡‡‡††††††††‡‰‰ˆ…ƒ‚‚ƒƒ‚‚„……ƒ‚‚‚‚ƒ…‡ˆƒ„…‡††…„€€€€€€€€€€€€€€€€|~…ˆ‰Š‰ˆ‡‡ˆ‰Šˆ†ƒ„|{}~}}}~~€€€€€~~~‚ƒ€‚ƒ‚‚ƒ„…………€€~}}||||||{{{z{~ƒ‚‚‚ƒƒ€‚€€€€~}yxwwvvwwuvwxxwwvvyyusuwwwvwwyxwvuvwvvvusuttvz~~~€~~{zwxxwy~‚€€€€€€€€|z||}|{{zz{zzyzzz{{zzz{|}~}yuqnlkmmmmnnnoqqrtx{}}{{{z{{{{{|€ƒƒ„„„„…………††ƒ„…††„ƒ‚ƒƒ}{|~||}~~}}}}}~}|}||}ƒƒ‚‚ƒƒ‚‚‚„†ˆ‰ˆ…€‚…„……„„ƒ„…„‚ƒ…„~{{€€|{|~€€€€€€€€€€€€€€€€‚„ƒ|}~}}}~}~~‚†ˆ‡††‡††††††††‡†…„……†‡††††††††ƒ„†‡‡†…„„„ƒƒƒ‚‚ƒƒ„„„„„„„„„…‡ˆˆ†„‚…„ƒ€€€ƒƒ„„„ƒƒ‚ƒƒƒƒ„…‡ˆŒŽ‘‘‘‘‘ŽŒˆƒƒ„ƒ†Š‰‰ˆ‡‡‡ˆˆˆˆ‰‰‰‰‰ˆŠ‹‹‰†„„…‚}~~}~ƒ‚ƒ…‡†……ƒ€‚‚‚€‚‚ƒ„‡ˆˆˆˆ‰‰ŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒ‰…‚‚‚„‡‹Œ‹‹ŠŠŠ‹ŒŒ‰‹ŒŠˆˆˆ‰ˆˆ‡‡‡‡††…„‚‚‚ƒƒƒ‚‚ƒ‚‚‚‚‚ƒƒ„‚ƒ…††…„…„……„„……††††……………………†ˆ‰ˆ…‚‚ƒƒ‚‚„†…ƒ‚‚‚‚ƒ„…†‡‡ˆ‡‡††…€€€€€€€€€€€€€€€€|~…ˆŠŠŠ‰ˆˆ‰‰‰‡†ƒ„|z||{{{|}~€€€€€€€€€€~~~~€ƒƒ‚‚ƒ„…†††‚ƒƒ€‚€~~~}}}}||~}{z}‚‚‚‚ƒƒ€€€‚€€€~||zyxwvvwwuvwxxxwwuyyusvxwzyvvwwussuvuvxxvuttvz~}~€€{zwxxwy~€€€€€€€€€€|yy{||{{{{|{zzyzz{{{zzz||}}zxvuuwwxyz{{{wwwyy{{{|{zzyz{|{}‚ƒƒƒ„„„……†††††††„ƒ‚‚ƒƒ€~}}~€€}~~~}}}}||}~~~~||}|{~ƒƒ‚‚ƒƒƒ‚‚„†ˆ‰ˆ…€‚…„„„ƒ‚‚ƒ„„‚ƒ†„||||}~|}€€€€€€€€€€€€€€€€€‚„ƒ|}~}|}}~~~€ƒ‡ˆ‡††‡‡‡‡‡‡‡‡‡††…†…††††††††‡†‡‚„…‡‡‡……‡†…„‚‚ƒ‚€€‚ƒ„„„„„„„„‚„‡ˆˆ†„‚„ƒ‚‚‚‚‚ƒƒƒ„ƒƒ‚‚ƒƒƒ„…‡ˆ‰‹ŒŽ‘‘‘‘’’‘‹†ƒƒƒ‚„‰ŠŠ‰ˆˆˆˆ‰ˆ‰‰‰‰‰‰ˆŠ‹‹‰†„„…‚}~~}~ƒ‚ƒ…‡†……ƒ€€‚‚‚‚‚…‡‹Š‰‰ˆˆ‰‰‰ŠŠŠŠ‹‹‹‹‹ŒŒŠ‡„€„ˆ‹‹Šˆˆ‡‡‡‡†††‰‹‹Šˆ‰ŠŠŠ‰ˆ‡‡††…„ƒ‚‚‚ƒƒ‚‚‚‚ƒƒ‚‚‚‚‚ƒ„„ƒƒ…††……„………„„„……†…†……………………†ˆˆˆ„‚‚ƒƒ‚‚„……ƒ‚‚‚ƒ……ˆˆ‡‡……„„€€€€€€€€€€€€€€€€|~‚…ˆŠŠŠ‰ŠŠŠˆ‡††††ƒ}{||z{{||}}}}€€~~~}€€~~~‚‚~~~€‚‚‚‚ƒ……‚‚„„~~}}}{~zx{~‚‚‚‚€€€‚€}|{{zywwvvvtuwwxxxwuxyusvxxzywuutuuvvvvvwxxuttvz~€€€~}{zwxxwy~‚€€€€€€€€€€€~{yvy{|{z{||{{zzzzz{{{z{{|}~|{{{{{yz|}}|{zz{|||{{{~}|{{{}~|}‚ƒƒƒ„„…………††‡†…„ƒ‚‚‚ƒ‚‚ƒ‚€~}~€€~|||}}}~~~~~}}}}}}||}ƒƒ‚‚ƒƒ‚‚‚„†ˆˆˆ„‚„„„„ƒ‚‚ƒ„„‚ƒ†…}}yy{~}z|€€€€€€€€€€€€€€€€€‚„ƒ|}~}||}}~~„‡ˆˆ††‡‡‡‡‡‡‡‡‡††††‡†††††††‡‡‡‡ƒ„†ˆ‰‰ˆ‡‹‰‡…„ƒ‚ƒ‚€€‚ƒ„„„„„„„„„‡‰‰‡„‚ƒ‚‚‚‚ƒ„„ƒƒƒƒƒ‚‚ƒƒ„„†‡‰ŠŠ‹‘’’‘’“”“’’’‰…ƒ‚€ƒ‡‹ŠŠ‰‰‰‰‰‰‰ŠŠŠ‰‰‰Š‹‹‰†„„…ƒ~~~|~€ƒ‚ƒ…‡†……ƒ€‚‚€ƒ†‰Ž‹‰ˆˆˆˆ‰‰ŠŠŠŠ‹‹ŒŒŒŽŒˆ…€€ƒ†ˆ‡†ŠŠŠ‰‰ˆ‡†…‡‰‰‡††‡‡†‡†††††„„‚‚‚ƒƒƒ‚‚ƒƒ‚‚‚ƒƒ„‚ƒ…††…„…„……„„„„…………………………………‡ˆ‡„€‚ƒƒ‚‚„†…ƒƒ‚‚ƒ„…ˆ‡‡……„„„€€€€€€€€€€€€€€€€|‚†ˆŠŠŠ‰‹ŒŠˆ†††ˆˆ„~{||z||||{{{{}}}~~~~~€€~~~~||}{‚‚ƒƒƒƒ††ƒƒ……‚€€~~~}{~yvy||€€‚‚‚}~€€~~€~}{z|{yxwvvvtuvxxxxwtxyusvxxwwwussvxxvuutssuuttvz~€€€€~}|{zwxxwy~€€€€€€€€€~{xux{|{z{}||{zzzzz|{{zz{|}~~}|{||}}~€}zx{|~~}||}€}||}€|}‚ƒƒƒ„„„……†††ƒƒ…………ƒ‚ƒ‚‚ƒ‚€~}}}€€~{||}~€€~~}}|}}}}||~ƒƒ‚‚ƒƒƒ‚‚„†‡ˆ‡„€„………„ƒƒ„…„‚ƒ†…€}~zy{~|xx|€€€€€€€€€€€€€€€€‚„ƒ|}~}|||}~~„‡‰ˆ††‡‡‡‡‡‡‡‡‡…†‡ˆ‡‡†……†††‡‡‡‡„…‡Š‹‹ŠŠ‹Šˆ‡†………ƒ‚€€‚ƒƒƒƒƒƒƒƒƒƒ‡‰‰‡„‚‚‚‚‚ƒ„…†ƒƒƒƒƒ‚„„„„†ˆ‰‹‰ŠŒŽ‘’’‘“”•”“““‘‹†„‚‚†‹‹Š‰‰‰‰Š‰‰ŠŠŠŠ‰‰Š‹‹‰†„„…ƒ€~~~|}€ƒ‚ƒ…‡†……ƒ€€‚‚‚‚‚‚‚‚‚‚€€ƒ‡‰ŽŒŠˆˆˆˆ‰‰‰ŠŠŠŠŠŒŒŽŽŒ‰†„ƒƒ…‡‡…„††††…„‚„†ˆ‡„‚‚‚ƒƒƒ„……††„ƒ‚‚‚ƒƒƒ‚‚„ƒ‚‚‚ƒƒ„ƒƒ…††……„………ƒ„„„„„„„………………………‡ˆ‡„€‚ƒƒ‚‚„……ƒ‚‚‚‚‚‚‚‚ƒ‚‚ƒ„ˆˆ‡††††‡€€€€€€€€€€€€€€€€||„ˆŠ‰ˆŠŠŠŠŠ‰ˆˆ‰ˆ„}z{|{{{zyyyyy||~€€€~~~||~€€‚„…„ƒ…„ƒƒ…†††‚‚€|}~|zy|€‚„„‚€€‚€€}{{|||{zyyxvuttuuvvvvvvyxvvwxxxuuuuuuuvttstuutstssvz}~}€€‚}{z~€|yzzwx|€‚€€€€€€€~}{{{{{{||{{{{{{{{zzzz{{{{|}~~~~}|~~~~~~~~}|{zz{|}}}}~~€|}‚ƒ„……„„„ƒ„…††…„…‡†ƒ‚ƒ‚€~}}}}}~~~~~~~~||}~~}||€~‚ƒƒ‚‚‚‚ƒ„„ˆˆˆ„‚„ƒƒ„„„ƒ‚‚„„„„ƒ€z{{zz|‚€€€€€€€€€€€€€€€€ƒ…„|}}}}}}}}~~}†‰‰ˆ‡ˆ‡‡‡‡‡‡‡‡††††‡‡‡†††††††††…‡ˆŠŠ‰ˆ‡‰ˆ‡…„ƒƒƒ€€€€‚‚ƒƒ„„ƒ…‡‡†…„…„‚‚„†††€‚„„ƒ‚‚ƒƒ‡‰‡†ˆ‰ˆŒŒŽ‘“””••••””“•’Œ……ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ‰ˆˆ‡††‚~|}}|‚ƒ‚‚ƒ†‡‡†„ƒ‚€€€ƒ„ƒƒ…ŒŠ‰ˆˆ‰‰Š‰‰‰‰ŠŠ‹‹ŒŒŒŒ‹Š‰‡†…„ƒƒ„„…………………………………………†††……………†…„‚ƒƒƒ‚‚‚‚‚‚‚„ƒ‚‚ƒ…†……„………………††††……††††††††††††…„‚‚‚‚‚€€ƒ„„‚€ƒƒ‚‚€€‚‚‚ƒ„†‡††††††††€€€€€€€€€€€€€€€€||„ˆŠ‰ˆŠŠŠŠ‰‰ˆˆ‰ˆ„}z{|zzzzzzz{{{{|}~~€~€€€€€€€€ƒƒ‚‚„…†…„…„‚ƒ„††…‚ƒƒƒ‚€€€}zyz|€‚ƒƒ€€€€€~|ywxzz{zyyxvuutuuuvvvvvxwuvxyyyvvvvvuuuvuttuvutsssvz}~}}~€~|zy~|yzywy|€‚€€€€€€€€~}||{{{{{{{{{{{{{{zzzz{{{{}}~~}}||||||||~}||}~||}}~~~}~€‚ƒ„„„„„ƒƒ„…†‡…„…‡†ƒ‚€‚‚‚€~}}}~~}|}€~}}}|}~~€~~‚ƒƒ‚‚‚‚‚ƒƒ„ˆˆˆ…€‚…ƒƒ„„„ƒ‚‚ƒƒƒƒ‚~z{zzz|€€€€€€€€€€€€€€€€ƒ…„|}}}}}}}}~~~}†‰‰ˆ‡ˆ‡ˆ‡ˆ‡ˆ‡ˆ‡‡ˆ‡†††‡††††††††…†ˆ‰Š‰ˆ‡…„ƒƒ‚‚‚‚€€‚‚‚ƒƒ€‚…†††‡ˆ„ƒ‚ƒ………€‚„„‚‚ƒ„…‰ŒŒ‹Œ‹‰ŒŒŒ‘’“””•••••”—”…€€ƒ‡ŠŠŠŠŠŠŠŠ‰‰‰‰‰‰‰‰ŠŠ‰‰‡‡††ƒ}}}|~‚ƒ‚‚ƒ†‡‡†ƒƒ‚€€€ƒƒƒƒ…‹‹‰‰ˆ‰‰Š‰‰‰‰‰ŠŠ‹‹ŒŒŒ‹‹Š‰‡†„ƒƒƒ„„„„„„„„„„……………………„„„„„„„„…„ƒ‚‚ƒƒ‚‚‚‚‚‚‚‚€‚ƒƒ‚‚ƒ……………„………………†††……††………………††††…„‚‚‚‚‚‚ƒ……ƒ‚‚‚‚‚‚‚ƒ„†‡‡‡‡‡‡‡‡‡€€€€€€€€€€€€€€€€||„ˆŠ‰ˆ‰‰Š‰‰ˆˆ‡‰ˆƒ|y{|zzzzzz{{|{zzz{}}}~€€€€€‚‚‚~|}~ƒ…ˆ‰‰ˆ…ƒ‚‚„……„„„…„„‚€‚€~|||{z~€‚‚€€€€€}zvtuwyzyyxwvvuuuuuvvvvvvutvz|{zxxwwvvuuwuuuvvvutssv{}~}|}~~|{y~{yyywy|€€€€€€€€€€~}}}||{{zz{{{{{{{{zzzz{{{{}~€€~}}}}}}}}}€~~€€}}~~~~€ƒƒƒƒ„„„ƒ„„††…„…‡†ƒ‚ƒ‚€~|}~€~~|{|€}|||||}~}}‚ƒƒ‚‚‚‚‚„„ˆˆˆ„‚„ƒƒ„„„ƒƒ‚‚‚ƒ‚‚€~}zz{zz{~€€€€€€€€€€€€€€€€€ƒ…„|}}}}}}}}}~~}†‰‰ˆ‡ˆˆˆˆˆˆˆˆˆ‡‰Š‰†…†ˆ††††††††„…‡‰‰ˆ‡†‡†…ƒ‚€€€€€‚„…††‡ˆ…‚ƒ„„ƒ€‚„ƒƒ‚„…ˆ‘‘Ž‹ŒŒŒŽ’’“””•–––•˜”„~‚…‰‰‰‰‰‰‰‰ˆˆˆˆˆˆˆˆŠŠŠˆˆ†††„€~}}|~ƒ‚‚ƒ†‡‡†„ƒ‚€‚€€‚‚„†‰‰ˆˆ‰‰ŠŠ‰‰‰‰‰‰ŠŠ‹‹ŒŒŒ‹Š‰†…„ƒƒƒƒ„„ƒ„ƒ„ƒ„„„ƒ„ƒ„ƒ„„ƒƒƒƒ„ƒ„ƒ„ƒ‚‚‚ƒƒƒ‚‚‚‚‚‚‚„ƒ‚‚ƒ…………„„„………………†……………………………††††…„‚‚‚‚‚‚„†…ƒ‚‚‚‚‚‚‚ƒ„†‡‡‡‡‡‡‡‡‡€€€€€€€€€€€€€€€€||„ˆŠ‰ˆ‰‰‰‰‰‰ˆ‡ˆˆƒ|y{{zzzzyzz{{zyxxy|}}~~‚‚|{|}€‚…‡ŠŠ‰„ƒƒ„ƒƒ…†…†…„‚‚~||}{|~€€€€€€€~zxutuwxxyyxwwvuuuuuuuvvwussw|}{zyyxwvvuuuuvwwussssvz}~}|~€€~}y}{xyxvz}€€€€€€€€€€}~~}|{{zz{{{{{{{{zzzz{{{{}~€€~}~~€€~€‚‚‚‚‚„„ƒ„ƒ…†‡…„…‡†ƒ‚€‚‚‚€~~~€€€~}}||}€~|}~~~~}|~ƒƒ‚‚‚‚‚ƒƒ„ˆˆˆ…€…„„„„ƒƒƒƒ‚‚‚}}z{zzy{}€€€€€€€€€€€€€€€€€ƒ…„|}}}}}}}}}~~}†‰‰ˆ‡ˆˆˆˆˆˆˆˆˆˆŠ‹Š‡…†ˆ‡‡‡‡‡‡‡‡„…‡ˆˆˆ†…ˆ‡†ƒ‚€€‚€€‚€€€€€€€€‚„……„„…†…ƒ‚„ƒ‚‚ƒƒ‚ƒ…‡‘“’‘‘ŽŒŒŒŽ‘’’“”•––––•’‹„~~‚†ˆˆˆˆˆˆˆˆ‰‰‰‰‰‰‰‰ŠŠ‰‰‡‡††„~~}|~ƒ‚‚ƒ†‡‡†ƒƒ€ƒƒ†‡‡‡ˆˆŠŠ‹‰ˆˆˆˆ‰‰ŠŠ‹‹ŒŒ‹ŠŠ††„ƒƒƒ„„ƒƒƒ„ƒ„ƒƒ‚‚‚‚‚‚‚‚ƒ„„„„………ƒ‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚€‚ƒ„‚‚ƒ………„„„……………………………„„………………††††…„‚‚‚‚‚‚‚ƒ…††„‚‚‚‚‚‚‚‚ƒ„†‡‡‡‡‡‡‡‡‡€€€€€€€€€€€€€€€€||„ˆŠ‰ˆˆˆ‰‰‰ˆˆˆˆ‡‚|yz{yzzzyyyyyzyxwx{~€~~~~~}|€€€€‚„‚‚ƒ„††…„„‚€€‚‚„…………„ƒƒ‚|}€~zy|~€€€€€~}wvvwxxwvxxxwwvvuvvuuuvwwurrw~~zzzyxwvvursuvxvsqtssv{}~}|}€€~}x}~zxxxv{}~€€€€€€€€€~~~~||{zz{{{{{{{{zzzz{{{{}~~}||}}}}}|~}~}}}}}}~€‚‚‚‚„„„ƒ„„††…„…‡†ƒ‚ƒ‚€~€€}|{}~~~~€€€€~}{|}ƒƒ‚‚‚‚‚‚„„ˆˆˆ„‚„„„ƒƒƒƒƒƒ‚‚~|{{{zzz~€€€€€€€€€€€€€€€€€ƒ…„|}}}}}|||}~~}†ˆ‰ˆˆˆˆ‡ˆ‡ˆ‡ˆˆˆ‰Š‰‡†‡ˆ‡‡‡‡‡‡‡‡„…‡ˆˆˆ†……„ƒ‚€€€‚‚‚‚€~‚ƒ„„ƒ„…‡‡…ƒ‚ƒƒƒ‚‚ƒ‚‚ƒ†‰‘””‘‘Ž‘’’’“”••••‘މ‚~„ˆˆˆˆˆˆˆˆˆŠŠŠŠŠŠŠŠŠŠŠˆˆ†††„€~~~|‚ƒ‚‚ƒ†‡‡†„ƒ‚€€ƒ€€ƒ………‡‡‰‰ŠŠˆˆˆˆˆˆ‰‰ŠŠ‹ŒŒ‹‹Š‡‡…„„„……„„„„„„„„„„„„„„„„……††‡‡‡ˆ„ƒ‚‚ƒƒƒƒ‚‚‚‚‚‚‚„ƒ‚‚ƒ……„„„„„……†……„„„…†„„„……………††††…„‚‚‚‚‚‚‚ƒ…††„‚€‚‚‚ƒ‚‚‚ƒ„†‡‡‡‡‡‡‡‡‡€€€€€€€€€€€€€€€€||„ˆŠ‰ˆˆ‰‰‰‰‰ˆˆˆ‡‚{xzzy{{zyyyyyzyyxyz|}~~~~~}{{~}~€‚€€€‚„…„ƒƒ€€€‚‚ƒ„„„ƒƒ…‚€{wwz|~~~€€€€~}|uvvxyywuxxxwwvvvvvutuvwxvssx‚~yyyxxwwvvrstvwvsqsssvz}~}{|}~~}{zx|~zwxwu{}~~€‚€€€€€€€~~~}}||{{||||||||zzzz{{{{|}}~~}}|{{{{{{{{z{{|||{z{{{{zzyy{|~€‚ƒƒƒ„„ƒ„„…†‡…„…‡†ƒ‚€‚‚‚€~€€€€€~}|{~€€~}~€~}}}}}{{z}€ƒƒ‚‚‚‚‚ƒƒ„ˆˆˆ…€…„„ƒƒƒƒƒƒ‚‚‚ƒ€~}|}|{z{~€€€€€€€€€€€€€€€€€ƒ…„|}}}}||||}}~}†‰‰ˆ‡ˆ‡‡‡‡‡‡‡‡ˆ‡‡‡ˆˆˆˆ‡‡‡‡‡‡‡‡„…‡‰‰ˆ‡†ˆ‡…„‚€ƒƒ‚‚ƒƒ‚‚€~~€‚ƒƒ…ˆŠ‰‡„ƒƒ„‚‚ƒƒ‚‚„‡Š”•”Ž‘‘ŽŽŽŽ‘’‘’“”””””Œ†}„‰‰‰‰‰‰‰‰‰‹‹‹‹‹‹‹‹ŠŠ‰‰‡‡††ƒ€}~~~€ƒƒ‚‚ƒ†‡‡†ƒƒ€‚€‚„„…†ˆˆ‰ˆˆˆˆ‡‡‡ˆˆ‰‰Š‹ŒŒŒ‹‹‰ˆ‡†……†‡……………………ˆˆ‡ˆ‡ˆ‡ˆ…††‡‡ˆ‰‰†…„ƒ‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚€‚ƒ„‚‚ƒ……„„„ƒ„„…†…„„ƒ„…†„„………†††††††…„‚‚‚‚‚‚„†…ƒ‚‚‚‚‚‚‚ƒ„†‡††††††††€€€€€€€€€€€€€€€€||„ˆŠ‰ˆ‰‰‰ŠŠ‰‰‰‡‡‚{xzzy{{{zzz{{zzzzzz{{||}}}}|{~|zyz{||~€„…†…ƒ€€€~‚ƒƒ„„…ƒ{xux{}}~€€€€~|{uuuvxxwuxxwwwwvvwvuttuwxwtsy€ƒ}wwwwwwwwwutttvuustssvz}~}|}~~~|zyw|~zwxwu|}~~~€‚€€€€€€€~}}}}}|}|||||||||zzzz{{{{{{|}}|{{zzzzzzzzzz|}}|{z|||{{zzzxz}‚ƒ„…„„„ƒ„…††…„…‡†ƒ‚ƒ‚€~~~~}~~~~~}||||}{zz|€ƒƒ‚‚‚‚‚ƒ„„ˆˆˆ„‚„…„ƒƒ‚ƒƒƒƒƒ„ƒƒ~~~}|{|€€€€€€€€€€€€€€€€ƒ…„|}}}}||||}}~}†‰‰ˆ‡ˆ‡‡‡†‡†‡‡‡…„…ˆŠ‰‡‡‡‡‡‡‡‡‡…†ˆ‰Š‰ˆ‡‹‰‡„ƒ‚„ƒ‚‚‚‚ƒ„ƒƒ‚€~}€‚ƒ…ˆ‹‹ˆ†„…„ƒ‚‚ƒƒ‚‚„ˆ‹”––’‘‘’“‘’’“““’’Œ‡€|}‚‡ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ‰ˆˆ†††‚}~…ƒ‚‚ƒ†‡‡†„ƒ‚€€€€‚‚ƒ„…†‡ˆˆ‡‡‡‡‡‡‡ˆˆˆ‰Š‹‹ŒŒŒ‹‹Šˆ‡‡‡ˆˆ††††††††ˆ‡ˆ‡ˆ‡ˆˆ„„…†‡ˆˆ‰‰ˆ†„ƒƒƒƒ‚‚‚‚‚‚‚„ƒ‚‚ƒ……„„ƒ„„„…†…„ƒƒ„…†„„……†††‡††††…„‚‚‚‚‚‚ƒ……ƒ‚‚‚‚‚‚‚ƒ„†‡……………………€€€€€€€€€€€€€€€€||„ˆŠ‰ˆ‰‰ŠŠŠŠ‰‰‡†‚{xyzy|{{{||}}z{{|{zyyz{|}}}}}~||}}}~€ƒ……„ƒ~€~|}‚ƒ„„‚€}{tw{|}}€€€€}|{vtssuvwvxwwwwwwvwvuttuwxxutyƒ}uvvwwwwwwxvtstvvwsssvz}~}~€€}{zw|}zwwwu|}~~}~€ƒ€€€€€€€~||}}}}}}||||||||zzzz{{{{zz{||{zz||||||||z{}~~}{z€€~~}}wy|‚„…†„„ƒƒ„…†‡…„…‡†ƒ‚‚‚€~~~~~~€€€€~}~~€€~zyz|€ƒƒ‚‚‚‚‚‚ƒ„„ˆˆˆ„€‚„…„ƒ‚‚ƒƒ„„„„„ƒ‚€~~~}||€€€€€€€€€€€€€€€€ƒ…„|}}}|||||}}}}†‰‰ˆ‡ˆ††††††††‡„„‰‹‰†ˆˆˆˆˆˆˆˆ…‡ˆŠŠ‰ˆ‡Š‰‡†„ƒƒƒ„ƒƒ‚‚ƒƒ„„ƒƒ€~}‚‚‚‚ƒ†ˆŒ‰†………ƒ‚ƒƒƒ‚‚„ˆŒ”—˜”’’‘‘’“‘’’’’’‘‘‘އ€||€…ŠŠŠŠŠŠŠŠ‰‰‰‰‰‰‰‰ŠŠ‰‰‡‡††~}~€‚†ƒ‚‚ƒ†‡‡†ƒƒ‚€€€‚‚€‚„…†ˆˆ‡††‡‡‡‡‡‡ˆˆ‰Š‹ŒŒŒŒ‹Œ‹Šˆˆˆ‰‰‡‡‡‡‡‡‡‡……………………ƒƒ„…†‡‡ˆ‹Šˆ…ƒ‚ƒƒƒ‚‚‚‚‚‚‚„ƒ‚‚ƒ…„„„„ƒ„„„†…„ƒƒ„…†„………††‡‡††††…„‚‚‚‚‚€€ƒ„„‚€‚‚‚‚‚‚‚ƒ„†‡……………………€€€€€€€€€€€€€€€€~}‚‡‹ŒŒ‹‹Œ‹ŠŠŠ‹‹ˆƒ~{yzz{||yz|}|{}}zy{||}|{{}}|{}€€}{~€€„‰Šˆ†‚~}|}€~~€€……„ƒ€wwwwy|~~~}|{utsuxyywuuvvvvvvvvvvwwwwrsw{|yxxxvuvwyyywtrrsurrsw|~}|}~~~|zyz{vvxxz}€€€€‚€€€€~€€€~}{{{}}||||||||{{{zzzyyz{}~€~~~~~~~~}wy{~‚ƒ„…„…„…„…„……†…‚€€€‚ƒ‚€~~}||||~~~~}}~~€~}~€~~|{|‚ƒ‚ƒƒƒ‚ƒƒ„…†††…ƒ‚ƒ„ƒƒƒƒƒƒ‚‚ƒƒ‚‚€€€~~}}}}€€€€€€€€€€€€€€€€ƒ†…}}|{||||||}}|~ƒ‰‰‡†‰‡‡‡†‡‡ˆˆˆƒ„ˆˆ‡ˆˆ‰Š‰ˆ‡ˆ‰†…†ˆŠ‰†„†††…ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒ„„……‰ŠŠ‰†„ƒƒ‚ƒƒ„‡Š”–—”ޓޑ“’‘‘‘‘’“ˆƒ}{€ˆŠ‰‰Š‹Šˆ‡„†‰Š‰‰Š‹ŠŠŠŠˆ†…ƒ‡„ƒ„ƒ‚ƒ…ƒ‚‚ƒ†‡‡†ƒƒ‚‚‚€‚‚‚‚‚‚††††‡‡‡ˆ†††‡‡‡‡‡ˆ‰ŠŒŽŽŽŠ‡†‡‡†…‚‚‚‚ƒƒƒƒ€€‚„„ƒ‚‚‚ƒ„ˆ‡…„‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚ƒ„„‚‚‚ƒƒƒ„‡†„„……ƒ‚„„„……††††………………†…‡ˆ‡…‚‚ƒ‚‚‚€€‚‚ƒƒ‚‚ƒ‚‚‚‚ƒ„ƒ‚‚ƒ„†‡‡‡†…„ƒ€€€€€€€€€€€€€€€€||}†‰ŠŠŠ‹‹‹Š‰ŠŠ‹ˆƒ~zzzz|}|zy{{z{~}zxz{{|zyz|}|z}€}€€ƒ„ƒƒ…†††‚€}~€~~€€€~~}}yxwxy{}€€€~|zyutstwxwvvvvvvvvvvvvvwwwwrsw{|yuwyyxwwwzxwvwxyywsqu{}zxyz{{zxwy{vvxxz}€€€€‚€€€€~€€€€~}|{|}}||||||||{{zzzzyyz{}~€~~~~~~~~~~~~~~~~~~yz}€‚„……„…„…„…„…„………‚€€‚€‚‚‚€~{|}~~~~~~~~~}}~~}~~~~}~|{|‚ƒ‚ƒƒ‚‚ƒƒ„…†††…ƒ‚ƒ„„„„„ƒƒ‚‚„ƒƒƒ‚€~~~~€€€€€€€€€€€€€€€€ƒ†…}}|{||||||}}|~ƒ‰‰‡†‰‡‡†‡†‡ˆˆˆƒ…ˆˆ‡ˆ‡‰‰‰‡†‡ˆ……†ˆŠ‰‡„…†…„‚€ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚ƒƒ„„„……‰ŠŠ‰†„ƒ„€‚ƒƒ…ˆŠ“•—•‘‘“’“’‘‘‘‘’މ„}{‰ŠŠ‰ŠŠŠˆ‡…‡ŠŠ‰ˆˆŠ‰ŠŠŠˆ‡…„‡„‚ƒƒ‚…ƒ‚‚ƒ†‡‡†ƒƒ‚‚€‚‚‚‚‚……†††‡‡‡†††‡‡‡ˆˆˆ‰‹ŒŽŽŽŠ‡†‡ˆ†…‚€‚ƒ„€€€‚ƒˆ‡…„‚‚‚‚ƒƒ‚‚‚‚‚‚ƒƒ„‚‚‚ƒƒƒ„„„……„„……„„„……††††………………†…‡ˆˆ…ƒ‚ƒ‚‚‚€€‚‚ƒƒ‚‚‚‚€‚‚ƒ‚€‚ƒƒ„„…„ƒ‚‚€€€€€€€€€€€€€€€€{{|…ˆŠ‰‰Š‹Š‰‰‰Š‹ˆƒ~{yzz}}|zzzzy|~~zxyzzzyyz|}}{~€‚€€„…„„…†‡…‚‚‚‚~€€€}}}}}}}}zyxwyz|}}zywvuttuvutvvvvvuvvvvvvwwwwstw|€}zuwyyxwwwzwux|€€~wqsz}xvwyzzyxwy{vvwwz}€€€€‚€€€€~€€€€€~}|||}}||||||||{zzzzyyyz{}~€~~~~~~~~~~~~|}}~€€z{~€ƒ…††…„…„…„…„ƒ„…„ƒ‚‚ƒ‚€~}~€€~|{}~€€~}|}}~~}}}~~|{|‚ƒ‚ƒƒ‚‚‚ƒ„…†††…ƒ‚ƒ„………„ƒ‚‚‚„„„„ƒƒƒƒ†……„„„„ƒ€€€€€€€€€€€€€€€€ƒ†…}}|{|||{||}}|~ƒ‰‰‡†‰‡‡‡†‡‡ˆˆˆƒ‚„ˆˆ‡ˆ‡ˆ‰‡…„…†ƒ„…‡‰ˆ†„…††…ƒ‚‚‚‚‚‚ƒƒ„„„ƒƒƒƒƒƒƒƒƒƒ„„„………‰Š‹‰‡„„„€‚ƒƒ„…ˆ‹“––”’“”‘‘’““’‘‘‘‘’Š„€~}}ƒ‹Š‰‰‰‹Šˆ‡†ˆŠŠˆ††‡ˆˆ‰‰ˆ‡…„†ƒ‚‚‚€‚…ƒ‚‚ƒ†‡‡†ƒƒ‚‚‚€‚‚€…………††‡‡††‡‡ˆˆˆˆ‰Š‹ŒŽŽŽŠ‡†‡‡‡…ƒ‚‚€~€€‚ƒ€‚ˆ‡†ƒƒ‚‚‚ƒƒ‚‚‚‚‚‚‚‚ƒƒ‚‚ƒƒƒƒƒ„……„„…†„„„………†††………………†…‡‰‡…‚‚ƒ‚‚‚€€‚‚ƒƒ‚‚€€€‚€€€‚€‚‚‚€€€€€€€€€€€€€€€€|{|€…‰ŠŠŠŠ‹Š‰‰‰Š‹ˆƒ~zzzz|}|{zzzyx{{yx{}}zzy{~€€‚€€€€‚„……†‡‡ˆƒƒ‚~€€€€}}}~~~~yxwwxz|~€€}{yxvuuttttsvvvvuvuuvvvvwwwwstw|€€}zxxxwuvxzxutx€……‚ƒ}wvz}}{wyz|||{zy~€{uuwwz}€€€€€€€€€€€€€~~}}}}}}||||{{zzzzyyyyz{}~€~~~~}}}}}}}}{||~€y{}€‚„…†„…„…„…„…ƒ„……ƒ‚‚ƒ‚€‚‚‚€~€€~}|}~€~}}~~}|}~|{|‚ƒ‚ƒ‚‚‚‚ƒ„„†††…ƒ‚ƒ„„„ƒƒ‚‚‚‚……………„„„‰‰ˆˆ‡‡‡‡€€€€€€€€€€€€€€€€ƒ†…}}|{|||||}}}|~ƒ‰‰‡†‰‡‡†‡†‡ˆˆˆ„…ˆˆ‡ˆ†‡ˆ†ƒ‚‚„‚„†‡‡…„………„‚‚‚ƒ‚ƒƒ„……ƒƒƒƒƒƒƒƒƒ„„„„……†‰Š‹Š‡…„„ƒ„…„†‰ŒŽ‘•—–”””’‘’”““’‘‘‘‘’‹…€~„‹ŠŠ‰ŠŠŠˆ‡‡‰Š‰†„ƒ„†‡ˆˆˆ‡†…†ƒ€€„ƒ‚‚ƒ†‡‡†ƒƒ‚‚€‚€€€„„„……††††††‡ˆ‰‰‰ŠŠŒŽŽŽŠ‡†‡ˆ†………„ƒ€€~~~€€~~}~~€‚ˆ‡…„‚‚‚‚ƒƒ‚‚‚‚‚‚ƒ‚‚ƒ‚ƒƒ„……†…„ƒ„„„„„„…………†………………†…‡ˆˆ…ƒ‚ƒ‚‚‚€€‚‚ƒƒ‚‚€€~€‚‚‚‚‚€€€€€€€€€€€€€€€€}}~‚‡ŠŒ‹‹‹Œ‹ŠŠŠ‹‹ˆƒ~{yzz{{{{{zzz{}}yxyzy|{{}ƒ„ƒ…ƒ€~~~€ƒƒƒ…††……€‚~}~€€||||}}~~wvvvx{~}}~}}{zyvvvutssswvvvvuuuvvvvwwwwsux}€~zwwwvuuwyussx†…‚…ƒ|z{~€yz}~~}|x~€zuuwvz}€€€€€€€€€€€€€€~~}}|}}}||{{{zzzyyxxxz{}~€~~~~}}}}}}}}{|}}€xy|~‚„„…„…„…„…„ƒ„†…„‚ƒƒ‚ƒ‚€~|}~€€€~~~}€~}~~|{|‚ƒ‚‚‚‚‚ƒ„†††…ƒ‚ƒ„ƒ‚‚‚‚ƒƒ……………………†††……„„„€€€€€€€€€€€€€€€€ƒ†…}}|{|||{||}}|~ƒ‰‰‡†‰‡‡‡†‡‡ˆˆˆƒ‚„ˆˆ‡ˆ‡‡ˆ…ƒ€‚ƒ†ˆ‰ˆ‡‡„„„‚€‚‚ƒƒ„……„„„„„„„„„„„„……††Š‹‹Šˆ……„‚ƒ………‡ŠŒŽ”––•””’‘“””“’‘‘‘‘’ˆ‚€€€„‰Š‰‰‰‹Šˆ‡‡‰Šˆ…ƒ‚‚……‡‡ˆ‡‡††‚~€„ƒ‚‚ƒ†‡‡†ƒ‚ƒ‚‚€‚€€€ƒƒ„„…„……††‡‡‰‰ŠŠŠ‹ŒŽŽŽŠ‡†‡‡‡…ˆˆ‡†„ƒ‚‚~}|||}~~~~~€‚ƒˆ‡†ƒƒ‚‚‚ƒ‚ƒ‚‚‚‚‚‚‚‚‚ƒƒƒƒ†…„„……„ƒ„„„„„………†………………†…‡‰‡…‚‚ƒ‚‚‚€€‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚€€€‚ƒƒƒƒ€€€€€€€€€€€€€€€€~~ƒ‡‹ŒŒ‹ŒŒ‹ŠŠŠ‹‹ˆƒ~zzzz{zz|{zyz|~}zwxyx|{|ƒ†‡‡ˆƒ~}~€€ƒ††…„€€~}~~~~~~~~{{z{zzzzvuuvx{~|}}}||zzuvwvtsttwwvvuuuuvvvvwwwwtux}~{suwwvuuuutuz„ƒ„…„€|{}z{}~~~|{x~zttvvz}€€€€€€€€€€€€€~€~}|~~}}{{zzzzyyxxxxz{}~€~~~~~~~~~~~~|}}~~€€wy{~€‚ƒƒ„…„…„…„…„…††„ƒ‚‚‚€‚‚‚€~|}~€€€~~~~€~~~~|{|‚ƒ‚‚‚‚ƒ„†††…ƒ‚ƒ„‚‚‚ƒ„„„„………††‡‡††…………€€€€€€€€€€€€€€€€ƒ†…}}|{||||||}}|~ƒ‰‰‡†‰‡‡†‡†‡ˆˆˆ„…ˆˆ‡ˆ‡ˆˆ†‚€€‚…ˆŠ‹ŠŠŠ‡‡…„‚‚ƒ„‚‚‚ƒƒ„„„„„„„„„„„„…………††‡Š‹‹‹ˆ†……ƒ„…††ˆŠŽ’”••””’‘‘’“““’‘‘‘‘’“‹ƒ€€ƒ‡ŠŠ‰ŠŠŠˆ‡…‡‰‡…‚‚‚ƒ„…‡‡ˆ‡‡…~~}}ƒƒ‚‚ƒ†‡‡†ƒƒ‚‚€‚€‚‚ƒƒƒƒ„„„…†‡ˆ‰Š‹‹‹ŒŽŽŽŽŠ‡†‡ˆ†…ˆˆˆ‡†……„€~}|}}~‚„…ˆ‡…„‚‚‚‚ƒƒ‚‚‚‚€‚‚‚‚ƒƒ„„ƒƒ„…††…„„„„„„„„†………………†…‡ˆˆ…ƒ‚ƒ‚‚‚€€‚‚ƒƒ‚‚‚‚‚ƒ‚ƒ‚‚‚€€€‚‚‚„„„ƒ‚€€€€€€€€€€€€€€€€}|~†Š‹‹Š‹‹‹Š‰ŠŠ‹ˆƒ~{yzz|{{||yxyvyzxx{}}zz{~ƒ‡ˆˆˆƒ~~}~€~}€„†……‡ƒ€€~‚}}}}}}}}}||{zyyxwvvvxz|~}}~}|zyxuvwvutuvwwwvvuutvvvvwwwwtvy}~{rtvvutttvxz~‚‚‚‚‚€}|||||~}|zw}yttvvz}€€€€€€€€€€~€€€}|~~}||{zzyyyyxxxxz{}~€~~~~~~~~~~~~~~~~~~~xy|‚ƒ„„…„…„…„…„…†‡†„‚‚‚‚ƒ‚€~~~}|~~~~~~~~~|{|‚ƒ‚‚‚ƒƒ†††…ƒ‚ƒ„„ƒ‚‚‚ƒ„…ƒƒƒ„……††‰‰‰ˆˆ‡‡‡€€€€€€€€€€€€€€€€ƒ†…}}|{||||||}}|~ƒ‰‰‡†‰‡‡‡†‡‡ˆˆˆƒ‚„ˆˆ‡ˆ‰‰‰†‚€‚…ˆŠ‹ŠŠ‹‰‰ˆ…„ƒ„…ƒƒƒƒƒƒƒƒ………………………………††‡‡Š‹ŒŠˆ†……ƒ…††‡ˆ‹Ž‘’“””‘‘‘‘‘“”’‘‘‘‘’“‰€‚…Љ‰‰‹Šˆ‡„†‡‡„‚‚ƒ‚ƒ…†ˆˆˆ‡…€}|||ƒƒ‚‚ƒ†‡‡†ƒƒ‚‚‚€‚‚‚‚‚‚‚‚‚ƒƒ„„…†‡ˆ‰Š‹ŒŒŒŽŽŽŠ‡†‡‡‡…†††††††…„ƒ‚€€€ƒ„†‡ˆ‡…ƒƒ‚‚‚ƒƒ‚‚‚ƒ‚€€‚‚‚ƒƒƒƒƒƒƒ„…†††„„„„„„„„†………………†…‡‰‡…‚‚ƒ‚‚‚€€‚‚ƒƒ‚‚‚‚ƒ‚ƒ‚€‚ƒ‚‚ƒƒƒ‚€€€€€€€€€€€€€€€€€{{|€…ˆŠ‰ŠŠ‹Š‰‰‰Š‹ˆƒ~{yzz}{{}{xww{}}ywxyxyxz}‚†‡‡‡‚~}~€ƒ††„„‡…‚€„}}}}}}||€€~|{zzxwvvwy{|}{ywvtvxwutvxwwwvuuttvvvvwwwwtvy~‚{tttsrrtvx{‚€~~}zx}~€~|{w}~yttuvz}€€€€€€€€€€€€~€€}|~~}}{{zzyyyyxxxxz{}~€~~~~~~~~}y{}€ƒ…††„…„…„…„…†‡‡†„‚‚‚‚€~€}}}}~}~€€~~}|}~~|~|{|‚ƒ‚‚‚ƒƒ†††…ƒ‚ƒ„†…„ƒƒƒ„…‚‚ƒƒ„……†ˆ‡‡‡††††€€€€€€€€€€€€€€€€ƒ†…}}|{||||||}}|~ƒ‰‰‡†‰‡‡††‡‡ˆˆˆƒ…ˆˆ‡ˆ‰Š‰†‚€€ƒ‡‰‰ˆ‰Šˆ‡†ƒ‚ƒƒƒƒƒƒƒ‚……………………………††‡‡‡Š‹Œ‹ˆ†……ƒ…†‡‡ˆ‹Ž‘‘’““‘’‘’”’‘‘‘‘’‡~}~…Љ‰ŠŠŠˆ‡‚„††„‚‚ƒ‚„†‡ˆˆˆ„€||{|ƒƒ‚‚ƒ†‡‡†ƒƒ‚‚€‚‚‚‚‚‚‚‚‚ƒƒƒƒ…†‡ˆ‰‹ŒŒŒŽŽŽŠ‡†‡‡†…„„„„…………‡†…ƒƒƒƒ„‚‚‚ƒ„†ˆ‰ˆ‡…„‚‚‚‚ƒƒ‚‚ƒ‚€€€‚‚‚ƒƒƒ„„…†…„ƒ„…„„„„„„„„†………………†…‡ˆˆ…ƒ‚ƒ‚‚‚€€‚‚ƒƒ‚‚€‚‚€„ƒ‚‚ƒ„‚‚‚‚‚€~€€€€€€€€€€€€€€€€€‚‡‹‹ŠŠ‰‰ˆˆ‡ˆ‡‚|yz{y{{{zyxxx|}}{yxy{|yxy„ˆŠ…„‚€€€‚ƒ…†‡‡ˆ‡~~‚€€|}~~}|€~}|}}}|||{{{{{{~}|{yxwvuuuuvvwxwvvuuuvvvvvvvvvvttv{‚}yuvvussux~„„~zz{{{{||{}~~|zxz{|zwuvxy~‚€€€€€€€ƒ€~€€~€€€€}{}{zyz{||{zxxwww{|}€€€€€‚‚‚€€~€{{|~ƒ…††………………………………„ƒ‚€€‚}~~~~~~~~|}~~}|~}}}~~}|}|}€ƒ„ƒ‚‚ƒ‚‚ƒ…‡‡†„‚‚ƒ‚‚‚‚‚‚‚‚€‚„…†††ˆ‡‡††……„€€€€€€€€€€€€€€€€‚ƒ‚€|z{}||||||||}„‰‰……‡‡‡‡‡ˆˆ‰‰ˆ†……‡‰‰ˆˆ‰ˆ„€ƒ„†ˆŠ‰‰ˆ†…„‚€€€‚‚ƒƒƒ„„„„„„„„„„„……„„„…††„…‡ˆˆ†„ƒ………‡‰‹‘‘‘‘‘‡}~ƒ‡‹Šˆ‰‹ŒŠ‰…„ƒ‚‚ƒ…†‡‡‡‡‡‡‡‡„‚~||~€ƒ…ƒ‚ƒ†‡†„„ƒ‚‚‚‚‚‚‚€€€€‚‚€€‚ƒ‚ƒ…„…†‡‰Š‹ŒŠ‹ŒŠ‰ˆ‡†††††…„„ƒƒ„„†…………„„„‚‚ƒ„…†ˆ‡…„‚‚‚‚„„ƒƒƒ‚‚‚‚‚‚‚‚ƒ‚ƒ………………„„„…„ƒ„………„…………††††„†ˆ‡„‚‚‚€‚‚‚‚€‚‚ƒƒ‚‚€€€‚~€‚„„„ƒ‚€€€€€€€€€€€€€€€€†††ˆŠ‹‹‹‹‹ŠŠ‰ˆˆˆ‰‰„}z||{z{{{zzzz{||{xxy{{yx{€…ˆ‰ˆ†ƒ~~~ƒ„…†††ƒ|~‚€€€€}}}}|{zz{{|||}|{zywvuuuuuuvvwxwvvuuuuvvvvvvvvvttv{‚}yuvvussux€‚‚€~zzzzyyyy{}~~}zxz{|zwuvxy~€€€€€‚€~€~€€€€}{~}{zyz{|{{yxxwwx{|}€€€€€‚‚‚‚€€€~€€{z{~‚………………………………………„ƒ‚ƒƒ‚ƒ„„|||}~€~~}}}}~~~~~}|}~}|}€ƒ„ƒ‚‚ƒ‚‚ƒ…‡‡†…‚‚ƒ„„„ƒƒƒ‚‚€ƒ„†††…ˆ‡‡††………€€€€€€€€€€€€€€€€€~|{{|||||||||}„‰‰†…‡‡‡‡‡‡ˆ‰‰ˆ†„…‡‰‰ˆˆ‰‡…€ƒ…‡ˆˆ‡†ˆ‡…ƒ‚‚ƒƒƒƒ„„„„„„„„„„„……„„„…††‡††…„………‡‡‡‰Š‘‘‘‘‘‘‘‘‘Žˆ‚}~‚‡‹Šˆ‰‹ŒŠ‰„„‚‚ƒ„†‡‰‰‰‰‰‰‰‰„‚||~€‚…ƒ‚ƒ†‡†„„ƒ‚€‚‚‚‚‚‚€€€‚‚‚‚€‚ƒ‚ƒ………†‡‰Š‹‹Š‹ŒŒŠ‰ˆ‡†††††…„„ƒ„„„„…„……………‚‚‚„…‡ˆ‡…„‚‚‚‚„„ƒƒ‚‚‚‚‚‚‚‚‚ƒ‚ƒ……………„„„„…„ƒ„………„……………†††„†ˆ‡„‚‚‚€‚‚‚‚€‚‚ƒƒ‚‚‚‚€€€~€‚ƒ„ƒ‚€€€€€€€€€€€€€€€€ˆ‰ŒŒŒ‹‹‹‹ŠŠ‰‰ˆˆˆ‹Š…~{}}|zzzzzzzzy{|zywyzyyz}‚†ˆ‡ˆ†ƒ~~~€‚„…………‚~{|~}~€‚€~~‚~~~}{yxyz{}~€{zyxwutsuuuuvvwwwvvuuuvvvvvvvvvvttv{‚~yuvvussvx€‚~}}zzzyxwww{|~}{yz{|zwuvxy~€€€€€€€€~€}{}|{zzz{{{zyxxxxx||~€€€€€€€‚‚‚€€€€zyz}„…„………………………………„ƒ‚„‚‚‚„ƒ}}~}~~~~}}~~~~}}}}~~}}€}|}€ƒ„ƒ‚‚ƒ‚ƒ…‡‡‡„ƒ‚ƒ……„„ƒƒƒ‚‚„…†††…‡‡‡††………€€€€€€€€€€€€€€€€}|}||{||||||||}„‰‰†…ˆ‡‡‡‡‡ˆ‰‰ˆ†„„‡ˆ‰ˆˆ‰ˆ„€€ƒ…†††…‡†…ƒ€€ƒƒƒƒ„„„„„„„„„„„„…„„„„…††‰‡…‚‚ƒ…†ˆˆ‰ŠŒŽ‘’‘‘‘‘‘‘‘‘‘“Š‚~~‚†‹Šˆ‰‹ŒŠ‰ƒ‚ƒƒ„†‡ˆŠŠŠŠŠŠŠŠ…ƒ}|~€‚…ƒ‚ƒ†‡†„„ƒ‚‚‚‚‚‚€‚‚‚‚‚ƒ‚ƒ………‡‡‰‰‹‹‹‹ŒŒŠ‰ˆ††…†††……ƒƒƒ„„ƒƒ„„…†††„ƒƒ†ˆˆ‡†ƒƒ‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚ƒ‚ƒ…………„„„„ƒ…„ƒ„………„„„…„…………„†ˆ‡„‚‚‚€‚‚‚‚€‚‚ƒƒ‚‚„ƒ‚€€€€€‚ƒ‚‚€€€€€€€€€€€€€€€€…‰ŒŽŒ‹‹ŒŠŠŠŠ‰‰‰‰Š‰„~{|}{{zyyyyxwxz{{yxxzxx{„‡ˆ†…„‚€€€‚ƒ……†††|{~}{|~~}~€~zxwxy|~‚ƒ||zyxwuuuuuuuvvwwwvvuuuvvvvvvvvvttv{‚}yuvvussux€‚€}z{||{zzxxvvz|}~}{yz{|zwuvxx~€€€€~€€€~~€€€€}{||{{{{{{{zyxxxxx|}~€€€€€€€€‚‚‚‚€€€~€€yyy}€„„„………………………………„ƒ‚€‚‚}~~~~}~}}|}~~}||}}€~}}|}€ƒ„ƒ‚‚ƒ‚‚ƒ…‡‡†…‚‚‚ƒ„„„„ƒƒƒƒƒ„…††……„†††……………€€€€€€€€€€€€€€€€€}{{|}|z|||||||||~ƒ‰‰††ˆˆ‡‡‡‡ˆ‰‰‡…ƒ„†ˆˆ‡ˆ‰‡…€€ƒ…†††…†…ƒ€ƒƒƒ„„„„…„„„„„„„„„„„„„……†‡†„ƒ‚‚‚ƒˆˆˆ‰‹Ž‘‘‘‘‘‘‘‘‘Ž”‘Šƒ~~‚†‹Šˆ‰‹ŒŠ‰‚‚ƒ„†ˆ‰ŠŠŠŠŠŠŠŠŠ†„€}|~€‚…ƒ‚ƒ†‡†„„ƒ‚€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€ƒ…†††ˆˆŠŠŠ‹ŒŒŒŒ‰‰‡†…†…††…„„ƒ„„„‚‚ƒ„…‡‡ˆ†„€‚†ˆˆ‡…„‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚€ƒ………„„„„ƒƒ…„ƒ„………„„„„…„………„‡ˆ‡„‚‚‚€‚‚‚‚€‚‚ƒƒ‚‚…„‚€€€€‚‚‚‚‚‚€€€€€€€€€€€€€€€€…ˆŽ‹‹ŒŠŠŠŠŠ‰Š‰ˆˆƒ|y{{z{zyyzyxwwy||{yyzyy{€…ˆˆ‡…„‚€€€€ƒ„……†…|{}~|{{}~~~}~~}{xvxz|‚„†~|{yyxvuuuuuvvwvvuuuvvvvvvvvvvttv{‚~xuvwussvx€~{xy{}}|{zyxxy{}~}|zz{|zwuvxx}€€~€€~~~~~€€}{{{{{|{{{zzyxxxyy|}~€€€€€€€‚‚‚€€€€yyz|ƒ„„………………………………„ƒ‚‚€€€‚}||}}~€~~}}}}~~}}~€€}}|}€ƒ„ƒ‚‚ƒ‚ƒ…‡‡‡„ƒ‚ƒ‚‚‚‚ƒƒƒƒ„„………„ƒ‚„„„„„„„„€€€€€€€€€€€€€€€€€}{z|}|z|||||||||~ƒ‰‰††‰ˆˆ‡‡‡ˆˆ‰‡…ƒƒ†‡ˆ‡ˆ‰ˆ„€‚…‡ˆ‡‡††…ƒ€ƒƒ„„…„……„„„„„„„„„„„ƒ„„……„„…„„‚€………†ˆ‹‘‘‘‘‘‘‘‘ŽŽ“‰‚}~‚†‹Šˆ‰‹ŒŠ‰‚ƒ„…ˆˆ‰Š‰‰‰ˆ‰ˆ‰‰‡…~}~€‚…ƒ‚ƒ†‡†„„ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚ƒ…††‡‡‰‰ŠŠŒŒŒŒ‹‰ˆ‡†…………†……ƒƒƒ„„‚‚ƒ„††‡ˆ†„‚…ˆˆ‡†ƒƒ‚‚‚ƒ‚‚‚€‚‚‚‚‚ƒ‚ƒ…………„„„„ƒ…„ƒ„………„„„„„…………„†ˆ‡„‚‚‚€‚‚‚‚€‚‚ƒƒ‚‚…„ƒ€ƒƒƒ‚‚‚‚ƒ€€€€€€€€€€€€€€€€ˆŠŒŒ‹‹‹ŠŠŠŠŠŠŠŠˆ‡‚{yz{y{zyz{}{zvz}~|{z{zz{„ˆ‰‰ˆ†ƒ~~~~€‚ƒƒƒƒ‚}z{{{{}}~€€~}~~}~~~|zwx{}€ƒ…†‚‚€}|{{vuuuuuuvwvvvuuuvvvvvvvvvttv{‚}yuvvussux€~|yxyz}}||{zyyy{}~|{z{|zwuvxw}€~€€~€~~~~~}~€€€€}{yz{|||{{zyyxxxyy}~~€€€€€€€‚‚‚‚€€€~€€zzz}„…„………………………………„ƒ‚ƒƒ‚ƒ„„}}}~~~~}}}~~~}}~}|}~€}|}€ƒ„ƒ‚‚ƒ‚‚ƒ…‡‡†…‚‚‚ƒ‚‚ƒƒƒ„„„……„‚€‚‚‚ƒƒ€€€€€€€€€€€€€€€€€~||{|{z||||||||{}ƒˆ‰‡‡Šˆˆ‡‡‡ˆˆˆ‡…‚ƒ…‡‡†ˆ‰‡…€‚ƒ…‡‰ˆˆ‡ˆ‡†„‚‚„„„„„………„„„„„„„„„„ƒƒƒ„……ƒ„……ƒ~|ƒƒƒ„†‰‹Œ‘‘‘‘‘‘’’‘‘ŽŽŽ‡}}‚‡‹Šˆ‰‹ŒŠ‰ƒ„†ˆˆ‰‰‰ˆ‰ˆ‰ˆ‰ˆˆ‰†‚~}~€‚…ƒ‚ƒ†‡†„„ƒ‚€‚€‚‚‚‚‚‚‚‚‚‚‚€ƒ…‡‡‡ˆˆ‰‰‰ŒŒ‹‹‰ˆ††…………†…„„ƒ„„„ƒƒ„……††‡†„€€‚„†ˆ‡…„‚‚‚‚‚‚‚‚€€‚‚‚‚‚‚‚€ƒ…††…………„„…„ƒ„………„„„„……………„†ˆ‡„‚‚‚€‚‚‚‚€‚‚ƒƒ‚‚ƒƒ‚‚ƒ„†…„ƒƒƒ„„€€€€€€€€€€€€€€€€†††ˆŠ‹Œ‹ŠŠŠŠŠŠ‹Š‰ˆƒ}z{|z|zyz|}|{wz~€}||}{{}‚‡Š‹ˆ†ƒ~~~~~€‚ƒƒƒ‚~{{|z{}~~~~~~~~~}}}~~}|yz|~ƒ…†ƒ‚€}|{vuutuuuuwvvuuuvvvvvvvvvvttv{‚~yuvvussux€}{yyzyyzzzzzzzzxz}~~}{z{|zwuvxw|€~~€~~}~~}~~}}€€}{yy{|}||{yyxxxxyz}~€€€€€‚‚‚€€~€{z{~‚…†…………………………………„ƒ‚„‚‚‚„ƒ~~~~}}}|}~~}|€€~|z{~€}|}€ƒ„ƒ‚‚ƒ‚ƒ…‡‡‡„‚‚ƒ‚‚‚ƒƒƒ„„ƒ„„ƒ‚~~€€€€€€€€€€€€€€€€€€€€}{zz{||||||||{}‚ˆ‰‡‡Šˆˆˆ‡‡‡ˆˆ†„‚ƒ…‡‡†ˆ‰ˆ„€‚ƒ…‡ˆˆ‡‡‰ˆ†…ƒƒ‚‚„„„„……††„„„„„„„„„ƒƒƒƒ„………„„‚~}‚‚ƒ„†ˆŠŒ‘‘‘‘‘’‘‘‘ŽŽŽŽŠ…|}ƒˆ‹Šˆ‰‹ŒŠ‰…†‡‰‰‰ˆ‡ŠŠŠŠŠŠŠŠ‰‡‚}~€‚…ƒ‚ƒ†‡†„„ƒ‚‚€€‚‚‚‚‚‚‚€€‚‚‚ƒ‚ƒ…‡‡ˆˆˆˆ‰‰ŒŒ‹Šˆ‡‡……„……†…„ƒƒƒ„„„„…………………„ƒ‚‚‚ƒ„ˆ‡…ƒƒ‚‚‚‚‚‚€€€‚‚‚‚‚ƒ‚ƒ…†††††…………„ƒ„………„………………††„†ˆ‡„‚‚‚€‚‚‚‚€‚‚ƒƒ‚‚‚‚ƒ…†‰ˆ†„„„…†€€€€€€€€€€€€€€€€€‚‡ŒŠŠŠŠŠ‹‹‹ŠŠ…~{}}|}{yz{|zxw{€~}}~|z|‡‹…„‚€€€€ƒ„„„„€}|~~|zz}|{zz{|}~}||}~~~z{|ƒ…†‚‚~}|{vuuutuuuwvvuuuuvvvvvvvvvttv{‚}yuvvussux€|yxy{zyxxxxyyyyxz|~~}{z{|zwuvxw|€~}€~~}}~}~~}}€€€€}{xy{}}}|{yyxxxyyz}~€~€€€€‚‚‚€€~€€{{{~‚…††………………………………„ƒ‚€€‚}||}}~~~}}}}~~}{|}}}}|}€ƒ„ƒ‚‚ƒ‚‚ƒ…‡‡†…‚‚ƒ„„„„„„ƒƒƒƒƒƒ~|}}~~€€€€€€€€€€€€€€€€€€€€~zyz{||||||||{}‚ˆ‰‡‡Šˆˆˆ‡‡‡ˆˆ†„‚ƒ…‡‡†ˆ‰ˆ„€‚…‡ˆˆ‡†ˆ‡†„‚‚„„„………††„„„„„„„„ƒƒƒƒƒ„„…‡…‚€~~~ƒƒƒ„†‰‹Œ‘‘‘‘‘‘‘‘ŽŽŽŠˆƒ~{}ƒˆ‹Šˆ‰‹ŒŠ‰†‡ˆŠŠ‰‡†‹‹‹Œ‹‹‹‹Š‡ƒ}~€‚…ƒ‚ƒ†‡†„„ƒ‚‚€€‚‚‚‚‚‚€€€€‚‚ƒ‚ƒ…‡‡ˆˆˆˆ‰‰Œ‹Šˆ‡†…„„„…†…„„ƒƒ„„†…………„„„„ƒƒƒƒƒƒƒˆ‡…„‚‚‚‚‚‚€€€€‚‚‚‚‚ƒ‚ƒ…‡‡††††………„ƒ„………„…………††††„†ˆ‡„‚‚‚€‚‚‚‚€‚‚ƒƒ‚‚€€€‚…‡ˆ‹‰‡…„…†‡€€€€€€€€€€€€€€€€‚„‡ŠŒŒ‹ŠŠ‹ŒŠ‰‡†„|xyyyzzzzzvux~€}}~{{}€…ˆˆ‡‡†„‚€€€€‚ƒ„…zwxzz|{{{{{|}}{||{~€}z{|}~€€xwutttvwxwvutuuvyxxwvvuuttw{€|vutsstuvzzzzzxwvttuuwwxxzyy|€€|xy~~yvwxvx{€~~}}~~}}}}~~€€€€‚ƒ}yz{}~~}{zyyxxyz{|€€‚‚‚‚‚‚‚‚‚‚‚€{z{~‚…†……„„„„…††‡…………‚‚ƒƒ‚‚‚€|}~~~~€~~€€~}~€~|{|‚ƒ‚‚‚‚€„†ˆ‡…„ƒ‚‚‚‚ƒ„„ƒƒƒ…‚ƒ„…„{www{}~€€€€€€€€€€€€€€€€‚~~}|z{{{{{{{{}}ƒ…†‡‡‡‡‡ˆˆˆˆ„„‚€ƒ‰‹ˆ‡Šˆƒ€‚ƒ…‡‡‡†…‡†…ƒ‚‚‚‚„„…………„„……………………ƒƒƒƒ„…†‡………„ƒƒ‚‚ƒƒƒ„…††‡‹’““““‘‘ŽŽŽŽŽ‡†ƒ|}‚†‰Š‹ŒŒ‹Š‰‹‰‡††ˆ‹‘’““‘‹†}|…„ƒ‚ƒ†‡†„„ƒ‚€€‚‚€€‚ƒƒ„‰ˆ‡††ˆŠ‹‹ŒŽŽ‹‡…………………………„„„„„„ƒƒƒ„…………„„…†…„ƒ„„†‡†„€ƒ‚‚‚€€ƒ‚‚‚‚‚ƒ‚„ƒ‚ƒ„………„ƒ‚ƒƒƒ„„………„„„……††††…‡‰†„‚‚‚‚‚€€‚ƒƒ‚‚‚‚‚„ˆŒŠŒ‹†„†ˆˆ€€€€€€€€€€€€€€€€‚‚‚„‡Š‹ŒŒŒŠŠŠŠŒŒ‹‰ˆ‡†ƒ|zzzzzzzzwvy~|{}{{|…ˆˆ‡‡†…ƒ‚€€€€‚ƒ„……€{xyyz{~||||||{{z{{{}€|{{|}~€€zywuttuuwwvvuuuuxxwwvuuuttw{€|vvtsstvvzzzzyxwvsstuvwwxzyz}|yy~~yvwxvx{€~~}~~~~}}}~~€€€€€‚‚}yz{}~~}{zzyyyyz|}€€‚‚‚‚‚‚‚‚‚‚€{z{~‚…………„„„„…††‡…„…„‚‚‚‚‚‚€}~€€~~~}}}~~€~~€~|{|‚ƒ‚‚ƒ‚€ƒ†ˆ‡…„ƒƒ‚‚‚ƒ„„ƒƒ„„‚ƒ„…„|xyy|‚€€€€€€€€€€€€€€€€€€‚€~~~}|z{{{{{{{{|}~€ƒ„…†††‡ˆˆ‰‰††ƒ€ƒ‰Š‡‡Šˆƒ€‚ƒ…‡ˆ‡†…‡†…„‚‚‚‚„„…………„„……………………„„„„„……†………„ƒƒƒ‚ƒƒ„„…††‡‹ŒŽ‘’“““ŽŽŽŽ‡†ƒ|}†‰Š‹ŒŒ‹Š‰‰ˆ‡†‡‰ŒŽ‘’“”“’ŽŒ†}|…„ƒ‚ƒ†‡†„ƒƒ‚€‚‚€€‚‚ƒ„„‰ˆ‡†‡ˆŠ‹‹ŒŽ‹‡…………………………„„„„„„ƒƒƒ„…………„„…†…„ƒ„„†‡†„€ƒ‚‚‚€€ƒ‚‚‚‚‚ƒƒ„ƒ‚ƒ……„„ƒƒƒƒƒƒƒ„„………„„„……††††…‡‰†„‚‚‚ƒ‚€€‚ƒƒ‚‚‚‚‚„ˆ‹Œ‹†ƒ†ˆˆ€€€€€€€€€€€€€€€€ƒƒ„…‡‰‹ŒŒ‹ŠŠŠŠ‹Œ‹Šˆˆˆ‡„}}||{zyyxwy~{z{{{}€…ˆˆ‡‡†…ƒ€€€€‚ƒ„„…|yyzyz|}}}}|{zy{||{}~||}}~€€|{ywutttvvvvvuuuvvvvuuttttw{€|wvuttuvwzz{zzxwvrrstuuvvyy{}~|yy}yvwxvx{€~~~~~}}~~€€€€€‚€}z{|}}~}|{{zzyz{|}€€‚‚‚‚€{z{~‚…†……„„„„…†††„„„„‚ƒ‚‚€~€€€~~~~}}}}}}€€€~|{|‚ƒ‚‚‚‚€„†ˆ‡†„ƒ‚‚‚‚ƒƒƒƒƒ„„‚ƒƒ„„|xzz}‚ƒ€€€€€€€€€€€€€€€€€~}~}|{|||||||||}}~€€„„…†ˆ‰ŠŠˆˆ…ƒˆ‰†‡Šˆƒ€‚„†‡†……†…„‚‚„„…………„„……………………†††…………………„„„ƒƒƒƒ„„……††‡Š‹‘’““‘‘‘ŽŒ‹Š‰ˆ‡„||…ˆ‰Š‹‹Š‰ˆ‡‡††ˆ‹Ž‘’”••“‘Œ†~|€…„ƒ‚ƒ†‡†„„ƒ‚€‚€€‚ƒƒ„„ˆ‡††‡ˆ‰ŠŠ‹ŒŒŠ‡†………………………„„„„„„ƒƒƒ„…………„„…†…„ƒ„„†‡†„€‚‚‚‚€€ƒ‚‚‚‚‚„ƒ‚‚ƒ…„ƒƒƒƒ„…ƒƒ„„„………„„…………†††…‡‰†„‚‚‚‚‚€‚ƒƒ‚‚‚‚‚„ˆ‹‹„‚„‡ˆ€€€€€€€€€€€€€€€€„„…††ˆŠŒ‹‹ŠŠŠŠ‹‹ŒŠ‰‰ŠŠˆ†„ƒ~|zxwwvy~|{}{{|…ˆˆ‡†…ƒ‚€€‚ƒƒ€|yz{z{}||}~}{zy{{z{{}}}}}}~€€~}{yvussuvvwwvutuuuuuuuuttw{€|xwvuuvwx{{{{yxvurrrssttuxy{~~~{zy~~yvxxvx{€~~€~~~~€~€€€}{|}}}}}||||{{z{|}€€€‚‚‚€{{{~‚…………„„„„…†††„ƒ„ƒ€‚‚‚‚‚€€€€~~~~~~~}}~€€~~~~|{|‚ƒ‚‚ƒ‚€ƒ†ˆ‡…„ƒƒ‚‚ƒƒƒƒƒƒ„„‚‚ƒ„ƒ}yzz}‚ƒ€€€€€€€€€€€€€€€€€€~}}}~|{|||||||||||}}}}}‚ƒ…†‰ŠŠŠ‰†‚ƒˆˆ…‡Šˆƒ€€ƒ…†…„„……ƒ‚€€€€„„…………„„……………………††††††……„„„„„„ƒƒ„„……††††‰Š‹Ž‘’“’‘Ž“’Ž‹‰‡†‰ˆ„€||€„ˆ‰Š‹‹Š‰ˆ…††ˆ‰‘’“•––”’‘†~~€„„ƒ‚ƒ†‡†„ƒƒ€€‚€€‚ƒ„„…†††‡‡ˆˆ‰‰Š‹‹Š‰‡†………………………„„„„„„ƒƒƒ„…………„„…†…„ƒ„„†‡†„€ƒ‚‚‚€€‚‚‚‚‚ƒƒƒ‚ƒ„„ƒƒ„„…†„„„„…………„…„……†…††…‡‰†„‚‚ƒ‚‚€€‚ƒƒ‚‚‚‚‚‚‚ƒˆ‹‘‹„€ƒ†ˆ€€€€€€€€€€€€€€€€…†‡‡†‡‰‹‹‹‹‹‹‹‹‹Œ‹‰‰Š‹ŠˆŠˆ…‚~{xwwvy}}{{}€…ˆˆ‡„ƒ‚€~~~~~€€{yz||}~z{}}}|{zyyyyyy{|~~~€~}{yvtstuvwwvvuuuuuvvvvttw{€|yxwvvwxy{{|zzwvurrsrssttwy|~~}|{y}yvwxvx{€~~€€€~~~~€~~~€~|~}}}}}~~~}|{{|}}€€‚‚‚‚€{z{~‚…†……„„„„…†††„ƒ„ƒ€ƒ‚‚‚€€~}}}~~~~~~~}}}~~~}}}}}~|{|‚ƒ‚‚‚‚€„†ˆ‡†„ƒ‚‚‚ƒƒƒƒƒ„„„ƒ‚‚ƒƒ}zyy|‚€€€€€€€€€€€€€€€€€€~}||~~}|||||||||||||||||€‚ƒ…†ˆˆ‰‰…ƒ‡ˆ…‡Šˆƒ€ƒ…†‡‡†…‡…„ƒ‚„„…………„„……………………„…††‡††…ƒƒ„„„„„„………†††††ˆˆŠ‹Ž’““‘‘‘‘’‘Ї…„‰ˆ…|{€ƒ‡ˆ‰ŠŠ‰ˆ‡……‡ˆ‹‘’“•––•“’Ž…~~€ƒ„ƒ‚ƒ†‡†„„ƒ‚€€€€€€€€‚‚„„………††‡‡ˆˆˆˆ‰‰‰‰ˆ‡‡………………………„„„„„„ƒƒƒ„…………„„…†…„ƒ„„†‡†„€‚‚‚‚€€‚€‚‚‚„ƒ‚‚ƒƒƒ„……………„„„…………………………………†…‡‰†„‚‚ƒ‚‚€‚ƒƒ‚‚‚‚‚‚‚‚ƒ‡Š’‘Œƒ€‚†‡€€€€€€€€€€€€€€€€†ˆ‰ˆ†…ˆ‹‹‹‹‹‹‹‹‹ŒŠˆˆ‰ŠŠ‰Œ‹ˆ…‚|{zy|}{{|…ˆˆ‡„ƒ€~~}}~~€€€~zy|}}}z{||}}|||{{|{z|~}zxutuuuvvvvvvvvwwxxxttw{€|zyxwwxyz||{{ywutsssssssswz}}|{{y~~yvxxvx{€~~~€€~~~~~~|}~~}~}}|}~}}|}}~€€€‚‚€{{{~‚…………„„„„…†††„ƒ…ƒ‚‚‚‚‚€€~}}}~~}}}}}}||}}}}}}||~|{|‚ƒ‚‚ƒ‚€ƒ†ˆ‡…„ƒƒ‚‚ƒƒ‚ƒ„„„ƒƒ‚‚ƒƒ~{yy|‚€€€€€€€€€€€€€€€€€€}|{|}~}|||||||||}}}}}~~~~‚ƒ„…‡‡ƒ€‚‡ˆ…‡Šˆƒ€ƒ…‡ˆ‰‰ˆ‡ˆˆ†…ƒƒƒƒ„„…………„„……………………ƒ„…‡††……ƒƒƒ„„„……††††††††‡‡ˆŠŒ‘“““’‘‘‘‘’Ž‹‰‡…„Љ…€{{ƒ‡ˆ‰ŠŠ‰ˆ‡…†‡ŠŒŽ‘’”––•”’Ž…}~€€‚„ƒ‚ƒ†‡†„ƒƒ€€€€€€€€€€€€‚‚ƒ„………„…†‡ˆ‡‡†ˆˆ‡ˆ‡‡‡‡………………………„„„„„„ƒƒƒ„…………„„…†…„ƒ„„†‡†„€ƒ‚‚‚€€‚€‚ƒƒƒ‚ƒƒƒ…††……„…………………………………………†…‡‰†„‚‚‚ƒ‚‚€€‚ƒƒ‚‚‚‚‚‚‚‚ƒ‡Š‹…ƒ†‡€€€€€€€€€€€€€€€€‡‰Šˆ……‡ŠŒŒŒŒŒŒŒŒŒŠ‡†‡ˆˆ‡ŠŠˆ‡†„ƒƒ€~€ƒƒ}{|{{}€…ˆˆ‡…„ƒ€~€€€€{z|~||}{{{|||}}~}}}|{}€€€€~|ywuuuuuvvwwwwxxyyzzttw{€|{zyxxyz{|||{ywuttttstsssvz~}{{|y~~yvwxvx{€~~~~~€~~~~}||~~}€}||}€€~}}}}~€€€€€€€€€€‚‚‚€{z{~‚…†……„„„„…††‡…„…„‚‚ƒ‚‚‚€}~~~~}}~~~}||}}}}}}}|~|{|‚ƒ‚‚‚‚€„†ˆ‡…„ƒ‚‚‚ƒƒ‚ƒ„„„ƒƒ‚‚‚‚~|zz}‚ƒ€€€€€€€€€€€€€€€€€|{{|}~~}{{{{{{{{}}~~€€€~~~€€„„~‡ˆ…‡Šˆƒ€‚„†‡ˆˆ‡†ˆ‡…„ƒ‚‚‚„„…………„„……………………„„†††…„‚‚ƒƒƒ„………††††††††††‡ˆ‹Ž‘““““““’’’ŽŒŠˆ‡……‹‰…€{{‚†‡ˆ‰‰ˆ‡††‡‰ŠŒŽ‘“•–•“’…}}€€€‚„ƒ‚ƒ†‡†„„ƒ‚€€€€€€€€€€€€€€€‚‚ƒƒ„……†ƒ„†‡ˆ‡†…‡‡††††‡‡………………………„„„„„„ƒƒƒ„…………„„…†…„ƒ„„†‡†„€‚‚‚‚€€‚€€‚‚„ƒ‚‚ƒ„„…………………………………………………………†…‡‰†„‚‚‚‚‚€€‚ƒƒ‚‚‚‚‚ƒƒ‚ƒ†‰ŽŒ†ƒ„††€€€€€€€€€€€€€€€€‡Š‹‰…„‡ŠŒŒŒŒŒŒŒŠ†…†‡‡†‡‡ˆˆˆ‰‰‰…ƒƒ…ƒ|yy{{|…ˆˆ‡‡†„‚€€€‚‚‚‚‚‚€}{}}|{|{{{{{|}}|zz{yxz€€€€€~~~}zxvvuutuvwxxxyyz{{|ttw{€|{{yyyy{{}||{ywusttttttttvz~}{{|y~~yvwxvx{€~~~~~~~€~~~~}{|}~~€}||}€€~}}}~€€€€€€€€€€‚‚‚€{z{~‚…†……„„„„…††‡………„‚‚ƒƒ‚‚‚€|}€‚}~~~}}~~~~~}}}~|{|‚ƒ‚‚‚‚€ƒ†ˆ‡…„ƒ‚‚‚„ƒ‚ƒ„„„ƒƒ‚‚‚‚~|{{~ƒ„‚‚€€€€€€€€€€€€€€€€|{z|}~~}{{{{{{{{}~~€‚‚}}}~~~~~‚‚€}€†ˆ†‡Šˆƒ€€ƒ…†…„ƒ…„ƒ€€€€„„…………„„…………………………†‡†„‚‚‚ƒƒ„………‡‡‡††††††…†‡Š‘““””••”’‘Œ‹Šˆ‡†…‹‰…€{{~‚†‡ˆ‰‰ˆ‡††‡‰‹ŽŽŽ‘“••”“’…}}€€€„ƒ‚ƒ†‡†„ƒƒ‚€€€€€€€€€€€€€€€‚‚ƒƒ„…††ƒ„†ˆˆ‡†…‡††……†‡ˆ………………………„„„„„„ƒƒƒ„…………„„…†…„ƒ„„†‡†„€ƒ‚‚‚€€€€€ƒ„ƒ‚ƒ†…„„„„…†…………………………………………†…‡‰†„‚‚‚ƒ‚€€‚ƒƒ‚‚‚‚‚ƒƒ‚ƒ†‰ŒŽŒ‡„…††€€€€€€€€€€€€€€€€†‡‰‰ˆˆ‰ŠŒ‹‹‹‹‹Š‹‰†…„„…ƒ…†…‡Šˆ…ƒ…†…ƒ€vvx~†ŠŠ‡‡‡…ƒ€€ƒ‚‚‚‚ƒ„……€|}~}}~~|z{}{}€€~~~€~}{yxwqsuvuvxz|{xwvwyzyxy|}|zwuuw{}~}zxvvvwwvusssstwy{}}|{yy}~zxyzyy|~~~€~~}~€~~~~~~~~~~~}}|~}}}}€‚€~|||}~€€ƒ‚‚€€‚‚‚‚‚€{z{~‚…†……………ƒƒ…†††……„‚€‚€€€y{~€€~|~|z|€|||}~~}||~|{|‚ƒ‚‚ƒƒƒ‚‚„††††„‚‚ƒ„ƒƒ‚ƒƒ„„ƒƒƒƒƒ‚€‚€„…‚‚ƒ€€€€€€€€€€€€€€€€~z{|{~}{{||||{{~~€€€€}}~~}}~‚‰ŠŠ†€‚€‚…‡†ƒ€‚‚€~€…‡…„…†…†…„ƒ„„‚‚‚‚‚††††††††††‡‡‡‡††„„…†Š‘”•””••”‘ŽŒ‹‰‡††††ˆ‡„{{ƒ†‡‰ŠŠˆ†„…‡‹ŽŽŽŽ’””’ކ~~€ƒ„‚‚ƒ…†…„ƒ‚€€€€€€€€€€€€€‚‚€€€€‚„…†‡‡‡‡‡††††„„……††‡‡‡††……„„ƒ„ƒƒ‚‚ƒ…………„„„…††……………………‡†…ƒ‚‚‚‚‚€€€€€€‚‚ƒƒƒ„„„ƒƒƒƒ‚„„„„„„„„†……„„………†ˆ‰ˆ…‚‚‚‚ƒƒ‚‚‚‚ƒ‚‚‚‚‚ƒƒ…„„ƒƒ„……€€€€€€€€€€€€€€€€‰Š‹Šˆ‡‡ˆŒ‹‹‹‹ŠŠŒ‹‰‡†…„„„††…†‡…y|~~}|~€{{}‚…ˆ‡†„„„ƒ‚‚ƒƒ……„„„…†‡„{}}||~}{|~|~‚€€€€~~€~}|{zzvvvtssvy}|{yyyyywvw{}|zwuuxz}|{ywvvvwwvuttttuxz|~~}|zx|}ywyzxy|~~~~€~~~€€€~~~~~~~~~~}}}}~}}}}~€€~}|}}~~€ƒ„‚‚ƒ‚€€€€‚‚‚‚€{z{~‚…………………ƒƒ…†ƒ„„„„„ƒ‚€€€|}~~~~}}|||}~~}|~~|{|‚ƒ‚‚ƒƒƒ‚‚„††‡†„‚‚ƒƒƒƒƒ„„ƒƒƒƒƒƒ‚€‚€„„‚€€€€€€€€€€€€€€€€~z{|{~}||{{{{||}}€€€€€~}}}}~€†††ƒ}~€€ƒ……‚€€€€€€…‡…„…†…†…„ƒƒ‚€‚‚‚‚‚……………………†††‡‡‡†††††‡ˆ‹Ž‘‘‘“••“‘Œ‹‰‡††††ˆ‡„{|ƒ‡ˆ‰‹Š‰‡††ˆ‹ŽŽŽ‘””’ކ~~~€ƒ„‚ƒ…†…„ƒƒ€€€€€€€€€€€€‚‚€€€ƒ„…†‡‡‡†‡††††„„……††‡‡††……„„ƒƒƒƒƒƒƒ„„…„„„„„……†……………………‡†„ƒ‚‚‚‚€€‚€€‚‚‚ƒƒƒ„„„„ƒƒƒƒ„„„…„„„„†……„„……††ˆ‰ˆ…‚‚‚‚ƒƒ‚‚€‚ƒ‚‚‚‚ƒƒ‚‚ƒ„…€€€€€€€€€€€€€€€€Š‹‹Šˆˆˆ‰Œ‹‹Š‹‹Š‰ŠŠŠ‰ˆ†…„…††„…„}uwxuqpuz|„†‡‡‡ˆ„„ƒƒƒ„„„……„„……†‡ƒ~{{|{{}€~||€~€‚€€€€~€~~~}}|||{zxursux~~~}|zyxttvz€€~|zxvvwz{yxwvvvvwxwvuuuvvyz}~|{x|}ywxyxy{~~~€€~€€€~~~~}}}~}}|}~€€~}}}~~€‚ƒ„€ƒƒƒ€~€€€‚‚‚€€{z{~‚…†……………ƒƒ…†………„„‚€‚€€€€~}||}~~|}~~~||}~~|}}~|{|‚ƒ‚‚ƒƒ‚‚„…†††„‚‚ƒƒƒƒƒ„„ƒƒƒƒƒƒ€ƒ‚„„€‚€€€€€€€€€€€€€€€€~{{|{}|}|{zz{|}||~€€€€~}{|€‚€}|~€€ƒƒ‚~~~€…‡…„…†…††…ƒ~~€€‚‚ƒ„„……………………††‡‡‡††…ˆ‡‡†‡ˆŠŠŒ“”“‘‹Š‰‡††‡‡ˆ‡„{{€ƒˆˆŠ‹‹ŠŠ‰ˆŠŽŽŽ‘““‘Ž…~~~€ƒ„‚‚‚…†…„ƒ‚‚€€€€€€€€€€€€€€€€‚‚„…††††††‡†‡‡…………††††………„„ƒƒƒ‚ƒƒ„„„„„„„ƒƒ„„…………………………‡†…ƒ‚‚‚‚‚€€‚‚‚‚‚‚‚‚ƒƒ………„„„„„……………………†……„………††ˆ‰ˆ…‚‚‚‚ƒƒ‚‚€€€‚‚‚‚‚‚ƒƒ‚„…€€€€€€€€€€€€€€€€‡ˆŠŠŠŠ‹‹ŠŠ‹‹Œ‹Š‰ŠŠ‹‰ˆ†…„††„ƒƒzwywogejpz€‡ŠˆˆŠŒ‡…„ƒ‚‚‚ƒƒ‚‚‚ƒƒ„‚}y{{zz|~|{}€ƒ„ƒ€‚€€€€~€€€~}}|||||ywvxz~€€|ywssuy~€~|{xwvxyzwvvvuvvvxxwvvwwxxy|~~}{zw||yvxyxy|~~~~€€€‚€€€€€~~~~}~}}~}}||}~~~}~~~‚‚€‚ƒ‚€€€‚‚‚‚€{{{~‚…………………ƒƒ…†††……ƒ‚€€€€~}||}~€€€~}}~~}}|}~~~|{|‚ƒ‚‚ƒ‚‚ƒ…†‡†„‚‚ƒ„ƒ‚ƒ„„ƒ‚ƒƒ„„„ƒƒ…ƒƒ†…‚€‚€€€€€€€€€€€€€€€€{{|{}~|}|{{z{|}{{}~€€€€€€€~~z|€ƒƒ‚€~~~}}}€€ƒƒƒ€€€€…‡…„…†…†‡…ƒ}|}€‚ƒ„…†………………………††‡††……‡‡†‡†‡‡ˆŠ‰‰‹ŽŽ‹Šˆ‡‡‡‡ˆˆ‡„{|ƒˆ‰‰‹‹ŒŒŒŠŒ‘’‘Ž‹Œ„~}~~€„„ƒƒ…†…„ƒƒ€€€€€€€€‚ƒƒ……††††‡†‡‡‡…………††††„„„„ƒƒ‚‚‚ƒ………ƒƒƒƒƒƒƒ„„………………………‡†„ƒ‚‚‚‚€€‚‚‚‚ƒ‚‚ƒƒƒ††…………„„††††††††……„„„…†††ˆ‰ˆ…‚‚‚‚ƒƒ‚‚€€€‚‚‚‚ƒƒ€„…‡€€€€€€€€€€€€€€€€†ˆ‰ŠŠŠŒ‰‰Š‹ŒŒ‹‰‰‹‹‹‰‡†„††„„ƒy{zwmc`fmz‰‹ŠˆŠŒˆ†ƒ‚‚€~ƒ‚‚‚‚|yz{yz{{yy|…††‚‚€€€€€€€‚€~}{zyz|~}}~€€}{yutvz€~|{zxxwxxuuvvvuuuxwwvwwxywx{|}|zyx|}ywxyxy{~~}€€€‚€€€€€€€€€}}~}~~~~~~||||}~}}~~~~~€€€€€€€€€‚‚‚‚{z{~‚…†……………ƒƒ…†„„„„„ƒƒ‚‚€€€||}}~~€€~}~~€~~|{|‚ƒ‚‚‚‚ƒ…†††„‚‚ƒ„ƒ‚‚‚ƒ‚‚‚„…††††‡„…††€€€€€€€€€€€€€€€€€{||{}~{{{|{|{|{z{|~~~~€€€~}y|„…ƒ€~~~}}~€€‚‚‚‚‚„…ƒ‚‚€€€…‡…„…†……†‡ƒ||}€€‚„…††…………………………††††……„„††ˆˆˆˆ‰‡†‡ˆ‰‰‡Š‰ˆ‡‡‡ˆˆˆ‡„{{€ƒ‡ˆˆ‰‹ŒŽŽ‹ŒŽ‘‘”“’’’Œˆ‹ƒ}}~~€„„‚‚‚…†…„ƒ‚‚€€€€€‚‚ƒ„„…………††‡‡ˆˆ††††…………ƒƒƒƒƒ‚ƒ‚‚‚„„…„„ƒ„ƒƒƒƒ„…………………………‡†…ƒ‚‚‚‚‚€€ƒ‚‚‚‚‚‚‚‚ƒƒ†††……………††††††††…„„„……†††ˆ‰ˆ…‚‚‚‚ƒƒ‚‚€€€‚‚‚‚ƒƒ‚‚„†ˆ‰€€€€€€€€€€€€€€€€ˆ‰ŠŠ‰ˆ‰Š‰‰ŠŒŽŒ‹‰ŠŠ‹ŠŠ‰‰†ˆˆ‡…„~yyxtledjp|ƒŠŒ‰‡‡ˆ‡…‚‚ƒƒ€…„ƒ‚‚‚ƒƒ‚}yz{zz|zxx{€„††ƒ‚€€€€€€€‚‚€~|zyxx|€‚‚€€~€~}|xxx|}{{zyxwwvvwwwvvtswwvvvwxywy{}}|{yy}~zxzzyy|~~~~€€€€‚€€€€€€€}}}~~~~~~|{{{|||}~~~~~€‚‚ƒƒ‚€€€€€€€€€‚‚‚{{{~‚…………………ƒƒ…†…………„ƒ‚€€z{}~~}}}~~~|||}~~}|~|{|‚ƒ‚‚‚ƒ„†‡†„‚‚ƒ„„ƒ‚‚ƒ‚ƒ…†‡‡‡†„„…ƒ€~€€€€€€€€€€€€€€€€€||}{}~{{{||||{{{||}}}}|}~~~~}}z}„„ƒ€~}|}~€€€‚ƒƒ‚ƒ„…„„ƒ‚€€…‡…„…†…„‡‡…}~€‚‚ƒ„……………………………………†††……‚ƒ…‡ˆ‰‰‰Šˆ……††…„‰‰ˆ‡‡‡ˆ‰ˆ‡„{|ƒ†††‡‰ŒŽ‹Œ’“”–•””“Œ‰Š‚||}~€„„ƒƒ…†…„ƒƒ€€€€€€‚‚‚ƒƒ„„…„……†‡ˆˆ‰††††…………ƒƒƒƒƒƒƒƒ‚ƒƒ„„„„„„„ƒƒƒ„…………………………‡†„ƒ‚‚‚‚€€‚‚‚‚‚‚ƒƒƒ††…………„„††††††††„„„„„††‡†ˆ‰ˆ…‚‚‚‚ƒƒ‚‚€‚‚‚‚‚ƒƒ„„„…†ˆ‰Š€€€€€€€€€€€€€€€€‡ˆ‰‰ˆˆ‰Š‹‹ŒŽŒŠ‹ŠŠ‰ŠŠ‹‹‰‹‹‰‡„~wwuqlhinsz€‡‹Š‡‡‡ˆ…ƒƒ„…„‚††…„„„„„ƒ}z{|zz||zy{~‚‚ƒ€~}~€€€€€€€€€~}|zyyx{€~~}}}~€|{|~|{{{zywvuxxyxwusrvvvuvwxyz{}€}|z~{y{|zy|~~~€€€}}}}~~~|{{{{|{|~€~}~‚‚‚‚€€€€€€‚‚‚‚{z{~‚…†……………ƒƒ…††††…„‚€‚€€€{|~~}{|~~}|}}{{|||||{~|{|‚ƒ‚‚€‚„†††„‚‚ƒƒ„„ƒ€‚‚ƒ„„…„„ƒ„‚€{zz€€€€€€€€€€€€€€€€€|||{|~{||{{{{||||}}}|{z||}}~}}||~ƒ„ƒ€}{{}}€ƒƒ‚‚ƒ„‚‚‚€€€€…‡…„…†…ƒ†ˆ…~€ƒƒƒ„„„„„„…………………………†††……„ƒ„†ˆŠŠ‰‰ŒŠ‡…†‡†…‰ˆ‡‡‡ˆ‰‰ˆ‡„{{ƒ„„„…ˆ‹Ž‘Š‹ŒŽ‘“•—””””•“Œ‰{|}}€„„‚‚‚…†…„ƒ‚‚€€€‚€€€€‚‚‚ƒƒ„„„„„„…†‡ˆ‰‰‡‡††……„„ƒƒƒƒ„ƒ„„ƒƒƒƒƒ„„…„„„„„……†……………………‡†…ƒ‚‚‚‚‚€€‚€€‚‚‚‚‚ƒƒ†…………„„„†…†…†…††„„„„……‡‡†ˆ‰ˆ…‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚ƒƒ††……†‡ˆ‰€€€€€€€€€€€€€€€€„…‡ˆˆ‰‹ŒŒŒŽŽ‹‰‹‹‰‰‰ŠŒŒŽ‹‡„}vxupljkorv|ƒ‰ŠŠ‰‰Š‡„„††…‚‡†…„„„„„ƒ~z{|{{|~|z{}~ƒ}|}~€€€€€€€}}}|{{zzz|}~}~~}{{|~ƒ~~~|{{{zywutyyzyxusqvvuuvwxy|~€‚‚€~{€|z|}{y|~~~€€€€|}}~~~|{zz{{z|~€€€~~€€€‚‚€~€€€‚‚‚‚‚{z{~‚…†……………ƒƒ…†„„„„„ƒ‚‚‚€€€}}~~~~}|y}€}|~€~}||||}~~|{|‚ƒ‚€‚€€‚„†‡†„‚‚ƒƒ…„‚€€‚ƒƒƒƒƒ‚€~}xvw€€€€€€€€€€€€€€€€€||}{|}z}|{zz{|}}}}}|{zy{{|}}||{}~€‚ƒƒ‚|yz|~}{~€‚ƒ‚ƒ€€€€€€€€…‡…„…†…‚†ˆ†………„„„ƒƒƒ††††††††„……††……„„…‡‰ŠŠˆˆŽ‹ˆ‡ˆ‰‰ˆ‰ˆ‡‡‡ˆ‰Šˆ‡„{{ƒƒƒƒ„†ŠŽ‘ŠŠŒŽ‘”—™“’“”–•’ˆ{{}}€„„‚ƒ…†…„ƒƒ€€‚€€€€‚ƒƒƒƒƒ„„„„„…†‡ˆ‰‰‡‡††……„„ƒƒ„„„„„„„ƒƒ‚‚ƒ…………„„„…††……………………‡†…ƒ‚‚‚‚‚€€€€€€‚‚ƒƒƒ…………„„„„……………………„„„„…†‡‡†ˆ‰ˆ…‚‚‚‚ƒƒ‚‚‚‚ƒ‚‚‚‚‚ƒƒ‡†………††‡€€€€€€€€€€€€€€€€…‡ˆ‡……ˆ‹ŒŒ‹‹ŠŠ‹‹Œ‹‰ŠŒŒ‰ŒŒ‰ˆ†€ywtoljjkkn}‡‰ŠŠ‰‰‰ˆ‡…„„„ƒ†‡‡†„ƒ„†„€|z|}|zyyz{}~~~€€€€€€€€‚€~~~~~~}}}{|}~}~~}{yz|}}}}}‚~|{{|}|xvyyywtrrsuuvtsrtvw{~~}yz~zxyyxw}€€€~€€€€€€€~~€€~~~}}|||{{~~~€‚‚‚€€‚‚ƒƒƒ‚€€€€€€€‚‚ƒƒ}||~‚†‡‡……„„„„……„ƒƒ„ƒ€€‚€‚‚€~~~}}}}~~}}}~€|||||||||{{}€‚‚ƒ‚€‚„…‡†…„ƒƒƒƒ„ƒƒƒƒƒƒ‚„ƒ„„ƒ€|yz{|}}||{€€€€€€€€€€€€€€€€~{|}}~||{{zz{{|{~~zy{|{}||||{{{}~ƒ„……~||}}}||ƒƒ‚‚‚‚€~€~€ƒ…††…„‚‡Š‡€}„„„„…………………………………„„„……………‡‡‡ˆˆˆ‰‰Š‰ˆ‡††‡‡‰‰‰‰‰ˆˆˆˆ†…„~y}††…„„‡Œ‘•‹Œ“–—”•”’“•”†‚~~~}€„†‚…‡†…†„‚€€€€€€ƒ„ƒ‚‚ƒ„„„„……††††……„„ƒƒ„„„„ƒƒƒƒƒƒƒƒ„„„„„„…………„„„„„„„ƒ‚…††„‚€€‚‚‚‚‚€€‚‚‚‚€‚ƒƒ‚ƒ„……„„„„ƒƒƒƒƒ„……†††…†…†…†…†ˆ‰ˆ…‚‚‚‚‚€€‚ƒƒ‚‚‚‚‚‚‚„†‡…††„‚‚„†€€€€€€€€€€€€€€€€…‡‰ˆ†…ˆ‹ŒŒ‹‹Š‹‹‹‹ŠŠŠ‹‹‹‹‰‹Œ‰ˆ†€yxvrnjgggn|†ˆŠŠ‰‰ˆˆ†…„ƒƒƒ‡‡ˆ‡‡††‡€}zy{}}{yzz|}~€~€€€€€€€€€€€~~~~}}|{{}€}}}|{z{}}~}}~|{z{|{xuyzzxusssvwwvttvxy|~}}~{z~~zwyyxx}€€€€~€€€€€€~€€~~~}}|||||~~€€‚‚€‚‚ƒƒ‚‚€€€€€€‚ƒƒ~}}‚…††……„„„„………„„…„€‚€‚‚€~~~~~}}}}~~~~~~|||||||||{{}€‚‚ƒ‚€€‚„…‡†…„ƒƒƒƒ„ƒƒƒƒƒƒ‚‚ƒƒ„ƒ~|z{|}}}|{€€€€€€€€€€€€€€€€}z{}|~||{{zz{{|z|}}|}{z}||||{{{|}€‚ƒ…„„~||}}}|}‚‚‚‚ƒ€€€}}}~‚ƒ…†††„„ƒ‡‰†€}€„„„„…………………………………†††††‡‡‡‡‡‡‡‡ˆˆˆ‰‰ˆ‡†‡‡‡‰‰‰‰ˆˆˆˆ‰ˆ‡…y|ƒ†…„„†‹’ŽŒŠ‹“•–“”“’“–”†‚~~}}€„†‚…‡…„†„‚€€€€€€€ƒ„‚‚‚„„„„„……††††……„„ƒƒ„„„„ƒƒƒƒƒƒƒƒƒ„„„„„„………„„„„……„ƒ‚‚…††…€€‚‚‚ƒ‚€€‚‚‚‚€‚ƒƒ‚‚ƒ„……„„„„ƒƒƒƒƒ„……††…†…†…†…††ˆ‰ˆ…‚‚‚‚‚€€‚ƒƒ‚‚‚‚‚‚‚„†‡…††„‚‚ƒ†€€€€€€€€€€€€€€€€‡‰Š‰††‰ŒŒŒ‹Š‹Š‹‹‰Š‹‹ŠŠ‰Š‰‹‹‰ˆ…zyyuogccdn|†ˆ‰Š‰‰ˆ‡†„ƒ‚‚‚……†‡ˆˆ‡…}{yy{}}|zz{|}~€€€€€€€~€~~~|zy|€‚€}|||{{|~€}~~}~€~|{zz|zxv{{{yvttuvwxvuuwy{}}||~~|z~zxyyxx}€€€~~€€€€€€~~€€~~~~}}||||~~€€‚€‚‚ƒ‚‚€€€€€€€€‚‚ƒƒ~‚„…………„„„„……†„„†…‚‚‚‚‚€~}}}}}~~~~~€€~}||||||||||{{}‚‚ƒ‚€‚„…‡†…„ƒƒƒƒ„ƒƒƒƒƒƒ‚€‚ƒ„ƒ€~}yz{|}}}|€€€€€€€€€€€€€€€€}y{||}~{|{{{{{{||z{|~|{{}||||{{{z}ƒ……„ƒ~||}}}|~ƒ„€€€}}~††‡‡‡†…„ƒ†ˆ†~€„„„…„………………†…†………†††‡‡‡‡ˆ††††‡‡‡‡‰ˆˆ‡‡‡‡ˆ‰ˆ‰ˆˆ‡ˆ‡‰‡ˆ‡‚|}‚†…„ƒ…ˆŒŒŠ‰ŠŽ’””’““’”–•…~}}}€„†„‡…„…„‚€€€€€„„ƒ‚ƒƒ„„„„……†††………„„„ƒ„„„„ƒƒƒƒƒƒƒƒ„„„„„„………„„ƒ„…………„ƒƒ…††„‚€€‚‚‚‚‚€‚‚‚‚€‚ƒƒ‚ƒ„………„„„„„ƒƒ„„……†††…†…†…†…†ˆ‰ˆ…‚‚‚‚‚€€‚ƒƒ‚‚‚‚‚‚‚„†‡…††„‚ƒ…€€€€€€€€€€€€€€€€ˆŠ‹Š‡‡‰ŒŒŒ‹‹Š‹‹‹‰‹Œ‹Š‰‰Š‰ŠŠŠˆ„zzzumd`bfqˆ‰ŠŠ‰‰‡†…„‚‚‚‚‚„‡‡„‚|{zz{{{{{||}}~€€€€€€~}~€€€€}|{}€}|}}|||~~~}~€€~}{|||zx{||zwuuvuvwvtuwy{~~}}~|z~~zwyyxx~€€€ƒ‚‚€€€€€€€~€€}~~}}||}~€€€€€‚‚‚€€‚‚‚€€€€€€‚ƒƒƒ€‚„„ƒ……„„„„……†„„……‚‚‚€‚‚€~|||}}~~~}}}~}}|{|||||||||{{}€ƒ‚ƒ‚€€‚„…‡†…„ƒƒƒƒ„ƒƒƒƒƒƒ‚‚ƒƒ|zyxyz}}~~~€€€€€€€€€€€€€€€€|yz|{}~{|{{{{{{|{xz{{{~}||||{{{y|…††ƒ‚~||}}}|€€€€ƒ„ƒƒƒ€€†††‡‡‡††ƒ…‡…€„„„„……………††…†…†…†……††††‡‡††††††††ˆˆ‡‡†‡‡ˆˆˆˆˆ‡‡‡‡…†‡ˆ…€‚†…ƒƒ„†‰‹‹‰ˆ‹Ž‘““‘“““”—”…}}}}ƒ…€„†…„…„‚€€€€€€€ƒ„‚‚‚„„„„„……††…………„„„„„„„„ƒƒƒƒƒƒƒ„ƒ„„„ƒ„„…„„ƒƒ„……††…„„…††…€€‚‚ƒ‚‚€€‚‚‚‚€‚ƒƒ‚ƒ„…………„„„„„„„……†…†…†…†…†…††ˆ‰ˆ…‚‚‚‚‚€€‚ƒƒ‚‚‚‚‚‚‚„†‡„……„‚…€€€€€€€€€€€€€€€€‰ŠŒŠ‡‡‰ŒŒŒ‹Š‹Š‹‹ŠŠŠ‰‰‰‰ŠŠ‰‰Šˆƒ~z{ytjb`eju‚ŠŠŠŠ‰‰‡†…ƒ‚€ƒ……ƒ~~|{zz}}}}~~€€€€€~~~€€€}~~€€€€~€~|{|~~~~||}~~}}€}|~}|{|}}zxuuvstutssvxz}€}yz~zxxyxy~‚€€€€‚‚ƒ€€€‚€~€€}~~}}}~~€€€‚‚‚€€‚‚‚€€€€€€€€‚‚ƒƒ„‚€€ƒ„„ƒ……„„„„………„„…„€‚ƒ‚€}|||}}}~~{{{z{{|}|||||||||{{}‚‚ƒ‚€‚„…‡†…„ƒƒƒƒ„ƒƒƒƒƒƒ‚€‚„|vtsvwz|~~€€€€€€€€€€€€€€€€|yz|{|~{{||||||{{{|}zz}}||||{{{y|„‡…ƒ‚~||}}}|€€€€ƒ„„„„ƒ‚ƒƒƒ„„††ˆˆƒ„…„‚‚ƒ„„…„…………††††††††……††††‡‡†††††…†…ˆ‡‡†‡‡ˆˆˆ‡ˆ‡‡†‡†……‡ˆˆ„‚…„ƒƒ„†ˆ‰Šˆ‰ŠŽ‘’’’”•”•–“Ž…€~}}|ƒ…€€ƒ†„ƒ„„‚€€€€€„„ƒ‚ƒƒ„„„„……††………„…„„„„„„„ƒƒƒƒƒƒƒƒ„„„„ƒƒ„„„„ƒƒ„„…††……„…††„‚€€‚‚ƒ‚‚€‚‚‚‚€‚ƒƒ‚ƒ„†…………„„„………………†††…†…†…†…†ˆ‰ˆ…‚‚‚‚‚€€‚ƒƒ‚‚‚‚‚‚‚„†‡„……ƒ€‚„€€€€€€€€€€€€€€€€‰‹ŒŠ‡†‰‹ŒŒ‹‹Š‹‹‹Š‡„„…ˆŠŠŠˆˆŠˆƒ}z{xrjcbfku‚ŠŠŠŠ‰‰‡†…„‚‚€€ƒ„„ƒ‚€‚ƒ‚|||~~~~~~€€€€€~}~~€€€€~€€€€‚{y{~~€}|}~~€}|~€€‚€}}}~}||}|{wuuvrsttstvxz~€€€}xz~~zwyyxy~‚€‚€€€€€~€€€€‚€~|€€~~}}€€‚‚€€€€€€€€‚ƒƒƒ‚€ƒ……„……„„„„………„ƒ…„€‚€‚‚€~|||}}}}}{zyyy{|}|||||||||{{}€ƒ‚ƒ‚€€‚„…‡†…„ƒƒƒƒ„ƒƒƒƒƒƒ‚€ƒ…ztqquwy|~€€€€€€€€€€€€€€€€€€€}zz}{}~{{||||||{|‚…‚}zz}||||{{{z}€„……„ƒ~||}}}|~ƒ„ƒ„ƒ‚€‚‚…†ˆƒ„„ƒƒƒƒƒ„„„……………†††††††††††‡‡‡‡ˆ††††††……ˆ‡‡‡‡ˆˆ‰‡‡‡‡††††‡‡‡ˆ‡…ƒƒƒƒ„†ˆ‰‰‰‰Œ’’‘“•–••–‘‹„€}}||ƒ„€ƒ…„ƒ„„‚€€€€€€€€€€€€€€€ƒ„‚‚‚„„„„„……††……„…„…„„„„„„ƒƒƒƒƒƒƒ„ƒ„„„ƒƒƒ„„„ƒƒƒƒ„…………„…††…€€‚‚‚ƒ‚‚€€‚‚‚‚€‚ƒƒ‚ƒ„††…………„„………†…†…†…†…†…†…††ˆ‰ˆ…‚‚‚‚‚€€‚ƒƒ‚‚‚‚‚‚‚„†‡„„„ƒ€€‚„€€€€€€€€€€€€€€€€‰‹‹Š‡†ˆ‹ŒŒ‹Š‹Š‹‹‰ƒ}|†‰ˆŠˆˆŠˆ‚|z{xsmhfffs€ˆˆ‰ŠŠŠ‡†…„ƒ‚‚‚‚ƒƒƒƒ„„ƒ††ƒ€€~~€€€~~}}~~€€€€€€€€€€€€~{z|~~€~~~~€€}{}€€~{z{|{z{||zwttustuttuwz|€}zz~zxyyxy‚‚‚€€€€€€ƒ€~|€€€~~~€€‚‚€€€€€€€€€€‚‚ƒƒƒ€„…††……„„„„……†„„……‚‚‚€‚‚€~}}}||||||||{|||||||||||||{{}€‚‚ƒ‚€‚„…‡†…„ƒƒƒƒ„ƒƒƒƒƒƒ‚€„‡ƒ{usttvy{~€€€€€€€€€€€€€€€€€}z{}|~|{||}}||{~…Œ‹†€|z}||||{{{|}€‚„„…„~||}}}|}‚‚‚‚ƒ‚ƒƒ€€€~ƒ„ƒƒƒƒ„„„ƒ„„„„…………†††††††††††††‡‡‡‡‡‡††††…‡‡‡†‡ˆ‰‰‡‡‡††††…‡††‡‡†‚~‚‚ƒ„…‡‰‰‰‰ŠŒ’’‘•—˜––”ˆ„€}|||‚„€ƒ…ƒ‚„„‚€€€€€€€€€€€€€€„„ƒ‚ƒƒ„„„„……††„„…„…„……„„„„ƒƒƒƒƒƒƒƒ„„„„ƒƒ„„„ƒƒ‚‚‚ƒ„……„„…††„‚€€‚‚‚‚‚€€‚‚‚‚€‚ƒƒ‚ƒ„†††……………†††…†…†…†…†…†…†…†ˆ‰ˆ…‚‚‚‚‚€€‚ƒƒ‚‚‚‚‚‚‚„†‡ƒ„„‚€ƒ€€€€€€€€€€€€€€€€‰Š‹‰†…‡ŠŒŒ‹‹Š‹‹‹ˆ€xw~…‡‡Š‡‡Š‰‚|zzxtqmhdbp}†‡ˆ‰Š‹ˆ‡…„ƒ‚‚‚‚ƒƒƒƒ…€ƒ‡ˆ…ƒ„…~~€€€€~~}}}~€€€€‚€~€€~~€~|||}~|~€€€}{}€}yxyzzy{|{yvttutuvvuvy{~€€~}~|z~zwyyxz‚‚‚€€€€€€€ƒ}|€€€~~~‚‚~€€‚‚‚€€€€€€€€‚‚ƒƒ‚€„†‡‡……„„„„……‡……††ƒ‚ƒ‚€‚‚€~}}}}||{{}}~~~}{{|||||||||{{}€‚‚ƒ‚€‚„…‡†…„ƒƒƒƒ„ƒƒƒƒƒƒ‚€…ˆ…}wvxtux|~€‚€€€€€€€€€€€€€€€€~{|~}~|{||}}||{‹‘ކ‚€~}||||{{{}~‚„……~||}}}||ƒƒ‚‚‚ƒƒƒ€€€~}|}€„ƒ‚ƒ„…„ƒ„„„……………††††††††„„„……………‡‡‡‡††††‡‡††‡ˆ‰Š‡††††…………„„…‡ˆ„€‚ƒ„†ˆ‰Š‰‰Š‘“’‘–˜˜—•”†„€}|||~‚„€ƒ…ƒ‚„„‚€€€€€€€€€€€€€€ƒ„ƒ‚‚ƒ„„„„……††„„„„„………„„„„ƒƒƒƒƒƒƒƒ„„„„‚ƒƒ„„ƒƒ‚‚ƒ„„„„„…††„‚€€‚‚‚ƒ‚€€‚‚‚‚€‚ƒƒ‚ƒ„††††…………††††††………†…†…†…††ˆ‰ˆ…‚‚‚‚‚€€‚ƒƒ‚‚‚‚‚‚‚„†‡ƒ„„‚€ƒ€€€€€€€€€€€€€€€€‰ˆ‡…ƒ„‡Š‰ˆ†…‡ŠŠ‰Š‚xsv~†‹‰†„…ˆ…{syvtsmedfr}†‡‡†‡ŠŠ‡„ƒ„†…„ƒ‚‚ƒ„…„……†ˆ‰‡†‡‡„€~~€€€€€€€~}|~~~~~‚€€€€~€€€~€€€€~||€€€€~~~}}}~~}{yxxw{{zywvutwvutuwz|z}~~~{z€|zzzx{~‚€€€€€€€~~~€~~~}€€€€€€€€€€€‚ƒ„ƒ‚€~€}~‚‚‚ƒƒ‚‚‚ƒ„…‡ˆ‡†……„„……„………„„ƒ‚‚‚ƒ…ƒ}}}}}}}}~~}|{{{{{|||}}~~zzz|€‚‚‚‚‚‚‚ƒ„…†…‚ƒƒ‚‚‚ƒƒƒ„‚}yvuuwxz~}}€€€€€€€€€€€€€€€€||||{}€|{|ƒ‡‹Š†„‚z}|yy{€‚„…„‚€€~~}||}~€‚€ƒƒ‚‚‚~}}}~}€ƒƒ‚‚„„„„…………………††‡‡††„…††……†‡††††††††……………†‡ˆ†††……†††ˆ‡‡‡ˆˆ‡…}~„ŠŒŒŠŽŽ“•“–•˜š–‘‹…ƒ~{}~ƒ€„†…„‚€€€€€‚‚‚‚‚ƒƒ„„ƒƒ„„„………ƒƒƒƒƒƒƒƒ„„„„„„„„ƒƒƒƒƒ„……„„„„„„„„„„„„…………ƒƒƒƒƒ€€€‚‚‚‚€ƒƒ‚‚‚‚€ƒ………………………‡††……„……………†††‡‡†ˆ‰ˆ…‚‚‚ƒƒ‚‚‚€€‚‚‚ƒ„……ƒƒ‚€„€€€€€€€€€€€€€€€€ƒ„ƒ‚‚ƒ‡Š‰…‚‚„†ˆ‰ˆtoqzƒˆ‹Šˆ†ƒ€|zzwtqkeeis~†ˆ‡†‡ŠŒ‰…„„……„„ƒ‚‚ƒ„„ƒ„ƒ„‡‡†††‡ƒ~~€€€€€€€~}}~~~~~€€€€€€€~€€€€~}|€€€€~~}~~ƒƒ‚}{zzzyxwvvuvuttuxz|z}~}}~|yz€|zzzx{~‚€€€€€€€€€€~~~}€€€€€€€€€€€€‚ƒƒ€€~~€‚‚‚„„ƒƒƒ„……‡†…„„„„…„………„ƒ‚‚€€„‚~}}}}}}}}|}}~}|zy{{{||}}}zzz|€‚‚‚‚‚‚ƒ„…†…‚ƒƒ‚„ƒ‚‚‚‚‚ƒ„‚}yvuuwxz~}}€€€€€€€€€€€€€€€€~~~€‚‚}~‚…„‚€‡‰‘‘Œ„~{|}€ƒƒ}}|}€‚„‚€€~}}||}~€‚‚‚‚€€€€~~~~€}€ƒƒ‚ƒ„„„„…………………†‡‡‡††…†††………†††††††††…………†‡ˆˆ†††……†††‡‡†‡‡‡†…€~|~ƒ‰ŒŒŒŽ‘““”“–˜–“„ƒ~|}~€ƒ€„†…„‚‚€€€€€€‚‚‚‚ƒƒƒ„„ƒƒ„„„………ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„…„„„„„„„„„„„„…………ƒƒƒ„ƒ‚€€€‚‚‚‚€ƒƒ‚‚‚‚€ƒ………………………‡‡†…………†………†††‡‡†ˆ‰ˆ…‚‚‚ƒƒ‚‚‚‚€‚‚ƒ„……ƒ‚‚€„€€€€€€€€€€€€€€€€„„…„ƒ…ˆ‹Š}‚„Ї}rknw€†‹ŒŠƒ|x|€{wsojeglt†ˆˆ‡‡Š‹‰…ƒ‚‚‚ƒ‚€‚‚‚ƒ†‡……†…‚~€€€€€€~~~~~~~€€‚€€€~€€€€~}|€€€~~~…†‡‡„€|zxxxxwwwwttttvx{|{~}}}{xz€|zzzx{~‚€€€€~€€€€€€€~~~~}€€€€€€€€€€€€‚‚‚€€‚€€€€€„„ƒƒƒƒ„…†…„ƒƒƒ„„………„„ƒ‚€€€‚€|}}}}}}}}||~~~|zy{{{{||||zzz|€‚‚‚‚‚‚‚‚ƒ„…†…‚ƒƒ‚„„ƒ‚‚‚ƒƒƒ„‚~xvuuwxz}}€€€€€€€€€€€€€€€€~}~€€}{‡‰…ƒ…„‰‹‘—˜‘„y|{|ƒ‹Œ†||}ƒ„ƒ‚€~~}}|}~ƒ…„„ƒƒ‚‚€€€€~~~~€~€‚ƒƒ‚ƒ„„„…„………………††‡†††††‡†…„……††††††††††††‡‡ˆ‰†††……†††‡†††‡‡†„~|{}‚‡‹ŽŒŒŽ“——™˜–—’‡ƒ|}~€ƒ‚€€„……ƒ‚€€€€‚‚‚‚‚ƒƒ„„ƒƒ„„„………ƒƒ„ƒ„ƒ„ƒ„„„„„„„„„ƒƒƒƒƒ„…„„„„„„„„„„„„…………ƒ„„ƒƒ‚€€‚‚‚‚€ƒ‚‚‚‚ƒƒ………………………‡‡††††††………†††‡‡†ˆ‰ˆ…‚‚‚ƒƒ‚‚‚ƒ‚‚‚‚‚ƒ„…„ƒ‚‚…€€€€€€€€€€€€€€€€†‡‡†……ˆŠ‹y~~‚‹‰tmox†Œ‹†~uu{‚|wrnifiow€‡ˆˆˆˆŠ‰‡ƒ€~}}}~}}~€€€ƒ†††…†„~€€€€€€~}~~~~€€€€€€€~~€€€€~}}€~€€ƒ…‡ˆ†€{wwwwwwwwwtttuvy{|}€~~~|xz€|zzzx{~‚€€€€€€€€€€~~}}~~~~~~~~€€€€€€€€€€€€€€€€€€‚ƒ…†‡……„ƒƒƒƒ„…………ƒƒ€ƒ|}}}}}}}}}}||{|{{{{{{{{{{zzz|€‚‚‚‚‚ƒƒ„…†…‚ƒƒ‚‚‚‚ƒ‚ƒƒ„ƒ„‚}yvuvxx{}~€€€€€€€€€€€€€€€€€~~~|€‰Œ…‚†…~…Œ”š˜Ž€w||‡ŽŽ‡€ƒ…‡†„~}}}}}„†‡††††……ƒƒ‚‚‚~}}}~€‚ƒƒƒ„„„„„…………………†‡‡‡††…†††………†††††††††††††‡ˆˆ‰†††……†††††…†††…„}zy|„‰Ž’Ž‹ŒŒ‹’™š›–“–•‹ƒ|}~~€‚‚€„…„ƒ‚‚€€€€€€‚‚‚‚ƒƒ„ƒ„ƒƒ„„„………„„„„„„„„……………………„„ƒƒƒ„„„„„„„„„„„„„„„…………„„„„ƒ‚€€‚‚‚‚€‚‚‚‚‚‚€ƒ………………………‡‡††††‡‡………†††‡‡†ˆ‰ˆ…‚‚‚ƒƒ‚‚ƒƒƒ‚‚‚ƒ„…„‚‚€€…€€€€€€€€€€€€€€€€…†‡‡…†ˆŠ‰}x{~|€‰‹‚xrt{ƒ‡Ž‰‚zvw|€{vrojgjqx‡ˆ‰ˆˆŠˆ†ƒ€|{z{|{{|~€‚‚„†‡†…†‚€~~€€€~€€€€~~~~~~}~~~€€€~€~~}~€~€€€‚…ˆ‰†{wvvvwwwwxttuvxy{|~€}yz€|zzzx{~‚€€€€€€€€€~~~}~~~~~~~~€€€€€€€€€€€€€~€€€ƒ„†‡……„ƒƒƒƒ„………„„‚€‚ƒƒ‚„‚}}}}}}}}}}||||{||{{{{{{{{zzz|€‚‚‚‚‚‚‚‚ƒ„…†…‚ƒƒ‚‚‚‚‚‚‚ƒ„‚~xvuvxyz~~€€€€€€€€€€€€€€€€‚€~€€~ƒŒŽˆ…ˆ‡€Š–™’†}y{…‰‹‰…€ƒ†‡†ƒ~~}}}}‚…‡ˆˆˆˆˆˆ††…„„‚~}}}~€€ƒ„…„ƒ„„…„………………††‡†††„…††……†‡††††††††††††‡‡‰‰†††……††††………††…„~yxz}†’ŽŒ‹Œ”–˜“–™“„|}~~‚ƒ€„…„‚‚€€€€‚‚‚‚‚ƒƒ„„ƒƒ„„„………„„„„„„„„„„„„„„„„„„„ƒƒƒ„„„„„„„„„„„„„„…………„„…„„‚€‚‚‚‚€‚‚‚‚ƒƒ………………………‡‡††††‡‡………†††‡‡†ˆ‰ˆ…‚‚‚ƒƒ‚‚‚ƒ‚‚‚‚‚‚‚‚ƒ„…ƒ‚…€€€€€€€€€€€€€€€€‡ˆŠŠ‰‰ŠŒƒ{vy{{}ƒˆzvx|€‚‹…~yy{}~yurplikqz‚‡ˆ‰ˆˆŠ‰‡…}{{|||{}€‚ƒƒƒƒ„‡‡†…†€~€~€€€€~~~~~}}|}~~€€€~~€~}~~~€€€~ƒ†‰Š‰„{vvvvwwwwvwwxyz{{}€}zz€|zzzx{~‚€€‚€€€€€€€€~~}}~~~~~~~~~~~~~~€€€€€€€‚€€€€€ƒƒ‚‚‚ƒƒ„†…„ƒƒƒ„„……„„ƒ‚€€ƒ„„‚ƒ„‚}}}}}}}}}z|}~}}{z||||{{{{zzz|€‚‚‚‚‚ƒƒ„…†…‚ƒƒ‚‚‚‚‚‚‚€ƒ„‚}yvuvxy{€~~€€€€€€€€€€€€€€€€~|{{}~ˆ‘‰‹‰„~‰””Š€~|‚‰‹ˆ„ƒ„‚€‚ƒ„~~~~}}~€ƒ†‡ˆˆˆˆˆ‡‡…„ƒƒ€€~~~~€ƒ…†…ƒ„„„…………………†‡‡‡††„……†……†‡†††††††††††††‡ˆ‰†††……†††††…†††…„zwzz{‚ŒŽŽŽŽ‘”•– ›„€|}~~„‚‚ƒ„ƒ‚‚€€€€€€‚‚‚‚ƒƒƒ„„ƒƒ„„„……………„…„…„…‚‚‚‚‚‚‚‚…„ƒƒƒƒƒ„„„„„„„„„„„„„…………„………„ƒ‚€‚‚‚‚€‚‚‚ƒ‚‚‚€ƒ………………………††††††‡‡………†††‡‡†ˆ‰ˆ…‚‚‚ƒƒ‚‚‚ƒ‚‚‚‚ƒ„…‚€€€…€€€€€€€€€€€€€€€€‰‹‹‰†ƒƒƒ{wttwxz{{vuvxyy€|ywxyyxvtsrojlp{‚‡ˆˆˆˆ‰‡‡…€|z{|}||~€‚„„„„…†‡…„…~~~€€}~€~~~~~~~~~€€€~~}~~~~€€€~}~~„†‰Š‰†‚€wwvvvvvvxyyzzz{zz}~~~}zz€|zzzx{~‚€€€€€€€€€€€~~~}}}}}}}}}~~~~~~~~~~€€‚‚‚~~€€€€ƒ‚‚‚‚ƒ„‡†…„„„„…………„ƒ€ƒ„ƒƒ€|}}}}}}}}z{}}~}{z}}}||{{{zzz|€‚‚‚‚‚‚‚‚ƒ„…†…‚ƒƒ‚‚‚ƒƒƒ‚ƒ„‚}xvuvxy{€€~~€€€€€€€€€€€€€€€€}{z{}€‹‘Œ‰‡†ƒ‰†‚……‹‹‡„†ˆ…ƒ‚ƒ„‚€}~~~~~~}ƒ†ˆˆˆ‡ˆˆ‡†…„ƒ‚€€~~~~€‚ƒ†‡…ƒ„„„„………………††‡‡††……††……†††††††††††………†‡ˆˆ†††……†††††††‡†…„€zxyyw‰ŽŽŒ‹˜ž¢Ÿ—…€}}~~„‚‚ƒ„ƒ‚€€€€‚‚‚‚‚ƒƒ„„ƒƒ„„„……………………………ƒƒƒƒƒƒƒƒ…„„ƒƒƒƒƒ„„„„„„„„„„„„……………………„ƒ‚€‚‚‚‚€‚ƒƒ‚‚ƒ………………………†…………†‡‡………†††‡‡†ˆ‰ˆ…‚‚‚ƒƒ‚‚‚‚€‚‚‚ƒ„…‚€€€‚…€€€€€€€€€€€€€€€€ˆˆ‡‚|vsrutrqswwuxurrstsqttttttsrusstpllp{‚‡‡ˆˆ‡‰……ƒ{yz|}}|}‚‚„„„††„ƒƒ~}€}~~~~~~~~~}€€€€~~€~~~~~~€€~}}}ƒ…‡‰ˆ†ƒwwwvvvuuzz{{{{zzx{}||}|yz€|zzzx{~‚€€€€€€€~~~€~~~}}}}}}}}}~~~~~~~~~~~€€‚ƒƒ~}€~€€€€€€‚„…†‡†……„„…………„„ƒ€‚€z}}}}}}}}|||||||}~~}}|||{zzz|€‚‚‚‚‚‚‚ƒ„…†…‚ƒƒ‚‚ƒ„„„ƒƒƒ„‚}yvuvyy{€€~~€€€€€€€€€€€€€€€€ƒ€„‡‰‰ŠŒŽŽ‹†„…ˆŠŠˆ…„†ˆ‚†Š‹ˆ‡‰‹‰‡†……„~~~~~~~~}€„†‡‡‡†‰ˆ‡†…„ƒƒ‚~}}}~‚ƒ†‡…ƒ„„„…………………†‡‡‡††††‡†…„……††††††††……………†‡ˆ†††……†††‡†††‡‡…„{xywu}ˆŒ’‘Œ‰„‰•žŸ–‰…€}}~~„ƒ‚ƒ„‚‚‚€€€€€€‚‚‚‚ƒƒƒ„„ƒƒ„„„………………………………………………………„ƒƒƒƒƒ„„„„„„„„„„„„……………………„ƒ‚€‚‚‚‚€‚ƒƒ‚‚‚€ƒ……………………………„……††‡………†††‡‡†ˆ‰ˆ…‚‚‚ƒƒ‚‚‚‚€€€‚‚‚ƒ„…‚€€€‚…€€€€€€€€€€€€€€€€ˆ~rnqtsomortutsrqqrrqpontrpnmnpqopqrsuuv~‚…ˆŠ‹ŒŠˆƒ|zzz|}}~‚ƒ€ƒ†ˆ†ƒ€~~€€€€€€€€€€€~~}}}}~€€€~~}||}~~€€€€~~}…ˆˆˆˆ†‚}wsuwwwx€„…€|{yvy}~}|~|x|€€|y{{z|‚€€}‚‚~~}||~€~~~~~~~~~~~~€€€‚‚€€€€€€€€€€‚‚ƒƒ€€‚ƒƒ„…„…„…„…„ƒ„…„‚€‚ƒ‚€~}}}}}}}}{|}}}}|{}||||{{{|{z{‚ƒƒ‚‚‚‚ƒ„‡†…ƒ‚„ƒƒ‚‚ƒƒ„‚ƒƒ‚{wuvxy{€~€€€€€€€€€€€€€€€€……………………ˆ‡…„ƒƒ„„ƒƒ„„…††‡…„„…†‰‹Œ‰‰‰ˆ‡††…‚‚€~~~~}~‚…‡ˆˆˆ‡ˆˆˆ†„„„€}}}‚‚ƒ„………………………………††††††††‡‡‡‡‡†††„…………†††ƒ†‰ˆ†…†ˆ‡‡‡‡‡‡‡‡†…………†‡‡‚|xwxxy|ŠŽ‘‘‘Ž‹…|™œ–Œƒ}€‚€€€ƒ…„ƒ‚‚€€‚‚‚‚‚‚ƒƒƒ‚ƒ‚ƒ‚ƒ‚„„„„„„„„‚ƒ„……………ƒƒƒƒƒ„……„„ƒƒƒƒ„„……„„„ƒƒƒƒ„„„………†…………„„„„ƒ‚‚‚‚‚ƒ‚‚ƒ„†…†…†…†…††††††††……†††‡‡‡†ˆ‰‡„‚€€€€€‚ƒƒ‚‚‚€‚‚‚‚‚„„„‚€„€€€€€€€€€€€€€€€€‚ypnrwwuoprssrqptttttsrqrqnmlmnommnpqrstyz}€ƒ†ˆˆ‡†ƒ€~}}~}~~€‚ƒ„‚‚‚„††„‚~~€€€€€€€€€€€~~}}}}~~€€€€~~~~||~~€€~~~}…ˆˆˆˆ†‚}wstvvvw€…‡„|xty~~{{zxz~{xyzx{}€~€~‚‚~~}|}~€~~~~~~~~~~~~€€€€€‚‚€€€€€€€€€€€‚‚ƒ‚‚‚‚‚‚„…„…„…„…ƒ„…„‚€‚€‚‚‚€~||||||||{|}}}}|{}||||{{{|{z|‚ƒƒ‚‚‚ƒ„‡†…ƒ‚‚‚ƒƒ‚‚‚‚ƒƒ€€~zvtwyy{€~€€€€€€€€€€€€€€€€ƒƒƒƒƒƒƒƒ„ƒ‚€€€€‚ƒƒ„„„‚‚‚‚„†‡‡‡‡‡††††„ƒ‚€~~~€‚……†…„„…†…ƒ‚‚‚€~}}‚‚ƒ„………………………………††††††††‡‡‡‡††††……………………ƒ†ˆˆ†…†ˆ††††††‡‡†…………†‡‡‚}xxxxy|ˆ‘‘‘‘Œ„zz„‘ˆ„|~€€‚ƒ‚ƒ…‡†…ƒƒƒƒƒƒƒƒ„„ƒ‚‚ƒ„„ƒƒƒƒ‚‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ„„„„„„„„‚ƒ„…………„ƒ‚‚‚‚ƒ„„„„ƒƒƒƒ„„……„„„ƒƒƒƒ„„„………†………„„„ƒƒƒ‚‚‚‚‚ƒ‚‚ƒ„…†…†…†…†††††††††……†††‡‡‡†ˆ‰‡„‚€€€‚ƒƒ‚‚‚€‚‚‚‚‚‚ƒ„ƒ‚€„€€€€€€€€€€€€€€€€„}vtx{|zvwxxxwvuwvvuuttttsqpopqqlmnopqrsrsvy}€ƒ„…„}||}zz{{}€‚‚ƒ…‡†„‚€€€€€€€€€€€~~}}}}~~~~~~~~}|~€~~}…‡‡ˆˆ‡ƒxstuuuv†Š‡ƒztz‚{yyyz}~zwxywz}€€}~€‚ƒƒ‚€~~~~}~~€€~~~~~~~~~~~~~€€€€‚€€€€€€€€ƒƒƒ‚‚‚‚‚…„…„…„…„„……„ƒ‚ƒ‚€~||||||||{|}}}}|{}||||{{{|zz{‚ƒƒ‚‚‚‚‚ƒ„‡†…ƒ‚‚‚‚ƒƒ‚‚‚‚ƒƒ‚‚|xvxzz|~~€€€€€€€€€€€€€€€€‚€€€€‚‚‚‚ƒ‚‚‚ƒ„„„………†††††„ƒ€~~ƒ…‡††…‡‡ˆ‡†„ƒ„„|}~‚‚ƒ„………………………………††††††††‡‡‡†‡†††††††………„„…‡‡††‡ˆ†††††††††…………†‡‡ƒ}yxxwy{†Œ‘‘‘‘„zw|…‡…„€||}~ƒ…ƒƒ„‡ˆˆ‡……………………†……„„„…†…„„ƒƒ‚‚ƒ‚ƒ‚ƒ‚ƒ‚„„„„„„„„ƒƒ„…………„ƒƒ‚‚ƒƒƒ„„„ƒƒƒƒ„„……„„„ƒƒƒƒƒ„„……………„„„ƒƒƒƒƒ‚‚‚‚‚€‚ƒ„†…†…†…†…††††††††……†††‡‡‡†ˆ‰‡„‚€€€€€‚‚ƒ‚‚‚‚€‚‚‚‚€‚„„ƒ‚€€‚…€€€€€€€€€€€€€€€€‡‚zwxyxwttuuuuuusrqpooppssrqpppptsrqpnmmnoqtx|„‚€}zyxxwwxyz|}~„ˆ‰‡ƒ€€€€€€€€~}}}}}~~~~~~€}}€~~~€~}€„†‡‡‰ˆ…ztsttst†Šˆ…‚~z|€~|zzz{{xyzx|‚€€€ƒ„„‚€~~~~~€€~~~~~~~~~~~~~€€€€€€‚€€€€€€€€€€€€€‚‚‚‚‚‚ƒƒ„…„…„…„…„………ƒ‚€‚‚‚€~{{{{{{{{{|}}}}|{}||||{{{|{z|ƒƒƒ‚‚ƒƒ„††„ƒ‚‚‚‚ƒƒƒƒƒƒƒƒ„………ƒ|zy{{|}~€€€€€€€€€€€€€€€€‚ƒƒ„„ƒ‚‚‚‚‚‚‚‚‚ƒ‡†„ƒ‚ƒ„…‚‚ƒ„„…††ˆ‡‡…ƒ~„‡‰‹ŠŠ‰Š‹Šˆ†††…ƒ€~}€‚‚ƒ„………………………………††††††††‡‡†‡†††††††††………„…………†‡ˆ††††††……††………††‡„~yyxwx{‚‰‘‘’‘†|y{{~‚‚‚}|}~ƒ„ƒ‚„†ˆ‡†…………………………„„ƒ„……††…„‚‚€‚ƒ‚ƒ‚ƒ‚ƒ„„„„„„„„ƒ„„………„„„„„„„„„…„„ƒƒƒƒ„„……„„„ƒƒƒƒ„„…„……†„„„„ƒƒƒƒ‚‚‚‚‚‚‚ƒ„…†…†…†…†††††††††……†††‡‡‡†ˆ‰‡„‚‚‚€€€‚ƒ‚‚‚€‚‚‚‚‚‚ƒ„ƒ‚€€€‚…€€€€€€€€€€€€€€€€ƒzwwwwvxxxxyz{{{zxvvvwxrrrqqpooqqpppooomnoquy}‚}zyxwzzz{}~€€ƒ…‡†ƒ€~}|}}}~~~€€€€€€€~}€€~~~}€ƒ†…‡‰‰†„|uttsrs€…ˆ†………ƒ}|}~~|z}‚}{{|{„„ƒ‚ƒ„‚ƒ„…„ƒ€~~€€€€~~~~~~~~~~~~~€€€€€€€‚€€~~~€€€‚‚ƒ„„…„…„…„…„„…†…ƒ‚‚ƒ‚€~{{{{{{{{{|}}}}|{}||||{{{|zz{‚„ƒ‚‚‚‚‚ƒ„†…„ƒƒ‚ƒƒ„„„„„„„„„………ƒ€}{z{{|}}€€€€€€€€€€€€€€€€ƒƒƒƒƒƒƒƒ‚„…†„ƒ‚………„„„„„‡†„ƒƒƒ„„‚‚‚ƒ„……†‡‡ˆ‡…ƒ€„‡Š‹‹‹ˆ‰Šˆ‡„„„„ƒ‚‚ƒ„………………………………††††††††‡†‡†††††……††††††…„ƒƒ…†ˆ‰†††††………†…………†‡‡…{yxwxz~‡‘‘’’‘‡~z{zz}}~~~~€‚€…†…„‚‚‚‚‚‚‚‚ƒƒ‚‚‚ƒƒ†……ƒ‚€€ƒ‚ƒ‚ƒ‚ƒ‚„„„„„„„„„„………„„ƒ……„„„„„…„„ƒƒƒƒ„„……„„„ƒƒƒƒƒ„„………………„„„ƒƒƒ‚€‚‚‚€‚ƒ„†…†…†…†…††††††††……†††‡‡‡†ˆ‰‡„‚‚‚‚€€‚‚ƒ‚‚€‚‚‚‚€‚„„ƒ€€€‚…€€€€€€€€€€€€€€€€‚‚ƒ‚€€‚‚}zz{}zz{{{yxwrrqqppoonnnprwz}~~}|||{||}~€‚ƒ‚€€ƒƒƒ€€€€~}||}}~~~€€€€€€€€€~}~€~~}€ƒ……†ŠŠˆ‡~wttrrs„‡†…ˆ‰ˆ€|z||{~‚‚~{}}|€ƒ…†„„„…ƒ„…†…ƒ}~€€~~~~~~~~~~~~}€€€€‚€}}~~€€~~~~€‚ƒƒ„„…„…„…„…„…†…ƒ‚‚‚€‚‚‚€~||||||||{|}}}}|{}||||{{{|{z|‚ƒƒ‚‚ƒƒ„……„ƒ‚ƒƒƒƒ„„„„„„ƒ‚‚ƒ~{yy{{|}}€€€€€€€€€€€€€€€€ƒƒƒƒƒƒƒƒ~€‚……„‚€†††………„„ƒƒ‚ƒ„ƒƒƒ„„„………†‡ˆ‡„‚€€‚„†‡ˆ‡†ˆ‰‰ˆ…„ƒƒ‚‚‚‚‚‚‚ƒ„………………………………††††††††††††††……………††‡‡‡…ƒ‚„‡ˆ‰‡‡‡†††……††………††‡‡{zxwwz{…Ž’’“““†}yzxxyx{~~~€€€~€‚„ƒ‚€€€€€€€€‚€€€‚„ƒƒ‚€€‚ƒ‚ƒ‚ƒ‚ƒ„„„„„„„„„…………„ƒƒ„„„ƒƒƒƒ„„„ƒƒƒƒ„„……„„„ƒƒƒƒ„„„„……††………„„„„‚€‚‚‚ƒ„…†…†…†…†††††††††……†††‡‡‡†ˆ‰‡„‚‚‚‚‚‚‚‚ƒ‚‚€‚€‚‚‚‚‚‚ƒ„‚€€€‚…€€€€€€€€€€€€€€€€………„„…‡ˆƒ~zxxxxywsqprtv€ƒ„ƒ~€|xtpmlonmmpswy~~~~~}}|z{{|}€„~|~ƒ„€€€~~€~}||||~~~~€€€€€€€€€~~~~€€€~~}‚„„†ŠŠ‰‰xutrrs~„ˆˆˆ‰‰†‚}{}}{|}‚}{||{€‚……„ƒ„…„…††…ƒ}~€‚€~~~~~~~~~~~~}‚‚€€|}}~€€~~}}|€€‚…„…„…„…„……†…„‚‚‚‚ƒ‚€~||||||||{|}}}}|{}||||{{{|zz{‚ƒƒ‚‚‚‚‚ƒ„…„„ƒƒƒƒ„‚ƒƒ„„ƒƒ‚€‚‚€~{yxzz|}~€€€€€€€€€€€€€€€€~„‡ˆ†„‚………„ƒƒ‚‚ƒ‚‚ƒ„†‡…………„„„„‚„†‡‡†ƒ‚€„†‡‡††‰ŠŠ‰‡„„ƒƒ„…ƒ‚€‚ƒ„………………………………†††††††††††††………††††††††…‚€€„‡‰‰ˆ‡‡‡††……†…………†‡‡ˆ|zywwyxƒŽ’’“”•‰}xxwwxv{|{~‚€~€ƒ„„‚€€€€€€€€‚€€€‚€€ƒ‚ƒ‚ƒ‚ƒ‚„„„„„„„„„…………„ƒ‚…„„ƒƒƒƒ„„„ƒƒƒƒ„„……„„„ƒƒƒƒ„„„…………††††…………‚€€‚‚€‚ƒ„†…†…†…†…††††††††……†††‡‡‡†ˆ‰‡„‚ƒ‚‚‚‚‚‚ƒƒ‚€‚€‚‚‚‚€‚„„‚€€€€ƒ†€€€€€€€€€€€€€€€€‚ƒ‚€}||}†ƒ~yusrr{xurqsvx}~€€~|z€€}|zyyonllmptv~~|{yx{{{|~‚‚€}}~€‚‚€€€~~€€~}||||}~~€€€€€€€€€~~}~~€€€€~~}‚„„†Š‹‰‹‚yvtrrs}„ŠŠŠ‰‡ƒ‚}~zz||€€|yz{y~ƒ„ƒ‚‚ƒ„…†‡†„}~€‚‚€~~~~~~~~~~~~}€€‚‚€||}~€€~~}}||€€€€€€€„…„…„…„……††…„‚‚‚‚‚‚€~}}}}}}}}{|}}}}|{}||||{{{|{z|‚ƒƒ‚‚‚‚ƒ„…„ƒƒƒƒƒ„‚‚ƒƒ‚‚‚ƒ„‚€}{xyz{}~€€€€€€€€€€€€€€€€~~~~~~~~‚„ˆ‹ŒŠ‡…„ƒƒ‚€€…„„…†‰‹Œ‡‡†……„ƒƒ€‚…‡ˆ†„‚~€ƒ†‰ŠŠŠ‰‰Šˆ†„ƒƒ}€ƒ†‡…‚€‚ƒ„………………………………†††††††††††††………‡‡‡††††…†‚€„‡‰‰ˆˆ‡‡†††…†…………†‡‡ˆ‚|zxwwyw‚’’“••€xxwyzx}zy~‚„€ƒ…„ƒƒ‚‚ƒ€€€‚ƒ‚ƒ‚ƒ‚ƒ„„„„„„„„……………„ƒ‚††…„„„„…„„ƒƒƒƒ„„……„„„ƒƒƒƒ„„„………†‡‡‡†††……€€€‚‚ƒ„…†…†…†…†††††††††……†††‡‡‡†ˆ‰‡„‚ƒƒ‚‚‚‚‚ƒƒ‚€€‚€‚‚‚‚‚ƒ„‚€€€€‚†€€€€€€€€€€€€€€€€„ƒ€„†„{uqrvyuxyvrrx~~€ƒƒ}tqstvy}€€~|yrnoqppq‚€~}|||{|}€‚ƒƒƒ}~~~~||}~€€€€€€€~~}}|{{{|~€€€~}}~€€}€}{yyyz~€€€€€€}}€…‡†ˆ‹ˆ„|tqrsryˆŠ‰Š‰ˆƒ€~~€}yz~€|yzzw~„†…„„„††…„ƒ‚‚€€€€€€€€€~~~€€€‚‚‚}~~~€€€€€€€€€€€€€€}}}}~€~~~€€~{~}}}~~€€‚„……„„„„……„ƒ‚‚‚€‚‚€~}||{{||}{{{z{||}{{|||}}}}||~ƒƒ‚‚ƒƒ‚‚„†…„ƒ‚‚‚‚„„ƒƒƒƒ„„‚ƒ}yxxuwz}~~}€€€€€€€€€€€€€€€€~ƒƒ€~~‚…ŠŒ‹Š‰‰…€‡„€‰“•’‘Œ‡„ƒ…†„…„…Šˆ~€ƒ…†††…‰‡„ƒ‚‚‚‡ˆ‡…ƒƒƒ…††…„……„„„………††……†††‡‡‡†††††………‡‡†………†‡„‚€€ƒ‡‰‹Œ‹‰†ƒƒ„††††††††‰ˆ„}yyxvy~‰’““••xyyvvy|}}|{|‚~‚†ˆ‡†…ƒ€‚‚‚‚‚ƒƒƒ‚€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ„………ƒƒƒƒ„„……„„ƒƒƒƒ„„…„ƒƒ‚ƒƒƒ„„„„„„„„„„ƒƒƒ„„…‡ˆˆˆˆ‡†…‚‚‚‚€€ƒƒƒ„†…†…†…†…†††††††††††††††††‡‰‡„€‚‚‚‚€‚ƒƒƒƒ‚€‚‚‚‚‚‚‚‚ƒ‚‚ƒ„„‚‚‚…€€€€€€€€€€€€€€€€„‚€„†„{uqruxwyyuqry€ƒƒ}tqstux|€€{vsnknu„ƒ€~~}}{{|}~€‚ƒzy|~~}|}}~€€€€€€€€~~}}||{{|~€€€~~€}~~|zxxyxxz}€€€€€~}€…‡‡ˆ‹‰†~vrrsrx€ˆ‰‰Š‰ˆ€}{|~|xz€|yzzx~„†…„„„„„ƒ‚€€€€€€€€€€€~~~€€€}~~€€€€€€€€€€€€€}}}}~€€~€€~|}}}}}~‚ƒ……„„„………„ƒ‚‚‚€‚‚€~{{{{{|}~{{{{{|}}{{|||}}}}|{}ƒ‚‚ƒƒ‚‚„†…„ƒ‚‚‚‚„„ƒƒƒƒ„„ƒ„„|xvvvxz}~~}€€€€€€€€€€€€€€€€~ƒƒ€~~‚†ŠŒ‹‰‰‰…€‡„€€ˆ’•“’‰…‚ƒ„„…„…‰Œ‡}„………„‡†…„‚‚†‹‹‡…„„…††…„ƒ„„…………†††……†††‡‡‡††††…………‡‡†……††‡…„ƒ„†‰ŒŽŽŽ‹ˆ……†††††††††‡†‚|yzywx|†”•––Ž‚xxywvy|}}}|}€‚„†…„ƒ€€€‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ„………ƒƒƒ„„„……„„ƒƒƒƒ„„…„ƒƒ‚ƒƒƒ„„„„„„„„„ƒƒƒƒ„……ˆˆ‰‰ˆ‡††‚‚‚‚‚€€ƒƒƒ„…†…†…†…††††††††††††††††††‡‰‡„€‚‚‚‚€‚ƒƒƒ‚‚€‚‚‚‚‚‚‚‚ƒ‚‚ƒ„…†ƒ‚‚€‚†€€€€€€€€€€€€€€€€ƒ€~„†…zurrtuxyxtprz‚€„ƒ}tqsuuwz‚ƒƒ‚€}xpls~†…ƒ€{{{{}~€‚‚{tty~~}||}~€€€€€€€~~~}||{{|~€€€€€}~}{xwuutxwxz}€€~~}€„‡†ˆŠŠ‡xsssrx€‡‰‰Š‰ˆ|z{~}yz|zzzx}€„……ƒƒ„€~~~€€€€€€€€€~~~~~~€€€~~~~€€€€€€€€~}}}~€€€€€€}}||{|}~~ƒ„…„„„………„ƒƒ‚‚‚‚€~{z{{|}~|{{{{|}}|||||}}}|{z|€‚€‚ƒƒ‚ƒ„†…„ƒ‚‚‚‚„ƒƒƒƒƒƒ„…†…‚}xvuwx{}~~~}€€€€€€€€€€€€€€€€‚„ƒ~~‚†Š‹Š‰‰Š…€‚‡„ˆ’–“‘‘‹†‚€„……„ˆŠ†~|~€‚„„„ƒ‡‰Šˆ†„„……ВІ„…†‡†„‚‚‚……†…††††……†††‡‡‡†††††………‡††…††‡ˆ‡‡‰‹‘’Ї‡‡††††††††††ƒ~|||zyzƒŽ”•–•Žƒyxywvx|}~}}~ƒ€~‚ƒ‚€€~||}~}|~€ƒ‚‚‚€€€‚‚‚‚‚‚‚‚ƒƒƒ„„„……ƒƒƒƒ„„……„„ƒƒƒƒ„„…„„ƒƒ‚ƒƒ„„„„„„„„„ƒƒƒƒ„…†‰‰ŠŠŠ‰ˆ‡ƒƒ‚‚€ƒ‚‚ƒ„†…†…†…†…†††††††††††††††††‡‰‡„€‚‚‚‚€‚‚ƒƒƒ‚€‚‚‚ƒ……‡„‚€‚‡€€€€€€€€€€€€€€€€‚€~~~„†„€ytssssyyxtps|„‚ƒƒ{tqsxwwz}‚„…~~~}xv}‡‡†„‚€€||{||~€‚ypow}~||}}~~€€€€€€€€~}}||{}~€€€€€€€€}|zwutttuwwwz}€~~~}„†‡‡ˆŠˆƒztrrrw‡‰‰Š‰ˆ~{||{}z{zx}€„…„ƒƒ„€€€€~~€€€€€€€€€~~~~}}}~~~~€€€€€€~}}}}~€€€€~||{{{||}€„„„„…†……„„ƒ‚‚€‚‚€~||{{{|}~||{{{|}~||||||||{zz|€‚‚ƒ‚ƒ…†…„ƒ‚‚‚‚ƒƒƒƒƒƒƒƒ„……‚}ywwyz{}}~}}€€€€€€€€€€€€€€€€€ƒ…„~ƒ†‰ŠŠ‰Š‹…€‡ƒˆ“–”ˆƒ€…†…„…‡„~|~€ƒ„„„ƒ†‰‹Š‡……†‡Œ‘”‹…ƒ„…††„ƒ‚ƒ††††††††……†††‡‡‡††††…†……‡‡†††‡ˆ‰‰‹Ž’““’‘’‘ŽŠ‡‡‡†††††††††‡…€|zŒ“””’„zwxwwx{}~ƒ}}€~~{yyz{zy|}~‚ƒƒƒ€€€€‚‚‚‚‚‚‚‚ƒƒ„„„„„„ƒƒƒ„„…„…„„„„„„„„…„ƒƒ‚ƒƒƒ„„„„„„„„„ƒƒƒ„…†‡‰ŠŠ‹‹Š‰‰„„ƒ‚€‚ƒƒ‚„…†…†…†…††††††††††††††††††‡‰‡„€‚‚‚‚€‚‚ƒƒ‚‚‚‚‚ƒ„…†‰†ƒ‚€ƒˆ€€€€€€€€€€€€€€€€€~}~„‡ƒ~wttttswyyurt}„ƒzrpsyxxy}€ƒ„|{|€‚„ˆ‡†„‚€~~~~}~‚xoov}~|||}~€€€€€€€~~}|||}}~€€€€~{yxwuuuwxwvvy}€~~~}~ƒ‡††‡ˆˆ„{tqqrv~†ˆ‰ŠŠˆ‚~{z~~|{€}{{{y}€ƒ…„ƒƒƒ€€€€€€€€€€€€€€~~~||}}~~~~~€€€€~}}|}}€€}|{z{{||~€ƒ„„„…††……„ƒ‚‚‚ƒ‚€}~}|{{{|||||{|}}~||||||||{zz|€‚‚‚ƒ…†…„ƒ‚‚‚‚ƒƒƒƒƒƒƒƒ‚„‚{{{{{||}}}}€€€€€€€€€€€€€€€€‚„†…‚~~„†‰Š‰‰Š‹…€‚…ƒ€Š”—”މ„€…‡†‚ƒ„‚}}ƒ………„‚…ˆ‡„‚ƒ„†Š‘Žˆ„‚ƒ„†……„„„††††††††……†††‡‡‡†††††………‡†††‡‡‰‰ŒŽ’“’‘‘‰†……†††††††††‡†ƒ‚ƒƒ}y~Š’””’†{wwxxx{}€€€€‚„‚||}~~}|zxwxyyxz{~‚ƒ‚€€€€‚‚‚‚‚‚‚‚„„„„„„ƒƒƒƒƒƒ„„……„„„„„„„„…„„‚ƒ‚ƒƒ„„„„„„„„„ƒƒƒ„…‡‡ŠŠ‹‹Œ‹‹Š……ƒ‚‚€ƒ‚‚ƒ„†…†…†…†…†††††††††††††††††‡‰‡„€‚‚‚‚€‚ƒƒ‚‚‚‚‚‚ƒ…‡ˆŠ†„ƒ€ƒ‡€€€€€€€€€€€€€€€€~||~„‡€{usuvusuxyxuv}ƒxpnqxxwy|€‚ƒ{{‚‡‡……ˆ‡…ƒ€~~€€€€zsrw|}{|}}~~€€€€€€€€~}}||~}}€€€~|zxwwwwxxyvuuy|€€€~€}}ƒ†‡††‡ˆ…}tqqru~…ˆˆ‰Šˆ‚}yxz|{y{€‚~{|{y|ƒ„ƒ‚‚ƒ€€€€€€€€€~~~|}}}~~€€~~~~~~€€€€€‚~~}}|}~~€~}}|{z{{|}‚ƒ„„†‡††…„ƒƒ‚‚‚€‚‚€~~}|{{z{}||||}~~}}}||||||{z|€‚€‚‚‚„…†…„ƒ‚‚‚‚‚‚ƒƒƒƒ‚‚€‚ƒ‚}|}|}|}}}}}€€€€€€€€€€€€€€€€ƒ…‡†‚~…‡‰‰ˆˆŠŒ…€„ƒ‚…Ž—˜“ŽŒˆ„€…‡†‚€‚€}}„………„‚„……ƒ‚ƒ„…ˆ‹Š†„ƒƒ…††………†††††…†…………†††‡‡‡††††…†……‡‡††‡ˆ‰ŠŽ‘‘ŽŒˆ…„„††††††††„†…ƒ‚ƒƒ{v{ˆ‘”””‘‡|vvxxxz}€‚‚ƒ…‚{{|~~~|zwwxyxwz{}€€€€‚‚‚‚‚‚‚‚……„„„ƒƒƒƒƒƒ„„„……„„„……„„„…„ƒƒ‚ƒƒƒ„„„„„„„„ƒƒƒ„…†‡ˆ‰Š‹‹ŒŒ‹‹‡…ƒ‚‚€ƒƒ‚„…†…†…†…††††††††††††††††††‡‰‡„€‚‚‚‚€€‚ƒƒƒ‚‚‚‚‚‚„†ˆ‰‰‡……ƒ‚†€€€€€€€€€€€€€€€€~}||~…‡}xssvywtqv{{yx|€€}vnmpuuvy}ƒƒ‚|z€‡ˆ††Š‰‡„‚€~€€}xwz||{||}~€€€€€€€~~}||~}}€~}}~}{xwwxxxwwvutux|€€€€}}‚‡‡……†‰‡vrrtu}…ˆˆ‰Š‰„ywyzyw|€‚~|||z|‚„ƒ‚‚‚€€€€€€€€€€€€~~~}}}~~€€€~~}~~€€~€€€‚‚‚ƒ~}}|||}~~}~~~}|{{{|||~ƒ„„†‡††…„„ƒ‚‚‚€‚‚€~~}|{{{{{}}|||}~}}}|||{{}|{}ƒ‚€‚‚‚„††…„ƒ‚‚‚‚‚‚ƒƒƒƒ‚‚‚ƒ„‚|{|~}}}}}}}€€€€€€€€€€€€€€€€„†ˆ†‚~~…‡ˆˆ‡ˆŠ…€‚‚ƒ„‰’š˜’‘‘Œ‡ƒ€€†ˆ†||~€‚„„„ƒ„„„„„„………‡‰‰‡…†‡…†‡‡†………†††…………„……†††‡‡‡†††††………‡†††‡‰Š‹Ž‘‘‰…„„††††††††„††ƒƒ„ƒ€{vzˆ’”•‘ˆ|uvxyxz}ƒƒƒ„…~{z|€€|zxxyyyxz{}~€€€€‚‚‚‚‚‚‚‚‚‚………„ƒƒƒ‚ƒƒƒƒ„„……„„…………„„…„ƒƒƒ‚ƒƒ„„„„„„„„ƒƒƒ„…†ˆ‰‰‰Š‹ŒŒ‹‹ˆ†„‚€‚€ƒ‚‚ƒ„†…†…†…†…†††††††††††††††††‡‰‡„€‚‚‚‚€€‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒ„†ˆŠˆ‡‡ˆ†‚‚„€€€€€€€€€€€€€€€€~}{|}…‡{vqrwzxuou|}{y|€|umlorsuy~‚ƒƒ€{y~„‡‰ŒŒ‹ˆ†„‚}~€‚‚€~}|{{|{{|}}~€€€€€€€€€~~}}|~}}‚€~}}}}zxwxyyxvtrttux|€€€€€€}}‚†‡…„†‰ˆ€wssuu}…‡ˆ‰Š‰‡‚|yz{zx|‚|||z|‚„ƒ‚‚‚€€€€€€€€€€€€€~~~}~~~€€€€€~~~}~~€€~€€‚ƒƒƒ~~}|||}}}€~}}~~~}|{{|||~ƒ„…†‡††……„ƒ‚‚‚€‚‚€~}||{{||}}}|||}~}}}|||{{}||~ƒƒ‚€‚‚‚„††…„ƒ‚‚‚‚‚‚ƒƒƒƒ‚‚„……ƒ{zz~~}}|}}}€€€€€€€€€€€€€€€€„‡ˆ†‚~~†‡ˆˆ‡ˆ‹…€ƒ†Œ•›™’“’‹††ˆ†}~~|{}ƒƒ‚‚„‚‚ƒ„„…‡ˆ‡…†‡Š‡ˆˆˆ†…„…††………„„„……†††‡‡‡†††††………‡††‡‡‰‹ŒŒŽ‘’“’“‘މ†……†††††††††ˆˆ…„…„‚|w{ˆ‘’“‘‰}uuxyxz}ƒƒ„„…~zz|‚}{xxyzzx{|}~~‚‚‚‚‚‚‚‚‚‚‚‚………„ƒƒ‚‚ƒƒƒ„„„……„„…………„„…„ƒƒ‚ƒƒƒ„„„„„„„„ƒƒƒ„…‡ˆ‰ˆ‰Š‹‹‹‹‹ˆ†„€‚‚€ƒƒƒ„…†…†…†…††††††††††††††††††‡‰‡„€‚‚‚‚€€‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒ„‡‰Š‡‡ˆ‰‡ƒƒ€€€€€€€€€€€€€€€€ƒ€}{|ƒ…ywuttuwysuwwvwz}}|zwtqontux{‚„†{yx|‚†…ƒŠ†ƒ€|{{…†€{ƒ~{yyz{}}~~~~}}~~~€€€~~}}}}~~~~€€€€€€~|{zwyzywvvwuuvwz|~€}~~~~}€~~ƒ‡‡…Љ‡…‚|{|ƒ‡‰Š‰ˆ‚|x{}|{z{}€|yww|…ƒ‚‚‚€€€€€€€€€€€€€~}~€}~~~~~~~~~~~~~~~~‚€~~€~‚€€€}}|||}}~€~~~}}}|{{{{|}~€‚„…………………„ƒ‚ƒ‚€~~~}}}|||~~~~~~~~€}|||~~{zz}ƒƒ‚‚‚‚ƒ„„†…ƒƒƒƒƒ‚‚ƒ‚„…ƒ|{{zz{}|z{~€€€€€€€€€€€€€€€€€ƒ…„‚…ŠŠŠŠŠŠŠŠ‰‡„€~~€ˆ‰‹Ž‘”–—”’‹‡ƒ~‰ˆ‡…ƒ~}}~€‚‚‚‚ƒƒƒ„…††‡‡ˆˆˆ†††††††††…†…†…†………†‡ˆ‡‡‡‡‡‡‡†††…†††‡ˆŠ‹Œ‘ŽŒŒŽ‘‘‘’’‘Ž‹‡…†††††††††ˆ‡…„…„‚zzz|€„‰ŒŽˆ~wuvy{|~€‚~{{~‚‚zwxzyy{y|‚ƒ‚€€€‚‚ƒ„„ƒ‚‚„„„ƒ„ƒ„„ƒƒ„„„„……‚ƒ„„……„„„„ƒƒƒƒ„„„………††††„ƒƒ„‡ˆˆ‡ˆ‰Š‹‹ŠŠŠ‰ˆ†„‚€‚‚‚‚‚‚‚‚‚‚‚€ƒ………………………††††††††…………†††††‡‰‡„‚‚ƒƒ‚‚€‚ƒƒ‚‚‚‚„†ˆ‰ˆ‡ˆˆ…‚„ˆ€€€€€€€€€€€€€€€€~}{{{~‚yxvuuvxy{ytpot}„~~|zwvtsz{}€‚…‡ˆ‚€„†…‚ŽŒ‹‰ˆ‡‡‡‚}~€}y~|zyz{|}}~~~}}~~~€€€~~}}}}~~~~€€€€€~|{yywyzywvvwuvvxy|~€~~~~~~~~€~ƒˆˆ†‰Š‰‰ˆ‡††‚ƒ†ˆ‰‰‰ˆƒ}y{}|zy{~€€|yww|„ƒ‚ƒ‚€€€€€€€€€€€€~}~€}~~~~~~~~~~~~~~~~}}~~}‚€€€€€~}}|||}}~~~}}}}}|{{{{|}~€‚ƒ………„„„ƒƒ€€‚€‚‚‚€~~~}}}|||~~~~~~~~~~}|||||{zz}ƒƒ‚‚‚‚ƒ„„†…ƒƒƒƒƒƒ‚‚‚ƒ‚„„ƒ|{{zz{}|z{~€€€€€€€€€€€€€€€€ƒ…ƒ€~€‚‰‰‰‰‰‰‰‰‡…ƒ~~~‚ƒ†ˆŠ‹ŒŒ‹‰†‚|{„„ƒƒ€{{{||}}}‚‚‚ƒƒ„„„…††‡‡ˆˆˆ††††††††…†…†…†…†……†‡‡‡‡‡‡‡††††………††ˆ‰‹ŒŽŒ‘‘‘‘‘‘ŽŠ†„††††††††…††„ƒ„ƒwvvvwz|}€}ywwyyz|~€ƒ~{{~‚‚zwyyyy{z{}€€€€‚‚ƒ„„ƒ‚‚ƒƒƒ„ƒƒƒƒƒƒƒ„„„„…„„………„„ƒ„„ƒƒƒ„„„„…………†††…„ƒ…‡‰ˆ‡ˆ‰ŠŠ‹ŠŠŠ‰ˆ†„‚€‚‚‚‚‚‚‚‚‚€ƒ………………………††††††††…………†††††‡‰‡„‚‚ƒƒ‚‚€‚ƒƒ‚‚‚ƒ†‡‰ˆˆˆˆ…‚„ˆ€€€€€€€€€€€€€€€€‚‚‚‚ƒƒ††„„„„††}xrqw‰ŠŠŠˆˆ††…‚ƒ„†‡ˆ‰‰‡…„……ƒ‹‹‹‹ŒŒˆzvxyzxyyxxyz|}}~~~~}~~€€~~}}}}~~~~€~|{yxwwxyywvvvuuvwz|~€~}}~~~ƒˆŠˆˆˆˆˆˆ‡††ˆˆ‰‰‰‰‰‰„~z{}{yx|~€€|ywv|„ƒ‚ƒƒ€€€€€€€€€€€€€~~€€~~~~~~~~~~~€~}}}~}}€€€~}}|||}~~~}}|||}}|{{{{||}ƒ„……„„„ƒƒ‚€€‚ƒ‚€~~~}}}|||}}}}}}}}|||}|{{z{zz}ƒƒ‚‚‚‚ƒ„„†…ƒƒƒ„„ƒ‚‚ƒƒ‚„…ƒ|{{zz{}|z{~€€€€€€€€€€€€€€€€ƒƒ‚€~€€€€€€€„„„ƒ‚}|}~‚‚„ƒ‚€~|{z~}}||||{ƒƒƒ„„„…………††‡‡ˆˆ†††††††††…†…†…†………‡‡ˆ‡‡‡†††…†…………†‡‰ŠŒŽŽŽŽ‰†ƒ†††††††††‡†ƒ‚}yxxwwwwwvvwy{{yw|~€‚€}{{~ƒƒ€zwxzxy{{{||~~€€€‚‚ƒ„„ƒ‚‚ƒƒƒƒƒƒƒƒƒƒ„„„„…………††…„„ƒ„„„ƒƒƒ„„………………††…„ƒ„‡ˆˆ†ˆˆ‰Š‹ŠŠŠŠˆ‡„‚€€‚‚‚ƒƒ………………………††††††††…………†††††‡‰‡„‚‚ƒƒ‚‚‚‚‚‚‚‚„…ˆ‰ˆ‡ˆˆ…„ˆ€€€€€€€€€€€€€€€€…†††„ƒ€‚‚‚‚‚}„ˆƒƒƒ„ƒ„„„………††‡‡‡ˆ‡†…„ƒ€€€‚ƒƒ„{vpnptvvttuwy{}}~~~~~~€€~~}}}}~~~~~€|{xwvuxxxxwwuuuvvxy|~€€~}}~€~‚ˆ‹ŠŠŠŠ‰ˆ‡……‹Š‰ˆ‡ˆ‰Š…z|}zxw|€|xvv{„ƒ‚ƒƒ‚‚€€€€€€€€€€€€~€~~~~€~}}~~~€‚‚€€~}||||~~}}||{|}}|{{{{||}ƒ„„……………„ƒ‚‚€‚‚‚€~~~}}}|||}}}}}}}}{|}~~|{z{zz}ƒƒ‚‚‚‚ƒ„„†…ƒƒƒƒƒƒ‚‚ƒ‚„„ƒ|{{zz{}|z{~€€€€€€€€€€€€€€€€€€€‚‚‚‚„…†‡…ƒ€}€€~~‚‚‚‚‚‚‚‚„„ƒƒ€€ƒ„„……†††„……††‡‡‡††††††††…†…†…†…†…††‡‡ˆ‡‡………………………†ˆŠŒŽŽŽ‘Œ‰…ƒ††††††††‡ˆˆ†‚}xuxxxyxxxxuwy|}|xv|~€ƒ}z{~‚ƒƒ€{wyyyxz{{zz{}€€€‚‚ƒ„ƒƒ‚‚ƒƒƒƒ‚ƒƒƒƒ„ƒ„„…„………†††……„„„ƒƒƒ„„„……………………†„ƒ…‡ˆ‡†‡ˆ‰ŠŠŠŠŠŠ‰†…‚€€‚‚‚€ƒ………………………††††††††…………†††††‡‰‡„‚‚ƒƒ‚‚‚‚‚‚ƒ†‡‰ˆˆˆˆ…‚„ˆ€€€€€€€€€€€€€€€€ƒƒ‚€}yvtuuuvvuuuoruutrstssttvvwwtttttsssrssrqppqqqqqqqqqpnllnprrpqtwz}~~~€~~~~}}}}~~~~~~~}{xwvvuxxxwxvvuuuvwz|~€€~}}~€~‚‡‹‹ŠŠŠŠŠ‰‰ˆŠ‰‡††‡‰Š…z|}zxw}€|xvu{€„ƒ‚ƒ„‚‚‚‚€€€€€€€€€€€~€€~~~€€~~€‚‚€€~}}|||~}}|}||{}}|{{{{||}‚„„„„„…„„ƒ‚‚‚ƒ‚€~~~}}}|||}}}}}}}}|}~|{{zz}ƒƒ‚‚‚‚ƒ„„†…ƒƒ‚ƒƒ‚‚‚‚„…‚|{{zz{}|z{~€€€€€€€€€€€€€€€€~~~€‚„……ƒ‚ƒ‚ƒ‚ƒ‚†‡‰‰ˆ†ƒ†……„„ƒ‚‚‚‚ƒƒ„ƒ„„‡‡†……ƒƒ‚ˆ‡‡……„ƒƒƒƒ„„……††„„……††‡‡†††††††††…†…†…†………‡‡ˆ‡‡†……………………†‡‰ŒŒ‰…ƒ†††††††††‡ˆˆ„}uquvwxyxxxxxyz|{yw|~€‚|z{~‚„„{xxzxxz{zyyz|~€€€‚‚ƒƒ„ƒ‚‚‚‚‚‚ƒ‚‚‚ƒƒ„„„„……ƒ„……††††„„„ƒƒƒ„„………„…„…„†…„…‡‡‡…†‡ˆ‰ŠŠŠŠŠ‰‡„ƒ€€‚ƒƒ………………………††††††††…………†††††‡‰‡„‚‚ƒƒ‚‚‚€‚‚‚„…ˆ‰ˆ‡ˆˆ…„ˆ€€€€€€€€€€€€€€€€‚~{wurqqrsttsrqopqpnnpspppqrsssrrrqqqqqnoqponpqppoonmllqqpqppoonqtx{~~€€~~~}}}}~~~~~~~~}|zxvvvwxwwwwwutuvvxy|~€€~~~~€€~†Š‹ˆˆˆ‰‰‰ˆˆ‰ˆ‡††‡ˆ‰„~z{}{yx~€€|xuuz€ƒƒ‚„„‚‚‚‚‚€€€€€€€€€‚€€€€€€€€€€~~€€€~~€€€€€€€~}}}}}~~}}}}||}}|{{{{|{|~€‚ƒ„„ƒƒƒƒƒ‚‚€‚‚‚€~~~}}}|||}}}}}}}}~~~~}|{zz}ƒƒ‚‚‚‚ƒ„„†…ƒƒƒƒƒ‚‚ƒ‚„„ƒ|{{zz{}|z{~€€€€€€€€€€€€€€€€€„††…‡‡ˆˆ‡†…„……„ƒ‚‚„„„……††‡‰‰ˆ‡……„ƒ„„„„ƒƒ‚‚ƒƒƒ„„………ƒ„„……†††††††††††…†…†…†…†…††‡‡‡‡‡………†…†††ˆ‰‹ŽŽŽ‘‰†ƒ††††††††ƒ„‡‰†~wsvwwxxyxxxwvwxzzy|~€ƒ~|z{~‚„…|xyyxwyzzyyz|~€€‚‚ƒ„„ƒ‚‚‚‚‚‚‚‚‚‚ƒ„ƒ„„…„…‚‚„…††‡‡„„ƒƒƒ„„„……„…„„„„‡…„…†‡†……†‡‰ŠŠŠŠ‹Š‡…ƒ‚€€€€‚‚‚€ƒ………………………††††††††…………†††††‡‰‡„‚‚ƒƒ‚‚€‚‚€‚ƒ†‡‰ˆˆˆˆ…‚„ˆ€€€€€€€€€€€€€€€€|yusrstnoqrrqonpppmklorpppqqqrrppppqqqqmprqnmoqtsssrrqqtuusrpppoqvz}~€€€~~~}}}}~~~~~}}}|{ywvvxxxwvvxwusuuvwz|~€€€~€„‰Š‰‰ŠŠŠ‰ˆˆ‰ˆˆˆ‡ˆˆˆƒ}y{}|zy~€‚€|wutzƒ‚‚„„ƒƒ‚‚‚‚€€€€€€€€‚€‚€€€€€€€€€~~~€€}}~€~€€~}}~~~~~}}}}}|{{{{|{|~€‚ƒ„„‚ƒƒƒƒ‚‚‚ƒ‚€~~~}}}|||||||||||~}||||}{zz}ƒƒ‚‚‚‚ƒ„„†…ƒƒ„„„ƒ‚‚ƒ„‚„…ƒ|{{zz{}|z{~€€€€€€€€€€€€€€€€‡„‚ƒ…†„……………………††„ƒƒƒ„„‚‚‚€€€‚‚‚ƒƒƒ„„……………………€‚‚‚‚‚‚‚ƒƒ„„„ƒƒ„„……†††††††††††…†…†…†………†‡ˆ‡‡‡……††††‡‡‰‹ŽŽŽŽŽŽ“‘‘‘ŽŠ†„††††††††„„‡‰†ywwwwvwwwwywuuwxyy|~€‚~{z{‚……‚|yyywwyyyzz|}~~€€‚‚ƒ„„ƒ‚‚‚‚‚‚‚‚ƒƒ„„„„……‚‚„……………„„„ƒƒƒ„„………„„„„ƒ‡†……‡‡†„…†‡‰ŠŠŠŠ‹Šˆ…ƒ‚€€€€€€‚‚ƒ………………………††††††††…………†††††‡‰‡„‚‚ƒƒ‚‚€€‚‚€‚‚‚„…ˆ‰ˆ‡ˆˆ…‚„ˆ€€€€€€€€€€€€€€€€usolkmprpqsuusqpqrsqonpsuuuuuuuuppqqrrsspsusomorpppqqqqqtttsqqrsprw{~€€€€~~}}}}~~~~~}}}|zxvvwyzxwvvwwusuvvxy|~€~€€~€€~ƒˆŠˆˆˆ‰‰‰‰ˆŠŠŠ‰‰ˆ‡‡‚|x{}|{z~€‚€|wutzƒƒ‚„„ƒƒƒ‚‚‚€€€€€€€€‚€€‚€€€€€€€€€€~~~~||}~~}~€~~~}~~~~~}}}|{{{{|{|~€‚ƒƒ„ƒ„„„„„ƒƒ‚‚‚€~~~}}}|||||||||||~}|zz{|}{zz}ƒƒ‚‚‚‚ƒ„„†…ƒƒ………„ƒƒ„…‚„„ƒ|{{zz{}|z{~€€€€€€€€€€€€€€€€Œ‰…„†…‚~‚‚‚‚‚‚‚‚…ƒ€‚ƒ€€€€€€‚ƒ„…††€€‚ƒ„„‚‚ƒƒƒ„ƒƒƒ„„………††††††††…†…†…†…†……†‡‡‡‡‡…†††‡‡‡‡‹ŒŽŒŽŽŒŽ‘”‘’’‘Ž‹‡…††††††††ˆ‡‡ˆ…~zyxxwwwxxy|zwwwxxw|~€ƒ}{y{~ƒ……‚|yyywwyyyz{|}~~€€‚‚ƒ„„ƒ‚‚ƒƒ„„„„……ƒƒ„„…„„„„„ƒƒƒƒ„„………„„„ƒƒ‡†……†‡†„„…‡ˆŠŠŠŠ‹Šˆ…ƒ‚€€€€€€€€‚‚‚€ƒ………………………††††††††…………†††††‡‰‡„‚‚ƒƒ‚‚€€‚‚‚„†ˆ‰ˆˆˆˆ…‚„ˆ€€€€€€€€€€€€€€€€zwsonoqrurppsutrsrppqrrqrtspnopqqrstuuuuvurqrrrrqqqrrsstssssssrrrvz||||}~~~~~~~}~€€}}}}}}}}~~}{ywxxxxxxxxxyyxxwvuwvuuw{~€~~~~}ƒ†ŠŠˆ‡†††††‡ˆ‰ŠŠŠ‰ˆ€|z|}{{|€{wuuy~‚‚‚„„ƒƒƒƒƒƒƒƒƒ~€€~€‚‚‚‚€€€€€€€€~~~~~~~~}}}€€€}}}}}}}}}}~~~€~|{zzz}{{}„……„„„„ƒ‚€€‚€€‚‚€~}}}||{{}}}}}}}}~~~~}}}}{zz}ƒƒ‚ƒƒ‚‚ƒƒ……ƒ‚ƒ„…„ƒƒ„…€‚ƒ~{zz~|xxzz{€€€€€€€€€€€€€€€€ˆ†ƒ€‚ƒ‚‚‚‚‚‚‚‚ƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚ƒƒ‚‚‚‚‚ƒƒ‚‚‚„…†‡††…………††††††‡‡‡‡††ˆ‡‡‡‡‡‡‡‰ˆ‡†‡‰‹ŽŽŒŒŽŽŽ‘Œ‰‡††††††††‡‡‡†„€{wwxy{||zxzyxwwxyy~~~€‚€~{{~‚ƒ€{xyzyy{xwwwy{~€€€€ƒ„„„ƒ‚€ƒ‚‚‚‚ƒ„„„„„„„„ƒ„„„„„„…†…„‚‚ƒƒ„…„…„…„…„ˆ‡………†……~‚‡Š‹ŠŠŠŠŠŠ‡„‚‚‚‚‚‚€ƒ…„„„………††††††††††……„„„…†‡…‡ˆ‡„€‚‚ƒƒ‚‚€€€€‚„‡‰Šˆ‰Š‰„€„‹€€€€€€€€€€€€€€€€ywtrpppqsqnortrqqqpppppqqqqpnnpsuvwxxwvvtsqqrtuussssrrqqqrrrqqppruz}||}~~~~~~~}}}~€}}}}}}}}|}}|{yxvwwwwwwwwxxxxwwvuwvuvwz~€~~~€~}‚†‰ŠŠˆ‡………††‡ˆ‰‰‰ˆ‡€|z||{{|{wvvy‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€~~~~~~~~~€€€€€€~~~~~~~~}~~~~€}|{zzz}|{}€„……„„„„ƒ‚€€‚€‚‚€}}}}||||}}}}}}}}~~~~}}}}{zz}ƒƒ‚ƒƒ‚‚ƒƒ…„ƒ‚ƒƒƒƒƒƒƒƒƒ„‚~{z{||yz|{z€€€€€€€€€€€€€€€€‰‡„‚€‚‚‚‚‚‚‚‚‚ƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ‚‚‚‚ƒƒ‚‚‚„…†‡††………††††‡††‡ˆˆ‡††‡‡‡‡‡‡‡‡†††‡‰ŒŽŽŽŽŒŽŽ‘‘Œˆ†††††††††‡‡‡†…|xvwy{|}}|zzxwwxxy~~€‚€}{{~‚‚€{wxxwwywwwxy|~€€€€‚ƒƒ„ƒƒƒ‚‚‚‚ƒ„„„„„„„„ƒ„„„„„„…†…„ƒ‚ƒƒ„„…„…„…„…‡†……††…„‚‡Š‹ŠŠŠ‰ŠŠ‡„‚‚€‚‚‚‚€ƒ…„„„………††††††††††……„„„…†‡…‡ˆ‡„€‚‚ƒƒ‚‚€€‚„‡‰Š‡ˆŠ‰„€„Š€€€€€€€€€€€€€€€€xwusqppoqomnpqqonoqppopponooonrv}|{yxvtsrqpprsttsrqppqrsqrsrqoopquz|}|}~~~~~}~}}}}~}}}}}}}}{{zyxwwvwwwwwwwwwwxxwvvuwvvvxz}~~~~€€„‰‹Š‰†„„…†…†‡ˆˆ‡‡†€|z|}{{|‚{xvv{€ƒ‚‚‚€‚‚€‚€€€€€€€€~~~~~~~~€€~~~€}|{z{{}{{}ƒ……„„„ƒƒ€‚€€‚‚€}}}}}|||}}}}}}}}~~~~}}}}{zz}ƒƒ‚ƒƒ‚‚ƒƒ…„ƒ‚‚‚ƒ‚‚ƒ‚‚„…‚{{{z{y{}{y~€€€€€€€€€€€€€€€€Šˆ†ƒ‚€€€ƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚ƒƒ‚‚‚‚„…†‡††……††††‡‡†‡ˆˆˆˆ‡†‡‡‡‡‡‡‡‡††ˆŠŒŽŽŽŽŽŽŽŽ‘‘‘Ž‹ˆ………………………‡‡‡‡…‚}zwxzz{|}~{zyxwwxx€~~€‚€}z{}€‚‚zwwywwyxxyz{}€€€‚ƒ„„„ƒƒƒ‚‚‚‚ƒ„„„„„„„„ƒ„„„„„„…†…„ƒƒƒ„„…„…„…„…„………†‡†…ƒ€ƒ‡ŠŠŠŠŠŠŠŠ‡„‚€‚‚‚ƒƒ…„„„……………………………………„„„……†‡…‡ˆ‡„€‚‚ƒƒ‚‚‚‚‚„‡‰Š‡ˆ‰‰„„‰€€€€€€€€€€€€€€€€zwsommnopnmnoqonnopqppopnnnooqty}{xutsssqpoooppprqommnopprsronnppuy||}}~~}~}}}}|||}~|||}|}||zzyxwwwwwwwwwwwwwwwxwwvuwwvwxz|~~~~~~€~~‚‡ŠŠ‡…ƒ…††…†‡ˆˆˆ‡†€|z||{{|€{ywx{€ƒ‚€€~€€€‚€€€€€~~€€}~}~€‚€€€€€€€€~~}|{{{{}|{}€„……„„„„‚‚€€‚€‚ƒ€}}}}}}}}}}}}}}}}~~~~}}}}{zz}ƒƒ‚ƒƒ‚‚ƒƒ„„ƒ‚‚‚‚‚‚‚‚‚‚ƒ……ƒ|zzzzxy|zy~€€€€€€€€€€€€€€€€Š‰‡…‚€ƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒ‚‚‚‚‚ƒƒ‚‚‚‚„…†‡††…††††‡‡‡‡ˆˆ‰‰ˆˆ‡‡‡‡ˆˆˆˆˆ‰Š‹ŽŽŽŽŽŽŽŽ‘‘ŒŠ‡………………………‡‡‡‡†„€}zzz{zyz}{zyxwwxx€€~~}zz}€‚~yvyzzz}}}}~~€€€€€€‚„„…„„ƒ‚‚‚‚ƒ„„„„„„„„ƒ„„„„„„………„„„„„„„…„…„…„…„„…‡ˆ‡„‚„ˆŠŠŠŠŠ‰ŠŠˆƒ‚‚‚€‚‚‚‚€ƒ…………………………………………………„„„…†‡…‡ˆ‡„€‚‚ƒƒ‚‚‚‚‚‚‚„‡‰Š‡ˆ‰‰…‚„ˆ€€€€€€€€€€€€€€€€|xqljkmponnnpppnooppqqponopoqtxyzwtqqqqqqponoonmmnnoonnmnoqpnlmnpty|}}~~~~~~}}}|||{||~~{{{{|{{{zyxxwwxxwwwwwwwwwwxwxwvvxwxxz{|}~~~~~€~}€…‰ˆ…‚ƒ†ˆ†††ˆˆ‰ˆ‡‡€|z|}{{|‚€}yxy|„‚€€€€€€€‚‚ƒ‚‚€€€€€€}}}}~‚~~~~~}{{{{|}{{}ƒ……„„„ƒƒ€‚€€‚‚€}}}}~}~~}}}}}}}}~~~~}}}}{zz}ƒƒ‚ƒƒ‚‚ƒƒ„ƒ‚‚‚‚‚ƒ‚ƒƒƒ‚‚ƒƒƒ……‚zyy{zvvxwx~€€€€€€€€€€€€€€€€‰‰ˆ†…‚‚‚‚‚‚‚‚‚ƒƒƒƒƒ‚‚‚ƒ‚ƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚ƒƒƒ„ƒƒ‚ƒƒƒ‚‚ƒƒƒ‚„…†‡††††††‡‡ˆ‡ˆˆ‰‰‰‰ˆˆˆˆˆˆ‰‰ŠŠŒŽŽŒŽŽŽŽŽŽŽŽŽŽ‹ˆ†………………………‡‡‡‡‡…‚€{yyzzxy{{zyxwwxx€€~~|zz|}xwy|}‚‚‚‚€€€€€‚ƒ„………„ƒ‚‚‚‚ƒ„„„„„„„„ƒ„„„„„„………………„„ƒ…„…„…„…„ƒ„…†‡‡„‚ƒ…ˆŠŠŠŠ‹ŠŠŠ‡„‚€‚‚‚ƒƒ………………………………………………„„„……†‡…‡ˆ‡„€‚‚ƒƒ‚‚‚‚‚‚‚„‡‰Šˆˆ‰Š‡ƒ„ˆ€€€€€€€€€€€€€€€€}ztommnponnopqonoonpqrqpoppqtxyywtrqqpompooooponllnoopppmoppnmmnosx|}~€~~~~}}|||{{{{|}}zzzzzzzzxxxxxxxxwwwwwwwwwxxxxxwwyyz{{}}}~~~~~~|~‚†‡„€…‡††‡ˆ‰‰‰ˆ‡€|z||{{|‚€}zyz|„ƒ‚ƒ‚‚‚€€€€€‚‚‚€‚‚€€€€€~}|||~€~~~~~~}}~~||{{||}|{}€„……„„„„ƒ‚€€‚€‚ƒ€}}}~~~~~}}}}}}}}~~~~}}}}{zz}ƒƒ‚ƒƒ‚‚ƒƒƒƒ‚‚‚‚ƒƒ‚ƒ„„ƒ‚ƒ„ƒ„„‚}ywwzxtsvuw}€€€€€€€€€€€€€€€€‡‡‡‡†„‚‚‚‚‚‚‚‚‚ƒƒƒƒƒ‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚ƒƒ„ƒƒƒƒƒƒƒ‚‚ƒƒƒ‚„…†‡†††††‡‡ˆˆˆˆ‰ŠŠŠŠ‰ˆ‰‰‰ŠŠ‹‹ŒŒŽŽŽŽŽŽŽŽŽŽŽŽŽŒ‹‰‡††……………………‡‡‡ˆˆ‡…ƒzwvz|{z|zyxwwxyy€€€}~€~|yy|€}xvy|}‚ƒƒƒ‚€€€€‚ƒ„………„„ƒ‚‚‚‚ƒ„„„„„„„„ƒ„„„„„„……†††……„ƒ„…„…„…„…„ƒ„…††…ƒ„†ˆŠ‰‰Š‹‰ŠŠˆƒ‚‚€‚‚‚‚€ƒ………………„„„…………………………„„„…†‡…‡ˆ‡„€‚‚ƒƒ‚‚‚‚‚„‡‰Š‰‰Š‹‰……ˆ€€€€€€€€€€€€€€€€}}{zwsponnoopponnnnnopppqporvyywrpoopqpnonnopponponmmmnonnooooooosx|}~€~~~}}|||{{{z{{|}xxyxyxyxvwxyyxwvwwwwwwwwxxyyyyxxzz||}~~~~~~~~~~|}ƒ‡†€}†‡††ˆˆ‰ˆ‡‡€|z|}{{|€‚€}{zz{„„ƒ……ƒ‚‚‚‚‚‚‚‚€€~€€~‚‚‚€~~|{{}~€~~~}}}}|~}|{{{||}{{}„……„„„ƒƒ€‚€€‚‚€}}~~~~}}}}}}}}~~~~}}}}{zz}ƒƒ‚ƒƒ‚‚ƒƒƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚ƒƒ€|xvvwvssvtuz€€€€€€€€€€€€€€€€„…‡ˆˆ†…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ„„ƒƒƒ„ƒƒ‚‚ƒƒ„‚„…†‡††††‡‡ˆˆˆˆ‰‰Š‹‹Š‰‰ŠŠ‹‹ŒŒŽŽŽŽŽŽŒŒ‹Š‰ˆ‡†††††††††††‡‡‡ˆ‰ˆ‡…|ww|€}{{yyxwwxyz€~}€~{yy|€€}yvxzz{}}~€‚€€€€„…………„ƒƒƒ‚‚‚‚ƒ„„„„„„„„ƒ„„„„„„………†††…„ƒ…„…„…„…„„ƒƒ„…†…„…‡‰‰‰‰Š‹ŠŠŠ‡„‚€‚‚‚‚ƒ…††………„„„„„„„„„„„……„„„…†‡…‡ˆ‡„€‚‚ƒƒ‚‚€€‚„‡‰ŠŠŠ‹‹‡†ˆ€€€€€€€€€€€€€€€€|‚ƒ€yrmnnnopponmnnnmnoqronsxywuspmmnoomnmmnnonmnnmlllmmlmmnoonnnsx|}~~~}}}|||{{zzz{|}xxxxxxxxtuwxyxvuxxxxxxxxxxyyzyyx{|}~~~~~~~€~}~~}|~‚ˆ‰{~„‡…†‡ˆˆˆ‡†€|z|}{{|€‚~{z{{„„„††…ƒƒƒƒƒƒƒƒ‚€€‚‚€||}~~}||‚‚‚‚€~~~€~|{{|}~}}}||||~}||{||}}{{}„……„„„„ƒ‚€€‚€€‚‚€}}}~~}}}}}}}}~~~~}}}}{zz}ƒƒ‚ƒƒ‚‚ƒƒƒƒ‚‚‚‚ƒ„ƒ‚‚‚ƒƒƒ‚ƒƒ€{wuuttstwtsw€€€€€€€€€€€€€€€€‚ƒ†ˆ‰ˆ†…„„„„„„„„ƒƒƒƒƒ‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ„„ƒƒƒ„ƒƒ‚‚ƒƒ„‚„…†‡†††‡‡‡‡ˆˆˆ‰ŠŠ‹‹ŠŠ‰Š‹‹ŒŽŽŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒŒŒŒŒŒŒŒ‰ˆ‡††††‡††††††††‡‡‡ˆ‰‰ˆ†€zx~‚zyyxwwxyz{€~}~€~{yy{~€€~yvwwvvxxy|€€€€€€€…†††…„ƒ‚ƒ‚‚‚‚ƒ„„„„„„„„ƒ„„„„„„……††‡†…„ƒ„…„…„…„……„ƒƒ„…†……‡‰‰‰‰ŠŒ‰ŠŠ‡„‚‚‚‚‚‚€ƒ…††………„„„„„„„„„„„……„„„…†‡…‡ˆ‡„€‚‚ƒƒ‚‚€€€€‚„‡‰Š‹Š‹Œˆ‡‰€€€€€€€€€€€€€€€€‚†…}uroooooooonmmmlllkhkpw||yvssrqppoonnnmllkkppoonmmlmmmnnnnnkqy~}|~~~}|{{{zzyyxwwwwwwwxxxxwwxxxxwwvvvwwwwwwxyyxy|~€~||~~}~~~~~~~~}}~~}}‚‡†}ƒ†…†‰ˆ„…ˆ‚|{}|{|{|€}zxx}‚…„„‡‰ˆ…„„ƒ‚€€€€€€{|||}}~~€€~~~}|||||€€€€€~}||||}||{{{{{z{}~‚„……„„ƒ‚€€‚€‚‚€~~€~}}~€~}|~}}}}|z|{{}€‚ƒ‚„ƒƒ‚‚‚ƒƒƒ„ƒ€ƒ„ƒƒƒƒƒƒƒƒ‚ƒ„|xvvwvvxxvx|€€€€€€€€€€€€€€€€‡…{{†Š…ƒƒƒƒƒƒƒƒ„„„„„„„„†„‚‚‚‚‚‚‚‚‚„„„„„„„„„„„„„„„„‚‚‚‚‚‚‚‚ƒƒ„„…†‡‡…††‡ˆˆ‰‰ŽŽŽŽŽŽŽŽŒ‹Œ‹ŠŠŠ‰…‚„ˆ‰‡………‡††††††…‡‡‡‡‡‡‡‡†€{z‚{xxyyyz{|~~~}~|yy{~}xuvxwxz}~‚„ƒƒ‚‚‚‚‚‚‚‚‚ˆ‡‡‡††……ƒ‚ƒ‚ƒ‚ƒ‚ƒ„„„„„„ƒ„„„……„„„„„…†‡‡‡‡……………………„„………………ˆ‰‰‰‰‰‰Š‹Š‰…‚€€€€‚‚‚ƒ†……„„„„„„„„„……………………††††…‡ˆ‡„‚‚€€€‚‚ƒ…„‚€‚ƒƒˆŠ‰‰‰‰‰‰‰‰‰€€€€€€€€€€€€€€€€|~†ˆxtppppppppttssrrrrpquz|{vrssrrrqqqsssssrrrtttsrrqquuuttssspv|€€~~~|{zxxwwwwwwwwwwwwxxxxwwxxxxwwvwwwwwwxxyzzyz}€~||~~~~~~~~}}~~}~€…ˆ„}}‚††‡ˆ‡…†ˆ‚|{~|{|{~ƒ‚|zy|„ƒƒ…†…ƒƒ‚€~€€€€}~~~~~~~}|||}{{|~€€~}||||||{{{{{{{|}ƒ„………„ƒ‚€‚€‚‚€~~}~€€~}||}~~}}}}|{|{{}€ƒ‚‚ƒƒ‚‚‚‚ƒ„…„€‚„„ƒƒƒƒƒƒƒƒƒ„„}xwvxwwxwvw{€€€€€€€€€€€€€€€€ˆ‡}zƒ‰‡…………………………………………‡…ƒ€ƒ„„„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ……„…„…„…‚‚ƒ„…†‡‡…†‡ˆŠ‹ŒŽŽŽŽŽŽŽŽŽ‹ŠŒŠ‰‰‰ˆ„‚„‡‰‡†……††††…†……‡‡‡‡‡‡‡‡…ƒ}z}‚|zxvwz|{y~~~}~|yy{~}xuxyyz|}€‚ƒƒ‚‚‚‚‚‚‚‚‚‚……„„„„ƒƒ‚ƒ‚ƒ‚ƒ‚ƒƒ„„„„„„ƒƒƒ„„„„ƒƒƒ„…††‡††……………………„„„……†††ˆ‰‰‰‰‰‰Š‹Š‰†‚€€€€€‚‚‚ƒ†…„„ƒ„„„„„„„„……………………†††…‡ˆ‡„‚‚€‚€€‚‚ƒ„„€‚ƒƒˆŠ‰‰‰‰‰‰‰‰‰€€€€€€€€€€€€€€€€{x{…‹…zsrrrrrrrrsssrrrqqsux|~|wszzzz{{{{zzzzz{{{}||{{{{zyyyxwvvvw{€~€~}{ywvuwwxwxxxxwwwwxxxxwwxxxxwwwwwwxxxxy{|{{{~€~||~~~~~}|}~~}~‚ˆ‡|…‡‰ˆ‡‡‡†‚||~|{|{‚„ƒ€}{z{€ƒ‚ƒ„ƒ€~~}€€€€€€€€€€€€€€€€~~~~~€~}}}}zz{|~~€€~}||||}||{{{{{{|~‚ƒ…………„„ƒ‚‚€€‚‚‚€€~}~~€~|zz|~}}}}|{|{{}‚ƒ‚‚‚‚‚‚…†…‚ƒ„„‚‚‚‚ƒ‚‚‚ƒ„…‚~zxxyxxyxuwz€€€€€€€€€€€€€€€€~‡‰€{ˆ‰††††††††††††††††ˆ†„‚‚ƒ„†„„…„…„…„…„…„…„…………………………„„„„„„„„‚ƒ…†‡‡‡ˆ‰‹ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŒ‹Š‰Š‰‡‡ˆ†ƒ€€„‡‰‡†…††††……………‡‡‡‡‡‡‡‡……€yzƒ€{xvvy{zx}~~~}}|yy{~}xvx{z|~~‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚€ƒ‚ƒ‚ƒ‚ƒ‚ƒ„„„„„„ƒƒ„„„„„„ƒƒƒ„…†…†………………………„„……††††ˆ‰‰‰‰‰‰ŠŠŠ‰…‚€€€€€€‚‚‚ƒ†…„ƒ„ƒ„„„„„„…………„„…………††…‡ˆ‡„‚‚€‚€€€‚‚„ƒ‚€‚ƒƒˆ‹‰ŠŠŠŠŠŠŠŠ€€€€€€€€€€€€€€€€{wz…Š„xpmmmmmmmmoooonnmmprw}}zyzz{{|}}{{zzyyyx{|{{{{{{{{{{{{{{z|~~|{}|{zywvuuyyxyxxwwwwwwxxxxwxxyxxwwwwwxxyyz{|}}|}€ƒ€~||}~€€€~}|}~~}|~~‚‡ˆƒ~|ƒˆŠˆ‡ˆˆ†‚||~||||~ƒƒ|zzz‚‚„†…€€~~€€€€€€€€€€€€€€€€~~~~~~~€~~~~}~}}}}}}€~}||||||{{{{{|{|}€„…†………„ƒƒ‚‚‚€‚‚€}~€~~~~~~~~~}}~~}||{{}€ƒ‚‚‚‚ƒ„†…ƒ‚ƒƒ‚‚‚‚‚‚‚‚ƒ……ƒ~{yyywxyxvx|€€€€€€€€€€€€€€€€€†‡„ˆ‡††††††††…†…†…†…††…ƒ‚„†ƒƒ‚ƒ‚ƒ‚ƒƒƒƒ„ƒ„ƒƒƒƒƒƒƒƒƒƒ€€€€‚ƒ…†‡ˆ‹‹Œ‘‘ŽŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒ‹Š‰ˆˆ‰ˆ††‡…‚€ƒ‡ˆ‡†††…†…………„…‡‡‡‡‡‡‡‡†…{y~‚ƒ{zyxvwxy}~~~}}€|yy{~}yvxzzz}€€€‚‚‚‚‚€€€€€€€€‚ƒ‚ƒ‚ƒ‚ƒƒ„„„„„„ƒ„………………„‚ƒ„………„„……………………„„……†‡‡‡ˆ‰‰‰‰‰‰ŠŠŠˆ†‚€€€€€‚‚‚ƒ……„„ƒƒƒ„„„„…„………„„„…………†…‡ˆ‡„‚‚‚€€€‚ƒƒ€‚‚ƒˆŠ‰ŠŠŠŠŠŠŠŠ€€€€€€€€€€€€€€€€}y{ƒ†}rknnnnnnnnpooonnnnmpv|‚ƒ~yyzz{||}~~}|{yyx{{{{{{||{{|}~~xz{{xwy{xwwwwvvvwwwvwvvvwwwwxxxxxxyyyxxwxxxyzz{{|}~~}~„€~||~~€€€€~}||}~}||€„†‡‡{†‰ˆ‡‰‰†ƒ||~}|}|}‚~zyxz‚‚ƒ†ˆˆ€€€€€€€€€€€€€€€€€€€€€€~~~~~~~€€~~~~~~~~€~}||||}||{{{{{{|}ƒ……………„„ƒ‚‚‚€€‚‚‚€~~€~}€€€€}|~}}~~}||{{}‚ƒ‚€‚ƒƒ……‚‚‚‚‚‚‚‚ƒ„…ƒ~{zzwvwyyxz~€€€€€€€€€€€€€€€€…„‚„ˆˆ„……………………„„„„„„„„„ƒƒ…ƒƒƒƒƒƒƒƒ€€€€€€€€€€€ƒ„†ˆ‰ŠŽŽŽŽŽŽŽŽŽŽŽŒ‹‹Š‰ˆˆ‡‡‰‡†††…‚‚†ˆˆ‡†‡†………………„ˆˆˆˆˆˆˆˆ†‚~|zz…}|zwvvxy}}~}|}~€|yy{~~yvwyxy{€‚‚€€€€ƒ‚ƒ‚ƒ‚ƒ‚ƒ„„„„„„ƒ„„…………„„ƒƒ„„…„„ƒ……………………„„……‡‡ˆˆˆ‰‰‰‰‰‰Š‰‰ˆ…‚€€€€‚‚‚ƒ…„„ƒƒƒƒ„„„„„…………„„„„……………‡ˆ‡„‚‚‚‚€€‚ƒ‚€‚ƒƒˆ‹‰ŠŠŠŠŠŠŠŠ€€€€€€€€€€€€€€€€~{|€~ulilllllllloonnmmmmnqv|~zxxxyyzzzzzyxxwvvuuuvvwwwstttuuvvsvyywvvwvvvvvwwwuvvwwxxxwwwwxxxxxxxyyyxxxxyzz{{||~~}~„€~||~~€€€€}|{|}~}|}ƒ†…†ˆ„}~‚†ˆˆ‰‰ˆƒ}|}|}||€}zxw{€ƒƒƒ†ˆ‡€€€€€€€~~€€€€€€€€~~~~~€~~~~~€€‚€~}||||||{{{{{{z{|~€‚„………„„ƒƒƒ‚‚€‚‚€~~}~€€€~~~~}}~~}|{{}€ƒ‚‚‚ƒ„ƒ……‚€€‚‚‚‚‚‚‚‚ƒ„‚~{zzvuvyyy{€€€€€€€€€€€€€€€€€‡ƒ€‚ˆ‹ˆ‚„„„„„„„„ƒƒƒ„ƒ„ƒƒƒ€ƒ…††††††††……………………††††††††……………………‚ƒ„†ˆŠŒŒŽŽŽŽŽŽŽŽŽŽŽŽŽŒŒ‹‹‹Š‰ˆ‡‡‡‡‰‡†††…‚~‚†ˆˆ‡‡ˆ††…†…………ˆˆˆˆˆˆˆˆ…~{|zx{ƒ‚~xwwyxv|}}}||~€|yy{~}yvxzz{}‚‚€€‚ƒ‚‚‚‚ƒ‚ƒ‚ƒ‚ƒƒ„„„„„„ƒƒƒƒ„„ƒƒƒƒ„„…„„„ƒ……………………„„…†‡ˆˆ‰ˆ‰‰‰‰‰‰Š‰‰ˆ…‚‚€€€‚‚‚ƒ…„ƒƒ‚ƒƒƒ„„„…„………„„„„„…………‡ˆ‡„‚‚‚‚€€€‚€‚€‚‚ƒˆŠ‰ŠŠŠŠŠŠŠŠ€€€€€€€€€€€€€€€€}{||vmiknnnnnnnnmlllkkkjnpu{{wqppppooolmmnnoppmnnoppqqrrqonmlknsy{zwvvwwwvvvvvvvwwxxyywwwwxxxxxxyyyyxxxyyz{||}|}~~}~ƒ€~||~~€€€}|{|}}|{„‡††‡…|~ƒˆ‰ˆˆŠƒ}}}|~|}€‚~{yy}„‚ƒƒ‚€€€€€€€€€€€~~~~€~~}~~€€€~}||||}||{{{{{yz|}€ƒ„…„„„ƒƒƒ‚‚€‚‚‚€€~}~~~~}|}~€~}~~}|{{}€‚ƒ‚‚ƒ„„ƒ…†ƒ‚€‚‚‚‚‚‚‚‚€‚‚}zyywvwyyy{€€€€€€€€€€€€€€€€†ƒ‚„ˆ‰‡„„„„„„„„„„„…„…„…„ƒ‚€€‚…†††††††††‰‰‰‰‰‰‰‰ŠŠŠŠŠŠŠŠ‡‡‡‡‡‡‡‡ƒ„†ˆŠŒŽŽŽŽŽŽŽŽŽŽŽŽŽŽŒŒ‹‹Š‹Šˆ‡††††‰ˆ‡‡‡†‚€~‚†ˆˆ‡‡ˆ†††††………ˆˆˆˆˆˆˆˆ|yzyxy}„zwxyxw|}}}||~€|yy{~|xvy}~ƒƒ‚€€€‚ƒ€‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ„„„„„„ƒ‚‚ƒƒƒƒ‚‚„„………„„ƒ……………………„„…†‡ˆ‰‰ˆ‰‰‰‰‰‰Š‰‰ˆ…‚‚€€€‚‚‚ƒ…„ƒƒ‚‚ƒƒ„„„„…………ƒƒ„„„„………‡ˆ‡„‚‚‚‚‚‚€€‚€€‚€‚ƒƒˆ‹‰‰‰‰‰‰‰‰‰€€€€€€€€€€€€€€€€{z{zqhhnllllllllnmmmlllkkmsy~{xppponmmllmnpsuvwxxyzz{||{zxuromklry}|ywvyxxwvuttvvvvvvvvwwwwxxxxxxyyyyxxxyyz{|}}|}~~}~€ƒ€~||~~~€}|{|}}|{„‡‡††……z|ˆŠˆˆ‹ƒ}}}}~}„ƒ€|{z‚„}}}}~~~~~€€€€€€€€€~~€€~}}}~€€~~€~}|||||||{{{{{yy{}‚ƒ„„„ƒƒƒ‚‚‚€‚‚€}~€~~zz{{|~€~}~~|{{}€ƒƒ‚‚‚‚‚ƒ„…„†‡„‚‚‚‚‚‚‚‚‚‚‚‚€|zyyywxzyxz~€€€€€€€€€€€€€€€€„ƒ„‡ˆ†††……………………††††††††…„‚‚„†ˆ„„„„„„„„„„„„„„„„…………………………………………„…‡‰ŒŽ‘‹ŒŒŽŽŽŽŽŽŽŽŽŽŒŒ‹ŠŠŠ‹Šˆ‡††††Šˆ‡‡‡†ƒ€~†ˆˆ‡ˆˆ†††††††…ˆˆˆˆˆˆˆˆ~{xxxyyyƒ}ywwxy|}}|||~|yy{~{ww{€ƒ†‰ƒ‚€€‚ƒ€€€€€€€€€€€‚‚‚‚ƒ‚ƒ‚ƒ‚ƒƒ„„„„„„ƒƒƒƒ„„ƒƒƒ„„…………„„……………………„„…†‡ˆ‰Šˆ‰‰‰‰‰‰Šˆˆ‡…‚‚€€€‚‚‚ƒ„„ƒƒ‚‚ƒƒ„„„„…………ƒƒ„„„„………‡ˆ‡„‚‚‚‚ƒ‚€€‚€€‚ƒƒˆŠ‰‰‰‰‰‰‰‰‰€€€€€€€€€€€€€€€€}xtqonkhnnnmmkkjlmonmllmmqsuz}upppoonnmlnrv{‚ƒ€~|}€€~|~€|upmhmuyyyxyxxyyxxwwvvwwwwwwxxxwwxxxxxxyyyyyzzzz{{{{~~~€€€~~~~{|~~}€}}}zwwy€‡Š†…ˆ‡‚}z|…‹ˆ€zxz|}~}|{‚‚€~}|||†…zyz{~‚€~€‚~~~~~~~~~}~€€€€~~~~~~~}}}}}~}~~~~}|{{{||||{{{{{{yz|||}€‚……„„ƒ‚‚‚‚‚‚‚~~~~~~~~~~~~}~|{{}|{}€‚€‚‚€€‚ƒ……†…ƒ‚ƒƒƒƒƒ‚‚ƒ„„ƒƒ}{yyvtvwwz~€€€€€€€€€€€€€€€€†„ˆŒ‹……‹‡‡††††‡‡†††……„„„†…ƒ‚ƒ„ƒ„†††„€‚ƒƒƒƒ‚€‡†„‚‚‚‚‚}ˆˆƒ„‚„ˆŒŽŒŒŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒ‹‹‹ŠŠ††††††††††††…„ƒ‚‚„…‡‡‡‡††………††‡†‡‡†‰ŽŽ…|x|}yvxƒˆ‡}uw‚‹‡„}||~xyz|}€€}wtw€Š‘‡ƒ€€‚ƒ‚€€€€€€€€‚ƒƒ€‚ƒ‡†„‚‚ƒ„…„„„„„„„„ƒƒƒ„„„„„†…………„„„†††……„„„„……†‡ˆˆ‰ˆˆ‰‰ŠŠ‰‰‰ˆ‡…ƒ‚€€€€€‚‚‚‚ƒ…„„„„„„„„…„…„…„…„ƒƒ„„……††…†ˆ†„€‚‚€€€‚€€‚‚‚‚‚„†‰‹ŒŒŒ‹‹ŠŠŠ€€€€€€€€€€€€€€€€|xronnmkhjklkkkkijlmlkjjloqsx~ynnmmnoppmpsx}€ƒ„ƒ}|~}vplhmtyyyxyxxxxxxwwvwwwwwwxxxxwwxxxxxxxyyyyzzz{{{||~~~€€€~}~~|}~€~~}{{yvvx|„ˆ†…ˆ‡‚{wx}‚€|yyz|}~}|{‚€~}||{†…~yy{{~~€€€€€€€€€~€€€€~~~~~~~}}}~€}~~~~~~||{{||||{{z{{{y{|||}€‚……„„ƒ‚‚€€€€~~~~€€€€|~€€~}}~}|{}€‚€€‚„„………ƒ‚‚ƒƒƒƒ‚‚‚ƒ„ƒ‚€}{xwyvuvwwz~€€€€€€€€€€€€€€€€ƒ„‡Šˆ……‰‡‡††††‡‡ˆ‡†…„„……†…ƒ‚‚ƒ„†……„ƒƒƒƒƒƒƒƒ‚€€ƒ‚€€‚‚‚|€‡ˆ„…ƒ‚„ˆŒŒŒŒŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒ‹‹Š‰‰††††††††††††…„ƒ‚‚ƒ…†‡‡‡††………………†ˆ‰‰‹Žˆyzxuw}Љ‚ƒŠŠ‡ƒ€}}}~yzz{|}~~|vruˆ‹‹†ƒ€€‚ƒ‚€€€€€€€€€€‚ƒƒ€ƒ‡†„ƒ‚ƒ„…„„„„„„„„ƒƒƒ„„„„„…………„„„„†††……„„„„……†‡ˆˆ‰ˆˆ‰‰‰Š‰‰ˆˆ†…ƒ‚€€€€€‚‚‚‚€ƒ…„„„„„„„„„…„…„…„…ƒƒ„„……††…‡‡‡ƒ€‚€€€‚‚€€€‚„…ˆŠŒŒŒŒ‹‹‹ŠŠ€€€€€€€€€€€€€€€€|wpllmmlhijjiikmiikmnmkjklnov}€~sqolllmnoqv{‚„„ƒ€~~€€~||~~xpkhmuyzxyywwxxxwwvwwwwwwxxxxxwwxxxwwwxyzzzz{{{{|||~~~€€€~~~~}}~€€~{yyxuuw{‚‡…„…ƒ~yutwyxxzyz||}}||€€~~||{{€„‚}yz}|~€€‚€€~~~~€€~~~~~~~}~~€}}~~~~~}}{{{||||{{{{{{z{}||}€‚…„„ƒƒ‚€€€€€€€€~~~~€€€€€~|}}}||}‚‚€€ƒ…„……„ƒ‚‚ƒ‚ƒƒ‚‚‚ƒ„„ƒƒ€~{xwzwvwxxz~€€€€€€€€€€€€€€€€€…ˆ‡††‡‡‡‡‡†††‡‡‰ˆ†…„…†‡†…„‚‚‚ƒƒˆ†„‚‚ƒ…†„ƒƒ‚‚‚€€ƒ„‚‚|†ˆ…†„ƒ„‰ŒŒŒŒŽŽŽŽŽŒŒŒŒŽŒ‹‹Š‰ˆˆ††††††††††††…„ƒƒƒ…†‡‡‡‡†……„„„„†‰ŒŒŽŽ‰zxvv~‡Ž‘’ŒŽŽŒŠ†‚€€€zvy€†ˆ‡…ƒ€‚‚‚€‚ƒ‚€ƒ‡†…ƒƒƒ„„„„„„„„„„ƒƒ„„„„„„…„…„„„„„††…………„„„……†‡‡ˆ‰ˆˆ‰‰Š‰‰‰ˆ‡†„ƒ€€€€‚€‚€€ƒ…„„„„„„„„…„…„…„…„ƒƒ„„……††…†ˆ†„€‚€€‚ƒ€€€€€€€€‚ƒ…‡Š‹Œ‹‹‹‹ŠŠŠ€€€€€€€€€€€€€€€€}wojijiiklkiggjmiiikmnljijjmrywuqmkkklptx~„„„~}{}€~}~€‚€zqjhntyyyxywwwxwwwvwwwxwxxxxxxwwxxxvwwxyz{{{{{|||}}~~~€€€~}~~}~€€€€}yvwvutv|‚†„‚€|wxutuuuw{z{{||}|}~~}||{{z{}~}}~}~€€€€€€€€€€€‚€€}~~~~~~~~€~~~~~~}}}~~~~~~||{{||||{{z{{|{|}}|}€‚„„„ƒ‚‚‚‚‚ƒƒƒ‚‚~~~~~~~~~~~~}}}}}||~€ƒ‚€€‚„…„……„ƒ‚‚ƒ‚ƒƒƒ‚‚‚ƒ‡†…„~{z{xxyzy{~€€€€€€€€€€€€€€€€‡Š‡…‰Š‡ˆˆ‡‡†‡‡‡ˆˆ‡†††‡‡……„„ƒƒƒƒ††„ƒƒ„…†…„‚‚‡†„ƒ‚ƒƒ„‚ƒ€|~„ˆ‡‡…ƒ…‰ŒŒŒŒŒ‹‹‹‹ŒŒ‹Šˆ‡††††††††††…††††…„ƒ€ƒ…†‡††‡††……„……†‹‘‘’‘Žˆ{y{ˆ‘‘‘“ŠŒŠˆ…ƒƒƒƒ‡‡‡††………†…ƒƒ…†††„ƒ‚‚‚ƒƒƒƒƒƒƒƒ€‚ƒƒ€ƒ††……„„„„„„„…„…„„„„„„„…„…„„„„„„„„……………………„……†‡ˆˆ‰ˆ‰‰Š‰‰‰‰‡†…„ƒ‚€€€€€‚€€‚„„„„„„„„„„…„…„…„…„„„…„…………‡‡‡ƒ€‚€€ƒƒ€‚€€€€ƒ„†ˆŠŠŠŠŠŠŠ‰Š€€€€€€€€€€€€€€€€~xqkihgejkjihgikigggjjjiihhjnszzxtpnlllqtzƒ„„ƒ|{|„‡ˆ‡}~€ƒ‚|qhhmuyzxyyvwwwxwwwwwwwxxxxxxxwwxxxwxxyz{||||||}}}}~~~€€€~~~~~~€€€€}xtuvttv{‚~|xuwuuvutvz{{{{||}}}||||{{{ywvy~‚‚€€€~~}~}~}~}~~€€}~~~~~~~~~~}~~~~~}~~~||}}~~~~~}}{{{|||{{z{{|||}~}}}€‚„„ƒƒ‚‚ƒ„„ƒ‚~~~~~~~~~~~~~~}€€~}}~ƒƒ‚€‚„…„„…„‚‚‚‚ƒƒ‚‚‚ƒ†††„‚}{}{z|}{|€€€€€€€€€€€€€€€€€ˆŒˆ‡‹‰‰‰ˆ‡‡‡‡‡ˆˆ‰‰‰ˆ‡‡†††††…„„ƒ„†‡‡†…„†„‚€€€‚ƒ‹‰†ƒ~~‚„{|ƒˆ‰ˆ†……ŠŒŒŒŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹ŒŒ‹‹Š‰‡†………………………………†††…„„€ƒ„††††‡††††††‡‡’’““’Œ…ƒˆŽ’““’’•“މˆˆ‡‡‡ˆˆŠŠŠ‰‰‰ˆˆŒŽˆ„„…‚‚‚ƒ„„„„„„„„„ƒ„ƒ‚‚„†††††…„„…„…„…„……„„„„…„……„„„„…„…„……………………„……†‡‡ˆ‰‰‰‰‰Š‰‰ˆ†……ƒƒ€€€€‚€€€‚„ƒƒƒƒƒƒƒƒ…„…„…„…„„„„„……………†ˆ†„€‚€‚€ƒƒ€‚‚‚‚€€ƒ…‡ˆˆˆˆˆˆˆ‰ˆ€€€€€€€€€€€€€€€€}ytqomjggghiiihgjigghjjkhggjkmry|xrnjhptz€ƒ„‚€~}~ƒ‰Ž~~€„„~qghntyyyxyvwwxxxwwwwwxxxxxxxxwwxxxyyz{{||}||}}}~~~~~~€€€~}~~~~€€€}wstuutvwz|}{yxwvttvustw|{z{{|}~{{{{z{zzxusv|‚„ƒƒ‚‚ƒƒ~{{{{{{{{}|{}~€}}~}~}~}}~}}}}~~~~~}}}}}~|||}}~~~~~||{{||{{{{{{||}~~~}}‚„ƒƒ‚‚€€‚ƒƒ‚€~~~~€€€€~€~~}}ƒƒ‚€€‚ƒ…ƒ„„„‚‚‚ƒƒ‚‚‚ƒƒƒƒ}|}}€€~~€€€€€€€€€€€€€€€€€€†‰‰ˆŠ‹‹‹Š‰‰ˆˆˆˆ‡ˆŠ‹Š‰ˆ‡‡ˆˆ‰ˆ‡†…‚„†ˆˆ‡…„‡…‚€‚„‰‡ƒ{yww‚„‚{zˆ‹Š‡…‡ŠŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‰‰ˆ‡†……„……………………„……††…„„€‚„…†††‡‡†††‡‡ˆˆŽ“”’“’‘‹††ŠŽŽ“”‘‘’’‡ˆˆ‰‰ŠŠ‹ˆˆˆ‰‰‰‰‰‘“‘‹…‚‚‚‚‚€ƒ………………………ƒ„……ƒƒƒ…†††‡††„„……………………„„„…„………„…„……………„„…………††„……†‡ˆˆ‰‰‰‰Š‰‰ˆˆ……„ƒ‚‚€€€€‚€€„ƒƒƒƒƒƒƒƒ„…„…„…„…„„„…„…„……‡‡‡ƒ€‚€€€ƒ‚€‚‚‚‚€€€‚„†‡………††‡‡‡€€€€€€€€€€€€€€€€|zyyzwsokiggiihfjjjiiijkighjifjq}zupmosz€ƒƒ€~}}~‚ˆŽ~~€„†rfhmuyzxxywwxxxxxxwwxxxxxxxxxwwxxx{{{||}}}}}}~~~~~~~€€€~~~~~~~~€€}wrruuuvvwyyxwwxxustuttw|{zzz|~zzzzzzzzwvvvy}‚„…„ƒ„……‚{{{{{{{{zyy{~~}}}}}}}}|||||}~~~~~~}|||}}||||}}~~~}}{{{||{{{z{{||~~~}}€‚ƒƒƒ‚€€€ƒ„„‚€~~~~€€€€€€€~{~}}‚ƒƒ‚€‚‚„ƒ„„ƒ‚‚€‚ƒƒ‚‚‚‚‚‚€‚€€ƒ‚€€€€€€€€€€€€€€€€€~€„‡‡…‡ŠŒ‹‹Š‰‰‰‰ˆ‰Š‹‹Š‰‰‰Š‹‹‹‰ˆ†„……†‡‡‡‡‡…~~‚„†„€|ywvv‚…‚{y€ˆŒŠˆ†‡ŠŒŒŒŒŒŒ‹Œ‹‹‹‹‹‹ŠŠ‹ŒŒ‹Šˆ‡‡††……………………………„……††……„€‚ƒ…………‡‡††††††‰”“‘’“’‘Œ‹ŒŽŽŽ‘’‘‘ˆˆ‰ŠŠŠŠŠ‡ˆˆ‰Š‹ŒŒ‘’Š„€‚ƒ‚€€ƒ†††††††††„…‡†„„…†…†‡‡‡†„ƒ……………………„„„„……………………††††„„„……†††„……†‡ˆˆ‰‰‰Š‰‰‰ˆˆ„„„ƒ‚€€€€‚€€ƒƒƒƒƒƒƒƒƒ…„…„…„…„………„…„„„…†ˆ†„€‚€€‚‚€€‚‚€€€€‚ƒ…†ƒƒƒ„„………€€€€€€€€€€€€€€€€{{|€€{wtngegiiggijjhghiighjgcelpty~€~}nsz€ƒ‚}{z{~„‡ˆ‡~~€…‡€rfhmuyyyxywwxxyyxxwxxxxxxyxxxwwxxx||}}}}}}}}}~~~~~~€€€~~~~~~~~€€~wqruuuvxxxwustv{vstuuvy}|zzz|~yyyyzzzzwyyxvx…‡…ƒ„††ƒ{|{|{|{|xwwz}~}}}}}}}}|{{{{|}~~~~~}|{|||||||}}}}~~||{{||{{{{{{||~}}‚ƒƒƒ‚€€‚…††…‚~~~~~~~~~~~~}}~€‚‚€}~}‚„ƒ‚‚‚€‚ƒƒ„„ƒ‚‚€ƒƒ‚‚ƒ„„…„„ƒƒ‚„„€‚€€€€€€€€€€€€€€€€|{†…‚‰Œ‹ŠŠŠŠŠŠŠŠŠŠŠŠŠŠ‹ŒŒ‹‰‡‡†„„„†‰Šˆ…~}‚……ƒ€~{zzz‚…‚{y€ˆ‹ˆ†‡ŠŒŒŒŒŒ‹‹‹‹‹‹‹ŠŠŠŠ‹ŒŒ‹Š‡‡†††……………………………„„…†††…„€‚ƒ„………‡‡†……………Š”’‘““ŽŽŽŒŒŽ’’‘–˜”‰ŠŠ‹Š‰ˆˆ‰Š‹ŒŽ‘ŽŽ’”‘ˆ‚ƒ‚€€ƒ‡‡‡‡‡‡‡‡‡…†‡‡……†‡…†‡ˆˆ†„ƒ……………………„„„…………………†††‡‡‡„„„……†††„……†‡ˆˆ‰‰‰ŠŠ‰‰ˆˆ„„ƒƒ‚€€€‚€€€~ƒƒƒƒƒƒƒƒƒ„…„…„…„……………„„„„…‡‡†„€‚‚€€€‚€€€€€€€€€€ƒ„…‚‚ƒƒ„„„€€€€€€€€€€€€€€€€}{zz{|{zyxtnhegiggggggggcddefgghbgov}€€z|}~‚†„~~|{}€ƒ„„€~}‚ƒ€}}~~|zxxzxxxxxxxxxxxxxxxxwwxxyzzz{{{{||}~~~~€€€€€~}~~~~~|yvuuuuuwxxxxwvuuuuttuvvzzzyz{|}{{zyxwvvw}xvz€‚„†‡†‚~{{zyz{{{z~xv|€|z~~}}}~€|{}~|{||||||||||||{|}€€€€~~}}~~}}||{{{|}|z{}€€~~€‚…„ƒ‚€~}}„…„ƒ‚€}}~„†€€€~~}‚‚ƒƒƒ‚‚‚‚€€‚ƒƒ„…„ƒ‚ƒƒ„ƒƒ‚ƒ„…†………„‚€~}||||}‚€€€€€€€€€€€€€€€€~~~€‚…‡„†‰ŒŒ‹ŠŠŠŠŠŠŠŠ‰‰ˆ‡†…………„„„~ˆ‚€€€€~}€~{|€ƒ‚‚ƒ‡‹ŽŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹Œ‹Š‰ˆˆ‡††††………………†……„„„„„„…………€€‚†‡†…‡‡††††‡‡ŠŒ‘’‘’’ŽŽ‘‘Ž’’‹‰‰‰ŠŠ‡……†‰‹‘Œ‡‰’Žˆƒ‚‚‚‚ƒ„…†‡‰‰‡††‡‡ˆˆ†„ƒ…‡ˆˆ‡††…„„‡††††………††††††††……††††……„„„„„„„„„…†ˆ‰‰‰‰ˆˆ‰ŠŒ‹ˆ…„„ƒ‚‚€€‚‚€~}}~~~~~~‚‚‚ƒƒ„„„……………………„„„„„„„„ƒ„…„‚‚ƒ‚‚€€€€€‚‚‚€€‚„…†‹‡„„‡‰ˆ‡€€€€€€€€€€€€€€€€~~~~|wojptwwsnkijjjjjjjjmnnoppqqrtwyzywv{}}|€…„€zyx{~‚ƒƒ~~€ƒ„‚~}zwwyxxxxxxxxxxxxxxxxwwxxyzzz{{{{|}}~~~~€€€€~}~~~~~~|yvuuvuuwwxxwwvuvvuttuuv{{{{|~€~}|zywvvvz}|wux}ƒ…†…‚~{xwvvxxwv{vu|~}~}}}}~€€~zz|}|{||}|}|}|}}}||}~€€€€~~}}~~}}||{{{|||z{}€€~~€‚‚‚€~}}~€ƒ†‡ˆƒ‚€€‚~~}}}|}~€‚ƒ„‚‚‚‚€€‚ƒƒ„…„ƒ‚ƒƒ„„ƒƒƒ„……ƒ„„„ƒ‚€}zxy}…€€€€€€€€€€€€€€€€€€€ƒ‡ŠŒ††‡ˆ‰Š‹Œ‹‹‹‹‹‹‹‹‰‰‰‰‰‰‰‰†††††‡‡‡…„…†ƒ€…††…ƒ~~~{{~€€‚†‹ŽŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹ŒŒ‹Š‰ˆˆ††††††……………†……„„„„„„…………€€€‚…‡†…‡††……††‡ŠŒ’‘‘’’ŽŒŽŽ‘’‘ދЉ‰Š‰†„ƒ…‡Š‘‘ŠŒ’Šƒƒ‚‚‚„„…‡ˆŠŠˆˆ‡ˆˆ‰‰†ƒ‚„†ˆˆ‡‡……„„‡††††………††††††††……††††……„„„„„„„„„…†ˆ‰‰‰‰‰ˆ‰ŠŒ‹ˆ…‚‚‚‚ƒ‚‚€~~}||||||||€‚‚ƒƒ„„„„„„„„………………………††…‚€€‚‚€€€€€‚‚‚€‚ƒ…†„…‡ˆˆ†……€€€€€€€€€€€€€€€€{|}~~xqkpv}€}yusyyyyyyyyyzzz{{||~{yvtr~~|z}ƒ…‚xwvx}€‚‚~~~„…„‚€€~zwvwxxxxxxxxwwwwxwwwwxxyyzz{|{|{|}~~~~~~€€~}~~~~~|zwuuvvuwwwxwwvuvvuuuuvv}}}}~‚€~|zywwvxyxvuwy‚„„ƒ€}zvuttuvutuqrz€€€~}}|}~€}zy{}{z{}}}}}}}}~~}~~€€€€€~}}~~}}||{{{{|{{{}€€~€‚€€€~~}€~€ƒ†ˆ…………ƒ‚€€€€€€€€€~~}}|{{}~€ƒƒ‚‚‚‚€€‚ƒƒ„…„ƒ‚ƒƒƒ„……………„‚‚ƒ„„ƒ‚€~{y{}‚„€€€€€€€€€€€€€€€€€€€„‡‹‡…„ƒ„†ŠŒˆˆˆˆˆˆˆˆ„„„„„„„„ƒƒ„…†‡ˆˆ„„†ˆ†€~€‰‹‹‡‚}~‚‚€}zz|~}}€„ŠŽŒŒŒŒŒŒ‹‹‹Œ‹Œ‹Œ‹ŒŒ‹Š‰ˆˆ‡†††††………………………„„„„„„…………€€…‡‡†††…………††‰Œ‘’‘’’ŽŒ‹‹ŽŽ’’‘‘’‹ˆ‡††‡†„‚ƒ†‰ŒŽ‘Ž‘„ƒƒ‚ƒ„…†ˆ‰‹‹Š‰‰Š‹Œ‹ˆ„‚ƒ…ˆˆˆ††„„„‡††††……………………………„………†……„„„„„„„„„„…†ˆ‰‰‰‰‰‰‰Š‹Š‡„~~€ƒ„……‚€€~~||||||||~€€ƒƒƒƒƒƒƒƒ…„…„…„……†‡‡„€‚‚€€€€€‚‚‚€€€ƒ„…€„ˆˆ…‚ƒ…€€€€€€€€€€€€€€€€}||}~~|z|~~€ƒƒƒƒƒƒƒƒ€€€€€€€€‚~|zzzz€€}yz……{zxz|€€}~‚„………‚‚~zwvvxxwxwxxxwwwwwwwwxxxyzz{{|||||~~~~~~~€€~}~~~~~}zwuvvvvvwwxxwvvuuuuvwxy~~}~€€~|{zyxxwxxxxx€ƒƒ‚|zvuttuutsnlnw}}}|||}€}zy|}|{|~~}~}~~~€€€€€€~~}}~~}}||{{z{||z{~€‚‚~€‚€€€€€€„ƒ€€„…‡‡†„‚‚‚‚‚‚‚‚€€}~~€€‚‚ƒ‚‚‚‚€€‚ƒƒ„…„ƒ‚ƒƒƒ„…†††„„€‚„„…„„€‚‚‚€€€€€€€€€€€€€€€€~~~€ƒ†ˆ„ƒ‚‚‚„†‡ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„……††ƒƒ†Šˆ}}‡‹Œˆ€}~„‚|yyz{z{~ƒ‰ŒŒŒŒŒŒ‹Œ‹Œ‹Œ‹ŒŒ‹‹Š‰ˆ‡†††††…………………………„„„„„„…………‚€„‡‡††………„……†‰Œ‘‘‘‘’Ž‹‹ŒŽŽ‘““‘‘Œ‡ƒ‚‚ƒ……ƒƒ…ˆŠ‹Œ„„ƒƒƒ„…†ˆŠŒŒ‹‹‹ŒŽŠ†„…†ˆˆ‡‡……„„‡††††……………………………„„…………„„„„„„„„„„„…†ˆ‰‰‰‰Š‰‰Š‹‰…‚}~‚„„…‚‚€€~~~}}|}}~~‚ƒ‚ƒ‚ƒ‚‚„……„€‚‚€€€€€‚‚‚€€€‚ƒ„ƒ„„‚€ƒ†€€€€€€€€€€€€€€€€ƒ€}|~€‚‚||‚~~}~~yy„†‚}|~}|~€‚„„…†‚ƒ‚zwvwxxxxxxxxxwxwxwxwxxyyz{{{}|}|}~€~~~€€~}~~~~~}zwvvvvvvwxxxxwwttuvxz{}€~||{||€€~~}}{zyz{|{z‚‚€~|zvuttttsrjhltz|}€}||{|}~~{{}~}~~~~~~~€€€€€€€€~}}~~}}||{{y{|{{{~€‚ƒƒ~€‚‚‚‚‚‚‚ƒ„…„„ƒ€‚„†ˆ‡†ƒ‚……………………„„„ƒƒ‚‚‚‚‚‚‚‚‚‚€€‚ƒƒ„…„ƒ‚ƒƒ„„†††…„ƒ€ƒ„…………‚ƒ„………„„€€€€€€€€€€€€€€€€~}|}‚€‚ƒ„ƒ‚ƒƒƒƒƒƒƒƒ……„„ƒƒ‚‚ƒ‚…ŠŠƒ}|‚…ˆ…€}€ƒ„‚~{zzz{zz}‚‰ŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹Š‰ˆ‡†††††…………„„…………„„ƒ„„„„…………ƒ€€„†‡‡†……„………†‰‹‘‘‘Ž‹ŠŒŽŽ‘“’Žˆ‚€ƒ‡‡‡…‚ƒ…†ˆˆˆˆŒŽŒŽƒƒƒ‚ƒƒ……ˆŠŒŒ‹‹‹Œ‘‘‰‡‡‰ˆˆˆ††„„„‡††††……………………………ƒ„„„…„„ƒ„„„„„„„„„…†ˆ‰‰‰‰‹Š‰ŠŠˆ„€€‚‚‚€€€€~~}}}{|||}~~~€€€€€€€‚ƒƒ€‚ƒ‚‚€€€€€‚‚‚€€‚ƒ…‚€ƒƒ‚€€€€€€€€€€€€€€€€€~|}~~}}€~{xyz||||||||~~~}}|||~€€€‚zy~ƒ…‡„€~||~‚‚‚ƒ„‚‚{xxyxxxyxxxxxxxxxxxxxxyzz{{|}}}}}€€€~}~~~~~}{xvvwwvwxyyzyyxvvwxy|}~~|{z{{{€€€~}}}~~~}‚‚‚€~|{vussttsqkjnuyz{||{{{}~~{{~€€€€€€€€€€~~}}~~}}||{{yz{{{|~ƒ„ƒ‚€‚„„ƒƒ‚‚€‚…ˆ‰Šˆ‡ƒ„…††…„ƒ„„„„„„„„……„„ƒƒ‚‚„„ƒƒ‚€‚‚‚‚€€‚ƒƒ„…„ƒ‚ƒƒ„……………„ƒ‚ƒ……†……‡†„„ƒ…†‡€€€€€€€€€€€€€€€€‚}}~€~€‚…„ƒ€ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ……„ƒ‚€€‚ƒ‰Š„~~ƒƒ€„…}{{|||{|~ƒˆŒŒ‹ŒŒŒ‹‹‹‹‹‹‹Š‹Š‹‹‹ŠŠ‰ˆ‡††……†…………„„„„………„„ƒ„„„„…………ƒ~€‚†‡ˆ††…………††ˆ‹Ž‘‘‹ŠŠ‹ŒŒŽŒŠŠ†ƒƒƒ†‰Š‰ˆ‚ƒ„…††……‰‰ŠŠ‰‰‰Š‚‚‚‚ƒ„…†ˆŠ‹ŠŠŠ‹Œ‰‡ˆ‰ˆˆ‡‡……„„‡††††……………………………ƒƒ„„„„ƒƒ„„„„„„„„„…†ˆ‰‰‰‰‹ŠŠŠ‰‡ƒ€€€€€€~~}|{{zz{{||}}~~~€‚‚ƒ…‚‚€€€€€‚‚‚€€€‚‚€€‚……~€€€€€€€€€€€€€€€€|{{|~~|z}€€}zxx€€€€€€€€~~}|||}ƒƒ‚€~~|z~‚„†ƒ€~}|‚‚€‚€|yz{yyyyyyyyyyyyyyyyxyyz{{||~}}}~€€€€€€€€€€€~}~~~~~}{xvvwwwxyzz{{zzyyyz{|}~|{{{{|~~€€~~ƒ‚‚€~}|xwvuvvtsppsy{z{|{{{{|}~}{z}~€€€€€€€€€~}}~~}}||{{yz{{{|„„„‚€~€…„„‚€€€ƒ…‡ˆŠŠ‡†„ƒ‚‚‚‚€€€€€€€€‚‚‚€€€‚‚‚€‚‚‚‚€€‚ƒƒ„…„ƒ‚ƒƒ……„ƒƒƒ„„ƒƒ……†…„„†…„ƒƒƒ……€€€€€€€€€€€€€€€€‚~~‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚†‰†‚€‚‚ƒ„„}{}~~~€„‰‹ŒŠ‹‹‹‹‹‹ŠŠŠŠŠŠŠŠŠŠŠ‰‰ˆ‡†…………………„„„„„……„„ƒƒ„„„„…………„‚†ˆˆ‡††……††‡ˆ‹Ž‘‘ŽŠ‡‡ˆˆˆŠ‹‰‡‡ˆ†ƒ…„„…‡ˆ†„€ƒ„………………………………€‚ƒƒ…†‰‰‰ˆ‰Š‹Œ‹‰†…†ˆˆˆ‡††„„„‡††††………„„„„„„„„‚ƒƒ„„ƒƒ‚„„„„„„„„„…†ˆ‰‰‰‰Œ‹ŠŠ‰†‚~€€€€€€€€‚‚‚~}|{zzy|||}}~~~‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€ƒ‚‚€€€€€‚‚‚‚€‚ƒ„ƒ€€€€€€€€€€€€€€€€€}{{}~}|}€‚‚€}}~‚€~~}z}„…ƒ€~}‚}{~‚ƒ„~€}|‚‚~€|z{|yyyyyyyyyyyyyyyyyyyz{{||~~~~~€€€€€€€€€€€~}~~~~~~{xvwwwwyyz{||{{}||{{|}}yzz{}‚‚‚€~}}~€€~€ƒƒ‚€~}{zyxyxwvutw|}{||{{z{|}~|zy|~~}€€€€€€€€€€~€€€~~}}~~}}||{{xz{{{|‚„…„‚€„„ƒ€~}}€€‚…†‹‰…€||||||||€~~}}~~€€‚‚‚‚€€‚ƒƒ„…„ƒ‚ƒƒ†…„ƒ‚ƒƒ„„„…†……„ƒ€‚„……ƒ€€€€€€€€€€€€€€€€~}}}‚ƒ…ƒ‚„€€€€€€€€€€€€€€€€€‚‚ƒƒ‚~…‰‡„ƒ‚‚ƒ„„ƒ„€||~…‰‹‹Š‹‹‹‹ŠŠŠŠ‰‰‰‰‰‰‰‰Š‰ˆˆ††…„…………„„„„„„„…„„ƒƒ„„„„…………„~~‚†ˆ‰‡‡††††‡‡ˆ‹Ž‘‘ˆ…„…†††‡…ƒ„ˆˆ…„ƒ‚ƒ„ƒ€~€ƒ„………ƒ‚‚ƒ„‚€€€€‚ƒƒ…‡ˆˆˆˆ‰‡ˆˆ†ƒƒ„‡ˆˆ‡‡……„„‡††††………„„„„„„„„‚ƒƒ„ƒƒƒ‚„„„„„„„„„…†ˆ‰‰‰‰Œ‹Š‰‰†~€€€‚‚‚‚‚€~||{||}}~~ƒƒƒƒƒƒƒƒ„„„„„„„„‚ƒ‚€~‚‚€€€€€‚‚‚‚€€‚ƒ„‚ƒ†€€€€€€€€€€€€€€€€|}}~€„‚€~}~€ƒ}}}~~}{xvwz~€€‚ƒ€~~}}|€€€€€€€€‚‚‚‚ƒ…‡ˆ„ƒ‚~}|yz|}~~}}|{zyyyyyzzzzz{|}~}}}}~€€€€€~}}}}~‚€~|||}~|yvuvwxxxz}~~|||yzz{||}}~~~~~~~~€€€~€‚„„ƒ‚€~{{{zzyyyuwy{|}}}}}}}|||}}}}~€€€€~€~~}||||{{{{{{|||||€‚‚€€‚ƒ„„„„‚€€€€€‚‚†‡‰Šˆ…~€€}}~~€€‚‚‚‚€€‚ƒ„…†…ƒƒƒ„‚‚‚ƒ„„†††……………………‚‚…€€€€€€€€€€€€€€€€€€~}ƒƒ„……„„ƒ~~~}}}}}ƒ€}}}z€‚ƒ……ƒ‚€ƒƒ„„…†††€€‚‚‚|~€~|{|~~~„ˆ‹ŠŠ‰ˆ‡†……„†ˆ‰‰ˆˆˆ‰‰ˆ‡†……„„„„„„„„„††……„„ƒƒ„„ƒƒ„„……„‚€€ƒ†‰ˆ‡††…†††ŠŒŽŽŽŒˆ……††‡‡‡‡††………ƒƒƒƒƒƒƒƒ‚‚‚‚ƒ„††ˆ…ƒ„††ƒ~€‚‚‚„„……†‡‡ˆˆ‡†………†††‡ˆ†„‚ƒ„†††………„„ƒƒƒƒƒƒƒƒ„„„„„„„„„„„„„„„„…†‡ˆ‰‰‰‰‡ŠŒ‹ˆƒ}{}€ƒ„ƒ€€€€‚€€€€‚}|{{{|}~‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ„„ƒƒ‚‚‚‚€€„†…€€€€€€€€€€€€€€€€}~~~€‚~}~€~}{zz{||||}}|zxwx{~€€‚€~}}}€€€€€€€€€„…‡„ƒ‚€}}{|}~~~}||zzyyyy{{{{|}~~~~}~~~€€€€~}}}~~‚€~||}}~{yvuvwxxxz|~}{zzyyzz{||}}}}}}}}}€€~€€‚ƒƒ‚€~~|||{{zzzz{}~}}}}|||}}}}~€€€€€€€€€€€€€~}}||||{{{{{{|||}}€‚‚€€‚ƒƒ„„ƒ‚€€€€‚‚ƒ†††…„‚‚‚ƒƒ„„„‚‚‚‚‚‚‚‚€€€‚‚‚‚€€‚ƒ„………ƒƒƒ„ƒ‚‚‚€‚‚ƒƒƒ‚€ƒ„‚€€€€€€€€€€€€€€€€€~~‚€€‚‚€€€€~|{€ƒ„„ƒ€‚ƒƒ„„………‚‚‚‚‚‚‚‚~€€}|}€€€ƒ‡‰‹‰‰ˆ‡†…„„„†ˆ‰ˆˆ‡ˆˆˆ‡‡†…„„„„„„„„„„†………„„ƒƒ„„ƒƒƒ„……„ƒ€€ƒ†‰ˆ‡††…†††‹ŽŽŽŒˆ……††‡ˆˆˆˆ‡‡††‚‚‚‚ƒ„…†‡…ƒ„††‚~~€€‚ƒ„„„„………†…„ƒƒ„„…†‡ˆ†„‚ƒ„†††………„„ƒƒƒƒƒƒƒƒ„„„„„„„„„„„„„„„„…†‡ˆ‰‰‰‰ˆŠŒ‹†‚~}|~€ƒƒƒ€€€€‚€€€€‚~|{zz{{€€€€€‚‚‚€€€€€‚„€€€€€€€€€€€€€€€€~~}}}€€~}}}~||{{{|}~z{{{zywvy|~}~~~~}}|||€€€€€€€€~~€„…ƒ‚‚€~}~€€€}|{zzyzz|||||}~~~~~€€€€€€~~~~~~‚€~||}~~{ywvwxxxxz}}|zyyzzz{||}}~}~}~}~}€€€€€‚‚€~~}}}}|||||€€‚‚‚€}}}}|||}}}}~€€€€€€€€€€€€€€~}}}||||{{{{{||}}}}€ƒ‚€‚‚ƒƒƒƒ‚€€€€€‚‚}~ƒ„……‚‚ƒƒ„„„„………………………„„ƒ‚‚‚‚‚€€‚ƒ„……„ƒ‚ƒ„„ƒ‚€~~€‚ƒ„‚‚ƒ…„€|€€€€€€€€€€€€€€€€~‚‚€€~~‚‚‚€€€~€~}~~‚ƒƒƒƒ‚ƒƒ„„„„……„„ƒƒ‚‚„‚}€‚‚„†‡‡††…„ƒƒ‚ƒ…ˆˆˆ‡‡ˆ‡‡‡†…„„ƒ„„„„„„„„………„„„ƒƒ„„ƒƒ„„……„ƒ€ƒ†ˆˆ‡‡††…††‹‘ŽŽŒˆ……††‡‰‰‰ˆˆˆˆˆ€€€€€ƒ‚‚‚ƒ„………ƒ‚ƒ…„‚€‚ƒƒƒ‚‚‚‚‚ƒ‚‚‚ƒ„†‡ˆ†„‚ƒ„†††………„„„„„„„„„„„„„„„„„„„„„„„„„„…†‡ˆ‰‰‰‰Š‹Œ‰…€}|}~€‚ƒ‚€€€€‚€€€‚ƒ‚€~}|||€€€€€€€€~~€‚‚‚‚‚€€}}€ƒ†‡€€€€€€€€€€€€€€€€€€~|{zz~}}}|}}}zz{{|}}~{{zyxvuty{}}{yyz{{z{zzzz~~~~~}}|}}€ƒ‚‚‚€€€‚€€}}{{zzzz{{{{{|}~~€€€€~~‚€~||}~~~{ywwxxxxxz}~}|{{||}}~~~~€€€€€€€€€€€€€€€€€~~}}~~~~~~~~ƒƒ„„ƒ‚€€}}}}|||}}}}~€€€€€€€€€~~||}||||{{{{{{|}~~~€‚‚€€‚‚‚ƒƒ‚€€€‚‚~€€€€€€€€€ƒƒƒƒƒƒƒƒ„„ƒƒ‚‚‚‚‚‚€€‚ƒƒ„…„‚‚‚ƒ„„‚‚‚‚ƒ‚‚ƒƒ………ƒ…‡†‚€€€€€€€€€€€€€€€€€~~~†…ƒ€~}}}~~~~~~~}z|€…„„…………„„…†…†††††…„„ƒ€€ƒ……„€‚„ƒ€‚ƒ„„ƒƒ‚‚‚„†ˆ‡‡‡‡††……„„ƒƒ„„„„„„„„……„„„„„ƒ„„ƒƒƒ„………ƒ€€ƒ…ˆˆ‡††…†††‹Ž‘ŽŒ‡…„…††ˆˆˆˆ‡ˆ‡ˆ€€€€„ƒƒ‚ƒƒ„…ƒƒƒƒƒ€€€‚‚‚„ƒƒ‚€€€ƒ„…†‡ˆ†„‚ƒ„†††………„„„„„„„„„„„„„„„„„„„„„„„„„„…†‡ˆ‰‰‰‰‹‹Šˆ‚||~€‚‚‚€€€‚‚€€€‚‡†„‚‚‚ƒ‚ƒ‚ƒ‚‚€€€€€€€€€€€€‚‚‚‚€€‚€~€„‡‡…€€€€€€€€€€€€€€€€€}|zyx{{{||||{vwwxyyzz}|zxutrrwy{zyvwwxxxxxxyx{|||}}}~||{{}~‚‚‚‚ƒ‚‚ƒ‚‚€~}|{{z{{|{{{|}~~€€€€€€€€€~‚€~|}}~~~~~{yxxyyxwxz~€€€€€€ƒ‚ƒ‚ƒ‚ƒ‚€€‚‚€€€€€€€~~}}‚‚ƒ‚‚€}}}}}|||}}}}~€€€€€€€€€~~~~}||}||||{{{{{||~~€ƒ‚€‚€‚‚ƒ‚‚€€€€‚‚ƒ‚~}}}}~~~~€€€€€€€€€€€‚‚‚‚‚‚€€‚ƒƒ„…„ƒ‚ƒ„ƒƒ‚ƒ„…………………………‚ƒ€~ƒ€€€€€€€€€€€€€€€€}~}}€ƒ‰‡„~}}xyzz|}~~~|xw{„Šˆ‡‡‡‡‡‡ˆˆˆˆˆˆˆˆˆ‡†…„ƒ‚€…†‡…‚€‚„ƒ‚€€€‚‚€€€ƒ†‡‡‡‡‡†……„„„„ƒ„„„„„„„„„„„„„„„ƒ„„„ƒ„„……†„€‚…‡ˆ‡‡…†…††‹ŽŽŽŽ‹‡„„„……††††††††ƒƒƒƒƒƒƒƒ…„ƒƒ‚ƒƒ„‚‚‚‚ƒ‚€‚‚ƒ‚ƒƒƒƒ„ƒƒ‚€ƒ„†‡†‡ˆ†„‚ƒ„†††………„„„„„„„„„„ƒƒƒƒƒƒƒƒ„„„„„„„„…†‡ˆ‰‰‰‰‹Š‰…}}}‚€€€‚€€€‚……„ƒƒ„……„„„„„„„„‚‚‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚€€„ƒ„†Š‰…€€€€€€€€€€€€€€€€€~}zyxwxyz{|{{zwxyzzzyy|{yvutsswy{{ywwxwxxxxyyyz{{||}}}||{{|~€‚€‚ƒ„„„‚ƒƒƒ‚€~~||{{{{}}}}~€€€€~€€€€€~€~‚€~|}~~~~~{zxyyzxwx{‚‚‚‚‚‚‚‚‚‚‚‚ƒ„ƒ„ƒ„ƒƒ€€‚‚‚€€€€~~~~€€€€€}|}}}}|||}}}}~€€€€€€€€€€€€€~}||}||||{{{z{|}~€€€‚‚€€‚€‚‚‚€€€‚‚€€€€€€€€€€€€~~~~~~~~~~€€‚‚‚‚‚€€‚ƒƒ„„„‚‚ƒƒƒ‚ƒƒ„…†„„„„ƒƒƒƒ~{yz~‚„…€€€€€€€€€€€€€€€€}~||…Їƒ|{zzyzz||~~}yww}…Œ‰‰ˆ‡‡ˆ‰‰‰‰‰‰ˆˆˆˆˆˆ‡†…„ƒ‚†‡ˆ†‚€€ƒ‚€~~€€€€€€€€€ƒ…‡‡‡‡‡…………„„„„„„„„„„„„„„„„„„„„„„ƒƒƒ„……†„€€‚„‡ˆ‡††…†††ŠŒŽŽŠ…ƒ‚ƒ„„„„„„„…………†…†…†…………„ƒ‚‚‚ƒ‚‚ƒƒ‚ƒƒƒƒƒƒƒƒƒ‚‚€€~€€‚…‡ˆ†‡ˆ†„‚ƒ„†††………„„„„„„„„„„ƒƒƒƒƒƒƒƒ„„„„„„„„…†‡ˆ‰‰‰‰Š‰†ƒ~}~€€€€€€€€‚€€€‚€€€ƒƒ‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ…„„ƒ‚‚‚‚‚€€„†ˆ‹Šˆ‚~€€€€€€€€€€€€€€€€~}|zyxwvwy{{{zyz{|}}{zyyxwuuvwxy{}}|{{|zz{{||}}{{|}}~||||}‚€‚ƒ„††‚‚ƒƒ‚€~~}||{||~~}~~€€€~~~€€€~~~~~‚€~|}~~~~}{zyyzzywy|€‚ƒ‚‚ƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚€€‚‚‚‚‚‚€€€€~~~~€€€€~€€€~}}}}}|||}}}}~€€€€€€€€~}|}||||{{{z{|}~€€‚‚€‚‚‚‚€€€€‚‚~€‚ƒ„ƒ‚„ƒƒ‚‚‚€€€€€€€€‚‚‚‚€€‚ƒƒƒ„ƒ‚‚‚ƒ‚‚‚ƒƒ‚‚‚‚ƒƒƒƒ}}~‚……ƒ€€€€€€€€€€€€€€€€|€~{|†Š…€|zz{}}}|}||||zxx}†ˆˆ‡†……†‡ˆˆˆˆ‡††……††……„ƒ‚‚†‡ˆ…€€~~~€€€€€€€€€€‚…†‡†‡‡†…………„…„„„„„„„„„ƒƒƒ„„„„„„„ƒƒ„„……†„‚€€„†ˆ‡†††…††‰‹ŽŽŒˆ„‚‚ƒƒƒƒ„„„„……†††††††††…„ƒ‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚€€€~~}}}}~ƒ†‡†‡ˆ†„‚ƒ„†††………„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„…†‡ˆ‰‰‰‰ˆ‡…€}}‚€€€€€€€‚€€€€‚‚€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€‚…ˆˆ†ƒ€€€€€€€€€€€€€€€€€~}|{zyxxuvxz{zyxyz{{zywuvuuuvx{|{}€€~€}}}~€€||}~€€}|||}‚€‚„…†‡‚‚‚‚‚~~}|||||}}|}}~€€€~~~~€€€~~~}}~~‚€~|~~~~}}{zyyzzywz}€‚‚‚‚ƒ‚‚‚‚‚‚‚€€€€€€€€€€‚ƒƒ‚‚‚€€€€€~~€€€€~€€€}}}}|||}}}}~€€€€~~}|}||||{{{z{|}~€€‚‚€€‚~€‚‚€€€‚‚€‚„‡†„„„ƒƒ‚‚„„„„„„„„ƒ‚‚€€‚‚‚‚€€‚ƒ‚ƒ„ƒ‚‚ƒ‚€€€€€‚ƒ„……„‡‰‰†ƒ‚ƒ€€€€€€€€€€€€€€€€|~€}z{‡‘ˆƒ}}}}|{zyxyww{……„‡†„ƒƒ„†‡††……„„ƒƒƒƒ‚€€€†‡‡…~~€€~}}~€€€€€€‚„††††‡††………………„„„„„„„„ƒƒƒƒ„„„„„„ƒƒƒ„……‡…‚€€„†ˆ‡††…†††‰‹ŽŒŒŒ‹ˆ„‚‚ƒƒ„„………†……………………††„ƒ‚‚‚‚‚ƒ„ƒƒ‚ƒ€€€€~~}}}}||zz{|‚„††‡ˆ†„‚ƒ„†††………„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„…†‡ˆ‰‰‰‰‡†ƒ}}€ƒ‚€€€€€€€€‚€€€€‚…„‚€€€€€€€€€€€€€€€€~€€‚‚‚‚€€€ƒ†…€€€€€€€€€€€€€€€€€~ysrw|tvy{}|{zzzyyxxwwttuvwxxyz{|}}}}}}}|||}~~xyz{}€€|}}{z|€ƒ€€€~~~~~}||}~~~~~~~€~€~~€€€€€~€~}€~|}~}ywvvvy|€‚‚‚‚€€€‚ƒƒ€€€€€€€~€€€€€€€€€~~~€€‚€~}}}||~}||}}~~€€€€€€€~~~~~}}}}~}|{zz{{|}‚ƒƒƒ€€~~€€ƒ€€~|‚‚‚‚‚‚‚‚„„„„„„„„ƒƒƒƒƒƒƒƒ‚‚ƒ„…ƒ„ƒ‚€€ƒ„……„ƒ‚ƒ„€€€|}~‚ƒ„ƒ†‡„€€€€€€€€€€€€€€€€€}|yw{€’•‹~{{|€~}}|{{vx{‚„†‡†††……„„„ƒƒ„………„„…†††…„‚‚„ƒ‚ƒ…„‚€‚‚‚‚€€‚„„‚€€€‚…†…ƒ…„…„…„…„††……„„ƒƒ„„„……„„„ƒ„„„„„„…‡†„~~‚…‰‡……‡ˆ‡†ˆ‹ŽŒ‡†„‚€‚………††‡ˆ‰‰‡‡‡††………‚‚€€~~~~~~~~}}}}}}}}|||{{{zz|zxy~ƒ‡ˆˆ‡…„„„…………„„„…††„ƒ„ƒ„ƒ„ƒƒƒ„„„„ƒƒ„………………†‡‡ˆ‰ŠŠ‰‰ˆ„€€}~~€‚€‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€‚ƒƒ€‚„€~~~€€€‚‚‚€€€€€€€€€€€€€€€€~~|wssvytuxz{{zzzzyyxxwwtuuvwxyyxyz||}||~}}|||||{|||}}~~|}}{z{‚€€~~}}~~}}}}}~~~~~~~€~~€€€€€~€~}€€~}}~|yvvvvx|€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€‚€~}}}||~}||}}~~€€€€€€€€~~~~}}}}}}|{z{{{|}‚ƒ‚‚€€€~‚€€€€€€€€‚‚‚‚‚‚‚‚€€€‚ƒ„ƒƒƒ‚€€‚ƒ„…„ƒ‚‚„‚‚‚‚‚ƒƒƒ„„„„ƒ…†„€|{|€€€€€€€€€€€€€€€€€~|{xvx}Œˆ|z{|€||{{zyyy€‚…†‡ˆˆ………„„ƒƒƒ„„„………„„††……„ƒ‚„ƒ‚ƒ…„‚‚ƒ„„„„ƒ‚‚ƒ…††…ƒ‚€€‚„†…ƒ„…„…„…„…………„„„ƒƒ„„„……„„„ƒ„„„„„„…‡†„~‚…‰‡……‡ˆ‡†‰ŒŽ‘Œˆ‚‚‚ƒƒ€€ƒƒƒƒƒƒƒƒ€€~~~~~~~~~~~~~}}}}}}}}|||{{{zz|zxz~„‡ˆ‡‡…„„„„…†……„„„……ƒ„ƒ„ƒ„ƒ„ƒƒ„„„„ƒƒ„„…………††‡ˆˆ‰ŠŠ‰‰ˆ…€€€~~~€€€~€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€‚ƒƒ‚„‚‚€€€‚~‚„„…€€€€€€€€€€€€€€€€~|yvttuvstvxyyyxzyyyxwwwtuuvwxyyyy{{||||}}||{{{z~~~}}||}}}{zz~€€€€€€€€~~~}}}|}}}}}}}}~~~~~~~€~€€€€~€~|}~~~{xvuvux{~~~~~€€€€€€€€€€€€€€€€€€€€€€€€‚€~}}}||~}||}}~~€€€€€€€€€€~~~~}}}}}||{{{{||}€‚‚‚‚€€€~€ƒ„ƒ‚~~~~~~~~€€€€€€€€€€€€‚ƒ‚‚‚€‚ƒ„…„ƒ‚‚ƒƒƒƒ‚‚‚‚ƒƒ‚‚‚}ywyz€€€€€€€€€€€€€€€€}{zwtuy…Š„{z|}}}}}||{{†‡ˆˆ‰ˆ‡‡„„„„„ƒƒƒ……………………††…„ƒ‚„ƒ‚ƒ…„‚‚‚ƒ„„ƒ‚‚ƒ„…††…„ƒ‚€€„……ƒ…„…„…„…„……„„„ƒƒƒ„„„……„„„ƒ„„„„„„…††…‚„ˆ‡††‡ˆˆ‡Š‘‘މƒ€€€~}}~~~}}}}|}}}}||||}}}}~}}}}}}}}}}}|||{{{zz|zyz€„‡ˆ‡†…„ƒ„„…††…„„„„„„ƒ„ƒ„ƒ„ƒƒƒ„„„„ƒƒ„„„……†††‡ˆ‰‰Š‰‰‰ˆ…€€€€€€~~~~}~~~€€€‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚ƒ„ƒ‚€‚ƒƒƒ‚‚‚ƒ„€€‚ƒ†‡‰Š€€€€€€€€€€€€€€€€|xwvwutsstuvvvvxxxwwvvvtuuvwxyyz{{|{{zzyzz|||||~~~~~~~~}{yz|€€€€€€€€~~}}|||||}}~~~}}~~~~~~~€€€€~€~{|~~~~~ywuuuuwz~~~~~~€€€€€€€€€€€€€€€€€€€€€€€‚€€~}}}||~}||}}~~€€€€€€€€€€‚~~~~}}}}||{{z{{||}~€€€€‚€ƒ„ƒ‚~~~~~~~~~~~€€€‚ƒ„„„‚‚‚ƒƒƒ‚‚‚‚‚€€€{|{ywx|€€€€€€€€€€€€€€€€}{{yutv€‡„}‚…„„„„„„„ƒ‡‡ˆˆ‡‡…„……………………‡†……„………††„ƒ€€€„ƒ‚ƒ…„‚€€‚‚‚‚‚‚‚‚ƒ€ƒ…„ƒ„…„…„…„…„„„„ƒƒƒƒ„„„……„„„ƒ„„„„„„……†…ƒ€ƒˆ‡††‡ˆˆˆŒŽ‘’’ŽŠ…‚~~}~~~||{{~~}}}}||}}}}}}}}}}}}}}}}}}}}}}}}|||{{{zz{zy|€…‡‡‡†„ƒƒƒ„„‡†…„ƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒƒƒ„„……†††ˆˆ‰Š‰‰ˆˆˆ†‚€€€€€€€€€€~}||}}}}}~€‚‚‚‚‚‚‚‚„„„„„„„„„„„„„„„„‚„…„‚ƒƒ‚‚„„……†‡ˆŠ‹‹€€€€€€€€€€€€€€€€€}zyzyvsrrrrssttvvvuuttssttuvwxxzzzyywvuuvy{~~||}€‚ƒ~zxx{~~~~}}|||||~~}|}}~}~~~~~~~€€€€~€~{|}~~~xvuuvuwz~~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚~}}}||~}||}}~~€€€€€€€€€€‚~~~~}}}}|{{z{{|||}€€€€€„ƒƒƒ€€€€€€€€~~~~~~~~~~}~€€€‚ƒƒ„ƒ‚‚ƒ‚€€€€ƒƒƒƒ„„„„}{|„€€€€€€€€€€€€€€€€€}|}{wuvˆ‡‚…‡‡Š‰‰‰‰‰ŠŠŠ††‡‡ˆ††…††‡‡‡‡‡‡‡†…ƒƒƒ„…‡…ƒ~„ƒ‚ƒ…„‚~€€~„‚€€‚„„„…„…„…„…„„„„„ƒƒƒƒ„„„……„„„ƒ„„„„„„…………ƒ‚‡‡‡‡‡ˆ‰Š‘‘’’‹ƒ€~~~~~~~~~}~}}|||||||}}}}}}}}}}}|}|}}}}}}}}}}|||{{{zz{zz}‚…‡‡†…„ƒ‚ƒƒ„‡†…„ƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„„ƒƒ„……†‡‡ˆˆ‰‰Š‰ˆˆˆ†„€~}€€€€€€€€‚~}||~}|||}€‚‚‚‚‚‚‚‚„„„„„„„„„„„„„„„„ƒ…†„‚‚ƒ€€€€ƒ„‡‡‡†††††€€€€€€€€€€€€€€€€}{{{zvsrqpooprssssrrqqqrrstuuvwwwwwutrrrux|yz|„†‡}{wwy|~~}}||{|~€~|{|||}}~}~~~~}~~~€€€€€~€~|||}~}|xutvvvwz}~€€€€€€€€€€€€€€€€€€€€€€€~€€‚€€~}}}||~}||}}~~€€€€€€€€€~~~~}}}}|{{{{||}|}~€€€€€~~~€…ƒ‚‚€~‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚~}~~€€€€‚ƒ‚ƒ„ƒ‚€€€€€€‚‚‚†‡‡„€‚„€€€€€€€€€€€€€€€€€}|~~zwv‰Š‡ŠŒ‹‰‰‰‰ŠŠ‹‹‡ˆ‰ŠŠŠ‰ˆ‡‡‡ˆˆˆˆˆˆ†„‚‚ƒ„‡†‚}}~~„ƒ‚ƒ…„‚€‚ƒƒ‚€ƒ‚‚ƒ†ƒ€ƒ„„„…„…„…„…„„„„„„„„„„„……„„„ƒ„„„„„„…„…†„€€‚†‡ˆ‡‡ˆ‰‹‘‘’Œƒ€~€~}|~~~~}}}}|}|}||||}}}}}}}}}}}}}}}}}}}}|||{{{zz{z{ƒ‡‡‡†…„‚‚‚ƒƒ†…„ƒƒƒƒƒƒ„ƒ„ƒ„ƒ„„„ƒƒƒƒ„„ƒƒ„„…†‡‡‰‰‰Š‰‰ˆ‡ˆ‡„}}~€€€€‚‚€~}}}|{|}€‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ„„„„„„„„„††…‚ƒ€€‚ƒ„…„„ƒ‚€€€€€€€€€€€€€€€€€€|||{zxurrpommnpqqppoonnnppqrstuuuuvvvutssuy}€‚yz|‚…‡‰€€~zwvx{~~~~~~~~€~~~}z|€€~|z{{||||}}~~}~~~~€€~€€€€~€~~}|}~~|zwuuvwvxz~~€€€€€€€€€€€€€€€~~~~~€€€€‚€~}}}||~}||}}~~€€€€€€€~~~~}}}}{{{z{|}}}}~€~~~}}}~‚€‚€‚‚‚‚€€€€€€€€~~€‚€‚€ƒ„‚ƒ„ƒ€‚‚‚‚€€~~~}}}}„†…‚€€€€€€€€€€€€€€€€€€~{|{wv~‰Œ‰‹Œˆˆˆ‰ŠŠ‹‹‰Š‹‹‹Š‰ˆ†‡‡‡ˆˆˆˆˆ†ƒ€€‚ƒˆ…‚~||}~„ƒ‚ƒ…„‚€‚‚‚‚€‚~~‚‡„€€ƒ„„…„…„…„…„„„„„„„„„„„„……„„„ƒ„„„„„„…ƒ…†…‚€€†‡ˆˆ‡ˆŠŒ‘’Œ…€}}~~}}}}~~~~~~~~~~~~~~||||}}}}}}}}}}}}}}}}}}}}|||{{{zzzz|„‡‡†…„ƒ‚‚‚‚ƒ…„„ƒƒƒ„„„ƒ„ƒ„ƒ„ƒ„„ƒƒƒƒ„„‚ƒƒ„†‡‡ˆ‰‰ŠŠ‰ˆˆ‡‡‡†}|~€‚‚‚€€€~|{|~€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ…†‡…ƒ‚ƒ€‚ƒ…†„„„ƒƒƒ‚‚€€€€€€€€€€€€€€€€z{{{yvsqqpnllmopoonnmmlloopqrsstuuvxxxxwtw{€z{}€ƒ…‡ˆ€€~zvvxz~~~~~~~~€€€~~~z|€€|z{{{{||||~~~~}~~~~€€~€€€€~€~}|}~~{ywuuwwwx{~~~~~~~~~€€€€€~€€€€€~~~~~~~~~~€€‚€~}}}||~}||}}~~€€€€€~~~~}}}}{{zz{|}~}}~~~~~}||}~~~}~‚€€€€€€€€€€€€€€€€€€€‚‚‚‚ƒ…‚ƒƒƒ€‚ƒƒƒ‚‚‚ƒƒ‚€~}|uy~€}}~€€€€€€€€€€€€€€€€|zz~{wu}‰ŒŠŠ‹ˆ‰‰Š‹‹ŒŒŠŠ‹‹Š‰‡†…†††‡‡ˆˆ‡…‚€‚ˆ…}{{|}„ƒ‚ƒ…„‚}~€€~}~|{{|~‡„€~€‚„„„…„…„…„…„„„„…………„„„……„„„ƒ„„„„„„…ƒ…†…‚€€†‡‰ˆ‡ˆŠ‘’Œ…€}}~}}|||}}}}}|}}}}}}}}}}}}~~~}}}}}}}}}}}}}}}}|||{{{zzzz|€„‡‡†…„ƒ‚‚‚ƒ„ƒƒƒƒ„„…ƒ„ƒ„ƒ„ƒ„„„ƒƒƒƒ„„‚‚ƒ„†‡‡ˆ‰‰ŠŠ‰ˆ‡‡‡ˆ†‚}{}€‚‚‚‚}{|~ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚†‡‡†ƒƒƒ‚‚ƒ„…‡ˆ…††‡‡ˆ‰‰€€€€€€€€€€€€€€€€|zwwvtpmlmpqqoljkoollnolllmnopqquuttssrrrtw{}~~~yyz|€~}}|wtx}~€€}||}}~~}}|~~}}||}}}}}}}}~~~~~~~~}}}}~‚|||{zxwvvvvuvwxx€€~~~€€€€€€€€€€€~~~~~~€~~~€€‚~}}}}~~‚‚€~}}}~~~~~~€~~€€€€€€€~}|{{zzzzz{}~|}~€€}}~~~~€€~|z}~€‚‚}€€€‚‚‚‚‚€€‚……„ƒ€€€~€€‚ƒ„ƒ„…ƒ‚€‚…ƒ‚‚ƒƒ‚„ƒƒ€~}~~€€€€€€€€€€€€€€€€€|ww{{wvz„ˆ„|€Œ…‹‰ˆŠŒ‹Š‰Œ‹Š‰‰‰‰‰ˆ‡‡††‡‡‡†…„ƒƒƒƒˆ‡…~}~€„‚€‚…†ƒ||||||||yz{{z{}€‚‚‚ƒƒƒ…………„„„„ƒƒƒ„„………††††††††„„………††††††…„‚€„‡‰ˆŠŽŽŒŽŽŽŽ‹ƒ~|~}}~~~}}~}}}}}|||}}}}}~~~~~~~~~~~~}}}}~}}|||{{{xz~‚„……„…ƒ€‚‚€„„ƒƒƒƒ„„„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ‚‚ƒ…†‡ˆ‰ŠŠ‹Š‰ˆ†…ˆ†ƒ€€€€€€€€~€ƒ„ƒƒ‚‚‚‚ƒƒ‚ƒ„ƒ‚‚ƒ„ƒƒ‚…††…ƒ‚ƒƒ€ƒ………††††‡‡‡‡€€€€€€€€€€€€€€€€zxwwyyvtqrtutrommopmmoomoopqrsttttssrrqqqsvyz{zzxwwy{|zy}}|{wux}~€€}||}}~~~}}~~~}}}|}}}}}}}}}}}}}}}}}}}}~‚|||{zxwvvvvvvwwx~€~~~~€€€€€€€€€€€~~~~~~~~€€€‚~}}}}~~€‚€~}}}~~~~~~~~€€€€€€~}||{z{zzz{}~€|}~€€€}}~~~~€€~|{|}€€‚‚ƒ‚‚€€€€€‚ƒ„ƒ‚€~€€€€€ƒƒƒ„„„‚‚‚‚‚ƒƒ‚€€€€€€€€€€€€€€€€€€€€€}urwzywxƒz}‡‹ˆŒŠˆ‰‹Œ‹ŠŒ‹Š‰ˆˆˆˆŠŠ‰‰ˆˆ‰‰‡†…„ƒƒƒ„‰ˆ‡ƒ€ƒ„‚‚„…‚||||||||y{{{z{}€‚‚‚ƒƒƒ…………„„„„ƒƒƒ„„……………………………„„„……………†††…„‚€ƒ‡‰‰‹ŽŒŽŽŽ‘ŽŠƒ~€€~}~~}}}~~~~~~}}}}}}}}~~~~~~~~~~~~~}}}}~~}}||{{{{x{~‚„……„„‚€€ƒ‚‚„„ƒƒƒƒ„„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„‚ƒ„…†ˆˆ‰ŠŠŠŠ‰ˆ†…‡…‚~~€€€€€‚‚‚€‚ƒ‚‚‚‚ƒ‚ƒ„ƒ‚‚ƒ„ƒƒ‚‚‚„††…‚‚ƒƒ€ƒ…………††††‡‡‡€€€€€€€€€€€€€€€€|yxyxuswxyyxvsqnoonnoonppqrstuurrstuvwwrsvwyyxw|{{|~~|z|{{zxux}€€€~~}}}~~~}}}~~~~}}}}}}}}}}}}||||||||}}}}~‚}||zyxwvvvvuvvxx|}~~~~~€€€€€€€€€€€~~~~~~~~€€‚~}}}}~~‚‚€~}}~~~~~~~~~~~€€€€€~~}}|{{{{{z|}€|}~€}}~~~~€€€~}~}}~‚ƒ‚‚ƒ‚‚~€€‚€€‚‚€€€€€€‚ƒƒ„…ƒ‚€‚€€‚€€€€€€€€€€€€€€€€€€vqsyzxw~}zxy~…ŠŒŠ‰Š‹Œ‹‹Š‰ˆ‡‡‡‡‰‰ˆ‡‡‡ˆˆˆ‡†…„„„„‡‡†ƒƒ…„‚‚„„~||||||||z{|{{{~€‚‚ƒƒƒƒ………„„„„ƒƒƒ„„„„……„„…„…„…„ƒƒ„„„„……†††…„‚€ƒ†‰‰‹‹Ž‘‘މ‚~€~~~}}}}~~~~~}}}}}}}}}~~~~~~~~~~~~}}}}~~}}|||{{{y{‚…………‚€‚ƒ„ƒ„„ƒƒƒƒ„„„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒƒƒ„…‡‡ˆ‰‰ŠŠŠ‰‡†…†„}}~€€€€‚ƒƒ„„ƒ‚€€€‚‚‚‚‚ƒƒƒ‚‚‚ƒ„ƒƒ‚‚‚‚ƒ„…†„‚‚ƒ€€ƒ……„……†…††††€€€€€€€€€€€€€€€€|yvuvwut{{|{zwutnnmmnonmnooqqsstqqrrrrssstvwxyyy{zz|~~}{zyy{ywy}€€~~}}}~~~~}}~~~~}}}}~~~~~~~~}}}}}}}}}}}}~‚~}{zxwwwvvuvvwwx|}~~~€€€€~~~~~~~€€€€‚~}}}}~~€‚€~~~~~~~~~~~~€€€€~~~}}||{{{{{{|~€|}~€€€}}~~~€€€€€‚~~€‚ƒ€€~€‚‚‚‚ƒ€‚‚€€ƒ€€€€€€‚ƒƒ„„„‚‚‚€€ƒ€€€‚ƒƒƒ€€€€€€€€€€€€€€€€€€„~yxyzyy~zwwuv~ˆ‹‰‰Œ‹Š‰ˆ‡‡ˆˆ‰ˆ‡‡†‡‡‡ˆ‡†…„„…………„€‚…„ƒ‚ƒƒƒ€~||||||||z{||{|~‚‚ƒƒƒ……„„„„ƒƒ„„„„„„„„„„ƒ„ƒ„ƒ„ƒƒƒƒƒ„„„††††„‚€†‰ŠŒŠŽ’““މ€~~~}}}~}||}}}}}}|||}}}}}}}}}}}}}}}}~}}}}}}~}}||{{{{y{ƒ…††…~}„…„„„ƒƒƒƒ„„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„„„…†‡ˆˆ‰‰‰‰Šˆ‡…„†„~|}~~€€€€‚‚€€‚ƒ‚€‚‚ƒƒƒ‚‚‚ƒ„ƒƒƒ‚ƒƒƒ„……„‚‚‚€‚……„……………†††€€€€€€€€€€€€€€€€nllnswzz{{{zyxvunlkmnnmlnnooqqrsrrqqqpppqrtvwyyzxxx{~~|zxyz{y{~€€~~~~~}}~~~~}}}}}~~~~~~~~~~~~}}}}~‚€~|yxvwwvvvuvvxx|}€€€€€~~~~~~~€€€€‚~}}}}~~‚‚€~~~~~~~~~€€€~~~}}}}||||||{}~€|}~€}}~~~€‚‚‡…‚€€€€€€‚‚ƒƒ„ƒ‚€‚ƒƒ€‚ƒ‚€€€‚‚ƒ„…ƒ‚€‚‚ƒ„ƒ€‚€€ƒƒ„„‚ƒƒƒƒ‚€€€€€€€€€€€€€€€€ˆ‰‡|z|~€zwwtrxƒ‹‰‰ŒŒŒŒŠ‰‰‰‰‰‹ŠŠ‰‰‰‰‰‰ˆ‡†………………„‚€€‚…„„ƒ‚‚}||||||||z{}|||‚‚ƒƒƒƒ„„„ƒ„ƒƒƒ„„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒ„„„„†††…„‚€€…‰Š‹Ž’’”“‰~~~}}}~}||}}}}}}|||}}}}}}}}}}}}}}}}}}}}}}}}}|}||{{{y|€ƒ††††}}~„…„„„ƒƒƒƒ„„„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ……††‡ˆˆˆ‰‰‰‰ˆ†…„†„~|}~~€€€€‚‚~}}}}}}€„…‚€‚‚ƒƒ‚‚ƒƒƒƒ‚ƒƒƒ„ƒ„…ƒ‚€‚‚€‚„„„„„…„…………€€€€€€€€€€€€€€€€mjhjnsuvzzyyxxxxplkmoomloopqrsttsrrrrrqqpqrtuwxyvvwy}~}|yxx||||€~}~~}~~~~}}}}~~~~~~~~~~~~€€€€€€€€}}}}~‚|ywvvwvvuvvwwx}~€€€€€€€€€€€€€€€€~~~€€€‚~}}}}~~€‚€~~~~~€~€€~~}}}}|}|}||||}€|}~€€€}}~~~€€‚„…Šˆ†„‚€€‚ƒƒƒ‚‚‚ƒƒ„ƒƒ€€ƒƒ‚€€‚„ƒ‚€€€‚ƒ„„„‚„„„„‚‚‚‚‚‚ƒ„„ƒ„„……………€€€€€€€€€€€€€€€€ˆ‘Š€‚|yzwtw~ˆŽŠ‰ŒŠŒ‹Š‰‰‰‰ŠŠ‰‰ˆ‰‰‰Š‰ˆ†††††‰ˆ‡„‚‚„†„„„ƒ€}|||||||||{|}}|}‚‚ƒƒƒ„„„„ƒƒƒƒ……„„„„ƒƒƒ„ƒ„ƒ„ƒƒƒƒƒ„„………††††„‚€„ˆ‹‘‘’“”‹ƒ}~~~~~~}}}}~~~~~}}}~~}}}}}}}}}}}}}}|}}}}}}|}}||{{{{z|€„†‡‡†}|~€ƒ„„„„ƒƒƒƒ„„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„†††‡‡ˆˆˆˆˆˆ‰‡†„ƒ†„}}~€€€‚‚‚‚‚€}|{{zzz|~ƒ…‚‚‚‚‚ƒ‚‚ƒƒ‚‚‚‚ƒƒ„ƒ„…„€€€~„„ƒƒ„„„„………€€€€€€€€€€€€€€€€sojikmooyyxxyzz{rmkorpnnppqrstuuutsrponmrrstuvwxsssuxyxvywx|~}~€€}}}~~~~~|}}}~~~~~~~~~~~}}}}~‚‚|xvvvwvvvuvwxx}~€€€€€€€€€€€€€~~~€€‚~}}}}~~‚‚€~~~~~€€€€~~}}}}}}}}}|||}‚|}~€€}}~~~€ƒ…‡‰‰ˆ‡†ƒ€€€‚ƒƒƒƒ‚ƒƒƒƒ‚‚‚‚ƒƒ‚€ƒ„„ƒ‚€€€€ƒ„…ƒ‚€‚„ƒƒƒƒƒƒ‚‚‚‚‚ƒƒƒƒ‚ƒ„„…„„„€€€€€€€€€€€€€€€€…‘Œˆ‡…‚}{||{z{…Œ‹‰ŒŒˆŒ‹Š‰ˆˆˆ‰‰‰ˆ‡‡‡ˆˆŠ‰ˆ‡†††‡ŠŠˆ…‚ƒ………„ƒ~}|||||||||{|}}|}‚‚‚ƒƒƒƒ„„„ƒƒƒƒ‚………„„ƒƒƒ„„„„„„„„„„„„…………†††…„‚€~ƒ‰‹Ž‘‘’‘’“‘„|}}~~}~~}}}~~~~~~}}}~~~}}}}}}}}}}}}}||}~~}||}}|||{{{z}€„†‡‡†~}}€‚ƒ‚„„ƒƒƒƒ„„„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ‡‡‡‡ˆˆˆˆˆˆˆˆ‡…„ƒ‡…‚~~€€€‚‚‚‚‚}}|yyzz|~‚ƒ‚‚‚‚ƒ‚ƒ‚‚‚‚‚ƒƒƒ„…ƒ€~ƒ„ƒƒƒ„„„„„„€€€€€€€€€€€€€€€€rnihknpqyxxyz{}~uomqtrppppqrsttuuuttsssrvvuvvwwxyxxy{{ywywx}‚€}}}€~~~~||}}~~~~~~~~~~}}}}~‚‚€|xvuvwvvvvvwxx|~~~~~€€€€€€€€€€€€€€€~~~€€€‚~}}}}~~€‚€~~~~€€€€~~|||}}}}}}}|}}‚|}~€€}}~~~€€€„†ˆ‡ˆ‰Š‰†ƒ‚~€‚‚‚‚‚‚‚‚‚€ƒƒ‚ƒ„ƒ€ƒ…„ƒ‚€€€ƒ„„ƒ‚€‚ƒ‚‚„…„‚ƒƒƒƒƒƒ‚‚€‚‚‚‚‚€€€€€€€€€€€€€€€€‰ŽŒŒ‰‚€}|}€€~{ƒ‹ŒŠŒ‹†‹Š‰ˆ‡‡‡‡‹‹Š‰‰‰‰ŠŠŠˆ‡‡†‡‡Š‰‡ƒ€€‚„……ƒ€~||||||||||{|}}|}‚‚‚‚ƒƒƒ„„ƒƒƒƒ‚‚………„„ƒƒƒ„„„„„„„„„„………††††††…„‚€}ƒ‰Œ‘‘‘‘“’Ž„~z{|}~}}~~~}}~}}}}}|||~~~}}}}}}}}}}}}}||}~~}||}}||{{{{z}„‡‡‡‡€~}~€‚‚„„ƒƒƒƒ„„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„‡‡‡‡ˆˆˆˆˆˆˆˆ‡…„ƒˆ†ƒ€€€‚‚‚€€€€zzzz{|~ƒƒ‚‚‚‚ƒƒ‚‚‚‚‚ƒƒƒ„„ƒ€€~ƒƒƒƒƒƒ„„„„„€€€€€€€€€€€€€€€€wrljmrvx}}}|{zzzutsrrstuqqrsuuvwxwuttuvwvvwxyz{{{{{||}}}xyz|€‚ƒ~~~~~€~~~}~~}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}||{|}~€€}xuux{{wuvxxxy~~~~~€€€~€€€€€€€€€}~~}~~€€€€€€ƒ‚€~}||||}~€€~~}}}~€€€~€€€€~~~}|||||||}}€€~€€~~~~€€€€€ƒ„†ˆ‰‰ˆˆƒ€‚‚ƒƒƒƒ„ƒ‚‚‚€€‚ƒ‚€‚€€‚‚ƒ„ƒ‚€€€‚ƒƒ‚ƒ„„…„ƒ‚‚€‚ƒ‚‚‚ƒ€€€€€€€€€€€€€€€€‰‹‹‡‚{zzz|}|{ƒˆŠ‡†‰‹‹‹‹‹Š‰ˆˆˆˆˆˆ‡‡†††‡‡‡††………††……„„„ƒ…„‚€~|zy||||||||||||~‚€‚ƒ„ƒƒ„„„„„„„„„„„ƒ„ƒ„ƒ„ƒ‚‚‚ƒƒ„„„„………†††ˆ‡†…†„~ƒ‰‘‘‘…|||}~~}~}~}~}}}}}}}}}||}}}~~~}}}}}}}}||||||||{{{zyyyxw|‚†‡‡‡ˆ…‚€€‚€„„ƒ‚‚ƒ„„ƒƒƒƒƒƒƒƒ„ƒƒƒƒƒ„…„…‡ˆ‰ˆ‡‡ˆˆ‡††…„„‡†ƒ||‚‚€€}~€‚€~~}|{zyxƒ„ƒ‚‚‚‚ƒ‚‚‚‚ƒƒƒ„…ƒ€€€€‚‚‚‚‚‚€€€€ƒƒ„…………„„„€€€€€€€€€€€€€€€€~yutw{}~}||{{zzyxxxxwwvvwwxyyzz{yxwvvvxyzzzz{{{{yzzz{{{|yyz|}€€~~~~~~~~}~~}~~~€€€~~}}}}~~~~~~~~}}}}}}}}}||}}€€}yuux{{wuvwwwx}~~~€€€~€€€€€€€€€~~€€‚~|||||}~€€€~~~~~~~~~~€€~~~~}|||||||}~~€€~€~~~~€€€€ƒƒ‚‚ƒ…†ˆ‡„€€€€‚ƒ‚€€‚ƒ‚ƒƒ‚‚‚‚€‚ƒ€‚€€‚‚ƒ„„‚€ƒƒ‚‚ƒƒƒ‚‚ƒ„…„„ƒƒ‚‚ƒ‚‚€€€€€€€€€€€€€€€€ƒƒƒƒƒ€|x|{zzzzyy€„‡„„‡‰‰††††…………‡‡‡††………††………„„„†………„„ƒƒ„„‚€~|{z|||||||||||}}‚€ƒƒƒƒƒ„„„„„„„„„ƒ„ƒ„ƒ„ƒ„„„„„„„ƒƒƒƒ„„„………ˆ‡…………~‚‡ŒŒ‰‰‘‘“’†|||}~}}~}~}~}~}}}}}}}}}}}|||||}~}~}~}~}}}}}}}}||{{zzyyx}‚†‡‡‡ˆ…ƒ€€‚€„ƒƒ‚‚ƒƒ„ƒ„ƒ„ƒ„ƒ„„„ƒƒƒ„„……†‡ˆ‰ˆˆ‡ˆˆ‡‡……„„††„€}|‚€€€€€~~}|||ƒƒƒ‚ƒ‚‚ƒ‚‚‚‚ƒƒ„…„€€€€‚‚‚‚‚€€€€€€‚‚ƒƒƒ„……………€€€€€€€€€€€€€€€€~{xx{}~}~}}}|||{}~}{zyyyyyyyyyyxxxxyz|{{{{zzzyyyzz{{{||||}}~~~~~~€~~~~}€~~~~~€€€€~~}}}~~~~~~~~~}}}~€}yvvx{{xvvwvvx}~€€€€€€€€€€€€€€€~~~€€~~~}€€€‚}|||||}€€~~~~}}~~~~€~~~~}}||{||||}}€€€~~€€~~~~~€€€€€€€ƒ„‡„‚€ƒƒ‚€ƒƒƒƒ‚‚‚‚€€‚‚‚€ƒ‚€€‚ƒƒ„…„ƒ‚„„ƒƒƒƒ‚‚ƒ„………„„„ƒ€€€€€€€€€€€€€€€€€€€ƒ€}}~{w}|{{{z€ƒ…………††††‡‡†††………„„……„„„ƒƒƒ……„„ƒƒƒ‚ƒƒ‚€~|{{||||||||||||~‚‚ƒ‚‚ƒƒ„„„ƒ„ƒ„„„ƒ„ƒ„ƒ„ƒ†††…„„ƒƒ‚‚ƒƒƒ„„„ˆ†……†„‚~€…‹Žˆ„‡’’“’’†||}~~|~}~}~}~}}}}}}}}}~~~}}||}}}}}}}}~~~~~~~~|||||{{{z~ƒ‡ˆ‡‡‡…ƒ€‚‚‚„ƒƒƒƒƒƒ„„„„„„„„„„ƒƒƒ„„………†‡ˆ‰ˆˆ‡ˆˆˆ††„„„††„~}‚€€€€€€€‚‚ƒƒ‚€€€|~‚‚‚‚‚€‚‚‚‚‚‚ƒƒƒ„…ƒ€€€€€‚‚€€ƒƒ‚‚ƒ„…†††€€€€€€€€€€€€€€€€}{yz|}|z~~~~~~}}ƒ…„‚~|xxxxwwwwyyyyyzz{zzzzzzzz{{{||}}~€€€€~~~~~~~}}‚€~~~~€€€€~~}}~~~~~~~~~~~€‚€~zwwx{{xvvvuvx}~€€€€€€€€€€€€€€€€€€~}}~~~~~€€€~}|||||}~€€€€~}}~€€€}}~~€€~~~~}}||{||||||~~€€€€~}~€}}~}~~~€€€}~€€‚‚‚ƒƒƒ‚‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚€‚ƒ€ƒ‚‚ƒƒ„…„ƒ‚‚‚„„ƒƒ‚‚€‚„…†……„„ƒ€‚€€€€€€€€€€€€€€€€}xx{}zw|}~}{{{|x}}}ƒ‚……††‡ˆˆˆ†††………„„„„„„ƒƒ‚‚ƒƒƒ‚‚€~}|{|||||||||||}}€‚€‚‚‚‚‚ƒƒ„ƒ„ƒ„ƒƒƒ„ƒ„ƒ„ƒ„……„„„„ƒƒƒƒƒƒ„„„…‡†……†…‚€€€ƒŒ‘އГ“‘‘އ||}~~{}~}~}~}~}}}}}}}}~~~~~}}}|}|}|}||~~~~~~~~}}|}|}||{€„ˆˆ‡‡‡…ƒ‚ƒ‚ƒƒƒƒƒƒƒƒ„„„„„„„„„ƒƒƒƒ……††‡ˆˆ‰ˆˆˆˆˆ‡‡……„„††…‚~€€€~€€~~~‚ƒƒƒ‚‚‚‚‚€‚€€€€€‚‚‚‚‚ƒ‚ƒƒ„…„€€€€€‚€€€€€€‚‚ƒ‚ƒ„…†††€€€€€€€€€€€€€€€€|{{}~}{zzzzzzzzz||zzyzyyxxxyyz{{|||{{|}}~€€‚‚†……ƒƒ€~~€~~~}‚‚~~~~~~€~~~~~~~~~~~~€€€|xwyzzwvvvtvx}~€€€€€€€€€€€€€€€€~~~~~~~~€}|}~~~~€€€€~||{|||}€€~}~€€~~~€€€€~~~~~}||{|{||||}}€€~}}~}}}~}~~€€€€€‚ƒ‚€‚ƒƒƒ‚ƒƒ‚‚ƒ‚‚‚‚‚‚ƒƒ‚€€‚‚‚€‚‚‚‚‚ƒ…„ƒ‚‚ƒƒƒƒ‚€€€€‚„……†…ƒƒ‚€ƒ„€€€€€€€€€€€€€€€€|xuuxyxvxz|{yxz}}‚„„†…‚‚ƒƒ„……††………„„„„ƒƒƒƒ‚‚‚€€~~~}}||{||||||||||||~‚€‚‚‚‚‚ƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒ‚‚ƒƒƒƒ„„„„„………††‡………†…ƒ€ƒ€ƒŒ’އ„“‘ކ|}}~~{~}~}~}~}}}}}}}}}|||}}}}~}}}}}}}}~~~~~~~~}}}}}}}}}†ˆ‰‡‡‡†„‚ƒƒƒ‚ƒƒƒƒƒƒ‚„ƒ„ƒ„ƒ„„ƒƒƒƒ„…†‡ˆˆˆˆ‰‰ˆˆˆˆˆ††„„„†††ƒ€€€€€~~~}|}~€€‚‚€‚€€€‚‚‚‚‚‚ƒƒƒ„…ƒ€€€€€€€‚‚€€ƒƒƒƒ„„…„„„€€€€€€€€€€€€€€€€|xutvxwvsssttuuutuwzzzyxzzzzzzzz{|}€€€‚„……†ƒƒƒ„„………ˆˆ‡†…„ƒƒ€€~~~}}€}~~~~€€~~~~~~~~~~~~~€€€}yxyzxvvvutvy}~€€~€€€€€€€€€€€~~~~~~~~~~~~~~€€€€€~}|{||||}~€€€€€€€€~€€€€~~~~}}||{{{||||||~~€€€}|}~~|}}}~}~~~€€€€„ƒ‚‚ƒ„„„ƒ€ƒ‚„„‚€‚‚‚ƒƒ‚€‚ƒ€‚ƒ„„ƒ‚‚ƒ‚‚‚€€€‚ƒ„……„„‚ƒƒ‚‚‚„…€€€€€€€€€€€€€€€€}}~~~~~ƒ…ƒ~}‚…‰Š‡…‡‰‡ƒƒƒƒ„„„„ƒƒƒ‚‚€€€~~~}}}|||{{{{{{zz|||||||||||}}€‚‚ƒ‚‚ƒƒƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„‚ƒƒ„„„…………††††…„…††ƒƒ‚‹Œˆˆ‘Žƒ~}~}}~}}~}~}~}~}}}}}}}}~~~€€~~~~~~~~|||||||||||}}}}~ƒ‡Š‰ˆ‡‡†„‚‚‚„ƒ‚‚‚ƒƒƒƒ‚‚ƒƒƒƒƒƒƒƒƒƒƒ„„††‡ˆˆ‰‰‰‰‰‰ˆˆ‡‡……„„…†‡…€€€€€~~~~}~~€~~€€€€ƒ‚‚‚‚ƒ‚‚‚ƒ‚ƒƒ„…„€€€€€€‚€€€‚‚ƒ„„„„„„ƒƒ€€€€€€€€€€€€€€€€yuomoqssqrrssttustuwy{|}||}}~~€‚„……„„…†††‡ˆˆˆ„„……††‡‡‡‡‡†…„„ƒ€€€€~~~}€€€~~~€€€€~~~~~~~~~~~}}}~€€€}zxyzvuuvutw{}~~~~~~€€€€€€€€€€€€€€~}}{{{|||}€€€€€€€€€~~€~~~~~}}}||{{{{||||}}€€}||~~|||}}~~~~€‚‚‚„ƒ‚‚ƒ„ƒƒƒƒ‚‚ƒ„‚‚‚ƒƒ‚€€‚ƒ‚€€€‚ƒƒ‚‚‚‚‚‚‚€‚‚ƒ„„…„ƒƒ‚ƒ„„„„…†€€€€€€€€€€€€€€€€€…‹Œˆ†‡Š‰ŒŽ‰‚~ƒ‡‹‹‡„…†„ƒƒƒ‚‚‚‚~~~}}}||{{{zzz{{{zzyyyyxyyyyyy||||||||||||~‚€ƒƒƒƒƒ„ƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒƒƒƒƒƒƒ„„„„„„…………†„„…††„}€‰ŒˆˆŒ‘‘‘’’Š~~}}~~}~}~}~}}}}}}}}}}}}}}}}}{{{{{{{{{{||}}}}„‰ŠŠˆ‡†‡„‚‚ƒ„ƒ‚‚‚ƒƒƒƒ‚‚ƒƒƒ‚ƒ‚ƒƒƒƒƒ„…†‡ˆ‰‰‰‰‰‰‰‰ˆˆ‡††„„„…†‡…‚€€€€€€~}~€€€€}}~€‚€‚‚ƒ‚‚‚‚‚‚ƒƒ‚‚‚‚ƒƒƒ„…ƒ€€€€ƒƒ„„„„„ƒƒ‚€€€€€€€€€€€€€€€€~xqnpsvwtuuvwwxxvwwy|‚ƒ‚‚ƒ„…†‡ˆƒ„†ˆ‰‰ˆ‡ˆˆ‡‡‡‡‡‡„„……†††‡††……„„ƒƒ€€€€~~~}~~€€€€€€€€€€€~}}}}}}}}~}||}}~€€€~{yyzutuvutw|~~~~~~}}~~~~~~~~~~€€‚ƒƒ‚‚€€€€€€~}|{{{|}|}~€€€€€~}~~}~~~~~}}}||{{{{||||}~~€€~}{|~}|||}}}~~~‚‚‚ƒƒ‚ƒ„„ƒ~€‚‚‚ƒƒƒƒƒ‚‚ƒ„‚€€‚ƒ€€€€€€ƒƒ‚‚‚‚ƒƒ‚‚ƒƒ„„…„ƒ‚‚‚ƒ………„„…€€€€€€€€€€€€€€€€}†ŽŠ†‡‹ˆŒŒ†|vvz„ˆˆƒ€€~~}}||{{{{zzzyyxxxwwwvvzzyyxxwwwwwxxxxy||||||||||||~‚€‚ƒ„ƒƒ„„ƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„†………„„ƒƒ‚ƒƒƒ„„„„…„„…††„‚~{~†ˆ…‡Ž““’’“’‹„€}~}|€}~}~}~}~}}}}}}}}||{{zzzzzzzzzzzzzzzzzzzzz{{||}}}…‰‹Šˆ††‡…‚‚ƒ„ƒ‚‚ƒƒƒƒ‚‚‚‚‚‚‚‚‚ƒƒƒ„…†‡ˆŠ‰‰‰‰‰‰‰ˆˆ‡‡……„„…†‡†ƒ€€€€€€~}€‚ƒƒƒ}}~€‚‚ƒƒƒ‚€€‚ƒƒ‚‚‚ƒƒ„‚‚‚‚ƒƒƒ„…ƒ€€€€€€€‚ƒƒ„„„„„ƒƒ€€€€€€€€€€€€€€€€}{yy{||{€{wuwzwy{|~€ƒ……„ƒ…ˆ‰‡„‡‡‡‡‡‡‡‡††††††††ƒƒƒƒƒƒƒƒ……††…ƒ‚‚}}~€€~~~~~€€€€€€€~~}~}}~~}||||}}~~~~~€~}€~{yyzxwvuuwz}~€€€€€~~€€€€€‚ƒƒ‚‚‚‚„‚€€€}‚ƒ}€~~€}|{{|||{}}~~€€€€€€€~~~~~€~~~}||{{{{{{{{{{{{|}~€€~||~~|||}~~‚‚ƒƒ€~€‚ƒ„ƒƒ‚ƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚ƒƒƒ‚‚‚ƒ„„ƒ‚€€‚‚€€€‚ƒƒƒ‚ƒ‚€‚‚‚ƒƒƒ„„………†…„„„…‡ˆ€€€€€€€€€€€€€€€€~~€‚€}„€~{ywvvyy{~zv{zyxxy{|yyyyyyyyyyyyyyyy{{{zzzyyyyyxwvvv{||}}||{{|zy|‚‚€‚ƒƒƒƒ„„„ƒƒ‚‚‚‚ƒƒƒƒƒƒ„ƒƒƒƒƒƒƒƒ„„„„…………††………„„„€„„„‰‘’‘‰€~~~~~~~~~~}zzzyzz{{yyyyzyxwxyyzzzyyyyzzz{{{z{|}}}||€…‰‰‰Šˆ…„‚ƒƒƒƒ„ƒƒƒƒ‚‚‚„„„ƒƒƒƒ‚ƒ„……‡‡ˆ‰‰‰‰‰‰‰‰‰Š‰ˆ†…………ƒ„††…ƒ€~€€€€€€€€ƒƒ‚‚€‚‚‚‚‚‚‚‚‚ƒ„ƒ€‚€€€€‚€‚‚€~€‚ƒ„…„„„„„„„„€€€€€€€€€€€€€€€€|{{}€€}€€}yvwxxz{||~€‚…„„………ƒƒƒƒƒƒƒƒƒ„„„„„„„„‡‡‡‡‡‡‡‡‹‹Š‰‡…ƒ€~~~€~~~~€€€€€€€~~}}~~}~}}}}}~~~}~€~~€€|z{|yxvuux|€€€€€€€€€‚ƒƒ‚‚„‚€€€€€€€€€~~€}|z{|}||}}}~€€€€€€€€€€€~~~}||{{{{{{{{{{}}~€€€~||~~||}~~€‚‚ƒ‚‚€€€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚ƒ‚‚‚ƒ„ƒ‚€‚€€€‚ƒ„ƒ‚‚ƒƒ‚‚‚‚‚ƒƒƒ‚ƒƒ„…†‡‡……†‡‡‡‡‡€€€€€€€€€€€€€€€€{{}}z|~|ywvutwwx{}~}||{zyxyz{||||||||zzzzzzzzxwwwvvuuuuuvvwww{||}|||{{|{z}‚ƒ€€‚ƒƒƒƒ„„ƒƒƒƒ‚‚‚‚‚ƒƒ„„„ƒƒƒƒƒƒƒƒƒƒƒƒ„„„„††……„„„„‚„„„‡‘’ˆ}||||{{{€€€€~}zyyyyzz{yxxyyzyxyyyzzzzz{{{{{{{|{{|}}}}|‚‡ŠŠ‰‰ˆ‡„ƒ‚„ƒƒƒƒƒƒƒƒ‚‚ƒƒƒƒƒƒƒƒƒ„……‡‡ˆ‰‰‰‰‰‰‰‰‰Š‰‡†…………ƒ„††…ƒ€~€€€€€€€€€€€‚ƒ„ƒ€‚€€€€‚€‚‚€€‚‚ƒ€€€€€€€€€€€€€€€€€€€€€€€€yz{‚‚€}‚ƒ|xvuyz{{{z|}‚„…†…„„„‡‡‡‡‡‡‡‡ˆˆˆˆˆˆˆˆ‰‰‰‰‰‰‰‰‹‹‹Šˆ†„‚€~€~~~~€€€€€€~~}}}~€€~}~~~~~~}}}~~€~}€~|}yxuuvz‚€€‚‚‚‚€€€€€‚€€‚‚ƒƒ‚„‚€€€€€~~€|{zz|}}}||}}~€€€€€€€€~~~}}|{{{{{{{{{{~~€‚‚ƒ€~||~~}}~~€€€‚‚ƒƒƒ€€€‚‚„„ƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚ƒ‚‚‚‚‚ƒƒ€€‚‚€€€‚ƒ„„‚‚ƒƒ‚‚‚‚‚‚‚ƒƒ‚‚ƒ„†‡‰‰†‡‰Š‹Š‰ˆ€€€€€€€€€€€€€€€€zy{}|y{}|{ywutswwwwxy||{zxxxxyxxxxxxxxwvwvwvwwvvvuutttuuvwwxxy{|||}||{|}|{~ƒ„€‚ƒƒƒƒ„ƒƒƒƒƒƒ‚‚‚ƒƒ„„…„ƒ„ƒ„ƒ„ƒ‚‚‚ƒƒƒƒ„††………„„„‚……ƒ„‡ŠŽ‘‘‡€€€€€€€€€~}|yyyxyyzzyxxxzzzyyyyzz{{{||||||||{|}~~~}}„ˆŒŠˆ‡ˆˆ…ƒ‚ƒƒƒƒ‚‚ƒ‚ƒƒƒƒ‚‚ƒƒ„„„„ƒ„……‡‡ˆ‰‰‰‰‰‰‰‰‰Š‰‡……„……ƒ„††…ƒ€~€€€€€€€€€€€€€€€€‚ƒ„ƒ€‚€€€€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€xwx{~€€~‚ƒ„ƒzurwyzzyyyz~‚…‡†‡‰‹ŠŠŠŠŠŠŠŠ‰‰‰‰‰‰‰‰††††††††„……†…„ƒƒ~€~~€~~~€€€~~}}€€~€€€~~}}}~€~~~€€€€zxuux}„‚‚ƒƒƒ‚‚€€€‚‚‚€‚‚ƒ‚€€€ƒƒ‚‚€€‚€€‚€~~€|{z{|}}}{||}~~~€€€€€~€€~~~}||{{{{{{{{{{}~~€‚‚€~||}~}~~€‚‚‚‚‚€€€‚„…ƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚ƒƒ‚€‚€€€‚ƒ……ƒ‚ƒƒ‚‚ƒ…‡‰Š‹‰ŠŠŒŒŒ‹Š€€€€€€€€€€€€€€€€|z{~~{|||{zxvtsxyxwuux{zzyxwwvvttttttttvvvvvvvvyyyxxwwwzzzzyyyy{||}|||{}~}{~„…€‚ƒƒƒƒƒƒƒƒƒƒƒƒ‚ƒƒ„……„„„„„„„„‚‚ƒƒƒ„„„††……„„„„……‚ƒ‰Ž’‘‰„€}~~€‚ƒƒ€}}{zyxxxxyyzzyxyz{zzyyzz{{||}}||{{{{||}~~~~…‰Œ‹†…†ˆ†„‚‚ƒ„ƒƒ‚‚‚ƒƒƒƒ„ƒƒƒƒƒ„„„ƒ„……‡‡ˆ‰‰‰‰‰‰‰‰‰‰ˆ†…„„„„ƒ„††…ƒ€~€€€€€€€€€€€€€€‚‚ƒ„ƒ€‚€€€€€€~~€€€€€€€€€€€€€€€€|ywx{‚‚‚ƒ„„|uqtvxyyxyyz~‚„…†ˆ‹„„„„„„„„ƒƒƒƒƒƒƒƒ„„„„„„„„‚ƒƒƒ‚~~€~€~~~€€€~~~~€€€€~€€€~~~~~€~}~€€‚zxuvyƒ…‚‚ƒƒ„ƒ‚‚‚€‚‚‚‚€‚‚‚€~~‚€€€€€€~~€|{zz|}}}{||}~~~€€€€€~€€~~}}|{{{{{{{{{{{||}~€€€~||~~}~~€‚‚‚€€€‚€‚„…ƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚ƒƒƒ„ƒ„ƒƒƒƒ€€‚‚€€‚‚…†ƒ‚ƒƒƒ‚ƒ…‡‰Š‹Š‰‰ˆ‰‰‹‹€€€€€€€€€€€€€€€€}yy}~||~yzzywusruwxxvuwxzzzzzxxwyyyyyyyy{{{{{{{{{{zzzyyyzzzzyyyy{|||}||{}~}{~„…€‚ƒƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒƒ„„…„„„„„„„„ƒ„„„…………†…†……„„„€€„…‚ДЅ||}~‚~~~~||{xxxxxxyy|{zy{{{{zzzzz{|}|{{{{zzz||}~~~~„‡‹‰†‚„‡‡…ƒ‚ƒ„ƒ‚‚‚‚‚ƒƒ„„„„„ƒƒƒƒƒƒ„……‡‡ˆ‰‰‰‰‰‰‰‰‰‰ˆ†„„ƒ„„ƒ„††…ƒ€~€€€€€‚‚€€€€€‚‚ƒƒ‚ƒ„ƒ€‚€€€€€€‚€~~}~~~~~~~~€€€€€€€€€€€€€€€€‚~zy|€„†‚‚‚‚}vrrtwyxxxyxz}€‚ƒ€€€€‚‚‚‚‚‚‚‚„„„…„…„„………„ƒ€~€€~~~€€€€€~‚€~€~€€€€€}~€~~~€€zwuw{€ƒ„ƒƒƒ„ƒƒ‚‚‚€€€‚‚€€€}||€‚€€‚‚€€€~~€}|z{{|||||}}~€€€€€€€~~~~~}||{{{{{{{{{{{{|}~€€~||~~}}~~€€€€€€ƒƒ„ƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚ƒ„„„…„„ƒƒƒ‚€‚€€€‚‚…†ƒ‚ƒƒƒƒ‚‚‚‚‚‚‚ƒ…†ˆ‰‰‡‡………†ˆ‰€€€€€€€€€€€€€€€€{wwz|{z{wwxxwtrppsvxxxxx{||}}}{{||{|{|{|z{z{z{zzyyyxxwwwstuvxyzz{||}|||{|}|{~ƒ„€‚ƒƒƒƒ‚ƒƒƒƒƒƒ„‚‚ƒƒƒƒ„„ƒ„ƒ„ƒ„ƒ„„„„………††††……„„„„‚ƒ…ƒ‚ƒ’”ˆƒ€~~}|xxxxxyyz}|z{{}}}{{zzz{||zzzzzzzz{|}~~~}}„†‰Š†ƒƒ†‡†ƒƒƒ„ƒ‚‚ƒ‚ƒƒƒƒƒ„„„„ƒƒ‚‚ƒ„……‡‡ˆ‰‰‰‰‰‰‰‰‰ˆ‡†„ƒƒƒ„ƒ„††…ƒ€~€€‚‚€‚‚‚€€€‚‚‚‚‚‚ƒ„ƒ€‚€€€€€€€€‚‚€€€€€€€€€€€€€€€€€‚|{}€‚ƒ€€€€}xsqtwyyxxxuuwz~€€€‚‚ƒ‚ƒ‚ƒ‚„„„„„„„„„„„„„„„„…………„‚€~~~€€~~~€€€€€~€€€€€€€€€€€~€€€€€€~~€~}€€~}€ywvx}‚‚ƒƒƒƒƒ‚‚€€€€€€€€}|{{}~€‚€€‚‚‚€€~~€~}{{{|{z}}}~€€€€€€€€€€~~~~~~}}|{{{{{{{{{{||}~€€€~||~~||}~~€€~}~~€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚ƒƒƒ„„„ƒƒ‚ƒ‚€€‚‚€€€‚„†ƒ€‚ƒƒƒƒ‚‚‚‚‚‚‚ƒ„…†‡‡…………††‡‡€€€€€€€€€€€€€€€€|xv{}|{{yz{{zxusrstwyyxwwxz|}||{yyyyyyyywwwwwwwwxxxwwvvvrstuwxyz{|||}||{{|{z}‚ƒ€€‚ƒƒƒƒ‚‚ƒƒƒƒ„„„ƒƒƒƒƒ‚‚ƒƒƒƒƒƒƒƒƒƒƒ„„„……††………„„„ƒ}„„„…’“†‚€€€€€€€€~}|{yxxxxyyz|{z{}€€|{zyyz{{zzzzzzzz{{|}}}}|„…ˆŠ‰…„…ˆ†„ƒ„„ƒ‚ƒƒƒƒƒ‚‚‚ƒƒƒƒƒƒƒƒƒ„……‡‡ˆ‰‰‰‰‰‰‰‰‰ˆ‡…„ƒ‚ƒƒƒ„††…ƒ€~€€‚‚ƒ€€‚‚€€€‚€‚ƒ„ƒ€‚€€€€€€€€€ƒƒƒƒƒƒƒƒ€€€€€€€€€€€€€€€€}{{}~}~~}yuruxyxwwwrrtyƒ„ƒ‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ€‚ƒƒƒƒ‚€~}}‚€~~~€€€€€~~€€€€€€€~}~€€‚‚}~€~~€€~}}ywvy~€ƒƒƒƒƒ‚€€€€€€€€€€€}{zz{}€€€‚€‚‚€€~~€~|{{{zz}}~~€€€€€€€~€€~~~}||{{{{{{{{{{~~€‚‚€~||~~|||}~~€~}|}~~~€ƒ„ƒ‚‚ƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚ƒ‚ƒƒ„ƒƒ‚ƒ‚€€‚‚€€€‚€„†ƒ€€‚ƒ‚‚‚ƒƒƒ„„…………†‡‰‰ˆ‡‡€€€€€€€€€€€€€€€€zy}€}~}~€€}zxvuuvxyvtrtvyzzyyyyyyyyyyxxxxxxxxyyxxwwwvwwwwxxxx{||}}||{{|zy|‚‚€‚ƒƒƒƒ‚‚‚ƒƒ„„„„„„ƒƒ‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚ƒƒƒ„„††……„„„„„}€„…†‡’‘‹…ƒ‚‚€€€€€€€~|{yxyyxxyyzz{zz{~€‚ƒ}|zyyyz{yzzzz{{{z{|}}}||„…ˆŒ‹‡……ˆ†„ƒ„„ƒ‚„„ƒƒƒ‚‚‚‚ƒƒƒƒ„„„ƒ„……‡‡ˆ‰‰‰‰‰‰‰‰‰ˆ‡…„ƒ‚ƒƒƒ„††…ƒ€~€€‚ƒƒ~€‚‚ƒ€€€€€‚‚‚‚‚‚‚‚‚ƒ„ƒ€‚€€€€€€€‚‚‚‚€€€€€€€€€€€€€€€€{z{|~}€€€€{||{zyxwutuvy}„‚‚‚ƒ„‚ƒƒƒƒƒ‚ƒƒƒƒƒ‚‚‚ƒƒ„„„ƒ‚‚€„ƒ„……„‚}€€€~~~€€€~~€€}}}}~~€€€€~~~~€‚‚€}{{zvwƒ‚€€€‚ƒƒƒƒ‚€€€€€€€~‚}zyz~€€‚‚€€€~~~}}}|||||z{|}~€€€€€€}~~~}}}}}}}}{{{{{{{{|}~€€€€~{z|~~~~}||~~|~~~~~~~~‚ƒ„…‚ƒƒƒƒ‚‚ƒ„„‚‚ƒƒ‚€‚ƒƒƒ‚‚‚‚‚€€€€€‚„„‚‚ƒ‚ƒ‚‚‚ƒ‚‚ƒ†‰ŠŠˆ††ˆ‰ˆŠ‰…€€€€€€€€€€€€€€€€{ywwy{||{zyxxyyy{zzzzyyyxvtuwyyxwxyyyyxwwwwwwwwwwwwwwwwwwvvvwxyy{}~|{{ywwuttvz~€‚ƒƒƒ‚‚‚‚ƒƒ„„„††…„„ƒ‚‚ƒƒƒ„„„„„‚‚‚‚ƒƒ„…………„„ƒƒƒ‚€~‚…‡‡”’‰‚€€€~~}~~~~}|yyxxwwwxz{{{ƒ……}zzzzyy{{{zzzzzz{||}}||€…‹Œ‰†…Љ‡„ƒƒƒƒƒƒ‚‚‚„„…„ƒ‚‚ƒ††††††††ŠŠŠŠŠŠŠŠˆ‡†„ƒƒƒ„‚…ˆ‡ƒ|{~~ƒƒ~€€€€€€€‚‚‚‚‚‚‚‚ƒƒ‚€‚‚‚‚‚‚ƒ‚€‚‚‚€€~€€€€€€€€€€€€€€€€€€€€€{zyz{}}}€€€€€€€€~~~~|{zyvvvwz}€‚‚ƒ‚‚‚ƒ‚ƒƒƒƒƒ‚ƒƒƒƒƒƒ‚‚ƒƒ„„ƒƒ‚‚€€„„„……„‚}€€€~~~€€~€€‚€~€€€€€~~~~~€‚‚€}||{wx„‚‚‚‚ƒƒƒƒƒ‚‚‚‚‚‚€|zz{~€‚‚€€‚‚€€€~~}}}}||||z{|}~€€€€€€~~~~~}}}}}}}}{{{{{{{{|}~€€€€€~{{|~~~}|}~}|~~~~~~~~‚ƒ„…ƒƒ„„„ƒƒ‚ƒ…„ƒ‚„ƒ‚‚‚ƒƒƒƒ‚‚‚‚‚€€€‚‚‚„…ƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒ†‰ŠŠˆ‹‰‰ˆ‡ˆˆ…€€€€€€€€€€€€€€€€}{xxy{||zyxxwxxxzzzzzzzzyxvwyzzyvwwxxxwvwwwwwwwwwwwwwwwwvvvvwxyy{}~|{{ywwvttvz~€‚ƒƒƒ‚ƒƒƒƒƒƒƒƒ………„„ƒƒƒ‚‚‚‚ƒƒƒƒ‚‚‚‚ƒƒ„……………„„„„ƒ‚…‡‡”‘ˆ‚€€ƒ‚€~~}€€€€~}zyxwwxyyz{{|~ƒƒ‚|{yxyyyx{{{{{{{{z{{}}}||~ƒˆ‹Šˆ…„Љ‡…„ƒ‚ƒƒƒƒƒƒ‚‚‚ƒ„„„ƒ‚ƒƒ††††††††‰‰‰‰‰‰‰‰ˆ‡…„ƒƒƒ„ƒ…‡‡ƒ||~}~€}€€€€€€€€‚‚‚‚‚‚€‚ƒƒ‚€‚€‚€‚‚ƒ‚€€‚‚€€€€~€€€€€€€€€€€€€€€€€€€€€€€€|yxz{}}€€€€€€€€€€€}|{xxxxz|€ƒƒƒ‚€‚‚‚ƒƒƒƒ‚ƒƒƒƒƒƒƒƒƒƒ„„„ƒ‚‚€~„„…††„‚~€€€~~~~€€€€€€‚‚‚‚€€€€€€€€~~~~~}}}}€‚‚€}||{xyƒ‚ƒƒ„ƒ„ƒ‚‚‚‚‚€€€€€|z{}€‚‚‚€‚‚‚€€€~~~~}}||{z{|}~€€€€€€€€€~~~}}}}}}}}||||||||||~€€€€€}{{}~~}~}}}~~~}‚ƒ„…„„„„„„ƒƒ„……ƒƒ„„ƒƒ‚‚‚‚ƒƒ„‚‚‚‚€‚‚ƒ……‚€‚‚‚‚ƒ‚‚‚‚‚ƒ…‰ŠŠˆ‹ŠŠ‰ˆ‹‹ˆ€€€€€€€€€€€€€€€€~|yxzz{{zzyxwwxxyyzz{{||{yxxz{{zwwxxxwwwwwwwwwwwwwwwwwwwwvvvwxyy{}~|{{ywwuttvz~€‚ƒƒƒ‚ƒƒƒƒƒƒƒƒ„„„„„„„„‚‚‚‚ƒ‚‚‚ƒƒ„„……………„„„ƒ‚…†‡Œ‘‡‚€€€€~|{z|zyxxy{|y{{|~~{zyyyzyyzz{{{{||z{||}||||†‰ˆ†„„‰ˆ‡…„„„„ƒƒƒƒƒƒ‚‚‚ƒ„ƒƒƒ„„††††††††ˆˆˆˆˆˆˆˆˆ‡†„„ƒƒ„ƒ…‡†‚}|€€€~|~~~~~~~~€€€€€€€€€€‚‚‚‚€€‚ƒƒ‚€‚€€€€‚ƒ‚€€‚€€€~€€~~€€€€€€€€€€€€€€€€ƒ{yz}€~~}}||}~~~~}|{zzz{|~~‚ƒƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒƒ‚‚€€„„…††…‚€~€€€~~~~€€€€€‚‚‚€€€€€~~}}}}||}‚‚€}|||zz~€€€‚ƒƒƒ‚‚€€€€€€€|{}€€‚‚€€€€~~||{{z{|}~€€€€€€€€€€~~}~~}}}}}}}}|||||||||}~€€€€}{|}~||}|~~€€€€€€€€‚ƒ„…„„„„„„ƒƒ„……„ƒ……„„ƒ‚‚‚ƒ„…‚‚‚‚€‚‚ƒƒ……ƒ€€€‚ƒƒƒ‚‚‚‚ƒ†‰‹Šˆ‰‰‹ŒŒŽŽŠ€€€€€€€€€€€€€€€€~|yxxyyy{{zxxxxxxxyz{|}~{zyyyz{{xxxyxyxxwwwwwwwwwwwwwwwvvvvwwxyy{}~|{{ywwvttvz~€‚ƒƒƒ‚„„„ƒƒ‚‚‚‚ƒƒƒ„„„„‚‚‚‚‚ƒƒ‚‚ƒƒ„„………………„…„‚…††ŠŽ‹…‚€‚~€‚ƒ~~}{yxzywvvxz{yz{|}~{{zzz{{{{yzzzz{{{z{{}|}|||€…ˆ‡†……‡†…„ƒ„„„ƒƒƒƒƒƒƒƒ‚ƒ„ƒƒ„…††††††††‡‡‡ˆ‡ˆ‡‡ˆ‡…„ƒƒƒ„„†‡…‚~}}€~}}}}}}}}}€€€€€€€€€€‚€€‚ƒƒ‚€‚€€€‚ƒ‚€€‚€€€€~€~~~~~~}}€€€€€€€€€€€€€€€€„€{xz|~}}{zyxxzz||~}}}|||{||}}ƒ‚‚‚ƒ‚‚‚‚‚ƒƒƒƒƒƒƒ„ƒ„ƒƒƒ„„„ƒ‚‚€~„……††…ƒ€~€€€~~~~~~€€€€€€€€€~€€}}}}}||||‚€~}}|{{}~~~€€‚‚‚‚‚‚€€€€€~~€||~€ƒ‚‚€‚‚‚€€€~}||{z{|}~€€€€€€€~~~~}}}}}}}}||||||||||~€€€€~}|}~{{{}}€‚€€€€€€€€‚ƒ„…ƒƒ„„„ƒƒ‚„……„„……„„ƒ‚‚‚ƒ„…‚‚‚‚€‚‚ƒ……‚€€€‚‚ƒƒ‚‚‚‚ƒ…‰ŠŠˆŠŠ‹Œ‹Œˆ€€€€€€€€€€€€€€€€}zxvwxyx{zywwvvwwxxz{|}~zzzyxyzzxxxxxxxxwwwwwwwwwwwwvvvvwvvvwxyy{}~|{{ywwuttvz~€‚ƒƒƒ‚„„„ƒƒ‚‚‚‚‚‚ƒƒ„„„‚‚ƒƒƒƒ„„ƒƒƒ‚ƒƒ„„„„…„…„……„‚‚„……†ˆ†‚ƒ‚‚†„‚~~€~|{zyxwwxz{yz{{}~}zyyzzzzzzyyyyzzzzz{||}||||€…‡ˆ‡ˆˆ…„„‚‚‚‚ƒƒƒƒƒƒƒƒƒ‚ƒƒƒƒ……††††††††‡‡‡‡‡‡‡‡ˆ‡†„„ƒ„„…†‡…~}~‚‚€~~}}}}}}}}€€€€€€€€€€€€€€€€€‚ƒƒ‚€‚€€€‚ƒ‚€‚‚€€€~€€~~~~~}}}€€€€€€€€€€€€€€€€~yxy|€~~}|{zyyz{|}~~~~}}}}}}}}€‚ƒ‚‚‚ƒ‚‚‚‚‚ƒƒ„ƒƒƒ„ƒ„„„ƒƒƒ„ƒƒ‚‚€€„…†‡‡†ƒ€€€~~~€€€€€€€€€€~~~€}~}}|}|||~‚€~}~}|}}~~~|}~€‚‚‚ƒƒƒ‚‚‚‚‚€€€‚€~}„ƒ‚ƒƒ‚€€€}|{{z{|}~€€€€€€€~~~~}}}}}}}}|||||||||}~€€€€€}}|~}{z|}~~€ƒ€€€€€€€€‚ƒ„…ƒƒ„„ƒƒ‚‚ƒ……„„……„ƒ‚‚‚‚ƒƒ„‚‚‚‚€€€€€‚‚„„‚€€€‚‚ƒƒƒ‚‚ƒ†‰‹Šˆ‰ˆˆˆˆ‹Œ‰€€€€€€€€€€€€€€€€|zwwwyyyzywvuuuuwwxyz{|}z{{zxxy{xxwwwwwxwwwwwwwwwwwwvvvvvvvwwxyy{}~|{{ywwvttvz~€‚ƒƒƒ‚ƒƒƒƒƒƒƒƒ‚‚‚ƒƒƒ„„ƒƒ„„„„……ƒƒƒ‚ƒƒƒ„ƒ„ƒ„„„„„…‚€€‚„……ƒ„ƒƒ‚ƒ…„‚€€€~}|zzyyxxyyyzzz{}|zwxyyyxxyzzyzyzyzz{{}}}||{„‡‡ˆˆ‰†…„ƒ‚‚‚ƒƒƒƒƒƒ‚ƒ„ƒƒ„…††††††††‡‡‡‡‡‡‡‡ˆ‡…„ƒƒƒ„†††„€~~~€€€~}}~~~~~~~~~€€€€€€€€€€€€€€€€‚‚ƒƒ‚€‚€€€€‚ƒ‚€‚‚‚€€€€~€€~~~~~€€€€€€€€€€€€€€€€}zy{}€€€€€€€}}}~~}}}€‚ƒƒƒ‚‚‚ƒ‚‚‚‚‚ƒ„ƒƒƒƒ„„„„ƒƒ„„„ƒ‚‚€~„…†‡‡†ƒ€€€~~€€€€€€€€€€€€€€~~~€€~~~}}}}|{~‚€~~~~~€}}€‚‚€€€€€€€€~€‚‚~€€ƒ‚‚‚€€€€€~|{{z{|}~€€€€~}}}}}}}}}}}}}}}}}}||~€€€€}|}~€}z|}~~€‚€€€€€€€€‚ƒ„…„„„„„„ƒƒƒ„…ƒ„……„‚‚ƒƒƒƒ‚‚‚‚‚€€ƒ„€€‚‚ƒƒ‚‚ƒ…‰ŠŠˆ‰ˆˆˆˆŠ‹ˆ€€€€€€€€€€€€€€€€|zxwy{||{{yxwvvvvwwxyz{{||}{yyz|xwwvwwxxwwwwwwwwwwwwvvuuwvvvwxyy{}~|{{ywwuttvz~€‚ƒƒƒ‚ƒƒƒƒƒƒƒƒ‚‚‚ƒƒƒƒƒƒƒ„„„„……„ƒƒƒ‚ƒƒƒ‚‚ƒƒƒƒ„„…ƒ€€‚„……ƒ‚ƒƒ‚~}|zz{zzxwvzzzyz}}{z|}}|{{{|{{{zzzzz{||}|||z}„…†ˆ‰Šˆ‡…ƒ‚‚‚‚‚‚ƒƒƒƒƒ‚ƒ„ƒƒƒ„…††††††††ˆˆˆ‡ˆ‡ˆˆˆ‡†„ƒƒƒ„†‡†ƒ€}~€~}~€€€€€€€€€€€€€€‚‚‚‚‚ƒƒ‚€‚€‚€‚‚ƒ‚€€‚‚€€€€€~€€€~€€€€€€€€€€€€€€€€}{{}€‚‚‚‚ƒ„„……………„ƒ‚€}}}~~~~}‚ƒ„‚ƒ‚‚‚‚ƒ„ƒƒƒ„„„„„ƒƒ„„ƒƒ‚‚€€„††‡‡†„€€€~~€€‚€€€€€€€~~~~€€~~~~}}}}{~‚€~~~€€€€‚~~~}}}||{{|||}}}}€ƒƒ€€}|{|~€€€‚‚ƒƒ€€€€‚€~|{{z{|}~€€€€€~}|}}}}}}}}}}}}}}}}|}~€€€€}||~€€}z}€€~}€‚ƒ„…………………„„ƒ„„ƒƒ……„€‚ƒƒƒ‚‚‚‚‚~~€€€‚ƒ€‚‚‚ƒ„‚‚ƒ†‰ŠŠˆ‹‹Œ‹ŠŠ‰…€€€€€€€€€€€€€€€€}{yy{}~~~|{zyyywwwxxyyz}~~}zz{}yyxwwxyywwwwwwwwwwwvvvuuvvvvwxyy{}~|{{ywwuttvz~€‚ƒƒƒ‚‚‚‚ƒƒ„„„ƒƒƒƒƒ‚‚‚ƒƒƒƒ„„„„„ƒƒƒ‚ƒƒƒ‚‚‚‚ƒƒƒ„…ƒ€€‚„„„ƒ‚~ƒƒ€‚‚‚‚‚€€‚‚€€‚‚ƒƒ‚€}|zzyxz}~}‚‚€}}||{{zzz{||}}||x{‚ƒ„†ˆŒ‰‡…„ƒƒ‚‚‚ƒƒƒƒƒ‚ƒ„„ƒƒƒ„††††††††ˆˆˆˆˆˆˆˆˆ‡…„ƒƒƒ„†‡†ƒ}~€‚~€€€€€€€€€€€€€ƒƒƒ‚‚€€‚ƒƒ‚€‚‚‚‚‚‚ƒ‚€€‚€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~}}|}}~€‚‚‚‚ƒ„‚‚‚ƒƒƒ„„„ƒƒƒƒƒ„…„ƒƒƒƒƒƒ‚€~€€€‚†††‡‡†„‚‚€~~~~€€€€€€€€€€~~~~}}~~~~}~~€€€€€€€~~~~~~~xxy|~}zwxyz||}}}~€‚|{{}}}}}}}|||}~€‚‚‚‚‚‚€€€€~~}||}}}~~~€€€€€€€€~}}}||||||||{|||}}}~€€€€€|{~€~}~~~~~~~~~‚€€ƒ„‚€ƒ…†„„………………ƒƒƒ„„„„„ƒƒ‚‚‚‚ƒƒ‚‚€€‚‚€€€‚ƒ„…ƒ‚ƒƒ‚‚‚‚‚‚„†ˆ‰‰‰ŠŒŽŽ‹‰‰Š€€€€€€€€€€€€€€€€~~~~}}}}||}|}||||||||||||||}|{{zzxxxyyxwxxxwwwwwwvvvwwwvvvvvwwxxz|}|}}zvutstvy}€‚ƒƒƒƒ‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„ƒ‚…€€‚‚‚„…†‡‡‡†…††…„‚€}{z{~€‚‚…„‚€€€~}}||{z{{||{zz{{|~€ƒ…‡††…„„ƒ‚‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚‚ƒƒ„„„……††‡‡‡‡…‡‰ˆ…„†ˆ††………„„„„††~€€~~}|}}~‚‚€~}€€€€€€€€€‚‚‚€‚„…‚€€‚‚‚€€€~}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~}}}}~~‚ƒ‚‚‚ƒ‚‚‚ƒƒƒƒƒƒƒ‚‚‚ƒ„„„ƒ‚‚ƒƒ‚‚€€€€‚††‡‡‡†„‚‚€~~~~€€€€€€€€€€~~~~~~~~}~€€€€€€~~€€~~~~{zz|}}zxyz{|}}||}~~~{zyz}~~€‚‚‚‚€€€€~~€€€€}}}~~~~~€€€€€~~}||||||||{|||}}}~€€€€€|{~€~}~~~~~~~~~€€‚ƒ‚ƒ…†„„………………ƒƒƒ„„„„„ƒƒ‚‚‚‚ƒƒ‚‚€€‚‚€€€€‚‚„…ƒ‚‚‚‚‚‚‚‚„…ˆ‰ŠŠ‹‹ŠŠ‹ŒŒŠˆ€€€€€€€€€€€€€€€€~~~~}}}}|||||||||||||||||||||{zzyyxxxyxwxxxwwwwwwvvvwwwvvvvvvwxxz||||}zvutstvy}€‚ƒƒƒƒ‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„ƒ‚„€€‚‚‚ƒ„…†††…………„ƒ‚€~}}‚………€€€‚ƒ€€€€~~}|{{{}~ƒ„……„„ƒƒ‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒƒ„„„………††‡‡‡…‡ˆˆ……†ˆ††……„„„„„††~€€€€€€€€€€~}|||}}~‚€~~€€€€€€€€€€€€€€€€€€‚„…‚€€‚‚‚€€€€€~~€~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~}}}}~€‚‚ƒ‚‚‚ƒƒƒƒƒ‚ƒ‚ƒƒƒ‚ƒƒ„„„ƒ‚‚ƒƒ‚€€€‚…††‡‡†„‚‚€~~~€€€€€€€€€~~~}~~~~~~€€€€€€€€€€€~~~~}||}}{z{||}}}||z{{{zz|~€€‚‚ƒƒ„ƒƒ‚€€~~~~}€€€€€€}}~~~~~€€€~~||}|}|}|{{||}}}}€€€€€|{~€~}~~~~~~~~~€‚‚‚ƒ…†„„„……………ƒƒ„„„„„„ƒƒƒ‚‚‚ƒƒ‚‚€€‚‚€€€€€‚ƒ„ƒ‚‚‚‚‚ƒ…‡‰‰ŠŠ‹‰‰‹Ž‹ˆ€€€€€€€€€€€€€€€€~~~}}}|{{{{{{{{||||||||{||||{zzyxxxxxxwxxxwwwwwwvvvwwwvvvvvwwxxz|}|}}zvutttvz}€€‚ƒƒƒƒ‚‚ƒ‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„ƒ‚„‚‚‚ƒ„…………ƒƒƒƒ‚‚‚‚„…„ƒ€€€€€€€€€€€‚‚‚€}|zzz{|~€ƒƒƒƒƒƒƒƒƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒƒƒƒ„„…………††‡‡…‡ˆ‡†…†ˆ………„„„„„„††~€€€€€€€€€€}}|{{{|}€€~€€€€€€€€€€€€€‚€€€‚„…€€‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~}}}}~€€‚‚‚‚‚‚‚‚„„ƒƒ‚‚‚‚ƒƒƒ„ƒ„„„„„‚ƒƒ„ƒ‚€€…†‡‡ˆ†„‚€~~€€€€€€€€€€}~~~~~€€€€€€€€€€€€€~~€~}}}||}}~~~}||yz{||‚…€€€€€€€€€€€€€€€€€‚‚~~~€~€€€€~~}}}}}}}}{||}|}}~€€€€€|{~€~}~~~~~~~~~}‚ƒ‚€‚‚„„…ƒ„„…………„„„„„„„„„ƒƒ‚ƒ‚ƒƒƒ‚‚€€‚‚€€€€€ƒ„‚€‚ƒ‚‚€‚„†‡‡‡‡ˆ‰ŠŠ‰‰ˆ€€€€€€€€€€€€€€€€~~}}||z{z{z{z{||||||||{{|||{zyxxxxxxwwxxxwwwwwwvvvwwvvvvvvvwxxz||||}zvuuttvz~€€‚ƒƒƒƒ‚‚‚ƒƒƒƒƒ„„ƒ„ƒƒƒƒ„„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ……„ƒ€€‚ƒ„……‚‚‚‚‚‚‚‚„ƒ‚ƒƒ~{€€€€€€€€‚‚‚}{zyyyyz|}~‚‚‚ƒ‚ƒƒƒ‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒƒ„„„„…………††‡†‡‡‡†††‡……„…„„ƒƒ„††~€€}}{{z{{|~€€€€€€€€€€€€€€€€€€‚€€€‚‚……‚€€€‚‚€€‚€€€€€€€€ƒƒ‚€€€€€€€€€€€€€€€€€€€€€€€€~~}}}}}}}~€‚‚ƒƒƒ„ƒƒƒƒ‚‚‚„„„„……………„„ƒ„„„ƒ€€€…††‡‡†„‚€~€€€€€€€€€}}~~~~~€€€€€€€€€€€€€€€€‚€}}}~~~~~}|}~}~ƒ…€€€€€€€€€€€€‚€€€€€€~~~€€€€€€€~~~~}}}}}}}}{{||}}}}€€€€€|{~€~}~}~€‚‚€€€‚‚ƒ„„„ƒƒ„………„„„„„„„„„„„ƒƒ‚ƒƒƒ„‚‚€€‚‚€€€€€€ƒ„‚€‚‚ƒ‚€‚„†‡‡‡„†ˆˆ†……†€€€€€€€€€€€€€€€€€~}||{{z{z{z{z||||||||{{{|{zyyxxxxxwwwxxxwwwwwwvvvwwwvvvvvwwxxz|}|}}zvvutuwz~€€‚ƒƒƒƒ‚‚ƒ‚ƒƒƒƒ„„„ƒƒƒƒ‚„„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ……„~ƒ~€‚ƒ„„‚‚‚‚ƒƒ‚‚‚‚|z{|}~€‚ƒƒƒ„‚‚‚}{zyyyyz{}~‚‚‚‚ƒƒƒƒƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒƒƒƒ„„„„…………††‡†††‡‡‡†…„„„„ƒƒƒ„††~€€~}|{{z{{|}€€€€€€€€€€€€€‚€€€‚‚„…€€€‚€‚€€€€€€€€€€€ƒ‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}}}}}}}}~€‚ƒƒƒƒƒƒƒƒ‚ƒ‚‚ƒ„„…………„…„ƒ„„„ƒƒ€€„†‡‡ˆ†„‚€€~~€~€€€€€€€€~~~|}~~€€€€€€€€€€€€~~~€€€€€€||}~€‚ƒƒ……„ƒ‚€€€€€}~~~~€€€€€~~~~~~~}~}~}~{||||}}~€€€€€|{~€~}~~~€€€€‚ƒ„„„„ƒƒ„„…„„„„„„„„„ƒƒ„„ƒƒƒƒƒ„‚‚€€‚‚€€€€ƒ„ƒ‚‚‚‚‚ƒ„‡ˆŠŠŠ‡ˆ‰‰‰ˆ‡†€€€€€€€€€€€€€€€€€€~}|{{{{{{{{{{||||||||z{{{{zyywxxxwwwwxxxwwwwwwvvvwwwvvvvvvwxxz||||}zvvuuuw{~€‚ƒƒƒƒ‚‚‚ƒƒƒƒƒ„„„„ƒƒ‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ††„~€‚‚‚‚€€‚ƒ„‚‚‚‚€€‚‚||}~~~~~{|}€‚ƒ„‚‚‚€}|yyyz{}€ƒƒƒƒƒƒƒƒ‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒƒ„„„„„„…………†ˆ†…†‡ˆ‡…„„„„ƒƒƒƒ„††~€€€€€€€€€€~}|{{{{{|}€€€€€€€€€€€€€€‚‚……‚€€€‚€‚€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€~~~~}}}}}}}~€‚ƒ‚ƒƒƒ‚‚‚ƒƒƒƒƒƒ‚ƒ„„„„„ƒ„ƒƒ‚ƒƒƒ‚€€€€~„††‡‡†„‚€~~€€~~€€€€€€€€~~~~|}~~~~€€€€€€€€‚‚€€€€}‚‚€~~~~€€}{{{}~~€‚„„ƒƒƒ‚‚‚‚‚€€€‚‚€~}|}}}}~~~~€€€~~~~~~~~~~{|||}}}}€€€€€|{~€~}~~~€€‚ƒ…„„ƒƒƒ„„„„„„„„„„„ƒƒƒ„„ƒƒƒƒ„„‚‚€€‚‚€„…ƒ‚‚‚‚‚‚‚‚ƒ†‡‰Š‹‹‰‰Š‹‹‹Š‰€€€€€€€€€€€€€€€€€~}{{z||||||||||||||||zz{{{zyxwxyxwvwwxxxwwwwwwvvvwwwvvvvvwwxxz|}|}}zvvvuuw{~€‚ƒƒƒƒ‚‚‚‚ƒƒƒƒ…„„ƒƒ‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ††„~~€‚‚‚‚€€€€€‚ƒ‚‚€~ƒƒƒ‚€}|z{{{||}}~~}|yyz{}ƒ……„„ƒƒ‚‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒƒƒƒ„„ƒƒ„„…………ˆ†……ˆˆ‡…„„„ƒƒƒƒ‚„††~€€€€€€€€€€€~||{{|z{}€€€€€€€€€€€€€€€€€‚„…‚€€€‚ƒ€€€€€€€€€~~€€~€€€€€€€€€€€€€€€€€€€€€€€€€~~~~}}}}}}}~€‚ƒƒ‚‚‚ƒ‚‚‚‚ƒƒƒƒ„‚‚ƒƒƒ‚‚ƒ‚‚‚‚‚‚€€€„††‡‡†„‚€~~€€~~~€€€€€€}}~~~~|}~~~€€€€€€‚‚‚€€€{~‚ƒ~}~‚‚‚‚|~€~}}}}}}}}||~~€‚ƒ„„…„„„ƒƒƒ‚ƒ‚€~|{z||}}}~~~~~€€€€€€~~~~~~~~{|||}}}~€€€€€|{~€~}~€~}}‚€‚„…„ƒƒƒƒ„„„„„„„„„„„ƒƒƒ„„ƒƒƒƒ„„‚‚€€‚‚€„…ƒ‚ƒƒ‚‚‚‚‚‚„†ˆ‰‰‰†‡ˆŠŠŠŠ‰€€€€€€€€€€€€€€€€€~}|zz|||}|}||||||||||zz{{{zyxwxxxwvwxxxxwwwwwwvvvwwwvvvvvvwxxz|}|}}zvwvuux{€‚ƒƒƒƒ‚‚‚ƒƒƒƒƒ……„„ƒ‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ††„~~€‚‚‚‚€€‚€€‚‚‚‚‚€€}}‚‚‚ƒ„……„ƒ‚‚€~|zxxz{{||{zzyyz|~ƒ…††……„ƒ‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒƒ„„„ƒƒ„„„………ˆ†„…ˆ‰‡…„„„ƒƒƒ‚‚„††~€€€~}||||yz|~€€€€€€€€€€€€€€€€€€‚‚‚€‚„…‚€€€‚ƒ€€€€€€€€~~}~‚€€€€€€€€€€€€€€€€€€€€€€€€€~~}}}~€€€}{{z{{{}€‚‚‚ƒƒƒ‚‚‚ƒƒ‚ƒƒƒ„ƒƒ‚‚„…†…„ƒƒ„„ƒƒ„„ƒ‚‚€€€€ƒ‰ˆ‡…ƒ€~~~€€€€~~~~~‚€~}}~~~~~~~~~~~~€€€€€‚‚‚‚€}}~~€~~~€€~}|||~~~|||~~}~~€‚‚€€€~|zy{|}~€€€€€}~€€€€~~~~}|}}}}~~~~~~€€€~}}€}~~~€€€ƒ~~ƒ†ƒ‚„ƒƒƒ„„……†…„„„„„„„ƒƒ„…†………ƒ€€€€„…ƒ‚€ƒƒƒƒ‚‚‚‚€ƒ„„„ƒ†„ƒƒ„……„€€€€€€€€€€€€€€€€€€~}}|}}}}}}}}}}{{|{|{|{yyxxxxxxyxxwwwwwxxwwwwwwvwwxxwvuwvuvwwxzz}~}}|zxuttvy}€‚‚‚‚ƒ„„ƒ‚‚‚„„„„„„„„‚‚ƒƒ„„ƒ„ƒ‚‚„ƒƒ„……„ƒƒƒ……„€ƒƒƒ‚‚€€€€€€€€‚ƒ……ƒ€€€€€€‚‚‚ƒƒ„„ƒƒ‚}~~~~}|{zzz{~…‡†††…„„ƒƒƒƒƒƒƒƒƒƒ„ƒƒ‚ƒƒ„…„„„„„„……††††††††„ƒ„ƒ„ƒ„ƒ‡†„€||‚€~~€€~}|{~}||}ƒ€€€€€€~~€€‚€€€‚ƒ€‚ƒ‚€‚‚€‚€€€€€€€‚‚‚‚ƒƒƒƒƒƒƒƒ€€€€€€€€€€€€€€€€€€€~~}~~~~~}|{{{|}~€ƒƒ‚‚‚ƒ‚ƒ‚ƒ‚‚‚ƒƒƒƒƒ‚‚‚„……„ƒƒƒ„„ƒƒ„„ƒ‚‚€€€€ƒˆ‡†„‚€~~~~~~€€~~~~~~~~~~~€€€€€€‚€~~~~~~~~€€€€€€€€€€}~~~}|}}|}|}}}}~~€‚€€€~|zz{|}€€€~€€€€€€~~~~}}}}}}~~~~~€€€€~}}€}~~~€€€~~€ƒ~ƒ†…ƒ„„„„ƒƒƒ„„…„„„„„……ƒ‚‚ƒ„„„„…ƒ€€€€„…ƒ‚€‚ƒ„ƒ‚‚ƒ€‚ƒ„„„„…„„„……„„€€€€€€€€€€€€€€€€€~}|||}|}|}|}|}{{{{{{{{yyxxxxxxxxwwwwwwxxwwvwwwvwwxwwvuwvuwwwxzz}~}}}{xvvuwz~€€‚‚ƒ‚‚ƒ„„„‚‚‚„„„„„„„„‚‚‚ƒƒƒƒƒƒ„ƒ‚‚ƒƒƒ„……„ƒƒƒ……„€ƒƒƒ‚‚€€€€€€€€ƒ……ƒ‚‚ƒƒƒ……„ƒƒƒƒƒ€~}|zzz{~…‡………„ƒƒƒ‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚ƒƒ„„„ƒƒ„„……††…†…†…†ƒ„ƒ„ƒ„ƒ„††„€}}‚€~€€€€~}||||{{|~€€€€€€€€€‚€€€ƒƒ€‚‚‚€‚‚€‚€€€€€€€€‚‚‚ƒƒƒƒƒƒƒƒ€€€€€€€€€€€€€€€€€€€~~~~}}}~}}|||}}€‚ƒƒƒƒ‚ƒƒƒƒ‚‚‚‚ƒƒƒ‚‚‚ƒƒ„ƒ‚‚ƒ„„„ƒƒ„„ƒ‚‚€€€€ƒ††„ƒ€~~~~~~~~€€€€€~~~~€€€€€€€€€€~~~~~~~~~~ƒ‚‚‚€€‚€~~}{~}|{{{}}|}}~€€€€€~|{z||~~€~~}€€€€€~~~}}~}}}}~~€€€€€~}}€}~~~€€~}}~~~‚†…†‡……„ƒƒƒƒƒ„„ƒ„„……†‚‚‚ƒ„„ƒ„ƒ€€€€€„…ƒ‚€‚ƒƒ‚‚„€‚ƒ…„…„…„……‡†…„€€€€€€€€€€€€€€€€€~|||||||||||||{{{{{{{{yyxxxxxxyxxwwwwwxxwwwwwwwwwwwwvvwvvwwwwyz|~}}|{xxwwy|€€€‚‚ƒƒƒƒƒ„„ƒ‚‚‚‚„„„„„„„„„ƒƒƒƒƒƒ‚‚ƒ‚‚‚ƒƒƒ„……„ƒƒƒ……„€ƒƒ‚‚‚‚€€‚„…„ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ„„………„„„„„„ƒ}|zzz{}„†„„„ƒƒ‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚ƒƒ„ƒƒƒƒ„„…………„…„……„ƒ„ƒ„ƒ„ƒ†…„€~|€~~}}}|{{{|}€€€€€€€€€‚€€€€ƒ„€‚€‚‚€‚€€€‚€€€€€€€‚‚ƒƒƒƒƒƒƒƒ€€€€€€€€€€€€€€€€€€}}||}}}}}~~€€‚ƒƒƒƒ€‚„ƒƒ‚‚‚ƒ‚‚‚‚ƒƒƒ‚‚ƒ…„„ƒƒ„„ƒ‚‚€€€€ƒ„„ƒ‚€~~~€}}~~€€~~~€€€€€€€€~~~€€€€€€€€‚€€~~}}~~~~~~~~ƒ‚‚€€€}~~~|{~}||{||}{||}~€€€€~}{z|}}€€€€}|~~~~~€}}}}}}~~€€€€€~}}€}~~~€€~}|||~~~€‚…†‡„„ƒƒƒƒƒƒ„„„„„„……ƒ‚‚ƒ„……„„‚€€€€€€€„…ƒ‚€‚‚‚ƒƒƒ‚ƒ……†……„……‡‡‡…„€€€€€€€€€€€€€€€€~}|{{{{{{{{{{{{zzzzzzzzyyxxwxxxxxwwwwwxxxwwvwwxwwwwwwvvwvvwxwwxz|}}|}{yzyy{~€€€‚ƒƒ„„„ƒƒƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒ…„„„ƒƒ‚‚‚‚‚‚‚‚‚‚ƒƒ„……„ƒƒƒ……„€‚‚‚‚‚‚‚‚€€‚ƒ„„„‚‚‚‚‚‚‚‚„„„ƒƒƒƒƒ‚‚‚ƒƒƒƒƒ‚ƒ„†……ƒ‚……„ƒ|{zzzz}€ƒ…ƒƒ‚ƒ‚‚ƒƒƒƒƒƒƒƒ‚‚‚ƒ‚ƒƒƒƒƒƒƒƒƒ„„„„„„„„„„ƒ„ƒ„ƒ„ƒ„……„‚~}~€€€~~~~~}}}|}|}}~€€€€€€‚€€€€ƒ„€‚€‚‚€‚€€‚€€€€€€€€‚‚ƒƒƒƒƒ‚‚‚‚€€€€€€€€€€€€€€€€€€~~}}}~€€€€€‚‚‚‚‚€‚ƒ„ƒ‚‚‚‚‚ƒ‚‚ƒƒ‚ƒ…„„ƒƒ„„ƒ‚‚€€€€ƒƒƒ‚€~~~}|€~~€€€~~€€€€€€€€€€€€€€€€€‚‚‚‚‚€€~~}}}~~~~~}~~€€€~}|{{}}}{}}~~~}}|{{||~~€}|{|}~~€€~}~~~~~~~€~}~~~~~€€€€€~}}€}~~~€€~}||||}~~€‚…‡„ƒƒƒƒ„„………„„„„„„ƒ‚‚ƒ„……„„‚€€‚€€„…ƒ‚€‚‚‚ƒƒ‚‚„…††††……†‡‰ˆ‡…€€€€€€€€€€€€€€€€~}|{zz{{zz{z{zzzyyzyzyzyyyyxxxxxyxxwwwwwxwwvwwxxwwwwvvvvwvvxxwwx{|}||||z{{{}€€€ƒƒ„„„„ƒƒƒ‚ƒƒƒ‚ƒƒƒƒƒƒƒƒ……„„ƒƒƒ‚ƒ‚‚‚ƒ‚‚‚ƒƒ„……„ƒƒƒ……„€‚‚‚‚‚‚‚‚€€‚‚ƒ„‚‚‚‚‚‚‚‚„„„„ƒƒ‚‚‚‚ƒ‚ƒƒ„„ƒƒƒ‚ƒ‚‚‚ƒƒƒ€}{yzzzz|‚„‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ„„„„„„ƒƒƒƒƒƒ„„„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„……‚}~€€€‚}~~~}}}}}}~~€€€€€€€€€€€‚€€€„„€€€‚‚€‚€€€‚‚‚€€€€€€ƒƒƒ‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€‚€ƒƒƒ‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚„…„„ƒƒ„„ƒ‚‚€€€€ƒ‚‚‚€€€~~||€€€~}}}~€€€€€€€€€€€€€€€€€€€‚‚‚‚€~~~~~~~~~}}}}~~~~~~~~|{z{|}|{|}~~}{||}}~|{}}~~€€~~~~~€€~~~~~~~€€€€€€~}}€}~~~€€~}}~~|}}…†„ƒƒƒ„„…††……„„ƒ„„‚‚‚ƒ„„ƒƒ‚€€‚‚€€€€„…ƒ‚€€‚ƒ‚‚ƒ‚ƒ„†‡‡‡‡†††ˆˆ‰‡†€€€€€€€€€€€€€€€€~}|{zzzzzzyzyzyzyyyyyyyyyyxxwxxxxxwwwwwwwwwwwwxxxwwvvvvwwvwxxwvw{|}||}|z|||~€€‚‚ƒ„„„„ƒƒ‚ƒƒƒƒ‚ƒƒƒƒƒƒƒƒ…„„„„„„ƒ„ƒ‚ƒƒ„ƒ‚ƒƒ„……„ƒƒƒ……„€‚‚‚‚ƒƒ€€‚„‚‚‚‚‚‚‚‚„„ƒƒ‚‚ƒƒƒƒ„„„…ƒ~‚€~}zy{zzz|~ƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒ„„………„„„ƒƒƒƒ„„…„„ƒ„ƒ„„„ƒ„ƒ„ƒ„ƒ„„……ƒ~~€€€‚}~~~}}|||}~~~}~€€‚€€€„„‚€€‚‚€‚€€€‚‚‚€€€€‚ƒ„‚‚€€€€€€€€€€€€€€€€€€€~~€€€‚‚‚‚ƒƒ„ƒ‚‚‚‚€€‚‚ƒƒ‚‚ƒƒƒƒƒ‚‚‚‚‚‚‚„…„„ƒƒ„„ƒ‚‚€€€€ƒ‚‚‚‚€~}}|}}~~€€~}}}~€‚€€€€€€€€€€€€€€€€€€~~~~~~~~~~~}}}||}}}~€€~|{{}}|{{{|}~~||}}~€€‚‚‚€~|{}}~~€€€€~~~~€~~€€€€€€€~}}€}~~~€€€~~€ƒƒ~‚†‡……„„„……………„„„„„…ƒ‚‚ƒ„„„„ƒ€€‚‚€€„…ƒ‚€‚ƒ‚€‚ƒ„…†ˆ‡‡‡‡††‡ˆ‰‰ˆ€€€€€€€€€€€€€€€€}|{zyyyzyyyyyyyyxxxxxxxxyyxxxxxxyxxwwwwwwwwvwwxxxwwvvvwwwvwxxwvw{|}{|||{}|}~‚ƒ„ƒ„ƒƒ‚‚‚ƒƒƒ‚ƒƒƒƒƒƒƒƒ„„„„„…………ƒ‚ƒ„…„ƒƒƒ„……„ƒƒƒ……„€‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚€€ƒƒƒƒ„„„„…„‚€€€€€}|{{zyz{~ƒ‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ„„…„„„„„ƒƒ„„……„„„„„„„„„ƒ„ƒ„ƒ„ƒƒ„…ƒ€~~~€€€‚~|~}|{{z{{}}~|{z‚~€€€€€‚€€€‚„…€€€‚‚€‚€‚ƒ‚€€€€‚~€ƒ…€€€€€€€€€€€€€€€€€€~~€€€‚ƒ„„„‚ƒ„……„ƒ‚ƒ‚‚‚‚‚‚ƒƒ‚ƒƒ„ƒƒƒ‚‚‚ƒƒ‚ƒ„…„„ƒƒ„„ƒ‚‚€€€€ƒ‚‚‚‚‚‚‚‚€€~}||}}}}€€€~€€€€€€€€~~~~~}|}}}~~€~~~}}||||}}~€€}}}}{z{zz{|}€||}~€€‚‚‚€~|{}~~~~~~~~}}}}~€~~€€~~~€€€€€€€€~}}€}~~~€€€‚††ƒˆ‰††……„„„…„„„„„„…†„ƒƒ„…†……ƒ€€‚‚€€„…ƒ‚€‚‚‚‚ƒ„†‡ˆˆˆ‡ˆ‡†‡ˆ‰‰‰€€€€€€€€€€€€€€€€}|{zyyyyyyyyyyyyxxxxxxxxyyxxxxxxxxxwwwwwwwwwwwxxxxwvvvwwwvwyxwvw{||{{}|{}}}€}€‚ƒƒƒƒƒƒ‚‚‚ƒ„ƒ‚‚‚‚‚‚‚‚‚ƒƒ„„……††…„ƒƒ…†„ƒƒƒ„……„ƒƒƒ……„€‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚ƒƒ~~€‚ƒƒƒƒƒƒƒƒ‚€~~ƒƒƒƒ„„„„‚ƒ„„ƒ€}|€€€~}{zyz{~‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚ƒ„„„ƒƒ„„„„„„……„„„„„„„„ƒ„ƒ„ƒ„ƒ„ƒ„…„€~}~€€€‚‚~{€~}|{zzxy{|{zyx‚~€‚‚€€€‚„…‚€€€‚‚€‚€‚ƒ‚€€€€ƒ~~€ƒ…€€~~€€€€€€€€€€€€€€€€~€€€€‚ƒ„„„ƒƒƒ‚‚‚‚‚‚‚‚ƒƒ„„‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ…„‚ƒ„„ƒ~~†‡‰Š†€}€ƒ~~}}}~~~}}~~€€€€€€€‚‚‚€€€€€‚}||||{{|}}}}|zz{}€ƒƒƒ}||}~|{|}~~~}}}}~~~~}}}}|{zzyy||||}~€€€€~~€€~€}}~~}~~~~~~€€€€}}€€~€€€~~~€‚‚‚‚‚‚‚‚…………„„„ƒ„„„„„„„„…†‡‡†…„ƒ|}€ƒƒ‚‚€~€‚ƒ††„‚‚€€€‚ƒ‚‚…ˆŠ‰ˆ‹Š‰‰‰ŠŠŠ€€€€€€€€€€€€€€€€{{{zzzyyzzzyyyyyyyyyyyyywwxxxxyyxxxxxxxxxxxxwwwwwwwvvvuuwuvxyxxz{|}}|{{{vwy|€€~‚ƒƒƒƒ„„„„ƒƒƒƒƒ„ƒƒ‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ……„„„„ƒƒ„„„„ƒ‚€€ƒ…†††††…ƒ‚ƒ„†ˆ‚ƒƒ~||}ƒ‚‚ƒ…†…ƒ‚‚‚ƒƒƒƒƒ†…„‚‚‚‚‚‚„…„„„„‚„„ƒ€}}}{ywx{}~~|~€‚ƒƒ‚‚ƒ‚‚‚ƒƒ„„„ƒƒƒƒ„„„„„„„„„„ƒ„„………„„ƒ„„ƒƒ‚‚ƒ„†„~~~€€€€~}}~}|{zz{{|}~~}}~~€€‚‚‚‚‚‚‚‚„ƒ‚€~†„€€€‚‚ƒ‚€~~€€€~€€€€€€€€€€€€€€€€~~€€‚‚‚‚‚‚‚‚ƒƒƒƒƒ‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ„„ƒƒƒƒƒ‚€€~…†ˆ‰…}‚~~}}}~~~|}~~€€~€€€€€€€€€€€~|zyyxxzz{||||{{{{}€‚‚‚€€~|{{{|}}~}}|{~~}}{{{{~~}||{{{||||}~€€€€~€~~~~~~}}}~~~~~~~€€€€€€}}~€~€€€€~~~€‚‚‚‚‚‚‚‚……„ƒ€ƒƒ‚ƒ‚ƒ‚ƒ„„……„ƒ‚~€‚‚‚‚€~€‚‚……ƒ€‚€‚‚‚‚„‡‰‰ˆ‹ŠŠŠ‹‹‹Š€€€€€€€€€€€€€€€€{{{zzzyyzzzyyyyyyyyyyyyyxxxxxxxxxxxxxxxxwwwxwxxxwwwwvvuuwuvxxxxzz|}}||||xxz~‚€~‚ƒƒƒƒ„„„ƒƒƒƒƒƒƒƒ‚‚ƒƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ……„„„„ƒƒ„„„„ƒ‚€€„‡ŠŒŽŽŒŠ‡…ƒƒƒ„‡ˆ‡„~}~ƒ……„‚ƒƒƒƒƒƒƒƒ…………ƒƒ€€„…†††‚„„ƒ€}|}{yxx{}~~|~€‚ƒƒ‚‚ƒ‚‚‚‚ƒƒ„„„ƒƒƒƒ„„„„„„„„„„ƒ„„………„„„„„„ƒƒ‚ƒ„†„~~~€€€€~}}~}||{{||}~~€€€€‚‚‚€€€€€€€€€€€†„€€€€€‚ƒ‚€~€€€€€~€€€€€€€€€€€€€€€€~~~~€€€€‚‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒ‚‚‚‚‚‚‚‚‚‚ƒ‚ƒ‚‚‚ƒ‚ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„ƒƒ‚ƒƒ€€€~€ƒ„††ƒ}~~~}~~~~}}~€€€~~~€€€€€€~~~€€~}{yxwxxyyz{|{{z|||}€€€~|z{|}}}}}{{z~}}|||||~~}}||||||}~€€€~€~}}~~~~~~~~€€}}€€~€€€€~~~€„ƒ‚€}|{€€€€€€€€‚‚‚~€€€‚‚‚€~€‚„…‚€€‚‚‚‚ƒ‡‰‰ˆŠ‰ŠŠŒ‹Šˆ€€€€€€€€€€€€€€€€{{{zzzyyzzzyyyyyyyyyyyyyxxxxxxxxxxxxxxxxwwwwxxxxwwwwvvvvwuvwxwxyz{}}}|}~{{}‚‚€}‚ƒƒƒƒ„„ƒƒ‚‚‚ƒƒ‚‚‚‚ƒƒ„…ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„ƒ„ƒ„„„„„‚€€…ˆ‹ŽŒ‰†„‚‚‚ƒ„„‚€~€ƒ„ƒ‚„„„„„„„„„„……„‚€~€€„†††ƒ„…ƒ€}||{yxy{}}}|~€‚ƒƒ‚‚ƒ‚‚‚‚ƒƒƒ„ƒƒƒƒƒƒ„ƒƒƒƒƒƒƒƒƒƒ„„……„„„„„„„ƒƒ‚ƒ„†„~~~€~}}~~}}|||~~~€€‚‚‚ƒƒ„„„~€ƒ…††„ƒ€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€~~}~€€‚ƒ‚ƒƒƒƒƒƒƒƒƒ‚‚‚‚ƒ‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚„…„‚‚ƒ„‚€~ƒƒƒ~}~€~~}~~~~~€‚‚€€€€€~€~~~€€€€~}{{z{yz{|||{{}||}€€~}}||}}}}|{{}~‚~~}}|||||}~€€€€€€€€€~~~€€€€€€€€~~~~}}~€~€€€~~~€€€€€€€€€‚€€~~||~~~~~~~€€~}|€€‚‚€~€‚„„ƒ€‚‚€‚€ƒ…ˆ‰ˆ‡‡ˆ‰Š‰‡†€€€€€€€€€€€€€€€€{{{zzzyyzzzyyyyyyyyyyyyyyyxxxxwwxxxxxxxxwwwxwxxxwwwwvvvvwvuxxwwyy{|~}}~~~~ƒ‚€}‚ƒƒƒƒ„„ƒƒ‚‚‚‚‚ƒƒ‚ƒ‚ƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„ƒ„ƒ„ƒƒ„„„„ƒ‚€€‚„†‡ˆˆˆ‰ˆ†…„„„„€~~~~}~‚ƒ„„„„ƒƒƒƒƒƒ‚‚€}}€}~€‚ƒ„ƒ……ƒ}||{zyz{}|||~€‚ƒƒ‚‚ƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒ‚ƒ‚ƒ‚ƒƒƒ„„„„„„„„„…„„ƒƒƒ„†„~~~~}}~~~~~~}}€€€ƒƒƒƒƒƒƒƒ„„„„„„„„‚ƒ…‡ˆŠŠƒ‚€€€€€€€€€€€ƒ‚€€€‚€€€€€€€€€€€€€€€€~}~~€€€‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚ƒ…„ƒ‚ƒ…ƒ€€€€~~€~}€€~~~~~}~~~€€€€€€€€€€€€€~~~€€€€€€€ƒ‚€~}|}}z{||}}}|}||}~~‚‚ƒƒ„}z{|}~}€„†ˆ‡…ƒ~~~~~}||||||}~€€€€€€€€€€€~~~€€€€€€€€~~‚‚}|€€€€€~~~~€€€€€€€€€€€€€€~~~~~~~~~~~}|{€‚€~€‚‚„…ƒ‚‚‚‚‚‚€ƒ€…‡‰‰††‡ˆ‰ˆ†…€€€€€€€€€€€€€€€€{{{zzzyyzzzyyyyyyyyyyyyyyyyxxwwwxxxxxxxxxxxwxwwwwwwwwwwvwuvwxvvxyz}}}|}~€€‚„ƒ€}‚ƒƒƒƒ„„ƒƒ‚‚‚‚‚„„ƒ‚ƒ‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„„…„„‚€‚‚ƒ„„ƒ‚‚„„ƒƒ„„……………‚€}}}}|{|~„ƒƒƒ‚‚‚€~{{z||~~~}~‚„„…†ƒ€|{{{zzz}}|z|~€‚ƒƒ‚‚ƒƒƒƒ‚‚‚ƒƒƒƒƒƒƒƒ‚‚ƒ‚ƒ‚ƒ‚ƒƒ„„„„„„„„„„„„ƒƒƒ„†„~~~~~~~}~~~€€‚‚‚„„„„„„„„„„……†‡ˆˆ‚€€€€‚‚‚€€€€€€€ƒ‚€€€‚€€€€€€€€€€€€€€€€~~}€€‚‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ‚ƒ‚‚ƒƒƒƒƒƒƒƒ‚ƒƒ„ƒƒƒ„‚€€~€~€€€~~~~~}}||}~~€€€€€€€€€€€€€~~~€€€€€€€€€€€‚~||{|{||}}~}}}|{|~~€€ƒ…„~|}~€‚‚‚ƒ…‡‰‰‡„‚}~~~}||||||}~€€€~€~~~~~~€€}}~€€~~~~~€€€€€€€€€€€‚ƒƒ~~}|€€€€€~€‚‚……„‚ƒƒ‚‚€ƒ€ƒ‡ˆ‰ˆˆˆ‰‰‰ˆ‡€€€€€€€€€€€€€€€€{{{zzzyyzzzyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxwwwwwwwwwwwwwvuwwvvwy{|}|||}€‚„ƒ~‚ƒƒƒƒ„„ƒƒ‚‚‚ƒƒ…„ƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒ„„„„„ƒ‚€€€‚ƒ„„ƒƒƒƒƒƒƒƒƒƒ……„‚}|}~~|zz|‚€~~€~zxwy{}}~~~~€ƒ…„††„|{{{zz{}}{y|~€‚ƒƒ‚‚‚ƒƒƒƒ‚‚‚‚‚ƒƒƒƒ‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒƒ„„„„ƒƒƒ„„„„ƒƒƒ„†„~~~}~~~~}}~~~€€€€€‚‚‚‚‚‚‚‚€€€€‚‚‚‚‚‚€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€~~€€‚‚‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚ƒƒƒƒƒƒƒƒƒ‚‚ƒ„„„„‚~€‚€€~€€€€~~~~~~}}||}~~€€€€€€€€€€~~}€€€€€€€€€€€~|{{{{z{||}||||{{|~~||~€ƒ„……€‚ƒ„„„„†††……„ƒ‚}~~}|||||}~€€€~€~€€€~~~~~€€€€€€€€}}€€~~}~~~€€€€€€€€€€€€€€€€€€€€~}~€€€€€~€‚ƒ…ƒ‚‚‚€‚‚‚ƒƒ†‰‰Š‰‰‰ŠŠŠ‰€€€€€€€€€€€€€€€€{{{zzzyyzzzyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxwxwwwwwwwwwwwwuvwwuuwy{||{z{{~~‚„„‚ƒƒƒƒ„„„ƒƒƒƒƒƒ„„ƒƒ‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒƒƒƒ„„„„„„ƒ‚€€ƒƒƒƒƒƒƒ„„„„„„„„„‚}}~}}~|{{}~~}||{}{yxxy{|~~~~€‚ƒ…††ƒ€|zz{zz|}}{x|~€‚ƒƒ‚‚‚ƒƒƒƒ‚‚‚‚ƒƒƒƒ‚‚ƒƒƒƒƒƒƒƒ‚ƒƒ„„„„ƒ‚ƒƒƒ„ƒƒƒƒ„†„~~~}}~~~~~}~~€‚‚‚€€€€€€€€€€€€€€€€€€€‚‚€€‚‚‚‚‚‚‚‚€€€€€€€€€€‚€}€€€€~€€€€€€€€€€€€€€€€~€€‚‚‚‚‚‚ƒƒƒƒ‚‚ƒ‚‚‚‚‚‚€€‚‚ƒƒƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒ‚‚„…„ƒ~€‚~~€€€~~~~€~~~~~~~€~€€€€€€~~}€€€€€€€€€‚}|{{{yzz{|{{{{zz|~|}~~~„‡‚ƒ„………„„…ƒ€€ƒ…~~€€~}||||}~€€€~€€~~€€€€~~€€€€€~~€€€€}}~€~}}~~~€€€~~‚‚‚‚‚‚‚‚‚‚€~|~€€~€‚€ƒ„‚€€‚‚‚‚ƒ~‚†ˆ‰‹Š‰‰‰ŠŠŠ€€€€€€€€€€€€€€€€{{{zzzyyzzzyyyyyyyyyyyyywwwxxyyyxxxxxxxxwwwwxxxxwwwwwwwwwvuwwuuwy{||zzzz}}~„„‚‚ƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒƒ‚ƒƒ„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒƒƒƒ„„„„„„ƒ‚€€€€‚ƒ…†‡‡‡ŒŒŠ‡‚~}|}~|{{}~}}|{{zzzzzzz{{|€~}}~~…††„|zz{z{|}}zx|~€‚ƒƒ‚‚‚ƒƒ„ƒ‚‚‚ƒƒƒƒ‚‚ƒƒƒƒƒƒƒƒ‚ƒƒ„„„ƒƒ‚‚ƒƒƒƒƒ‚ƒ„†„~~~}}~~~~}}~~€€‚‚€€€ƒƒ‚€€‚‚‚‚‚‚‚‚€€€‚‚€ƒ‚€€‚‚‚‚‚‚‚‚€€€€€€€€€‚‚€~}€€~€€€€€€€€€€€€€€€€~~€€ƒƒ‚‚‚ƒƒƒ‚‚‚‚‚€€€‚‚‚‚ƒ„„ƒƒ‚‚ƒƒƒƒƒƒ„‚‚ƒ„„ƒ‚‚€€€€ƒ~~‚ƒ€~~}~~~€€~~}}€€€€€~}€€€€€€€~|zyyyxxz{{zzyyyz|~€€€~~~€„†‡‡…ƒ‚€€€€{||}~€€}|{{|}~~€€~}}~~€€~~~}€€€€€€€€€€€€€€€€€~}}~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ„ƒ‚‚‚‚€€€ƒ†‡‡‰‰ŠŠ‰‰€€€€€€€€€€€€€€€€|{zzyzz{yyyyyyyyxxxxyyyywxxxxxxxzyxwwwxxyyxwwwwxwwwwvuttvvvvwwwwz{||{{|}~€ƒƒ‚€€€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒƒ‚‚‚‚ƒ„ƒ„ƒ„ƒ„ƒ„ƒ‚ƒ„„‚€|~„†‡‡‡ˆˆ‰ŠŒŽŽˆ‚}|}~~€€~~|zxxy{|}}}}}}|||~|{{{}~ƒ‡Šˆ{yzzyz{~‚…ˆ…„ƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒ„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒƒƒƒƒ‚„…„€}}}||}}}~~~~~~~€‚€€€€€€€€€€‚‚€€€‚‚‚€€€€€ƒ€€€~€€€€€€€€€€€€€€€€~~€€‚ƒ‚‚‚€‚‚‚‚‚‚‚‚€‚€€‚‚‚ƒ‚‚ƒ„„ƒƒ‚ƒƒƒƒƒƒ„ƒƒ„…„„ƒƒ€€€€‚€~~‚‚€~~~}~€€€€~~€€€€~~€€€€€€€€€~|{zyywxyzzzyx{{|~€€€€€€~~€‚ƒ„‚€€€€~‚€€€€{||}~€~|{{|}~~€€~}~~~~~~~~~~~}~~~~€€€€€€€€~}}~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ„ƒ‚‚€‚ƒƒ‚„‰‰‰‰ˆ‡†…€€€€€€€€€€€€€€€€||zzyyyzyzyzyzyzyyyyyyyyyxxwwxxyyyxwwwxxxxwwwxxyvwwwvvuuvvvvvwwwz{||{{|}~€ƒƒ‚€€€€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒ‚‚‚‚‚ƒƒ„ƒ„ƒ„ƒ„„ƒƒƒ„„‚€„ˆŠŒŒŒŽŽŽŽŽŽŒ‰„~zz|~~~~~~~~}{z{}~~~~}}}}}}{{{{{||}€„ˆ†|{|zzz{}€„†……ƒ‚‚‚‚‚ƒƒƒƒƒƒƒƒƒ„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒƒƒƒƒ‚„…„€~}}}}}~~~~~~€‚€€‚‚‚‚€€€€€‚€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚€€€€€‚‚ƒƒ‚‚‚‚€€€‚ƒƒƒ‚‚ƒƒ„ƒƒƒ‚ƒƒƒƒƒƒ„„„………„„„€€€€‚€~~‚‚€~~}~}~€€€€€€€€€€€€€€€~~€€€€€€€€€€€€€}|{{{z{{|||||~~~€€€~}~€~~~~~~~}}|‚€€€~||}}€€€~|{{|}~€~~~~~}}~~~~}~~€€€€€€€€€}}}~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ„‚‚‚‚‚‚‚‚‚ƒ‚€‚ƒ……†‡‡†††€€€€€€€€€€€€€€€€}|{yyxxxzzzzzzzz{{{zyxxxzyxwwwyyyyxxwxxxwwwwxxyywwxwxwwvvvvvwwwwz{||{{|}~€‚ƒ‚€€€€‚‚ƒƒƒƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒƒƒ‚‚‚ƒƒ„ƒ„ƒ„ƒ„ƒ„ƒƒƒ„„‚€€‚†‰ŽŽŒŒŠˆ‡†…………‚~|||~}||}~€~|||}~~~~~~~}}}yz{{|||{}„ƒ€}}~{zzz|‚„†…„ƒ‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒ„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒƒƒƒƒ‚„…„~~~~~€€~~~~€‚‚‚‚‚‚‚‚‚€‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚€€~~€‚ƒ„‚‚‚‚‚€‚‚ƒƒ„„„ƒ‚‚‚ƒƒƒƒƒƒ„„„„„„„„„€€€€~~€}~~~}~~~€€€€€€€€€€€€€€€€€€€€€€€~|}|}}~~~€€€€€€€€~~€€~~~}}}~}}}|}}}~}||}}~~€€€‚‚‚€~|{{|}€€€~~~~~~€€€€€€€€€€€€€€€€€€€~}~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒƒ‚‚‚ƒƒƒ‚€‚‚ƒ„……†……€€€€€€€€€€€€€€€€~}{zxxxx{{{{{{{{}}|{zyxxzyxxwxxyxxxxxxxxwwwxwxxywxxyyyxxvvvwvwwwz{||{{|}€‚‚€€€‚ƒƒ„ƒƒ„„„„„„ƒƒƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒƒ‚‚‚ƒƒƒƒ„ƒ„ƒ„ƒ„„„ƒ„…„‚ƒ‡ˆŠ‰‰ˆˆ‡†„ƒ‚‚‚~|{{}}||{|}}}{zz|}}}~~}}||}}}}}}}€‚}}~{{zz{~€‚††„„‚ƒƒƒ‚‚‚ƒƒƒƒƒƒƒƒƒ„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒƒƒƒƒ‚„……~€€€€~~~~€‚€‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€‚‚€€€~}}~‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚…„„ƒ‚‚‚‚ƒƒƒƒƒƒ„ƒƒƒƒƒƒƒƒ€€€€€~~€€~}}~~~|}~~~}~~~~~€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~€€€€€~~‚‚}}}||}~~~~{{|~~|yv}}~~€‚‚‚~}|||~€€€~~}€~~€€€€€€€€€€€€€}}}~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ„‚‚‚‚ƒ‚€€€€€€‚ƒ„„„„„‚€€€€€€€€€€€€€€€€€~|zzxyx|||{|{||~}}{{yyxyyyyyxxxxxxxxxxxxxxxxwwwwwxxxxxxvvvvwwwwz{||{{|}‚‚€€‚ƒ„ƒƒƒ„„„„„ƒƒƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„ƒƒ‚‚‚ƒƒ„ƒ„ƒ„ƒ„ƒ…„ƒ„……ƒ~‚ƒƒ‚‚€‚‚‚~}~~~}|{|}{{||}||{zyyz}~€~~}}}~~~‚„€€~|{{{{zz{~€‚†……ƒƒ‚ƒƒ‚‚‚ƒƒƒƒƒƒƒƒƒ„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒƒƒƒƒ‚„†„‚€€€€€€‚‚~~~~€‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~€€€~~~~}~~€€‚‚‚‚ƒƒƒ‚‚‚ƒƒ‚‚‚ƒƒ„‚ƒƒƒƒƒƒ„ƒƒ‚‚‚ƒƒƒ€€€€~~~€€~}}~~~|}~~~}~~~~~~~~~~€€€~~€€€€€€€€€€€€€€€€€‚‚ƒƒƒ‚‚ƒ‚€€~~~€}{z{|}~€€€}}}~~{xu}}~€‚ƒ‚‚€}||}~€€€€~}}~~~~}}~~~€€~~~~€€€€€€€~}}~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒƒ‚€€‚€€€‚„ƒƒƒ‚‚‚ƒƒƒ‚€€€€€€€€€€€€€€€€~}|zzzz|}|}|}||~~}|{{zzyzyzyyxwwwxxyxxxxxxyxxwvvvvwwwvvvvvwvwwwz{||{{|}€‚€€‚‚‚ƒƒ„ƒƒ„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„„„ƒƒ‚ƒƒ„ƒ„ƒ„ƒ„ƒ„…„„„……ƒ€€€~|z{|||zywvxyz{||}}z{|}}|{zzz{}‚‚€€~}}}~~~~€ƒ†ˆ„ƒ‚€}{zy{zzz|‚„†…„ƒ‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒ„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒƒƒƒƒ‚„……‚€€€‚‚‚~~~~€‚‚‚‚‚€€€€€‚‚€€€€€€€€€€€€€€€€€€€€€€€€€}}~~€€~~}}}~~~~‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ„…‚ƒƒƒƒƒƒ„„„ƒ‚‚ƒ„„€€€€~~€€~}}~~~~}~~€€~~~€€€~~€€€€€€€€€€€€€‚„„ƒƒƒ„…†„ƒ‚ƒƒƒ€€€€€€~|zz{}}~€€€}|}~~€€ƒƒƒ‚~||}~€€€€~}}~~~~~~~~~}}~€~~~~€€€€€€€€}}}~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚ƒ‚€€‚€€€‚‚ƒ„…„‚€‚ƒƒƒƒ€€€€€€€€€€€€€€€€~}||||}}}}}}}}}}}}|}|||zzzyyxxxwwxyyyxxwxxxyxwwwwwwwvvuvvvvwwwwz{||{{|}€‚€€‚‚‚ƒƒ„ƒƒƒ„„„ƒƒ‚‚‚ƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„„ƒƒƒƒ„„„ƒ„ƒ„ƒ„ƒ…„„………ƒ‚€€€|yxz{||{ywvwxz|}|{y||||||||||}ƒƒƒ€~~}}|~}~~ƒ„…„~|{zzzz{}€„†…„ƒ‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒ„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒƒƒƒƒ‚„†…ƒ‚€€€‚‚~~~~€‚€€‚‚‚‚‚€€€€€€‚€€€€€€€€€€€€€€€€€€€||}}~€~~}}}}~~~}}€€€‚‚‚‚‚ƒƒƒƒƒ‚‚‚ƒƒ„‚ƒƒƒƒƒƒ„……„ƒƒ„……€€€€~~~€€~~}}~~~~~€€€€€€€~~€€€~~€‚€€€€€€€€€‚ƒ„ƒƒ‚‚ƒ……‚‚‚‚‚€€~}~|{||~~~~‚€ƒ……}~~€‚ƒƒƒ‚~}}}~€€€€€€~}}~~~€€~~€€~€€€€~}}~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚€€€€€€€‚ƒ‚€‚ƒƒ‚ƒƒƒƒƒ‚‚‚‚ƒƒ‚‚€€€€€€€€€€€€€€€€€~~}}}~~}}}}}}}}|||}}}}~{{yxwxxyvwxyyyxxvwxyyyxxyyyyxxwvvvvvwwwwz{||{{|}€‚€‚‚‚ƒƒ„„ƒƒ„„ƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„„„ƒƒƒƒ„„ƒ„ƒ„ƒ„ƒ„……„…†…ƒ‚€€~{xvyz{}}|zyxxy{|~~~}}{{{||}}}~‚ƒƒ‚€~}}||~~~~~}}|…ƒ~}|{zyz{~‚…ˆ…„ƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒ„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒƒƒƒƒ„†…ƒ‚‚ƒ€€€‚~~~~€‚‚‚‚‚‚‚‚‚€€‚‚€€€‚‚‚€€€€€€€€‚€€€€€€€€€€€€€€€€€~€~~~€€€€€~€€€€€‚‚‚ƒ„„†…„ƒ‚‚ƒƒƒ‚ƒ‚ƒ‚ƒ‚ƒ„……„„‚€€~}~€€}~~~~~~}€€€~€€€~~~~~~€}~€€€€€€€€‚‚‚‚‚ƒ„…†„ƒƒƒ‚‚~~€€€~€|z{|€€€€€€~~~€ƒƒ„‚}}~~~~€€~~~~~~~}~€€€~~~‚€~}|}~€~~~}}}}}€€€€~€€€€€€€€€€€€€€€€€€€€ƒ„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€~~}}|}}|||}}}}|zzzzzzzz{||{yxxywwxxxyyywwwwwwwwwwxxxxwvxwwwvwwwxz||{zz{ƒƒ€‚‚ƒƒƒƒƒ„‚‚‚ƒƒ‚‚ƒƒƒƒ„„ƒƒ„„„………ƒƒƒ‚‚ƒƒƒƒ„„„ƒ‚ƒƒ‚ƒƒƒ‚‚ƒƒ€~~€€}zyz{{zyxxywxyz{|||}}}~~}}}~~€€€€€~~}|{{{}~|zz~‚ƒƒƒƒ‚}|zzz{~‚†ˆ†…„ƒ‚‚‚‚‚‚‚ƒƒƒƒ„„ƒ„ƒ„ƒ„ƒ„ƒƒƒƒƒƒ„„ƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒƒ€ƒ„ƒ‚€~€‚‚‚~€‚‚‚‚‚€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚ƒƒ„ƒƒƒ‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒƒƒƒƒƒƒ„„‚€~}~€€€~~}}}~~~€€€€€€~~~~€€~~€€€€€€€€€€€€€‚‚‚ƒƒ‚‚‚‚ƒ„ƒ‚‚‚€€~~€}{{|~€€€~|zy~~~€‚ƒƒ‚}}~~~~€€~~~~~~~~~}~~~€€€€€€‚€~}|}~€€€€€€€€€€€€€€€€€€€€€€€€€€~ƒ„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€~~}~~~|}}}}}||{{z{{{{{zz{zxwwxxxxxxyxyyxxxxwwwwxxxxxwwxwwwvwwwxz|}||||ƒƒ€€€‚ƒƒƒƒƒ„ƒƒƒƒƒƒƒƒ‚‚ƒƒƒƒ„„„„„„„„„„ƒƒƒ‚‚ƒƒƒƒ„„„ƒ‚‚ƒ‚ƒƒƒ‚‚ƒƒ€~~€€}zyyzzzyyzzyyz{|}}}}~~~~~~}}~~€€€€~~}|{||||}€‚„ƒƒƒ‚}|||{|~„††…„ƒ‚‚‚‚‚‚‚ƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„„ƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒ‚ƒ„„‚€~€€‚‚‚~~€‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚ƒ„‚‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚…„ƒ‚‚‚ƒ„‚€~~~~€€€~}|}}~~~~~~~~~~~€€€€€~€€€€€€€€€€‚‚€€‚ƒ‚„ƒ‚€€€~~~~~€€€~~|||~~~~~€~|{~~~€‚ƒƒ}~~~~~€€~~~~}}}~~~€~~€€€€‚‚€~}|}~€€€€€€€€€€€€~‚€€€€€€€€€€€€€€€€€€€€€€€€~~€ƒ„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€~€€~~~~~}}|{{{{{{{{yyzyxxxyyxyxxxxxzzyyxxwwxxxwwwwwwwwvwwwxyz|}}}}}ƒƒ€€‚ƒƒƒƒƒƒ……„„„ƒƒƒƒƒƒƒƒƒƒƒ„„„„„„ƒƒƒƒƒ‚‚ƒƒƒ„„…„ƒ‚‚‚‚ƒ„ƒƒ‚ƒ„€€}zzyz{{{{}~{||}~~~~€€}~€€€€€€~}|{~{{|€ƒƒ‚‚‚‚€~|{~}||}‚„†…„ƒ‚‚‚‚‚‚ƒ‚ƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„ƒƒƒƒƒƒ„„ƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒƒ‚ƒ„„‚€‚€€‚‚~~~€‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€€~~€€€‚‚‚‚‚€€‚‚‚‚‚ƒƒƒ‚ƒƒƒƒ‚‚‚ƒ‚ƒ‚ƒ‚ƒƒ„ƒ„ƒƒƒƒ€€€~€~~€€~}}}~~~~~~~~~~~~€€€€€€€€€€€€€€€€€‚‚€ƒƒƒƒƒ‚€€~~~~~}}~€€}}}}||}}}~~~€€‚‚€~~~€ƒƒ‚~~~~~€€~~~}}}~~€€€€~€€€€€€‚€~}|}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€ƒ„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ€€€€€€€€€€€€€€€€~€€~}||{{{{z{zzyyzzzzzzyyyyxxwwyyyxxxwwyxwwvwwxwwwvwwxxyz{}}}||}‚€€€‚‚ƒƒƒƒƒƒ„„„„„„ƒƒƒƒƒƒƒƒƒƒ„„„„ƒƒƒƒƒƒƒ‚‚ƒƒƒ„……„‚‚‚‚ƒƒ„„ƒ‚ƒ„‚€€}zz{|}~~}~€€€€€€€€€€€}||~}{~€ƒ‚‚€€~}{{}|{{}‚„†…„ƒ‚‚‚‚‚‚‚ƒƒƒƒƒƒ„ƒ„ƒ„ƒ„„ƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒ‚„…„ƒ‚€€‚‚~}~€‚‚€€‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€~€€€~~~€€‚‚‚ƒ‚‚€‚‚‚‚ƒ‚ƒ‚ƒ„„„„ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚‚ƒƒƒ„ƒ„ƒ€€€~€~~~~~~~~~}}}~~~~€~~~€€€€€€€€€€€~€~‚‚€ƒ„‚€€~~~~~~~~~~}}~€~}{{}}}||}}}~~€}}|}}~~~€‚ƒ~€~~~€€~~~~~€€€€~~~~~}~€€€€‚€~}|}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~€ƒ„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ€€€€€€€€€€€€€€€€~~~}~~€}}|{z{zzyzyyyyyzzzzyyyxxxxwwwwwwwwwyxxvwwxxwwvvwwxxzz{||{zy{€€€€‚‚ƒƒƒ‚ƒƒƒƒƒƒƒƒ„„ƒƒƒƒƒƒƒƒ„„„„ƒƒƒ‚ƒƒƒ‚‚ƒƒƒ„„…„ƒ‚‚ƒƒƒ„„ƒƒƒ„ƒ€€€|{z}}€€€€€€€€€€‚‚ƒ‚‚€€}||}}€‚‚‚‚€~~||{{zz{}€ƒ…†…„ƒ‚‚‚‚ƒ‚ƒ‚ƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„ƒƒƒƒƒƒ„„ƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒƒ‚ƒ„……ƒ€‚€€~}~€‚€€‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚ƒ‚€€‚‚‚‚ƒƒƒ‚‚……„„ƒƒ‚‚‚ƒ‚ƒ‚ƒ‚ƒƒƒƒƒƒ„„„€€€~}‚€~~}~~~~}}}}~~~€~~}~€€€€€€€€€€~€~‚€€ƒƒ‚€€€€€~~~~~~~~~~~~~~}{{|}}}|}}}~}{zz{|~~~€€‚‚~€~~~€€~~€€€~~}~~~}}~}}}~€€€‚€~}|}~€~~€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€~~~€ƒ„‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ€€€€€€€€€€€€€€€€~~}}}~~~~~}}{{z{zzyyxxwxyyyxyyxyxxxxwwwwwwwwxxwwwwwxwvvvwwxx{{{|{{yxz€‚‚ƒƒƒƒ‚ƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„ƒƒƒƒƒƒƒƒƒ‚‚ƒƒƒƒ„„„ƒ‚ƒƒƒ„„„ƒƒƒ„„€}{{}~~~~€€€€€€€€ƒƒƒƒ‚‚€€}|{z}„………†ƒ‚€}|||zzzz|ƒ…†…„ƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„„ƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒ‚ƒ………ƒ€€~€~}}~‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€‚ƒ‚‚ƒƒƒ‚‚„„ƒƒ‚‚‚ƒƒ‚ƒ‚ƒ‚ƒ‚ƒƒ„„„ƒƒ‚€€€~}‚€~~~~~~}~~~~~~~~€€~~~}~€€€€€€€€~€€€€€€€€‚ƒ‚€€€~~~~~~€}||}}}|}}~~€~}{{{|}~~~€€‚~~~~€€~€€~~~}}~~~~~~€€‚€~}|}~€~~€€€€€€€€€€€€€€€€€€€€€~~~€€ƒ„‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚ƒ€€€€€€€€€€€€€€€€~~}}}~~}~~~~~}}|||{{zzzyxwxxyxwxxxxxxyyxxxxxwwwxxxxxwwwvvvvwwxy{{{|}|{yz€‚ƒƒƒƒ‚‚ƒ‚‚ƒƒƒƒƒƒ„„ƒƒƒƒ‚‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒƒƒ‚ƒ„ƒƒƒ„„ƒ„„„ƒƒ„„…‚€|{{|}~~~~€€€€€€€€‚‚‚€~}|{z}‚…††††ƒ‚€~}||}|{zz|~ƒ†…„ƒ‚‚‚‚ƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„ƒƒƒƒƒƒ„„ƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒƒ‚ƒ…†…„‚€~~~~~~}}}‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~~~~€€€€€€€€€€€‚ƒ‚‚ƒƒƒƒ‚ƒ‚‚‚ƒƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ…††„€€€~}‚‚€~~}~}}}}~~~~€€€~~}~€}~€€€€€€~€€€‚€€~~~€€€ƒ~}}}}|}}~€€||||{{zz~~~€€‚~~~€€~~~~}~€€€~~€€€€‚€~}|}~€€‚‚€€€‚‚‚€€€€€€€€€€€€€€€~}~€€ƒ„‚‚‚€€€€€€€€‚‚‚‚‚‚‚‚ƒ‚‚‚€€€€€€€€€€€€€€€€€~~~~~}}}~~~~}~}}}||{{zyxyyzywwwxxxyyyzyyyxxwwwwxxxxwvvvvvwwxy{{{|}~|{{€‚‚‚€‚ƒƒƒƒ‚‚ƒ„„„ƒƒƒ‚‚„„ƒƒƒƒ‚‚‚‚‚ƒƒƒ„„ƒƒƒ‚‚ƒƒƒ‚‚ƒƒƒƒ„…ƒ„„„ƒƒ„„…‚€€|{{}~€€€~€€€€~€‚‚€~}{z{~‚…†…„‚„ƒ}}}}~}{{{}€†…„ƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒ„„ƒƒƒƒƒƒ„ƒ„ƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒ‚„…†…„‚€€}}~~~}~}|}‚‚€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€‚‚‚‚‚‚‚‚‚‚ƒƒ‚‚‚ƒƒƒƒƒƒƒƒƒƒ„„„„ƒ‚€~}€€€€~}}~~}}}~~~~~€€€~~~€~€€‚€€‚€€€€€€€€€€€‚ƒ‚€€~€€€€~~~~~~~~}}}~~~€€}|{{{|~~~€€€€~~~€€~~~~~~~~~€€€~~~~~€‚€€€€||€~€€€€€€€€€€€€€€€€€€€€€~~€ƒƒ‚‚ƒƒƒ€€€~‚‚‚‚‚‚€€€€€€€€€€€€€€€€~~~~~~~~}}}}~~~~|||{{zzzzyxyyyyxyxyxyxyxxxxxxxxxwwwwwwwwwwwwwwxx{{|||{{{~€€€‚‚‚‚ƒƒƒƒƒƒƒ‚‚ƒƒƒ„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚„„„„„„„„ƒ€}|{|€€€€€€€€€€€€€€€~~€€}|{|}~}„……„„‚ƒƒ‚}||||{{}€ƒ…†…„ƒ‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„ƒƒƒƒ†„‚‚ƒƒƒƒ‚„‡†‚€~~}~~}~€‚‚‚‚€€‚‚‚‚€€‚‚‚€‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚ƒƒƒ‚‚ƒƒ‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ„„„ƒ‚‚€€€€~~}}~~~}}}}~~~~~€€€~~€~€€~~~€€€€€€€€€€€€€€€‚ƒ‚€€~€€~~~~~~~~€€€~~}}}€€€€€~}|}}}€€€€€~~~€€€€€~~~~~~~~~~~€€€‚€}|€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}~€€€ƒƒ‚‚‚‚‚‚‚‚~€‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€~~~~~~~~}}}}}|||{{zzzyxyyyyxxyxyxyxyxxxxxxxxwwwwwwwwwwwwwwxxz{||{|||€€€€‚‚‚‚ƒƒƒƒƒƒƒ‚‚ƒƒƒ„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚ƒ‚ƒ‚ƒ„„„„„„„„ƒ‚€€}|{|~€€€€€€€€€€€€€€€€€€~}|{{||}|}€‚ƒƒ‚‚}||||{{}€ƒ…††„ƒ‚‚‚‚ƒ‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„ƒƒƒƒ…„‚‚‚ƒƒƒƒ‚„‡†‚~~~~~~}}}~€€‚‚‚€€‚‚‚‚‚‚€‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚ƒƒ„„‚‚ƒ‚‚‚‚ƒƒƒƒ‚ƒƒƒƒƒƒ„„„ƒ‚ƒ‚€~~}}}}|}}~~~~~~€€€€€€~€~~~~€€€‚‚€€€€€€€€€‚ƒ‚€€€€€€~~~~~~~~~€~~~~~€€€€€€€€€€~€€€€€€€~~~€€€€~~~~~~~~~~~~}}€€€€€€€€||€~~€€€€€€€€€€€€€€€€€€€€€€€}}~€€ƒƒ‚‚‚‚€‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€~~}~~~~}}}}}|||{{{zzyxyyyyxyxyxyxyxyyxxxxwwwwwwwwwwwwwvwwxxyz||||}~€€€€‚‚‚‚ƒƒƒƒ„ƒƒƒƒƒƒ„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„ƒ‚€€~|{|~~~~€€€€€€€€€€€€€€€€€€€€{{{{||||{|~€~}€€~}||||{{}€ƒ…‡†„ƒ‚‚‚‚‚ƒƒƒƒ„„„„„„„„„„„„„„„„„„„ƒ„ƒƒƒ…„‚‚ƒƒƒƒ‚„††‚}}~~~}}~~€‚‚‚€‚‚‚‚‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚€€€€€€€‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚ƒ‚ƒ‚ƒ‚ƒƒ„ƒƒ‚‚‚€€€€€€€€~}}}}}}~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚€€€€€€€~~~~~~€~~~~~€€€€€€€€€€€€€€€€€€€~~~€€€€€€~~~~~~~~€~~~}€€€€€‚€}|€~€€€€€€€€€€€€€€€€€€€€~}}~ƒƒ€€€€€€€€€‚€‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€~~~}~~}}||||{{zzzzzyxyyyyxxyxyxyxyyyyxxwwwwwwwwwwwwwwwwxxxyz{|{|~€€€€€€€€‚‚‚‚‚ƒƒƒ„„ƒƒƒƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„ƒ‚€€€€~}|}}~}~€~€€€€€€€€€€~~z{{}}}}}|}~~~}|}€€~}|}||{{}€ƒ…‡†…ƒ‚‚‚‚‚‚‚ƒ‚ƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„„„ƒ„ƒ„ƒƒ…„‚‚‚ƒƒƒƒ‚„‡†‚~~~}~~~€‚‚‚€‚‚‚‚‚€‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚ƒ‚ƒ‚‚€€€‚‚‚‚‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚‚‚ƒƒƒƒ‚‚€€€€~€€€€€€~}~}}}~~~~~~~~~€€€€€€€€€€€€€€‚€€€‚€€€€€€€€‚‚‚€€~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€~~~€€~~€‚‚~~~€€€||€~~~~~~€€€€€€€€€€€€€€€€~}~ƒƒ€€€€€€€€€‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€~~~~~}}||{{{zzyyyzyxyyyyxyxyxyxyxyyyxxwwwwwwwwwwwwwwvwwxxyz||{|~€€€€€€€‚‚‚ƒƒƒ„ƒƒƒƒƒƒ„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒƒ„‚€€}|}~}~~€€€€€€€€€~~||}~~~~~~}}€€~}|}||{{}€ƒ…‡†…„ƒ‚‚‚‚‚‚‚ƒ‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒ„ƒ„„„ƒƒ‚ƒƒƒ‚ƒ‚„††‚~~~~~~}}~~€‚‚‚€€‚‚‚‚‚€‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€‚‚ƒƒƒ‚€€€€€‚‚‚‚‚ƒ‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ‚€€€~€€€}~}~}}~~~~~~~€€€€€€€€€€€€€€€€€€€€€‚‚€‚‚‚~~~}}}}~~~~~€~~~~~€€€€€€~~~~€€€€€~~~€€€€€€€€€€€~~~~€€‚‚‚€}|€~~~~€€€€€€€€€€€€€€€€~~€€€€€~~~€‚ƒ€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€~~~~~~}}}}{{{{zzyyzyxyyyyxxyxyxyxyyyxxxxwwwwwwwwwwwwwwwwxxy{||z{~€€€€€‚‚ƒƒƒƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„ƒƒƒƒƒƒƒƒƒƒƒƒ„ƒ€}|}~~~€‚‚€€€€€€€~~€€€€€€€€€€~}||||{{}€ƒ…ˆ‡…„ƒ‚‚‚‚‚‚ƒ‚ƒƒƒ‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ„ƒ„„„„ƒ‚ƒƒ„ƒ‚ƒ‚„‡†‚€~}}}~~}}}}~€€‚‚‚‚‚€‚‚‚‚‚€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~€‚‚‚‚€‚‚‚‚ƒ‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ‚€€€€~~€€~~~~}}~~~~~~~~~~}€€€€€€€€€€€€€€€€€€€‚€‚‚‚‚€~~~~~~~~~~~~~~~}~~~€€~~}|{{||}~€€€€~~~€€€€€€€~~~€~€‚‚‚€||€}}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€‚ƒ€‚‚‚‚‚€€‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€~~~~~~~}}}}|||{{zzzzyxyyyyxyxyxyxyxxxxxxxxxwwwwwwwwwwwwwwxxz|}|z{~‚€€€€€‚‚ƒƒƒƒ‚‚‚‚‚‚ƒƒƒƒƒƒ„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚„ƒ‚€}|}‚€€€€€€€€‚‚€€€~~~€€€€‚‚}||||{{}€ƒ…ˆ‡†„ƒƒƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„ƒƒƒ„ƒƒ‚ƒ‚„‡†‚ƒ‚€~~~}}|}~€€‚‚€‚‚€‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}~~~~~~~}~€€€‚‚‚€€€‚‚ƒ‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚‚‚€€€€~€€€~}}}~~~~~~~}}€€€€€€€€€‚‚€€€€‚‚€€€€€€€‚€‚ƒ‚‚‚€€€€~~~~~€€~~~~~|}}~~€€~~~~|zyzz{|~€€€€~~~€€€€€€~~~~~~~~~~~~~€€€€~~€‚‚‚€||€{|}~€~~~‚‚€€€~~€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚€€€‚€€‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€}}}}~~~~}}}||{{{zyxyyyyxxyxyxyxyxxxxxxxxwwwwwwwwwwwwwwxx{|}|zz~‚€€€€‚‚ƒƒƒ‚‚‚‚‚‚ƒƒƒƒƒ„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚…ƒ~|~€€€€~~~}€€€€‚‚‚€‚}}}€€€€€€‚‚‚ƒƒ‚}||||{{}€ƒ…ˆ‡†„ƒƒƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„ƒƒƒƒ„„„„„ƒƒƒ„„‚ƒ‚„‡†‚………„ƒ~~}|||~€€‚‚€‚‚‚€‚‚‚‚‚€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}}~€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}}~~||||||||~~~}}}}xxwxz|€~~|}}~€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~€€€€€€€€‚€~~}}}}}}}}~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€~~}}}}}}}}}}}}}}||{{{yyyyyyyyyyyyyyyyxxxxxxxxvvvvvvvvxxxxxxxxz{{|}~~~€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚€~~~~~~~~~~~~~~~~€€€€€€€€‚‚‚‚‚‚‚‚ƒƒƒ‚‚‚€‚‚ƒ†††…‚|z||{|}‚„‡‡†…„ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚„„„„„„„„‚‚‚‚‚‚‚‚‚„…†„‚ƒ„…††…„ƒƒ}}ƒ‚‚‚‚‚‚‚‚€€€€€€€€‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}}||}}~}}}}}}}}~~}}}|||{{z{|~€‚€€~~}}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€~~||||||||€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚€€€€€€€€‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€~~~}}}}}}}}|||{{{zzyyyyyyyyyyyyyyyywxwxwxwxxxxxxxxxwwwwwwww{||}~~€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚€€€€€€€€€ƒ‚‚‚€€‚‚‚………„‚|z}}|}}€‚ƒ…„„ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚ƒ…„ƒ‚„…†‡‡†…„‚~~‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€~~~~~~~~€€€€€~~}€‚ƒ~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}}}~€€€€€€€€€€€€‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚€‚‚€~~‚€€€€€€€‚‚‚‚‚‚‚‚€‚ƒƒ‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚€€€€€€€€~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€‚ƒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€pygame-1.9.1release/examples/data/whiff.wav0000644000175000017500000001333207216105640020617 0ustar vincentvincentRIFFÒWAVEfmt ++factŸdataŸ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€~~€}}~~~}~}~~}}~}~}}}~}}}}}~~~}~}~~}~~}}}~~~}}}{{{}}}}}{}}}}}}}}}}}~~~}}}~~}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~}}}}}}}~~~~~~~~}}}}}}~~~~~}~}}}}}}}~}}~}~}~~~~~~}~~}~~~~~€€‚‚‚‚ƒƒƒƒƒƒƒƒ…………†††††‡‡‡ˆˆˆˆˆ‡ˆˆˆˆŠŠ‹ŒŒŒ‹ŠŒŒŠŒŒ‘‘‘‘‘’”””””’‘‘‘‘””•–––”’’‘‘‘’••–—––•••”••––———–—––•••””•”•••––•––••••••–––––—–—————™šššš›™š›šœœœœœœœšššš—ššš›››œšœš›š›ššš›š™š™™—––—•–—••”—•——™——––””””’’””’•”””‘’‘‘”‘–•–”••’’‘‘’”’•”’‘‘‘‘‘‘”””’’‘‘‘”‘’’’’”‘””–•–—••’•’”‘’”•’’’‘’••–••’‹‹‡ˆ‹Š‘”••І†‡Š…ˆŠ‹‡Š†…††‡‡‡†ƒ€‚‡ƒ…ƒ‚}}{~ƒ‚…‚†zyxuvy}~~~{uvstpxu{yzyusspquvz}{{sqlnntv~}~xuqkonu{}‚ƒ~{xpqnuu…‡†ƒ‚~}}~…Š‹‹‡†€}ŠˆŠŒŠ‡…ƒ€ƒ‚‡‹‹‹Œƒ…€~€‚‡‡…†…~}†††ˆ†…€zz{yzƒƒ‚€…yuststy€‚‡€uunloqp}y}yxqvlopstxy{{x{yuq{xqzyyyyy~{‚…‹‡ˆ†‡ƒ‡’•’‹ƒˆ‡ƒ’—–¤ Ÿž™œ’•™•›¡¡ š©š›™›™–›£¡£¥¤¦›Ÿ ”š™ž™¥ž¡™œ‘—””™–›Ÿ›ž¤ž›™ššš› ¤££¡ ™—••–™š  ¨¦Ÿ¤ž’ž™— £®ª°°© –™ˆ—™Ÿ®¨«¨¤¡™™–— ž ¨¡žœ•…†—ŒŒŒŒ‘•Œ‡}zz}†ƒ…ˆ†vusn{€ˆ––•–}jqtu€‚Šƒ…{yjtlux€…‹Šˆ†}{tt‚tvzxy{{~~€~ˆ†ˆ”™ Ÿ¡››‹Šˆ‚ˆ‘œ¤¥«œ™‹ƒ†Œ¥¥´¼¹¯°£ŸŸž£¦³®®«©’’‹‹…”£ž¥¡¡—  ž ©Ÿ™¦œ¡œ£ž™”‡~y}…‹†•—£•‡t}…~‡†…€}}kolszz‚•‹ˆ…p}}ttsqujsxqjly_gpxqx{uklniggtpfklVXXUXWeiggqkjnfjjidja]d\XSUHHNKN_W]``_e[`_ZbbbWk\\de[`ZLUUNRbgdqp]bVfRdboaxt{luleiexoˆƒ‘Œ‹‚†gpttkƒ”‡š–‹”…‹…Š™›ž°«©©²¦ž£”—› Ÿ­Ÿ¥——’Œ”™—¤©¨®°¯°£º¨Ÿ¦©•—‘•ŠŒŒƒŒˆ…•‘’£œ™™–Š‹ˆ‚…‚ƒy€vvnojq{}x}s\isvlt€iijibgN_WZPfb`bnfpglkgW`Z_bksspkiNUQNPdffdyfnd`\eaaiqiolptjj]WZ[gpu€zvspi]]dtv}‡”‡Œ‚p`lksœš¡¥ Ÿžž›–𦤩­®°¸Ã½®©™ªª¹×ÎËͺ¿²« ³²°ÚÍ¿·¾°¥ª¼ž¹¥¸³µÄþ®³©–œ ›°³¼´­©”{~†‚”š–”›ƒ†uvdq`xvzpt{`dfWPPf][jjXX_``_RUUV]X]`SLIPCNLMKUV]bRQIFDPRfaWRMMPSakf_aPX`tˆ†ƒƒjadlbv€qv{v™Œ‘†…†–ž²¿º²™‚ˆqƒ ’š’…‡†ŒšŸœŒ¤³¦¥¯©‹–•‘£š­’‘‘—x‹‹†•–šš’”ty{]kvoavngR[\NSkbX}€l€d]dX]efg_ZjiSSeZLQ_S_xybi[B=\SKNA.BCBB`=&/5)<]UIRG8:CNIF&-&&?QL>C?/=GVNNMPW_okdingjks…Œš”Œ•¡¤ª¤£—‹‚š™…vb`€xzdP[gelb\UKSki}‚np”xp}‚qvž —’𕆕™‘™œ¯¥º¿²ž”‚†‹––°º«­³´• ¥Œt…œ‡Š›~zkeeP`i_b{yp‚tŠ}}~pxt‹u‡‡{—‚t’Œ{—¨š”¤£¿­°³¤¸Ãº³³«º½½®¦¨¥´¿¼Ä¼ÈǾ¦°Â¹ÄÓн¾ÌÎìçÒÇÍðæîÿêÓäêÝôïØáÎÝÖßëÚáÓÜåîÌÍåÖéàËÃÈÕÓ×àÖ¿ÃÚÃåß©Ãà˯Ç´ÈÒß²¥Ä½¼Ò³£©¦¹Íµ­¸­®¹·« ¯´¹­¦©·¸µ´°™–¸°š © µ³¦°­š«¼¤¤¥~¤¹Ÿž—£¡”šŠŠ¾‹‘®š¤º´ …Ÿ}{¦©œ€’ª–{Š{•Œn†‘‹€©‘egt‡`bblžƒgi…}UkUiNIsyxqjzZNqXCVtgtl`Sao]MPIQt{PVsIXu`.Hda_]Vf]WV_?Ng[RX[[lg][CqbLS>fos`V]gUigXKjkfvapn[]Wp[Xt{anjpjz[gƒk\}€z€‚_jƒuppggŸ{†~ƒpupqy}”~‚…{€e{‡l’Š‘†}vp€€}}ˆ{}‚vu†‘v…†~€xtƒtq~ˆ’}‚~{qku’ys™€†o{ƒlyldz†aex~pb‹ˆuztuylnpb}‡qssuupsnsd†l\}~ul[€op]eebjtp_y{`X†xjdZ€Wps`ogzsg_l‹Vv]zxUuy_x…b]uujqpuVggi\fƒxyy€xuuu}j`isj~qv€sppi{p\usxo‡{o}xngnd\usiezxdtqlfk\qgkyo~apo\nMixndf‚p]t{`]qgtaukilqekt]Vk…i~{k{i}`nvbp{oo‚axy~gWŒ€ik…‚tz{‡ptz”‚poŠƒg‚†W‚”—~p–Š•v~ˆƒ‹tŠ™€‚~¦‘}t–’{’†š€ƒŠŠ…Šz‹y–tv…•‚~Šy”†yxz…qu€›vu…t~pˆv}uy”‚ƒ{x…psnpzf‚ty…uqquqŠujƒkl}tf…tzŠvp‹v‘ˆu€—Œ€kƒ‚†yv†’€’…Š~ŠŒ~}—ŠŒ‡~…z‘}‚‡‹’—Œ†‡‹€‡•”†Œ‹x‡~‡‡ˆŒ~†}‹ˆx~Šˆvˆtvˆ‚l~ƒŠvxz‚ix}yqƒtŠxs}{ui}uvpƒ€kizo€‚uƒxzs}ikvo~v~€€ƒp€y{ysq}}…{{€†{zjjn{†n‡ˆ{ss{lvlk‡…‹uuxxbbuƒknˆ~‚~xvznuxqpŒ†}~€qyxikt}†s}ulv~qg}yzx€~usqsnqq}€vxzyyk`exiXuzupxznuf`fqo`sxptsygqidkeod}snt{tlonjokkntqtdtigidjkskqnssog\ija\kjosfnnnjb][dbjijfzze]XfWfXVeoopubos_[`]_knjttnopfb]obennxu€unslpbgvvlv€puysjjglpuz†…}{tuuyxl€~Œƒ‡ƒzyxys‚†Œˆ‹‹Šy{zq{~}‚ŠŠ†zt€y{{ƒ‹…ˆ……}x~vvtz€z{€…z~tqx{zq~€€€€sz{uzqvxy€}{~~}vuy}vx{yz€€}{‡{x~ypu{x}z}ƒ{yyy~pvzxvy}{{zp{unlttplvtvvsvupfsukoktpveopqliqolfnsnjoqninskfltiionlnokiokgnongqoppjongkjklojnknolkglgiieojfqikkijdidgfbbekfedggdjgifjinofgjnkgenolkntptuxsnyvutxz}zy}}}z{~~€…ˆƒ…€ƒ€}}‚ƒ‚ƒ…ƒ…ƒ~ƒƒ‚ƒ€‚}{€xyy{y{z{{{zzzxyuz}z}z€~~{~€‚‡‡…‡‹‹ŠŠ‹•”––•”–š•–—”™ž™——›™–‘‹‹ˆ‡…‡Š†€ƒ~yyzxuzzvvvzuvuvqpkssonpnnqtllolplifljjkjlnlonlknpnplnpnllkfiead`]\_ZSQPNFB<9950--)%((      $(&)--/032320-.)$     %(+024478599:<<==?CCHIILNSVWWWVWWWWW\`dfgilpuyy{~€†…‡ŠŒ’–•–š›ŸŸœŸŸ ¡ Ÿœœž œ›š›œŸ £¤¤¦ªªª©©««­ª«ª©­¯¯­ª­°¯®«­««­ªª¥¤¤¤£ œžž     ££¤¡¡ž   Ÿ››ššššš—™šœžœš›žœŸžœœžžŸ ŸŸ¡¥¤¥¡¡¤¦¦¦¨¦¦ª®««ª­­®²­¯°²µ¹¹·¼¿¿ÄÇÇÆÉÉËËÄÆÄÇÆÄ¼½Á½ºº´³µµ´°­­®°°®««­¯°®ª««­°¯­«®²´·´´µ¸¹½º¸¹¼¾Á¿¾¾ÂÃÄÈÆÃÈÉÍÍÍÍÌÍÑÑÐÍÌÎÎÑÎÍÎÍÐÎÐÎÍÍÎÒÐÒÐÍÎÕÑÓÒÑÓÕÕ×ÖÓÓØ××ÛØÖÖÜØÜ×Ú××ÛÛÜÚØÛØÝÝÚØÚÛÛÚÝØÛÛÚÚßÜÚ×ÝÜÜÝÝÛÚÛÛÛÜÛØØÚ×ÚØ×ØÖ×ÕÓÖÕÒÓÓÑÐÒÎÍÑÍËÍÎÐÍÌËÍÌÉÉËÄÇÈÈÄËÇÇÄÄÄÄÆÄÇÃÁÄÃÃÿÁ¿¿Á¿¾¼½½½½ºº¹¸¼ºº¸·¹·¸¹µ·µ³³´³²´²°²³°²°°®°®°°­­­®­­«­­«ª®««ªªª©ª©¨ª©¨©¨¨¨¨¦©¦¤¥¡¤©¨¤¤¥¦ ¦¥£¤¥¥ ¡¦£¤¤£¤¥¡¥£¥¤¥¡¡££ ¥£ Ÿ    ŸŸŸ›œ œœž™šœœ›šš™™›œ———–™–š–”•–—––™•‘––•––””’•’’‘”‘’‹ˆ‹‹Œ†Šˆ‡‹ˆŠ†‡Šˆ‡Œƒƒ‚‡‡‚ˆˆ‚…ƒ€‚‚‚‚€‚€‚~}~€€~~€€~€‚ƒ~ƒ‚€…‚…~ˆ…ƒ†…€……‡ƒƒƒ…Š‚ˆƒ‚†ƒ…ƒ‚…‚………‚‚‡……‹‡ƒˆˆ†‡†‡ˆŒ‹ˆŒŠ‹Œ‘‹‘Œ‘‘’‘‘‘’•”•’‘’•’”•–’•—•””•™’—–•™•—–”™”——––•—’——•™š—’›———š–––™—–™™—–•—’𙕖’––”–”’••’’’”’’‘’‘’‘‘‘‘‹”‘‘‘‘‘‘‘‘‘Œ‹‹Œ‹Œ‹‹‹‡ŠŠŠ‡††‡ˆ†‚†…ƒ…†ƒ…‚ƒ€€€€~{}~}~{zy{yx{xyxvvuvtstspsppnlnknjnleijgieiddedba`a__Z\\\[[[ZX[ZZZZXWZ[Z[ZW\X[\X\WXZ\[W[ZZ[XZ[ZZ\Z[[][]_\]]]_aa_ababbebddefefgefggfiegfiifkgejiliijijjjlijkjkkklkllkkkllnolklkklolkkjonlllllnlollnnlonnoopnoonlnonnqpjlnoppnlnnlknonknlkllnlkkknkkljlkljkljllkjjikkkjjkkkkiillikljjkkillkjllkkljlkjllklnkknnknqnnlolpppqqqostssqsuttuvuuuuxvvvvvxyxvvvyyvyxvxyxyzvvzyzyzyx{zyzzzzz{{}{y{z}}}{z{{}z{}y{}}z{}z}~{}}{}}~~}~~~~}~€~~~~€~~~€€~~‚‚€~‚‚‚€‚ƒ€€‚…‚€‚‚ƒƒ‚€‚ƒƒƒ‚‚‚‚ƒƒƒ‚‚‚ƒƒƒƒƒ…………ƒ……†††………†‡††…††††……††††ƒ††‡†…†‡……†‡‡†‡‡†ˆ‡††ˆˆ†‡ˆ†‡ˆˆˆˆˆ†‡ˆŠ‡ˆ‡ˆˆˆ‡‡ˆˆŠ‡ˆ‡ˆŠ‡ˆ‡ˆ‡ˆŠˆˆŠŠˆˆˆˆ‡Š‹Š‡ˆ‡ˆŠ‹ˆˆˆŠŠŠŠ‡ˆŠŠŠŠˆ‡ˆŠŠŠŠŠˆŠˆŠ‹‹Š‹Š‹‹ŠŒŠ‹‹Œ‹‹‹ŠŠŒ‹ˆ‹‹‹‹‹ŠˆŒŒŠ‹‹‹‹‹ŒŒ‹ŒŒŒŒŒŒ‹ŒŒŒŒŒŒŒŠŒŒ‹ŒŒŒŒŒŒŒŒŒ‹Œ‹ŒŒŒŒŒŒŒŒŒŒ‹ŒŒŒŒŒŒŒŒŒ‹‹‹ŒŒŒŒ‹‹Œ‹ŒŒŒŒŒ‹Œ‹ŒŒŒŒ‹ŒŒŒŒŒŒŒŒŒŒŒpygame-1.9.1release/examples/data/static.png0000644000175000017500000000226210660512477021001 0ustar vincentvincent‰PNG  IHDRD3Û!ŽgAMA± üaiIDATx^íšËuã0 EîRP HÙ¤—MŠÈ. ¤F–-›ñy€¬Žà3« õø.‚¤^Nåý”¿tœòÏþHH1ˆ¡rÿñ¾´ÂäÃ*—ŽÖýŸœb8Cåþã}i…É)†1T.­û?9Åp †ÊýÇûÒ “S b¨\:Z÷?þ8}ÿ–ó¦2Ÿ¥ý}¿®ÏuSƒî.lÅIpxN¯å¯ Ô 8aÍ©«3“ßÊœpÇåtþ"*þšœL’ÓˆVrÒnÕWï#Lᬩ÷ô]› pM*9õ‰½fB/Ή,Ö·úõ…†öÌpþ!V·Û_ý¼Af À]æìúû„tŽ_„å“àÎÄ7nضXœáô4Þx>“a"Æ'À×G@vý–Ìü˜ú(nÐài´Ï¦kL‘ skë˜O€™“Ñ.°hœÆ›A8¤KûzŸM$©Ø ‚šhõ 0qòIÅN¡Ä|ÂçÖ:6‰h|¨Q:z¥Ó3‰Ÿ'c&ÕŽ]ŒÀ‰ô¨­ªŒ•“ê糉®xÍ Dþ8'nM1`XωÈ7u¤Sd˜˜Ú­vòÜ”›µ& 'ºâ‘˜°ÖRŠçÔÎGÂ^EŠüJ“M·Þ´š781,ÓP™€œð0åÚ"­¡°pj‹>¾™¸?i² Ÿ0t5NTŠ€15b_.w/v+·'hm"Ò$Ê'jÕ€{^kAµÂÀ2øPc²IÈ'¤1™¿@"œž5#±xˆ}¹yƒ œÍ™´Ï¿GÒZuoÎŒà®Gج¹z$ÒrÌÊ·,kq"2Ûv&„”>S܃ª®@[9!õ>—8§Kn:ΞaTxûôݰß35åp¡›$OõЦDö†|âObÚ‘7äd˜‘ÑíÊyÿÿ,zE¢*|Vä“\o¹á>—Ô¹b_nAH¯aTéÃ9còëó†œÞ©¼—÷—:dìþ©Z™Ðw‹æÍâd:`|ƉìŸèÅ[` A‘¹6ˆïÛÓYœ¸|öù[GîØât¢—®ôm%/nd)cSŠt ^ŸÈ)áðªËƒš©}@W3uت €uﲄ¨ÃòjµdR¿cqlo5ì-”:f\zë/¢¢ço`àäý”»yšoGV9® †×E@õ´ ‹ªa³Uó®˜89² ƒ¤æÓ@?†ï8äD™`Ve(Sø‘Dg((ÀÌ©w ,Ú]{}täS}n$(°¼µW`i¦ÉãàiLX÷›€§«c\pƒ¡<> 4rò#"G÷ùŒà@rŠá@ •™jÉ)†1Tf>%§ÄP™ù”œb8CeæSrŠá@ •™OÉ)†1Tf>%§ÄP™ù”œb8CeæSrŠá@ •‡Ï§#{S;î/]yIEND®B`‚pygame-1.9.1release/examples/data/shot.gif0000644000175000017500000000020107202715154020432 0ustar vincentvincentGIF89a ³u^`€q†rt˜‡ˆ©šœº¯°ËÃÃÝרîëëÌM@77`®70ÌM@7E’!ù, .0È@¦¥7ˆAб[÷I@è¤i FÉH«±+Òò»Ö3¯ã6Xîæ#…ÁÝq;pygame-1.9.1release/examples/data/secosmic_lo.wav0000644000175000017500000004441407202715154022022 0ustar vincentvincentRIFFIWAVEfmt 2+  ôÿÀ@ðÌ0ÿˆÿfactŠŽdataHððððððððððððððððððððàððððÛþ$ÿððððð ððððððÿðÿðððððððàððð  ÿÿààÿþàðÿïððÿð    ððððÿðÿðÿðÿððÿðþððÿðð  ÿàÿàÿàÿàþÿÿðÿÿÿÿÿ !  þðï ïÿÿàÿÿðààààð"! !  ððÿÿðÐïþÿþÿè"Ö"þÿþÿðïàÿÿÿÿ!! "00 ðïÿþðßþ þÿïÿàïÿðïïÿÿÿ 0"0!1"!   ðððÿþïîþïîïîþÿïàïÿÿðÿàð!1"011"!!ðàïîïßîîîýþïîþàÐïÿðààðàðàð!!"!01"!!!!!ððÿÿù&³%þþàßîîîßîîïîÿïÿÿðð !!121#1! !ððððïÿþþÀÏßÏÞßÝýþßýÿïÿàððàð"1"1#"!2!"!!ððàðïÿþÿýÿïïÐßþþàÐÐîþïßïýþðñ!  0!!!"2#"!"!/ððÿðàþÿïàÞüýÞÞíÞîÞþîïþððàð2#@3""" !ðð ¥ÿÿàðÿððïàÿððð  !"! "àðÿðÿÿþíþÞíýýýþþïÿÿÿà1!#"11#!""!  ððÿÿðïðïÿÿÿààààðñð àðÿððð/"!!"ðððÿÞïÏíüþïÞþþÿþàðð1A12"20"{ïïíàÿþþÿÿþþ ÿþïïà  ñÐÿÿððàÿð!!"!ÿðïÞÝÞÝíÞîßîþÿð0##12!1! þîîàßýÐßþþïïî 00 !! ïýþïÿïþðïÿðÿð""!2" ðÿÿïÿîîýÏÝÞÝüýþÐÐïð  !#"C%ÒÒ%#2#"!"ýßÎÏÎÝÎÝíýþïàÐïþ"""@A3 " ÝîÏÝîîïîàîðÿðð0"C##2"#!"!ðïÿïîîýïíýíÞÏÜþíþïÿÿÿ"0A131#C%### ÿÿ íοÏÝÏ¿ííÞîàÿðÿ #BBC%1!! ðàÝÍÝ¿Üü ïïïÿðð0! 2$4452ððïïîíýíííÏìïþÿàÿðà‰÷ ÿð!!43C3Q2#" 0ðàí¿ÜÞ¾ìîÎÞÝí ðÿñR35#C$34"àïþýÚüýÝëííîÿàð""13CS44#C00ÿðÿàÞüýìîÍìíìîÝþàÿð  !ïÿÿþ#QB$"BA#"àðïÌݾÎÏÎüïÏýïÿïð"DBQA3$#%" ÿÿîßÏÚìÞÍìÝìÞÞÿ22C#RCS$$"2BàÎξÜÜÝ¿¿ýÿÿðbÿÝ$B34""! àÐÎÌÛýÜýîîT36A"A"01ÿïìÌÍοÝÝݾíîßíÿð26$#$##3# þÎϾËíÜÝÛüþîÐï1B5"R3CDD2R#### ëݾÎݾÝÎÍû ÿÿ"$"R%#4443Q""ßÝëÝ®ÎÏÎîÝîî!#33R44T2Q3"A#ßîÝͼÍÍ¿ÏßÏßíÿîÿà$D7$"B$#!#Í;¾ëëüïÎýííýïÿ4CS4CD"B211ìܾÝÍêEÚíí¿íïßBB5#3QA132B0! íìêíÌÝÎÍîÝÞïð!!B4&B3BC36%"#1#í;ììÝØìÞÎÝìßÞßðà2D5%&2B2Q"" í̽ÌÝËëýîÏíýþCT6#43D#%""þíݽ½ÜÛýÝÏÜþîîD5"C3C%@2!ïßοÎÛݽݾíîþð1B5%#3R"A121D3B ÿíݾÎíÝ¿½¾ÎìîßÏï44RQRCBB232#ÎÚìܾ¾ÎÎÝìíýþà4D63DBC34d¿+¼D2""îìÚûýëíÜìííÞÝÿð2TD4B3B323A1ïÝͽ;Üí¾ÏÎýîÿ1B4##2%"QA2210R2$""ý ÿýýî»ÜݾìÞÝííîà#SS5SB3R$!"ýéí¾ÍÍžÝÝÍíîßà55443%4"23! ëÝÌÛíÛýíÜÜíþð"CE443CS%Ïîìì;¿ÎüîÝëîÏÀï5$2R"04#3"!þþþàïáb$"þíÞÈíÏÏÏîìþíïðCbDE$2343A3ËÛÜÛÝÌÍÍÜîÇ)Ú1ÎTCSS%"Q" ÌËììíÝÎÞÝïA44%$6"3#àÑ!!ï/ÿÿßÏÝÞÌͯÝýï$34BaABAïÍÍÎÜýñs"C$ïßÜÎÜìüÿßÞÎÐðBRTSBB42$"1 ì;¾ììíÝÍÝþà$63c43D0ÿï½ÛüîíÿÐðE4BBàîíݽÚîÝíý3D44$$3B1 ÞÜËÌÍÞÏÝïÿADRC6#4"ßÞýíέÛîÞíþQ2B#1#ÞíÈÝÎÜìýíÝîÿàDW$$1¹ì0çS!#þ½ÊìÜÜÝÚþîýíýð54D4C%"!þÿÿÍÌÞ¿ïà155C411àìûí¾ÝìîþðõS3$AA3B2 Þ½ÍÊÛìîîïñ$CbBQA2"!®ÜÝÞοÏßþò&cBC#2A" ÛëûÚíìîÞÝÞï6QTD$#233!½ÜíÜ®ÛýíßßÞÿð#5$44$##/½ÎÝÜëìÞÏþÿ%4RBB3BA ÞÌëüîíÝîþe#"5#ϯÍìÍžÝÜý#D5%"4"ëžìîÏßíÿðCDDs$#"2@ üíÍëÚ:FèHÌíÞíà6CD#DCR2#!ÜÛÜÎÏàðÿC$#!1ÛξÍÍÞî#47$3ðÛ̾îïà"cbAQ3$ðþÛÝ®ÎìîÏàà"GR233 ÌÚݾÜÜÌìþÿ6$$"A#ÜÙËîÝìîÐ%3DBSB#"" Í®ÍÝݽÌýý BbCBQ#%pð ýëîß#6##1¯ÎͺìíßÐð3&45"B!ÿÿ¼ëíîïàò6Cc5"2ß¾ÌìÞÜÞÞïðR6D43$#¾ÜÛìíììíþà1SS6"# ìëëëÜíÞÝïrHÚÂÎÇ6##4BQ!þÍ®¿ÏíýýÍÞïþDE443Q!""ÛìÍÚîíÿ3A2 úüÜêììüÿ$52C#2>ÜÞ®ÜÝìî3scRA@ ðßÛÞ¿Þîßîðb63b#2#¾¯ÍíÝÎíþR6#CB1 ÞìÛíÎÝÊÝÝÏïScC4AA3@0ûëìÜÝÍÏßëîþÿRCS4B3$ý½Í¾ÏÞî7Q43$ ûüÞ®ÜíßÐ&%"B"2!®ÜÝÍîïÐ!DCsCBQ íξÝÞÞßàbSS3D$"1þ¾®ÍÝÍüÿð2CRR4A/ÌÚüþßîíÀÐð%$3S$""5!ήÍݯßßàïÝíÿ%452Q#0 î¾ÏÞÞþw3$22 þÌÚìëÝÜý4%##1@ ­¾Îîî#DD4A2þ¾ÎÎÞÝîB$%3CR#D20®­ÛÞÎîþÿïEE$23ÞÌëüþîþ;Àà$53BB32B4A!ìÚëíÜíÝíÿúÿ$D5$232!ÈÝÎÎýðá"7uíͽ½¾ÝRC2A0! üØíÝýðR5#4B2ÜÜìíÎÞïÐ"S2#5E2Au< @[8ܼÍÎííÍîdCCB1!íͯÏÞîÿÍßcSD%1A3bήÜëýÞîðïà1b535#ðܻݿïà&cB1! ìÚí½ÎÏ3RB3!íëÝÎÎÿð34S3R ÞÍí¾ìýÿà#!7SC ów0þéìÝìýÝÎà'5#4"íÜÍÍÏÞ2S/¾Üÿ6#RBa2C""ýÌËìÝÎîð43îíÿSSS$2$"èÜíßÐ#Gu00üìÛêîíð"RR"@ àÎìÝ®Þïð#E3C4!ýÝ¿îÞÎÏßïÕöêøìv3B! Í÷P1 ììÞÏíÎï$%""!üüí¿Þþð3S5+íìîï&3E"@ ÜÚíÜì#C3 ÎÛÝþð5$CCR!ÛÝìî3ga"1¯ÏξïÐ!CCR10ðÞÜÛÞßíêðð"#bC2B! ïήìì àýÜïDBAîìÜõQ ½¾Íî¾ßñC4R4! íÚííßà4DC3(¿þîÿò5E3b"ûýþÞÍî2#33 ‹íþßðbBC#1éîíîðñB5'sîÝÍ®Ûî"4%21þÝÍÍÝïàØ€ððB%´ËõÌt42"®ÛíÜݾî#2# ÙÛÜÞcR3D#ݽ½ß%423" ÛíÝîE63S2œìÞÜÝÀCF22ýâA5%6"3# þ¼¾Üþîï ½®Îìîîïï'q14! ½Þ"Cs2333#3#CR5è¿ÞýíÎþU4!!ÛÚîÞÜîð"#BͼÛíÜþG2C! þëüÞïT11ýþÐð3T6#C44$ªîÝíþÑBRB4ÎÝ×3R33S#" íà¿ÞÿþïîýËÌÝÎìÿÐÐàïâwp11!¾ß743 —!ÁR12#54DC(Žþîïýßðt"!ïþÜ®Îìý"2 ½Í®ìþÐàñwqðíq1 $#DBBBC3bC,‹þïï#BνͿT3C"020èí2)ÍíýÜÞ ÊÜÝíà ûìr"4"!" ¯à$$"4cQÎÝîþà74 îîݾÎî"̾ÜÜíßÐÿðwqðÿq! ð0352C34BBRC440ˆÿïð"ÍÚÝßt#þ Û3B*ÍÞÞàðR/­ÎÎþñ1ÿíGöÞ°Ýßv3Q0 ð ÏCD3@ïï4dDí‰ÿïðñ2ÜÜÜððÜÞÍ®ÎÜÞÎîîþüë÷w ð22"¾ß$CRB#3#C5352Q0ˆÿï!!ͽÎþ'q0 îüÎà3D#2èÎÞþT! ½ìýðRîÝÍr þùíñ44#1 ÌîðCbBíéÍÞï#3CÞξÞí ÞBͽ¾Ýíîàî­Ëë÷B$òcC# íà663R2A33$3BQ#ˆûýîààwîý¾à$34 è> Ìî6# ÝÜíRBîëîtþÈîQ# ýÍÜðSCíÝÞØÎ12#FÎìýàíï7"ÝÌÝ¿ÿð¾ÍÞÝže#10àîÀSR#þDCb2B"#45#@ˆ€ÎÝÞÿg2!Þëû%ÞÏ$3®Îîÿ$4!ýÍÎdA0ýØÞñBQ2îÜÞß5D1ÿÞÞï ÿ7!ÍÎÞÏCQ þìÝÞß!0½ÌÝîð»Õs"0ÿüÞñTD"ïßð$SC32CCb#‹àÍJ2æ§ì®ð'uþþïà%4"è¿àà!AݽÝÐB43 ¼ÿðrþüÜ$%!ÞîßÐ'Q ÿïÿð+ŽÿD?ýܾÞð3$ëìíÿð! ÝÜßÿžßw@ ìî#SQ0îîàbQ"ðð2C4"0ˆ°þÜžÐwÞþà"RQ Íîð3Üìëý23 íËÖtþß®#"! ÿ&##!!3B459ˆà#SîÍìÞð3$ ÙíÏÿð ;îÿøÏàw0!îßà$#$0ÎÏÿD3@ ÿþm•%D$W€îïîÞ'víþïA"!!èð11 ßÀâ6"!/¼ÌïtÏßÏ! îáB žÀíÍèŒ4#0®ì 1!"îþßðBCÿÞ'B8ñ%düíÏà2"ÞàÛîñ#b3 ßÏá"QAwØÿ02ßÞà ÒwrîîÐ#3à)Œ $0àîïÛ"qý¾ÀE°ÞÐa!ïð ìýÞ22ÜÝíù‹#%¿í#A/Àï23 ï ÿñAA0îøŠdÜÜþ32B4aêÜï5 ÝàâRB íÏà#7w>›þ3íÝÀð$"êñwîà1 ÿ߉ þîà#ïcQ¾Þ70Ïê3þÿs ÜíÑD1 ìÝýˆà2Q Ûþ21Ùî4#0üì$ íÞ¹à$' ¿Ïÿ"!íßàr üîÿ##ìÞïQGP¬¯22 ßï#1 ÷`ýð ïþ€31!Ûïà!A Ëß&1üÎôqýÝÀqÿð 1ëììñB1ÝÎðŽAŸà ïþïß64!/ÎÀñ2®ÖzÑPÊÌàCR 7Íý2#ýÏà"v Ýÿ!0 ÝÝðw!üÝ©ð"3ýÝï2@/ýíw?îîï"þÏðˆ!!þÀÿýýþA÷`àîþPðÐásݾÀAîÝîèŽ4 ÿ!!ÿà"ùð%"! Þð­ªð2"ûîVüÿð"Þ0"wÏï!íßð'w þþøð$îî$þîôw<íïý>ˆ°BÙÿ1ííÐB>ÄqýíìÀ2!Q ¾íbÎî#$]YéLê½à45/ÿ"¸°##ûßï üa2Þß'vîàð!ïÿUÎÝ#"íðwoïÏB ïþw^Ïà ïð1-Ì%4øÿñ! ßð#ÝŸðB"ÜýÔB1íÎ4 Üüüð30ìÎózï1ìïðA1Þÿ1¿R0ûïà ŸB! þñw-Ýÿ"üàð0ÿñ7sÜß!ýEÍÎ"Ž20/ïï# ïtD ÌðAÝð.àl 2Q0½ï2ýàÜýúñC3uíÝÚ&íÿf‘@ÞðFA îÀ àA¨"@.Þá""ì!«ðR¿ð0ï"Ûÿ2uíÞ2þÏ wÎà"4 žà"ˆñ20þïðA ðàuýÌð$!Ïà ãBø±2üþоà0¿a'NÜíö1 Ýß2Îà! ½Ï$@ŽÞðßð"ðøï"ÏîÁb1 ¿'t¯ÿ þààvÎÐ#qìÝB þè€#!ßñ# îð w !ïðÀ"À0þàp_ʬܽ½Ìήìýàîà3d4$"B$#35#S4344RB3ÏÿÞ½ÍÍÜÎÍìíÝÍ­ÍÍÍÛÝÍÝÍÎÞÎíÝÎ$3""#5$CE#C4C643R3RA3$##24ßÝÜÿ#0 Ú'`! ÿïï½ÞÿÝþÞÐ1 ÛÜÌÍÌìëíßÜý6%""3BAB3CDD$#bB23 íÝëܾÜîÎÝÝÎìîÍÛÌÜÜÚííÝ¿ÞîÞÝÝÜ5B3!#65453DC54C4524"#"33ßï ØÌÍT# ËHë¼îÚýÁ ÎÿÞÚÛÛëíÎÎÜÛðþßÐ@ð44"234#4D4CCcCS4430¯îþ¾ÝÝÎÎÝíÝÝ®ÜÜËÜÍÜÎÝÏÏîîîîíár"ð6D54CRC44CCB4#335!ÿßÝýí¬Ì¾±Oÿ!Í®ÿÐ@¾ðÿìðþýë½®ÝÍÍÜÝÌßý4Q2!1""CbRCCRE42BR"ÿÌþþììîîÝÜìýÝÌÜ;̾ÞÝÌýþîÞíîο"ð'%3bBR3C43r"2C#3%"34 €%öÁb®Þí­ÌÌÜýà3Žðàb ìàþûïð Þݼ¾¿ÝìÝÝËð 2 """cSSD4BSCB433<ñ/øÿðþýÿïîÍìξÜݾÍÛÝÍÝÎÝîÞÎÝξݰOÐò ð223d5453S43R%"$24#34$$#BÿCàþÞܽ½Í¾Î@Àñ1Ð2îD4R¿ïîÏÛîÝÌÛîÝÜêïÜàRð"ÿ2$5DCCRB6""5"3*Ýð ïÿÜ­ÛÜÜÍÜÝÍÛÝýêîÿíÎÞÜÛíÝͰ?°33554%$$$¤6678CCRR!2D"B5#4ð5ðííܽÍÛìí@í"ý10$b1$ûðþþÝíÞÌÜïÎÜìýìÌþýßS ðÐ#BCDCC44#a0#$"5@Â@ò!ýíÜ­ÌݾÎÝÜíí¾ßýÎìÞÜÌÝݽÜìíÍ1Û1#ABCC5$#$"1C1#D"SB53C443=ïðìîí½ÛüüýæñP!A4##C"ÁàÿÝ¿þìÞþÍîíÍÎêÞîÎPÞôÞò"ED$3C3A1$3T1#V"#R/ÀëÞݽÜÝÜÝÜíÞÝÿîÝþÛ¾ïÛÞÞÍRÍWÏÍÍÐnÑ3!bB#CB4#2A1"7$%#E#$%#3ìR àûîí;íÞÎßsÿD$232 3¸â ŸþÞÿÛííîÛþþìëÞüÍÔ,Þpò!"5##311Bd"2S#a"ÁAûðÜþíÝÍìÞÎíÞíŽíÏýݾÙýýÍíݾÞÜæòQ#33CC#2324#u!4C35$C2CR"4#Þq ÝíìÞÞîîñw;#1#2RÈïÝïÝÍìíÝþŸàìÎþ¾ßó+âr1 !36b!D1#B3°#ÛðÎþüýOxÙQÕÍÎíýí¹üíîÌíÝÍËþí¾ýÝÎÝÖ-ÕA#""32$#4$47A"a"#2C4S"D235ìAûððÞÿÿïÿîüýÝw ##$2"0ð€î ýîÝÍÜÜÜÝü¿ÞßÛïþñqÀq!!#4CG $#C#$226è àîàÞîîìþÞÍÊÏý®þííÞÍíÍ­îËîîÝîâp±`#%3sR12B3BQ2Ba3"#üÿàßÝÝß¿wÐ3A"#12# ˜â ïÏïíÝÜÍÝÍÞèÿÏÿôâp!!!A27ÙÕ>¶@23A33 Š0¿þÿÐîüþÝÍÛ¯ ÜÿÜýíݾÝÎÌ¿ýÜÿÞîçJñ1""$"AA2rD#B$$"33F@€OÐàïýíßßÿµpÓQ2!#"#"ˆÏ àýîÝÜÝÛíÚÝÿàG E 2#A#472#3"1!øJð.àïþýíÝÉàûàîííÜÜììüîÝŸÿÎîÐp‘0à@""23F11#4#BB3C4$"5 úAîþðþî þàà€r¡ !!‹0¾ÝþÜÞÛííÎÚïîÞY?êïäêîG{! #2"0AB3""ÿø+ðïïÞÝÜݽ ïïÝíÍݾÝÜÝÛîÛÀüí Ðp‚ â!""#$Bq2#BB3C43B3#TS @ÐîÞîîÞþÿŽ8ñ !! € ‘ÐÐïÞíìëïÜíÏÿ~Æ  !!5#2B1AðÿˆNÐ<àÐïÀßߨðüÿîîìíëýÞÎÝÎÜíë Àþp±_ñ !DE##53BBB33B2#c(AßîþííÎþïè²}ó/0"22#óþ ƒ!ÀoÐ/ÐþîÝݿݾ ¯þßðÏ t‘?ð00$$Ap012#"!1ˆ!þð ÿíîܯ°ý ýíÜÝÍÜÜíÎÜíÝÚÏ ÏU@á  "`23BC$$"3##2tÉPàÐþÿïþ±ó{!pÀÁðüþìýíÙÝýÜíÏÀ.q’=33@TðBA#34#$!!!ˆ^Ò üÞþÞŸ îýßÌýììüýíÝÍÜÝÍÎìøýp£0##`233RB2C3C44#2B"7 _Ñ.ðÿþîí ±àEâ¯ç #4D432D!!àý½ÜÍÜÝÌÝÜÝÍÜÝÝÐrô #3T43CD3#CD3433C3""Œ àýíí®ÜÍÌîÝíÜÜÍÝÍÝÜÜÝÍÍÜÝÜÝÝÞ­àró0##D4CCb33443CCC43443C432""àþîÍÌÜܾþï÷""4CD3D""€ðîëÎÜÝÌÎÝÝÍÜÝÍÝÝððq"#C4453343CC43C3C4"!Ž ðîìÎüÝËÞÝÝÍÜÜÜÝÍÞÝÍÍÜÝÍÜÝÍÝïþ¯ró ##CD4E"333C443CC4344s H."/44332"©ðÿþíÍ»îîÿ×/244CDB"""ŽàþíËÝͽÝÍÜÝÝÍÜÝÞÝtó 34C3Cr#C2$"3CC43C33"‰àþíÌÞìÍÜÝÍÜÝÍÜÝÍÜÝÝÍÍÝÍÍÜÝÞð×p"C44c#3C33D3C43D3443CC333#8ÑàþÜÜÍŽíÞîàÏaò"#D3T23""(ðßýíÍË;íÜÝÝÍÜÝÍÝÞÜç@"345BC442#3CCC4333"#I¡þýݽÜÜÝÍÍÜÝÍÜÝÜÝÍÍÝÝÍÜÜÜÝÝÞð~2D3JÊ-¼$B43C433C443CCC3CCC33""3¸ðÿþÝÍŽííÞîüáp#43T23##4Ø.ðîíÜÛžíÝÍÝÜÝÍÍÝíÝÚõò 2435R443C33B443433""#E8ßÜíÜܾÞÍÜÝÝÍÜÝÍÜÝÜÞíÍÍÍÝÎïå~$3R3r#CC4334443C4443CCB"#4ÊþàÞÝ­ÜÝÝÝÝëßp3C5B"""4C.ÿïîížìÍÍÝÜÝÍÜÝÞÝÛÍÕâ0243c5#C4343$3C3C32"#D3;€ßííÜËíÍÝÍÝÜÝÍÜÝÜÝÍíS ÃÜ]ÚÜÍÝÝÝïìÜt"3G"3D3C3443CC43CCCC42!"448ßÎïí¾ÝÝÝÝÍϯ""6"!#DC;ðÏîîëÝÍÌÎÍÝÜÜÝÝÝÜÌÜß: !"5B3CCCC3C4#3C3B"""33BŽêýíÜ®ÝÜÜÞÝÜÝÜÝÍÝÍÝÍÍÍÜÝÝÜÞÿþÜÜ÷""b344CC3C3CC43C44CC33"#C3?ƒ€ÿþîíÝÝÝÜÜÞÜç22Cr"#T32ïÿÿììíÝ̾ÝÍÜÝÝÝÍÌÜÝ?#6#43CD3C344"33C"!""È ` °Å{ÛÜÚíÝÍÍÍÞÎÝÝÜÝÎÜÝÌÜÝÝÝÍÍÝïíÍçRQ2#3CC443C3C443CCCC4332!3C3ƒ€ÿþÝÞÎïÿþÝÌü123E#3!U32€ÿÿþÝÍÝÍÜ̾ÝÍÝÜÞÝÌÍÝó'C4C4443C4344"#3B 38þþÝÍÍÜÜÜÝÎÝÝÝÍÜÍÜÜÜÝÝÝÍÍÝïîçrB3a"#3B3CD3C3C4444C43433!îÿþÜÍÎîîíÝñvD"432íº¼Íîý½Ýîîíï으ÝÝÞD" Íð%4"$D43sè º &!ûìðB îóOˆ!! Ðð10Ý0 a üþNÐD1¾àtÛÿ!þÿð2ÿðp ÎðBùÞð"@ ˆòAþà"ÿvìîñ4ýßÿ$QŽA1ÞßÿR Íà#LÀ%#f¿í&!Ïð ßð!!Q íàD1 ¸Ð5 -Ï" ïïð2ÿ¸ð3# îëòrìþA/þw;ïð þàñ3 ïðtìî#'.¾à@þ‰îïàðw~Àÿ!þÿâSª#Ýð1í'0¯à"ÂùóñòÛÝÎÁÿîECC$#43C43SD2B$4CB@ÿýþïÌÛìíÜÜÜíÝÎͼÜëýݽíÎÎÝìíÝÍÝ#4CQ"1AAB4BBB3CE44%#AB$##3ðþÜÝýÿÞíîþÛ¼Ýw #$ ÛðÈ ÿï¿ïðîîÐí¾ÍÚìíÎÌÝÂÏî3bR"##BB2BBB5B4#s#3@ÎïÞ½ÍÍݾÝÏÏîÞÎÌÌÝÌÍÍììîÝíÎÜíí`#2!"$36#CCC4CCRD4$C42Q222C#þíßþììþݼ¾Àt"0ðìþÿÙ/¾‹ÿúÿàïýàÜëݽÎÍìÜÍìýô 4CB23BB#44BBBr3S5"B ÎþݽÍìíÎÎîÞÝÍ;¼ëìüýÞÝÝÛííÝÎÅ"A2"RCD3RQB3CD6#$$#$2B30Ñ1 ÏððÜÝÝÛëÜÜç0ñC3! ïìÿ8°ÿ ¯þ íàí úëíÎÎÎÝοÐà#c$##$"4$4BR35F236$ÍÿïÍÎÝìëýîÞÜìݾÍÉÞÞÛíîîÜíÞÎÎÏAB234cCRBR3CC45R"434#4343þ# ¿ðýn¡û$ýÌí½Í¾ÎqA0/ßÀ3Š¿àïÝîíîî¼ÛíÎÜÝÜÙþü2$32BA35BR3R4D5#$4# éððýþîþÍݾÜÝÍÍÛݼìÞÎÝÝÝÍÎÍììÞÄÐ3#1BCD%#52QA2CBD#B4#3BC$0ÒAïÍÞÍͽÛí³Oà5"Pð"#K€üÏÿÝîÎß¾îíÌÜìíÝ­ßpßâ`""2D5$#C5512c!"CíïïþÜÛíÍÍÍÜÝνÏîÙþíÏÞÜÜìíÜÕÐA$#25$3D45#$26#2p4R#R#$$32ÒaàÎîÜÍÍÜÛápà$ð!0 þïíìþïÜíþÜÛîìúíÿ3Ëðpá!#25$3C44%3"%2C%-@ìÎíí­ÛüîÎÝÝÎÝžÿíÝÛÞÛÝÍìëýîÎß_Ð!3R#45#BC$233c"%#3c#D3C443 6ïÝßÍÌÝÜÜÜEþ "B$1#øÂððíÿþìÐýÝîìÛîèþÃ.í6à1DBBB3A21E1b1E!#áaÐ?ÍÏÝ;íÝÛýßÏëÞþÚïþêîýÛÞíÍÜÝÛå[yvósD#$4$#34#23u3C$$D#$C#4$"°PÿðîîîÍÎÞÍìásÐD#43AA2ˆýÐÝßýÚýýÎÿîÜØÿýÜ ò@ÿ""5"24!!!G@b!2C4C.Ö0Ì îïÝÎÝÜÜíÝÏÛ°àÎîýÜÞîêîîÝÎÎìï13A242A3"B#3w#33CR#b4##C20îð¿àßÞþßÞîÇpÿ5330@ŠúÿÿþßííÀüßïØïþÍþ 0ÿB B!"C7QR!#4#T/‚ Ý îÿÝÝÜÝÎÞ=Ãù“øíŽëïîÜíÝ̾ïÌîÞ¿Ïî÷þ@3"3"3QA2BG!#R"$##BCa"BA#2@ßðÀÿÿþßÝαt""2#/òˆíàýïÞÜìíÍÜÀìî¿ÿÎÐî×<ä` #s6 "21C$6ÝðÏþýîíÝÝÚîÉÿüÞíëîíÝÛûÜ ÌîÞÎÞçô0ð3"$$#3R5a434$34B61"!2¿AÜßýîìÜíß¡q¡1"0##2› ùîÿüþíÝÎÎï¼üþÀ÷÷@"1GMºØ5333B-o þðÿïÿÞýëýøÿ îÿÎîÞÎÎÝμßëÞýìïú 1 2##BCsq1343CBBDC".”-Ð ßðýßÜÝÎíü—0ò3B1232H€O î ÿîÞìíÝ€îîÿ vÀA1##2s7""33"2ˆì ðßïîìï­ðÌïûþîìüýìüýÜ ýÞîÎ×*ôñ01"$"G41%"#4#C3R#3F%¡0ÀþïàîíþÞ(•Oñ!1" °ßÿíîÎÏÏÝèðîþÿÿþi$÷_'!24!$"#37C#C3D"32""""ˆðÿÿÿîÝÍÜÝÝÛËÞíÍÝÍÜÜÝÍÜÝÍÝÜÊÞíÝÜæ/0R"3433CUB#C4434443433C4S"@ÀîþÍíÌÞîîÝØÍ3433333}€ ÎýÍÜÍÝÍÍÝËÝÜÝÿîÿþç`ò1B#S!2#U!$33CC3"""""8ßÞýÍÜÜÝÝ»ÞÜÝÝÍÜÜÝÍÜÝÍÝÍÝ˾îÝïqà23$B#3C3t25"43C3CCC433C33s"ìþþÌÝÜÝÎîþºþÔP 353322&R¯í=Iñ!óÜÜÜÝÍÝÍ­íÍÝÍÿÿððsàQ3D431"c#CCC33C3"""32ˆÝïýÞÜÍÍÝÚÍîÜÝÍÝÍÜÜÝÍÝÍÜÝÍÝËÍíÝràA2"3D33FB#B3C443C443C3C334sìîÝÜÍÜîîêÞëÕ0 #3S433#s"ðüÞÛÝÜÝݼîÍÜÝÜÞïqã@3DD33!SC4C433B"33#3;Ž ÏíàÜîÍÍÍ®îÝÝÜÜÝÜÜÝÍÜÝÍÜÝÜÝÝ«ïàpò "3CB3EB#B3C4443C3CCC3C333E¿àîÛÝÍÝÚÞîÛ´á!t35443#r=‘ðìÎÜÝÍÍÌÞÜÝÍÜÝÜðÿ?"#CCC4R2$3CC3C3C3"32(€ðîîýÎÜÜ®îÞíÜÜÜÝÜÞÝÍÍÜÝÍÜÝÍÝÜžò_"3CCDR33CC443CC3CC43C333@€îþÝÌÍÛÎíßì7!"3D43c"2<± ÞØîÝÜÚîÝÝÍÜÝÍÝÎæO243CCF""##C43C4343328þîÜßìí­íÍÝÜÝÍÍÍÝÝÜÜÝÍÜÝÍÜÝÝÝØÑp!3D4T"333CCC43CC3CCC43C¸ uC3/àþþÝÌܬîîîû#4B7""" €ÿþËîÝ®íÝÍÜÝÜÝÍÝÎp243C5R#414"3C43C43333!ŽÿîìÜßìÍÜÝÍÜÝÍÜÝÍÝÝÜÍÝÍÜÜÝÜîïÿè5â #$3CEB4#3C#C43C4C3CCC3CC333ðÿþÝÍË®íîÞí°P"353c#343øàþþíÊìÎÝÜÝÍÝÍÜÝÝݽñ0"#3CF"C3C24#44343C3"348ÏìíÍÍÍÜÝÍÍÜÝÍÝÍÜÝÍÝÜÝÜÜÜÝÝÞïÿþ·ÿÿþíÍÝÝݽÞwC2D2!íªÌÝßÛÍÞîîîïÚ»ÍÍÝïC ÚÞ532"DD3C3DDC YÈôq Þ20ÝÀBîïð0øÞ$B/Íß# ãr"ûýñ"!wÏþÿ@ ï7oüþ2pÍì" $"íð"ýRr½îBýßðS(¡Ï Îí2½r&`ÝÝÒuÐ! îÿ"¾ÞB?®‹$üïà"ü20Îî1Íð÷rÎÐ@þÿ"!Þÿpíî"c Ü ÛŠ#!Þßð÷wíþ# °þQŒ/ßñ!ÿðS® ®4!SÙú¾Ý""sCC#C44$#46$24D43?àÎßìÛÍÜÜÜÜÝÎÝÎÍžÝÍÜ;íÝÍÝÎÎÝÜÐ1CCB""$3CRR3C443cR3CCa22C#4"ÿÿÝîî îíïîÌ­²u1B¿ððˆÿýÞßÿÎÝàÚììÜÍÍÜËîñÀÁ0SC$35"A3BBSC3TCB3?¿ÐÜܾÝݽìîÝíÍÍÊÝÍÚÝÎÝÍÝÎÝÎÜíÒABR3$453R4$4455#53C3R#3$$ïÏÿÿßÞíÚÛÍ×P#4ð¿ààñ-ˆžPÿûÌïîýûðþíͽ¾ÜìíÌÝ>ÝÛ$BR"1A3"BB5#4'2S4C%" ÿîÜÝÜëýßÝíÜÎÍÍŽëîÝÜÝÝÎÎÝÝÜÜ$""3$D543SCCR3SD3CBB23BB3- ýÞþ½ÝÏÎÌÛÝ7/R1 üàÎð4€ýÞÿÜíðÐßËÛÝÍÍÎÍìÀ ÿÒ1D6"2$"4%#CD$3v"43=0ÏïþÍÎíìÝÎÎíÜëüíÍ«îßÍÝÞìÝÎìîÍàpð!""264CD46#F"2C4#35#33À3 îÚíßÜÍO'ýÉýÛÒp2Ð"îÐcnýÍïÜÛÿîþþ¾¾ÝÜÎÎÞ® ßÐB6"3$3SRC4CCcC3D4ßððïÞþî¾ìíÛíÜݾͽÜÝÍÝÎÝÜÜìíÎÍÿð2B2%3S46#443CS3SB4$"3=AüÍíÛÜÛìì÷3"þ#%ÁÌßïÍîÎàî¾ýí½ÜÝÛí®âN¿"4#3bCBCC5D"4"ÀÏÝßÜËÝ;ÎÎÞ¿ÞÌîý®î ÍÝëíÎÝÎÍþðQ23#5444CCBB3DA#6#°ÉUCB443OóP îÞÛÎÜììçð4ðB!51 K°ËïþîÜÞíî½îîÛÝìíÉþà`Àä ý43D5$"B37"%23T #°ÝýÛÛÝÜÍÜÝÜÞÚÞþÛýëþݾÞÜÝÍÜÜÓ;à307"#4C5#BB$"qA4B44B3C5ïB ïüÞÝÚÝÎÜÝÎrß%3$4!4"‹ ÎþÎàÞÛÿþÏÿíÝÏŽþýçPð5$#5"222c1bS!å1ëÍßξìýíÏÏßÞÚîþÌþýØþþÛýþÎÝݾí"ÏôD"C3R$"$"$a!CB2RR#%##3C>Å ÞÎÞÜÍÎÝÛîçNQ0"#B#01€úðÞðïÏÞïíÜíÍžïêï2Ü÷á!"424#""wB3R%"° îþÝÎÝÎÎÝÝݺþ ÜïÝÍÎïìíýÎÎìîPî&3"Q2"2A237a%#B4!1C#$3LOÎýÎïÎÞýíßÝ÷r¡2A1B€¾ýïþÝÝÜÜàÜÞþœÿí¿ïQÞ>ðQ!2BG1Q!#22Cb)° ïþìýîÜýíýÚ¿b¡ûÀüÍÌÍÞ¾ÜÎî®îìíÝÜRÎ5A!1$"3C5c"6#3C$3F!$3$$/´°ÿàÿÿÿïííÍÇ}ñP"ˆüþðîþíìììÿÜíÏí¯àî  ð2""34C6RD 33$3B#‘ °ðàþþþîíîÛüËÛïîÎíìíÝÊÞížþíîÞ 1!"4#447@2#%"$#3CT!4A"0?ÀðîÿÝÎÜ ÷:0ðA"""ë@½ þþíÝÍÍݾ ®ìÿïVî'?1#3Ct5"2B28Î6R8” à°ÿÿþïîÜî»ÿúÿþîîÝÎÛüýËþûïýýîq¿A#33R37PA"2B3C3DRQ!ýþýþÝÍíßË' $1"B"2A28‚;ÑÏþßÝÎÝÍÛÀ ÐðÞåÃ`ð1234rq"113"ˆ2¯ýïïîÝí¯àíýíÎÜìíÜìèðîßüïRŸAÿ!2#%rq""$3C43B5@Q àÿíþîá‹bÀÿ"!æû àíîÜÝÜÜÝÿîïðÐï÷lõ›¯& $ @"ra"#13""(€MÐßþýÞÛïÏÏŸÎÿÞÞÍÝÌíÎÜíÜìŸÏïÝq @à1ð!#sr22BB$#4$#2B7% #íþðïßýîÞßñp?ñ "!Þ íÝþÎìîܾ ÞÐëðð'ùAð!P!Aóp"13$…í!ÝÞÿíýÝìŽÎ ßÝÜݾÝÎÎÝÜìíÈÞàÇ ÿ !PP@2#3CBBB2B23'0…àÿþþÿîý€ 'Ï1ð"12!W  àþÿºCø(øÍÝËÎíÍÝÎÿöPò 453C!bC44334""""#8ÞÿíîÜÜÜÝÙÞíÜÝÍÝÍÍÍÝÍÜÝÍÜÝÝ»ÞíÑpâ@2#4434F14343CCC3CC43C333EA°àÝÛÝÝÞÞÉïì"#C432&B. ðÚîÜÝÍÝܽíÍÍÜÝßþð÷O#4D433q34C4333432#38€ ÿíÿÎíÍÍÚÞíÎÝÜÍÝÜÜÝÍÜÝÍÜÝÍÝÜ­îÖ>##C434F!#3CC44434443C3C333pÀðýݽÍÍÝËïïÍq!ú‘4443&2#(þìÝÌÜÝܽíÎÝÍÍÝÝÿïC353D3DA2443C43433#3"À½þÝÞÚîÜÛÎíÝÜÝÌÝÝÍÝÜÍÜÝÍÜÝÍÝÝØÞ÷"!#44CE2#3C443CCC3CC43C43338ñþîíͽÜÙîîïÞpò "4CC4b"ïïËîÝͽÝÍÜÝÜÝÍÜß23C4C4S#2C43C43C4343!à¯îÜïÜì®îÞÝÜÜÝÍÍÝÝÍÜÜÝÍÜÝÜÝÝݺæ"!#4CCr#3343CC43CC3CCC43433<YjúoàŽìÍÌÜžîîïÜRñ ##CD3d"""9áþïì½ÜÛÝÜÝÍÝÍÜÝÍíÏ÷/"243C7243"C#C43C43C2""( þîÜÍïÚîÝÜÝÍÍÝÍÍÜÝÞÜÍÝÍÜÝÍÝÞïþÊp"$3CF2343B#C443CC43CC43C333ïíÜÜØÞÝÝÝúô"3CD4S#33C€ïþí­ÚîÝÍÝÍÜÝÍÝÜíÎqó2#43d#C432C#C43C433#3CšïíÜÜÜÝÍÜÍÝÍÜÝÍÜÝÍÝÝÛÝÝÍÍÜÝîÿý×Ðp#$3CU"3C4334x¼443CCC3D3C3334<ïÿîíÉîÝÜÝßÍ"#44b##34>’ïþÝܹîÝÜÝÜÝÍÜÝÝÜÝ¿o""34E#C44334#C43433344C ýÎÜÝÊîíÝÍÝÍÜÝÍÜÝÜÝÝÍÜÜÝÜÝîÿÿþÛ7ÒP243G"3CC3C3C443C4443CC33344;±ÏïîÛÎÍÝÝÍÞ¾÷"#F"""3C@¢àþþîØîÌíÜÝÜÝÍÜÝÝÍÌÝ^##C72C43C441##C3C334442¹þÞÝ̾ÜÝìíÝÍÜÝÍÝÍÜÝÝÜÍÝÜÝÝîîo¬þÊþÜÍÇ0P1#4r#443C343CCC43CCC43333D43€í ïþÛíÝÍÝÍÜûñ` "#b""3D43  þî¼íÜËíÝÍÝÍÜÝÝÌÍÝô²"3T$#C44343A#4342"3424(ÿÏÎÝÊîÝÍÍíÝÜÝÍÝÍÜÝÜÜÝÜÝÝÍÍîîîÜÍÞb!"'"3CCC3C3C443C444433334443:ÿîîÝÍÝÜÜÝݾp&"""3DC38ÿþÎÎÝÜËíÜÝÍÝÜÜÜÜÝÂðR3b3C4443C3CB"#3333"C4>€Ÿîí®ÝÜÜÝÍLISTBINFOICRD 2000-05-10IENG Deepz0neISFTSound Forge 4.5cue dataLIST<adtlltxtrgn lablRecord Take 001pygame-1.9.1release/examples/data/punch.wav0000644000175000017500000001012007216105640020621 0ustar vincentvincentRIFFHWAVEfmt ++factÉdataÉ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€„…ƒ‚‚‚„ƒƒƒ‚€€}|~|}}}{ywusstuvux}~‚……ˆŒŒŽ‹Œ‹‹Ž‹Š‰†„„}}|xwutvusrrvxvxzzu{{y||~ƒˆ“šœ ¡ž—“‰‰…ƒ‚}||uspqlpnxwuzywvwssx‚††Š…Œ‰ŒŠŒŒŒ†‚€‚€~{yyxojrtooxqmnosr|}{‚…‰Ž‘˜™ž§§œ¡ž˜••‹ŽŒ~uphY]]UNSUOUV[fgctw€Ž‘‘’‹Ž’”¡¨¹È¾¿»¬¤ž™”Ž“€}sb\f[RLNNDDOMZfko{{wz‡‚˜”µº®ËÆ¿©·±­™ˆ†‡jTf\Scbcabb_psv…wrnkjruz}}ŠœŸ—†ˆ†€…ˆ„ƒ‰{‡„zsv|~ŽŽ‰ˆš—”ŽŽ†xuqok_OT^c^agepny‡™“¢ª»½ºÉÍÅ®¦˜Š…nfge`NE.//9:ESc`q‰ˆ™¢š–Ÿš©ª”z~˜^§¥ËÆÞ[jqrUŸ‚W”''º¤-JUQ.3Mi³ÞAƒ®­“Ê¿»®¹²˜€—|Š¡˜‹|_Y®|eµr\¤¤·š¢n[7T78Vm3tÀÏ¿·Í¼›ž¢‰l]x¤¢¶¬´‡–³„}‹zƒšœ‘²£ ¢¬›•[VH@*   '(!>HLNLs˜‡£´ÄÊ¥ÀÅ›’𠑦µ»¾Âϲ¥§…„xu…„’ª´ÀºÐޝžœŸž —~|€soŽ~„ƒˆ‡‹Œ£¢’®ªh]_>4 " D:,EJ())61^JO}jw›XªYqx_FwKA~8Jv]‘¨©Æ¤Ç·¾­³±¨Å¼ÐÏÆØÛùŬ°¼´¨¨˜‘›¥µÉ«ª»ÐÈ“µ—’žª“‰•›€`€\y”`ˆŸ˜¤ŠkÂÀˆ“a]U¸`cnQ'QNBt†Ra†]G`¡âv£Üt\žÌ§k_dfÆo*•Š–0‹ËATë~,ITF¦ªKÛž$yÜ¥c¢†s/‰½{ª1q&B†!Wؽy¤—]ËuO\Á³ŠH•ä•tÂèD­€kw™§‹Êª‹µnµ°p‚ÅÄ­šÒ«žš”´«®Ÿ±Ï‚X¶Äx¦ÏªB’©º<›Úq`GÃpUpThtf vxm*i`€:™ƒ6MªH“gešOo^< q`60sO:¢q]TwmB]dn‹ulM¨’X£žvå{{oƒ“¨kgØŠzj¦u=b}_¦v¡z‚½­Z§“mSƒ¿|\áœ]p‘‹¥›i”½Ë‰G”ÑAz³ªvƒ¬Ò¥yÑ„`êƒbÂj•®W—¡8´Zs„G®€Š>h:Pk5r¥E-c“cb¶]WŸ‹ƒqv‰‰C¨wXHu¡–a{Í”wWÎd~›†W«¨‰?´/lžV4 ¥'z¹S«s0lµM‡‰½[`v²WS\¸o…Ž‚‚p\ºx“C]¾(d©Èqi{Ÿdi¨ÛËix¼‹…n–»ä¯·‚{°z;‘®S>°¸8kÝ…GŠ~¢”\s¨³`’~‚‹{”{‡”“a]~IS¨v ]¤vXšdr…¦JY¥l‚sm‡†ªb}›š¨+s®@‹˜g8u€IV£™°ypt¿Š,xÖt[œµ†Ä¦€g†ÉS‰wZ‡x¹e3v¦€p„3|Šjmx™ªRp—uozÇ„Xœi{¥]t©Žš|j=m†Oo¦pd|ŠSeLG_–„@Jsk•^x{‰>}³}A\˜´{ˆx­ư‚ôš´ÔŒš]ÔâWx”®À€™–Ìqƒ„v±‡ƒžµr†³žyfz‰q€§wÉ~O“³W=…©l{}s=z`%§lI@xvRPQ[wpeB~`Xw‚PRmq1M–‡krn‰Qpƒ—`V•t•g€¾‹s‹v÷‚s´êoŒ¨–^¢°¡„˜“ojšnkp}x~”oz‹wa‹d^…gTk¤wQ|j\Œwš’‰Š”v²‘|Лޅ¢‚ Ÿr„­¥²˜Œ±lu•ªž§Œ}¿‚a³–e~©€RŒ‹y^‘¦_Gh‚sm…`ssd„OR{ŒyKRr…E7‘yO}lJhZ`aHhau”‰gky;^°prs«‰{Xƒ|ZŒœ’‡rŒ‡ƒ¯i—Çn¡Œ–tª­yn—µpi¯«^‡¾·}Œ›«’Á•y‹ÀÓyž„–f¢‚—¬…Wf´‰Rp´Jn¼ƒ8{­™›•‘yly‡Q‰¤_‘xR‘‚\wxeqœoYyŒ;\…3„š3C€eM¤Z"tq?Gy‡GQm`kFpzOdyHNbl\c£Y¥uaž‹­…­|~ÖÂwu”߇h–™ŠÅÀ¨¹§šÆò‰†ë¾¶¹¥‘¾» ´u˜·µ¤zsœ¥j¤œz–Šž‘c‹v˜Bxž[Zz`Th‚l;PŠC\tH@?pIHaOY9”KJ‹Œ:Z‘{a‰`I„†{Blˆ…ŠdxvvPQ£^¶Œg™«rM¼²fpÒb¬œp¢§ ••’¥‘u¤˜e¥}{\§h—œ}y†ƒq¬šŠ¦–‘•¤Šˆ†¹^v‰Vi–B~@dŽ‚\b¦£n‚Œ†›fdœ†iz˜va”gu‰“N‚˜‡˜ez}qum¤•b}ˆ€Žtq€op€r_‡vko{_…sqVO…p‚db‰vLX‚rfŒud”{]‰n“{u|ŽŠ‚…‡„‹nx  nš©~}Á˜XÊ|k—À¤Žp£Œ{u› k§©~{˜·‚q¸Œwx‹„|ˆnfhކf{Šzwbu—fXf|iH‚ql«pGŠm`jƒxZŠ£bfyhœ“_€š}Kl»sQ~€•tMmž“orŽ{vb„‡‚š‰mtІs¤‚xŽœ——n®ˆrˆ€¤{£ ‰|€¯€k˜ ‚lynŒ~ež¯{[^‰Œ{h|R|Š`sd€hpbƒz~z~f•”oˆŒp„€|{Œ‹ˆ‚‰„|x‰”†zu“Œmx‡‡‡uxƒ‹ŠepŸ”sln~{wdt‚‚}…qsŒ{^]ˆnl~axvejnxzˆ}rˆ„ŠВމŒ“‹’‚‰„—•‡Š–š‹£¥§š˜x‰›”wm˜p‚«‡|~sy„nW†—uw—ldlƒ›ndtˆŠjhyyvƒtei^|tuuk†qekujp•†b†‰k…œ€~Žƒ‰}u†‹p’‡„uv{Žhy†Œ‚rv‹|uƒ„Š{t…’‡t“…ˆˆ—ˆwŠ˜€ƒ•„€““ƒ€…‡‹ˆ‘}‚‘wv„‚v„|}‘ˆstj’…tƒt|Šjq…rz€yp|sozvxxvy†}m}ƒŠ‹|†„†z€‡|†ƒu{zx‡}n‚‹uy„x€‘}„ƒ€…x‰z~w‹“oˆux“…ru……ƒ{tŽxŒeŒxƒ~zxwˆzi‡Š{x‚u’‚Œ|„||‡’ˆƒŽ‡ƒo‰‰u~ˆz‡‹|u}‹|q†ƒ…zp{‰|q}‹Žs{€ƒ‚y‚„…u€ˆwu‡{ƒy…„}‡Šw}†|‚Š{…{ƒŠˆƒ‚‰}‡€ƒ‚xr}si}‚yzmuw€}nw†xtx{€{t€y{„„nx‡€v…€|‡}zŒxxƒ‹€~‰‡€„Œ‡‚ŠŠ{‰Ž~}€„‹‡ƒ…„€„‚|y‰Š€y~|x‚|‚|‚‚€r‚‰}y|…p…Œ€w{ƒŒww†{ƒ€}ƒz|‡}t~Šu€ˆzy†~‰€…ƒ|€’xˆ‰„Š}y‚Œˆ‚v…‰‚}‡}€‚†|~ƒ‚|}€„‡zx‡y{„†u~€‚xy|xzƒzk€ˆzz€€‚}}‚}}ƒ…~~…€‚}‡€}|€‡}}„|ƒ€y‚…~{‚ƒ}~‚ƒ~}„…{„…ƒ‚€‡ƒ}…„}ƒ…‡€†ƒ…‡ˆ…€~†ƒy„‰„……ƒ‚€ƒ‚}~…y€‚y|‚~w}}x|ƒ|x|€{}‚|z}}|{}}~}~€‚€|~~}}‚|}~€ƒzw…zƒ~|‚‚ƒ}ˆ‚€‚„ƒ‚€€ƒ~„‚„ƒ‚‚…‚…‚ƒ„„‡‚~…€ƒ‚„‚‚‚†€~„ƒ|ƒ‚€‚‡€}ƒ€€‚ƒ~~~ƒ|€~€‚z€~{|||~~{||€~z}}}~}~}}~x€‡€y‚|‚}~ƒƒ€ƒ€‚€‚ƒ€„ƒ~€…ƒƒƒƒ~€ƒƒ‚‚„‚~„‚€‚‚€€‚„€€ƒ‚}}‚~~ƒ}€‚‚}~…€}}‚‚€€ƒ€€€~‚€}€€}}}€~€~€~€€~€€}€ƒ}~€€‚€€€~ƒ~€€€€‚€€€€€~€‚€~€€€€€€‚€€€€‚€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€LISTDINFOICRD 1994-01-07INAM Punch FaceISFTSound Forge 2.0pygame-1.9.1release/examples/data/player1.gif0000644000175000017500000000661607202715154021052 0ustar vincentvincentGIF89aZ=÷€€€€€€€€€ÀÀÀÀÜÀ¦Êð             +"1'.#!7# *%#####,%+* *$//*+,2:*7,35)*#,3#2-#0-*=/)24$44)49%5:*93%96+:<%;:,<<1&N<;A+=A4aEGG"@/%D;+A>3S7-P?.Q<2EF,BA4DC9DJ3EK:KB3JE9JK3JK;HS-KT;VG6PE;SI3QL<[D4\K:SW;Wa<`O7bS=fX>kVÑ›Ç p3ÂÝ OeK5¢iAþ¯°Ä¸F4±Æv82 &˜ðªÇAÈP‚ áÅ#¯dSË.¯Ô  »„ #84„™VIk°aGlìñr½t¿²ƒdÄü /˜¨K ÕÈRÍ4ŽÁb 5Žà -&Ÿ| [ÌQG²‰§’¥(¯ÌÈ]E–€:CF<á­D¦îòËpÃ¥-ÎÁaEà}É6Õ`s ðÓpÀ²âXóÈupe‘8Ñ$ LÔ…ºhÄ+tá˜EÄ(WÛBîà‡öÜg Øà6×ÁŽn¬P(@äÀ‚„,PƒšpŒcíp$ÂÁŽÓXذÆ4ðAÀbþÓH&x’K¼Â8º¸ƒ$‰<ôÁdXˆh¾ð2°!uV´•Q/¹Y"x¨nP Ü!½³7Âqx¼ÃŽØÆ8¬ I`Bˆ{„,±‘DB‘ D Ä(U䌯°ƒÖ …è ï™WJèÀÖª|õzJX¸C‘C¥bwÓ€…,¸!ŽqŒƒ1lGŽrEÞ zXÝVа 'ÚŠ„ÐF$ü /bŽð‚#˜`…ä P¤$mõª@de yÀÍü"–½hãÞøF⪱ ixa‚À‡9Òa]€Ã?5ÁD#ʲ#â‚ðH IAøA’þX„4$AGH£s°Zr2`§>ô‰½bf¯RŒ!W‰™%á:K0PÙÅ_®!6Dbs ¦8ì?´ò)LaRêðˆH¤4…´²C T¡Š:€a OØ” D,¤pØRBŸ…6¢ƒPÛìÅíˆ%3º¸DÓ|ÇQÄTㇹóC–p„"tõ`ýAŒ0V²vµ ‚S†"ðà;ˆk š@-D‘b$±…‡ò¢ !D%19Ä+% Ä %–ÞUã—¸F/4z"iÀB€C˜À%Xa V°Bš`„Ò¡f#ki‘@†@?CþÝ‚&Ì¡‘ñƒ ì ÛîødèE[ 79|v÷Z‰[úÆÜLUã¢Cp%pv IP‚”À]%$AA`‚Ù ÝÒšW BÒÂŽ€„ñ¡ ®-Ñ„'„ }ˆÙ<×Ð…hÒÅŸØC#¸܉Ú$P}{…wûñ6˜³¶®„µ«„ ˆŽH©üPAAè!YiÄníy‡S¤ $ª“Zé…” DVVÇyŠ[.(GÌó VX†¨{V&TÁÈ£mš áæ9B‘+våIQ·†5Сd¸í¹ÄÐ…*d[Ø> <‚)àÌÊs@þ ¦8B¸EÄyð@õ„úBI§PØÂZæ‡@øá³ mh?Ë…-Ô€±™Ñc4·(ÑøÀ&‚@Áp@Œ•·é2 .˜<ñ©õ*a´PÈsª­&¤š Kˆõ’·@ëA‹ …n‚ iOûºE ˆ@:‚XÀÀ}æDàÙNž4`.Î?X‚xQjn7aÕ4huÚ@sášî4Á"@ D` °…Mlƒ(à™V@Ú-0€÷À4O×ÕecÂRÍð-еÚyÞÂv'Î@VÜÃ.àè3›Cˆ€þP@P`g΀ʋ]{£ x@Ü=‚v/àì&¸H@‚ÿ%9Ϭ†BhÎÿ¶ pi$îpñAo ç àM“€# AL'ÅûÙÏ>Á T dØß-ƒ(=Þg®À Ž¥ë9šÖxÏ{­…~6Œá g@Ãgµ0h.€¡ `P‚"Г¿›ñ#èÀPÞ€<ÛòPd ƒ³G æÏ–·ÔNË[¾1`‚ÑÅPî‹úéoB¸°„° „-¬°û-ääðAÒM0”[Ø :Êby d />œ­rt£~ %·hþ-ÚÑr¶ h(-w“ ûòóž÷ÀNðü8`0¦Ú™¯ò l!€Ú›}| Aí*'' ØÇYÖõ}e€ÜÕYä‡Lu`[Pq°¦ # |¼– @lú6lÂÆr ¡ð~Ϧ*°Xw v&@H@ZÜå}L¶dF0ZÝ…v} Æ* |p0}î×Ä–á|*o"·x‹y# .w  vBpQfDà]B›Uq à (ð¼vh†„ È*‡„Ã6„¼y[glB Mà{KÁð|Èk0°uš†„ ï&vÀd#€'p¥aZW}UwwÀ~*Xi1‡™Glx’Xo•±—8‡xØ"Âö!„EH0%€„Tˆ0„-âl@èc ànÏFU§ Ð)‡„#ÌØŒÎøŒÐÒè;pygame-1.9.1release/examples/data/oldplayer.gif0000644000175000017500000000206307202715154021460 0ustar vincentvincentGIF89a@0÷€€€@€€@ÿÿÿ,@0þ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹0£Ç…9~Y£I“$Iž<™räJ”-=¾ãÌŽ5/ÞÌ©ó&Nž}þ Q(Ñ >NÜ©4"Ó¦x ¢TªUÞ”Êuê̬[»zÅÊS¨Ù³C?¢]ûÕ%Û·d{›¶"]ºjïÂU©÷l˾~SŠKwpËÁ} O À¸±cǃ#Kû¸r†–-OÞ9³c…žC‹MúòÁÒ¨S‹6XYckªE»~<ûóÀ׸c{®Ý˜7c‚Ž5 ‡½›8cÞÈ[Îxoæ¡“Wî›6ôÆÎ§ëÞn½röçÜèÎZ¼ùÌÏ« z½yÌîÅgO¿`@;pygame-1.9.1release/examples/data/midikeys.png0000644000175000017500000004632211127767131021333 0ustar vincentvincent‰PNG  IHDRH 6L© IDATxœíyŒ×}ç¿Ý3U==Ýs°)^â”(™"•èÈ*¦I'ÚH€%‡‘£udPÈ:V²PvA`W–7ñP€UâØ‘² X@ÀÉ&@̵¡¬mH+Il#☖lÙR8“X¤MqFâaɹz¦z¦kÿ˜~=¯k^Uõ^½ß¯»>€ 9k_½ãwÿ2‡®d³ÙÅl6 ™L&ð}Ã×TŸËW«ÕÁo~ó›4ò®w½keëÖ­ Æ*ÆÖn\â¿l6‹l6‹þþ~ôõõazzzð{ßûžÖq>ÿü_ù7ß|J¥Ñú×J¥"6/¼ð lÚ4‚+W®áàÁ;ë_§2Î7Þø7LM½ضí:\¸ð’ãÖæÒux^¦Þû?þ㉦ß;v쉿~ìØó×gËqž? ovò¨ãÇŽ=Q¶µ>ƒ´™Ïƒï=òúŒÃ /|GŽ<’iÿ“kÔæó!EƒÃªóò˯Ö÷^Èq>91ñâ/¡Ã÷®!×eÛÿ( <ÏóÛÿT{„ò$”¦^Åuµê…=çUl¡cŠÅA[zgØ_HbÊÂRï„ù}Ï«ØzÿoÛø£Àš Ü!çÂ>ÛÒ\î‚Åù$Ä´Æg…Þï–žj¿‡dÀMžsfçHPø$@ès)Å*¦×~S²¾ï³Ð\×ý Ù›Ôë RŠ>8)›óó‹¶þthá+ ayxxƒñìÝÆÿh|v!ä8]×±±Nw!äåfq/]oëB— ² ÀIMÏRY‘SDL¾÷i§ >_'ßoöíÛ·$9ŽVèRàwi|– k}HN"Áõ9<<õWM¾«–h÷ qP:L+HfÊcœkøœòXë¤P‡G±8¨m> …|˜'yiÄõ qA„ê Ä{çâA:à ?L ]‚ˆéùŒ&Ñõ)Ëu!IÔÓ%ð¼ ²™L†‹’ Mëí8„ö"ruå°š×ÊQH‹2IÿkŠGH¬åö„xïçÀCH$ëád ÉùT„Øq t.ŸELŽSg’I1]S1öž•\>í$“ ‡çy±Ÿ¡(Ð+l3ܼ”á6—”ΤPX”I v B“ÛMÓN.­.È ôÓÓçƒ_âP”…‹žÓ8I®Ï%öªØéxHž˜¸Uìä$Ñ)›ÍVuŒ#”½Ür,Ó•‹¤åžõb-WªKá À›”¹XÿuV4ùÞ{m>³óÉa “[;#E ?ˆ ¨*ÐP ±ãT¤B+ûá´E®vR(Ч ê:‚ä¥7䆋ï8<ÆÉe>CBrí7AW¬¿I¡;² "ަ=-ó.•>[az­ëZŸ&«r1&:NnUìe¾M¡#Ä@ƒ‚´´´»ðW¸L ¬lÑ)€*ÂUZAòÒH¸/ŠNB "•Š5%> $ºö´|W!å´|¶^¸xL{f:ÊEiSa•KñÓô¢ç°cŠÅAc ’öçF ±“CÿÞ# CdÅÂÂZˆ.ÅS'!/bëXW´ÂÄÔÛŽPóiÑÐÀEèE—†€êM¿wåž#ÏAÂE¸x[ÎgÈ9#Q ²ƒ^m\ÞiìƒY®³ò®æçõ)2eÄ„g&vØžJIêuâæv™Æ¢å»c,{B:CC^œ\.$.ã´FÈ‹.”À$Ö§à ÁÎ2-×>¡>H‘Ÿ­X»›ê~V¯cºº&—;„Kÿ++¸®ƒ¬ïûZËgKâ´2?Mû ŽE.ÒP.wÜè²k¡èAJ …µ‹3„ L¶ª•BÉ Ä%tM§§Ë¤ lq>Ÿ³õ‡ Ñròëô ™,ÊÂEPn‰IƒHÒ¤”Ä0ÕI»†T,c3è=êëëÃЯξ:áPüàUCþ„%”KùW€PêÖùÞC Ê‘B@-x¶Mæžé\SÖ<L{µÃd™o .­K„úÝé쇓zRE®-‘CìZy‰¨5ŸmQÅÎòÈìÁ!t XW:({ºD’%eŽËÅÙÕ—†…õi̓EL{8¹"-ßUÈ¢,&éÅœ.Ó¦Š\H—Ä“tÅ~'„•ù4bG1.©i6¸T±³hQîËž£´¨€^B]ðb>-¬Ok¤Š1‡÷ÎÉÃi’–ïŠP¹g.‚NL+M¹;·þÓÃ%§‹Ëúäp6ç3v‘Ù;ü5Ò»u¸x¸„Z$RŽG²eU åU„å;¶þ0ã9kE*зgÈ;“ÏæâñàÒÀÚä{ïŠPÕ”ÐX™OQÅN›’$>ö}¿/î3M +HµÿH…Ú€²g&¥#¬Æ!e²z…7$Òo!Ä.TÎŒNÏ¡ÉP+1N óÉ%i›K(`ªpê§É\)Š1—wc.sÀeœV(‘ÕY’[ò&Uu=SÁÜ#áAÊfÙôÉíY¸xº,éÓ¡ÊIˆŒBÉ eQýĨtz“HÖçTœ%a¬)&‹s„$ò³·oßü—†¶&=Æ-çsbâMmÏŠ >¥ ð¼Šþ†®Ôóä»l6Ks  À%‰Ã89æ Q.z‘$ —ðˆP‚Î}d2E(rÅbâM¼¹„ZY@ U3‹ü®ÎŸ¿ü—P+k$B9HœŠsp€ÓXéפµQ¬ôŸöÐ5Ïób)3M¼H=b—zfôÁÑÚMÝã‘ «x¨KârlÍjÒƒdq/¥IÛmŠ1¸¼k„TŒMtíÑ)ðQŒSÖÞ•®rù㺎~`¬HCle& ±[‡‹Po©¨@(,X»e"ôÔËR'E¡~)Ô/öåõ)C½Ú^—*œ\&.!L‘Ç©0ˆp)~`m>C*ÆŠ4Œ!mÌ «Ebì3bã ¯ëëëCÆ&Ç¡a(‡þB\°<‡½(|™$Ô8E•EꊇN±IO7…Ó\„/’¹( ƒˆÉÁœ°Âdk!‹„à2N+áÏZû ÉJ¥êprN”BI22NÞ‹ý[ºËï;RŽGúÞ›ÂåÒx.Ì[Ê= Ê" 7ÔN‹T<†Ëå2N@_§³)¸þà²ß­‘Õ™/$çùè&î…Ù¤Š9OWÒP·Ô¦Š\[BrB™›Ÿ_02˜p¹8#yf¨—ù¶ÄÒFÆŸþ-:!9Î……rðK\N.¡€&áR¤äÚgŒ…³X,èm+ýgBñÐR¤A(Gýýý˜››3âAâbÇ¥H‡qrxß–pÞÔRk•U,z942ˆæÌÙ³çúÞMœ]Ggˆ—sɤA„‹â‘Ò›XQ8gf®Æ ±“•£À×´âžçEVfš…Ø•J%#¤4Ä®·Hç°-càSF9÷ÏL(ºô\ÒvÁŸ=ûö]Ïj‡\”^´Ðsñt™D§'…AÄ0]y'ëÂu}!v2ÚÚź®«ÕƒÔëUì¸ÀA°³®&ÃÅBÏåÒèJ,zb­“ §µÏ!…Ó|¦èƒ‹bÌeœi®T´j’¢=tm~~>-óBC%…sÊÆMYÇ¢¡!”°æ YEç89”{Öý,“˜'—9àÒ‰Ë|©Ç¸)Úú òŒä é*ÒÉdê9Hi£XúE8Œ³T`-‰ƒ5uÌöz‹ž.Î4ܤ7.Šqb§Ó÷—ù´Ò€5|=Hª" &SǺ<©Â™ÒÏ«èo›Íf”ùŽZ¤AU !-ó-Wµ¢ãÃ!‰B‰£^TÀ"\ÆI · Ä§9Hz×”ÉõÉEIä2Ÿ½8NÓžX9rœNØ ±ÓÙ(VVBtô ù~8}IUæ»—Cì¸(¹õæ–ôCìD™ï´RS"]ð\BÂ,¬Ñˆž®Ä%.ë3…Ï»âb7 =ž™)ô¦’Í•à‘ƒd íU섇†ÍÊ|Ÿ9sÆòÈìÁÅRËA‘Âå0@¥÷ΩHÏL¤q¦žCö˜´ÐsÉAÒ¹¦¸ŒÓä{×5Î4×t Ng‡$k‘ؤ ç¨b§=t-n;U™ïÍ›7÷lˆ]šƒÔ5„º8×ûÌ$ªxrº8Ÿ‹òK 7Þ ÍÂÂ"ú X-zŒ¹5\ÆÉ…ï~¾. ½iÏ A™ ½èá4ÉA/%ýG=¯σ¤*Ð`*Ä®X,†Vf‚zZ0iëÖ­=b' .Ø (“rø_uA™v.ŠEÞå—ff®êG;B)Æ"´’ºɢǘ‹g†Ã>âji¿wˆ®÷nº,u/’æ %8Îj5¶¨}ŸŽq„!r™o•ƒ(à¡!§x¨r¨…& ÕòÙÍ6’åf¬-±ìÝŠ”ƒÄI©K˜HEžO.!‹ãQ±Ëx.¡kº0í1æ0ÀÚšÒá™áäç—¢&Ilœ\ë¡iíƒ$¼3Ôf9H½\Ån=Ô*q‹rK8¾ËÊa Š Œ‡…þ"®O c“ûˆÃ»øv:áòoæP¤A<‹\Æi’ÄÖ~L’½¤¸hRF[»”µÌ·@Uæ{ff†œ§+i¨{„…žrˆe¸$ëw5Åâ`Ò2Ò¥Am¿7#a±é°^ ±ø?HC­ô5 5íÙæ²8½÷Dˆ©X©¶çºntI³S($Ôƒ´ŽP<æç-¤5ÂBO9ÄÎ2éaÜ{DD¨ç Y$è×ÐUî™ é{×gH"ÃúL=Æ4x/"2?¿ Çƒ¤P‚HT’læ8…ˆó¹¼ìÕ¹„ãØ |Bpñxp°|sªbg]ý…L{à›®Ï“pXûœH¬|öððPÜG$^æ²¾ïGÖfš)G†Š4Dþ]yœ‚¾¾>c!v”+® Dî5¸V;±H¤‹ÓBÑ .V5E/"7ŠÍåܺ"åø ™‹D|ï¾ßUB6—µ¯Ó;eÒÓÅ¥—¢@4Bî—µnNÆ@U+ ãô<ÙL&³ç!ª¤¾¾>9H±~_µòÞ¢9zä– ¦ÌÕ\±„#ÇqÈ L–ó£"Zèã…„³,ê$bN¢²"—€)òËdõÈ™†‹À¤³Nb§×ƒd!v)©’¸˜!vºöQ(b5Š•Q(HÚoÞùùøž¡‰ÿvìØK9숆nŽ*•JýkÔrf8æGyž—ô|r#‘pèZä;™(¤Š1'%‡‹Pc%ÇãüùÐáèdç3Á0n.¹=M!fÓå•$klírâÌ»’ïû±½=åȈ)ʘTø¾_gZÅŽ^(K'±ªÔ^›åRéV‘¹¹Ð‹®˜d>b4Š]÷GQäB¾÷Ðg QƒM\¸ôAjúì¡¡îÉ ü[LŸK:°š>[š*Îy“Š\šƒÄ›8ëØŽ)“ÉD2wÊž˜ ©¿¿_÷Xµ…°d³Yø¾ß÷qáÂZ® ,,,’²ò6sÅÆìR‘ç3ŠÂÙÅSÔêpue€š/C½ø*äwqqIÛ`º+ž„‚ò¸©qè`zú|b ú°š¤i²þöí[¢<Ë$g ?¿×à0ŸÖB@M•ùÖñØtä Á¥Vâ/^Ô14–AÉqúë‡/eADìÊåe‹#!G¤°ß÷Y”¥¶@ÔÜž¤«Øq)ŸiœrÈb>ŸÓ7šæpYŸ&Ù =C <Ÿ±é$hg‹RZiïŠK¹|“LØ›àß‹*sœ„%E.vˆ]É$ß÷¥;î¸#ö3¹",µrU«ÁÁkãi‡Æ–ÀÄ…Ha™L&Ö¥!ÔŠlˆ]àßi>.v2†ˆ|\OlÏ!YAYBKNWB˜ÞGJGÈ÷Nz¿'ˆ®°$æS‡Êe™."ÂIùââAJR‘PËAŠûE#e¾‹Åø!=Áf±çÏ'æj'‡ðÈX®ÀÖŒ –jýš¸“pÞ©0Î ;wnü»bɹ„Š4ľ¢xB*ơ߻˜Ï¸åÈS"¡K¸%½ß¤‚²>O§¬\ª,š&qŃ‘s€–}´ßhžçi{¦ª/RC1^¼~Њ~=qsfR‘C˜¢Á¢ÌÁ²D§,Ð'¹ñ®¬'äAŠ„ëºIžK¦-Ê:×¾É}Ôt"$뛄ËYÂ¥¨ÀAèó ™Vt ô\ÖIv"Y'ÃÉZ‘!vŽã˜0¡j{fµZíùD¡pÌÍÍ“*Ÿ=5õNÃçóó‹–FÒÝÄ-ÎÑMUìD** +ð”C@å’ô x€Èóé û‡b†„­ÁE‘‹EqtyfLÏ'¸œ%‰å ÍÎÆ2°$­ÈÕ‰åAjxá;…nÛ¶m¶‡b¸¹(ºÛ(BìâZ¾Sš“À|’Zc:QU…£\ü@/åPÀ„ûJ–<3–Ÿ¥BW9]²!L1…5[pºM¢srñ›&Å#f£XÀR( ’‰;¹2™L¦^â»Z­j_¨öivyqlÆJº¤!‹5I w‡t5HUÎaï=´å[¬K9d1LWtL¦ÞDg’éj{:H¢¹.¸DL’XñƒZ˨ëCW5ÈÐÄ*ÒÐ,ÉP»Ø·¹°DŠÿW«Õž• E(K±X¨Çú*Ÿ½A8²ÜŒµëH¸ê@XHŒSöWehH dèœ.]ý…Bö }!ªBjPäPc’hRÅ.¤×ÅtþX¬³$Á2ß:«Ø™èux9嚦$>X©bı“•#ñŸèd"ÄÎuÝXJ—PŠ„©Z­âÂ… ZÆÆ™åeT™ïÀåU@å›^÷xÄAÌ§ÜØ4¡P«®Ä‚¢ ÄY”÷Q”ý¡HCÄP@·›Ö —Üž¦à¹Ü†$óÇ(3 =ŠGED”}BD¸¼÷qððÈu µó#ê½em>M5Š5QÅ.ÔÏ«„>ß÷Q©¬ 4[·n=.î$ÊÒ–`‘A&RÅ$¸"úùù…$Ë(“ZcAtä$$¼>#ˆÛ 8¤ ‡Iý!¬ÍçsŸ¯³š™IA™“ǃºÆiºˆHÓg'Uµ2aL+œ\ªêRàÛR»cã„ØYA[¤€’¤]BБƒ$‡Ø­¬¬ÀïaI[x¨õªÅªÖYçºbK(b>ûûû)–w·‚¡ß÷÷’EÊoXYY‰eå ©L†ÎA’Î¥£a~OLøïQ¤©ÀÁˆZè×PzfˆÑt>CzÊkäFÛÂe}&6Θ$k §)’ŽÇ6 ChøÁ~û™Ü± Ø…BÂD!‘rQ*•JÒ9gh,†ØEº4âg ©L†¶|‹ù¤~.u);¡G 7m¡çûÆ»!K¢'QìD—ǃ‹—Ç$‰íјQö3„ÆIP‡œªšY"$ës±ª…bÓ¦@.çÖCÂYä¤H”.4YX‘•¤ÕÕU\wÝuGFKaa#9jýšõðˆ%(G°‘M° $HG*›.+œ „€BDÅxfæj’Š\hO‚ØïΉ¢äÈC§nZX¸OõE®`m "P$‰|<žÓžÃi{5<‡…Ç8v‚‡Â™˜§KÆó*W±k%D‰ï‰êp†Bìb!+Gâ¿‹/Ú–5„`'çNPDÄ8eËwTµÒI¤Ãxii]ˆOà½s*óIñXZZŽå‘ IdADR@H"r—––w‰¯%4Ÿ\,ôœ„/’Jj›.~ ËBor>OB_nés^W™o.÷‘It)œIp&é?+)¨0õõõÕË|÷õioƒ±ÝR²‚´²²‚R©¤c\,Š‡Üž ”<”ÜèÀÀú»Nà½wmãHUè•+³FҮ뎷ÿ©æD(Î ¡p&úkz}öZHé¼Ö8ãªkM•ÄžCÓûHWN—•\>bèj ‰+r®ëÄËAÖCìÔ½G†ØÈn9É÷}¬®®¢Z­âÒ¥K=/iËýp("  õ›Ôƒ¹¼{!a¤&™Í›Gß óóB Ïf3u^V>© yŒ“,ÎÚR« ùM@á4mQÖ©Ôp@Ið ±0ܾóNBß{7½t ô\<Æ)–NÏ« M½„rTSH*A’ßÃ’6õÜ#ÂT¹¡VæÛò\F@åE ý¯¨pùòÕP#U¨*OlD¶Ô:ŽSŸÏRiDÛ€ZÀŃd.–ïXȤD]!a&ÑåIˆåî]û(‰\).t½A$*"i5Ì/5Ó}dOR__ŸöSgyy9´ÒÕª@Cíÿ$¹$P5 ¥ˆ@Ëu }*ÐGGRæ’ö†¾4l(ž¾ï‡º8 …µœYáLÀãùÝ%\Ö?´gFì÷\Î=ab@Mà”´*r|Ðið(ó­+YŸKõBNûÝ4B쬅j«¦ ¼G¦ 4är¹XJ—ªÔ÷åË—u "%nÃPÓˆ¤òRi´®ÈQuüqðÊ9N½šY’ï=’'!é¾RQXXXÛGrÈb!vSQ÷ÀÀ@î\ûŸÒFdKíÜÜüañqEDL‰¸ÔTWˆ IDATô™Ù }ÉÐ\”$ÑIWu8Óž.k?ψ¤È‘ðI—¶‘* Q‘›Ã ÒêêjO‡Ø d‹2µÐ5`]HN8g&–úP’è-x¹\¡ï\ £ˆ´6wµú9˜,*  .–oÝÏR¡,óNE/L¢-$ÌpÖ‚.Å8‰3ƒÇƒ œö‘2ߺV­Ve…)TØ^',/ÇŠƒ!v«««Õ4:¾È$ʹ²Jyœ%€ªB‚Åa¬CI¢*`&“‰$ÐÇ-Ò’CÐPF9¡Z.9 &9.ãä‚¶9ð}ßô|rð é”Ó2ßëpQ8í„Øù¾¯Å4aº÷Q.—‹4NÙI$÷@ZYYAµZíù$ÙƒD¹<±\ö—Z Ë¡`¡.¤M›ÖÞåÅ„ú ± ¬SYÕW(‰ªkas¥Ä8s97VƒàD*"R©¬Ô¹ÔÑ߀iÁ®§PjwIL+\ªÃézv×¶èRtVYì×u:oÛá¡©8¤N`þÑêê*VVV033c{hÖÉå•J¥.ˆlÚ4lm<íèïïOR çD¨ƒ¾RÙ¨Ì%Ô©+Q)Ç U] …jœ”cÇéOº˜L66åR%L[Øfž$QÅN—bl..è(Îašƒ°ðÞµ†Ø +Ÿ)‹Ìòò²–" rˆÝÈÈHÏ›&åF±‚¬ÈQ ±ãPœ!ˆœÓEÙs˜4Qϯ ‡üÞ ´¥V¥È%`åO:Ü4¦z¹(¦sºt*‰¦CÂtvcžÓðœ$à{ÆÆÃi˜ièÉ9L+Å$´)H™LÙlÕj•¬€ *õÝ«ˆd}¹œ.Åpʇå1FÊA’¡ì9Lš°g—ðÄ.--³ðBÈ¡k "7Ší²;mBãÖ­›ß£ëYMÐÕ±žKN¦|Ðàóu†®q)ÊÂA‘3®òî]Iì*vru8!\×”7Z,é=¨U*\¹rEרØ!e¹+EAD ”=]¢dº%"YS‡†ŠuÅ8ª€,”‡(Cƒ Å*‹*%žâ8¥ÒèqñqBë“…Ð}ñâåo|¼Î\“è@¹ä̘D—GÎth% Ç“À©¬¿itDL2 î}DñS^ˆ8}‚e¾…’4<Ü»–s‘´M¹ø°ž3ãyžå‘%öaLÑ“À¡ÀË,-èC L¢ÿ•¬x$ªI`’ 7 Í'‡ÉqšÌoÒ —ùÒÜÝè§éZ.¤“Ð×÷Ì$|Ê|7ó2M-tÍ„¤]f”Ð8UÒÐÐÖrBÕ¿efæšµñ´Cöx¤4õ0N²Î!ð¹4B!9 «Ê¢ití£Ðd}ß_ò‹ÂS.—177‡jµŠÙÙYÌÎÎâÍ7ßÔ=ÎØÈ!vR£X2Šœ-(?‘û¢Pót™n{ðà-¿æY*ÏaAùÞ{ãÀ›Cÿuff®…:T††­Œ ÅØuÝãm~´%÷Þ{;wnïôÇCSUßêG§Àã ŽL̓4ÐÜGb¿ÏÍÍZt£î£}ûnľ}7âÕW_Çìì¼¶1êpU¹JjT …|«ox¬?КPB£Øïì+ÝLh/|×]·€qáb¡ŸðKžc5dQœóîwÓÅNŠî0ø7tÀi}Þb{pÞ¹ë:È–ËåH$`cøšø¹\޶§"—ËŇÞ#bW,{6ÄN(rh5ÅX±“û¢ô*BpŠcÉz¹èEÜ÷¾oߌ‹K…¬P¨¼‡ U …ªøAÜ»»îº­Ý{]¤A̧R›$«Z‰}ðØ™¶N·MÚãjA^‚DŽ\‡û=¥÷Ö§i¬õÖꟙ™ÁààÆRµqˆ£t5ãÚµkð<óóÑ,–›6mª?gppÕjçÎëY’PCI`’ç³¶ßÇ}ß7)ÌhñF yÓó)ú·„š ùü†‘ÒB'ë+Îù1˜UŒ#…ØÉãœÇôôù©^N¯H$ª#›}&¢È©è_YY°É÷ýØ“U ž+—Ëû4Œ­r¹|kVèêxžïûŸ«T*F²Ì“ö(DAÊ2Cì8`±„2|ßÂ$cªÌ·ì¼Û÷ýÍ>gäé%Ô…¡AV8My8Eˆ%€E„§ð ÍÌ\}¬T`®ØÉ¾}7Šÿ÷GUärç`8ôM^ŸÕjõ9ƒJ[ÈïûdÃw¤ù¼=ì¹.eÓ[ætµCšÏU˜=;cåöHã|Ã÷}²UÑÄ8÷í»ñß÷MîwN9HÔó¹v¿úտœÌx Çyø^¥Rùö¶mÛ*›6mzfrrrzÿþý¶ÀÏ=ùä'úÄ'~ëûðõ¯ÿÓ|ûîù/8pÿÒäädý4ºÖ‚áÉÉÉA×uÿÖó¼i×uwú¾?•Je:ŸÏ¿¼gÏžãb>åñöõeyf‚\¼xùÝ'ÇùçL&3Žãìôö±'ÿ˜ïÅÅ7ÿ{>ï~À?ø„ޱNL¼øûnúú×ÿiKíKïùÀ~ýýÁ|ꡟþé}»>ð{¿vàÀýKò¸ 6ÖÓÓÓ»———ú¾?Ößß¿Sü[‡‡‡?899ùÊ·¾uróÝwdz•~õ«Ëäää Bìwy­Šÿûþ[7ÉûM|}rrò“Ð7ŸŸp&³ûÅ'ŸüäC¿ökÿ!ûúëÿ:ûØ“çj?¶srròäþýû¢QøÝ999Ùç8Îgkÿ¶i¬y#ÇLMNNŽÐa,¾irròǨÍg>Ÿ²ÙìÔÂÂÂÛŽïß¿ÿ¬<¶Ú<¬{çôôôá¹¹¹÷æóù‡j¿÷×uß#~öâÅË·nݼñ/‡àâÅËÿùÍ7ß|kxxøÌìììsŽã¼g``ààÜÜÜŸæóù‡Êåòüð‡?´ãoþæË¿ŠµÂ(‡öïßÿ˜¼Ξ={teeåhm.Ç …ÂC 's¹œæÌ™±ýèÜõ7Þ¯%â~tnÇäääÇùçþþþÕjõËËËËÂJ8†Ú|®¬,ýêÙ³Ónºéaù?û³·=ôÊ+¯ebâÅLf÷é¯}í/=ðÀ=—jßþ4­Ï(ˆ½>99yÀaÇq>›Éd¦<Ï˘ÊçóU«Õ/Ÿ>}úŽýÞ•\'Ö¦ïÙ³g–Ëåݹ\Î÷}Ìó¼iññäää´Ž÷Ï« ?Ñ¿˜B޹¹ù£B±­x´Š–Cn¨•ù6]Å®/núøÇÅÇ?þ¨ø>`iÉ¿å–_8'NY5Í®]×zôÑ€3gÎöî݃3gÎâôé³ïÇÓOêSÏ?ÿGŸ{îEk¡”Áù|à{‚ß|ï{ÿrüSŸú£úÏšÈéjÆk¯ú•Gý^z雸ï¾ß0§§OŸÅ–-¥£7Þ¸kúî»?5õÌ3qô®»Œ ÏL6›M¬ïÙÛo_{ôѕǬ¯;î¸õð‡?üÁéï~÷‡ó7ÿ®»®TÿÝ$Î|~`ì¾ûî~Lã1ÎÓ§ÏÀ{'&^¼ÿ _øÛ‡?ûÙgQ,"ŸØõÄOÝqÇ­Gk+•FðÀ÷üIàñOkî›@ãºôý·ä¿ù'/Î--yÿrÛmï;qûí0224ö¹ÏýϧwîÜŽ÷¿ÿ׎¿ýö äÄÚÙ#~qïÞ=7ê8î¹çð¡GýÈ¡gŸýßxôÑX›ËÚú|ïììÞ÷¾Ÿåî»?µë™gþb¬TÛ²eý×:U( Åš’qXßoùàûoÕ¿°{÷ süÚ… ?¹nûöwâÁïÃÐP¿ó;ÿõéßýÝÏŒÝrËî/}ç;ßÇ/ÿò}õ£àÌ™³xíµS¸óÎ[c ð+_yþWî»ïî ϰgïÞÝxöÙ¿>üÐCïûèÝw¿çGýø»®3õàƒ÷ Ç¿ô¥?í{å•ïýÝß½ø¥FGGpæÌÙ={÷îù9ùYßúÖI|èCGbóí·/ŒÝsÏ!q¾< vmz즛öÀ÷ñòÜܵÇÿüÏ?sô³Ÿ}öèää›pÝÌÔm·íŸú£?úÔñƒï{ðÁßx|llÇØÌÌUìÝ»Gì­Ÿg†|FDåºëJ‡öîÝ}è¦›Öæóôé³½é¦=Ø»w^zé›pôñÇ㽕ÊÊc¿÷{ ×u°eËðÓÇŽýÆ®÷½ïçÅ¿o¬Tyh\;¶yä‘=U­VÇžyæ÷Ÿþô§ÿìð¿þëé—Å{Ö÷á™3g? wÞùSÆÇ¤ ±ó}ïcwß}Ï=÷…Ç?ýé?;zîÜÛýð‡?»ë®Û•Ïøîwß@Ò ’ë:èÙ*n¦xþù¿òo¾ùˆ0@O¼ðÂ7p×]·áÕW_Ç7O Çã|á…o4|~ûíûñƒLâöÛŒ äê Ò /|Û·oÁùó—ÀὫæ°;Ö«Wç0>þ] fU_¿õÖw¡X,ÔŽâ|Š}Dm}ÖöQ}>÷îÝ3gÞjØïÆ)ûhëÖÍé~×D³õIaœÁõ €Å|ªÎÏM›†…)‡¤ùïý¶ÛöÏçŽ4Æ)ûhp03gÞjx÷ÔÆY*bfæjº>cŽMFŒSžSŠç|Öö@Rì BYªÕjÝ ¾¸¸ÔôçSšÃ!ç,ˆÜØÔ¶GnttH|xNþ:‡yûHîÓf;—OÒ ªZIå2’‘sº,¥«¨…R“àêÕ9ña’¥Üµ j ·\¾Fêç§8—òyz{\FœKr#xBó €GÑ-Ê´ªbW*Æj\ny¼©‚Ô£AÄuÝsm~41T‰ƒÀ$[•¸ ÷¿²†2 Öë3—[WŠ®\™µ5 ¡ª-÷6µJN®ëÔ;Jë3'IÌçÌÌÕÇÄ×lÂâôq³U•ûÈ--Ùè¥ó³ÞœJ(rKKËõ¸$Ûç’@>ï9TÓå´ßUFEÛ §*ÄNŒ³\^?‹lòxS©Ç‘-L¶h§½ l“3â`¢äñ˜šzG|˜l±D‘J´@eÅÃvØ… Õo[pTä…*[èmù'Í•+×33WE~Œu¼t~Ö•6!ÔËçü¦MÃI«)B• "ýýýÚ—ë†C$ƒ@jçPÇöùùÖ[ooøšXŸžçÕï|ÛŠ\×uR©WQ•ù¦¶@uTì¨Óó<ÛCèq0Œ ×/$BóIÖKØ •uÑvlº$€Ö…8•'–ŠI(®ëÖçÓ÷ýº÷‹ž`çZIç¨ÎOÛÓìì\û"Š « "Áðp=Dùpð{rQBç<€5ÅCœK+++õ±S3ÜÈy°\ q¬+òú¤Hª õ8ssóõƒÉöÅ©BXD(ox±Ù9¸âÅ…477_žm¿wé‚ï l+*”rèšÒ ˜¨…q2ˆ¨°íñà¼ßÅú”xÛV § h{œAŠÅ‚ÒPk;TÀq¿¯çĮٶillGÓïÉ9ðÔÖ§çUR©×*ÖËÐÚÞH*( v‚uw1W¼Ò@r ›íàòÎ)Ʀ „ 2?¿PßïCCÅúZ r.qô ‰³I60Ù6ˆpF¬O94ȶ/)œõwÌ!·Çó<ɳ½’XûNá¸ßÅ|^w]‰L„ˆZGÕvÂö8ƒ¤!v)˜››¯'ïÚ>è[±¸X®W<¢rÁ‹jLœPœ{fÛ¢,Y@Éz ›¡òÚ>èU;ÊÞM!ˆ‹9¹¼îA²=ŸA8Y”…À$+œ¶÷;gÄú”‹²ØžÏV¤k×fÉæxÈF›ZkôÆÉê‘ACU¤ R#{(ôª$cÛãHå©9B1†žâ’§TF¹U<åPU@RKÅ¢Ü-PDÚJ¼@5FŠó)<]r®)5仑‘a2!‹A8DT7T<ð2ª}DE®“I¤EëOí`jµ ‰ãº´´|´ÍÚ`C’1u¤ƒžL·$x¹:œ*†žŠg›c;œsh›fë“C¸ªªeÊå%²ã”ïM¹95‡u) JÝŠ}ùR©G‚Èâb™tÙ_åN!vªØôT ÜÏÁ¶ÅNå‘[÷Ä:„“b½ú_,ÈyŒ9æ$¨Ê(§DGDä}De}ʈýžÏËÝ• *žÚ¹ÄÁ³)àPÔJF.CO¥8‡ÀuÝTAêuäÃ}fæšÅ‘¨üµk³dcj9z(…„IPSGd22ÐV 'Ñ÷ ±Ì·|qRÛïܱ­ÀsF(¹zHåõ)7¦F³ýNŽc‘Û#ߢ¦pëûH­¤¶<ÏK¤^E,P¹ŠeK˜ëºõDqœœ±Ý·G‚]ˆXŸ/xqqÊŨ„®©Ê|ËIðTzŽ“äIH“à5 …(³hjM©ApÙ°(ßïTÖ§|.qAxÊå¥zQ+*ó©BÞGTä:¹/_ª õ8ÔC/Ä…$[è©Y8…ÜdA™k›]™o,ÐS[ŸXXj=Ï«ïw¹Ï • ^L=Æ2-ÊÜ×'e¸”Ï–ïw*È‚27ä2ô;ÙKÔƒÔÈÊ¥Hƒ|!Q³4pBÕè@Ï"nZ…óMe}ª=ÆT<32ª9*çÇý.‹²PQ89"ÖçÂÂ" o·\>›2Dï#v¨ "ž.ŠåÈe>Uz±@e’íUC1‘ÄI1Ù”#P©,5i«W+äŽõQi°½ß[!÷é¢'‹2e…“#âüÌf³„Úc4/ë/çxPSŒeO¬|¿ÛžÏ œ<Æ9¢2Ùl–lñ­Ôƒ”Bê`RUß¡ArH5K§”b‡õáá¢ø¬»½?ùÉ i‹2EÅX ƒpÜïrN‚m¾Õúä%g«óS®bGEñPAÑÀÄynÛ¶…lh¥Ìòòz¸2•÷~õêÚ~J‹4ô0"VU°Ý0TUÅNÕà’Š%Œc'EZ)Æ\ ÔEµ8Cåâ䌜“Ò;È9Ô ”"Y8# vå2™Þ†-¡ØÈXVŒS©Ç‘;XÛnÚªŠ|€Rñ u ¶PŽ¡ ­°=Ÿ­èëË’õ—&ŠÕ8V­P Yì^.—Oy¿S¬§*v"{Œ©ÀÙ*ŸŸ¶×§J®“Êå“SŒåªª©‚ÔãPï¸,/x*‰sãHê}{¸ UaªÍöúT]HŠý1T“l¸¡fábGQá䌲h{¿·*Ò@±Q¬œã¡‚JQ9ÔŠ•Ê éû]•kj[‘Rb—Ò ˆØ>èU–En.cêHUÂÈTálQëSîƒDå‚W10#Û˜O†bU+Îe¾)5O=ÆziÕC±³=NA;Ã"5ƒ‡œò ƒƒùúùÉÅ b[¤ERHVßj•)‡Q@9†ÜPìãÁ9Iì£\nÝjû‚o¥pþä'3äBnTeŠý[ÚY¾)#—õ· çý.X]­²=A+±bGmQo!äŽUj¯][7‚P¾(G0¥¤FÊóó db@¹Y9W±£óÍŠ g+(&ŪÈçÈ…qö ]w]‰E_.P*—ßJ¥Üp¹X,Ô¿622L¦È@ÎEá†lì¶-×uj±m W‘*H=N¡0H:VUVaÒ ¥\Î!v*l_H­ß;Õqº®ƒry‰Œ…^ÀÕƒäºNCPÛeÎeý\ª®]»6KÆsØŠk×fÉyFG›{æR:§Õý^©¬ÛG"÷, ±K!Õ¼r½|Û|·aÛrù߄€R•°VP*GÞ Ê9HÜð¼ ©¾gÝ—"7” aUu8ŠPÎcù½Û¾ß[!詌3-ÒRGîNeªCD¨X830##(s ­ ŒQ·½:U8©…Z AÄó* ë“Ú89"—¥N‰GÍ#GNWAÙ "+²‰JQÎc.NJ¹‘‚´HCJry‰œåF…h›¢¹* í´™@Ï%9Öó* 9]¶ç³•Â)'ÅÚ®f&C²JeœÁ¢,\Ö'R¤fë“Ë|z^¥Añ°­ÀsóÀ‹ý.Cñ\âì1æB6›%牕×gª õ8Bì\×!ÕøLÀÙóA©zL³yärл®ƒåe¯.€RYŸ*(†^¨býe”Ê8B‘ã²>ÆHÛ |38ͧl`¢òM1Tu½:ܺAduµJÎÓűJ­ jç§L©4Zÿ˜Ê¹”†Ø¥ÔáKM©_“€›åNàºNƒ lÛÚ T«Uò†€fÈM0Ößu’UìT–o.p‰àB¥R©+¶ï£V†:¹J-ÄxeÅÃqúÉŸ*Ï6äEÛë³²¡Š"W/L$p By#q€Ë{÷¼JÃÅIÙÊÏ«`uu•EŽ¥PÀ ²gfiiù¨ø:µqr„C¤'Ç!We1ˆë:( õýNÅ“ ò/.–ÉŸbœÜ=H”ÉçêS‘CdÃwª €S¨ÀÜÜ<‹‹3Ÿ w€«ñpzï×]Wª÷ÇHÐøŒŒ¬[¿(Ï'ÅPUU(‹Üè0%>CCErýp8“ÏoÿSv æJQ)~ô̸®Óp~Rƒ£‰bhe×uäOŠ÷fª €‹'a­ÚÉ 9<€†ðªŠG0‰“Ë{@²Ï òBG3ˆæÌlŠ)†^¨’¡ûúúXätqè~'FÙ)”r8%6ìwYP¦Rü šîy,/¯ŸETö;×Z×uH†V"p¿¯µX!Wæ[&U @U âyär.EËbCž„ë:$«Øc¿¹¼w 1ÔŠÇÔDC×6ä ƒ6ÆÑÂR[( Â÷}rÊ2לC$sº XŸ(áyÒ‚°vo®®®’›cUÎEà W<¯Ò!B™Ri”Ü9/¯ÏTAêq¸TßJыܘÐ{g« ÍÏ/P U=üÅdý ÀDѨ“Ë9àº.]ºLî‰ï´2 IDAT½ƒ©‚\Ÿ”zйg*Cƒ,‡PIÖçÌÜ› »=±uR©‡©U‹ªNè ß°iËõÓ4>+++u‹2¡÷¾A ç¶m[ÈYÂar]§¡jT“\ÊúœåYÕªÖx—\²>˜îw×uàytúJI4ŒÉó* Õ_©¼÷ AÄu”J£õõI%Y?E;…EŠû¨Nª õ0žW¡K½AØt]§.0Q‰¥æŠë: $B+AÝ)Dú cÊå\r^:•À4<³Ù,¹÷Ìíñ¼ Éù䚃äy69rp]‡¤E{ Š$.ž®c×u03s•œRpœTBìD(µçUR©—q]§!™2D {À7ƒðON î„ZÃeŠësÃ|ÊU+©!Ö%Õ;® ƒT "• ΰh°¤P$jY”S´°¡Hƒãô“Ë5šz@êAJYË÷†XÕ|~€Ü8¹&mÀÂÂ"¹\0MÚv§á 'DÃ|Öö¹q‘Ú8mII04ˆ ‹˜™¹J1¿œw£ÇA¡0Hî>‚"¤vË–Í䯬ZY©TH˜T m¹@1â¹®P$éᤤ‡°eDjEî –n8ŽCµ ¹wÜ ‹*’=è… ÉÐ ÙbG®!vÍòî\©T“Ë ±!Ä ”PÏ« T%WM—«AÄó*$ÏyÖâÂÂ"¶lÙLγ-Ÿó©‚Ôø®C5ôâ£ò'®ëpê Mž……Eäóä.$0¸ÌUÔÞÙ†Š VDŠ‚²¸lØC±È g.]ºLÑ߀ã8˜™¹J"/(Î'WƒH¡0HòœoéøTAêaj–Šž„á½P$Ù·‡ëJÝRÏ Ï«`q±l{*(î펠XFYX”¹íªEnÀ4çhl\Nˆ†ù¬T*$CU¡«Õ*¹ùäºß+• æçÈÍ'ÊÑâ1Ò¤žÇuª–† É|D=],q‡ªE™ÜeÞ)žW¡8Ÿ {faaW¯ÎRg®ë`p0o{Máæéª5Š¥ÆÏ«P¼6ä ÑË“U…® ‘]ŸÜöûZN¬Cq> ßTû1ÊíR)…"bU/\¸ôÑf?œŽZ =EÈ ï*\×Áðp‘¢r·¡s9Rƒˆ>1=}ž¢7‘bžD[‡ì>ÚOÑBlAµ¬?WQ*RœOû=ÍAJ©CÅ¢\­úò§êåSl$7::t à%x (&Åre­<½*LAÇë:ä.Îjµ:4î#Š9 »w_?Åâ í¡„Âó*TxÒùͨT*èëë#qohS¥BSñÖ=3T= Åbå~/177On>UPl3#ßG©‚ÔãP˜²ÙŒüiƒ2ä8ɘڙ™k§~.x€¦ŠÀ{ç‚ë:$sf‚T*’¡€¥ÒÈI ±Ì÷À@ŽÜ|–ËËç`~ždAަ¸®CµÊ"Å0 ŽèëËRTî6ìŠ!vA<¯B2ǸTÀo¿-Bì,•Ϝһ`j˖ͶÇÐŒºÅsaaqjÛ¶-OÙŒŠRiä‹¶Ç‘)Šý1jPWSòùq*óðÄŽCšOÏ«Líܹ¢'a"ðùÔÐP‘œðœÏç~cÏ«Œƒ¦ñ¡a}rbdd˜Ü}„µ¹œ |Nnø"ÐÐzŠh_)–÷ûÐPÌù¸€ë“ù|î€ÔƒÔóìØ±•Œö®ØHõ žÏçN€n8ÉMÞ Ï«Í‹sh r-¹vmîhÎ'Ð8Ÿ'@sœ÷A².Öö;E¾ `œ¡Ç˜Ìù8çÏá~ïïïDæ3À¤}Ô×—%óÞŒKcª÷çb·ºZ%#רi}Ï3=žzzœÙÙù rABì6ÒŽÛ¨nø½P¸©³iÓÕ‹óøÌç²ôñãÖF °æóúë·Rì^0%,Ê·Þºï8hŽ +È©¯Ï¡¡UO ­OÇégalÊå\w¦‚)HóY./ƒæ{ß‹†ªû]ˆÝ7“¹C[ÝG }×O‹ƒ©‚dâ ð¯¡æõØ»w7Åp`m#ÕÇvË-¿@ÕÂt’`Çä½O:ô ™ùTxëï½PÈS]ŸðñÁ‘#˜K õ|ÞqÇû©zI`ÚºõNªûè>O‹O¸¬Ï}ûö’™Ï€À„#G©mh¨HUñÖÎO˜ºråÅCá‘«+™GŽ<òè*S’g†Ì|*8Îä~Ÿ–>ž‘÷XŸ»°¾>…B•©É ”/M¸ k‹t|ëÖ;ÉJb# qà c»jBç8Öç“ư5W,ø¼wRVZÑ4px¸ˆ»îºípí½OÏårdÖ§‚K 8Ÿ²zë­ï‚4Ÿâ2¢¸€õÊûè%éc.ë“Ô9/sà còZ¤,, Æœ dQ(œÁ{“ÌXÔïMJó`¯¤ÀS>—€µý>bû]¬Ïš\'¯OR÷fñÞûm¤ 9Úý\Nƒà¡™Ífð‹¿ø âÓíµÿËErcpæÈ‘GÎMO¿"’ 9¼wRÓèèüÞWjÿ?Ús)8bó @žÏwcmŒ'@pœ{yäÜÛo¿*+r÷;ŽyäÄ|‚rÈšŒ¼È(ÆÒú±KÂ+G}ÏËç'ÅùüU¬ïwrï]æÈ‘GÎ=;ÐÞGgÀqq.‘+I@ÞïdæU±ßÉŒ­ýýýã©I?”ÃOc]ÇZÅÓ°/D͸?“Ùý۵ϟFm>7o¾í8€‡!…¸Xä57£fQÈ= fï½6Ÿ»AÃr;à¿HïýhŒ«O£vØ×æóqÐ÷€û<[ûü8ÖßûSÞ ãü ¤÷žË¹ïEã|> ã| Àg2™ÝŸ€¡¡"•ùkÇÓµÿä÷NÁþ¬óŸ¯}.ßG”‘@ë>º?“Ùý¡ÚçòùytÞû€Ï v.íÙs(ƒõõ)ö;…q¾†µséópýõwí¡þÌ'Ï%²çüÀ@îáL›_H‰Àå˯ @½s¹¨§O„×2™Ý?£úÆå˯ï*•F`-tLpFúüLíÿ{¥¯Ë_ òÖâöUÈÏ€—2™Ý§Û ßë·:ýÙÿ~³¯ÿý§›³KÞ{«TTÏ_ÛðÞŸþ¯v9òÈ9êóù ßxPrùòë‡K¥‘;"ÛœŸ@½W­æVE«Ÿ‘Ÿ¥œÏ‹_Û µjòÞÛ¥Õ¹Óñ~“„ã¶(ÎÏvsÑî,jõ; ?ÛjœÔ×g³ýl—dÙ­Y/aÎùNÞ»jÌhòsª¯7Œ ëò©rœ©‚dâi.“Ù=l{ÝHúÞõrùòë' …5›Ï¦SJo®O½??ÙÍgŠ^ÒõÙ{¤!vf°ªÖ ¥õ.E é{× å°EŽó™¢—t}ê…B8PJJ3(ßïgÚÿHJXR’!._~}Ö¬‹-•Fl'÷Íøm´oHÑCúÞõR›Ï£Ž˜Ï×°&x>&4¥{I×§^¤ù|¬T¡P´á3`<Ÿ)z‘î÷§¬Ï9ŸGº>ñÿãwèLy³·IEND®B`‚pygame-1.9.1release/examples/data/liquid.bmp0000644000175000017500000002672610032475100020766 0ustar vincentvincentBMÖ-v(¬„`-  ,<-u_L°L¢r Hê“{ÂN¡í¢¬’ý¨” é þ߯“™Ñź×ËÅþþÛ™™™™™™™™™™™™™™™™™™™™™™wwwr""""""""""""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™—wwr""""""""""""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™—wwr""""""""""""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™—www""""""""""""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™www"""""""""""""""""""""""""""""""""""""""""""""""""" ™™™™™™™™™™™™™™™™™™™™™™™™™™™™wwwr""""""""""""""""""""""""""""""""""""""""""""""""" ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™wwwr""""""""""""""""""""""""""""""""""""""""""""""""" ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™wwwr""""""""""""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™—www""""""""""""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™—www""""""""""""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™—www"""""""""""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™—www""""""""""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™wwwr""""""""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™wwwr"""""""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™—wwr""""""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™—wwr"""""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™—wwr""""""""""""""""""""""""""""""""""""""""""™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™www"""""""""""""""""""""""""""""""""""""""""y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™www"""""""""""""""""""""""""""""""""""""""""w™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™"'y™™™™™™—www"""""""""""""""""""""""""""""""""""""""""w™™™™™™q™™™™™™™’)™™™™™™™™—y™™™™™™™wwwr""""""""""""""""""""""""""""""""""""""""'™™™™›DDDD™™™™™™™DDD™™™™™™™™”D@™™™™™™™™wwwr""""""""""""""""""""""""""""""""""""""""'y™™–DDDD™™™™™™™Dfd™™™™™™™™”fd@)™™™™™™™™wwwr""""""""""""""""""""""""""""""""""""""""'y™–Fffd™™™™™™™Ôfd™™™™™™™™ÔFfd@™™™™™™™™™—wwr"""""""""""""""""""""""""""""""""""""""""y–Fffd™™™™™™™”fd@9™™™™™™™™DffDy™™™™™™™™™—www"""""""""""""""""""""""""""""""""""""""""vFffd™™™™™™™”Ff@)™™™™™™™™”ffd@)™™™™™™™™™™—www""""""""""""""""""""""""""""""""""""""""&Fffd™™™™™™™™Ff@™™™™™™™™”fff@ ™™™™™™™wy™™™www""""""""""""""""""""""""""""""""""""""$Fffd""y™™™™™FfD™™™™™™r"$fff@™™""yr "w""""r""""""""""""" """""""""""""""""""""$Fffd9™™™™dfd™™™™™pfdDD™r"""""""""""""""""""""é"""""$FffdDDD@™™™™”fDy™™™—DDDDDFd—DDD@DD@$DDD@$DDD@$DDD@""$DDDD"""""""""""""îî""""$FffdD@FD)™™™D@F@™™™tFfDDFffd”FdDDDff@$fff@$ffd@$fff@""DD@FfD"""""""""""""îîî """$FfdDDfff@™™™Dff@ ™™™DdDFffffd´D@FfFff@$fff@$fDD@$fff@"$Dfffd@"""""""""""""îîîî "$FDDfdFffD™™™FffD™™–DDfdFfffdDfdFfff@$ffd@tDDf@$fff@"DfffDDF@"""""""""""""îîîîîà$DFff@Dffdy™”Fffd™™”Fff@Dfffd Fff@Tfff@$ffd@tfff@$fff@$FffdB"dB"""""""""""""îîîîîîâFffd@$fff@)™”fffd™™Ôfff@”fffdFff@4fff@$fDD@tfff@tfff@$fffD"""b"""""""""""""îîîîîîîâFffd$fff@™tfffd@y™dffdA”fffdFff@$fff@tDf@tfff@tfff@$fff@"""""""""""""""""îîîîîîîîæFffd$fff@'Dffff@™Fffd”fffd Fff@fff@tFff@tfff@tfff@Dffd@"""""""""""""""""îîîîîîîîëFffd$fff@"Fffff@ ™Fffd”fffd Fff@fff@tfff@tfff@tfff@Fffd""""""""""""îîîîîîîîëFffd$FffD"Fffffd™Fffd”fffd ´ffdDfff@tfff@tfff@tffd@Fffd""""""""""""îîîîîîîîëFffdFffD$fffdfd™Fffd”fffd ”FffDfff@tfff@tfff@tffd@FffdDDDDD""""""""""""îîîîîîîîëFffdFff@$fffDfdyFffd”fffd ™DFfffff@tfff@tfff@tffd@Ffffffffd""""""""""""îîîîîîîîëFffdäfff@$fffDff@)Fffd”fffd ™™DDDfff@tfff@tfff@tffd@FffdDDffd""""""""""""îîîîîîîîëFffdäfff@Ffff@Ff@Dffd”fffd ™™™dfff@tfff@tfff@tffd@DffdDDffd""""""""""""îîîîîîîîëFffdäfff@FffdFf@tffd@tfffd ™™™™Ôfff@”fff@fff@ffd@tffdDffdw"""""""""""îîîîîîîîëFffd@tfff@FffdDfd$fff@$fffd ™‘™dfffB”fff@Dfff@DffdB”ffd@FffD'ww""""""""""îîîîîîîîëFfff@Dffd$fffD$fd$Fff@Dfffd ™DFffdC”fffDFfffDFffd”Fff@Fff@'www"""""""""ªîîîîîîîëFfffDFffd~äfff@$fd@"FffDFfffd ™D@Fffd ”ffffffffffffd™FffDFfdBy™wwwr"""""""ªªîîîîîîëFfffffffEî´fff@$Ff@$fffffffd ”FdDfffDy”ffffffffffffd)™dfffffd'™™™wwwr""""""ªªªîîîîîëFffDfffdnîFffd@"Ff@$FfffFffd ™DffffdG™”ffdFfffDffffB™™–FffffBy™™™™wwwr"""""ªªªª®îîîëFfDÄDfdKîîDDDD·DDD"$DfD$DfD)™–DffdD™™”fdDdFfDiDFfDY™™™ÔDfdDy™™™™™™—wwr""""ªªªªª®îîîDD¾îäDKîîîÌÌÌÌîî""""DDB"dDG™™™DDDÙ™™–DF™™DDI™DDI™™™™™ÔDDy™™™™™™™™—www"""ªªªªªª®îîîîîîîîîîîîîîîîîîî """"""""""y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™—www""ªªªªªªª®îîîîîîîîîîîîîîîîîîî"""""""""y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™www"ªªªªªªªªªîîîîîîîîîîîîîîîîîîîÀ"""""""""w™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™wwwªªªªªªªªªªîîîîîîîîîîîîîîîîîîîâ"""""""""'™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™wwªªªªªªªªªªªîîîîîîîîîîîîîîîîîîîç"""""""""'™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™—ªªªªªªªªªªªª®îîîîîîîîîîîîîîîîîîì"""""""""'™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ªªªªªªªªªªªªª®îîîîîîîîîîîîîîîîîîî"""""""""'y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ªªªªªªªªªªªªªª®îîîîîîîîîîîîîîîîîîî """"""""""y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ªªªªªªªªªªªªªªªªîîîîîîîîîîîîîîîîîîî"""""""""y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ªªªªªªªªªªªªªªªªªîîîîîîîîîîîîîîîîîîîà"""""""""w™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ªªªªªªªªªªªªªªªªªªîîîîîîîîîîîîîîîîîîîâ"""""""""'™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ªªªªªªªªªªªªªªªªªªª®îîîîîîîîîîîîîîîîîîç"""""""""'™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ªªªªªªªªªªªªªªªªªªªª®îîîîîîîîîîîîîîîîîîì"""""""""'y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ªªªªªªªªªªªªªªªªªªªªª®îîîîîîîîîîîîîîîîîîî """"""""""y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ªªªªªªªªªªªªªªªªªªªªªª®îîîîîîîîîîîîîîîîîîî""""""""""y™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ªªªªªªªªªªªªªªªªªªªªªªªªîꪪª®îîîîîîîîîîîîîà"""""""""'™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ªªªªªªªªªªªªªªªªªªªªªªªªª§®îîîîîîîîîîîîîâ"""""""""'™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ªªªªªªªªªªªªªªªªªªªªªªªªªÁ®îîîîîîîîîîîîîîé"""""""""'y™™™™™™™™™™™™™™™™™™™™™™™™™™™ªªªªªªªªªªªªªªªªªªªªªªªªªDDDD@®îîîîîîîîîîîîîîîî""""""""""y™™™™™™™™™™™™™™™™™™™™™™™™™™ªªªªªªªªªªªªªªªªªªªªªªªªªFfff@®îîîîîîîîîîîîîîîîî """"""""""y™™™™™™™™™™™™™™™™™™™™™™™™™ªªªªªªªªªªªªªªªªªªªªªªªªªFfff@®îîîîîîîîîîîîîîîîîî"""""""""w™™™™™™™™™™™™™™™™™™™™™™™™ªªªªªªªªªªªªªªªªªªªªªªªªªFfff@ªîîîîîîîîîîîîîîîîîîîÀ"""""""""w™™™™™™™™™™™™™™™™™™™™™™™ªªªªªªªªªªªªªªªªªªªªªªªªªFffd@ªªîêªîîîîîîîîîîîîîîîîâ"""""""""'™™™™™™™™™™™™™™™™™™™™™™ªªªªªªªªª¨ˆˆˆŠªˆˆˆˆªªªªs3Fffd@ªªªs3z®êw7ÎêÌÌÌÊîîîìÇ|ç"""""""'™™™™™™™™™™™™™™™™™™™™™ªªªªªªªªª0£zªªqFdD@ªªq:q £îîê0Á""""""""'y™™™™™™™™™™™™™™™™™™™ªªªªªªªª¥DDDDTDDD@:ª£DDDD@Ff@ª£DDD@DDD DDDD@®îÁDDDDDD"""""""""y™™™™™™™™™™™™™™™™™™ªªªªªªªª¥FffdTfff@:ª4FdDFfff@ªtFdDDFfdFfff@®ìDffdDFfd"""""""""y™™™™™™™™™™™™™™™™™ªªªªªªªª¥FffdTfff@:§DDDfffff@ªDD@FfFffdFfff@®äFfffDffd"""""""""w™™™™™™™™™™™™™™™™ªªªªªªªª¥FffdTfff@:¤@FfDffff@¤DFffFfffdFfff@®´ffdFfffdîà"""""""""'™™™™™™™™™™™™™™™ªªªªªªªª¥FffdTfff@:Dffdffff@¤fffdfffdFfff@®FffdTfffdîîâ"""""""""'™™™™™™™™™™™™™™ªªªªªªªª¥FffdTfff@:FffdFfff@¤fff@4fffdFfff@«Fff@tFffdîîîç"""""""""'y™™™™™™™™™™™™ªªªªªªªª¥FfDDTfff@BFECDKNLLNTUUY^\[_bgjklrwz~†‡…ƒ‡’‘•›Ÿ£§¨§©°³¯­®®°³³³²³´¸¹º·´´´·ºº¹·ºº¹¼½º·¸º¸¶´°¨¤¤£™—“‘Œ‰‰ˆ„€€~xsuupjfed_]]YSPMJLJGEGHIJIECCGIFCCEDDDEFFCEIGECA@DFECCEHJMOMKLQW[\^chilruvy~‚‚‚…„‚‚†‡‡ˆˆ‰‹ŽŽ‘“”—› Ÿž¢¨«©¦©­¬ª®±¯¬­¯²´´¶¹¹º¿ÂÀ¼»¼ÁÃÀ¼¼½¼¼»»¹³²¶µ¯¨¤¢¢ —“މƒ€|}~|yxvuvxwtswyurpkfdc`\ZXUSTTPLMNJGGIE@@DDB?<>=:;<:9:9:====?BGJIGJPTVWWX[]``cfcchlkiiikoqqooruwxwuw{€ƒ„†‰‘”—›žŸ¢¦§§§¥¥¥¤¤£¤£££¥¨¨§¨­®®¯²´²²µ·¶³¯°°¯®®¬©§¥¥§¦¥§¨§¨¬¬ª©ª«¬­ª¥£¥§£¡¢ š˜š™’І†„‚}yvuttsnjhhjmliihiikmjghlmjgc_\[ZXUTSQPPNKKOQOMORPNOSSQNMLLLLLIJKKMOOPTVW[^]]agijjhhlonlqsqquyyvvwwxywtttuvvttuy~€€‚†¡œŠ’Ÿ—›©—ˆ¡Š‡—˜†‡”‘‡‘˜’—›—™Ÿ ¡¥¦§¦¤¤§¨§¦¨§¤¥©¨¥¦ª«©®¯¬«®®­°²¬¨ª­¬§¦§£žž—’Œ‰„~zvtrswxxwuttwxxwwxzzwqml|ƒfVdfRJ]gNL`]KM[ZJGQRNKNOGDKMFCNTIFQTLLZ_Y\efbfnrqpoptxwvwvuttuuttuvusqqpooponmpuvvyyxz‚‚ƒ……†ˆŠ‡‚‚„…„ƒƒ€€~~†ž–}€’€–˜‡Š†{ŽŒ~{‡‘‰Š”ˆ‘™–—¡¥žœ¦­¨ ¢¬°ª§­®ª¨®°¬©«ª¥¤§£›™›œ™•”’‘••“‘‘‘“’‘‘““އ„„ƒ‚|xtrppnjhjoqoklhgkkghz€gYgn^PYleYUXTOOXYPM\bVP`k^QZikcbjjaakmghrunlqqkimrplmquyz|~}€„‡‰ŒŒŽ‘“ŽˆŠŒˆ‡ˆ…‚†…‚„‡Š‹ŒŒ‹ŒŒŠ‰‰‰ˆ‡……„‚}x{€}}†›xzŒŒ|y‹™“„‹y‡’ˆ‚ˆŠ‚}†Š‚…’•Œ‰‘ˆ„Š‘ŽŒ—™˜˜˜š££ ¡¦¦£¤¥¡›š™™˜–“Œ‹Š‰‡‰Ž‘ŽŠ‹Œ‹Šˆ……„ƒ‚€~|yyz{xxxxxxuoq{~yy›„ko‚€nj}Š}dapuf\hrk^XYYSQTWVTVZ^`abceiptrrx|yy{{{}|}utyyttz||‚‡†ƒ‡Š‰†††…ƒ„„~€{{€~||~€~~€‚ƒƒ„…†…ƒ„‚€‡ŽŠƒˆ¡ †y…ˆzy‹–‚fdw~qeqƒˆ|t{ˆ‹†ˆ‘™˜”–œ¡ ™–› Ÿ™—šš˜•–šžžž¤«ªŸš ¤Ÿ˜—™˜”’’‘ŽŠ‡‡‰Šˆ……‡ˆ…‚‚…‡ˆˆ‡‡‡†ƒƒ……‚€}z{||{{ztsyyohs‚u]YfkcY_w}hTYltg\ewuc[cllgeinmc_dlmiiotvx|{|‚€€~ƒ‚~~€~}‚ƒ‚ƒ††…†ˆŠ‹ŒŒŒ’““”’‘‘’‘ŽŒˆƒ€}{yxwwsnr~‚|{Œ—ŒŠŒ‡‚†““ƒuv†}tvzyrpty|~„Š‡ŠŒ‹‹‹‰ˆ‰Š‰ŠŠ‰ŠŒŽŽ‹ŽŠŠ‘’‘‘Ž‘‘ŒŠŒŽŒ‹‹‹‹‹Š†‚~zwvwxyy|€‚ƒƒ…‡ˆ‰ŒŽ†‰’ˆ‡‘”Œ|€}y|€}xssvz{zzzwrooolhjmkffhhgjoolknpqruwwz}~~~}€~|}|}‚„‚‚€{vutrrssqsvy{~€€‚„…†‰‰ˆ‰Š‹‹‰…ƒ„†„€yx€‡…„ŒŽ‰ƒ…‹Œ‰†ˆŠ‡€zwz}~~~ƒ†ƒ‚…ˆ‰ŠŒŽ“—–““”•–—˜™œš––˜™—–—–™‚w’ƒˆ|zto~€n‹xvˆ~‚„‚ˆ…€—‰“……pƒo lvyjžxƒ]pŠss†n‰}‡„|{o_sv~Œ{py‡u’cu€|yƒ‚}{š†‹›‚x†w›‚ƒnˆ{‰„u~heslˆzveupr}vu‘‰ƒ…‚Ž„ez”{|†€x‰i~‘|ƒ‹„{owss…‰‘vtˆggsfl|co…huwr‰Šhb‘…h{{~}‰mhouo}€pnux€„Ž{rŠr{rp’su„|u„‡…‡‰‡Ž~¬‚†šŸ„ކЇ{Œ~tŽ{„‡†Œ†§Š“fˆ›wy”}…xk~Œgus”~tq‚ƒ‚u…¤œ|¡“Œ—…ª¦£‘¢zœ‹š›‹œŠ”‰”tŠd|—tŒ|wŒ“t˜†ƒ{Ї~Š~z…}t‡yu‚€rt}zup‡zƒvm‚‡„en…[jn_qcƒuqo€o|dv„ar‡a{sX~qsg~iq‚ˆ}jwlwwxlyco]zsqfy^qxfmjx†ps€€o€€œ…¥–žŠ¥‹‚ Ž•–”s”†„„’œŒ—–ˆ–€…zn…x‘€€u–„‚Œƒ…„£¦Šq|~Їƒˆ†nry|uv„€Ž}px|Žt‰vswmzssz|š…‹”{‹Žƒ™¥‘Œ‹‰›‹•x‡‹†‰އˆƒ‡Š‰‰v‚…‹Œo……vu’s‚ŠŽ|{z|€y…†‰‰s‰†wum‹ƒŒŽ…q‰x„o{so}}€cb^saflfamh`slfwvhƒnwstxusuk`ljjvvyly€|ywzsy~Š}‡‘~zzx…ww‡…‹Š‡‰†ˆ‚†‚’ˆŽ‚˜……†„‹ƒ‘Љ„Œˆ‡‹•|†”žywy€qvsy{vpbuz‘ˆ…zŒŽ‹‰‰‡‚…—–¢¡¡‹‹“——” Ž–”™•“™£¡—‰Œ‰y’†ƒ†‹ˆ~Š~}‡{{‰}‚uuu€r‚wƒxƒy‚|l€q}xss†d__ui]\eidvovvsltntksksrr|sjoglmohmgoqotkdenevqwttptjupmmtq~ƒ‡‹ˆ…„ƒˆŽˆ‹““Š’ŠŽ’”“¡•Ÿš–…‘Š‹‘‰…Š}z|y~{u~{ŠŠ†ƒ{‹„}‰–‹†„ƒ‰ˆpo~z{mu}ƒ€|v‚‚x|‚…ˆv|€xyz„‰‡z‚‘އ€w…ƒ‡ˆ‹”‹…Šˆ‰…‚‰‡„‹Œ‚‡}ƒ„ƒ|‚}€uyqsrnq}~Ž†Ž…ŠˆŽ|ˆ~~„„ƒˆƒ€ˆ‚„„ˆ‚~ƒ‚‚ƒ{yuv€y{y}zyrunmkhml~pqrtsrqxqpvr|xntppmro~z~†Šƒˆƒ‰‹„‚z†}}€ytywvs}{………‹Œ‹†‡‰‰Š‚…‰†€‚{~|y‚~ƒ„{ƒ|}xv{…yzutyxtuojzz‰†„‚‡‡†…†€‚†Š‹“•““˜•“”–Ÿ“Ž’Ž•„ˆŒ…………†vv~wvw{}ƒ|~‚‡‚†€‚~€}|{}z{v{{|~|„‡‰†|{yyxxwxxwslrsrrpvxŽsqˆpq€}jm~rbjwq^cqolqzxnuyxpt|xpvtsswvrtt}}Œ‡“ššœ—œš –›œœ  œ£¡ ž˜–›—˜™™•””‹„„†€}{|vqkruorsxzsvvyxukmorq|‡jU`vjdnuhfxŽuivsjelsealnhacrh[ktmt}{~y€‡‚‡ˆ‡‹‰‰‹„ŒŒŒˆ‰‰Œ‹Ž‡‰ŠŽˆ‰†‡{‚€{~yw}utz}yƒ‡‹‡Œ‰„ƒ€~…‡„€…‰ŠŒ†‹‰ £‰y†Š€~zjbtyh^`h`V`nkbjuqjt{vt{y||{uy„‚„‡ˆ“Ž‘’’‘ŒŒŒŠŠ‰……ƒ‚„„‚†‰†„†„Œ‰…†„ˆ‚~z}yv|z{y}xzv€{}}{xpquskgvˆvV]mpegmomqƒ…zo€…{q}„zs{„€ƒ‡‹ŒŠ––‘’’”•’Œ‡‰ŠŠ‰ƒƒƒ€ˆ‡ŽŠˆ‹‹’‹Ž“ŽŒ„‡€~z{~ƒ€‡ŠŠŠ‡‰‹‹‡„…‚xtsnponkiedltsjo‰Žxhv…€wuvunnzveboohcfmkqsqoosvqlnilnurmhpmouy€‡ˆŒ“–™™¡¡¢œœ›š•”œ›•›¤£¥£¥¥ Ÿ›œ›Ÿš”’„~z||zwuyzyvvzvwv}€wt{‚zlvŠ~c]n~qnq|w€ƒwmqvsi\befigd`_ennnnqw{|}z|ƒƒ‰Šˆ‰‡ƒ‚†ˆ†}„‰ŠˆŠŒŒŠŽ‹’‹‡†€{ywuttwrt{}‹‹Ž’–•••’’Šˆˆ…†‰ˆ‰‰€Š’‡ˆž©”z~‰‘…selquqe\Xbfj`\cllpqqoqz~~{uuuwrrsuy~†ŒŒ‘”“•™“’˜”‘Š‹‰‚x}|z€…ƒ~ƒ€ƒ€‚ƒ…‡‹Œ‡‰…†~|||{|}{}|}{x{€{{|}}ngnrmdi}{_S[lvo]^ku}}tqwƒ‹†{u~zww|}€„Š‘“‘’––•˜™—˜›œ–‹‹‡„ˆ‡ˆˆƒ‡ˆˆ‰ˆ…‡‰’“•‡†…}|z{|€€ƒ†‡ƒ„‰‹‰†„†‚}~wsrolkghkfcguxolx…tlv†Œ|lfovtn`_goqpgfmwxrnpy{wpooqrjcfnrslkxƒƒˆ“›Ÿ¡¢¦¤ –Œ’“–žšš™œœœ™——˜’Œ‰Šƒ}y{|uw{}z€€|{~~}~ƒƒ{€†‚wqx}pmu†vu|„ƒ}wxw{{vnhfghhdfmmnpqqsuxyz††…‰ˆ‰†ƒ~~€€}€€~„ƒ„ƒ€}yyyuoqpljoonpw{yz‡Š‰–˜š˜–“†„€„†ƒ‘—•“‘•–•’Œ†Š‰wqsvtooqssttsnoquy{ƒ€~yxutu{}‚†‹ŽŒŽ”އ~xwƒrjkoy˜pcpytŒwi|mcf’ª|……•}i{eŽj|Šn˜a“y™¨¡€_q…£]N25BZWfe8-$mRPBR6\h‰­·µ œŸ¤Ï¼¥ÃäôÑØõÿÿÞÌÇõèÌ«¯›‘—‡¶ ‡mo_\}VkoMhj\‡}ž—Ÿ¦‰£«•²¯²ÈÖ©ÌÃÂÏÑÌ´¦¥«ž«‘eW6T>Va^G/6(6=$88TSDIC}wLYh‚~|Œjƒ˜­¸ ±šº¿ª·Ä ± ²£€”luxodTol_]O}†`vNu`WKd_erOYk_mu|„ƒ©¢Å³›§­£¹ÇºÉ¤´É¹¼¼»«Ó½–·¨®¾®Á»±{—lDpŠ}r>*@H8KHrK&Al@4?-@=27DZgWHc”‡nx†Ž—–²ÏÚÍ·²ÔÛÔÅÀ¿ÂƾËÑÐÕ²¢œ¹¯°žµ›™ˆ›qm]L[JUfDG+57SNTP95=I]hS\U_[bp^dhv‡ ’¡œŒz‘¸µ¦‡¦­¢Ÿ¨³µ°£²°±ÁÑÓÊËÐßÕÓĹ¼Ñ±Ä¶¼°«£³Ï¾³²££”˜•”–pxm~um`LPEZN.:6DL/8AVE123OVfaF@2,IBFikXSNeJKXZ`dWHUnz{pglxfqg…Œ”–w’‰œ”³º¸’œ•³¯µª®¦¯’Ÿ ³§¬°¯ž¡£¦¡‘›—’ˆ—–‰pz„‰h}u€…𒕆y{frz„sybBTSAZhSSa`>L9FB>;:;HC/@4CGSC):<7GBYRhev__Cjylxnusx{g}wuyx…u…€Ž–—Œ˜¦‡˜¯º·šµ·ª³¯»°²¾µÞÛØÏÁµÉÍÑØçàʽ¹¶ÁÁ²¨¯³¹¬®¦¢ž³ªš”ƒŠ|œ‚†{`epiefonpztnzkke]{o[RRGVSK;KN?CA?:;EF?31&-0866)!/73+&04/?>LBHKG;[kZnerzp`ie|gomrƒ‚€‡‚ƒƒŒ{s‹‹›ˆ‹ˆ‚”Ÿ ‚•Ї‹¢¬–· ¦¯Èª®±·¬²»·¶Â°¦¬¨²°¦­°ÌÎDz­¡—–¯¯š—ª¸£žŽ…z˜ª¬¨¤Š•¤¬¶¯µ¦¨¡‘ŒŽ†‰“Œ”›‰‚’vz†ˆmfivjgsqifeKIIH69GEFD?A1MEX[OUNBYVGP8;6=>E1II?6HIE@:78KNV[`ULFMAEYbbSda_fgtg`t‚|Š‚sxoyz}‰Ž†ˆ‚Œ‡š–¡©œœ§¥¬¬œ¤ª›ž¡œª¹ÑÄÐÒʹÅÑ×ÖÚÇÄÃÈ¿µ¯½®²²¾¼°²¸«¸¡®£¬®œ›ª§¨¢Ÿ†„“‚v|}{nv†zs|}ƒ†‡‹tgm{xfp\LW[Zea^MPMdcRhfGRWV_`TJIHYNRADUP\`ibdc`j^VY]jmm„†~—”˜‘£‘’‘’”‰ƒ’§•™ž™˜•°Âµœš¬§ª¢…”š¬–ƒ„Œˆ…„Žš¤š¢·º­º¹ÒŸ·¨§µµ£Ÿ©­®£—¦³©¨Ÿ¡Ÿ  ¦ ž¢¤Œ•Œ’‚‚z…Šƒy}syy‰†ˆ€zurj_\b_TWXkZGT]^`caOPOdbWYeVGE\_OLT[_YSZ_ldPcm{v\np`Y[BMYYQUe€Œvlgrnrt‘—zmsˆ‰znntb\`cw‚ls~‘Š„ˆ“•‡“†~{rx}~‚nqz}{y€ƒ|s‰ƒ‹‹ƒ„ƒxxwxqpxy~‹…††˜¥…€’ –ˆu‡utoos}sem„†yŽ ’¥®¨¯ž”›—•”–¦²¡§½¶Ä¿¾²³´·À¼­¥®¥š¢šˆ‘ˆŠ™˜š•Œ•’“˜ •†ˆ…‰‰‡tod^[d^adqxxkpu}€xsimt~r`lgXKFS^[G@AXVXLO\a_ICQfaLHCTZRJUgZfd^w~tkryo|t€ƒml`c`jggdvsop}|…ˆƒ‡†‡ƒz€ˆy{x}{„›Ÿœ¤¤ ›§¢¡§¤±¯¤˜‘ˆˆ’—ˆ’…„ˆ‘ž ¬¾¸«¢£«¨›”‰ŽŽ‘„ox|†~|v„”Œ™˜ž «¨­¨°¬¬¤–“‰Œˆ‚|‚Ž™˜Š“œ›™—›™•‘‚Šwˆrrkjqprwvxy||yˆ…~uzzumhe`iUZTUb`dahtyptlcds{jnu€staUonqxxr}…‚w|‚‡muoeigaifaeiy‡…‡‰‹‹œ’ŸŸ•”ƒ‡ˆƒ{nmrx…~}ˆ“‰–œ›˜†‡‰…‰ˆ†stdbbgvx|{w€‰…„„‡}|~~yutjhgjmЇ‹—˜ŽŒ•‰ŒŒŠqneoniheacc`goz€‹–‹š•›•••Ž‹šŒ•Ÿ«ª®­²·³¼¾º°¨­žœ—“‰„‡ƒ„€~‰•¤¡˜ ¤šš“•˜“˜‹„}voninqrvy‚…”‹Šz†yŠ„yisabVO\aPNPUet{spda_dbadcbUPUWZ`kbgmnvz€}w~uz}‚…vttsggf^b_ppo}€ˆ‹„…|}ƒyƒˆ~yr{‚†ŒŒŠš§®ª£¦¢” ž¨™Ž‡{~xvuxx…”¡¤®´®°«Ÿ¢š¥«œŠ‚|{|vxxz‡‰››”—•›žž›œŸ”‘‡ƒmlfk€„ˆ‹“Ž’’‘އƒ~{|zwmlgfhiv€ƒ€v|~„‰†zrqllf___]\^cnq€‰‡€~~x|„‚‚u|ƒ}wnvzŽŽ’’—‘’–ŒŠ}‚rlgmonqny†‹“™šž–——••Žˆ€zzwyuy{‚•‘‘›‘†‚„…Œznjdch_^mms€}~„…~}|z~qrmcbYZetx}‚„„†‰Œ{~Šystqik_\eedq‹‡ƒ€‡–¨’•¢…x—¦“”˜…{‹˜Ž›‘™¡žŸ­¢ ¨’¯œ„–Ž”utfj^Žt„¥~œ˜ Š”«Ž°€ž–¨ˆƒŽdƒ}’†Ÿ“˜¤»š”¤Ÿ¤ž ˆ{s•™ƒq[ng’p~ne‚ƒ|ˆ‹b€\„bhjmajGYbbemb~w…urzzTu`iT`f\CR69aVdjevtl|m€t\v‚ˆjd†am{vwrk}…€‰˜•©‚¨žu›ˆ~vztp[}dh‹†œ‹¸¤¨£ ®…¥•—œ„~¨„“Œ…}‹ŸŽ™›˜‰­˜­¥ {Œ‰‡yŠijPxuo}mxŽ’•ŽŠµx—n‹p–|stZiqSKklosZ„Œ€xeyŠ{po†t–Yogbk„m”ˆˆ—›Ÿšž¡ž»…›}‰¬“—‰Ž®µªµ³œž•¨ŸŒ—yx„wugXbisi€…–•˜x˜Ž¢‹„p†m}„euvde~l}~w€ˆ{Œy‹‘qqŒuwvXscdMdQOfpc`rgpp€}s`lX||t`ncrw]`Px{bmv‰‚yfˆxo|wg‰uqnl~bJt^ns†bzƒ…zžŒ›¥”–€“„ŽŠ¡x’—€°¡°Ÿ«·­¶¤—ˆ•”{ygfrxr{‰”‰}’šžŽŽ‘±žž´ –˜‘šœŠ™‚§®§¥¡£³ž¤¬¦•˜•—“Œn€e{bwf„wpy‚~|y€{|Œ}omuicadhYZ_lc}mestumimyTa\`fXPWVa_c]pgbysg€yyu„pn~qwjj~dzo‰xƒŒƒŽŠ›„‰ƒv‚yzomcijs~sz‹Œ–  ”šž£•¡–œŒ•„ˆ’ˆ†‹‰“‰’™‹–œ™›”ˆŒ…v}mzlrtts€px„…}‡‹«—s{„xli]ejdh{hkctz|vvjiup‚~}~pdyiz|vw|ƒŠ‰Ž“”‘›¢¥«©š™—•–œŸ‘•‘›¢¤Ÿ¤œ¤œ˜Ž†Ž{|zvfwkrotr‰‡ƒ††Œ†~’}{…‡{ƒpx}rƒ‡wx‚€†{|w‚|sad^RY_U\TY[cY[fgklju||~psjvoofmda^ffkfonsw~uomrvmoplchgkqmxnu‡‚y„€‹˜™‡‘Ž…”“‹“”’”‘Ÿ›ž›œ£Ÿ¢§¯°ªœ“‡€ƒsrlhtrxˆ€sŒ˜™›Ž˜š¥žž—‰Šššš˜–”– ™–žœ•  “ŒŠŒ|†zv{umtolziytq|{€‡‡€ƒ~y~sroikujfihnultnoolrpjiha]]]glnfb`lglgphsp~}„‡€wtyvvtys}y†‡€ƒ„‘‘–†‰€‚‡{wpuq}ozyyx„‚Œ‰Ž’’‘˜šœ›–—™ž•‹‘Œ‘”Š‘ŒŽ”’’“–Ž…‰z~}yznqrwzrrxq}†z„‚Š”‰…€}€xnuqnoiminnlioknrqwzpzompfcqlrwoswpvt{z}ŠŠ‘އІމ‹ŠŽŒŽ“ŽŠ’“–š’™š’…€~yv€uyvy|{…„‹Œ˜“Ž¡¥ŸŽ—¥›Œ~ˆ—–€v€ƒƒqss~|tw|suoiifgminhjplhppx|zwƒ€„ƒ‰ˆŽy€|}†w{ws{zvƒ€€„v~zodihosmgjksvmgjfvz|€~|}€}ƒ„ƒ„Œž£‚{zޤš€w|‹š|pdagcjjag`huv~tt|‚Œ‹•›£¦Ÿ›¡Ÿ¢ Ÿ›Ÿœžœœž•”œ”Ÿ“Š„ƒ‚}~€~|wonotxxzttyu~yvwrr}tokhlmhilhpnnkjlv€yTKOgtlYXYjrkf[MXaij``inw…|yrv††‰„†…‰–‘––˜™šš›œ™™–‘Ž‘“ˆ‹”Љ‰‘’–™“™–™ž¢Ÿ¢Ÿž£››“˜ŠŠ‡‡‰€Šˆ†‚|wuqmiglwuqn|…w^U[t~ubZbo~vp]]]llk_X[`rqsc]chstvjmltuxqmuxƒ†„{ƒ‹‹ˆ†ƒ‡•’—“™œ™šžœŸž˜•˜’–—“”ŽŽ”’’ˆ„……„‚{„‚„€€szwxyyvu}ƒ‹‡“›¡’„†“£Ÿ‘z|ˆ“Œ~jfiyz}nferz|mabeow{tldnvz{mirwz|„Ž…ˆŠŠ‘|{{‚|wx~€zyrrptvvw|wyzxsovtuorswxtywx|€€€…ˆŽ”™”ˆ{|Š–’…{sx‹†wf_dpw{vf]fv|yrmrzŠŠŒ‹˜¢©§§¢¢¥¤§¢ž¡Ÿ£ž”—”“‘އ…ˆ…‡ƒ‡†„~~xvvvustppppprru}}~{|z}xtooqspngemrvrr{wqdVZiprj_[aktobXTVfmnj``lv|€‚…‡Š’‘‹ˆ‰”’•—Ž“’”’–”™”‘˜““‘”‹‰‡‡‡‡……Љ‹†ŠŽ“””™ž¢§£ —”ŽŒŽŒ†‚…ƒ€{tuvwwqmqsx}zywupg_ailmaXV]hsolc]gmnneadegkllmmklmnmonquz€…‚€‚‡„‡‰‰Š‡‚ƒ†‰‡‰”Ÿœ–“’–”‘’“”‘‘ŽŒ‹†…ˆ‹‰Š‹‰Š…€zz}|ywy€‡‹Œ•˜–‘’”—™˜“†~†‡…}vssuwokkmrpstv{{xtnmppsyvsrtqqnonu{~‚„…„…€{vz|~xutuwwumiijkkortw|{{wx{wtux}||ywwsvty~ƒ…‡Œ’˜š›˜”““Œˆ‡‡‰…}x{ƒ‚€‚‚‚~urpqtturz~~‚ƒ†Š™ž¡£¦¦¤¡žœ››—•—•’Ї‚}}€~||‚„€|vtprutsrstpliijjkpy€ƒ‚€}yxrqruvtoqswyvrmlovvslnruokiiopppljijigdhot|ƒ‡Œ‘‘”ŒŒŽ“–”‘І‚€„‡ˆŠ’Œˆƒ|{z~ƒ‚†‰œ¡¢£ž’”˜’†vkloofYOTY^WMJO\iqtyž¤¥§³»ÀÁÂÇËÊÿ½»³®©¨¦££¢›’‹„}sib`\[^^]YWX]cgkr‰’™Ÿ¢¥©«±¶»¿ÇÊǽº³®§¡Ÿœš˜—š•‡xplfea_ZTOMLILKKQ]hptwxy|‚†‰‘—ž§­³¸º¿ÄÃÃÃÇÌÌŽ¸¶¯£™‘އ~{wmeZSOIC@@@EHJHEB??@FLTZbhlnppsv{ƒ“𣭮«¨«¯¯¯°®±³µ±ª¤Ÿ™”•œ™‹ynlv}s[GGR_`RB:=FJD4-/9BFIMVcmsx€ƒ„…ˆ’š › ©®­®³¹¹¾ÊÓÐÊÆÄÆÄÀ¿ÀÄÈÈËÊÅ¿º·³°®¯¯¯­§ž—‡xspmif`TICAA=:89;?<8988556:=CFKMLJKKOTW\fr}‚„ˆ‰‹‘•šžŸ¢¢ œ›š˜—•—›™’‰†‡‰‡ƒ‚‚‚|rhb]XSRUVXX\]\ZVSTUWYXWWWRPNMKJLPTY^^YTUY[\^dks{†Š‹‰‰’¤«¨ œ£±ÃÌÆµ­´¿Ìη³¶»½¾¹±¨©­µ»¹²­«®³¶±¨ ¢§©¢™ˆ‚{wyyvruy~zohb^XVVUPJFFC<62211489:=>>>@BCGKPVXYXSMKKNOPT\djlqz…‰ˆ†…‰˜™˜•–™™˜˜™šŸ¤©««ª¨¦§§§©­µº»»½½»·´°­«®³¶³¯¬¬ª¦¢¡£¡œ—˜™•Œ‚{ywsmkkjfa^\ZVROMMMNKHB=74/)%%&'+1662/14569=ADDCDFEBDNVTMB98964225CEGV<*2IEg`_egien‡y›¢´©«“¤œ¯ÉËÀ´Ðɾ¿ÉâÄÌ·¾¸ÎÀ¶±À¿°®«®¤—›‹™±£š¢¤˜š˜¯£›”ŠŒyƒ|†’ƒztxx_``Q[^TCDHGU>5:BF(!$#DRN>@/*0BD[gbUH_WRNe`fpcfoŒ}‰r„‚‚~‚|ް£˜žƒ’޳¯½¡•¯¹¶Â³¹¿¼²ÁÃÌ»´ÅÊÁ²²­¼°³«œ—¨£¦’ŸŠ©‡~zqaxsosd[L@?S]E\N7=@-DKJ=IK3719-7=04@G.0:8EUG:?B@P=`JbOY@RKUaWWpqnw{ot}t|ˆŠ|„„“¡””˜ƒŽ¦¶È¬ª²·°ÈÏǹ¹½¹ÕÜÆÈ¶µ´ÇÉÜçÏÅÏÅÏÝáÑÒ×ÓÏÒÌÀ¿½Ë°®±¨•¥–– “š’v”ƒvxlmm_QSXLE;HP60?27DJ-@AF8B@8,,<;=570$:=:;!5*D:;@;1/<;L?29%0E?4ENUbMMSnlbqjpzj{|x‰†x~—›”‹Œ†”¤¶¦¡£–•£¤®¡ª¦‘¨´§§«ª¯°ÄÂÂàÏÎÊÄÎÍÒÆÀÎÓßÓÖò´ÁÆ·½ÆÑ»º¨˜™¦®« ’wv„ƒŒkrltnrwo~x‡}ony`e~r}j`an_Wh_aglMPWSIIOHJI==%8.<;)1/%=D9N:@?DLP;PPH?KRQOMEJTTZei`]\]Xdy{m{pgjfxlhu}{„œ Ž”†– Ÿ²°¦¥ª›¤œ¥ ªµ£¦  «®¤¶»ª²µ£°³½ª¯®¡Ÿ—Ÿ§¡¨›–¡¢¬¦¢²¥­¨²³©«³¢°˜¦Ÿ¦¨–””›™–’‘Ž˜‚„‡†tpzkltproimbWiwsel]QfmksgcZTHbbPbZBOXScf]^QS_^gZ\NL[WYDCC>I[[\Vb_`gqafscgmkk|ni_VbZdiqmqpo€vrssyyp|y|mpewlnnss~mot~‚„sŠ¢“–•†|y’œž”’Ž ©”¨©Áº¦¢ ®«¦¦¨§§¥¢˜¦ ¦›Ÿ¬¥¥°µ²¯°±®¥˜š¨¡¡™•‹‹œ™˜˜Ÿ™’™Œˆ‚‚}}{jmkcjrw{vuwx~}z‚zœ„fflmmmgQOOab``k\LOQUYYXSTWYVPTVFNCJTPkcUarhnmmnqu€‡|vjk^jrw~{hfdjxƒ€urwcajjuzfeeYcZTXbidssqoplxx‚‰w~zy~{}|ws|’„…„‰‹Š|€|}‘‘Žwqu}€x~{†–§¤º¥³·¹½±¸¶°·Á¿´ºª¦¨´¨·µª³ª³³¨©©«¢ª¨˜œ¤˜™’’~wus~…€z‡‡„‰Šz…ƒ‘‰„€{{sqrl€vkolurvyz{t{~ƒvicbgfPLGJNGPPZ[_ZMWWY[VZ[hhidicg`defojlp„‡‹…{x|kzxlwtopx|o’—›Œ†…ŒŒ”’›‚|}w|}vzyx{€}Š‘‰}~z€xy†wttvoxuƒ}ƒ|ws{{~‚†y‹”‹|yt|„ˆŠˆ…ƒƒ‹™¡¤ž ˜’¤¤­¥£—˜¡”Ÿ™–’‰‘Ÿ¡¨£•”–¥¡š’–Ÿ¢£—ƒ‡Š‰„‹‘••‰“€Š”†Š„{yysqokgdq}zxr|‚„Š”¤“—ˆˆztlsxtoZ]`js|u^`^ij{mT^U_u~plbYQ[clneqnju‚ˆ™Ž{zzˆ’Œ‹€ulkŽŽ}t~€…‰†try€Œupo_mrrqn]cjnƒ‡ˆ‰v{qvz‡|wsr||Šˆ‰‡‹~|x|ƒ†„€~ss}ˆ…„xfdhmq~’…‹Œœ›®§¬£ ª­­´´¬¨¦¢¦®²¯ž˜›ž–£¥¨§˜–•—¨ž•š••‘‹…†„{z{tux…~|ˆ†ƒŒŠˆvw{{†}loslrrxzuzx~…ˆ‰ˆƒ…wohfeqb]OHX`mrwkh`Tjh|wrruflrquxunrswz}{€…‹”‹‡‹‰ƒ…vywqsv|y{…„ŠŠ—ŽŽ“’‡ŒŒŠ“˜‘ˆ‡‚z}€y}z|y„ˆ‘‡€x„…ˆ‚ljpz‚~xytiwu}votvt~|{|‡ˆ‰„€ƒ~}|tz„‚…~›—•“’””‘”•’‘Š–’‰‰€‚…‡ˆ‡‹’ŽˆŒ˜‘…‘Œ–Šƒ…ˆ‚|†Š‡ˆ‰…ˆˆŽ‹‡~{x}~{{mot{ƒŒŒ„‡’˜™˜™š™‰€y‚}‚}tt}~~€}|rx€€†~tpmzuupibc_ftxxsjt‚}€…„ƒ‚|‚ˆ‚yqwx|wz€z‚…~‚€€€ƒ‡{z{wxrmlwmooprw~†€€{|yˆ{w}x{€||w|€~‚}x}‡†„„…ˆ~zzz|~~ƒ……Š…›£Ÿ§ŒŸ¨˜—Ÿ¡Šž° šŒ“š—š–€”Š“‹‚„‡„‰ž…y{xuh“noc–]|…vœ|„UiyxˆuŒtƒŒzztjˆ‹‘”ƒ‹¢—¸~†”“™“€„ƒs“w{’ˆ…‡}žxtxdˆ„’–„y}kƒexgˆxpi…zo‡€Š‡‡‚vVue\^joebz‹‹‡|yy’o‹|tx‡€‹vvŠdqugf‡o‰i}yw••sr|]nsrrxd^a~tclxp\nŽjt}ˆvˆywˆy€rt˜r{„{Š‹‰Š{µƒ„¨t~–„z‹„„w›‡w‰Š‰…‰’Œƒ‰¤|q‡Š‹u‚zap}…mƒƒˆ†omo|™“z¥viˆ’¤¢’¨ ŸÄš¢®ŠŸ²±¡¡šžˆ¡~ˆ­ƒ“І§‚ †’‡‹Š€zou|sgq`lu€mw‚t}{x‡p„{kc€~hfqWmujkvb‚ou~t†h~‹ioz]g]Nifl[qZhwrjtjulsnydsWuxzn„l}ƒlvow…eisŒŒ}h€up†{g‹xˆ|‘s~˜Ž•‘™s‹š’‡Ž™ ’‘™›•ƒš~”„ Œ‘‚›„†Šˆ•˜¨¡”ˆjr…“rxxqsemv‚ˆxss|oqy}}}~™Šˆ‡x|„‚ƒ‘ˆ§—¢“¦£‘«Ž‰’‰y”ŠŠˆˆ„„„˜ŽŒŠˆŒ…tƒ€‡‚l~‹~oq†n€{„‡{}ƒŒŠ{ƒ~~upkrpevv‚‚|‰“…ŽxŒpyxszv~jmc|nuylbvgyfs€unwwg†jppkfhkpm`jimvnjdmmtvvwortƒx~Š}z{xŠ{v€Œ‘‡†ŠŒŽ“’†~†…‚Š…Ž‹ŽŒ|‡ˆ†‰Š{…†§‘unƒƒ„ƒvqesr‡„‚y|wƒ’‡zvt‡ŠŽ—‹ˆˆš— š¢¨¥¢¢ šž– ž¢ –•–˜’ˆƒ–„‡™’’Ž’“ˆ‰ŽŒ}‚tŠuo‚‚v‚kvouwtwkƒw|tmˆlkjrmonuuhzhs€|v~quknjmkjm^ba`gdiadeisokggjsjtpqilsumqvsnwpxtstsq|€„ˆ‹y~{}†ƒ€„€„Ž‹‹“¢œ•‹†’‹Š’”‹’ˆŒ““†‡‡‰€ŽŠ‘Š“‡~vwsqyuxiqsvyzqunvy{…}z‡{‰……‰‹‚ŒˆŽ›ŠŽŽ™“Ž‘‡Œ‘‡„‰†„|~‡ƒ{ŠŒ“†€ˆ‡ƒˆ‡‹ƒˆ{{ty†xu~u{{~‡’…Œƒ‚{z{xxw|†…‚‚‚‡‚zsysstz{ywvnokkniscbguz|z{prtoxxswljlso}rxqnkwpx{rutxq€€‚…Œ„‚†…~~……ƒ†„…’…ŠŠ‰Š„„‚„ŒˆŒ‰Šˆ‚ˆ†……ƒ{€‚|„~xpwvx}y}omqwz„€…‡‚ˆˆƒŽ…}‚ƒŒ‰‹Œ—‘‘Š’‘’Œ‡…ˆ‰†ŠŠ~|}ƒ|€…‰‹‚€‡‡ˆ†€‚~}|xxvwxvxrovzz€zvy{{~z~€w~|~vƒˆ‰†wsy‚veZep€rc[Vbpsrdabmu{shilwz}zƒƒŒ‰†|‚ƒƒ…ˆŒŽ˜Ÿ”–’”–’™–”Ž••—œ‘‘“‘›••†„ƒ†„ƒ}‚ˆŠ†…|z{w|~~|twtussw{†€pXTWhur^XOZornaTTUisotkbw~†{s||~‰ƒ‚…ŽŽ‰ˆ‘•ŒŒ‰ˆŒ†Œ†‰†‹‹ŒŽ‹Šˆ‰ƒ‰‡‰ˆƒŠ‡†‹ˆ†xxsu{uy}}…ˆ‰Š†ƒ†‚†ƒ„€„€…€{’“|nmj}‚wh_^lzyka[^dkqnhjmpvxuvrvv{€ƒƒ†…€ˆ…ƒ€~‚‚„†ˆ‰ŠŠ•š˜ˆ‰Ž‡Œ‹‹Œ‹‘‹‡ˆƒ……ˆ‚„}ƒ~||vxwwuuxvmihmqu‡ˆymbelsqh`\gn{zunmpvz|~€ƒ€‚ƒ„†…†ƒˆŽ’“‡‰‹‰Ž‘”’‘‰ŒŠŽ†‰ˆ‡Œ‰ˆˆ†‚ŽŽ‰‹…‡†‡„€vuxxzvuqtpquvu}~€€~~|tts{~ƒŒŠ€sjpu‚…yqoty{uqkdhikjjosolfhnmtstqy‰†}}„‚„„ƒ„ˆ““˜——™”“š——–˜“–•“•‘“’ŽŒŠ‚…„ˆˆŠ‡…ƒ}~€~{vyv}|qmnr|…Œ€tf]dnvmha[bghc`WZ\_glu{xwvqpv{€z{{ƒ†‡Šˆƒ†Š‹““–”’Ž‹ˆ‰‰Š‰…†„‡‚ˆ‡…~€…ŠŒ‰Š†‡ŠŠ…‚}}€ƒ…„††‹ŠŠˆ‰‹‰ˆ|{„†•—˜‰~omp{~xqqornsmkjhfgiqvqlfdfju|€€„‚ƒ‚~€€€ƒ„……|}vx{ƒƒˆ†‡ˆˆŽ‹‡ˆ†ˆ‹Šˆ…ƒƒŒ‘ЋЉˆŒŒ‰ˆ‚}{y{}{|{y{wurjkntz‡ˆ„wmc^afjlnnmidfkqtxxyxz‚‚‚„„ƒ…‡‰‰‰‹ˆ†…ˆŠŽŽŽ‰‡…†ˆ‡ˆ…€……„ƒ„‡‰‹ŽŒˆ…„„…†„€~{xuvvrplnprv}€‚ƒ€€|yxy~„…‡‹‰…}uspv|‚‰†{vtusqoprtutqokhilpvxxy{z|{wyv{|~‚„ƒƒˆˆŒ‹ˆ†„‰“’Ž“”•‹‰†‰ŠŠ†…„‡ŠŒ‰Œ‰ˆ„‚€ƒ‚€€€€}||~~|yvopwƒ‰Œ‡‚€~{slfdinspnea`bddgiov|}|xvtvz~„…€}~~€ƒˆ‘’‘ŒŠŒŒ‰‚‚‚‚‚~}~~€€€~}y|~ƒ„ƒƒ‚€…ˆ†ƒ‚€~†ˆ†……†ˆŠŒˆ€{}„‰’‘ˆƒzxww~„ƒ€xuux{}xtrrtwyvrmkkpu|€‚‚ƒ~zxuwz€‚‚|{zxwuqpqswy{€ƒ†‰‰‰ˆ‡ƒ„‚„ƒ„‰Ž’™«¥¡–Š~sprsrj`VSUWUPE<;BQ_knmms}ˆŽŽ’ ¯¾ÈÈÄÁÂÊÒÚØÓÊþ½¾º´ªŸ˜’މ„€{yvpkfhmv†ŠŒ”šŸ¤©­²¶¹º»½»º¸»º¹¶²ª¥ ›’‰ƒ|uslgaZULG@94248?=><;:84337>ELNNMNNRSUWY_dkouw|…‹‘–™œ ¦¬¯­©¦¦¤¤¥¥¥§ª¬«©¦¡ŸŸ ¡Ÿœ™“ˆƒ~xwtrplgd^YUQQONKJHJIGD?<898856:=BGLNPSVWY]^adgikjklot|„Ž›¤¤ž•Œ–¥´¼¾¸¬¢¡©´¼»²§¥ª·ÁÅ¿µ¬©¬¶ÀŸ°«­²µ´«£š—˜žš•މˆˆ‹‰…~wqnkgbZSLGDCDHJJGB>=@CHIFB@@ADEFGFDDGMSV[[ZZYXY_hsz|zwuvz}zy~ƒ‹•–˜› ¦«®°±²³³³´³²¯ª©©ª­¯±±­¨£¡¢¥©©¦¡œ˜•’Šˆ„‚€zsnkkihgggffhihd_ZSNLLJGB=;9<>@CEGFFFFGHHIHD@>?BGNT\cd`XPLKTds}|q`TR^o„€wonu‚Ž˜Ÿ›œ¢ª±¶µ³¯®¯±³¶¹»¼¼¼¿ÅÌÑÕÕÔÒÒÖÙÚØÔÎÉÄÁ¾¿¾½¹·µ´´²°®«¨¦£¡ž™”‰„}{yvrmfa]]\[YQLKPX_b^WNHFFEB=720135433568:<;98532344210138;>@AABDJQZ^][Y[`dgggghimptvyz~„ˆ’”•–—˜˜–––˜™™™˜œŸ¤©¬°µ»¾À¿¼ºº»¾¾»·´´µ·ºÁÅÆÄ¿¸±­®´½ÅÆÀ³¤—’”¨­©Žƒ~€‰•Ÿ¤ š“Ž“–˜—…|uuzztqptx{|{ywurnhb\XVVUSOKGFFILMMIFDBBBCDC>;7669;=<:89<@DEDDIPZac`[WVX[^^[YVX\aehlpuy}€‚…‡ˆ‡‡‡‰ŠŠ‹”˜›Ÿ¡¦¬³¶´±­««­®°¯­©¦§ª«¬­®±µ¸¼¼»ºº¼¿¿½º¶³¯®¬©¦¥¤¥¦¨ª«­¯¯®«¥ ›—•’‹ˆ†„‚ƒ„ƒ€}zurooqtwwuph`ZVX]`_[UNLMS[aeghfc^ZXXXXUROMMNNLKIILQX]`a_]]_aba_]YWVWYYYbknh`\^eltyuj^VV\beea\XWZ^acglruwy~†˜œ—‘‘“—™™—”‘“˜Ÿ¤§©­±´³°¬©¨©¬®­ª¦¤¤£¢¡ Ÿ ¡¢¢¢¢¤§©ª§£Ÿœ›œœ™•‘’“““’’”•—–“–ž ™‰|vw|€‡†zh[Yaltxxtomortqnllljgedfjpttqnlmqw|~}zvtsrpnlifcaaa`adimprstvutronmljgb_]^^^]]^agntvtqooqsrplgcaadfgntqg\VX_hs{wiXLLWbikdZSRYagijmqvz~€„ˆŽ”——”’’–™™–“’”™ž£¨¬­­¬¬«©©«¬«©§¥¥¤£ Ÿ £¦ª««©§¨ª¬«¨¤¡žœœ›˜“Ž‘“––’ŒŠ“—Ÿ¥¤˜‰}yz}‡‡}m_Y_m{„„}slkqx|ysmihjkmmljjkmoponoqsuvvspmmmnomieccdgknqstwz|{ywusrssrnidbbcdedehmsxywuuvyzzxtmgfkqv…‚yojkqz…ŽŽ„sc\`kw{vi[TWbqz|xtsx‡Ž’‘ŽŒ•˜˜”Œ”™Ÿ ¡¤ª°´´°«§¦§ª¬«§¢ŸžŸŸ Ÿž›šš›ž›šššš™—”’‘’‘Œ‰††‡‰‡ƒ…‹–“„vmjlt~„€r`RNWgw~|rf_bmx}yqiddgmrsrnmpu|„…ƒ€…ˆ‰…€{wuvxyxwusuz€…ˆˆ‡…‚ƒ…†„}yvurpnopqrsv{…†…‚}}~€~vnkoty‡…|pe__fs…€q_PKSalqndWNNWdntvvtqqu}…ŒŽ‹ˆ…„†‹ŽŽŽ‘”˜œ ¥¨¨¥¡œž¡£¢Ÿœš˜—™œŸ¡¡¡¢£¤¤££¢¢£¢Ÿ›–’’“””‘Ž‹‹‘•”‹‹Ž‘•šš•Œrgadnz‚veVS\l}ˆŒ†|rnorvy|}|yslgfjt‡‡€wqqw…ˆˆƒ|vrqqtwyzzwronsz…†…‚~}~€ƒƒ‚€}zwtrrtvxwusrty„†ƒ}xuvxxvuuwx|„ƒysons|†ŒŠsgaadinrtsqpomlovˆŒˆ€yx}‡‘•“„}z|Š’˜››š˜˜šŸ¤§§¤Ÿ›˜––••”””•—˜—”‘“•–•”’’‘‰†…†ˆ‰‡…ƒˆŠ‰††‰ŒŽŽ‹†{tmjjow||wnebdkry|}~€{vpmou|‚ƒ~vqt{„‹ŽŽŠ‰‡…………„‚}{{|}‚ƒƒƒƒ„…†‡†„„…††…‚€}{ywuux|„…ƒ€‚‡Š‹‰…€}zxwxz|}~€~{wrmkknsy}{sjb_`cfhhhiloqqonmou|‚…„‚€€‚ƒƒ‚€~~€ƒ†ˆˆ…ƒƒ†‹‘•——”Œ‰ˆŠŒ’•—˜™š›œœ›šš›œ›˜“Ž“”•”’ŽŽ‘““’‘Œˆƒ}wrmlnrw{|zwttw|‚‡ˆ†„……‡‡…‚}wkx{{„uxŠ~nzu“aŽ€r„€n„tdqcmqfngyrdu{{sxl}¤s‹}h‚•q~ievwx†€hdpxw„†yˆx‘€…™ap€”{¥ˆ¯xƒˆ~‹‡‰µ¤ˆp|‰‰r¥s€“š~™|…iЇ{štxq}pluelˆ‰„ƒw~}‹’€”‘”¨„—{|x€t‡„ŠvŒ‡€|‰vš{‚u‚tod‚›ey„Y‚€j˜v[wqi†Œ|{piŽu€u{‹VZ‘txprwbpcsƒ…ƒ„{‡um}~˜yœ{|¤w”„“y‰ƒ“ˆ‡|}‘{}•“¥Š‘€}~Œƒ£Šxiykt|uvytpƒy„s“„p€|¢‰™‘~’—”‘˜k™¯†f‰p‰t{{h{‡r†xkt~dz’…qq†Œw‰‰vf„ƒ”„iŽ–†n|m€yyvŒot~iqtj|tw…Žƒq~}›ˆ‡‰v…{p…mv„Œ‡ˆn€„ƒzw…†‡–‹‚~…ˆ|‰q€z}‚vXte_romfd}|t|k|€…œ‘~y€ƒ{v|~‘•†‡…‚•ŽŠzk‚y}ˆ•j{yqew~u‹”„”‘‰…slvy›Œƒ‡ru{tmex{q‚xzw‘{o…x{Ž’‹y{…p‘‘ˆŒ†‡”Šœ£žŽ“ŒŽ™’}‡œ’„–’Ž…‡Š…””ˆw|ˆƒ~‚}„urxzmro„ƒ…ƒ…~‹r|‚|Š€€‡‡‘ˆ‰|Œz|‹‡iwz{wiativqlw`ialapkpeur{knospv}zyvxx|{gi|osw~zq|€€pxuzuƒƒ‰~y‚~~†~‚Š~Œ–‘‡‡Ž’…‡{Š„”’“Œ„‰ŽŒŽ“˜ž«£¦‡†txw„”†ƒxmmvhmeoxy|ƒzv€|ˆ„Š…—‰‘‘‰‚ƒ„Šˆ‹•ˆŠ†’’’~€…}„…†zw|n{zv€„‹„Œ‚Ž„‚‚„‡u|‚~r‡||x~v‚r{z|Š…ƒƒyk{kkvxrx€zz{‰}‚ƒƒƒ‚}y†‚€uxvnuzvƒx{x€~x‚…‡ƒ†wyvƒzˆ}}svrurrplekmoux{~yw}ˆ‚€‚ƒ‹†‚…ƒ‰‹„w‡„†…Šˆ|„€w€‚|€ƒƒuoqsy€‚‡ŠˆˆŠ†‰…~uvrƒ|w„zt|ssxn{ƒ…‹{surr{}~ƒ~q|ƒŽ‰ˆˆ‚•“™•‘Œ‚‰€‚‹Œ‰‹‡Ž‡“Œ˜Ž–’“‹Ž†‚…~{wyxv{}v}p|z‡ˆŠŠ‚ƒƒ~~ƒ†ŠŠˆ„ˆ~‚Š‚†{‚|||}uturxpldaddlfmkgimuzz|oplu}z}vwqzpvu}rzz€„‚~wtusz~€}ƒ|}€€ƒƒƒ‹ŒŽ•’‹’‰ŒŒ‡‹ˆŠŒ–’˜Ž‘ˆ‹–˜’މ‰‰‡‡€w{vuxz}uqmoowszzx}€Ž…ƒ…}x‚}†‰‚t}~‚„ƒ†ƒ„}†‚‚€t}{{{rimoptiglx…‡}ztmsw{zwq{v}|{z~}‹‰‹Šˆˆ‘’‹Š…ƒ|‚Š‹ŽŽ‘Œ‹ŽŒ”“𔓕’—”‰ˆ…‚ƒ……‡€x{‚…†Š‚€}‚‚|{vxv}{txpkrjnmjopk{{|}kkpy{|pjbjt}zsfdklu}uyxq€€ztoxv~~}|xu~||…{‚‚‚ˆ‹ŠŽ‰ˆ‹Œ†‹‹ˆ‚†{}‡†‰ƒƒ|€‚†‡‚ƒ„w}~u}yptwv{x~{}‚‚ˆ………„€†€‚…‹‰ƒwuuƒ…ƒ}tts†‹|{nntww{qnnq{rtpktx|…‚ƒƒ‚†Š–—––ŒŠŽŽ’”“š‘’•’–”‡Œ‰ˆ‹†€{stuswrokgkrsxuttsqywyy}vuy{yxssqrrsy€ƒŒ…{snv}zse\_`nuvqnfhqw…~~ˆŠŠ‡†…†‘ŽŽ–”ž˜›˜šœžž™™•Ž‹‘Ї„}zz}€†……xyvy{‚„ˆ……‡‡ŒŒ‰‡ƒ|~}ƒ‚~€|}}}zyrnstzz~}ng[dgnpkkacdqsumlgmnuuuroouxwtquy†…ˆ†„ˆ‹†‰…ƒƒ…‡‰‰ŒŒ’’”—––’ŒŒ”“‹ˆ…ŠŠŒˆŠ‡„‹Ž’Œ†‡…‡ˆ‰…|vuyuwxsoqrzzƒ†‰„~ssv{„ƒ{{nnnvyyslkjrvz}zy}€€xvtwy{{yuttzƒƒ‡„€…ˆŽ’Œ‰‡ƒ†‰‡‡„|ytz{†‡†„€~€‡†‡ƒzz{z}|yuvy|‡†‡…~„ƒƒ‰†€{{€‡‡‘Œƒ~~}€}{yy|}{urnppprnlooqtprppuuuz|}…ƒ‰ŽŒŒŒˆ‡‹ŽŽŒŠˆŒ‹’ކ|€ƒ‡€|rpnpsvtqoswx{zywwy{~}{xvuuvxwttw}€…‡yvqrrrpgedgkqonijqz„†ƒ€†ˆŒŽŒ‹‹“‘‘“”—™—š›š™™™˜šš•‘Œ…‚~}~{zvqrx{~~{xxyz‚…‰‰†‰ˆˆ‰‡†„ƒ‚‚„„…ƒ‚€|vruuxzxxvqomikimonmjknqqrlkjmqxvtqmmpty|~~xxzz‚„ˆ‹†}{xx{{}{{|}…††ˆ…††ˆ…†„†…‡Ž’‹Œ‹‹‹‹ŠŠ‹‘ŠŠ‰‰Œ‰†„{zxuwwz{ywxy}€‚„}}|€ƒ„{zx{{|xsooty…†„~~~‚~{yuwuw{‚€||y}~ƒ„…ƒ„€{yxxwvutuxz}~€‚€€‚€|ywvx{}€ƒ„‡ˆ‰‰‰††……„†‹Ž’““‘Ž‹‰ˆ……ˆ‡ˆ‡„‚€€‚„}yuqrsvxxxvvvwxwxwsutv{€€‚„‚€~~{|y{†|wt“”P{pkˆ‚[X€i‚†rc{•gh~k›}X˜„€£|Œi‹ƒ•­ƒzr†““wi^EIW|sƒf?'WaU8];38Yuw–­‹€£­ÄÈ´³ÓàÏÙýÿÿøÅÛØíÙ³µ·›¢†ÌÀ¢Š}{[zibg†gJX[x}h–’l–Ž’¬¤ µ½Õ³¶ÊÎÂÒͽ³¯™®´¬”ohR\dcj`V0RB=,>9IV86BdxDTa„v‡ˆi…“£¿¸«®·½´»·È¯³ž´¯º™¨“y|€‘~iak`5(5HC^KSO`Qali†§®¸Ÿž›² «ÂÎÝŹÌͪ߾ÆÊé­´³ªÀ¨£¿Â•˜qPNp|wWW%'1VT[_N"/1l^4K/5CIaVgplYa‘°š—†Œ–—»ÉÉÒ¯©·âسᏏ¹ÇØÒÚÊ™«´Ç¶¤«µu“~›ˆ‹waMgOUb^M9F=G/(-.:6;:;0I&&3PKFDGFo\[zdfm†Š‰’Œ|ˆ—œ–¤ª¦‹¤­¶¸¶¬·š¦±Ë±©¨Žš§¾¨ž˜t˜†‘|tl…q‚|gpeQLGf[U?&8+#FS97E/&E0:7,DIMLWC/9JCe]Z]_b]vtf€k„“™–¦§“ ¯¦¡š¾µ¥˜¢ÀµÒÁ¸«´¦¡²Åͽ°­·À»¼©«Ä°°¥´¶­­¨Ãû¾¯šœ—š––›}vmw~je^HQaTKFGAJ72ASU6'%!$EKE>7AFag_WQeVUWikpv_bk‚x†q|ƒ|€ƒŠ’¬™†Š˜Ž š­ª¹œŠŽ££¨³£ª¸¤£¨¯¸ª¥±±©¥¥Ÿ¬¢¥¡‹ƒ•‡€}–ptwld{wtj`]KKZiJeT8JM;U]NJYV=PHKILE9?CM9;?EWVJ620$:;33/.A96AA4*9;CXRPS;EZHEOQafNTWtm_njwŽŒ~‰†{…“–ˆ|zuЉ˜±™‹•Ÿ±§º´œ¸º¥­­¥®¥³¸¸ÖÀ¸¹¦ºº¾Á»Ê×ÚÌÈ­¢–§–«µ©²Ÿ•‘™œžªŸ¨”‹˜šš™—‹•…|ƒ†ˆ›˜€…†—„y…Œˆ†hblVVVje`jUAMFIKFJONJK@IEAO>*1 691GB.=@?QGMUINVW_^MJ9LTTemiZJTOZrstldraluy{_nulqo‚ƒ~vmsxŠŠ¥‘‘—Žª¥«›˜”› ¬”˜¥£¦¥¥œ¬·ºÁÀ¹¨¤™§¨®³¬®¡³®¯®º·¹»·½²°º¸¼¿²¹³°œ¢žž–’‹™¢Œ„ŽŠ‡‰o‡|ypglZXOqvjmh\dlrsngeniapcgoLYPRUWTVCLXIYX]V\bWaUHJFCSRJDTFMBYHFMXMWZbhaeYW`SV]_[WZYltqrumeflww~pcijbrvzyyrz†Š•”—Œ¡¸³¯±­¦¯š®²À¶Ÿ§”ž®œž¥®¸§™ª¨¬»«³¥­´»¶¯££˜§©—¥Š£›¦ª®¨©¦ŸŸ¥«©¢“’ƒ‚‰Ž†‰}}qy‚w€}}„‚ny€{~Œ‡|ldfkc_bZKNScdmklaF]^joofOPIagcdcdVRijkysimq{vthd`blxsz„Yhty{}oqr‡‘Šxobas{uxfPVNcgtedf_Tclv~hqdghpk^ceabkhp…|xiutq„…€tvxo‚ƒpfv~x‡{†„}Žšª¤Ÿ™Œ™˜ ŸŸ™‘‘–•š¤žž™›œ— ¬­ª®©§¥¬¤£ª•—ª–¤•›‚‰š™ªš˜ž™™™Š†zz|ŽˆŠ†Œ‡ˆ‹‹’ƒˆ”’ ž’ˆurdnlhhc`ceoqqkfbYfrsm^X_ee`fW^cfaentywz|zŠ~vioq}rqekmgnsxyviq…suxqhuuhqpec``nmfeedfoort€xptnnnshincllxš…{umlkŠŽŠ‚~uly†y„{„€…ƒ‹Ž™§¥¨¯­¥¡§§¥­§«¨¨¥œ—–‘™™¤©—›¥¬§¯© ž¡˜£¤•’‰Ž•——Ž‘’›œ›”™œ¨ŸŸŽ‰ˆ‰ƒ„€zvvop{rwuw|yyv~‚‡‹mlhl`c\b]]Zbj}skg_cdddfvptfd`e\clbgjom‚…yt‚}‚‹‰~„}|s‚„ˆx€ƒw~†Œ“˜Œ„—•’†y„‚~„ykmpohqw‚~|{}}~~xvƒxvwtsf`gez„Ž‘Šujmsˆ‚|uuuz‚yupiddkrxƒˆ‘Œ“‘˜™Ž’”‰™¤’•“††”š–ž¥›œ˜–“–˜ž˜‹“ƒƒ„‹Ž‰œ˜”žŸ•ކŒƒŒŒ‰€ƒƒ†‡‰“Šˆ‡Œ” ‰„xjegkfphbbmquuuohgemo{ulpajcddmnnkkp€„‹”†{„ŠŽ–Žƒ}wxnqqnpz{{„‚„|x€{€~€qpnqopysopztx||yy}‚{x}ytxsihlonrz„„zy|}~‚€vrt{}‚}…ƒvyw|||‚Œ’˜šš£¢››¢ ™™˜—› ˆŽ‚Ž”šœ›•’–˜’˜–‹Ž††…{{†‡‰ˆŒ™š“Œ“—–™—ŒŽˆ‹………~rnrsuq‚‚y{x|}‡Š†‡~v|trlvstimissz|„{{knmlqx|yuhhhbefkrkhx€ˆŒ…|€~‡ˆ‰‰ˆ…‡ˆƒz|†„ŠŒ–˜——‘•™Œ†‹|‚vxvtwwswvƒ€Š€x{x€€{ƒ‚yplhpp{€€}|‚‚‰„y…†‚…{wtt{€~omb`gtv‚ƒƒƒ€|ŒŒŠŽ‘‰‰ˆ‡‚‚~‡ƒ…‹ˆ‹ˆ”’ˆ„Ž“Žuk‡„žr›`o‚‡r‰”ŒŽ“Œ€}“ˆw‹‹™š€‡|…¢p‘‚ˆ‡ž‰«¥„ž’’Ž€‡–}‡oˆtx–~‡¨izŽŽ’€…~¬‡w|„vƒps¬|‹v‘šœ{µr‰™™}žx†aŠp`qO}WmzycyuxvŒ‡uitpŠzielk{`vZchkp}‚{lpujnjk„ihXseY\}‘awbodsast“Yƒ…vqhh‘sŠˆžµƒ§š~³‰•“”žœ‚{r‡}s…ƒ’†›—‰¡~™~”“w›v’xu†n‚†Œ„Œ¥…Œ‘–’•¢‰––‰xzn^†oalpn„z…q|{€|Šu‹|k~u†tމw‚‚› ~«¬’”€h¢nx”iz|€’~’z’}©’‚‹ž¥…Œ–…q‰‹‰™}~€¡¬•{š‰š…ŒŸƒprlwydqecfnywtc{n‘|o|btqngoz\]]nqmifqvq|wz~~tp€{gfckp_lYmjoro[zm–y‚„ok‡~ƒs}|‚w}hˆvŠ‹}’{‡–•†„~†sqŒ}yƒ”uˆ|w£‡‰ƒš … ——Œ„‰ƒ|”€…Œ’މ“‹‚~“‡~”ƒŠŠ£•†‘€x…‚†~”~š›’—’Œ¡‘šŸ—•›’ŽŽw„r„€žy–‡„‹‰Ž~ŽƒvŽŠvoyxso{|r€}~ut~zzysy^poayfetg{nkdviw€|{cwbghphkq\egtfy`kkqpulyays‚‡z~wypz‰ˆ…‚y|ŠŒ~…—†“–Œ~‰‹„‰x{x{…ƒ{…}†“†‘ƒ’†ƒ…†}{vˆw‡‚‰‹„†‰xŒŒ‹‰‹—𙂀psj{†xwrlqxp}zy|tqysx…‡Š}€nmŠy“އ‹€™“—¤“‡˜›ž‰ŒŽ‹Œ‡€ŠzŒŽ…‹–Ž™¢’•”†‹„rŽ‚†‚‡˜†“…€‡„z‚phlntkds_vwvvpfxkr|z|qihntlipkgpmguhooz{u}wtqqtwgnblix{pniiqpyvuuzuzzƒyx|„y{rwƒ|„„€{‚Œ†{‘ƒ€€t€o€}}Œ‹|zwƒx‡{‚†ŠŽ––•“• š€z‹‡‡—‹‚‚€~”Œ‡„wŒ‡‰~€z’†Œ|………••¢—Œ—Œ‘”™–—Š{{„†…ŒzŠ‚‡‹ƒŒ†Œ…†zƒz|ƒ|ywu€qov{tƒtxw|y{xvuvoqhopwzwyqxosn|qzoysrpoghoq|wwkbhkpnvstwz‚ƒ†‹~€|‚}‚‚‚€‰zЉŒ‚‰‘…‡Šˆ……„„‚…„‰‡‡‰ƒ……„†…Œ‡ƒ‡‚ƒˆ{…x|~{ƒ|{„|…}„ƒ€‰„‹ˆ……~‚ƒƒwzux}}}vsprrxu|}w||~†}}|xuz}~wzƒz‚~z}ƒ‡‹‰‚|„…‡‰‹ƒ…}~€ƒ~||}…Ž—’’ޔމ…Љ˜™„xˆŒ–‘ƒyy~€ƒyrmifpouvzzuwuv{|ƒ}~…€†…ƒ~|€„…ˆ†‡ƒ…‰Š†ŠŽ…|„€‚‚€~{~~‡‚trvyƒy}vs|wƒƒƒxxy|x|zxutsy}yzyrxxsldYbiwxse\^nkjgV]agt|}†~|„}€ˆŠ‹‹ƒ‚„ƒ‘‹‘“’—””š‘“ŽŒŽŒŽˆŽ‡††ˆ…€ƒ…ƒŒŠ‡Šˆ‡„†„~€~€‡ƒ‚|€€~}zwxquy{{xs}yƒ|l`Zcty~mb]cmpnnbfehhlhsppqmrss{|wxyw}}{{€‚ƒƒ‹ˆ‡„ƒ€†‡‹–‘‘‹‹”™ž™™•ˆ‹‹’“ŒŽ‘”“Œˆˆ…‹ŠŒŒ‰‚…}z‡…ˆ{|wsuvzv~‚ƒˆ‰wqfht|‚zsjdihlmnijfklqsusrup}|}ƒ~~z{~ˆ……ƒ‚‡‡‹„ŒŠ‘’Ž‘‰‰‚…‰Œ‡‡‚}~€†Š‚„ƒ‡„Š‹„„|y}|‚|{~‰ˆ†ƒ„…‚„‡‚‰ŠŽŒ|votˆ‰ƒ{tpmnpqppsnpnsqsrrtmppuy{~|zuz|ˆŠ‰Š†ƒ……ŠŽŽ‹‹Š……€ƒŠ‰’‰‡ƒ„†Šƒƒ‚‚‡„‚€}|~€„†‹‰…‚zwx{~€}xqkou{ƒ‡‡€wofhow|zwohb\_bdhjpqtpnrs}ƒˆ†…†……ˆŒˆ„~~…•š˜”’‹™—’ŠŽŽ‡‡„„Š‹‡…ƒ{„ˆŠ‰Š‹‡Šƒ…‚ƒ~‚‡ŠŒ‡‚|yvwzy|~ztrps{…‰†€uidcgnrrvojf^`_fnqrtpihbdjmpqqrtsztwvuvyˆ†‡‰…‚……†Œ“‘ŽŽ‰‘“˜–ž™šŒ‡Šˆ’Ž‹‹‘‘‹Š„†ˆŠŽŒ…€zxz|‚|wnmtu‰ŠŠ‚ypnkmpsvxutkc]X\akqyvsiccemu{„ˆ……~ywtu}€ƒˆ†…†‚€‚‡—˜•’‹ƒ„‚…††ˆˆ„……‚~y{~‚Š‹‹†„ƒ…ˆ„€||„ˆŒ‹‹ƒ~xz}†Š‡„‡‹Œ†€|yux{{{{}€~ztmlou{‚…ƒ~tmejmt}„~ytpouy„…ˆ†ƒ|~…Š‹‰„x|~ƒˆŒŽŒ‰zzw}„ŒŽŒ…{y{~}~€‚…ˆˆˆ†‚|zxwzy{unnps{‚„†}{uruuutsuwtvurqqrswyz{}}~~„†Š‹†€{zxy}‚‡‡‹‹Šˆ‡†ŠŒŽŽŒ‰ˆ‡‡…ƒ„‚„…ˆŠˆƒ€yv{…‰ˆ‰‡‚„‚„„ƒ‚ƒ†‰ŠŠ‚}vspqx}|zvuv|€‚‚€{ywsrrqrswwussrtwz{zzwxvvuruwxzxtrnotw}~zuqpv~…„……‡Š‰…}}„‹ŒŠŠ…„„…†‰Œ’‘‹‹‹‹ŒŠŠ‹Œ’‘˜–Žˆ„zogcafdb\RLGHKLMKGHR]irwvw~ˆ•£¬®®¬±¸ÅÐ×ÙÕÍÆ¾½½º¸²ªŸš”‰|uolnoqqqpmllou~†Œ‘”šž¢¤©®¯±´¸»¿ÃÆÃÀ¼´¯¬¨¦¡ —‘‰wogaWOLKMQQONJHJMRX]cdilsyˆ“—›œ¡¤©®´µ¶µ³°±´´³±ª¡™‡~xuqnmhb]VUSSUTSQRQPPPNLJKNWaksxz}}€†“™ ¦ª°³µµ´³±°°²´¶¹¹¸·³±­§¢¡ž“…uf_`hlnfVB509DMLD90.6EQVURMPYenqmihp}¡«¬¨£¡§¯¸ÃÉÈÆÁ¾ÁÅËÐÑÏÎÌËÌÌÌÈÀ´«¦¨ª¬ª£™Ž†€{voh]SNKKMOMJD?=9AEMTY\]\^ckt{€ƒ„†‰ŠŒŒŽ’•šž¡¦©«©§¤¢£¤§©©¤ ›—‘Ž‹‰…ƒ€|yusnljikjgfb`_[VNF@?ADIMNNMKKIIJMPSWWXXZ`cfgfehou{€‚ƒ„‡›¢§£œ”’”œªµ»¶©™œ®ÀÊÆ¹­¢¢­»ÇÌȾ´¯¬°²´°«¥£ŸžžŸŸœ•ŽŠˆˆ‹‹‡ƒxmb[XWYWTPKJJIFA??@AEHIIFCBA@@?BABA??DJSZ^aa`bjryxuqrtx|}yy{‹“š›—“‘•›¡¦©©§¦¦¨«®±²²¯«¨¨«°µ·µ±«¨§ª­°¯©¤œ•ŽŒŠŒˆ„~~||||}}|yvssrrmf]UOMNPPOMID@=;::<==<:87887531258=BFIKNQV^dfe`XQOR]kwzuhZNNZp†—›”ˆ}…•§·À¾·« ›Ÿª¹ÇÎÎÈ¿º¼ÅÑÜãäà×ÐËÊÎÓØÛÚÖÑÍÈÄÅÇÊÊÆÀ¸²®®±µ¸¸´¬¢˜Ž†‚€~|ytniffilmmje`^\ZXVUSPKGB>:88:<;73/-.1564/*$  #%# )2;@@@??CHMQSSRQPPSX\_`acfkrzˆŽ‘‘’“–—˜˜–“’‘’•˜¢¦ª­­­¬«¬®°±³µ·¸º»¼¼½¾¾¾¼½¾ÀÂÆÇÈÊËÊȼ´®ª©¬¯°¬¥œ’‰†‰’›£¦¤–’’”˜  –…€‚…‡…€ytrtwz|~{wrmhd`]YVUUUTQNJHGILOPOMJIJKKJHE?941122469>BGKNPQQRRRQSWZ\\[ZXVWZ_ekopomlnqtvwwxyy{}‚„††…„…‰–›Ÿ¡£¤¥¤¢¡¡£££££¢¡ŸžŸ¢¤§«±¸¾ÂÂÁ¿½¼»»¼»¸µ±¯®®¯°°°°¯­ª©¨¥£¡Ÿœ˜–“‘Ї„‚~‚†ˆˆ†…‚{vqljjjjihd^ZXZ_ejmnnmlkjhedddb_\WUTUUUUUWY\_bdb^[YXYYYZ\^_``^\YWX[`ehhhgeeeghjif`XTYPQ\`c`bdhsy|yxw~|€„†‰ƒ‚Š€ƒƒ…‡¥š¢—›“¨ ˆzqx†‹…}xƒ•£¢©ž¡«š©¯©¨£š§©«·¬ £¨¦°°³Èû¼Á¿¿®½¦§«¬¨ž¤Ž•…š”–ž›’šƒ…„ƒ~‚~}{€z}~~}iqflkrxyuuifojkkjedjnYS>4?HQ\SIE/-;I`n`ZU@IOWllXSWONV`c__SSeovwunqbmuhumkefjnoqikpty}‚…{z{xv‡}~‚psdk`un|x|w}}ˆ‰‹…†‡‡Ž‚…‡†‡Š‚Œyƒ„€šž§’ˆ‡€‚’”››‹†ztw‡–¡–ˆ|~…Ÿ©¤¥ž•𦣝° “™œ§¨Ÿœ’“žŸ®¤¬°£­©¬µ´¢ªžŸŸ–™˜“‹‹Œ‰š““„y†…}{rplifka^_[_fgtpomfc__kips~sdWGNKT]gmfYPMO\fpskd^SS_dfec^YR[^hnljijvƒ‚{}szz„‰„{‚xx„„†ŒŒ–ŽŠ”‹ŒŒ‹‚†ˆ‚{utrmrvuzx|{„‰‡‰ŒŠ‘‰ŽŒŽ‰Š‡|zŠ‘¦¡‘‹„‚Š–—–{ljlq}€€||sp}‚‰’’‘Š”››—–Ž“’𡢡 ž¢¨¯­¯§ª¥©ž¥œœ›”ŠŠ†ƒ†ŒŒ‹‹‹‰ƒ„|}}xyywyyuwwy‚‚‡{umorvyƒ‡ƒsiXTLT[bjibSLHU[jqsonfhahkjhmlmqikjou|‚†„|~ƒ{|usrttruxwv{}ƒƒ…ƒ€€}{„ˆ…}uvuv}~‚„ˆˆŠŠŠŒŠŒ‰‹ˆ…ƒ„~|utuyƒ‡”˜œ•ƒ~†‹‘’ƒxllqx‚‹ŒŒ‹†‡…‡Ž’˜¢Ÿ œ–’‘””˜œ–””˜œœœ›Ÿ  ££¢ž¡ž˜“‘‰‹‰Œ‹‘ŽŠ‡†…‚‚€€yxqooojnjnmorxtwuuolmptw€zqf_Y\`lt{|vne`bcjosvwuqlc\Z\cnv€‚~xpmnw‹’‰ƒ}|{}„…ˆ‡†…ƒ‚…Š’’Œˆ†€‚‚‚‚}vtnlosw€……ƒ…„ƒ†ŠŒŽŽŠ‡ƒyyz~…Œ‘–™”‡„€€€ƒ…ˆ…‚{vqnmmnpuy‡ˆ††€}~‚‰‘—š—’‰……‡Ž™¡¨ª§£™—••™™šš—•‘Œ†…~|y}}‚ƒ„„‚‚……†…„„†ƒ€~}|…†‡ˆ‡‡‡‡‡ŠŠŠ‡…‚††…zrmfdbfiossollmrv{}|zzz}~}ytqqv~‡‹‡€„‡…ƒ~zxvrnifgglqvx{ywsrppruw{~||{zyzy|ƒ†‰‹Œ‹Šˆˆˆ‡ˆ†…ƒ~|yxxttuux|ƒ‹Š†‚}€…Š‹‡{yy}‚Š‘‘‘‘‘”•”‘‘Ž‘’Ž‹‡†‡‰ŽŽ‹ŒŠŽ“‘Œ‰~yyЇyu–‰–všn‚Ž‹t‰}~{ƒuxjkkƒop‚rŠ€nxiŽxŽwy|’œŠz‡~bewtšr~vwl‹‡y‘r’w}“Z|zu~s†„©‘|Ž“‹}½£–¢Šƒ•p kmˆ‹‘ƒ¢w‹g‘~n‹}q•jyq{\kmfs†zqfk|lŠ|uj…‰Ž“zzartzy„†€z~†tsz‘„~h‡kbl„Œbr^ye^p^f‘ly—^z|tnqrr‹ŠˆŒ¢~¥‹‡°„‘˜š¨žŒ–ƒ„˜tŽ„‰‰wt‘jmzizx’k•w”zzt‡z‹Œv……‘pzЉ’Ÿ°Œ¢—“u„|¥ŠƒŽ„rwkvm||ubkdŽƒubymzŒ¢’œ›„¢•¤£Œ˜~­—€¤‰¡…†‰ˆ“œ’‚w‡q‚|{hf|†l„‰nd~zozhrpŒ„n„u…rƒt•}|wr}Œp€~nw€~ntsfviˆ}hqUlihhz|infsswjtoqutmyuw}š{†z„„{ˆ”‹~g‡‰|—}zti‡„|‰…”†“nŽxˆŒ—‚˜ƒ…Žˆ|‘‹ž™•|y|tŒu†€kq“wwv‚ˆm‰ˆ…}hwnyŽ}~Š€z}kooЇz‚…˜”‡‘ƒv„Žˆ‡‡ŒŒy„†{z€‰•˜š‘Ž—™“ƒŠq¤€˜|x|„„ˆ†”„„“„|€†}l||s…kfujquto|cyzo„ssƒy‡ƒ|myk~†‹v|rqr~t„‚knkxg~elkkmi`n]go|xvutuoy}xuzmz€ˆy‚‰}ˆ•‰˜”“™…ˆ‚ƒ~„„z|up|w||s~xtxy‡ƒ…€t{v€„……~}t‚††‘’™Ÿ§¦Ž{vx‰”ˆˆƒx€prkkqqw€}~„{„„}‡€‰¡Žœ˜”œ—’š£—Ÿ˜£ž¥¤¨–™““‹‡~…‰‹„rnrtq„z‡y}qyqoquvq|wvp}s‰yƒ„}€v…{u€|szpmwgsusprdpbkisuvijcqpqrsnfinjxkmmwxrztuy„ˆ–Ž“…‰}Œ‰„‡zz}wx}yu|wzz}ˆ‹’Š…€z|‹ƒˆƒƒ„ކ˜ˆ‹ˆ|Љˆ‡w{{x€v}quuyu{}€‚ƒ~Š~ukpgvpv„„†€‚v…€ˆ‹“‹Ž„ˆ€‘Š•—ŒŠ}ƒˆ‚™’’“ŽŠƒ‡||‚zz…ƒ„Œ€†x|wƒ†Ž”‰†…‡|w|qqs|r€p{qvqswyyw|tur{u~€‡„‡|€y‚z†€Š…ˆ…uu|yyxqplllntuuustswz{|~ywvpstwˆ…„‰„Š‚Œƒ‡†—–”Ž……|{wv{ywusq~uw{wvzytv~}xtu|swƒ}€‰‰ˆ‘”Žˆ~‚{{{}{~~€}vtvw{€€Œ‰Žˆ€…†…•Žœ™””’•’”•’œ””•‘„ƒuwvtx|z‚zyxrupmxtrvutqpormtrtv|{ˆ‡‹Š‡„„€‡ƒ‡…ƒ}ztwswv}z|ystqsu}†Šzuoturplhhjnmnpmhsqz~|}ˆŠŽŽ‘“ŠŽ‰ˆ‡†‹Ž’އˆ‡ƒŠ‘•”š™–‹ˆ‰ˆŠŠ‘”‘‘“‹“’‹–Œ‡†„Š…~ytqvqoskprpvrpoghtlnphjhgt€|}gfiq~~}unty|~usuuwxyqqotrw|{{{}|~Œ‘Œ…‚€€~€‚ˆŽ‹‡ŠŒ”““ŽŠ†Œ‚||}w}}‚{yurvux€}‚{xzw|y~†„…„~„„‡’˜‹|szv|zqld\behhab^\fcgkhioqyuu{xy~}~‚}ƒŒŽ•–“˜Ž–—— Ÿ”ŒŽƒ‡„†‚‡„ƒ†‡|}zt{|€}wzz~~~zrrpwx~{}y||ƒ…‡ˆŠ‚ƒ~|…—’†ylklw}|zpkdkkssvrrruyvzuxw…ƒ‡ŠŠ’•“–š›š—Žˆ„‚€„‚†Šˆ‹‰†„}y{~~~~~‚‚}zvz}z|~„‡ŒŠ‡€‚†††…†€vvstusvqnlns„‹ˆ}qickqtxogc_bielkfkjiqpqy{…Љƒˆ„†Š‰Š…‡ˆŒŽ’ŽŒ‡ƒ„ƒ†—˜”•‹‡‰‹‘’““’•““’ŒŽ‘’’Œ‰‡†„„}zxtwyxytvttoquswtrnnptyƒ‘Ž€yqnrz‚…ƒ€||}zzvttrurqojoqswxrrpmvz~ƒ…‡‡†ˆˆƒ†~~~|‚…‰‘Žˆ…†‰“”’”Ž‹‹…†ƒƒ‚~~{y|}{}yxyvyx{~€~z}y|€€~€€„Šššž–„|vrususrkmfc`_^abceaebglsv|zwzuxzˆŒŽ’””‘‘’‘•“‘Ž’““Œ…€~‚€{{z{{}|||z{zzvuqssw{~~y{x~~ƒ‡‡„€„„Ž“‹„zppqprrrrqqttwvtwvv|{|~~~‚ƒ‰‹ŒŽ‹ŽŽ””—˜˜“Ї„ƒ„„ƒ‚‚€€€€~{wvuvy|}‚€}|z~€|{}~‚†‡‰‡„ƒƒ€€~|ywuustqronoqux}~~{ysnmnnnqpommmprturrrrqy}†‰‰ˆ†‚„…ˆ‰ŒŠŠ‰ˆˆ†ƒƒ€€€ƒ„‡Š‹ŽŽ‹Š‡†‡‡‰‹ŽŒŒŒŒ‡…€€‚ƒ~|zyz|}zysrmnpsy|||~ˆ‹Œ‹…|z{{€„„…‚„ƒ‚}{xvvwvxzyxwtsportw{~€€€~€~}}~€ƒ……‚€~€ƒ‡†ˆˆ††„„ƒƒ„ƒƒ}zwvwxz{{y{||~~~~€‚„…ƒƒ„€‚„ˆ‹ŽŽ‹Š‹‰‹‰ƒ{wy}|{wtqpprpomgecgnu}~yusu{‚‰Œ‘¤l„€ŠŸŽos‚m‡Ÿq}Šœg…€n|U|g …r^“tš­Žmiy†uba28Ljeun60NfPKbO:Tj’ˆ³Ð±ª¶¿ÓÛ¶ÐáÁ×Þéþõ¦¼´áί°¬‹w ¡”‰nzNkjOb}{Ovs›•›ž~¦®¬¾¬¤—»·ÅÀœÁ´¨µ¾¯§›‹x˜šž•ulVX^VbwYT3M?2<>?VYCBN`}^^e†€—“lŠŽ¡Á± »£³°µ³É¯¡•©›± —“sbz†rkk`^BG?QTsGJA;TUJVY7]OEMMhboƒld‚£žšŠ‘š‘£ÂÈÍè¾°¯×ܼζµ·´ÂÛËÌÉ—‘¿´ ž«l|v‰—€pUVAPacCC7035&=9<43@69H12>PLOJBEfTCfXLaetvvtˆ•Ÿ˜¨¼¸–®²Äż³¦¾¤§¼×ÂÇ®¶“Šœ»®«£Œ€…‰zŒzicpShdQ_\LI@aWSO,GC.RbD@OB6U?PK6KGTRcT=>TIjo`n^ULemVxg‹ •›‘›’˜«£ ¡±¿²¢£Æ´Ì¸¸®º²­µÁÌÊÆÅÈÖÈѶ·ÆÄ½¸µ¯™•…š¡¢”z|l}‚nrjtdigPZXLJ:A>VK=FMYC$622^c_QB0&(86N\VOEMSII\YiqZaiŠŠœ„ƒ}{‚™²£˜ˆš‘ž¤²¹Å¹—Ÿ¢¬¯Ã«­µ®–¡˜¨š’¢¥Ÿ˜šœ¤–”šˆˆ–›…Ž‚zš‚rwg`vp~‡|oe^UetjxnRLJ7ELPFLL1,014BF6FJTEGM>YbRLIKIXIi_z}|qmi]iZSrkxqkZehjutpx|~y‰• ­˜©«¾³¯½ÁÓ¿±Ä·ÈÈĺ»ÊÃäáÐØÌº¿ÄÁÓÜʾ·³¹¸¨¥¦›¢¡œ’œ›­˜—•˜Ž~‡v†b€nofdebf[ZYcUSNQkSPZJIOK0>7A*-% +<@C;C=0@>UD:995$>ZXOd_llOKMflYndf|wg„ƒ’–†Š¡¢ •—•£¼®¢°£§®©¶²²»žÁÁ¼¾»­µ©²¶°É»¬§•¢¡¬ª¬·ËÎÃÁ¨ž“£°™¬µ²³Ÿ”Ž‰Žœ•Ÿ•Š”¢ž¥‘£‘†„wˆƒdvdfsj_i|wƒjhujjdynkvkP[TSPGPSPRRLINI`[FVEAD7;?%;=5IB5G==CGW[MPBQ\[iwsdUVOPcjql]safsrnx…~|}„…uupvƒtyx{‡Žž›¤¢™Ÿ•ž¦³¥¢¬¬ ¥§—®³¼¹··¨¯©¿ÄÏÎÈ¿­¿´·´´´­¬¦°©¢¨©Ÿ°¡´·¸µ­¬«¥§™”–Š•Ÿ‡|ƒƒ‡~…’wŠƒ{xvqkcTsrb`aOMZZTQLQ`a[wnasWX^c`f^YJOUPWUQMNRWa\LNRH\b[WXPPC\NHHW;BGMPY[UZ]^fmsqkojpunqxrpdkfvklqxmt{‚…Ž‹„ˆƒ‡„|v‚ŒŠ„˜–Ÿš§Á»³¾¬ª·§¡´¾Ë·ž§žž·°¸ª°°²±¶¹²«²­— ž’¢Ÿ¦›š—˜™”Ž™¢ž¡—ž”™™Ÿ••Šz€ˆ}ŒŒw|~wp‰“‘‹…tp__gdZUJNFHOVX>FASZhj`ZLY`gmu|bR]V\noe]X]fjvz|nqpvz~’poptafiXZ]kpuogaad†„‹hmhyzŠxrlj\bmrwlqetk~xlqwwqzqjus|}rwkWdkqs‚punxƒ|‹Š}†{†„}‡}~‘”œ–š”ž™ž¢ ¤¨  ž¥ ¥›’Š‘‘ž¥¨ž¨›˜££¡¸ªª¡œ¡˜Œ‘•Š–Š„Žž˜›œ˜’‰’’¡œ”ŽŠŒ‹…€ntqu|sw€†Ž•™›‘zwqrz|}wki\[X`_[gqso_`hrsgqbmouldhfeeiifjlp}}ƒ€u{yz~w€wptrtpbhumcori{}rsvsdil}usjh_dcb`dkqjgopqvv{{rww|ž†}rk]qvxs€‚v~uƒ‘“Œ‚{„‹‹‰”𧍝°µ¶²ª¨¨«ª±¶¤£¢Ÿ£¨ Ÿ§š¦Ÿš œ—ž›£žž•“’•‹~~†™— –’“—Ž’‹‡ƒ‚v~vunornooyz…“’ƒz~jj]heiac`i^MJ@NTX_`soukhlojs{woomnw~paqkozƒ~ˆˆŒŒ‘‡‘…‚€‚sbfo€{~ДޖŠ}{…‡ƒ„Ž„{vstu|xy…rz„|tnut~†“š—„xcb]itrx|~{{…trmrosw~€‚}|~txt}~ŠŽ‡Š•«™¡—”‰‘Ž›’•Їˆ’•—œ™–ž™•™˜œ’ŒŠ––†…Љ†ˆ‘” ˜œ›œ”‡ˆ’Œ‡„„trpttrqzˆ•¥Ÿœ›–…zuyy„‚~||unjec``cmow{tpxxwwxzvxso~vƒys|sdoy…—’Š„{|p{z|„wpooqsuoxyrzzƒzz~}|u~zuuztnnihnp}{x~|v}zsvvx}‡”…y{xsnidl{‡Ž‡‰‡{|}~†{ƒ€…€{~~Š‘’›ž¦©¨œ“šŸ’—™™ž˜œ–’Œ…Œ‘”Œ“”•“‘–“І’Š|‡ˆ„‰‹‘—–˜““‹‰„„†ƒw|}tspqrz…‰Ž‡…|„‚‚uqjnjhfkeg\efhktv{}t{ƒ{zqormev€†Œ}splovz…†“•Žˆ€z‚ƒ|{xyzvv‚‹††‹‹ŠŒŠ‡ˆ‹†…€…„€„ƒ„w}~…„‚‚…„ˆŠ‹†„wyv{|juww€}|{‚uvnptx}}{wsrmq{~{„€€ƒ„‹Œˆ„‰€z~~ƒz~||…‡€ƒ„‹‘‘‹…ˆŒƒŽ‡‘|“‘tpšƒž‡••—™Œž‹˜ƒ‹sovar˜ˆ”’‡¹†±sŽ™Œ«‡‰jq’sivtqk†stmt‚‘£¯|…ƒƒ]„ƒ‘¬“€ƒ€ƒ–£©‹‡€‡£‚j„j…wˆ”qyolyxƒn|syy|qyga€kdqjfnYUjc}^e~wnˆa|ww†rpbq‚_‚rfotmŠls~mwym‚™kykŽtm“…b|…vnk‚ƒ‡žy’˜“„‘‘u’§}£’¤Ž„zŠŒt‚†™z‰‡ŠŸ‹‚Œˆ‹r¤j†œux€’„Š—‡ˆ†•}t†}ƒ†„‚€‡u‰wŒrxy‚~q‰gowg‡{rrgmUrr„~…q•u{”{„™™’¢‡‹£n¤‰™ v¥™‚š”œr”¯•«‹¢ ¦Œ™u~‚ƒ~{ƒŒ~‘ž‰›“’‚ŽŠxƒ†Š|wu`fpzhcw_j~i~‡w•uwt…u€gmZkqTpcYxwwrxbloolcfeoqnckih]{qna€g€…wƒ†r~jd‚zƒzo~€tqbŠ}’‰Œv„ˆˆm|‹yx„Œ}†€€˜„Œ‹«Š–‡Ÿ€œ‡–Š•“‰“Œ„–€”“•ž™‹ˆ€Ž~{Š“„‰{z”{w“~‡—Ÿƒ‰œ®˜”}Š•ƒ™«Š‘Š“”‰ ‚Ÿ™›‘—~‡–|‚€‡‚‡wxrts‚{bpy{smo…hrnunid^hjskrlt_ijmtijot}zr|nlyf`rnrvwp`hb}u‡~p„s‡oƒvmzri‡kty}v}~ƒ……‡Š}{…‚‡ŠŒ”‰‰{|…z…„ˆ˜ŽƒŒ’‘‚Ž€€~~}†€‰‚”}{vƒ}”ˆ…v‚vx}‹{{{€”‡}zkrelw|…‹‘‚‡rqcos}ˆ|yy†}€yŽˆ”žœ•††ˆŽ’•›¢š–…€ˆŽ”›°Ÿ•˜“Ž„{Ž“–”ˆ‰}…˜‚Š‘“’€…‚{{x{mt|}qi{ceoyszxyyux~xstkrovlkpqqclqox|rqjhhnjkknkrgsomkhjgpqtrvu{y|~pqt{‚‡‡ƒzttw~xxy}|}zˆ|}‰w}v‚€‰{ˆ„|}‡ƒˆŠ“’‹™“ŒŠ“‹…Œ‹†Ž•–•”Š€{…Ї’ŒŠ‚€yƒ…’‡Š‚ƒƒ{’””Ÿ™˜Ž–‹ˆ‰„‰’–’”•އ…€€…‡‰‹xƒzyt}o|}~zwwtvypkiik{yv|xttqsplrmlropstoqqw}}~xw{{wo|xzoyzvxzxtqnutz~}‚}ttx{„„Š‹||„z~~„ƒƒƒŠˆ„‰‡ˆŒƒ‰ˆŒŠ‹„|~}…††Š‹„€…‚…ˆ‰‚~{x€~„{~}‚}ƒ„†wz|y‡ƒ„}~sy|€€|rxuqxuƒ}~{zuwpz}yƒƒ{†~wvvz‚~‰Œ‚ƒ{ˆ‚……Ž‹‰‡‚‹‰ˆŠ‹…ƒ…ƒˆ‡††††‰‡‡‡„€~…€ƒ†‡‰‘—ˆƒwpxƒŠˆzytzxssrqrrpuw}ƒ„†ˆ‡ƒ‡…Љ‘Š‹ˆ‡„‚‚‚€€ƒ‡ƒ‡ƒ€‚~|~~}~†„†‡~{yux~~ˆyt{y}~~z‚~€x|yxvwnupnrpmtooupnsw…„znc`ahrvwplgjjgvruzoy~‚…ƒ{~{y€€€€†„Љ‘Œ†ˆ†…‹“‘Œ“’“‘’މ’Ž“››—›ŽŽ•Ž’…„„†~~}|}{}uwrsrsty{yxllijrop|yz}mcZZ^fpozyskb^\_ckplsnllkiop~~|ƒ„{~†‹…‹‹ˆ…ˆ‚}ƒ‡Ž‘ŽŒ‰‡’˜•–—“’’Ž’—’Ž‹‰ˆˆ‡Ž‰ˆ†~~ƒ„……‚}{w{rrty‡‹Š~ticblsuxyolegbcdchintvrrljint{|yynrrx{‚{yƒˆŒ•‰‚„‡ˆŠŒŠŠˆŠŒ‘‘Бކ‡ˆ†„‹ƒ‡ƒ„€~ƒˆ…‹…‡†‚uulqy…—“‚sifdp}ƒ‰ƒ~vodbcjlvy}~zsnllpt|ˆŠŠ‡€|‚‰ŽŽŠ„{vzy„Š‘–‡~xv~‰ŒŽ‡…ƒ††Š‰†ƒ}{}‡ƒ…†‡‚„„І‡€{{z~~z{{vsjgikx|ˆŒ‰vh[^^hr}~vrf_Z\djt~…ƒ…€zprsyˆŒƒ~}|‚‡”“އ†„ƒŒš›‰‡…ˆ’‘šš“”ˆ‹’›—™›•”…‡„‚‡…„‚|{zvsvw}}~ywtngfirz€‰„ƒzqc\TZ^kw~~xpd[SV\`lruusie_^aiq}…Їzvy…‘˜™–‹„{~~…‘™šš“މ„Œ‘“œœ›–”Œ’“‹‹‹ˆ†ˆ…ˆ„Š‹‰„‚€‚ƒ‚€|}rplsx~†‘‰ƒvn_ZZ`hu{{vj`VQS^cotzzsopgghjsyyyzwtvsv|‚‡Œ‰‡‡ˆŠ‘’“ˆ†„†ˆŽŒ†ƒ„…Š’”‘Šˆ‡‹Ž‹‹‡~}|ƒ………ˆ‡‡†‡‚~}z~}‚‡ŒŒ„vqknu{„ƒ{wponmottvzx{ywumkmsyƒ‡‹ŒŒ„‚~}~ˆ…†…‚ƒ‚…ƒƒ{z{‚…†…‚~|z}€€€€}€||xyz„‡…ƒ|{yz|€€{}xzw|ywpllpv~†Š‰€ysljktuy~€}}vokjorz~ƒƒ†…~~{|~‚‡††ˆˆŠ‹‡†„ƒ…‡ˆŒˆ‰‡ˆ‰“–”‘‹…„ƒˆŒ‰ˆ†„ˆ‘•˜“Š…„‚ƒ†‡…‚}ytrtxyy|xwurssuvsrrrv{~‚‚€ztnlmnqrxz{{wtwrqsonlknvy{uomhkpv}ƒ„†„€{|€„‡ˆ‹Š……ƒƒ„…‡‡‰‹‰Šˆ‰‰ˆˆ‰Š‹ŒŽ‹Œ‹‹Š‹Œ‹‹Š‹‹‡„€~~ƒ‰Œ˜–‹ƒwlc^afmvvn_L=48?ISXZYYU[dp}‡Ž‘“– «¸ÀÈÈÉÆÄÆÆÅÄÿ»µ®§Ÿ˜”‹‡…~~}}||}ƒ†Œ—šŸ¥©®³»½ÃÇÌÐÏÎËÉÄÄÃÁ¼´©Ÿ”Œ…|uoke`[URMGEA@ADIOUWVTRQTY_iqzƒ‡ŠŒ‘—¦§¨¦§¥¦©©©©¤ž˜’ŽŠ‡‚ƒ€ztle_[WVUVTRMGEB??AEIMQVXZ_dlt}„ŠŽ’”𡤍«¯±´·¸½ÃÈÆ¿³§¡ž£±¸º¶§“|g[Z`iqxxkYF927DR\]WK?9:EUdnrnhcaix‹š¦ª©¨§©°ºÇÒÚÝÛÓÎÉÈÊÏÖÚÛÙ×ÑÏÏÐÑÒÑË÷­¦ ›™•‡ule`^][UOGA;86631/+("!#'*+,,/4:AFINT[ahloporv{…ˆŽ‘“”•–˜œ £¢¢Ÿšš˜™™™›™—”‘ŽŒŽŽ‹‡‚}yttqolhc]XUQNMKLNV^_]TJB?BL[hnlaSB89DVhvxncYV[jy‰•™™”ŽŽ– «µ¹¸°©¦ª¶ÄÏÕÔÌ¿¶²³ºÃËÏÌǽµ°¯±·¹º¶±¬¨¦¤£¢¡žœ˜”’ŒŠ…~wojda^\ZUSOLIHHHEC=84112455689=?@@?@@CCEEHKRW[[]_``_^_bgow|}~€„‹‘˜œž¢£¤¤¥¤¤¢£¤¦§ª¬¯±²³³³´·¸¹¶¶´³±°®«§¤£¢¢Ÿœšš ¢ ˜€upr{„ˆ‡}m]NHIMTXYWRKD?=>@DHKMLIC=8336=ELMLGDCFKPTY\^``aabcegijjjmptxz|}}|||}~€„‰“•”’‘’–›Ÿ¤¦¨ª®±µº½¿¾¾¿ÂÅÆÉÉÇÿ½»º»¾ÀÁÁ¿¼»º¹¸¶µ´²°¬«ª©¨¤¡žš—–”‘‰ƒ|xvvyyxskc\VTROMHEBA@?=<;::8766888642.)'%%$%'+.49;;9531027>FLOOKFBACHPW]`dgjnruy}‚‡Œ‘•™››œžŸ  ¡£¥©®´¹»½¾¾¿ÀÂÄÆÆÄÀ¼¹»¾ÂÅÅÃÀ¾¾¿ÂÄÆÆÅÃÁ¿¾¼¹¹·µ²°­«©§¦¦¥¥¥¤¢ž™“Ž‹‹Ž‰ƒ~zyxxxwutttutrokiijlmnlga[VRQRUWWUQMIFEEFFEB>:76668999886788889:>BFHIHGFFEFHKNQTVY\aeilnqqrtvx|}{yxwz}ƒ‡Œ‘’”•˜›Ÿ¡¢¤¦©¬®®­¬¬­¯°³µ···¹º¼¾ÀÂÃÃÂÀ¼¸¶µµ¶·¶´°«©¨«­°±²±¯¬©§¥£¢ œ˜•”’’‘‘‘‘‘ŒŠ‡…„ƒƒƒ~yuqomlkkjihgfedcc`]YVUVXZ\]]\[YVROLLNRX]aba^[ZYZ\]^\ZXVUUUWYZ[[ZXXYZ]ekkeYNFDJUbklfXKDFP^jqrle`_dlrwxxvutstuy}…‡ˆˆŠŒŽ’–™œžŸŸ ¡¡¢¢¡ ŸžŸ¡¥©«¬¬«¬¬««¬¬­¯°²²²¯¬¨¦¥¦¨©©¨¥£¡ ¢ª²¶²¨š†ˆ’œ¤¤›‹zpow‚‹‹„€€‚ƒƒ~|zyz{||{zxvwxz}~~}~~}{yxxyzywsokjjkmnnmjfb_]]\ZWRNKJKMNMKIFEGKQUXY]ab^VLC>@IUage[MDAENYbggd_[Z\ahmqrqnlmpu{€€„‰•™›™–’“—›žœš˜——˜œ¡¦©ª§£ žž ¤¦¥£Ÿœ™–•–—™š™˜˜˜˜™¤©¨¢˜Žˆ‰™¢§£˜Œ‚}€†”˜š˜•‘ŽŽ‘’’’ŽŒ‹‹‘’‰††‡ŠŽŠ…~zvvx|€|vokilqw{|{ywusqomkjihgfeeefgggggfhlookbXNKNV`inmf]TNNU`n{ƒƒ|rhbcgowƒ‚~ytstx}ƒ‡‰‡ƒ~zxx}ƒŠŽŽˆ€xssw}„‰Šˆ„{yz}‚‡ŒŽˆ{vuw|…‡†„}z{…‹’–—–‘Šƒ|y{€‡’‹ƒ{tprw€Œ–œ™’‹…ƒ…Œ–¢«¯®§•‘’— ©°²®§ž—””™ž£¥¤Ÿš•‘‘“–™š™•’ŽŒŒ“––”‰‚{wvx|„„‚}vqnmpt}†‹Š‚teZUW]fotsng^WRRV^hputph`XQNRZfqy|yrib_cly…މ€umjls|„‰‰„|uqopu{„„~zxwxz||{xtrqqqqpooqsvwwtrpuŠ‘’Œtjeeku€‰‹„zqlmtŽ™ž™“ˆ…†Œ–¡ª°²°ª£œ˜˜œ£«±µ¶´¯¨¢Ÿ £§«¬¬©¤Ÿš—••—™œœ›—’ŽŠ‡†„~zwvwz}~}yurqrtvy}€|ungb`_`chmruuqja[Y]fr~†ˆ†ulggmv†‰‰†ƒ€|zz{~„††…‚~yvuuwy|~€€€€€‚„…†ˆˆˆ‰‰‡…€|yxxz{||{ywuttsrqrtz†ˆ‡yqmklotx{|||{zwtrru{ƒ‹‘‘‹€uljmvƒ˜›˜‘ˆ€{z}‚ˆŒŽŒ‰†„ƒ…ˆ‹ŽŽŒŠ‰ˆ‰Œ’“’ŽŽŽ‘Ž‹ˆ††‡ˆŠŒŽŒŒŒŒŒŽŒ‰†ƒ€~|{|~‚…‡‰‰ˆ…‚~‚…‰‹Œ‹ˆ…ƒ‚…‰Ž“––“އ€{z|‚ˆŒŽ‹…yvvy|~|{|}‚ƒ„‚|zyyyxwvutssttvwyzzywsrrtx}‚€|vqmkjjkmnnnnoonmlklnqux{{xtpoptx}€~~}}|||ƒ‡Š‹Š‡„‚ƒ…‰‹ŽŽŽŽŒŒŽ‘‘ދЉ‰Š‹ŒŒŒŒŒ‹‹‹Œ’”––•’މ…„†Š“–—•–Œ‹‡‡‡™Šy{~kmq™g~…‚‘ˆ‘svs‡}€|Œ€v|Šu{xzko£q…ži‰‚šqˆhqov…€sjuunvqm|€‹„˜`p€…~Š`ƒ†®”x{{sƒ~s— †–†Ž—Œw p”ˆŸ£†|{€ˆw“‡q|zqZiqje…„zmepq€dn}~‰˜o…{kxuqxuƒeƒsdq|n’prliij[z“hwˆ]€sj‘{^Іq~fxm^‹ƒŽ‘Чt¢y¥–“˜’Š“Š{~‘‘Šž‹ŠŽŠp‘|x¡~Š fqfzh}…މƒt~~{z‡•œ‰‡wŠŠŽŠŠƒ”Ž–“‹’‰Œ›—Žš‚š›™ŒŒt¢ƒ‘—¢Œ•™‡‘œh’šxƒ‰\™„n„yq‚du‡fzehp~^†f{s_enqfkqgNgoh|pt_u‡z`pbw{qm{cgvjkf^tclum~€t‰mslˆ€‚|v…kupesjƒ„„†uƒ‹‰€~‚ˆˆŒœ“‹~Š|‘}І’ru’‹ˆŠ„–˜™’~Ž™“”ˆ™•ŸŽ‰†wx‹us†Œ†‡}ˆ‚ul„y…ˆ¡~“Š’v–„˜ –“‚€‡~‘Šy“›‘’–†~‹ˆ}{{’~z{Š|„ot‚nˆzrsckzg}†uqvq}~vˆm„s}q…j~…y†‰‰ƒvuosz‡|aitsotr‹vvrvgtjk|x{rxtƒm}{ˆyxx}Šˆƒ‚†sn‚vŠlƒw||tp€w‹z{†qƒu†s„€yn}x{š{†ƒƒswqwns{‚Ž˜™‰ƒ~{{‚zŠ“˜‹ŒˆŒy„…ƒ•‰…’’‘˜††‹y„†ˆ“–Ž“‘Ÿ‹Žƒ…˜œ™—𢑔˜˜“˜›— ”ˆyˆy…‰‡†{{hpquy‚wtst‚}~…}q„u~}zsrvqr|qultxqtxfhhqnsu~njsfrqjuszuqdpgcji}gs~}j„tzvup|m{vn‚tvzul†pxƒt{nxus{oozjmss~}†‚Š‹ˆ}‚x€„‚‹Š‹’œ–—Œ‹€ŒŽ—•š•–•ŒŒ“’›Ÿ¤£š—˜””’’Ž—ž©¡ –—–Ž˜ˆœ•†Ž†}}‚tƒ|u~ypldnplvusmtmnsqhkjlqrprjyxq„~‚{wsernv}~|phomsuuq~yuvnwppyorxsr|{€|}~{uƒ~€†ƒ~zp~y…~Œ„Œ‹…€|x{uv~{y~‹€~}z|t~|…}ƒ‰†ˆŽŒŽ‹ˆ‚Œ†‡„Š~tz€}ƒ‡…„‚}{||{‚€ˆ{„ƒ‹ŠŽ‹~|sywyƒ€‡ˆŽ—ˆŒ‡‰‚ŽˆŒŽ‹…€€}€†ƒ‚ƒ}w{xsspronssrtsu~ƒz{xszuz|ƒ‚‡€…‰€†Œˆ‰‡ˆ||z{€~v~|z‚Œˆ‰ˆ‡}|lknmzƒ„–‰‹†…„‰…†ˆ|‹}…‰…Ї}…{xysrzwwyvt}€‰…}wogjliooooqq{svurw|xywxvw{wyv{~‚ƒŠˆ‹‡…‡†‚~~„‚‰…†„‰Š–“˜’‰‚|~†‹—šŸ˜’’—š•”Ž„|}|‚ˆ„…~ƒw{zz„Œˆ‹yigWagsz‚‚ytnihjdejdgmn}~‚||xww~{{zz{}y†…}…ˆ‹Švszv{††Œ‡Š†Œ‡‹’‹‰ƒvwspyy}|}€~„{uynprrjqkoyƒ‹ƒ}xpgomuzytttruqrotu{€†…†‡‰„„€y{uw‚ƒ‰—’‘•‘•‘Œ†…ƒƒ„‡Ž‘•›•𔕔”‘‰Ž‰‡ˆ‰……‰ˆ‰‰ƒ€ƒ{}xuppmnotx{‚€„ˆ€vjc^]]`ekns|zxxposnnqotrrvx{||~~‚‚‚…ƒ‡…‰€{tpnv~€ˆ„‚|~yƒƒˆŠŠ…„ƒ„‡‰ŽŠŠ…†ˆŒŒ‰„€y~~…„Šˆ‹‡‡…ƒ†ƒˆ‡Œ†ywnrt…Ž…€zwonort{€ƒ†‡Š‚ƒ‚…Š„…ƒ|w{v}‚Œ‹’Œ‹‡}~ww{{w{wxz|‡„‰†ƒƒ‡€…„ƒ|ywxwyyzx|xwz{}|}wtnklmsz„ˆŒ‚}snhfhqux|vtronqqw|ŠŒ‹Œ‰ˆ…„„ˆ„ˆ†ŠŠ‹’–˜™˜“Š‚€„‰Š‘”“•“Ž‹‰†}uvt{…‰‹Œ†„~zwyvvtuqqposuvuwz‚wsg^UUU`mu|€‚€|wpnmorxy{|x{{{„…Œ”’”Œ†‚z|}ˆˆ‚€~„‰‘”””އy|…‹‹Šˆ‡ŠŠ‰‡‚}yuoprxz‚ƒˆ†‡„||z}€‚…|snkfiotz€€€yrjhdejnw}‚‰‹ŽŒ‹ˆ‡„ƒ‚~€€…‡ŠŽ‘”•’‹}srpwx„ˆ‰†„~ƒ„‡‡„yqninnx{{z{vwwwxxuooijhgijq~ƒ„‡‚~umhginsw|~}~yxwuz~„‰‡„ƒƒ‡‹“–”˜—˜š› Ÿž—“Їƒ„ˆŽ—Ÿ¡Ÿš–ˆ„~{{z}€‚‡‹Š‹Š…„}zwsqnhhffkqvz{{xuwxxtqkf`_[\cjrx}}|umiihjmquyxzyx{||}~}||xxuxy}~ƒ„€}}~€‡‰ŽŽŠ†‚€ƒ‡Ž‘’ŽŒ‹Š‹‹Š†ƒ~}|}ƒ‰ˆŠ‰‰ˆ‰‡††‚€€€€€~‚‚†‚ƒ}{wussv{‚‹“•ˆ„€}{z|„………ƒ‚‚~}{zupmkmsy€„…‡ƒ€€‚……†ƒ‚zyvvw|~|xurqqrrrqnkhikpu|}~{vqnmortwwwwwy||}~ƒƒ††…„‚€‚ƒ„‡Œ“–•”’‘‹‹Š‡ƒ}|†Ž”—•‡€zy|€†‹ŽŽ‹‹ŠŠŠŠ……„€~{wusqtty|}~|{{{|~|{wrnlknqw~ƒƒ{vutstursrpstx~€‚ƒ~|{{||{xvqqqsw€„€z‰†Yƒu—‚’¢icˆ„˜’‚‰‰•†xŽr¦‹hyy r’r€—«µ’€ƒ’œ”veX5>Kdjx^9*aZVH`CPNgx‡›µ£¤·ÃçØ¼Á󾃯éëö⮹ÄÒណu‹f¡œveM/N=M^zi[jLq{kŸœ~›§·«œ«Âϯ¼¾¸»´µ­¦ ƒ‘”•‘k\Fd_bgrWP6FJ>2D?SdDLOvZst’‘¢¬ ”›ªºÉ»»¿ÈÕºÒÓ̦ܿ¶¿¼¡¶ž„†|‹…piuoL]Fih[R9E=<8PW[zUc\_[nmepxŒ–ž•Ÿ§µšš§¥»§œ¶¯˜»¦ª¼Ê–¥œ”Á«¤©ª‡‘mf[‘|jV49B6/=NY\o]DM^]zv|€}w‰‚r’€˜³³­´¥°­¾×ÎÐÂÞÜÁ¿ÈÝÈÖ½·¹ÇÁÁÏ××Á°¬¼Å½»žµ™£’›–‹zƒ{ycRVS^\[aDD=FQEA=+(7)"$8%#0@A#*GSTB?+#5ALojWM>WOR[hikiWco‹†{ˆ•‰”œ©Â³¦­¢³¬ÂÄÓµª§ÂÇÎÑŽǬ®±¼Â¶·ÀÃÆÊÍÈɵµ©“˜œ¤’—„ˆ†™s~{pq‡Š‡”zpoXar…i„nK_[EgoUSZM,B5>@DA;>GN9CFITbP7B94K7]Uq_jR_Nbp[fqre`_TYjcjqfzltp}€y|n…‹u~‘’¥‹›ª«©³ºªª®ª·ÅǸ½¨«°¶µÌÔÀ»Ç®µ¹°¦ªª««±®«­´¾°©³ ž¡ˆŒ˜‰„kŠ}yx|s€†{oukecVhmVRaU\b]?VOA<<4636EE9-&(34.4;:B8/51$':HS^^RU?Pi^`fkmpTW_|sr~x„މ€‡†‚–…“Ÿ–“’Ž¡¥·Ç«°­Ÿ ¥®»¬Å¶ª¹É®²´´³´Ã»µË¯¬®¤±²³´¯ÉÏÞÔѽ­¤¬±¶¥·½§ª“‡Œ”˜¤¤†‡‹Œ……|{ˆ„}€{v{i€ra_pSBRXYZPPhVWR]VO\C9G=6067MJQMEFEWQ[Vde_cgomfZ^nZ^fnu||uz~txy†Žtlktwˆ˜• œ¡©¦¤žš‹†ŽŠ’œ¤’Œ‡ˆ…}šœ—’’’ˆˆu‚}‘˜“‘…ŠŠ™”ކ|peqw€‰„‡…ŠŒ‡ˆ…}zt|}ow˜Š‰ˆœ¥žŸ”Œ†ˆ–˜‘–”—ž–’†‹“Ÿš–ˆ…‹†ˆƒŒ‘•——¤šž¢’„ƒ†~~x{|‚Šˆ……ƒqmgooqnstˆ€‚‚x|usuzއŠqnda_ergprur{ubgqty{yq{xzt|~}s‡Ž…Ї„‰‚sgmu}ruwvzv‡‡‹‹yprrnhsyshginqooq}qsswkeRR[[mox€t{{zzutme`anmspinptwz‚…Š‹‰ˆ…|ƒ…‡‹Œˆ˜• ª­š™—Œ‘’˜ž›¢¦¢«¬¬³²±´»º½±¥§§››¤­¦¦£™¨š“–•Š‚ƒ†“Š‘ŽŒ„z‡‹‘’’Ž…ƒ‡~ojmq|yƒ‰ƒ€vvseojlprnmlnonmiln|wrq]f^bgsxyunsttxvwpgjhpsxvvwtxruuy‚‡ƒ{vtopqhhppox{}qqjjhgliimupx}‰Š’‘Šˆ‰‡Šˆ†~„”‰’“‘…qnu…“œ•š–ˆŒ––’—ž–—Ž|ƒ}ˆ…‹–—˜—‘‘„„‘…Š„„€„€ƒ‰†‚†ƒyywrvwsstƒ„†~‰ˆ~€‚‚}wrt~„„„‡‹…‡†‰…‘‘ŽŠ……„†„ƒŒŠŽ–‘††}ys{}ŠŒ‹–‘“Œ‘•‘—•–ˆ†‰†‡ƒ†„„Œ‡vogonvxzw{spttwyryƒxrdfjpwwu}~srnt~wy|qvrjmkkspxsytwrwospfoxuvsorrw}y{}|~€yhspt~z~‚„ƒ‰œŒˆx~sƒ‘†…‚yušŠ”ƒ„‚„rr›†š”ŒŒŽ“¦¡“°ž¤¦›“”´•𙓔®}“ˆ¸r”„€¡‡–wŽ–ˆ†–€—„œš˜~txj›¢«µ‘š‘¢o…„Š«—}€}‡y€—|oyrŒq]kF`O`ziksllcbW~rfgxdkv`Ztfgssil`Vui‚glpcaˆW~ƒzƒmg^n…]vdq‚n‡kt‡z}k}šv¡„šu“gz¡’•–›–˜„n‚ˆy|{u‚io‹„†wƒŽ‘}†ƒ•{v“€ƒž‰Œ…’v«”™foq”Š…zri€{nslhomqy|k„h‰ƒš‡Š…uŒ€~‰’z…ˆ…­£‹’„‹–ž£ž„µ”‹‹‡£™‘§™‹Ÿgƒ‰r†‰a“†}Š‹u‡ir˜‚—ˆˆ—¥sy|l‡†Š†‘v~Œx€y{emƒˆy~xpƒxrs^`|rtfhz]kriqyhŽ{‰†~ƒdn€Wp~`‚yf€xqkxeiuƒnU`T`fd\rdma~||p‡i{nnldqhp‡yƒˆ}“…n{•›‹Š‹eŽ~Š’u‰v~xxŒ‚†q{’“¤ ‘ £“¦Á¥ Ÿª°’¹¯²¶¶¦¶­®µ–˜¤œ’Šƒ£‡•š„ˆ„”Љ‡}…Œw{ƒƒvˆ’…‚qwnry}qouj{ynrTmivTqXS]_baV__Y_uqj[Qf_j|rhm]lrrsrlonik}gy€zŽ|pug{zvqwruketjqw}v|{ns€—‰ ŠŒŒš‡™„“—©¤¨¯¥œ“‘–——“‡„…ƒorumƒ—Š}ƒ€{{€su{‰ˆ‹“—‘—’™™ž”’Œ—Œ‘š•—”…“•–’qgxvw‚‚~y{†‡vƒ{tqw{klqjz~{zw|€{~z}}ty~q‚vx‰w…ƒx~rwrvzhieqlqswcggpr…ˆ„ƒ{p‚…‚‰’Œ{‹ƒˆ”‘™…„~t{wqm{o}p}rzw{r~yqusjtqw„x‰‰‰ˆ•‡†~€€‚€ˆ†–„~~uu{‡ƒ‹~{jleUb]eit}‚ƒrvo}n}x{y|€|ƒŒ‡‡‘Œ‰•‡‡†‰ŽŒž••œ”Ž‘’’„‚~†‰€}u„ˆ}ˆ‰ˆ‹Œ–‹‘‰‹ƒ‡””œžž—£Ÿ’‘’‹~|}{t€{|}vy{}‚x„€wsvjnox‹‡’……ww|‚yn{mlouv‚|wsrxpfjeae`cY_]efnpsitkjohhbdcolmw|x„vƒw€yƒ~€‚zw€€ˆŠ‘ŒŒ‡‡}zoqmv€Œ’{||‚‡Œ‘“‘‘’““™™›ššž¦¡¥¤¤—œ—’“‰ˆ…~ˆ„І”†ˆƒ€}€‚~ƒ~~z‚{„ƒ†ˆˆƒŒ€~{uuz|w…y€}€xvnqcgdhriek`ifjpw}~xrfgdir€zztyw}„~}tus|}}~Œ‡ˆ„{|ƒ}ƒxzyoxvy{|yvssozu€†…‚…~ˆ†’–šŸ–›––——•‘‘“”ˆŒ†„{ƒ…”‹„yqs‹ŒŠzxptt{{}utw‡Ž˜”ˆ‚z‚‚‰ˆ‡„…†„‘ŒŒŠ††‡‹„~xqxxƒ†„{~€…€uqxuvwtutr€ƒ‰€vwnqtuov{|x{|€{wsuu†‡yth[ns~vxkhZefokhfhpyŠxq~ˆ‘›–‘•†‹••Ÿž—“”›‡„‚|ƒŠ‘šŽ†}z€‡†ˆ…†„Œ‡†‰‚€†‰‡ˆ~€zwstrvuz{|~wspjfotvohVV[kv~sodZ[aisgae_jwtytlvtˆ‡†}uzz†––•”‰‹‡‘œ˜™—ŒŽŒ‹‘•’—ˆŠ„‹‰„…†…ŠŠŒ‡Š—”››—––”Š‰ŠŠ‹Œ„vmpv~„ynieoxy€|pj^cqt{spltx€‚~rumr}†ƒ…yqst‚ˆ‘’އ{yx{uzsvu|‚‚|uzy|€||pprw||„€xyy~|~vworsz|ƒ~y€}ƒ€‰‹„{pcil€‹‡xjb^iw€€~vu}Ž‘•“ކ‹ž¥ª¦¢”•–›¨¥¡š”ˆŒ†ŠŒ‡„‚†Œ”““‡„…‰ŠŒ‰ˆ†„‰ŒŒˆ††|€€~uupowwwyvrreafjyvmi]UX\ktssfWVQ\lopjea_gtv}xqkhnx„†‡€y|€“›š—Žˆ‡†‰Ž‹ŠŒ‹‡‚‚ƒƒ‚ƒ„€~}}†‰”–—‘“‘‘”’ŽŽ‰Šƒ€|{ƒŒŠ|m`_jvŒ•’ƒs`^ar„‰Œ‚vrrs„yvv~„ˆŒŒ‚‡€„„„ƒƒ~€‚‚{zw{|€€|}{ƒ€xwsnuxy||usmmuy€}wrqu{~ˆ‚~xrq|‰”ˆle`it‚†vdXV]gx~‚zuz€ˆ’••Œ†‚…‹—›Ÿ—–––Ž‘‘ŒŒ‡‡„†‚††ŠŠˆ‡ˆ†…††‡…‚|~‚‰Œ‰|wvtvxspomkqrvtppos{ƒ€}kaTT\l|††~pb`alt}~ypjiir|„†ƒ||z}€†‘—“Œƒ‚„Ž›Ÿ¡›Ž‡~{‚†‹Š††|{~‚†‡…‡…Ћޓ’Ž‹†…‰ŠŽŽ‡‹‰‹‰†„~yvv{‚|qlhmy…Ž‹wnnqz€„‚ƒ{uwzƒ‰Œ…vqpou|‚ƒ‡ƒ|wtvxz~{{|zsqnmpqty€ƒ~xrmmopprtwyzyvqttu{yzvsuy|~€~‚€€†Ž‘“†zsmw~†‹†€snkpu‡Š‹‡‡ˆ‘”˜—”””““™šŸœž™”‹‚}€‚ˆŠ‰‡…€€€„…ˆ‰‡…„€zwsuz€†‹Š‡}tpnquwxspnorttuttrprrvwwsnfdglry~{vsoonrxzyustsuuwy|~€„††„†…„ƒ†ŒŒŠˆ…„ƒ†‡‰‹ƒ~wqquv}‚€~}{~ƒˆ“–”‘‹†…„‡Š‹Œ‘Œ‰…ƒ€‚ƒ„„ƒ‚‘¤ž–ˆzqnprvpaXQQSUUXXUSPTX^aisz€Š•œ£¬¸ÁÈÊÊÉÉÉÉÊËÅÀ¹²¬ª©¦¢œ”‰vld`[[\]```]`dnv~…‰Ž“—œ¢©°·¼¿ÃÆÇÉÆÃ¼´ª¢›–Œ‡…‚}vpkkkihc^[XWVTUVY]ehlty‚ƒ‡‰Š“—˜›œŸ¥¬²ºÁÀ¾¹µ³´´³°©¡—Žˆ‡„‚‚~xrg_XQKIFB>;<;?ACJLPSWZ\^cfknr|Œ—š•—¤¯¹º®›Ž–¦³¹¶ª–˜Ÿ¨­©Ÿ•‰ƒ~zwutuxxwqidbbdfd_VQPSZagknruz…‰Œ”šŸ¢¥©¬°´º¾ÀÁ¿¾º¶µ³²±®­¬©¦¦¤£¡™™˜’†zspkga]XURONMJHC>92/.../.,.0569:>BDEEDDFJSZdjnqu{ƒ‹’•–•’‘“˜ž£¨¬¬«ª©ª­¯²³³¯­«ª§¨§¨©ªª¨¤ž—‰ƒ}wy{uhTF>CO^jiZF64=IYa_UG@CN\hlha[Z_gnojc^bmz†‹Š†„…Ž™£«­«§¨ª°·¼¾½¼¾ÀÃÆÈÉÈÆÂ¿½¼·µ²®¬¬«ªª¨¤¢Ÿžœš’Š‚|vvusqpmjgecca]VNB9200///-+)'(*,-01/+))08=>?ADMUYYTMILQWYWRPPXbmx}€€…Š“–𠣦©¯³·»ººº»¾ÀÁÂÁ¿¾¿ÁÀÀÀÀÁÁÀ¿ÁÉÍËÀ°¡›žª¸Á½®™‡~ž§¤–‚qffmuzti^XX\dgd^VPONOOLHA=;=BFHIGEDDFFFDA<98;AHORTRQRTX[^_``bdfjmrwy{|{yyz|€€~…Š‘˜ ¤¦¦¦¦§©ª­¯²µ·º»¼¼½¾¿½º·¹»½¼¹´°°±³³²®©¥¦§¨¨¤Ÿš——˜™™–‘‹‡†‡‡ˆ…„€~wqlfa]YVUTTSTTTRQMJC=978:<=<>CFE?70-0:EJH;,+8ENOKC>>DMV[^^^`bgms{ƒ„„ƒ„„…ˆ‰‰††…ˆŒ“œ£©¬¬¬¬­®­¬­¯´¸»»»º»¼½¾¿¾½¼»º¹·µµ³²²²´µ··¸¸¸¹¸·µ²¯­«¬­­«¨¤£¡ Ÿœ™•‰ƒ}~~{wuvy|~~zumgca_^\\\\\[YYYWTSRPNKGDA><;:=ACDCB@><;;;=?BDFGIKLLKJIJLMLIFEGJNRSUW[`flqrqlhdchp}ˆ‹„‚ˆ‘““ŒŽ’—›žž ¢£¤¤¥¦©«­­«ª«®²·ºº·´±°±³³²±¯®¬ª©¦¦§©­°±±®©¤ž›™šœŸ¡¡Ÿœ™˜——˜—•“Œˆ„~~~~}~‚ƒƒzvuvvvuvxz|}}{yvromjgda^ZWWY\accb`^^^_`_\WRPPSX[^^[WRONOQSTUSRRSUVVVTUWZ]]\ZZ[]_`abcccdfimiljr^lgmuvoqlippv}{}~„€€ƒ„‚~†‹§’”Љ‘¢¢§›“’Œ’˜–‘”†’šŸœ¡™—¥ µ¬ª­¦¬±½¶º²ª³À¿´¯§¥§¹º°±©¢Ÿ¯§©¢™£¢©ª —–Š—’›œ¨”†‰„…Їƒˆ„‚}zytowrxuy{o`cTgmnf[OPS\fWWJACRXjXL<;S\EGIk{G_e„…–˜‹ƒŽ£³Ãµ¼·¸Á¥¾Åϵ˧¸ÆÂ¥Á°“‘“ŽsfslJ]Igj^_?REA8NMNmCOQQMdid|ˆ˜³´¦£ ¡ž¹ÀÓ¼¤Â¸¢Ö˽×ɨ©£Ì³••—z…™tcV|{wreA>2?VRoeC?CjUOmPZaG`ak‹…]f€ž‘‹ŒŽŽ¯ÁÉÒ«˜œ´º™ªŸž¦«½·Ä±ƒ’››‡•\i‹||nH`U_mZR8=:B.+9ENENAE-F50FPL?4GHgPUtScn…€xŠ„“–›£¬³­›ºÆÃÆÊ»¶Ãž²Â˽¶¯®”Ÿ©·©¥£•„œ›”rkfsmurh{v_\LZWS:4:)@A(8"9>F`]OKHeOTZgnu}ns{„{{k|‹†•µ­•£¦–¨ ¾¾Ê¨˜·¼ÃÄÀ¼È¬¯²¾½¨¯¶Á½¿¾²·§¬©šž¥¥£–›‰‘›v}rs‹•…zuvdit…dzdD]]G_iXVgiCT@J:AICJVW=GFJRjZIVQJ\IfUkWeP`N^gS[gyhkg`Xwkrto|k{zŽŒ“y‚•™£‰™œ˜˜¢®¤¦¯®½ÅƲ¯˜žŸ«²ÆÎ·ª­ž¨±²£©¬§œ£¡œœ¦­œœ¦‘“ƒž€‡”Œ~n†uwtytv~j^iddbWnhPKRDNUR9TRI>BFEFKTH=2*/5C@94#<>PJCJE/2GOY]aY[Gbraddo{}hli†uy€„‘”•ŽŽ‘”£ž‘Ÿ£«š—˜ž¢­¼£®¬£¨¨¶½¥¾§ ­¾¥¥ª­©«´²­Ã±©©¡­¥¢¨£¸ÁǸ¸§ž’£¦­š«µ¡¦š–Ž•¥£™€‡’ˆ‹ˆz’ˆ}wvfszh~jacfMPf_gJNUSRF\RT\[?JHN<=LKJIG@7C6KE2>52?:3;&:<>GI6KKNOX^YIHBNTTZbgWOZ^^lt|ti‚xz€}ˆt}‰’“ ¡ˆƒŽ—‘«¦££¥›£¢³«¶º´·§µ²Ã¸­ºÀ´¸¼±ÁÅÓÄÅÁ³°¤·¹ÃÀ¿·®»°°§¦¯¨¬©±©œ¥™¬¡”˜‘‡‹”“”‰Š„}‡–‘‹}}‚ry‡n{tqqompi[qsdX^SWfngaUSUUNg`T_IEFPNSTPEHNLNPMMNPTUM5:<;OXVPJGC:IJAHYGMW^^fg__\b\cgngqnsxijsvs€|ˆ{ƒ…•‡Œ‹‹•’›•š™†˜¢©––”’•…Ÿ¬¥•ž˜žª¤š§¬Å´¥«¥ °¬²§«§¨¢§¥˜ ©ª“¡£™œ‘žŸ¥¥£šŒƒ˜ ¤•”{wy‹Ž’†ŒvŠŽ“—†Ž€ˆŒ}‚†ˆ‹‹‹Œ‚ƒŠ†‚yiqrs„ˆ”znbquxyrffomjesiajdiogc^_bbZXWYMYVZ[Xm]d`aA?FGTTVTNA>AMHLDCQVNVLTTffnqq\Xbmz|yp|uˆ…y{vtr†‰‰†{}ƒ…˜š‰‘‹ŠŒ’“Œ‘ŠŽ”’†‘–“ž˜¡Ÿ‘™‹ œ˜›Ž’Ž–•’“’›—›—§Š‡‰‘™•‹‹Ž’Œ¢ˆƒ~—’•†ŽŒ‹›¤¤–žŽ—¤š™™›šš ””ž¦¡™|‰‰” ’‹†{zywŠ„‘‚}vpz}…Š„ƒssnzumsvvq[_fqkVYKYgvqZTJR^dg[ZJJT`f_LIEQX_[]\WZhktiXZhj`mrl‚„}~{fqu‰…ƒvuu„„‰†‰‰‘‰„„ƒ}‚Š…Œ~‚“Ÿ•Ї‚†{Œ”’‡†ƒ„†“ƒ“““˜š˜‚‹“‡’‡€su|‚ˆƒ{}‚†ˆ‰‡†‡•˜”™š —˜¡“¤¡ž¡™•Ž›¢—•”Ÿ”‘–Ÿš™Š}„‹–’’•ˆ‚}ˆ‚Žƒy{}{z{uwwwsw‡wq^r}ˆ|rjpyqworshkfvsqcVZfjqwqhlmsv€raums‚x„ˆ‘‹ƒ„}‚‰ˆ„……’†uyy…|xsrhm|y…€pkqqst~„~}qoruwpvpep|z|qdfiyˆŠ…|ntltru{nptsuqvkqt€~€|~ƒŠ‹‡‰}Œ‹——•˜””›¬•œ•›’Ÿ—¢šž¦Ÿ¡ ¡œ™–˜—˜›˜Œ”šŒ‹‰•”—‘——†ƒŒ‰ˆˆ„Œ‹’™„‹šš“‘~x{~~wloru~qilmhlmvz€vtvsuxz‚ƒ~|~ƒ…Šwwyy…Šˆ‰€tƒ|’Œ‰Ž†msqt|€wysukslpx~rhgjmqrgjjfppwqotrrox}wvxrlpppxvztwsktrinpvy‚†||w„‡†ƒx~Ž›¥›˜–Ž——¤žš¢Ÿ™šŽ‘–‰ˆ‹†‰†|‚Œ…ŠŽ‚‚†„Œ‹Ž‹†„‚~††‹ˆ|€‚‡‘‰‹‡y‚~Œˆ„z{xv}€…††ˆ‚v~{€{|€‚ˆ‰‰ˆŠƒˆ‡„ŠŠ‘‰‰…‡†Š•–™ŒŠ‚|…ƒ‡†|…||xw~‚w€~wztpurwzxwy{‚‚|{z„‰€wqprwtmrvnofklkflmqx{vupnrzy~yvy}‚†€†ƒŒ‚yxw‡ŒŠ€„‡‹}‚„‚wzw‡‹‚~‚„~}xw||~‡„zy|}…‹‡‡„‹Œ‘Ž’‘‰ˆŠ‰‰‡ˆƒ…ˆ‰„‡‹”‘‰‚‰„„Œ‘‹‹””–•”™˜—•’”„–”•—y{Ž…„œ•“cŠ„{Š‚vއ~„‚{~wxrŽo}q{}us|†a~s}}“zzumsicojxŒaptrf‡wr‡n‰u{˜k†ƒw‚wsŠz„¥„~~ކ‹wŠ©‘‡›„•šv rv}’˜}¥s€`‰noxešgyuozqmmŠ€tmt€k“€vlw~’އisrx€Šˆ–…†ŒqiypŠzl_…lfp‡‹hww‘xop•q€™k“‚ƒ€z{™rŽ‚‰–m™‰}¦{~~…œ’Šnxƒz’‡’Š‘ˆ}—…ƒ—‚„¢k‹j‘|‚‹niv‹‹’‰qz]t‘–Šm‚kŽ’~ƒ{s™…„‘€ŽƒŽ›”„z£•Šw™ŽŸ£¨…™Žƒ›‡Œ~™š{t€`pZ€i‰d`fflƒ|mn…l‚|Šw_Zp|ez„jVwwk|logˆ‚s[qgzj{f†kljir|j{xnt‚u‚ƒ~‘{š„yƒhyxsp‹o|v€x}myƒ‚ƒŠŠ…ˆ“™Šz„…‘†‰x}†—šw“…™‚ƒ‰ƒ{¡™‰•|t‚Œ¨¦€†h“ˆ’‰ktuˆšœ‚ƒqtŒŒ•‚yƒyw™y’~‰¸‘—š–zމЉ“ž…‚„wzr‰…ƒŠv„‘‹‡{t…‚}wlrzh„‹pklbrjostekjgrnm\bNqp…nˆjffqmnoƒwnl{rplgxx€Œ…‡q‡‡ž{u…{{„€~‹x‰’…–†wv‡ˆ‰w„m|„†x{}y…w|}poxƒv‹t†‰”ƒˆnwz“•‚wn{‰––’ƒ|x‡~}{bkq‚ƒ†‰‰€w‚~ˆˆ’Œ‘‰ˆŽŠ‹›—™•š”šŒ‰–‹ˆ•Дޒƒ‹Ž‰„ŠŒŒz€qtz˜†~zl{‡~wqloq|stuqx}u~mpzixzvm€lolsyjtww|uvblkqn|rwyxr‹Šƒwlys€m{s}yyvzzr}r|q~q~drimovs‡„}vq€yˆt‚yzŠ{{~{~‡‰†Š‰Šqmu||Š‚ŽuzzŠ…‡yvs|‡…‰~Šƒ™‘Ÿ›š”’Ž•’’•’Š’™‹”•¢œ™”Œ™“Œ‰Œ”“Š—„‡ˆ˜‚qht€{‰„r}„‚€upuuxtmh{vvqxoyuuzvordgp`sglq{tˆvxyvpuruƒz~svwvƒƒ‚ƒynx{wtrzqyor~tr~‰|„vztxu}y‚‡{{~€ˆ†…††~|}‰|q„x‚†‹‰ŒŠ‚w‚ƒŽˆ…x|p{}‹†}€z„„}€‚ƒ…………ƒ…‰ŒŒ‰€~€~„‹†‰ˆŠŒ……†€ƒ}‚z„{zz†Š’†~}…Œ€‚w{}€Œ€‚|z}ur~tvtnwtt|ƒ|ˆƒ†{y|p|wz€{|‚~zv€{‡‹…wtv{‡‚‡„{y{Œ„‡…~z„}„€{€w„‚}~zw‚~|{‚ywxvqxvy}xx{v|€€{x|tnxusz{|yvzƒŒ‡‚‹††shgmyˆ†€}rx{ƒ†}|pu{‚€€{u}ƒ‡‡†‡ƒ†Šƒ…„„‡Ž’Ž‘“™ž””‹ŽŽ‡Œ‰‡‹•Ž’„މ‡ƒƒ~„€{‚z}v|‚„~{wurxvŒ‰|ekrsŒƒ~piaiciff_]dsuupeglpy{wukfsqy€‚‰ˆŽŒ„‹Љˆ‹†€|wy€„…“ˆˆ…ˆƒ€‚{€‚}ƒƒ„„{~vtmpnsw{~|‚ƒ’‹rjfmv}yynkjnw|‚qoutxysvsnxy~€„…†Š„†‡‘–‹…‡Ž•˜‹‰Ž‰†‰…€…ƒ…‡†…‚ˆ„„ˆ~}|zz€yxrv{z~‚€~€|z}€ˆŠzo^[eo~‚€xrhlos{qngjemlnss|v{vsy~~„xy{ƒˆ‘”’˜––‘ŽŽŠ‹……ƒ†‰™’Œ‰ƒ‚€ˆ†~‚„€‚‚„‚‡…„x{{ƒ}ƒ†‹‡{qkkv|‚ƒ|m``dmuztlkgmtw|ztqmlsu~ƒ‡„‚€‡‘˜“ŽŠ“Šˆ…„‚ƒ…‹†…‹Ž‹ˆ‡‚‚ƒ†€~€‚ƒƒƒ~‚‚‚}ssrowy{€„‡…“…qibfpyƒ…rf_`qw€wpaeksz}xwttt|ƒŒ’Œˆ…•”‘Ž’‘”•“ŽŽŠŠ‹‰ŒŠ‚~ƒ‚~~z|z€‚€zx{vxwyx|}|x~~€€}z†ƒ€pa`bjw}‡zj_`es|~{lbZ^lzƒ€uqot‚•‘‰}~Š‘šš—“”•——’ˆ‰‡Š‹‰ˆ„„†Œ‹ŒŠˆ„Іˆ‡~}ƒ„‚~€„ƒ€|}z{}~vzw{|}€ŠŽˆ€pjbkqˆ…uaWTao~}oe_blx‚ƒ}jdaoŽ”ˆ}~€Š‘—’މ‰Š‰…„ƒ„…Љ‡ˆ…‰‘‘І€€}ƒŠ„…ƒ‚‚‚~~z|~~zzw~‚†…ˆ‹Œ‡zrgfen{…ƒwja`cq|„‚yndagr|…ƒ~tpu‚››‘ƒ€…Š“‘ŠŠŠ‹ˆ‡‰‰ˆŠ…~‚~~€€~~~}zz}€€{ww{}~}z|{}~€‚ƒƒ}tmdejuƒ‹„vldfmy~€xrfgkq}ƒ‡‚ypntŽ““„|{~‡•˜–’‹‡€€‚‚„Šˆ~{|„ˆŠŒ†~‚…„„„…†„ƒ…ƒ…‹Š‡„‚€‚†…€{vv}„ˆ‡‡ztqrz~‡…~vkhipu{yzxrqnlmsx}zwv|„ŠŒ‰ƒƒ…‡‹ŒŽŠ„}{y{ˆˆˆ‚~}{{|€„…‚|zvv{††zvw~‚‡„}xuw|€ƒ}z{€ƒ††„ƒ}tnlpt†„€xnorx}‚„„„‚~yvx~‚„ƒ~€„ˆŒ‰‡„‚‚„†‰‡†‚}xy~…ˆ„‚~zzzy{}}€€}ywvx~‚„€~yz}~|}„„„~z|~‚„„}xusuy~‡‰‰zux}ƒ‚~x{|‚„‰œ–Žƒyuxz{|xnb[XXXZZYVUUW]binu|‡Ž•œ£«®´¸¾ÆÏØÜÜÙÓÏËÊÇÀº°©¡œ›˜’Šƒxtoomjeceghkrv|~€„Œ•ž£¦§§§¬±·»¾½¾½¹¶®§ œ˜•І|ztnh`ZWRPOKJHHGGEFLU]diknqx~ˆ˜Ÿ¡¥¦¦ª°¶º½»ºµ²°¯­ª¤›–Œ†ƒ|vqljfd`^ZUPKGIMSSOJGHPZekppsz€…§¦œ”“ž­¼Ãļ´««°µ¼½¶¯««­ª¦¢›–’’’އwplhcaabec^VOMNPTWVSRSX]bfjklnrx~„‹“–˜›ž¡£¥£¥¦«®±²°¯­­±³´²®ª§¤ œ˜“Œ‹…zuspojbWPKIJHFB@??=;744789:877;>CIPTZ^`abciov|€‚„ˆ‹”˜›Ÿ¢¥§¬­°±±±°¯°²³¶µ´°°¯±±®¨ž™•–˜™–ˆ‚|vtv|}ueTKLR]_\QC9789CMRQHABLXbeaYVZaltzz|~„ˆ‰ŠŠ’˜Ÿ£©¬®®°´¹¾À¾¾¼»½ÁÄÅÀ½ºº¼À½ºµ°­®¯®ª§£ ¡¡¡ ›—’Š…€ztpomibZSPPQQKFA<830.-.010-**,//01334469=BEGHIIKMPSWZ\aegjiimqy€‚ƒƒ„‰Ž—žžœ¢¨®±±¯°µ»½»¸¶º¿ÆÉÉÆÁ¾¼º¹ÁÈÈÀ³¨¥¨³ºº³¥—Ž•œ›xy€ŠŒ‡zojmsxwoeZVZbijg`[YXWVSNIDBCGKLGB>?FMSTQJEELTXVQNOU\bca`aeillljimqvxxyzz{|~€„ˆŠŒŠ‰Š“šž¡£¤¤££¤§«¯²³¯«©«¬­¬«¬­®°±³´´²±¯­¨¥¢ ¢¢ œ˜–˜™˜’Š…ƒ†ˆŠ†ytrwyywqmkmmib]YZ[[ZWUUWYZYWROLILSVTK>4/4?IMJ@725=BB>75;DMQPMJMU^dffbachoruvx|‚„…„…ˆŒŽ‘”˜˜——˜œ¡¦ªª¨§¦©®´´²®­¯²´´²¯°³¶¸¸··¸¹¹¹·´²²³³²°­¬¯±³²­¨¥¤¥¥¥¤¤¢ž™”‘“–˜•†€}{yvuwy|~~}{zyyyxtoifeca\VSRRQOKHHILNMID?=>@CDEEFFEB@@ADDCA???ADFGHHIIJNSXZZWRNQYckmjgefikmnprwyywvuw}ƒ‚ƒ‡Œ’–—–””–™ŸŸžžŸ ¡£¦ª®¯­«ª¬¯°°°°¯°²´µ´´´µ··µ²®­¯´¸¸¶³²³¶·¶³°®®­«¨£Ÿžš”‘‘”–—•”’‹†{z|€‚‚~xroljjlnppnjfcdeggfb]YXZ[ZWRNMMMMLLNOPQQQPPPONNOQSTTQMJILPRRQPPSVXXWUUWXZ[^chjjfa`djoqqnllkkkmptwxwuttw|ˆ‚z{†–Ÿ™Š€†–¤¤—†€†‘™•ŒˆŒ•œž›——œ£¨ª©§¥§ª®¯°±³¸¼½¸±­¯¶ºº³«¦§ª­­ª§¦¦¥¤¢ Ÿ¡¢¡—’‘•›ŸŸ›—”““‘‰…„„„ƒ~yvs{ƒ€tf`fu~weTTbsufQDGWgi^RMPWZWPJKQX\]\[\_aa_]]ahmle^[_flomihkorrolihgecdfijhd``cimooligfffhkmmljjkmpz„‚tc]duƒ€o][l‚‹nacs‚„zooy†Œˆ€|˜œ›—–™Ÿ¤¤¡œ¡§­®ª¤¢¤ª­­«§¥¤¥¤£¡    ŸŸ¢¤£ž˜““—œ  žš—––•”“”“‘‰‡‡ˆ™›’ƒz{‰–—Šxnvˆ’Šwd]ftzsf_blsri^Zboz{wrrw}€zxz€†ˆ…}vrrtvvtpnmnprqpmjgeehkmmjfcejptttsstsronoqqmiffjr„zhZWewwfWZk{}qbZ`lvvmgjryyrgaft‚ˆ‡ƒ„ŠŠ‹–›žž›š›žŸŸžœš™™˜˜—•“‘ŒŽ‘‘”˜š™˜˜˜™—”‘‘“–—–“Ž›¤¢•†|€‹”’†wr}‹‘‹~rpu}yx|„ƒ~xxŠ’”““•˜™—”‘“˜›š—’Љ‰ˆˆ†…ƒ~~~}yursw{~}xqnnswyxwtstsromllljhggjv„†|k\Zdpwrf\^gnmf_[\_aa_`eiigb\[akuzzz{~‚……„„‡‹‘ŽŽŒ‡„ƒ„…ƒ~~€€€€€ƒ†ˆŠŒ’”””“’ŒŒŽŒ‹›¡‘ƒ}€‰Ž†~|‚ˆŠ†}}ƒ……ƒ‚ƒƒ‚zwzƒ”–••–˜š™˜™› ¤¦¤¡Ÿœ›š˜˜—•“‹ˆ‡†„~€€~}|{{|}€€€~|zyxyzzywtswˆ‡}ocbgosrmhhjklmnmkgcabfmqpmfbclx„‚~ƒ†‡†ƒƒ…ˆ‰‰ˆ‡‡‡‡…|xvuvvusqppruy{{yvttvyz{{|~€‚ƒƒ}zxy|€€‚Š’”‘Šƒƒ‡Š‹‰‡…ƒ‚€€‚ƒƒ~~~€~xvy‚Œ“••”••••—šžž›™————•’ŽŒŒŒ‰…‚ƒ„…††…………†ˆŠ‘“•–”‘ЉЋ‹‰ˆ‡‡‹†~zyy{}€€~{xwy}{upnoqsroiegmu|~{xwwxy|€ƒ…„‚ƒ…ˆŠ‰…€{xwvvtrolllmpsuutronprtttuvy|}|ywvwxyxwwy|~}||}}~}}}~~}|{{}‚‚€}{z|‚‚‚ƒ‡Œ“”•”“‘‘“—››—“‘’””’ŽŠˆ‰‹ŒŒ‰…‚‚ƒ…†ˆ‰ˆ†……ˆŠŠˆ†‡‰ŽŒ‹ƒƒ‡‡—‚x†­“‚¢‹“Œ‚’†’w€{ƒ‰vf…np~u‚`xert¤‚}‰j—ƒ„eovxcˆyƒ‡ Œ€t\spxŽz{rm|–ww‰‰‡~„ˆˆ~£™š~Ž{ {ƒtc…|ˆŽŠthjqrƒ|‡jƒzvvtj‡}~yry†ZwYoZ^qkcuU`v{‚|lpq”‚q‡ˆ”{€¡z„tzgvwouio‚†yc”˜eyx}z‹|vs–‰}‘•|}w˜…w}†…˜‡y𑇆||¤†‹—Š„‹—‡„‹ˆ~¼™†š‰…o’‹q‡{…œ’{‰p’”’Š£r£Šš€šŒ‹ž†–Žx‘€†Œrš‹~ƒ€—”~tzŒy˜’v‹†y…pŒŒyo‚†n…†ƒ~‹„—pŠgv¢{ˆvf„h‡‚sz[z|ercUa`Sodbsnqkrx|sydzq…yod{†Šgs„fx}ln}gyrkvwf_zŠczŽtƒ}f‹ˆ†€“Šš‘z~‹Ž“‡„rsŽ…t…v‘‹Œƒ“•€‡„—”ŠušŒœ~kŠ|~ˆyŽn\‰zŒ‹‰^v|„‹Œ’š„¡¡«‹„“ž—…}n—˜Œ‹…~‡‚¥ ”‰„t…‘¥“…‰‹Ž‡ƒ„{Ž€‹Š˜ƒsux€‚y„tvysz|ppp†orzi~~w€Špglg}uhq`kƒswcux€„‹ˆ†ox~…d{~‹‡xq‚ewq{|bdfjswmwyvy|t‚temfy{{s~‚{qŒ‹vzw{‹Š”~{sŠ€†“…‚Ž‚“v€€†¡‚vuw{yxirrw„ƒ„vu{‡Ž…‰ž¦’††…’‰††ˆŒŽ“’‹…“‘›Šž’’–›—¢–›‘“‡–“”žŠŒŠ™Š‡}t†‰‰}|xr…}ƒ{ylts||ƒxmcetkpksi_jpurydno{~~y†‰ƒxxz~wn€qknznamddtptnvdndllqwjyqtzovnoswdvl|ryu…qyz‰}wz{}‚‡„yˆ†…˜Œ€z|z‚„‡…ˆ|„…’›ˆ†Š›•¢šœŒ•“¡•›‘Œ‚‹…Ž’‘‰ƒŒ†‹–ˆŒŽŽˆˆ„‚‹„…Œ‰~Œ†““’Š€‹ˆ‰–‡|††‹‡z}~ƒ{viwwwz~sp{qlnvpoirnslroqqqw{ƒz‚~}x†v{uywx{soqxty}volgzz|~zv{vx€ƒxw}}ƒ|ƒ{x€|‚†‚†~„}{‚|z|zz‚~„y€w„s€}~{sqqlwt{~yzvv~ˆ‡‡ˆ‡ˆŠŠ—“““””‘‹‰†~Šƒƒ€…}ƒ‡…ˆ†z~~~~‚~‚‡‚…‚}€|Œƒˆ„†zˆ„…„…€{‚€w{}‚}w{|~}€~~ƒzzxxx}|€‚{„‚„Љ„‹‰‘’’‡Šˆ‡‰…€ƒ†|ƒ}|}€}}srokrwv€|pljwxwtwussv€}z}v€|y{€‚€€}|y€z{ywx€z~ŠŽzoowtuomifehhqvpnhjr{€€~€‚‚‹‘‘Љ†ŠŽŽ’‹ŽŠ‘’—‘“Ž‘–“–‘’“‹‹Š‰Š‡ˆˆŒ‘‘އŒˆ†ƒ€ƒ†††}||yvz|{xƒ|oijjpnaaaZa_^ffdfecprwvx~‡‡†‡…‰ˆ‰ƒ‚ˆ†ŒŒŽŽ‰ˆ‡‡„…|zy}}ƒ…‚~|yxw|u|xryruw~wwtvuuy|xuxpuuxswvu|‡|urpwmjecegjnvxytwx}‚„‡‹‹‘’—“ŽŽ•’‘›ŽŽ“’“˜’“•Ž‹‹‹ˆ‰}€€ƒ†ˆ‚{ƒ‰‡‡„{‚„‡Œ‰„…|„~‚€|{|~{xurwst…{sc_egkfa`\]c`fmeeiekrqxtu|………‰‰‡‹†ƒ‰„‹ˆ‹†‰Š‹Ž’‰Ž‰†ˆŠ„Ї…‰‡‰‹Œ†Š‰ŒŠ„†ƒ†‰ŒŠ‡…ƒ†‚‰††††„…€}|y}z€~…‹„~pkdigg^\Z\ddotwonqt|ƒƒŠ‡‰ŠŽ“ŽŽˆŒ“‘’’Ž‘‹ŠŒˆˆŒˆ‡Š‡††€‚€‰‚zvxu|ywrty‚{vtvwx|yyw|zzwsvx|}…Œvnmnpnnf_`]cnuzzprv~މ‡ƒ‰‘”˜œ—™’’–—–˜‘‘•’ŽŠ‡…„ƒ‚‚‚€€}ƒ‡‡†ƒ€~€{}{}€}{||{|}|{}~}}yrqqquu|†ˆ|og]]_da`\UTXalurjeemy„„€}y~‚ƒŽŒ‡ƒˆ‰•‘•——˜—•™—™—–™”ŽŠ…ЇІ……ŠŒŠ‡‚†ˆŠŒˆ…ƒ‚‚~€„ƒƒ}zvtuxxz‚…sf]Y_^cbZTSW`pxztkho{‰Žˆƒy|ˆ’—˜Ž†€‡‘”މ‡ˆŠƒ€ƒ„…ƒ†ƒƒ|~|yxwttsqptv|zzuptxy{yxy{{zzutuv{|€‹„xpihlpnkc_`fr‡†€y{‚–š”’‰ˆŒ’›Ÿš”‡”š›•‘ŽŒ–––’ŽŠ†‡Š‹ˆ‚‚€‰Š‰†€}€€„„‚ƒ‚€|}}{zyw}~~~ytppqsquxtmga]]bcde_[Y[`nuvrolnw‡‡{yy~‡‹ˆƒ~xy€†‹Šˆ‚ƒƒˆ•—’‹‡…‰ŽŠ†„€„……„‚†‡‡‡‚‚…‰‹ˆ……‡Š‹ŠŠˆŠ‡‡„‚}~|}vqmhdeejmnmnmt{ƒˆ†ƒ€ƒˆŒˆ†}€ƒ‡†„€~‚„ˆ‰†ƒ}z{€„‰†}z}‚ƒ‚yzy||xuuuw{{}z{y{}|||}}zxy|‚{zz~€}~zxxvtsqstsqmmowˆŠ‰ˆ†ˆ‘”’‘ЇˆˆŒŽ‹ˆ†„†‰‹ŒŠ‡ƒ‚…‡Š‹…yux~‚…ƒ~€‚‚||}{yz}ƒzy||}~~|xvvxyvsqpnpnkggch…Rget†€}kntd‡m~‡žiŽ„xˆaŒp¨’piz’³©‚„”¨´—zHJXzkxu<2JjVYcO.FSq¡Ä± «±ÂÖ´ÒåÐèòþÿÿ¶È¼ðÚ´ª¡|{l‘“„sVa6Q]BZtw@^\a€„Œt›¢«™‘‹²²ÃÇ˼¶ÁÎǶ¬}¨§¯Ÿ}oWWcYdw[T/K1'60\S{|€MI1fg2PB1.8JCRbgK:\}uyks~zˆ¢ª³É¨ššÆÀ«¸¤¤›Ÿ«Á½ÅÁ—Œ¶¡œ™µzƒŠ¦•£€l^i\\flHE==;:2?;HLFM27:27H_XUL@GoiWmlXdi„}tyfq|{„™«š·²°®¬È¼²ÁäÉĬɪ¤¯Ï¹±±Ÿ“•¤ŽŒ‰z‰p†vhpodaYj\SO-F9%5H5*DC)7,)"FWIjjl}qsby€q‹¡¢¶£ž ’ ³¹´µÃÈ»£ªÒÃѼµÑÒÐÍÕÚÍÅÈÍÑÅÈ®ª·»§¢£¦’“…œž“ˆkn]mhoudJMM]LRF.;8<9'*#42(46?!CQUI@2--HHVilZOUZFAURYbSUYwkyagfpfuq“­¥ ‘¤•˜ž´½Èº™¥§¸´Ç«·¶À¦»´Ç°¢¹È¾¼ËÑй²·¬¦¶©²œ¤˜•™°szyt‘“ur|wuƒ…zql\\guotv]ECCDC?.6;O@=D5DPMICJLWSnclb[RXaUf\Tielg[Rd]gplfpoico|wƒ†•|p~ŸŽ€œŸ‹œš™ŠŠ›œÉÁª§›Š•§ª¿Ì½´¹µ¯·¸°²¹·»´®¤¨¤»¥¡œ¡Ž“•‚Šƒ•Žp‰€‡‚„…ttv„uqml€cW\SQ^^KSQZBC=7.8PVU>;//ABCG-32QHJGC70EMgQGJ>?ekZf\u‡rmq~„nƒ‡Ž”†pЉ}ˆŠz|‘–œ‡†~ˆ†¡´©š¤Ÿª±¥«¬§¶¡»µ´¡¦¥®£¨­¥¹´©£ «¥±¢¤­ÃÒÐÐó ¢°» ­¶¹¸¦›–˜Œ’ Ÿªšˆ˜•‹†™ˆŽ‰ŠuŒy”ˆsfhbR[mcdHGOSTAWMMUR?HELKK[SJICA>IGY_NMAISNTegUHPTX`gkdYnanumydp~‚†Œ˜¡‘Š‘Ÿ‘®§¨¨ ˜¢¦°§±²¬°¦°­»­§½Â¸´´¬ÄÍÚÍÉɹÁ¼ÌÇÈÇùŴ²®ªµ­¯§«§›Ÿ š«“ª¥«¥“•𙑑ކ›”Œ|~{€qvƒi{qlqmmjf`{|ofdZ\jmaXIJQUJ^SCP8AFKFC?B:AJFJQNOONQUR@@D>LVTQNHE:RJCDW@JTZY^_\_ilflmloz{‚}njes~vueys|„}}†„ŽŠ“–Ÿ£ š‹›¥£”‘•—¦•›¤³¦˜¨¨ª¸©š¬¸Ò®Åº¿±µµºµ³¬ž¡°·£¢›†”•¢ —ŒŠ…ˆ“މ•‡…€…ˆ†œŒwt|…}VXkvnuia]dek`dkkjgamfbjozgg_s~„€zm`jv}z‚rgoinyvrxx|{ttuzoulpqtlg^dW`^WXW`ckbSKQSiplqgVc`qx‰ucVa^fcUTTa`lZ^NKWad\kjlwrtqfv{m~zz‹Ž„ss~‡‚–™Ž—‹™œ”’¥¡¡¬ž§£ª¤™“™¬«©‹“šš“‹“”˜£¨¦˜ ˜Ÿ§§›­ž££ž¯¯–’—©š…zˆŠ¥ž‰w|““†ˆŽ™š‘wwqy‹…ƒ…€…Ž’Œ}„|†‹‰‘Ї†yvx††ƒ†„kkrwtgoalmqeZYVYXZ[[_ZWZX[`W]WYW_\eopmgYZ_]bbK7I[aufIENVQYSbfrnoa_X_hy†Ž„ƒŒ‘‹‡z‰•––Žš§œ•…ˆ†œ¤§¡¥¤¥ £Š––§±·©œŽŠŽ’œ™‰“ŽŒ——›™—””“––£«ªƒ’™ž˜‡lk€ƒ›uoon€zyƒˆˆ‚}uqmyˆ™‘†Ž‚~„Ž–™Ž€Œˆƒ‚‰Ž‹…ˆŒ‹}‹…ˆx€z|rtry{qxs~‚}xnz~Œ†|vwr‹ŠŠ†{sqd]rc]dij~zrV\ZjgioefnxwzcKTd|†…{…z‡…‚‹‡ƒ‚ŠŽˆ‚{~‚ƒ‹zƒ„‰‹||zu|{|vtfmkxwwsnoq}ruszz€‰’–ˆ||s€‚nkkq‡Œxicxp‚~|p~}Ž„‚x{ˆ˜ ž Ÿ¤«¯¬ž¡¦¥Ÿ§ª¯¬§Ÿ”šš“˜¢¥¡žŸ›¦¡£¥«£žœŸ–”™ŒŠŠ‰ˆ……ˆˆ„€†„‚}}ƒ”™–Œzont}rb^bq}mgLLU\cef`dcWcV_[]rvkttuvzulpovqxrvy~}shmqw|ylqro}}€ts{~ƒ~}roxuquuvƒ†{~~~Š‹|~Šˆ‘š¡’‰}{~„†€qq|‹•‡‚wu~І…‹ˆ‚‚{y|ƒ‘•–› ›“—œŸ™“œ£œ›‘†ŒŒ‘”“‹Ž‹‘…Œ‹‡ˆ…ƒƒˆŽ„t}}{‰‚ytsu|~{~zz~…‰‰‰‰|}xy}~‚|ywwoxtrltszsqkkilouwƒƒŽ‹’Ž‘‡Œ•Ї‹Œ€†…ƒ~xyw{…†ˆ†‡†‹‘Œ…|€„‚~zyy€|ƒ„wuo|„…|tr{„…‰„„„~zutyxvripq{tla]\ityqobgfjnfw‚ˆywu€‰Žƒƒ{z}‚‡ƒ}totv‚Š~{}|€ˆ†‰‰ŒŽ“‰„…ŒŠŠ„‰ŒŽ„ŠŽ™ž’‰Œ–˜ ¢ £—‘ŒŽ‹Ž“ŽˆŽŒŽ‘Ž„‚…‰„†}u~~‚•¡Ÿ•”•‘Ž’•Ÿ‹„…ƒœƒxq‡—Ž‘yg‚yz‹wjrs~ŠryeNzxp€jvvnjd|ocz_z~wISvdq‡Vncrusku[~kl}c|qk|k€upp…ypvxtwu¥»¡›§ŸŽ«­…y™—›vƒf˜x}ƒ‡{—k„‡€Ž“—¡ª––ŠŒ“xš†–…‰‡wyn_‚‚…†“‰xw‹z–x‚‹v“ho†ŠvnxhvkjqfdxU€RrleZ{…l…‚žs€nƒ‰m~‡xŽ~e~lt~xj—ƒ‚††z}€’w…Œ||›‡g”…•qys¢‰›{rŽ‹}‰h“ŽŠx©x™wŠz£uˆlˆ¤–ƒ˜u„™‡˜–ƒz|…™Žyx‚œ°Œ—–‘™·‘ ¥‡‘’“ƒ€†|—~ls‡q{muwsh‡{…‹wuc†wezx^eoal_QY^jhleugnNkgŽntct{‰`}ƒe}‚xx‹wurh~{hzWl~[kylnuh‹ˆƒ˜’¬ŸŒŸ”ž¥œŒtˆv‚‘€~x…“ƒ„sœ„™’›œ‹|ž‡|œƒ£“‘˜§‚\’zš›j}vŒ}t|”}—zƒ||n•‘~dƒœw}u|skІtzky…’‰…‡ˆ‰|‹”™‘ytu{Š}wfqtjlnpnbpƒmw}h€z{…†rshn…yug_xx‡f‚iwvryzŠ||ˆˆsƒ}„’…ƒˆm‡ƒ—v}t|~xyˆ„…ŸˆŒxŽ”˜—œ’•ˆŒyw‚t†ukl|†lnuxŠz|‹mw…ˆt€wx}‡„xŠ…lj``qn~ydruysopth{€pŠ|w{‡…‹Œˆ“Œ‰ƒ}…{x‹€…Ž~‰‰‘•šŸ¤ ¨¥­¢˜¢ ¦°©Ÿ›šŽ‹Ž‚y‡Šytpdzƒ€‡„„|‹Š„„€t~ŒŒŽ|}drzwpveoiquclmsu‚~tqwzy‡w†zketxpfyjdwdmah`lcxpr{wtuv{…{Šy{€‚x|kzppwvikcpugutsp~yˆ{‚w†~†|‚„~„‡}ˆ‘Œ‹wxv„ŽˆŽƒ|y‡…”‹”ƒ‰Œ£‘˜‹ˆ“”™ŽŠŠŠ’—‡Œ”‘š—œŸœ©•—Ÿ›œ¥Ÿ¢©ž£’Ž™‹˜ƒ}r|ur~zmujsoyvtkyxu|€smtqrw{plbfceY^W\c`ji`cohzoinyt€zy{rƒ…yzukptuwph{qrpjozw}‰ˆˆŒ’”‘š‘’“’ˆ‹Š‡{{xvtmrqyytx…}Š„—‰”•’ŒŽŽŽ“‰†ˆztsƒ„ˆ€yrrv†‹„†‰‹‹‚‚~‡ˆŽ†wsqsszsywxyynpz€……‰„‡†‹Œ–‡‡ƒˆ~ƒ~wxtslrx}nrjnx{|„zy~‰„yƒw{‚ƒ‡ƒ€~~ozrp|zx€w{yy‰†‹‰†ˆŠ‰„‡„‰„ƒ„}}‚ˆ‡‡ˆ‚~”•—’Ž‘Ž˜™”‹‰’…†€}ywsojkh{…zkagvvkp€~zeg||tkirtpgcgqkiacfnjmqrrmnz‡‚|}‚ˆŒŒ‘‘‰›˜‘ˆƒƒ„€ƒ€~„‰‚ƒ}{‰’™œ”’–™¡Ÿ™œš˜—˜Šˆ…~~tprƒ“‰oZ`pyqw…Œ|km€‰y}‰ƒ{pq~~{plknikhwtyp|…ƒˆˆˆ‰ŠŽŽ‰‹‰€~|roqxuz{oonx}ˆ‚x‰Š…‡{y|zt{qrsdeccp„€q\_qoggvŠibk{vmfw{wnou|{zu{sqsx…ƒ‚‰‚Œ‡‹‘’”š›œ•“‡–˜—‘ŠŒ‡‰ŒŒŒ—’’Œ…Œšžš–š—˜œ–—’™‘‰€ƒ|xwtlhl‡‡x`Veqpom{|m`dluigoohd`fkhie`WPUgjlgjtz}…‡‹‡ˆ”“˜”Ž‘Ž†Šƒƒ‚xwts{~{yzy…‰•™”’–•™••’““•“ˆƒ‡„}~tqw†„n`ht{ou…ކ|wƒŒ†…ˆ‡ƒ}~~……€odfq„‡|‡ˆ…„‹Ž“’––˜Žˆ‹ŠŠŒ‰{xtwstpvuuoqlluzy{{„‡~‡…€{xsuvtqlhk}…l][hvuqyzwogjrqsyyxrpru{‚~€wffpz‹ˆ…Š“™›™¡Ÿ¡£Ÿ›“‘”‘ˆ‹Š†ˆ†‡ŠŠ‡‚‡„‹‹“—™•”‘’‘ŽŠ‹Š…ƒy}|}wqnkuˆ‰{k[dgomqqsqimiimorpgdbbilpkh\U\hrwvs{}…†€„‹•˜˜™”Œˆ‹ŽŒ‰†}}wxuvvwxuryx‹ŽŽŽŒ’””‘ˆ‹‘‹…€~{yvuzŠƒj_Yex€†‚||‚„ƒƒ†…ƒz~z€‚xmdev~‡ƒ‰‹‹”–œ˜—”•Šˆ„}}wysqpnopkjnlopwy€€||}‚~|ywx}€tsrqrponq{‰†xfcgtyz~zxuwwz|yx{~}}wz~……xqrw…‰Œ‡ˆ–˜˜”“—š£Ÿž˜—“Œ†‰‹‰Šˆ‡ˆ„‚‚„†ƒ†ƒ‚ƒ‚‡’”‘Ž‰Š’Žˆ‚†ŠŒŒ†€yxtxvpllt€sf]bjqxxusnlppsrrmpqqmhimpph^[Zhrtxu{ƒˆ…‚‚Š‘—“ŽŠˆ‰‹ˆ„‚{{z}xwqrpnrrsw|}ˆŒ‘Ž’’”Œ‰‘‹‡„‚€€}z{|‚†voov}†Œ‰Š‹Ž‘ŽŒ‹ŽŒŠ‡†„†„„~wpqy‚†ƒ‚Іˆ‹‘’•Œˆƒ„„ƒ|sustogehjmoklklouxzwwxy|}zvsw|~~yqqprqqoopy|sljov}€}~~~|„‚ƒ…ƒ„„„†„{uvz†‡…ˆ•”’‹Ž’˜—’Œ†…†‡‰‰…‚}‚††„€yz~‚~€‚…‰ŠŒŒ‹ˆ‡‰‰…ƒ‚€{zyxxyyuuz~~ztqnt{{{{ŠžŸ‹€}}vpjie`VNLJG;32>INJLXdprx™¡ª²¹»¾ÀÆÐÖ×ÒÌÍÏʲ©¦¨¨¡™•”•“І‚~ywvvupmt|‚ƒ‚„‡‹•—˜š£ª°±±¯´½ÆÎÎÊÅÄÀ¾¸³¬¥ ˜‡xrlh`VLBADEHGHLRVZ[^bhs{ƒ†ˆŠ‹Ž”™ž œšž£§¦ž› ¢¡œ™š™—“‹‰ˆ„~snie_YVVUROGDAA>><;;7427BKH>>GSVTOQ^jle`dlttrsw~€„†‡‹“œ¢¥¥©¬²´¶·»½¾¿½¼»»»¼»º¹·´²®«¨¤¢ŸŸž›™”‘‘’Œ…€~{uqomkic]WUUTLA62256567788982/5?ECCFKOOOQWZ[YYY\\[[_ehjjmsy{{}‡’”˜™ž¡¢¦¦§¨§¦¤¥©®°¯®­¯³¶¹º¹·ÃÌǶ§¤ª´·«—“Ÿ¢—ƒtqx‚~zxutsvwwqmlnrqjc_^aa_YSPPNKD?<=AEHIKMOPPPSX\^\Z[ZZ[_bdcbbdca_`bdinpsuxz„ˆŠ•˜š››š›ŸŸœ›ž£¤£™š §ªª¨©¬±´´¯ª«²¹º¶³³µ¶³­ª¬¬«¦Ÿ™–“‘ŽŒ‹Šˆ„‚}|zyxxtplhghihd`^]ZVRMJHFHJKJIGFGIKJIKTYRD::DPRH:6?MRI9-/=LRMFEKU]a^YZairwxwx{‚†ˆ‡††ˆ‘“‘‘”›  žž £§§¥¤¥ª®¯¯­©§©®²³²°¯®¬ª¨©ª«¬®®¯¯¯¯¯±³´±¯°´´²¯«§¦¦¦¤ žœ›™•‹ŒŽ‘‘Œ‡…‡Š‹‡~y{‚‡†|{|~}yurpolg`[WXZ[[YVVUUVVUSQQQQOMIFEGIIHEB?<<<<=?AEHJKKKJLOUXX]cfb[VU]dfb\Y^fie]WYcnspjfjt~‚}|…‰ŒŒ‹’“••”’‘“–™™˜™› ¢£¡¡¢¥¨¨§¨«­¯°²°®­¯´·¸·³±®®®¬ªª®²±­««¬¬«ªª©§¥¥¦¥£ Ÿ¡¢Ÿ™–“‘ŽŒŠŠ‹Œ†{|‚}urw„ƒ|y{}xtqnmlheccddc`\YVTTTTRPOOOOMKHGHJLLKJHEA@?@ACFGFGIKKIHKQSTVYZXSPSY_aZSSeYe\\^bcoolnhixy}zyz‚„ƒ‰‹›¢ž„–›¢’Œ˜ Ÿ¦–‘•œ“Ÿ¢¦£°ª§°¦³«¬·§¶¸´´¬³¸´¸¿ºÁÀú¸²¾À·¸¸³º®»°µ¨Ÿ§©¬««˜Ÿ‘žŠŽŠ”’ˆŽˆ}vxƒ€|wptxuipf{~k^^sjeVHR[^\MGPHTE6=KMXLLJHGHDOYKS\Qa[R\QH[TScZfe`_][i^fhghparjboensprndnejplivswsslhhvqy|wz„…{‰…”œŸŠzŽ—‘xy‚Œ›ˆ„„Œ‘‚€p††ƒŽŠ‰“’š’˜ž™ ™”™Ÿš¢©«¤—§¥ž §¢Ÿ£œ¡š¢›žž”‹ŽŽ’‰–’ˆ„…‹…“‰Œ‡‚ƒŒ‹‚ˆ˜›ƒw|ˆzeis€~imlyqm[bowwwlswigksy~usv{„vyt€ƒy}†€~u|wxt|yxy}vrunnpuqqff_hgfbgdlphgbab_`iklgbhghlisŠngfxzse^ev}shddmrh^[iquqppsvlo{†ˆƒ‡Š›‹——˜–›¡Ÿ™˜˜œ—šŸŸ™––•˜š ¡¦§Ÿž¡žššš˜š™•“‘‹—•›—›šœ  —Ÿ­°¥‘‡‘™˜}~…–•}xxƒzqox€€ƒ€vwswˆˆ‡z~ƒŠ‰‚}~ƒ……€„…‡€~vwz~~wqptrprmrlpifegfehejioijadaddiikehdilip‡|pgnvzoc]dovyqccionfhkrsw{ynjnyˆ…}|€Š•”’““›œ›—˜•—’‘Œ“”—“ŽŽ“””“‘‹‰„‡‡ŠŠ‹‹†…‚}€€€ƒ„…†„…‡…†Žœ ˜…‚Ž’ƒwqv‹‡€rklpwwtosx…‚yprŽ“‘†ˆ“›™’Ž’——˜˜—‘‘’˜‘Œ‹Š‰‹‰…ƒ†ŠŠŒŠ†‰ƒƒƒƒƒz{~|ztvwwxvx}}~|}€Œ”Œ~ux€€{snqrw|~viedjmlhffmpupkdjt~yqqx††‚€‚‚ƒ†††‚}|}€ytvvxzvsvvy{|}yuxwwyvtux|}zywtwwx{{|~|‚ƒ„†••ކ…‰Œˆƒ~{€ƒ‹…~z‡‹Š…‚†ˆ‹Ž†~‡”Ÿœ•‘•¢©©¦Ÿž¡  ¤¤¢›——™—–ŽŒŒ‹ŒŠŒŒ‹‡……†…„€€‚„ƒ€}{zxwy|{|y|{}{|€„„{{~}wutrssvvrkeceimljffjprmils{{vqs~ƒ…„€€€€ƒ†‚~{y|zxvvwzyy{}~€}€‚„„~}}yvx|€~z{}€‚…ˆ‰‡ˆ‹Œ‘’‹ŠŠˆˆ…‚€‚ˆˆ†‚{wwz‚‚}xvx~|z{‚‡ˆ…‚ƒŠ‘ŒŒŒ‹ŠŠŒŒ‰‡…†††ƒ‚ƒ„ƒ‚‚„……ˆ†‚€‚ƒƒyƒ‚‹xu„€‹lg˜‚¨ƒ~„‹‘ƒ†’ƒz„ƒsjŽ„‹vmškxx£jyxo¢x…b}–zz‰ •–£ž“z˜Ÿ¢¨……~œn††¤•|‡‹{‚˜‚”›}x}‹uk‚b‚h€†ojn\skxm~mo|xqŠkj}zowsjgfOlczWXeca}Xkuhmoh`_i…c‚rf~Іœ{ƒ{x~lƒ™p|”q†ƒ|“dyŸˆv†Š–t•ˆ‹‡“p„ž~Ž—–Œ“‰ƒ’”‹§ˆ ‰Šž›‡“‹‹½‹ƒžŽ‹z‚v€ƒqko`tn€}{ƒ„‘o‚uŸ’ŸŽŽ”ŒšŽ„”w…‹€š‘€…‚Ž}„{‡Œ‡r¦€|~vІzŒ{o‰`€“rx‚f…tuy‡s‡^s–r„to†ŽeŽp{zglosqqvqbgyow}{^h„ƒnpno‚w†„sqŒ‚…u“qz…{…”—}€zzˆv€Žm€†l‚ziƒ~…“u{‡‹~qxt}{}wkv\~{‚u’y‹~„‚}†zx‘‘Œ|vŒ”ŽŠys›‰xzwˆkq}qwz{Wc|yk{„{‹ˆ–“€”‰œŽ¯Žœ¨š‘™’ž§ ’‹‘¤©—˜“’Ž…‰‡•„€‡™†‚ƒ„˜‚v†ŒŠ’€wv“†„ƒqw{m{‡touu|ukx^spsgigescjesnpiejllytcx‚yvxŒnwt„}wsiuv{q{v}jnpzwkol{{tnwƒydm…i|noz{}j|w{‰Š}‹z”‚z…‡†¶“Ž|ŒŠ‰†xs~}x{}v}z{…Ž‹Žž™– ¨š˜˜™­¡šžŸŸ¢—– •’‘”£–˜ŠŒ•Ž—™‘„~‹„‚„{}z~€lsn{{|wxpwm€yrytsnypiln}rrqsaieksjiYbdgfkjhhjsr|}qqu}zŽ‚„‚w„zwyvy‡x€wŒvzƒ‚t‰xzzvy‚|rˆ|„€‚xŽs|…“€†ƒ†‡~Œ€ƒŽˆ€‡|‚˜‘ˆ‡‹†‚„vzx||zpx~xuqsvw…ƒ„„†…Š‹•’’•—’‘‹‡ŽŽ…Š‹Œ…„‚†ƒƒ…‚{†x|Œ‡z~u{…†wxsr{€‚{~|x„‚‚‚wyx‚‡€…‹ˆˆ‡ƒ~wz|u€uqtss|v|}|‚‚ƒŠ€|ˆ{†Š‡‘Ž‹‘‹‹ƒ‰‚ttyv~~{~|wƒ}xvvxxwivswqwjtyvwrturntqsvqu€wx€w{}|}o}€‚‡~z|z{uuxtyqjpnlmunuqw„~~‚„ŠŠŽ‹‹‘›ŒŒŒ‡‹Ž††ˆ‘‰…„…‰„‘ˆ‰Š‰ƒŽˆ‰Ž‹‡“ˆ†€€ˆ‡……ˆ€‚„‚…ƒ~zz‚†…„€ƒ{~w{|{}xousjrssyvy€uzyy€|y„„ƒŠƒ…ƒ„ƒ|€z~rvuo€xrusvwnswssrmyrttltts{yqyxwyz{{|y}~}…||€„}~„‰Œ‰†…ƒƒ|„€~€~~€~}‚“‘ƒ‡Ž†|{ƒ€…†‡…ˆŽ‰„‹…‚{‚ƒ€ƒ„ƒ„‚ˆˆŠ…ƒ‡‰ŽŠ‹ˆŒŒ‰‰‹‰…‰Š‡|€ˆ„~†z}{{}x€yx|t‚‚|xs{urqnprmjokifd€toqyrddknihkttv†~wvt{uwzwwux~„Š‚€‡„‡€ƒ‹Œ‹‘““‰“’—“‰Ž†Š†‰‡ˆ†„‡ƒ{ƒ{|z‡„y{{|{|yzrupmmkp~…uro|tehegkekxruwxuzzzvvz{xx}|€ƒ|~x„y|y„€†…‚ŠˆŠŠ„ŽŠŒ‰‰‚ƒƒ…Šˆ…†…‡Š„……„‚ŠŠŠˆƒ…}~~€„}xxy|ˆ’‡|ƒ†}uuzzxw{|†…~z{z}wt}ywppoy€‚{z€‹‰†€ƒŠ‰‹‰‹‹‹‹‰‰‰‹‹Šˆˆƒ†ƒ†‡ƒ{{‚€ƒz}|z|}~|€ƒ|ywvzwvwuuqnmiehrƒpgnuspfiljmwv~„yz|v{{‚}z‚Œ‹}††ƒ‰“’““•™˜˜”–—˜™˜“—•Ž‹‰ˆŒŠ†‚ƒ„„…€~}~}€ƒ~{}z}{x|zzvqoqpw‡…xlqy|rmippnrptƒvqox~}qsy|wtms…†ytu…„{†ˆ‰ƒ†‡Œ‹‡ˆ‰‹‡Š‹Œ‡…„‰‹ˆ‚~€‚€ƒ€‚€‚‚……ƒ…‰†…‚|}€€„„…~€{vvw‰•„yvx€yuropvttw~‡‚wuzƒyxz}zqs}~st€‰ˆ|ƒŒŒŠ†‹ŒŠ’‘ŒŠŠŠˆƒ‚„„‚}|z|z}~~zx{|‚~z|z~~wrtrvsrpqpmlhklxƒ}oopturnloouuq|……vw„‚}w~„~|~‰Š‚€ŠŽ‹Ž’”•••—›•˜–œœ—‘”““‘ŒŽŽŽ‰Šƒ„‚‚„ƒ„…z€ƒzvz}~}yuyxxzvttprqppr~ƒtnmmornmifltuxzyyxvxyzyz{yyyvxxytrt{€|y|‚„…††ˆ‹‰‰ŠŠŒˆ‡ˆ„„ƒ€……ƒ‚€ƒ„…‡…ƒƒ…†ƒ~„ƒ‚€~~}‚‡Š{{{{~{yw}€ƒ††‡…ƒ€ƒ‚ƒ€~z~}}vrxy|yuw}‚~„‡ˆ†…†ˆŠ‹ŠŠ‡‡ˆ‡‚…€|{y{z{€zz|€~|{|}}~wxuyyyustssrsswyxtrqpttwvuszƒ…ƒ„…†~~€€~||€}{|}‚†ˆ†…‡‹’Ž’““ŽŠ†„‡‡†‚‚||‚‚€{|~€|zyz|z{z{z{{{xvwuwwuwyxtqquwwvwwxyz„†ƒ€€ƒˆˆ‚{~‚€{zy||xvttwyz|zz}€€{}†‰‡‚‚…‡†‚‚ƒ…~wy˜vv{‘ˆ‚‚|xpl•«w€¡y¢…|nŽ…r£”g“uœ¥”i_t—˜€spNLQhv†~G39uS]SL?Ju`—ª€¥­Åº©ÁßÔÖÔñÿò´Â³êÓ´™¥ˆ~ƒŽ¢ŽtUpI]sLbm‡Mmrrˆ€z–ƒ¤¢”«¨š±³Áїʵ³¾¿¶­’p£˜¯Ž|ykVrYlxobHUDBK7GCUMJQ[zqUk‚‘™§ ”¹ÐɷжÏÎÀÅÔÇ µ±«¿³Ž™‚q†‡~yl[cbXRDVg;Q/HB0;UI[^IG\OQf]ob‘‡¦ˆ†‚–”—´Ë½ÄºÑÜ­ÂÈڬϾ›ª”®¹ ƒwnnMREny^dM8:CEoglNB5kxG]VLLX_\cq‚v^}–¨›|ˆ˜‘¥­¾ËÞù²ÏÔÉÇ»½º¸¾ÎÌÉȤŸ“¸œ—¦p†‹‹’vgmYYVelSREFHH-0(.<4B".&&1:+JVYC]eTgeŽ„s€w„Š›‰‘¢«¢Ž¤¾¹®°¦µ¬š¶ÎÀ·¨À©Žœ¶¸®©’—‹™Œ•‰tlqk~redXFDJ`c_Y3O_TTTRSbI,NDG/'TR\FVWB/5JlpYljznx†v†|žÀ¬œœ¡£¤¸Ã½´ÊÇ·´ÓÐÛÏŸÇËÃÂÅÒËÁ¼¶Ã»À¨¤«½¡¦›žŽ†r„Œ~xhfTcgooeK]XfVUI6@9JI-3(36"+?)48BA/*%"91?glZWUdQO``lvhan„‚}x{ˆ}Š¥¨±—®¥Ÿ³¶ÌÑÈ¥¶¯ÉËѺüŤµ±Æ¶¤»À¹£ ¬»º«²«¥³¸Æ©ž¢£¬¦‰r“„_fnŽx`NOaFAJ`jeO8VLJHED881G6KF0?5-AA2A&832DE.JGA>AOWUZU[g`n|wf^ftprvy~rŠ{€z‰~w„Ž‹Ÿ¤‹ŒŸš²­¥¦«Ÿ­ž¬§³½«®§­®»±§³»­²µ¢²»Ë»¼·«®¤³¸Ä»¼³²·±­ ›§Ÿ¡Ÿ¨¨œ¢”§‰›¤§—“žšž•‘‰Ž—{x|nmwfppnupdkaVgpm][LRjoacX_^^N`^Rg[KSYPUNLKHNQN[QZVR[Z]ILNMXf]\TVNGQREK[HTY[TbRSRXfckjpmzstxmpyzzudtv†qqewmvz|u€‰” …ŒŠ|‹•¡Œ—–ˆ‰™˜˜™”¡£‘™¼²œ››°¯°«­®´¶º¶¨³·½¬¯«›ž¨¶­£¡¦¨¤—œ¤ ¡ž©¢¡ž¦¡¡—¢Ž•š•’‡”’†ƒ„‡z„‚~€‚‡|‰rdlmpjbjepb^^]X\_VGKOZ[VZaPJVQQ\cb[WX\WQW]N^[ae^vl`WbQ^[UV]dqxg]MSUlsvztahfknxomqzf^^at{nfl^njcgnoyœ‚daooxow~ow„ˆzv{{wmt†…vŠ–Š‚~ŒˆŽ—¥ ¦²£¦¬¸°¥«§®´°·­±˜¦®®¦› ¥¤¬´ª˜¤™œ¢°£´©¢§  ›”“š’š“‡–…Œ‰ˆ~}‚‹‰˜—€xˆ†ounx‰yu‚rellge[qqfbjshjqmf_hq{uswwypqrzvugqv€yiiacijmnpklhnjmiuusollntohnmxzmhjqg{}m|{oqvtbw„”|ohsjsoqlrv‰{d`lefonvqq|}lq„€pvy~v‡—›‰‡“‹”ˆŽ‘Ÿ¦¡’‡‡’£¡—•˜’•”•—šœ ›—”““”–ž“‹—‘”•†‡’…”‘”މ£¦œ„ƒ‰‰‹‡zv|‘’†tjqs|xy{|ƒ„uwj{ƒ€‹‰‰š›–’œŸ–“—ž””‰‹‹ˆ‡|€|„‡ykxzƒ‡{}vpu~mqorr}oXc[fy|lihg^lglhp’}aZkmyoY[[itpcWURYh^ljdhnhbaknrzxsr|Š~{„ŒŒ’Œ†x}‚Ž’†‰|Š”‰€‚”ŽˆŽŠŠˆ…‚‡ˆ‹‡…„Œ‹—š“•“‡‘¨˜—­œ’ƒ‘“’–†‡‡‡ƒ€z{€‚w{ƒ…‡‚†ƒ~‹›Ž‰“–”Ž”‘—”—œ”Œ‰–”’‘š’ŽŽŒ‰„‡‰‡‰~…‡…ƒƒ†~xwuuvvwstx{}x€tynmwsx„‘ph[qhylgpsa[YX_igbgfjhlcckwyjm|‚……‰|„”‘‡„‹ƒƒ€‰‹~€ƒ|€z~†}}vp{‡~~xy‚w~}suqw{xzzmsˆ‰ƒ{zyx‰‡™–‹…‹Š†‚‚}|€|~{pt€…ˆŽ…‚‰‚~~–•”’‘–• œššŽ‘Ž’—Œ˜’‚Š‹‹™“ŽŠ‡‡…‹Ž’Љˆ…‰„|‚‰†‰†ƒ…’™œ•ƒŒ‘’–žƒ}}††Š†uwnlgrntrlr|yvoipxpstw…€tqm~†‰…vxus{z{zrw~wusxyzyty|wtmstzxzwqxzvyqkjnswvqoou{€zwx†~~{yw‡ˆ{{v||ƒ‡uqxvy{wvmuz}{„„€‹‡‡„„Ž’–šœšŸ œš›—˜’‹ŒŽ››”ŠŽŽŽ”ŒŒ““Žˆ‰…’—‹‚€…‰ƒ}|†|šƒyq›•Œ–†o•ˆ†‡…‹€‚‚l¤„v‚rnr„uj—ŠxŽz}{‚ilu„z’m„xwЦ”ŒŸpŠnyœx“—{~w…Ž|ˆˆ„€‹€}k‹¢ƒŽ’r‚s“v’ffuy‚€f~PuzІr—e}„{txw€‘„tq~†iŠjp]lx|fc_Llfuyƒ|odpg€nozr‰‚sjŽjfp‹†ffxj…|q‡o~šgŠŸg’†|yz‡ŸkŸ•|‘šršyŽŸcx„v†aŒs|š„ƒ«„˜‚€ª~‰’}ªež–^s……h›‰n]Žnƒ||‰…œ—~£xŠ™‘©›š¯Žš”‘¡Œ•¢‰©¤™…‰Ÿ‘’Šš…“˜~‚}|™~‰“zx‚slcyk}kYzlx}eat‡uo…{|“zqf€iƒq[Wvwtk[d[€qpg€oftfˆlmaq|‹m€†gq{vq|zvtp‡{jy^{mpˆ‚{xq„t„q‚z„Ž€€Œ…€~zn}l†‘‡†ˆ…”¡”„§ †šˆŒ‚y­•u†‰††v‘qŒ…Zg‹–l}†„†‘{‡™~ƒŠƒ“ŒwŒ¥”ŠœŸ„£’•ž‘ž›¤¤Š‘’‰‰‹|……–‹‹ƒlrx‡‰{ƒ€qt€qyx{|l~…q}}g{rs~Š}xmgmkmieWpcy^|goqusyv|pt†~}|q‡z…ˆ~z‡iz|•rn|gt||‰s…„{Žvmxm~ƒ€omru}tnrlmfuk‚oo}‡}wzƒ„Ž}|’y}‹•–—‚|Š‚wˆ—Žvxru}w‡t„‘‘{w†Œ’Œ‡…ŒŽ‹ŽŒƒ‡¡›’Œ†”“ž“”Žž•¡–„Ž‹Ž˜—’™Šˆ‰Š‘†„„ˆ}‡€„˜‹Š€uˆ‡ƒˆ‚‰~€}}u{q}}owjnxemhfhvkomptgomvpy{pmpws~tnvqjc~|rpxtp‚yƒ{ts~wwyrv{tr|n~isvzgl^sohuxp|xwu|‚‚‹||z€‚ˆŠ—‚~{†roxwwmyˆˆŽ{€‰ˆŽ‹”Œ–Œ™——›’”Ž”—”™£˜–¡‘Œ’–¤£œ”Љƒˆ‘އކ‡Š~‰x„€xƒvwyw€€|}}u}x~{‡|yƒƒƒ…xwˆ„vt€w|nrwuhppx|s}{{}s€yx{~rzuzx~~y€|ry~zsj‚€zy{|†vvu}}qq{|vpyorpptxu}xqv|„†‚ƒ~€†„‰xˆ‚ˆŽ‚xx}|sz~†€nns|v~}ƒyzqz}„x„Š…‚€ƒ‚{……ˆ†‹Ž‹…‚‹‘‹Ž˜‘Žˆ†‹Œ‰‘‹‰ƒ‚€„ކ„vƒ€{}€‰ƒ‡z~…‚Šƒ‚z}zu|{spttotzr}wy€~ƒx„„‡……ƒ‹Œ†„Љ‹‡‚‹Š‡…‡‡||}…†„…‚yt~zy{{xvsurjjnjwwrhjqolpstzrz|}ywu‚z{ƒ‚†ƒ‹{|‚†’‚t‚‡qpst’u~†ukt}{…vtz€xww{€‡€‰ˆ‡„†‹‘‘‡„‡–’’’ŒŽŽ‹’•—–‰”‘†ˆ‘ŽŒŠˆ‰‚‰†…ŒŽ‰†…„Œ…„„~ƒ{zxtou}vŠyZprYYldm}g[toWknorqbnnmiporspsuxrwy~…||‚Œ‡Š’Œ‰ˆ‹†„Œˆ{‚……€xz{}y{€€€ˆ~†€ƒ}€}}zxvtmup‰…lt€rgqurynywjhxw{svxw{}{€z~…„ЇЇ‡‹‡€ƒŽ‘Š’‘ŒˆŒ‰Š‹…„†……†‚Šˆƒ…~{wx€…ƒ‚‚}}~†‚€{}uv}{ˆŽrj}qchpu~wpmrjfo{xsspsnmwv|x}uw{z{~‡ˆ„xz„…Šˆ†‡†Œ‹Œ’‰Œ……‚ˆ‡‹‰ˆ„‚†„ŽŒ†Š…†‰ˆˆ‹ŠŽ‡†€|‚{vp{}ˆujx|chusw{sprhhkwvjopknuvqpp|tt{{||€„‰†‡Š–“–——“Œˆ‰’‰ŒŒŠ…‡‰ˆ‡‚†ˆ†…~}y‚€‚„ˆˆ‚ƒƒ‚~~||wwwuoprr~“io€zcs{y|wmqljrz~uy€xp}}~…‚~ƒ…€„‚ˆˆŠˆ‰„‰ŽŽŠ†ŽŒ‡‡‰Œ…ƒ†„ƒ‚~~€}€}€y{{}}€‚|}zxzy€}w|}~wv|‰pm‚zljy‚wwwuljlzxssxqkn€qw~}y}ƒ‚}„Š„‰Œ‰Œ‹ŒŠŽ‘š“’‘’‹ŒŠŠ†‡‰ˆˆŒŒŠ‚~‚‚…ˆ†‡‹…‡„€‚€|~{{{vxxuvss…sgqzkagyoiolj`grtgjuribsxslxvosvry„……‰Š‹Ž”ŒŽ‹ŽŒŽ‹‹‡‰Šˆ„…†ƒ……„‚€€z{}€~‚ƒ„~€‚€xvxztuuyxuww‘†nw„}mp€vvzpooyxs{ƒzrx…~z}…~ˆ‹€ŠŽŒŽŽ‹‘ŠŠŽ‘ŠŠ‹ˆ†‡ˆŠ†„†††‡€|€ƒ‚{xwyx{||||yyxvwxxz{y||~}~{}Šˆvu}}urv|wtrrnswyxutxwprvzx{~xv„„wv~‡ƒ…ƒ~ƒ……†…†‡Š‰‹‹Œ‡‰ˆ‡ˆ…†ˆˆ‚ƒ‚‚‹Œ‰ƒ„‚€„‡††‡…„€}|x{~|{~|zzwz€uqy~uqvwtqttrrxwwtswsvwwu{z|wu~ƒ~v|‰ˆˆ†‡‹‹Š‹ˆŒŒ‹Š†‚…‹‹‰ƒƒ‡„€‚„†|zy|€~ƒ€€~xuwyzzz{z{~€ƒˆ‚|€‚~|{wvzxrt{||}~}}}}}~‚~z‰†|{…‰‰‡‚ƒƒ„‡…‚~}ƒLISTBINFOICRD 1999-11-04IENG Deepz0neISFTSound Forge 4.5pygame-1.9.1release/examples/data/house_lo.ogg0000644000175000017500000007514611025452467021330 0ustar vincentvincentOggS?ÏBH:Zþ„vorbis+Hq™OggS?ÏBHÓî¦; -ÿÿÿÿÿÿÿÿÿµvorbisXiph.Org libVorbis I 20070622vorbisBCV R!%SJc•RR)cP[GcÔ9F!dSˆI¥{O*•XJÈRX)ESLSI•R–)EcSH!SÖ1e¡sK†I %lM®tKè™c–1FcÎZJcÖ1EcRRI¡s:f%d:FÅèb|0:•¢B(¾ÇÞRé-…Š[н×Së-„KiÁasíµÕÜJjÅcŒ1ÆÅâS(‚ÐU@BCV ÂP EQ€ÐU@€EqÇqG’$ËBCV@(Žá(’#I’dY–eY–¦y–¨¹ª/û®.ë®í꺄†¬È†!‡ÞIÌSI&)UÌ9¡õ9ådÒRƘbŒQÎS 11†Ð)…ÔN9¥ "CHdÎ K=èàbç8²"ˆŒAŒ!Æs J!rŽIÈ DÎ9)”LJ(­´–I -•Ö"眔NJ&¥´Rˤ”ÖB+8X…†¬¢ƒRH)Ä”bN1‡”RŽ)ÇRÌ9ŘrŒ1è TÌ1È„H)ÅsN9æ d *æ„ 2B¡!+€8ƒ$iš¥i¢hiš(z¦¨ª¢(ªªåy¦é™¦ªz¢©ª¦ªº®©ª®lyžiz¦¨ªž)ªª©ª®kªªëŠªj˦«Ú¶éª¶ìʲn»²¬ÛžªÊ¶©º²nª®m»²lë®,Ûºäyªê™¦ëz¦éºªëڲ꺲홦늪+Û¦ëʲëʶ­Ê²®k¦éº¢«Ú®©º²íÊ®m»²¬û¦ëê¶êʺ®Ê²îÛ¶®û²­ »èº¶®Ê®®«²¬ë²-ë¶lÛBÉóTÕ3M×õLÓuU×µmÕum[3M×5]W–EÕueÕ•u]ue[÷LÓuMW•eÓUeY•eÝveW—E×µmU–}]ue_—mÝ÷eY×}Óuu[•eÛWeY÷e]÷…Y·}ÝSU[7]W×M×Õ}[×}a¶mß]W×UÙÖ…U–ußÖ}e˜u0º®®«¶ìëª,ë¾®ëÆ0ëº0¬ºmü®­ Ã«ëÆ±ë¾®Ü¾jÛ¾ðê¶1¼ºn»°¿íûƱ©ªm›®«ë¦+ëºlë¾oëºqŒ®«ëª,ûºêʾoëºðë¾/ £ëêº*˺°Ú²¯Ëº. »®ÃjÛÂîÚºp̲. ·ï+ǯ CÕ¶…áÕu£«ÛÆo ÃÒ7v¾€€Ê@¡!+€8!c*Æ „R !¤T1!cJÆ”JI!”Ò*Æ dŽIÈ“Jh©”ÐJ(¥¥PJK¡”ÖRj-¦ÔZ ¡´Ji­”ÒZj)¶ÔRlc2ç¤dŽI(¥´VJi)sLJÆ ¤B*¥¤ÒJI­eÎIÉ £Ò9H©¤ÒRI©µPJk¡”ÖJJ±¥ÒJm­ÅJi-¤ÒZI©µÔRm­µZ#Æ dŒAÉœ“RJI©”ÒZ朔:*™ƒ’J)©•’R¬˜“ÒA(%ƒŒJI¥µ’J+¡”ÖJJ±…RZk­Õ˜RK5”’ZI©ÅPJk­µS+5…PR ¥´Ji­µVkj-¶PBk¡¤K*1µcm­ÅJi­¤[)©Å[­µXSK5–’bl­ÕØJ-9ÖZkJ-ÖÒRŒ­µ˜[L¹ÅXk %´Ji­”ÒZJ­ÅÖZ­¡”ÖJ*±•’Zl­ÕØZŒ5”Òb))µJl­µX[l5¦–bl±ÕXR‹1ÆXsKµÕ”Z‹­µXK+5Ækn5åRÀ€@€ e Ð•@` cŒAhrÌ9)RÎ9'%sB)eÎA!¥Î9¥´Ô9¡””B))¥[(%¥ÖZ, À ÀM‰Å Y D Æ(Å„Æ ¥ƒÐ£c*¥sB¥cÎAÈsÎA)cÎA'%„B)¥„B(¥” lДX Ð@` b 1† tR:)„LJ'¥‘Z )e–JŠ%ÆÌZ‰­ÄØH ­…Ö2k%ÆÒbF­ÄXb*ìÀìÀB(4d%@£cÎ9gbÌ9!41æ„*ÆœsBcÎ9!„Î9ç „BçœsB¡ƒB¥”ÒA!„RJé „B)¥tB¡”R *p°Qds‚‘ BCVy€1J9'%¥F)Æ ¤[£cRj­b BJ­ÅX1!¥Öbì ¤ÔZŒµvRj-ÆZCJ­ÅXkÎ!¥Öb¬5×ÔZŒµæÜ{j-ÆZsιܰE6' *4d%@ ¤cŒ9‡”bŒ1çœCJ1ƘsÎ)ÆsÎ9çcŒ9çœsŒ1çœsÎ9ƘsÎ9çœsÎ9ç ƒ9çœsÐAèœsÎ9!tÎ9ç„ *p°Qds‚‘ BCVá€1”RJ)¥”RJ¨£”RJ)¥”R!¥”RJ)¥”RJ)¥”RJ)¥”RJ)¥”RJ)¥”RJ)¥”RJ)¥”RJ)¥”RJ)¥”RJ)¥”RJ)¥”RJ)¥”RJ)¥”RJ)¥”RJ)¥”RJ)¥”RJ)¥”RJ)¥”RJ)¥”RJ)¥”RJ)•RJ)¥”RJ)¥”RJ)¥ ß ÿgXI:+ .4d%ÄŒ9'%¥†1¥tNJI%5ŒA(¥sRJ)ƒÐZj¥¤ÒRJ„”b !•”Z ¥´Vk)©µ”R()ÅKJ©¥Ö2ç$¤’ZK­¶˜9¥¤ÖZj­ÅBJ±µÖRk±uRRI­µÖZm-¤”Zk-ÆÖbl%¥–Zk©ÅÖZL©µ[K-ÆÖbK­ÅØb‹1Æ ànp€H°q†•¤³ÂÑàBCV!2J9眃B!RŠ1ç ƒB!DJ1會B!„Œ1ç „B¡”1æ„B!„R:ç „PJ ¥”RJç„B¥”RJ !„B(¥”RJ)!„J)¥”RJ)%„B(¥”RJ)¥„B(¥”RJ)¥”B(¥”RJ)¥”B¡”RJ)¥”RB¥”RJ)¥”RJ(!„RJ)¥”RJ %”RJ)¥”RJ)!”RJ)¥”RJ)¥€€#è$£Ê"l4áÂL‚‚Q„øH €ˆˆhæ  "$OggS,?ÏBHvW¾Ø-Va]_^]`]__`_\X\^_Z[X_[\U^\`[Y]^\Z]\][Y^\]YY[_Æ#ãn*ËD…ᎥûòY|fV—|;ïa4»«ã@‹íuì‡ïGØEï퓤a«óÃí¬¢‘Ò#÷Ð ½¿\S›ØŠ4Ö" ¹-Èý—µç Æ j²ÌØò^0øêߪ—÷df# ‘pUKOE¡'òDtljÚå;c$u–qYÖtËÛÇú¶v·s (ÜaÞHûó ÕS¿¶z¨Ã‘R‚¯Rz Áθ¦ž‹ –´l=AB€€Œqé븿ú”ñà,Íw‘tÕÅßÍý%§ÑèÄÜ…{ã‘Ê–äºíÆ–ŸŽÛÑà0£`‰úrt{W—™´—j|I2a*Ã-ÈyÐh쟖”lãh`H€@ êôZ²Uƒ®ÔG#2Æý߀‹j±G‘í·ÛÛ'Ò†ñ"çk€\ÑYŠ6–:.Ÿî¢ð4q‹ýEÛóÑvDªÏéj©Üû†‡ÒqsgÓ¾žÊël@h |†{£2xIï¦ò•„9ÕT¹?>1/z0£´ØwÌÐüÍÒsÉuˆo;7Iu’ WE¢0äE1ÂW§¯ ÿL²¢h5ª»°j©¡n† ÝßrÆ ü>ÂÞ…”²û”°$(P¨WŽ÷ïkã¦ò±»ͺ–‰â—ëI+37ÚxÖÙþÙ0·&ºR^èÎ\^8©ÔH¢§u‹™¡Ó‰½¿wZÂQ#ĻȠMo-5G=U±w¾`Üì^Ùš@ë0§§x^<×ö¦oI×÷T"D"Y¹Gªî–§•SéöŒ¨÷¢%¬ñ3Ô¡ t‡= ½gÕ> ß‹.¦W7ˆ,‚¢1nÇ›í¥4SÔûÝ‘rÔ—ú*÷ìH¶_Pµµ˜'@ëЈŒ,È?oûêRŸ^ÝØ0ł׮íNÿ²7lÚJvl—»Gù#û'YsƒË}fYoïÁËoXY@(­þjV(oW!0!Õmì¬÷¾^)™­x°m\ê5H2þñ÷ùrcÿtïôàòJéŸ IÍ•˜¹g™? éåtónÿÎÕñ¡üµõ£©—pB…Π§ë?ôË1j=Ú\ÐuV…PË”ƒÄ£ Ä"粨œ—¼½Kº$ý£v =Ó% ,êü9ýѱežÞnszZdþ$üXûÐwþaüm;h;Ô9ÙPôºÄ‰Š€XU_kÒH>ûoF;®ÅçQGô| `ksÇþ爪F¿œ%,Û(ª-@íÚAŒÊÙÕîá[7/O—CFh¦ öÁmœ¥ÿæÓUÛáôñ¦Ð‡f¦ã"S˜Q6›Ý_Ø\mÈÏëFàý¤©YØÚl=+öƒÎj˜e3tœåÛ³<¿Vïc¢®QÿùÓθ|Ò,K–Ì’ E Vûu:{|å\ò|ÿ•Ûâ|ÏOlÖZ2¹ìO*)Æ×¹¥UL+_<Ö]"·^Œ Ê@_A“Á“·ú%õ²k-û<¯]ÙOQñnîhÎ2ï&³ôg&Îkl²í)$°Tг÷æ7[=Â>Æ’¦!½Û‚e=a¤gÔòÑ÷ðbîö£|gìÖ¨{c=¡&‡"d<¥>3b…ZŽªâÞ{ä%™>ú÷¯ÅkÍZ#RN&Â+>ÔlO›@}Ͻòæ\'*M6¤ ¥ë¥¯ò·{„éïcøWû›Fãéý½…‘¡'Z>ŵpÏ«nåS0ÒDnõª÷)1\û´8O#ž«-9ÉïÂ*éÉvѰ€LQ»îÒÿ®Ç¶êa Â\òá—$Ún^_6qO¾¹RB±ãW‹>‚ºÊÁöräGUö§¤¸/M™C^ëôtû&9ó9h­ÞZ¬–+&i)Æ*ýyS€ð•­ôžC»™î1'"KU[Ãñárå<7 –·GK·B论âcÚøÃŒÜ*0¢u½¨_˜ùT½²Éd?»€Ö(W×/Ë#¼ª7W:'n2B-²?Â(éÙ¸éj¥ý³:Û:y§·ßÚý.ïÖóíèf7=uîµ’ŸW4I×2ÌqDº4 –Éí(¡¿Ã«ÝTWÊJ 9–$'3n£BÏdChYÃYÊiö,ÎdŸ¾(•ëMŸ  RúÃãÙsóègS‡w‹Ø%zŒ·L_ŠYlšª4AD&*¤c/U·åâH6 ŸGê7úâõ<Ï'“GÝÇÀvÞcfÙ„ò<=h&(â]·dµ¾(•å쨬ʙUª]i,5¥4û‰Ä¹ögHvIãÎ8H M1= ùþ‘óôÓ>œg¥®GÄQÛ• êTÚ|Ѝxã¦ÏÚÑ»Dµ\ÉVr;{²&À†i_¾ÚŸú¸Óly'_&.-_â:Û©—0gתNÇ«+§ar—éê‘Wìb”Iæðƒ¤:¤ƒR…Óä­UKð‹è±ÜÔÆm˜w‚2o²- Ù;´Ô¾Ý?¾rÙœ•”±…1Múz2Õ#ΦÕsç­;˜(Ô ÖÝŸ:c/áêö±boè¬17+·û{€_ŽÔ´ë±g­ }ѵìøo;Éúðx¯ÒZë2åwQr>iW¿T3 F'B¦>åÙâY wÜË~0Õ;é‰üw;äžåQ³‘S©¶¾,õÉH¨@Ít6ïíqú å¢wL[ ‹&»ý —癦å,8Fá0ùû¶Vf¶[¬|2ÃŒ?Ž{Y »zÊ H7²Óo««ùD,®^LÐAt߈LL}lÂ)ý¥®4_(Ôl¿||»÷ýn{­¹q{ÕdÛ¬ Œ ÅÈÅX6ÄεӌŽïU®Œã eÃð¤ms¤”œ}F ¯‰ÇKxŠuJ„h ñßê&eÑ0ç»Å,;º)µš·A@( Ш‡o}ËÎŽæÝWøi·¦ÝH;| ‚eñ19DëóúùÜüÆ]üëô Qz¼ <:r\ÚQºy Á¹§‡äúHzÂoUÿiijbø•÷宺'©ÒþÖA`ÊœzwñÿÈb°ûÏ¥v}´ŒgÕE<±ÞjjÙ:Rèºæ ßÿ\µv>ý,þæØ+¬ Ÿâu«ó¼„dNèt]o랢©³Ç—í b“±—zŽžŒÝµ¶hàž­KQ4 ¶BAdd½ ‡Nº—êuîèÔ„s§˜ñ‚Ý_ÉÛ:œêÜ~*'6Tš—ˆ˜;ЖA±åÀDTêÄÐqZÉþ`|X¯þ´º 9 «ò»îõs¥¾fP×S@AVAÍXgÿÉ[{o÷ô&=Ñú›•ŽÓ¼R&0‰q¶K:ÿg|71˜šCÿR2a fÄ'Š@ÇÌØ{{_§(×ò·cwüÎÀÍ讎UÔ®¥ÃKž) •öæÞhÙéR×Ðú³”"¥Ø¥¾‘›Ûæ½¢K`õò]©ä³Ì’‘£žaBÔ»WH8(ËÚÌ£¥ÐåÚ[Cõ§l„å7³òèUWoy~Mi1¾¤wúuû$¨ ¨öWóáÝã½É³»ƒªC(@Êm>esþ»…‰ùz7xM¹Ý£µšpÈÛ)v*»R'¬Í3nÊž°1ƒ³:„7Æ»¦Ò`Üï·D§ŽŸ'Þ[fî¶÷‰i#[%m”6þo^!ƒªÖý]ðä‚5<øã!—ôÁ# jª[žOŽóâqñ¸)QÌG1Ÿ¼õá’c5EÊ ,_ÈܹÖõšqà ÂàÃ÷]¢é`@P0òœ‰µî/W —òW‡2ó‡a!›¢¢a¥o4¥2Â? o³ÖRUË0±j½'"Ò|œuA.”<æe+/+³bÆVF¼õfÓ5Â^ÇÙ>Ð}ÀFEõí}!/quüœ¸¢íÂÞœþ8¤²Ž½Ã¨á~¾xˆ¹ÆØÁøƒV+OýxQfÍ‘hˆMD¨ºWŸ9³â!êaÿuuÎ{Ͼf\älÓÀÊ­„ô£r¯I†o1~¶1î‰ÍTc*£°ãö¸o?–|îZÁJ¢G)8ó “zÈ)f+(1Ì<3è,>ߎY‘ N`œÍ„?0–·ÿ›,XMwºBȾ(K¦ßoXž†P¢ÚUV¥fËõÆáD‡º$ÔSr¾ç?æØ.ùVö¼Ë8˜šxâZ¢ 4ßÌíÙ•€¡ü0×kç8WÐÕÎvó 5¾Î‘kc9½è(ÅÊ9p:æOggSY?ÏBH<‰œ-_\\Uda_WaX]ZWa^[Z^X\\\]`\\XdZ^WZ\\X^]YXYXY^^\¶&©å{ÌBT“ V¿Ÿi* F\)ÃR¬æNæZù{ 1¦atºZ‚–]Æ­,1–€¸ìõI@ 8åµÛâX©FBÓ¥J㎀’9ÿ74.LêxH<òFj,(¾flé[ë®AÁ- '{}ÛCöCè{ív’Úï$$?ñ›8ô{¼¥³ä1M ˆ¼AT†¹‡¨®Ç@rWË<¼ìýÞW#ï³=0áš­AÔ›wé<„ûŒÈ$÷¤õz²b°ý÷ ƒV hÀiÔÊH\ðRƒóýÞŠ„5OFbÅgT0ò6®0Mæß›~»k¡I¾Œ>òÐõe²7[‹)÷Ê%3õŽ<ñ«ª'ב’<_£Mª)û„³±”¶-Â-Ë”*‹/XÔþéÛÚ/»N´ˆý «Š{‹öÃÛ#t‚^-JãZ×úàyx1:Bw£ÂøŒÀßFL]´{΀7©åÎfkÌ;S‚t–®×´Ï77k¶­\c—…E(ÔK÷?{ž÷O<¦ùqb)K§<^Ÿ§,qæÞLµäe0Zk‘¸™ç±™“v?Œ&}ŸDs+Ï,ÿ-R™¦Ì\½hèÏ'>cÙ›®Z,Öèn˜Š9™]o÷·ŽÎ³ú¤™ƒ’…µÆÜ» ê®EÆpGæ Ž“c’Ò{;}Mymô\¹+ì$ˆkÁ­§3;åº*éµ¾I’aÀªþùÅ?·’Ï“•²<ïVèÞ6-ïÇ“ÓUê8+YÈèqÕÉ'¥ å7Á©«P`…)ÁQRúApJ\¨s€ÂÁW‡•j/ú†Š cC{1J„3¾èR‰»Êl€e þ E×ÿî¾òÕ{ÝúQÁ™e„^Ž‘ÃK$Ãsª±mþ¡çlŸB=3¨™«}O%Çë«°ë%/gÅôŠåº1#½Í |[¾ry¹W‰NB9½î9ÁѶ§ o­FN$Q_~uúpº539\wœMB/vQŒý©Õ6ߣÂx%BÚ’¹‡Ïó8Ž­öÿ9o!¥Ç0ÇvllÙ‚UaÃä«£I¼Ž@3'ÔÌ.?ÄšÕNgžYaÂbÈÊm,‹õ¨\1úK¹Ó¯èWd„­`íyÜÒ/OÖ»C%ÂHƒtXZ[¹± «‚Ý€óå(Èð¡A°ÃFyà ŠÁÁh)Þ8¦œ7/`£¬ù:qíPó^ûâP_+,wÆ,>®Ùê €%ª]«©LYÇ£Ù–ˆL1ˆ¶¥;‡³ì€óQÓòáùU±xo¢ÞÁÎðølŠÖäÉ—:úÓ¼Û¡‹1ˆ!ó$OfÐ2'’[%ëÕÚQº÷»0µ*¯%% æ Ê+K­Ù®™„JTÓ^ ú¯&]«ê’Ä-%Cl5?ý¾ˆÛŒ{/š‘(Ê3¡„™âVhŠ;qà8Œ¡#½‰°¤ÕTY‰GOÓ#ݪÝÑÙm>fÕ:Î*K«u $–$Ÿ¿~i8Bï›$òúŠÁ"͸·çÕRŒ^FæM2cå}Ìi¡ªÔ’ï ´…Ž{Î…áȉ®2Ò2ÔHgRÊ󠯺Šíä,Lçnµ¸GjÆ)K.[НàûêÛiú¦ÿæ~}Æ–D3ùnݽÑɳš4õ†œRŸÇÃD`x®ŽdÞ¸ºÏ‡44éyÁ(zmæø°÷:pÈE­ÑÝ¿_ŸD…M¦M•n6m’Ѫ]qjÂ)¾¦ÙŠ PÔ»üÖË{ô]9tw©"ø£<IºÃñ¼2¿TV¼2RîCm¾~©ÛŸˆËI~ôĽ5{ua\»|ÔQóÈ,ÛP¨GhŽ^¾®eÂi¨S-Á5”¨~r¥]ü±‹)©¿¿LhÔ])YÉÈ‹asÆCÂfÆÞïò/¯éâi8ã—FL­nõÛß*]÷&éÜ%MŽJ»»ÃŠ?ûKãrÛ*‹Y´Tò•Â)KÔ'µE è¾Z¹ëþ·ÓÜØÑ¤e–u¦âc=XÔôh&Buã*ùºì‡ HyÅ< ÎqÛK/?cZBàÚw=|æûÒeÐiD:ª6ö[õ*rK¥\ÏJ`Ø>¾'¾Ô:Sû₨ìÎúâEÞx§¶ÃÅǤðûáeÎÐNÌ}i—/çù&Ôi›˜LÈ§Ó“ŽˆÝs®™Þ,÷ º$¢Æ`Ico¡ArŸll—MZO7É/Nϯí̵­Á]²¬#[ʆ(íGµÿá¸!“^ݺnYÉÀøÜ¥îC´)»Ž‰ù÷»#!r¤Í=Ä×Õ©÷TÞPg^r޵ŽÙ9V·h„C¾µ– µ?ïØî Fo"ö7¾,Õ)f§4bP/϶?¸²Ÿ˜ü~û¢¯ÆÄÜL¦Œ•hºûè_Ý#¨™<Ö^ÇËpÖEkÛ䜔U]ÜP]rV— ømÂñ‚j·õBþÚ§õ…)èØ3a˜‘Ú®+@]ØVH¢U­'ÿ¤y뽉2Þ¸;BÿvA‡ü#¿&1ôsXm IX L ÓõW7”9t*ôÚ½™ºoÇtcÀ,?e߯Gû4?u^Zo‘û@L“ËÙ˜å¯ueºjGué"H €úöyïÉ÷-ãÕcžl}È:iâ:JI}¿ØævVcD÷b¾¿™ åÓ&”™UÚ¤üÊÓâeóÓöHœÙ~OÎóIp–²mO?‚Ì’à1L2-Eæº)ÕµöTVådö•{£±™Îø±¿nœ$þ9Ÿ XÉ£¥ôÜ/¾‘M¸e–sýÕ‡ÑZÏ}1Æí9׋i™4К*ô³ëç?"hVeZI™øBþϽ·[Âlh¾gl÷‹jÀ$ˆÖ¶{úï«éÇC\¶ëêf”¾o繟[»QFÁÈMÞ›KrÙ"Û}AC•¡ÆSTþ£ éF&ùäZSÑ¡£×z–&O¼ wɲ#*³.”¥ú)Š©ßŒ¦2ŒÚ¾çRˆ3Âx´ºxþïõ©¾Raö†^ðmΕ7‘¦N"öàM¾þÁFVÚÀ¸úMú›Ìp¯‹uÇÑ_³yÃĵC*ú²ý/šm©¦³Œ:åDäÅÃylŽª¥¿žæj4¸@mUû‡jÃÁ‡Kîv4¥â¥&ôcÝÑhT’³ä£<†œ}7þ¡ã{4„Ó,h¿w=´gx`Æz‡3S„IŒÆkb#6çó•Š­æn1%¿«•¶eù „µ:Æ÷Ûy/SÛ‚uMCSò3?èhŸUB¦ãã·Sì8Ló¶lº‹éâßygYoƉKA¢*nòç)¾Óæâ†üÏ$} ±F÷¶†s A”®£ƒg£: ä$P©¬O÷í>—½ÓY-I­wÆsnço™“0XÏ»Tó-4Æ¢"ž‰#+i_hvý¬ %áCw#x–>/ìÑÊÇì¼– E|“eâÔ»êrßî<¯etÊãü/ÇV€<ÁÚÇgO ©Æi¸Ÿ.Ï|²ò‰×brИÜiÏiñ?Wj*Ôet [r:gÉèy™*s»¶ª¹{Þ'ŸQÇIyR u]&"·1Wk»~˜Î‘_Ââ,¯?Ã4à0M¸ÿœ§™¥~ÓË-ËâY‹¦ÞYæÕMšÖÖ=;¾-l^)Àœ‰®'ÕU¥;ÓgBP=‘FgÍÔ'ÉIöDÑõBŸË;žX4•§î¦«k0ÂàãÏ$} €+9Ýo»EW…ß7ÚF—÷>øzïeu¹³WˆÛW^|EÎý} s.2¢5¼ Ývkï,uN©eºªcaKaêîI΃”V"k¯å¾à,¯ÿ^Ø÷`ñ•ߣ;¹³ü\žØ¶UÔ#7»_½š>ý–Ç«–e˜7v›Ó{œVÑ*†ÖätžtßÚÞÀ®™›Œx™õFﺵìk…»lƒÅ²àð¯ÆßJÆÞ  –¨|_¦gjW/ãú؇µ#ÎÖZC'¤í¤ÌËn±Ž'‹ùxŸL+™+$=”î6ïUŠ57iŽÖ†×žÝƒSZ„¤‡Ü·ÉœX1§ð^äÎÚ»’N £òÂ^lé¯`æ#åsóuñ•k¦g|5Jhkšˆg´Î‡ÞnÅÇPÖǸÌò¢‘ %Þñ.%˜åd‡°öܕߺö¹mká„oæjD“+61ØH»’~ÚZ ÂÞÖÖ øc,g|ëÒjíUë®uõëO3ÏÕ<õ íÑ|´ž< óçÆTàjJ%âIƒ¯ÄÜΖÜÅZ{zÄ­˜»­Œ´½;Ätå…PM¬4 G¾¾ÝâJ]¹PúqŠrzçƒmº¾?+üz`ÊÜaTC…9S“çmWÿ™LdžY p™ï•Ƹ¤ÙTÙ·úô‰ôõWjkt ™UªƒR–Ëüeh1ìÈ Ù§Ó¾Ýn›É%(Õ«¢¼»ôad»s`¹ûó§¶UÍ{+=¿¹6q¶u9“‹Ÿz¼Üi×9I*š™ÆÖiw!/ƒ8+.éÍËσºõÔ(_[-«vøVëã» f®*”l„£?ñïÑ“}se¬^î5ø¸•ÉÌö«“Xc­ÚFô;"YFÔP%Õ™´¼*ÌlœÅ{Ù‡CÔ f„ñÖCwÞ>ŽÙ @wïÝÍ÷ÇŠ}_gË®-Àúì hÀW«Ó³·¿Ï·kƸc–¬iˆoóÃj&F.á±}áîÒT³¡„5÷½Ã. >õzbõó`3µF™'ïc·gÉ£®Þ;Uˆà Ý’…Ä¡.^C ®,à•Þˆî×§‰ÉóÞ©x6…mXÖE¥Ö?º¥Û ׇQÐÔŸO©èe£I­q2ÔÿèŠW ¢Hùœö~ãrKÚjòóä_çafvõ8ôC“ßZœÄÊÃãô×¶+•˜è$(Hà«nþµß>3mýÚ’4µ““^;¯wï†õ!Ñ!夭í~‘jjhDà»?m9;첚!%º¹“(']“k!.Z[ZYWX[Z]]b^`ZYV]aZUZ]Y]Z\[^`]ZZ\VX\]Z\X`]YYWbª*„l.ª ”è>nùçÙ'›giÏï]©E;ª“yƨ;ò¶¿-OÆGþÊ N T$ ¸þ¤ËÉË]¡–m”¸„êp¾ë8ŠìLŸ—»è‘¯=žôKç ²iPs½MŠ| €ZW~ÔÚ÷°ùð¨ç15ˆ•Y ÙÛè¾-¸C ãDôXéóºJè"šTg y°JBºsÔ”GK Òx’O­¦=–^ËÕôÛ'€º CíRv”ƒ¶gs¹@’U1ÝøîOš´»ÿ½l«êâöÉíù”RD)¬‚ê¶tõ³ßÌý[¤ŽÀ€9ÓkÎc›Â9LëÕÞþûáÄáS(7p›ä‘=²^£xzô16¶gÐû>Æf"‹@­§_oyþ.®õÙ°FûÑ*ß.g¹dМ¬üq5rs®îùsÃ϶úøæ"³;•›Â—–éëû,Þ£h—)õ` 3Ö¥}xfSçMÒ– ®¦ žp«jôè¼÷Á D‹å±¤êˆ¹×(K¥¬½"/Æ>ôTfA[Lí9â‘JóvÆ^æ¹/“dK¹ÆËü3±ïjíÝm‡ñš}ß%2ô²dl¸ß ÄZ$€\­­ªßöL“ÛèI?Õ'¿ßŸEkg¢­™½FäC{oq³ãb¥µLu·øg!· $o)FlåäÙt9¬B]{¨"n5Üf¿þu/³lÑÊ,¾&Ù´s‘bŒÊÿŒÍ±%Mª,rbUZ?•+æÙh´KÉöáX•»‰Ó”Œ­éåSM¤¤1íóʘ•¦Bɉ’aÏóšjÓ͹ÇÐÄ«£òÉ€¿œ†‘6À˜5Â->Ôl|pX,êkWÕÝRh vVŠ.±)ð$õ6èêZ.yTN:¢0wßÓw;C™CÄ㣤¹Éº1¨$2¶Ÿ 4Æ*¾®Ù¶º ,Ñ¿v¶&o>ðN^ iÑ­¦¨_ÂQÆ™VqSu£·³;šùŠôW|«Y§èU,RIÊÓ,×zI';›³Ur"Éê*në -¹Š:pÓAÌʬb=Æ*K.o”€¨bÌçÛ­_âÁuUºmqeMçï&F‡÷¦„sdzÞ R*³?kN–"…ª[ £9žDÖsø»MˬR O«ÈŠQĨ#|xLKA §êÌ‘OÂ)K&ïDÃ6p¾ÿҌƾ ]ÍËü¸h*‰èÚ©l<»’´Þî5l6éûâ²ýºæì™žž%ñ Ã*<ÙÌ„‰’ÑÛ:âFÜú:‡(Æ·ÜþPÑ}ç4'Wb±<é ¿•ö±”=Ê)K®¯aQÀÖà»{sáL>µöUçJô…í9É wóŒØ<¦ø»ž r¢ypÑÙ¹Õ5”ýúbvsDÎýR<Šã‚!ä&tµû˜ëÚJ°Æ™0ºž*u^zzžÂ'ÕÙp6×€‹ÁÛÝY{ïzŸ­6/îXµE3÷réÅ¢í骷®NÕÕñÙ‘±ë³k©n=òHâÁ)œŸŠÖÑúé‚ÂáAcªÕÔ¾¿vfÕ9Vq™±Žùs®|%}Ô¾(K”7 €·øJd|Z+VôÉcç&óà¤yßž'ýžšzËÓ$Þ)¨¼U´£™ëâ}øY4`U*ùaªk§Ö3‰ê¯%™ ( ZÿñêxÕ«Ì–"ªo™–¾&•Y¾ €â«om}=íÓY·åê­g‹<3vmÛgÜ8P¹d•Ã|•· l HýMj_ññl«z Q}AK(¡—(_˜T`…QæË™É9>T”n¬«—…'¶+‰õ»;ŠZ¹hnêînÕi‡¾Aš"156®E©:¸Õ•5”­ zXõ/ÓXƒ’à¢Çv—º!hï ¡—vÎÑr"2¸}ÿØ9Àb°ù×uÐ÷·Öª.Œº¹R,D+ãOíB»)'!Ý“';u¦â–Þ¾pð°R“ŸFv](bB´c2Æj™¾8æÅ͸Öršޘç®·'­µ•BñN@.ƿٶõßâkØìš|%6ÞóL-x¶+©]7ÇtIHÖ'ÓWeæþM|6¬.hƒÖÄäÇs*DR)É{’¥íäm«žå\zc_âƒë¤7>û<%puËá:¿¢Ìp®y\î`‡€ Ü·óc(žì‚npL½3Bº+Õ¥ÎD"©Ž;Ÿ^¬§üßí“ÚIÛ?5™fÂ;ÌžþààÓ/³¿=ÞóOØ:Õc‰F‹g²ÖsRð÷H->šT\ÆyÍwÏß§Ì.‹'Øä˜87 :é2*{¯R²*‰´N<$ÕŒÛ×ÇýïÍ_Cîìm©ÇñUråÇxÍå$HÖÙv-DᥪçC쮃 ‚4öî‡É»ip²KkØ!1˜Æý쾯¶sÐÓQ‹€‚‹nÆù›3 ²jPó>°1€÷5âãÞô¯ßwÿœ½­Å÷QV±†¼Ü1jUeT ᳈†qµE¬Æ·["¼?«hÝ1€ÇK0tÚCNùíÄn?æ9æBNæÈž¶gs6eÎ 2€ÚÙÿÊxmð¨>3ýªë]ì½qJ°ÆF†oGÑ ÌyGÞÌõFÀ=ðŠŽýŒqLßUÏ}žLñl™¥®Kdã•(žKd(Ì ¤ô–6û”!£Dœ*²fÀ>Õ«ÓÖsï‹£‰wã-§V$kÒSâ=Ù|ÜeFMÎL˜3”‚_GQ éô’<*{3çc§O1Á)Êæt?ÿÂ\Ûè›åºÇÌ•û—òƒ9m»®e–â·f4E‡Å]£oÏ^ŸfÊ»woAm²ã• —g<üi/gòì²±JEUj=Ø2¼„Ctë#æ­Üãå3gÕ´™†)+FßL‹aµ hÀñ9²~Œ|~t;Jªd:ʳ´j&hôÓ#Sk›—×Ú(„Ci4ÑnqCŒÑÆÄ×,Ñv÷ñ¤{oJæÎMÕ7®ùuaŸ¢œ ìœÍ›·2° Úúç€%ŸeeMUMí\Î˶ÊÄÊbøÇ=ÀW«GÇ× oÆd¬Ky¥™^ëNŽë $cSÛ‡_ßg†J·‚\ pu´’[Âf.þw¾4 9m "‡êaÞÌ/ ïN¹ui( äpª™Žn`eÎáÊ{ê÷ B2ªš®îÃe]33œFiæ—2mMô¯‰éµÔ¤¤¾þõæôä\/‘pè}í(géØª4µ|ÞŠ!yðêJŽ!½zªxYÿ^éî½}t›R½…LÂᬿ­r–h½Îo&«g‹”íøþ6ëÍmýãÉy›µ‘üù2×Q¶¹{hx˜¯yº;U›€u„ÛT¶VjtåšÖ4G)¼!Ä´{á¸dì©“†Q> »|UmÏ%Æßʶ½É t|«6ª¨¶cí uKï9ûhŠaHë®´«æã­©›WóW‰–9 6X!…7tÆvŒÐõièuẶÜHjFnÌš œÍJMO)íÎlî>¶¼%sN·z1Ä\ËÍÂ^xó÷ š>Èd‰êësÛå¹´Î÷}Ó¸LÉ\fpÌ8M£>ä)½e¼ôvAˆ¢ìÍæ´|üî3²™<ý1L%zPâêi@Ô£ÓKN¢b ,˜\Z‡xp¢pøÐÆ)˦¿CP. y'©V?-¦k/µ¢ô±ÿZÕ0Âzâ­ºû±R-¢˜!q´Z›j­qùƒÀp ÊÇ èÊyò1¥‹÷²4Hlé¼QÔ'.Û4Âhl¶\ËöÀ|’†›‹wõÞ7.:X)÷U0ôÃj5£;å_Ek…I%IxÂvšQê1g§¤#…)eý(À¯L°2ðÓñÄÇîݤ/Äë{•ºg(ÇëÙ0ØÛ±$õé _Ž;fb¸òÂ\3E™=ñ7ýïô;û;ÿ·…A[ÇàÙÚ¨´9}ì Ù¬#êNï8gí¦\gk¥,¸ìk4TTI œÔýôk³,¾exÕÛAB´dV†ÑƒăYƒŽ?þc5wxT|ø»óäö䯵ká,ξ&&Õ³–iÞøìuµnÝGTM \_†'* q˜º)Já†Zòn’ºhhÓ&!dQýîÊ¥µÛkÈ‹—wmâYULTœüø•Ù;¼™rxò8¡˜°kÕ?×8€îîˆ÷C;D<žÞzdž!Š)±"±ØFpQÆc@ÙÝ-ö¾¿š®-Ì[œà«ÕOþiëÇÓ­ÉDgß'×Ô·Œú§œ8&SQ÷ó‡3X™G9QËd¢z´Ø:GÜ9#ÓEy±œÄ̧Èèyæ– {a¥ß×à+ŒFÄcu3¶+qê«êð­Ö[_Üìô»0מYûèÎ{IÕ7He/þöyu»ŠqEƒås˜Óª8Ï9—¸yD†Yî¾tAvW~Å`Æ&”£¯jgDŸwäUq¦ Õsù( °®yC®++±WdxÀjɯ°vìÝ…{ºe†°t¦ÒÏ[œð%Í$Ò‹±º5%Uj€[L¿Í~=æZÌæ™Ý=Sb`VžB ×SMcÎì­ÇÑmOÉ,þ‡M‹— ¾+½eL:€€éÎñ«“w«äÅãûù0B:+¿žš8‘ é;Z%ç‹$Oú)ÙðŠåꈕ±ßåüiB‡.´Šò¤Õá¶òÜE‰™¥ëü‹òPÑ«–½:(¶©r£N J`шºåè3ù¸ûÖIجÚXQñ¶¶.ïÎbVa’?¾—U§_Æé-碫ú›ÞóÞ˜cäPІ§À;ESIŘ¾˜Mš…óKØy¾Ÿ•²Ç ºfÐGû¢€ àÛ@£îNü˜ýúÝŸ‡ºw¾W˜FöÉ×Û»äHÚÌx‡Y’1wËO½{çjßÄd¯ p¤ &…ºfEÜÀˆ$â˜û!÷dÞS‡zÏ–U­¶‰ì@çM³Žpà¶f(Ó JI$ú_NµŠ{}z_ý;Í‹¸ô$ŠÊmÖyz¼Ð‚b.õ,Ó£šµíä™D¶„µÞ>;ô.úF/І{5x÷y¿Dß»s%²¦Wyzƒ§éȬóýím_§ ¦^^ãN| oûïȨw½7ì“”Ô,ÕQ†*J^eÁš‹¡q MâÊba®åÛuζ| @2vþ3ŠJ‘Qo½¶dxñdÂ%0Äg‡ö/oé?qÒ{Zã^Êã´ŒÙù»—þÖÚƒ¯®`œµòs-߯M#Œ²°!PdÙ=^³Ïkµ„×ñj™:2Ù`/¸½ý4/{Ê+K”ê³€•ýC‰Ï—¶nIY‘bcßåm KNQy–Ð}8/aj-ìûÎBãâõèQ²é¬D{ùñ¯X~p"99‚BlßæÁÚ…¸–@õ‡¤Êml²9NÓ ˜€  –z¯P<\–f+ºLáj-VéÆåÞ$«kËq•òÃt1$›¥:Êi~^ÅÕd 1/8Hòoð/ÇfÕÉtOZÅઉh„àéc­Ò#û½KX¹XœàŠWÂeØOggS´?ÏBHH\Ùò-`[[\\ZaWcX`]Z_YV[XY\Z[^YZZW\]W]Y\Y[\Wa[`^Z^_[¾+5[WÔ€‹Qû¹™W7Ë2oŸ‚¨ågË㼸w}WüàÄÈœ9ËËî·»‚¨{vÈ“T‘xÃCÒ㹑ÿGð²ØuºJ7/ ›%~ @šsp¡ÿÌž& D#Æ*K&›1Ià ¨ý—‡·™áÐwâÀ²~™Ýøc2æQßùé<ÿ” K|K]) (­ñM—µÄ”ž8¾9ª±³‚+ùªCÖw§î-"‡±º¸'è5L·n ’<ûî(w¾*É%Ûİ «Å|³Y½ðÌ jñpC4ãèÎðônN>ÿÛâJhœõMo¯Ñcv|Y‡k&(ãÜ—uËWáê!ï§‹ Än½V/Kò8žo(\EÁÖ2WJ IÂÆ)¾lëv(Ñúûpêêe¢ùÎkw^Œç«ùG=ónΉÇqü Ÿóç Vx_-‹¸…9u`Vî<ØfȉV÷fŽ)Li`(š5 nBSž]‹Ì¬âõq å¶‚ø­Ø£Þ ¶)ayeˆ@]‹b]Î,Œ¤|¿òúûÒÙvšV1žö­ÛCë.ïöºb¾½»ÇyhGêŽÎú ñ6vïíViNä֩îÆíQy¨7Gd—·8B_xê'5h@…)Z¾)•uKq 8_¹I^š§í™0?üùÚµ·ÓÚNɃÝf¤š ‹uÁø®å‘Ñ‘•›ÏŠÆ€Tù2sƒdÔl"ìvtÀ¬ð –R½¹Ì°ÒÌ%ùÊL‘^ƶ¨œ¯¿B£4`­~ö*rm6$¯gý¹dýMûïÛy"[=%vv‚Ö6ËIóKˆuÔço]oGÝá„Ò{a7ݘýD*œ úÜý­a¤@M´Ákw!æÕÓ3_Úwûi&¶'‰t;|@­(Ï’3åþ8ÙçÖΣ•·ñf\ާ{ÆØeœÇ‹™¾ŸÒ»tHt’tÉÑX`Nçì^Üüü¸%šÖ¿Îç¼n¡°_v&:+ˆÒ3f¥)¶,‰yu€T€ ÆÙg¦çJÿÞãõÛYÀ¶ò±Å°ì<ùpyèÉ®ê^Áï1+$¶ÿì[ÿ“YÙÓÙ"‘:Ž2†.“ÀºrÏF…ɳßâg¤ ëV)Ìóé7.L*x¼“øRD ®-@¶3 €æK×=ï;3³µwKU”‘bŽŸCêv¡ÁNîv›AE®¦SQ'ENœU¯µµÐe®òéÄ|ݾ¼gÛðÕ÷¡‘½T…Õ½†ö¶+ée»Ù\BÑjÝíNwk>¯äãŠÑÉu3¡òÇⲓ é„Mi}®º¨F$ÛAÂP@eÕ¼µ™úp‰8ߘå!);1Á¬¯ÿýå{“£ùxÒwWŸgS_K C©0Î1[jO§ëFÁºr/ÜØÌéó^™¤<8F?I¶ž( …™žeÖ¥;²'‰e(@nUÿ´»èµîß¹uèÒÐü´g›‡½äÓÕö{Å¢÷ëÑlÅ銹·é=ÝÖîâ19CY+¶bïŒgÇ[£qcNо®EŒ²=‹§ ²g:FÛP@R4Öé-f8œö;Mø3keŒ=Æ–Þ´÷&⎭LΣï, Õ¾&õícâüòxAÔs}ìFóçë¹tœ™¡Î¸#M“±ï¶îqtæÖ¾bxæ4èœh ²gºÆo @" ,jUœD«×šç(1k–8KÊÖ•åXÊhojtNœîr³ŽÌyÛ–aýŒ³þ&é†KÉü5åk Ûk«ªš½ýtšÆ»uö÷Øì<«{ªf¦é]Ù ¨jE[±ß8¸/$ì^‡Ÿ‘•yšJ$þë}uÖnzcžVÄî’GUj~Üâ—Aæøpõl !+錅i¿³Ä6z£[¢çì>ÙŠWæ²eÛ†^—$ R¥fšÈÜMUH]§æµN5"ï—'ÇWïõÛÝ”°­ÎLÜIeµLYÝ®cþªo¤n[øÛ-¬;9Î{Ç~ý"‹õ·Ëvcq2ôrTË5rdPÂdýÄS±0‘©Å{vWðó¾_ô¥®k›ÜêðÿÎpçü鿇,hÙ¬8§ê ÒÔ&ÅS†·ÉÓZ}•£#knÉZ_öiÍ|ýÃLߺ¡XûÇó®;;“Æaèóã¹3ÛwXÕ*{ÑóØŽÞªó3-6kµ³Ù{ïùác÷¿|À~U„¶l²((‘íg¥åf?œCï½áÇXy"S¤ª ,_u§[rsdõ›‡Ëa3ÆáÊÄ—ŸÐlúžDßZ²íåꙫkØð!ĹÑãÅøó³?ìKv}8iYjA icr%Ó IX:êSÕ|â p®ñˆ<ù²²QŽó"…# š¹·¢llÊàù†½÷ €‚Ú]²ååÝXvçÅ”¿žK««6¿ß}—xp5?7ǧk›L®f ý‹ªMwê·mC/Ø–QmogéT…Iðìñcz£7æ#ïMiÓh¾æ‘ª Âß…„¯ øJc%9,ó4=÷§Èì›çk[Ú¥ÍóùÎÕø+v¿‰ Cú”Mm¸†÷JTΧä1XKrÛ4—JÀàÊŠú‚{Tr—ÔO ë…w‚ç÷v¾ÞIzþý 0Vµ¿÷´î[í8îwÈ5V—4{Æ0ß~)%åþqOé¾”˜FõÉ’B;$S/òzDD6G|~w'€I…:í¢VõL,·Lfxºµ)Só÷uìî_L¾ÝI o— I øÊwe±ÑU1ôÍ?¬‰\4tjÇâ²bØ‹±ÇsÄ'öEÑY´~Ä|ú*jù#ë9‹V5¡¦î7¤ôiH­b¹ÖÆJ~C(Úr™É¶qwºÞÌ÷-TF!ZÞ¶wFï-{ÏÆdç±€¥Ó^Ýqäþ|4ÕÉs´WÊtN\+g¿è÷¦öÄŸ’WÚÕ唩ÜIp¯«` QÈRn>ß¼óFÑ{lY§°£j¾ÞY̶th®V™Euë¼_ýÖ+wï¼ð°'‚XïßÜ“•õîJ¦FN™¸¨…“Ÿ´U7±£²S}QO5­ÎW¹ÃDJ*9Tι «zL‹©£ ÃÉ8¶aéOk ÙAQn}õk<£÷IßcFBwb^t”z É³­nïôÛ'eȘ…$°¼ˆ‘O¿øíB˜"0ÛŽ§òÊj‡ôÒò`md–\+ÝßÚªOn—Àº,©™ ÄøøÏñNÚ”ÎÙÁc°oe¤V›yòÅi¿DH°ÞV¡i<ÈÐ*iá3QûØ@?ä¼ØÆºEˆ’‡p~×ìmCh»+Vjã‡CŠB¬&¼kž½•º-ÕYZ@U•Gÿ~•û ów‹uµZ«ÓI&ûÞ}ÒGrnfX uéÌ´—R‡Gïý$nÊN—yã¡¥Ç8,ùª¡®æìAÆ‚ðíäM;»äéˆß£Gä(Ž<½Ô®+À`Q3slçoâ]rìµýÆ)akúñ˜n¥TDîyŪöP˜ÃL—uáC ³JѸ:=•*&£uXèü´–ë«T&›Ÿrêçù%2y+ºªÆìítPX•½ûï켯6–´©Ë׆ÊÐçuËÕPUÖܺ5_Ûì[UËAUMx„`JO2‡9sºiÜûd–HZIQÑR®‹'åÙ/úé+@™ÔÇ;÷Tª¨ÐfŒ‚`aªzªßÉÿ+ý•ͨ<îM-e=Nßæ]Ê2Óº×|?O*®£Å™J·ðÏV8}üáwÞÖ)«a0p’ä“~b;¨âá3qóIÌW^2O#Òc²¦\¯Ùâ ‘Ù@aUßÞÎØÓFÇ3ý^dÿiÝe!ìL–íÉùˆN)xùùÿåû ³«k]{’ ¿ ß̧my:˜ ÏnÙ¢çb3‡ETî\=©\Y!ƒ’ÙÜ4% ‡S¯á•ÚšÜ%h­Z¡Î'èçàÜÊ’²£±n•ž4PÔQÓ¾~e:íɧn™òtÓz„'–eO‡-)Þ¹¬æÄäÔ{jëèH²L \ƒ€FBãêbÎ9-†+ñŠÁS™Õ#&ærIŠ=‘µQæ‰wë2µH®( ›‹lŒ @QûÉÄíg×ß÷ý|OB®taažb,úͰµZ«.ù®ÝɉÅbím€uîOBÄ-¿LÂÆÙl6»õŒ2ûðÿûÇCÍFÏ„œ(q˘5Æ+É5›î§Du\Šþþù\íò¢fs%˜Ÿ¾¬[Äá´r?Ãèáû¯°È‘O‰­¯Í×”(µf‘:¶8µH³7.Yc-›YÔëaa-ŸÃ¦HtÇé°‹Îk_i°0D2Î+¾­ÙÔãD,V•³Û¸xÕ³×Cµ }­ó†0/xËЖ+?åù®wd÷`D‹´ŽµÁi-Zã×°—##Óå¸4NjVå–iHÌ.Wžšà³½W•1Qí™< ¾+ži¶¬HÉâÔêân¸uÛp[èØa–þáæžß_>Âñf¹O£wÞÝ›qïßSõ„¸èMÚ§>QÊ„‚Àüâ=¤[4F‘Pò‘}%`U»g$ùgY9P9!3Â*¾.oÒŒpA6P¢¿¾}$޹²rü½`wþXë:í¡ÄÇw˯سŒ˜³à¼í¶)·Ìæsk08-*·ªžÛ¸öMMæ9±‰Óˆälìñ°V¾@ŽÈ‰N¹l‹Z¬¾)éÉÞX}ßÉØ6[œzù½‚ó§+åø™ÛNŸøqÕò¸_¯éBäæ=·÷ΤnVË`’S'ÄTp ³}Uç$Ë×#ô:½µVKG ±Ò®)‡^.%ÇÍ ¾){I²»8ÐfÔŠõ4ú*™{Þ—3 ÛˆÛ#v*lSÉWὟòÍÔøúTg˜€ãC)‰SºÇK_<¹<#b^¸ø\9Kr»¾¬˜ž+u(ÕzºFmž4cVXYºhàü½º¸pJ¬ÖJuqÕ‘kÅl©”Ôw[ÖŒ¶#ó½|YHè{í;o™Z½¥#Dý˜îý¦ð>ÝëKÁË¢×Lá3}wÄ4r¤æ„ñy¡–œ¹²ñ¥ž­¨F]Þ‘` àœ_UpGéÝæ±`ÆÊM¥¶Ä2~žùl­¡GübpºóI檊˜ãžÇ¥øUk!e“R–çÂè»Z]]y‰¯1ŒÆdÒŽ8g¬>‚eQyè™ ¼OggSá?ÏBHÃqÔ}-\Zb^\[[]TU[`]XZ[_Y_ZU`_c]`^a[Q]^`[\\_^YT`c__[¶&q}Ã’k€¨Ôêlt†É« òW‰î#¡Sgï;{¶tWmM8Êz¨ö@ã̾ºcÞãÈ•u^Íð#Ž>Á«é13OoÇY$ˆ')·V:§³ZgåÎõ•´á¶+aù-‘xŒê»W[ÛKµ¸ëPÚ)ž{e-Ú^–ó~‘˜aÂÂê¨Ô„îKVc/ä:É06“ïS 4ZâmµŒN=Á‘†6Oˆ¾|ô¯dëy?ŸæyF€Â+¾.cAqÀbAýý{‹y/ñ9Œ—ç ›)ös£¶·¤Z4¯õt['†ï¤†6ùô"Íéñ~ª;}ý›c©´sm¡õ6šIkÌiT®ò¬H³FcVáGTÑùAú4<Ȥ‚¾,õYφPXÕó©;·÷Œ-fÏÚÓ½µ¾==Y×|âSrr÷´¢-¹uþÚÈØc60Ü>ZzI¡ˆ-l½ñVžuï¶yZÓÒ‡K£€†s ]Â¥KiÀ iÊÌiðY,>;¾*KÔ1ÜØ!€¤¯¾Ùïód<~~àͬ›ûƒe iÏ»‡Æ«ó¬k“™'÷ÓлÆh2ÙÈuía'±.ÅõÀmÜ|âÉÈqüÎZ'_ô•Éò3ÊÄmNQÞíº(KÔw ¸ȬêÂVU¿™Q6ÿŠ]‚ËñÌ2ôÎ…L:ù²ú$G”ž†í[’á„D9ºžÂç\û9G„>:¡Ü܆ßOúthra $sÖs nâQ<ÜÍ[²h@´¾Ð'&@F¨ÕÏû~L§)é®ÍŽkå¯JFnqý¶ólmJÂoôQ£%ÄÍF …ãË9ït8Ž_ŒÕ ±VŠÒÓ­?(5\¦7X‘o|vÛŒvVVºhÐû®Ú 2£4L½Oº°Ó.ÝÞ£ )ëïÃàXÛß^›ƒ=Ö»—âÐ#ƒÒEª ¥Z±øxg<5ùßxÒõøÇE8ñ3jq+»˜¹ñª¿ñ¶’­™ÜeÙH òÀ¶æl‡›µRÐÁ cUbÏUYõÛœøˆ·ÍUw;$V½ñq2?Ÿ|ÅšòYX€ ó]ßµÛµ]Ô™³gÚ«†ÿú4í)¦õ>>™UgùÔŸbб#²æŒæ¾”p'QÕŒºKÚŸ›—_^ª¬ËŒ™«Z,«¯òÉÞÅšo¦Õ~Æàލ{tãV¿ˆT Ó¯{‰DFnª²qìø›…¥i›e®=kǶþèXÓ¶´Z›OBÕ qÑŸkMÑKõKͽt 4ßclþÔ«ßôÈ&‡=%iÐ#N“êœÀ¾çR _E`xŒÁ©Õv‹—.}±ÜÖ÷”HÙñôÉjׄ>Þ¬Šl†tÂú0h$gS¦æ~Ì£Goã©af³ø[y±Žž)ЭFÔ•AGžß¨7Æi\Mu+ä `…ê¤wK÷ôÈîÓ>%ë¶Aßñódœ*q:m®Ürînû¹è¼g¤ú:”oÄKiÑÏå·WEˆ:ßbs:ë{í ýŒ[Zźyçˆqî~»ï‘¾glŒ7®vHɨԡ’gô¹}x©ÎÎF0V #l©¾‰}Ö’«~õyZŸ³HôÃ.cÝâà€©?­Œ"¢Ç ®ÎßÁT?&&ÓSì/ä‰Kó|'æÂ„ï¾å\/7Û ~’ó Õ;ÎÈßç»iŸ­b;ûH‚ż04…F7ugXŸ#·µ¬æÁn‹œC¨ëÉqçR¿õÓž ƒ"•_IRŸÄˆ˜›r©¥.eý­>àåuCôÔºâI·/R¦VŸ¾û›äÇøü–öÌOÿl”ÔŽ¯ß¿=|Æ<ãÂG´„{:Ëó¥¯H>D±Œeyî8¤ã‘GʉJs‰(ä´§ráács>âïèvº,é¥jGÕO¦¾¾ø<'qy×Ò•ÕÄF®=VÝÈÔ &¤Ä.ê6Ô^"BmÇ®€Th/õ´9f%“žz î7W×¼³äø3F¡‡:hî|ñÔº-éÙ•©øðmõãõSËQÝÙßH¤˜É¯í§'öÚû&a™ìqs‘5ß[ĘOX~‚Ÿ(5! ýäâææ—ó„@úž®¶BqIóçÂ|èÚ.¼u ·eŸ{Š`«¦+Šdo<²,~°Î‡¯¶72FÊË…-••Lti[*<_»GíEMœãUÀÌ8/²7Zä´±r;û·3ße,'‘Æ–`Ô æÌ9¯Ì잣x¢øB”é÷“…àH:= º)K”í,à€£P[‡‰ÑýÝ™k3ÆË.m¦M¸Yyq³®ï¿“ÉË·–a•L/BÖòP4*å³YnAñívîñ2^}á–«ÔQâñô7Ýõ¸®´3›µÍÞX·e1B1xB’l²)K”-¶¹$‹  <}þðÚ“ëK?{Ï1þwïµÄ¨»áÝ3ÓŸZ޵Ӯ–Žñæ['Xý¨Ò‡âûŠ=½¡cIàΉ$'ÈvD)¸GXµKÛ{ΉƒQ½yø)ê¶gï—Aaa@ÉÐX÷óülÏ6wã»^«‹gÖÞãܢ,Ý™úG¿ûžÛ&¼P€‡AO"™éÎÆÏä^·búyìbÑoWf©]¶#Ù›ær®Bfn«†nWÙD‰I²f@þvu7€˜Ô±½Í×—îKN¦éïñUE¬ÞonZVɰ9÷ô«+Z&EyV©è™_$h>ó`–‡tȵ5©V>¥¬YŒؤ)Ê%È Ü Cú¨¡ ²eùT'‹‘ù j4ÍÕÔÝÿ÷ÓX†—íû¾XÛmSÓ1§g†Od[𥥕@ñ Bôü§ò"™òi)òM=áŒõþÊí2™Uy ámÆ( ÓÀÛÏ5?ì"ƒozYÜZÿŽ ²¤K}—åyE 6{#Ãõ›«šíÉÔ)örèÏ|¼ôòÞn8ܲ™TÂã|ß4ì?¤ÖüãõÄtÖ b sTq“”¡\íf¬Ü0k ÆA༬€7¸ð&R3up²( õc»¤óåJ»{ýÓ¶·m;#™Ùž\ÛÙLꟵ$ry®Ñx{ê›€Ì ƒX˜pÓýïÎ Å-q®zùÁ 3v%¡˜°lÐ œÐªèÍ:Ê+>¦Ù Þ ±XcKóïþÏáŸñDh´å'Kv³FÓHC*¯Xñ8æ]™Fã²+‹`Ñí4æêÌ­(ö|x½ ÏÞ—‡]&ú‰ ¾ëJz{b Û”B8mÀ“ Î+K&ÙÔ〥¨ ÛkSž™«Âjeó¯±Pß¼B©d*¬|Á¶¥Dџ̰æÁ¸q=£çåˆÔǧøX*øBñ> ‘ª¦ëdÚ¬r«Íñ»ýX§gºvßüŒbÌ)ç¾kìFï÷,Ñ?Øî}ROöb³5 fWªþ1>]¥î™}üm4Ùé É«òΙCÈì˲}B+_¹bLx|cä¾€s4¥/OÇ` ¢ô-DíÆ QNôÑ…Sïèv¾+>¦¯rA (ÁÿÔ¾Û;‡’évp ÅJM,»fmvoaäT«j5("Nv'7‰%aùÎ4¯ôË ^e·G2³'«î싈Žò 8c˜2;ÉBŒ‡î9B¹¾*¾­¿Õ€º (ŠtF–OÎòÍ­âçܺìYÛÔCcÊ>ÜîŸ×hº×¸²³ß2Ì^:æ§6ÁXw´ c7¦ÎRV½îê]ÝÝšúwÖøÊÛÄ\Õ›~‡µzš é ¾ilŒ²{ ÀþùΦæ£PÿM¯ Žù*·ý"LX‡BÉ\G¾ÆÔÀŽÁÐʲi¡1™¾ÕaAÙ¡Vç{0FØnðœ’g޵LµƒØ¨ U†TÖ¶2k¾ilœëæh2(|5^lÞÈ‘2,Ö¼Ó§oÏmñ÷sº%Ñĉðׄ>‰7-õ&1;ÔP ³&=óÜ©LI&›õ.‹ó>™Žñ;™š¯ßTl|ÏSäÔILdŸúƒ¾hl6«m1¾òîÒ9o‡~~÷¹yÊêÆS9W¿œIǪ‰É”OM/ËÁ ÄÌ .Ľ~Ë=É:zÍÒVŒOšÐϾj ¾'KBýð޳d*«äžÂñŽýc_>Hp&ª'L³×¾ÚR6ÿÓ³ã*ø]xÇõBsÉ-D)ëè\¾lßm#ŸäÔ••¢¶· }Ôãë[A¶o;zAšgSï¢ûÅÏϬú!¶cö2ÒPSxdÖ¤f ¶+É¥®KŠÚ?ÿ³åÆh?¶ÕŒ#MNâ"ñà.w ^/‡YìPÌp{xÙ‹}‹ÛàÙ¶ÑͬÁ@æK¥ïCícf2JŒ32KZõ”ºÆl–£è¦ ¦-Ù{:šE?ªMÁ¸ûy·™«‡²®=~¶§¯'soL²m›d߈ûv| XÏ·œjÚ]Öª7v‰rU¥ˆÂgïe¹óH>¼ëòSŒt¼wLÝHⴲãÞÈk¶+É¥. ¸^ Ä›göÿž¦?yðVÒº2¯Ìg>Ù[-G4—QHîd'E’HúS4aûznQ/ßì‘Fa<“åìmErX"!M::ø¤ÁÖN@Cl°ÉפwœlR -ú#Eøâ¶klŒ¶* €Çh­_ÿÿ8»YÒ‡žÉ)_¬%vØ9y<‘‰ÞÝqÒú{Ù*À‹ÓÊ@Jœ2ñ4õW”–L}]E°óˆ º‚ Ü»ŒðÝ:ˆ–ƨ;æÙ=núŒÄKIÅÁ23¶jlÉû@<K‚ƒúö¡7Vv·.uÒØ/ù•¥o7h¯¾=ÉQÅw •Ktn÷wôþdc>žJuš¼ۃeòR §ë0ˆH‰™ m] ±’â?V79€}ê;ôE¡¶h,zÝçŽG €:>d™þ¸m}ýìN¿!q¤¸2Œñ¸ó#üû£3( ºÄ3:œ|š§Â¦‡þíSWJœ\5zæyO»\Ÿê…ÅícØ2‚3á.t+\Ú 8ÞÇgJc'OggS?ÏBHuY;.-]^YaZX\Zb\[Y^XZaW[[Y\\[]\]Y\Va\Y\_e\XY^d\ZY`\®g°â×S ’Œ !%Õ*çã˜v8:;îwÖä]V+Ò»²8ŸG2ZR´ævgO¦v¹Ç6+ƒËm-šB¥,áér€\hžxØMSäþß=Ò\ùf®¦»ùs³¡Á ¸ˆbÔNÕ~xíl'?Ne¾MÑ4I¿»ûÄ6nšÕéS€ ³ÖÝ7ÜT^"¤§Ú”™„åŠÜñlÔé—>4ûh—œŒÇÚîqÔê}{› )×Uhªå<ÍçEA@Kø‹”T«SçšýÏlèøìP«ZËñªkxWýý‹ÐSC¯HI*?·Ø¨oU <5îA W­nð¢M¯“4Ke+ UQL?󺇤š‰¦âx™ÏMpG­éÅ?ñùßfXŒ¢yç\É-ó@Ìå·¿ÚçÊ· ö8dhO²{è(‚ÈOŒk~£³Q\·õf] ¿¾ç!Ãgökyß}œü\×/9ß(ŸIÆb©ë| TEô^3˜§öG\~;4jÔþw6;g£›ÜÞ~âüP¶·£ªonzù<á. fõdo‚äP?†‘9úHáLPàRµL¯Èí'ùqCÑó.ÊâI\Íû ò¹”ÿ]öûy6Ñ"=»¬"þÕ„»X_•;à•Õcˆ˜gô[Ñ"ÇôPßUÚ®_‰BôXtóÂÆ¡Ì ?õÄ‚‘ê0Ö§SÐ7 ¾àR<Ìö sµÊûñVs6Ù_Ž:ÌÜLKT|²[1x/¨h¬nðM„¸¦—o—ˆ%h/-Nû›K»‰ñ§‹Ÿ‘)d:øÊ¥—í!«’³¤80;ò-µëŽyz¾àRŒgû4£j§C_Qéµ·ßÏð5š'a,ǼÒbƒiIÏË~e]@LÈbR^ñXç˜ h8ÌÞd:– éw­À¶r°OEâ{i30NT!9óدz|^F‘¾ÞIû½+°€F€¨¼½= ¿óñxìBÚK3¬Í£ã“ ÏÞ'Z!úDF’vezQ¦Ö*Cù4_¨mª™WÇêa  Œ¶`ÔÆŽ¯ºŒYJצ_ Ö¦'+~Sé¹/ÆÝguØ9õÞÛë2ï÷ûŸlØÆQOªVŠ¿ãöwÌáÇ’­d£½Z‰¦„4š(6ãéMÒa]׬ ­”id†(_¶òèì4ö’6‘%c­óÙ¦Š,¦'*ºÞ ²lEØÜhdÊÚøu¶¸óIÒ1mUëRGSn?Æ3âQÇJ®ŽøARjp±í®Ÿô/OñÑ‹8WзÞã%Ž@ç¡wOcãäÙõUg…¥AZT¾à¾ÝÒÆÖ³íiHÐNýîâ¡ÒCƧs#ëûZMÈÜ”tµE—dÞÃ¥~±|­IC:Z&œn:BÛzëŒ5éòÑ©QUú~™©¥A¿8¸vèÊ xW)b)f+¾Þ,ç+†@ßÿ1ÿÇòn¸Ó'­¨Ÿ¯’ýfÇ®NEœ'“ÉkŒs”äb+O:ŒY’UZáh0÷!’»ƒÂ[yìß{ó•…MÆ¢Ù»5YTÜà n¢%³¦KoÆ=‹]½ƒº*K”M}1&€EíØ’|õÌøÏ›9ŠÓ׺É(ý‘„‘Û\búxÏè”õØÇCû/ÓegÔ-@(¶üÏX‡¨ t÷po6žzÔ¬³Ùl63³˜p»Ýž¶-qêëUõîkËþÌé÷23%ÞŽë€/?,XT œÔÑ—‰aꨉ§®ÃÖgõÑm·;‰ã½ÍÑ÷ª‘™J)§8öª!±‰²¡}¯Ütžß}Žª,Œle†Õ'HJûõse?óë ³(µJìOæ•ÞLM©)cÛj‹ªäêVTlîîlî= G‘,!Ÿ Ýåº},×*Ö}îZ ­ÇÎ)Í×¢²ýs/¯°e»Oì!îN¼Jª+@]ºa…,LÏÒ?ÔóëÔ¿¶qûšÏ—Sl­ó¾õ˜¬ŒM«yŠ?‚O9n€žý’0ˆ–`˜³¢hk ;°˜"ÖXôʧ§¾…ÔÎ@`/#ZÆ{#Q¶(éµîÌßÊFƒ“w}î\9Mž<»­m9@QêÎÌyî&žå„ &Jˆoÿæ/a3g²Hõl¿£ ¢ /ÇKnË|½à2ý¼ýÙÜQ¼¿îZÎç÷¾hÜäjä$¢Oÿym"§ÑŽ\Ôpb¬Rˆ<Ÿ›l …È{‡HRp©¹‘â¨,žfeg¯V¤-Éw,Ò#;Ò/P†Ó1¼ôè<ÎáòG•X›|ÿi³®§ Ê6ŒH X•7ÜIèo›Í´…FÃ¥gud!Ò£•_‹–?ÒJ+:¤sl‹¹i•$c»¸—ñ)žSŽ>åmƒo¦Û(Š_›nÕv½LgÆc% ®¥ƒ÷¹Š°ªW×ÿüoçtkGÒÈ^ ÃbVҽ㟂§Õ)ÏRƒ×$eÀRŒˆ‹»sp¹ÌyLŸªólÓ^×ß_>Eƒ–éGÄ7µ‹mIð§;Ó. *— ¶¤Ó~j6€:^{;zëfx¥;Ÿ=úÍÄ“š¶˜©äT²ã5ãf[X!ÙªSe ±„ÐQ› ÞE™™±Á¦ å¡Röøhz.Ðg”_Ñ:ý¡Íˆƒ¶bPó®ÚWˆ@m½k=O‚_Ÿ½ÿÚäÒæÝÁå veÞ[;Æ~UõjBÚ…Ø~z>?“¶â+§÷9ŸÚ+;r~GÚ$'NLG+i¾:ˆ©E¢åÊ+é›± PDuâexv^îoÄîÞhä§éû\ݽž˜X‚l¶dÐOóPÁG%.|ÞŠÿÏ« 9„â:gû·^zÆr}SŒâHñ¿¿lC8';4öóÆXEÊ-éÛ§Ÿ|ßÚ47^½ß޾mTr")³?wVÝùn"ö{]Ù­é1Gu‰™U7#¿¢¸Í©Ÿ/aÕÙ¨•l+'㯟û©›…6C¿éœîqÌLû –ç+á Â,¾&/ªžˆ ƒUQ´ë…âK-KÇjÝ@f}³“ÍÖOWç}>›ûe;ÿ¾ö³è­Í ¢DÙѤ ?r]u½\»À±ÁÛaÌKº<°Ê†W{•¯¬áÉ-ôW§Âk,Fïœ04@Q+û’]ï=ƒGXÓŠìx¸‰))7vr7Ž’º»N”ËR!yC 6©2÷¾×*76.²’eþ¹/+Û Úú@ò´è+¬Þ2]Gæ•2ó-+Â)¾+Ù}|/@QÅßôd£öÎ ¹ÐŠw×|:-{Hùús)ÙÝ«>fÍ–ÙeÔbà§#”sIv!ÿ»šL}³ÿÜlÞcåÜ7?33x›‡k/̽i‘³%O6hŠržÊ)KN]³*(,êß—^OÆtËÖ%ØTỉÄH˜W¾ÄbÈzcÁÓzëœrÞ£ÐêŒÂX¨Ë÷ES”k̤”ÚPPx3ØñÁ ¯±eÔ­ð–tIÂil-Þr¥O ÞÀq§ï†¿m_mù-›µ>„D%Ù;vv»7trG½¶äå—eþv»G{oÀ%çF:‚@ˆèL3^mö%ñH€´ÝK@.òIíØœ”æ„+L6ñ¤Ž9V®©gïôÑȈ*#[ñ|]teƒ',eÊwœì«»Ý¤.’Ìɶ£Ÿ#³»aèÉ´ÞÑT&£œ„+‡{á†M ¸Œ*ãÉ*ÖÓ8±üè.wÏBÝ/κ'éÙÎ\ *e"Í'½ÍÐo}~$¸yö.¬‡ðPû){TGW·«¬roÛúÎjšN“õÕ“pÇ¡ mÁϱ€ÙwŒóþ‘QÉ"%1#B„)š|ûØõs¶gàü]#=€ŒþEz¦l:©wa#ûÐwzG-swø™HuS{ãåS;êŽl‰¥ZˆæÊdÊŒ¤Ÿ<ô¾®*Ä£èêH*zÈ%(ߘ¨;¦¹%PØ ÷uD}Î(¶-¤l† AÕ;\ΆÔ_5ì§wwÅj *·Ã¼‰ T̸óZŒ‡¹ÁVG^*ê>Ü=z5$cæE©ê$CÿÕáU­¯ìyŽ•0ᨓ®bå¶,¤U¿˜PÔ£m?Ç©Kwlï«ó”}ðß)ÙÉ¡³:[[KŒ'Yó¡·FS•j@iû2og´·Ó,I¤ÖM;K8¤¶Á;êtkU40q”3S99^ïtPx´N|·?©î¶+‰õ9ÏüOé—ç¡,½X|›(–bS‹©¹×8 é|É•5ÌæNÿ´{EÑr1@åy7À£•qÜqì<›üh«‘»¥ì5fZ[PV ™¡£!6pÊnÏÀ™Ô”›³r ‰2æ|çzǼ=œœ–œ§Oþçç”9›Š—*)2'>»=%7‰®(¡´¾2VµúûüâÎY|¹¬×j•féÀO/¨?qã Ýù¢pÉc~¯Ô¹ûÂ:êî»dhHZ0³¥$ZŽŒ‘¶}v×ÜëèÂñÒWcî®fÆbܬ²¥ 0$ÀgMŸ¿ãÞ:]vf,dÉ!2‹+‘|ïù½ç!b©Î]ñ²’ˆo‡™/Üïåé ®Ì—¸TQa SâÈCîô¼ÇÃ%©v®ïåGEøVA£Êa\ì³õ+0Tø*µggÕØnúÎ7ƒq%ßYf‡ÝÑØx%å36k ÖYd—Lªø¯H]¥@ªÚ(žK_|‘`¤¬PhMˆÿv\¼¬p«É÷l×èw¦÷*\IOggSû1?ÏBHÔz܆$b`c]_W\bca^YYYYYW\`^\]^`\Z[]`Y\_\\YYÆßR—½O¤Ï!A4@T;õþèrF]Øð!…OL ½Ã›%¨ „j:qèÉzòÐdïñÁõœÛn)³Mv-æÜ–¡m’PÜɉ£>P*„Vu±}@©.¹«K®´.+H꺺ßR‰Ùýup "ÕN¥ÎªÃþ9=‘WèŽÙ/½µkµ?mꆱGœã’8¹3ÌìrªB>X ø‰#”—~’0À QÍý4wNs‹ÑÖ^±dº9»´[GöÈ=:朾iÜF¯J´ & À'—ƒó?R?*{”ñíöñD\óUÐÒ„! Í£LПéëÖÄîÒ¶;ªkÄEhçËéeÎǬY4!J·­6ÄW¬bÉc±×¤IL<Û•…XÅÙm“º(¾Ô-´~€ 8¥Š]cbø¿µÐR}mgœL´´NíVºµeÕŽ5¾¨ÓX´5VÒ¶ôÊéµï+¾3 Î!B¸2N¤ˆšEy›(Eo-ñJCÚw(¹ò±¯C¾g¨Ó–+ýeÒ‘ñîÅix·2öÃdãò }XeRÈé4A’0U䤳øÐoøœ}g‘d< Áà$æ¢BÓ‰á&äfœD‚nƒèa!Ó‹žÚŒ3¬í<úi¶eûz+VåÙÁNO{FŸÃã«Qcìå¤|Òë 7d„{ñ1„ÔÄ­¯¢½(茙É™Zø2öü>Ò\P¨C$°ø•• 3Û…5]O&bQÁº²gÕuã(¢:±–~8Ù0¯Ù¯f“ãîtÛVÛò{-.å½Lxïziü&zU”†³€wWÅ”¨g;šR/·N¬Â>$=EŽ×6ñ‘p¸øé™ ‚”F7ÇZ.zlí÷Êîå%Ôº,•£Šy€õÝ‘‡oÓ±z;&6ÇV‘}º‡5Q¢yÇ÷¼~ÒI¹ºJ¥êm³Š†L±E®÷¾1*ø«·–¸Záø „ܧUkžà¡ëÔW(‰{qK=‡`0º*Kd{óKP= ¶Æwûï>çô?’ÛF5q1¤÷Å™ÜÙ‰]iÚä¥ù‰˜^¡î.ŒÄëîo™‡Š{¾~–®‚L¥š5ˆÎMOŠªjk4jx€x¹ÜÄ™›8܈°1ÄÎÃÛ²)•©ÚBG÷£ú§ý­Þ©‡Ú—¶g÷­MoÙK|äœTÚƒ& ¿‹dÊ$ýHÙDÂ.ξW¥x}:„¶\oÛ9ð¯Þ¿åÔ|ê/AŸxQ}Ô ÆUÍÏÔîTÌ©¾ôÏu~ui¦&@¶-CˆAñ`Qäû¢ f´ß8ª0ŸPºµon ~W«Vÿð´Ëˆ¡‡¹kZNp9è3ŸœÃZ¿™Ü!»G]—NÅ`ŽÌû”g*U­!é£ÚÀ§×0¦%L³Å4%^˜2*š¾˜û´õ:LJNm/Iæ t×Z2|°>9œ\³§WÆ&!VàÄ 7(‡ C„‹7âŽ!ÀEÌ^EÅRØÂü%Ê;Q®—Ý=ŠÃªG²dÐS½ªOThP‹Éí–÷sÛÚ°¹û2S{‹’(o«¹™Lô î¬xsìtÂt ÁéÜM@ *Ÿ¥³eG¯¥ÊŽh#ÉäÜI³¼ÞÄ98ù}tªu§Æ,¾ÔêëË„@aÝOésûô¯oÏݤ"mù×:QZ Ôå½GƒÇÙÐÑ`³¿ÃUh~S>Qz|sh½ÐÞ(œó5ßC -eÎÀú9µ€«Oÿ¦?t$Ò-ËÖÎö5 ¨-µúú³Ý+[®NTô8)gÃÍ¿²2æk·ò¤7i$—'‡FÖª‚™pQôµßÝ•-WËêkÈ-ÉM}síѳ:¢Ý/còRŒQ'Þ«9”“u.Â+>–¼®64¨(ÚGé¹oL8]fž¨ eÜÚúq°¤ß )‰fµÕ_6µ&;BRu³I€ÿsf¡O$$µ„óŒÙ»¼>ì (©ÝÙ+ïKXr!ßðœñ?…Ûñý¸òa¢¾*>F¶²€«jU¼y£|¬ ·íz¡ûä¸kA=ÏÅkyüÃÂ5]G%ëÓ³OXiŽ+U”£N$xI k â©úV²Í캾ôü¸ëÀCçŽÈ* 5²!7¬¨§ÒšËÆk\MÙ¦à˜ª·W.Ê>½œC¯£RPsë¿ ${\~Þ2Þø`ê¢ óã@°„Ù­B­£òp¾VW¥ø¼ÁÀÉæ˜õ]hîîö^ì¥>+J1´ßØ6z’2Â)Ë$»O u{7CžêPáÛ(k¤ljäw¯í8þ%fsŠÑ}håæÃÇè]²´•õ0nÑÚ­³úy)U<Ëå×qEßÏô c¼Ì^œbf¢jéBÿ¸Ê¨^¾)¾&oÐHj¥9÷­üÔŸK¥'rY—+¹ôÎcÍãäó%eÚZ4P_K®Ï’opMM¸iaÈ .5y(z_šêÅãŠ7t0dDEj¨çe5vò¦WæeܶŸº'É£¶ DU”ôGì÷v֎Ϻ~á«î*ñ-îý¯/ÂeˆaŒömžÍsAY­ÍZ$ØJÉ9ð°¯Ï¢Å;C¬¹¼gåë8?6Óšk£©óÅq´ºòTJÓ@nL Â)KÞN~@‡ÀW~¤ûb뻹úƒéQéú¨;9É!žÛ¿¸¨KÖÚ *2Ÿ!ù£‰{iÆ—Qˆ¸®vƒ‘ÊGí¡”âñ„á:.AÔ²˜“9¿Jª[¹=¶g,R¶º)Dá+–‹¯Ïý:}ÛsXzåCYH'åz„JOyi}ñµÝU„"Ó¤ä2ÈIux’Pë§Î¾©g {•µçTVZñéýÞãÈñ£[ ™x-ïß¹ž-d«6%4€E­¾2o§\^Ö9äÝAô{ó róŠ.üäŽ)×å«Kݹ¹Gñ$@ÆÏ/t Êk³‘:]úˆÂ‚¥:lþëxg'ëÜÕìYQTÜŠ­š s·4¬º,é¿öó+€u÷ç»ç·®eµÙ9OßÔÌÊ®1}Ò¯¥ ¸›©“|?o¡Ô9ÁrlTš&DH`7ˆ¹i®¢†q”4g¢ÆHqŠ&ŽmˆÃ1AR똡F(A„Y‚äˆ8®wm­¨Ë–YsÇ3ÆŒ°à€ª«·ˆÉ5)Í:6LÅ….:ƒ¤9pË6a‚†@¡š j’®w+히τÝL}L¬Ét¾$EDÈ!2MtAÔÈ\áLV˜Á,qnËqà gsÎs®Pã9æW†6c¦qÿâÂÀø ÿyœ2ª_ŸòDèfJfŸ…Hb^q¦aðaF FBâe^C¦9Áž`’+µäÖé3¦¡¹wûŒN–Ÿ¿)½ŸèŘZ €ÌLÅàŸ $Ctä >ÈÀ\ )\ÀÐLwHÁ&ŒŒ…LÇÈ LY(ÆX‚ù[ û–»¼0üõÞkðü9¿çþðᆀ4‰•Ñ„q ˆ`Ã|L0„Ått 6ønjPŒ$¤ÃðsLE(ÁT @`†€Ja(f €~`*'fÙ—uÿÿÏÇûÿÎëõÿ?Yÿÿÿ?Xoÿô"5º´ t:ߵҢ⩈)¨¦eÇ&õUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU c “0 ³"t8£%3Zd“3€'ÓAGÓS0h00ä£ )PL À°'L ‚D†``"#€<`J f À ’bׇX$$É™X€’Ç%i˜¢Ž9‚$I2^&°_€ªT¬ ºYðë¢`™> Œ¬©pOÆHLA`Ìxà(2æ‚0! ¸ ,8Á6bŠ•¬9YpT PTF0ËÆ:ˆj€™K§Ìf‚ÀÓ]¥"! ÓÙi"2}CMÝŒ<¶aPãl0àD4ùT—e™‚¤E‡«‚Šd´Ýõ¨ì-ÿâÂÀ2ÿvÜ^XÞÐ7 Ùh @$é9^¬H«¢ÏKZŽñ)ª ªL)ã$FÇ"2! 0  ¨OAS¢… BD½Åý*`‚.âê,PÅJö\‰ <$HJ S–©jƒ¯÷Fz^`ʇ“0¨ 4<ëšøÀÍ4%s¼o’÷L´p‹8­ ¸-H¢Ð~V»@\‹FÊ vä•Ë °Ê–KŸ%¡ªî¾ÑÛÎó\X©é$SV8û6퀼̉º­•Ò£iÔ‰E÷veéÖÐY;­K=MU1štÁ­FÛZFƒC}Õƒ¨ã슳)ˆ)¨¦eÇ&ꪪªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª ÈÅá„Åq(èadö%PETʯ‚Ì1°Ä_0јÃmppÐ ™$q[L2I)o]d£¦,*zVIˆ¦à¨xP9)¨8–¤@³6´è»Ål–žK¢l¥ïWÒ$·ðzàê<5a#Ìb(€†bÍ^4òKzªì Yœ—LJnK.†!È>f’ëñ›iˆ)¨¦eÇ&õUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU DÌ Žÿ± A5̳†NŒ"/1$„: ž`ñƒ&¦H´¶5Ê’Ö‡6;``24ñ‡a€(¯¦8ÖÅABF æ·bZ0d/z‹ø:$Š.Öt¥äDJ’ºC’é ±¢kŠ™±²r+cw‘ˆ@‘ã3Ä·!¡« 3¡ñ gC6H_´ÕPàp(ð=\Íc€GµPH 4F^s'`¯ÚÖ+JùF´ÓIƒ0Q&h`À†c&¦Šh`&¦*:ˆs è¾.‰£Šžêy[`è*"Ž­-e x2‚½pp’$¶ÿâÂÀ›Ïÿzyk§˜ ¨®ŸÈS¡¤`Dµ)pá¿N…þ_³¿SGxÓà%¼8„%. qàò" Ï÷íNÆá…µE”@(sÅù"=â"Á§ØÁæXåFˆD‹fKÕ‹(-qÀr <="ÙCPÅ‚Œã¦˜ &¬©.¢Y†Ä'j ì¶ Å,›åmˆCpÿâÂÀƒ!ÿuÌjxÞ2ðcË™„‹—h:#$ô­D£FÃ06iêk è¤T´º.:€¦²¤kåþ€kšµËH‰`&OÓô˜bcà*,ºF X:àïP¸Hm2 @% F‚ŠQN`ö?Ù"b!”Ù#K BÆke¹H¼ BŒsTѳ-óh¦* – JòÛ¡,цi”‘”dS$!f’-mX"mlÃL¨b¦´H€-0è ä›VSÓ PL( a+ð `a„ ?ACDH a¢!áR¦ ¦¢™—›ÕUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTÃJiZÑI0À?q3a PÁ2ÁI €yHpÂÅŠ¤&&D,ab­P`0L: ä (.é‚*÷ e‹cãÌ0vº€À$Cp€yv‘Éã—„Ç ň•ƒˆSŠˆÉ’)7PÕ>P6ud ª¹f©(#®ØXÀQâeQFh\‡cÀÄH„t ¨ipP¡MÁîòï‘qŸÈl„ÖˆG (X€õ0*@P¤õ3”A¹¡¡áz­2 G3)s`uÄE Jah”fª€«ŒX›«µ e3Bfd0Dð.˜ÿâÂÀñQÿyTfpÞ²õ‘&ûÀÈDC H´‚€¤¢s $‚WFì)iC•.‰jÑ!ýC‚_±%Ð8¹nDƒ ]ࢌöŒQ˜óR Yl|PUEÃvàVîºÊ(q’Ý/ ¨@ÐK]7À=V œ:!Ê1€y ‡šh¿'lÈ@ËÁ̽†xMP¼«ÄÙé`‰Š¨]ÕJœÈj˜¤ƒ¨(Puø˜¢C ae€Pª±`@A+R8»¥Ía“ +B%d©òªlÑÒcè/8)ÑÑ2XÂaè#ÙæQŽ,iÃÐrEn’´ºÉG-ª¦jã“SQLËŽMÕUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU&> æ@3ˆžFVBžý"`1Ñ…'¦E@a¡I¤ÝaÁㆂáHÄÂ9ÆA‚P°`paÅq›é  0`¨  Ö!H8¢ÃÁ™f¹ƒÌ#X%f`¾_$™FÒAH9>h¼EÖ3 .æHR=$Å—5sIQq¤5±#XJÒQuüP *6„(xx‘æÒ¼Òè¥bç0J€¾ÅÑ-XMJ^”RE#4`7:") ÎqÐð: mLQÁƒª“`ÃQ2좈ŒŒÓ‘U\+ik™œR÷–I ­È.(X¸iôу– ÉB ȼžbîHBZKÿâÂÀ•ÿwdjhÀæu$B]CVôæŽ1  ƒW甑àÂ!f!Ÿd€‚E€’—p`b⼊P*¹HRã°Pš篤«yàGÑU`gÒc³Ò¡HJë 2Q É‹¥ðT%F€!ŽZ18$9O¨©3Ôì0Ê»è˜pijÌkXv'“rG&¼ï´g=  „!Ôe‰$S,®²–b8"ªê«¶¦É`ºaö"Ú.Uʘ*Øå-ÇufמO Q¦b ª«¤³ à$©ø¥c $„X O‰ KES Dh]äÄÔS2ã“uUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU1H"0t LƒG̨QNeA©˜  a¤C:*™Ø»  z`'8ÁÀuø018E/ùƒ‹á‡ jšp%Cs&g¥ù3ôQ$À$˜!ÁŠ7Uúd€ã€Æ r$ŒfS7| Y]*62`eFª~ ëñJKæ `fˆÝK„f ¼“ ÀHÐ M HVî^(0À¢ß-E/"/QÀP0èˆà0:åXd$ÂÂS]?À„*f®t›`:q£#8„hÈsB„ú0JWRo˜t§Ò`˜Ô ð@íRXdçnf ™‹`ÒQ%0ÿâÂÀ 9ÿyÔb`îôùJMwa¡èFY3†¡ ©.z6›Ý@`-b<<Ñ '! <$ l„X;vnl„è(‚¥gë :Z1®³0,È y›Þ‚: ™Â]£i˜uXx3ò+«!$©`–_¦# sT @$B=h¸‰À“ï´X*mFA£çSQ#QÆ .‹À\¦æˆÐtMىėOS–<Ç_rî¿ía¤/vÄ‹"Ÿ5ß6ß6:'y›Yt¡ªDÖA×QÐX+êΤ¯©dH˜‹ ‹\¯£>iÅ튗‰g&C¥XZ$¨d“SQLËŽMÕUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU‹G¦ @ k™ffŽXç M™Œžk!¸“†…tš$&dÂQƒf ˜0•`À(Ðh`Ž¢…Ϋˆ"Â[ KÕ†€D!»h Ãã¢X % Ô(*±ž˜±ë¡¬*‚6–Ž„ fADÄ"v¢¸À)bˆ@Ë’g’"H2D«†„¡`MšL”Ü€ ãH F ;Ý#  $Ç€.p0tºGÄaGݰÀò‰˜h<“kÄ@l‚‚ eàÅE!{ÁÇ´XU3<”?8ãh½Jð´ìH³ õ#[T{ TãL¹ÿâÂÀ€iÿt\j€æqÌÊ B¶Db2² ®Ö‚­u€.ÀŒ)ô\†°ihÍM‚NÕ¤«R-—Á÷@rÌRÛÖÍ%PbÀ BXEˆ®Üuæ‘j(,ð"„ˆœ ÂàÑàt"Çg ’—-$àUU41Lcaɾ¦Èê=3u(£2Q‚ɨñ F¦š…œOUL’  hrÍgeÃ!{Õ­1–&¤åóTì<»#Ê ïCqO†–êrYQ‹ÔÅx¯Ó™¼€Vã²ã0’¹v—MTê‹Ïat3Ô‰ˆ)¨¦eÇ&ꪪªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª4päÅ@3¦ŒŽÓ2¶àæÙÓ~ JŠ7K Ñó/ L¤5‹ W`ÖQ=¤ƒ‹2P1ƒP !S*,ˆ˜²À`J%êÀ²ÓFÈ5/Bƒ‹§Ú!AƼS¶`F¦äàT³”€i€çbRD„@Ñ‹¡P¬Ñ=0çn"8*4@X€Ð·`Ä@E‰UtB§J¥ãá!8 Ø (ATÅ §ÈV L‹®Xš0]êZ2JïHÐÃbñ•/RàáP @6ì @¸â Р.é€sF¤,5̤’µdš…„*<ÂtAÿâÂÀ[’ÿxlf|æ²ôdƒèêÓSØy&_§êÇ &$Tñ,ù‚ ¬"SÒô®轩‚ES dIìLô™ …ˆb£jž£°dV×–ºq€ vËÕj˜#J KÿyÜÂ%hº€Ï—è-J·–é2àx¢;𢉉:4!uÄ"2ä (ÚEsÕTîÀfËJĹ¡ D›IˆÇ'Sˆ–"L 3Œy ¨¨  ª’ûCÊ"ˆ8!à y7¥AÃme| L.U—A©©€<ÅÂwãnªb j)™qɽUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU0œ0X%2¥= 7 ¥qZ X I L ‚À‹!)„ùkÌŒ8 †€ƒ@ò€Â€]¸¢X22h\êU €´µ Z^Bð›æŒz)8,púÃ&°ˆY‘ŽdN'9Œ 6#jÁGŽ 2fŒЇ…âLQS ‚f4™‹.ºÒœÃ”`àSÆTQsż%fm™€!6cE•®2â s\YÎ3,´zM Ï*ì–B,ã=˜¢àPð1aCSQAÑNgYšÑ„ÃD3‡\ND=¡Â1ª(4µ^Ø; QEŒ»ÀSÿâÂÀ%IÿvÔjx î°ô0ÓxðzÓ9Ô°p­Q–D"áP"(ØU!<H¢ÃYâsH¾Jœ¦¨ ¤te1"îB^dÇu U6GÒ "³¼Ãê>ÂKòÓÈ\ŒÂÅ(J%©ˆX©ê®T8£ü:Y˜as(ë\ —Š=[,k…Æ}¸#K Rô gÀ@£‚Sˆ–‡f2Œä,G%;PT )e7`@Y©T¨ô­îÀ„)ȘÈK],°¼j4\FŽ•ie©r“/IP+L-9ÈHÄC©°©Pv&ZäÝ|K܈n¤Ýú—ÓSQLËŽMÕUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU:.ô“›gÙ¢GAA±¤„”)" ±ƒ€ŠU­÷0A66šä â±S¨óÁ ”&0äkíl ì kH!®PÓiH€g J7"9Ã,°v¨8½\ôyw¸ðIÏWœ:]Ô`¥Þd¡š@¤‰Œ!n±.Ì”L&Œ¡ÙÈqíùJ¢ ˨¡ö ð*TغK™ãu±5~’'›€¶¼Ë‘Ε¶ZRÏ(ó¿/3T½K×+$j}ÃÈÂ%êÔ^·]ÌKT!~REÓLRÞ¨VÒ5Z≛êÚ°Ë%¡Á*mÃG%D¦H¡€B1"‘‰MÿâÂÀ1ŒÿjfŒôÞpüËÕ\—×ì…%@6éÝ8é|ØÓÞNt™ÁÎgèš4EÚ@ö˜Ž('k…ÚBwV*–A~†Ž %ØAä¿aÄF--/l2ÓH­÷ TøX7õhˆYK„HN²a@ Ú-¢ŸOwQø- (14¬S©Ðâ±J¤Ô8¨ã¬T7vÆÀÛSD¡MD[.´®ž7C SNÆaøeÞ–ØjÅd0Lö“SQLËŽMÕUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÀ¦‡‹šq§ÈÚp¤ÇÎÜð@8@¡‚X“£àÂFLŒ€2©äD`ÏBŒ0-<%%~‘v²(•#+ ‡´õð1pàa€ 䀃31dç(h404µz•"( ° UãQPá¥-a zŸÍ8„ã%ÊðÑ(bŖ옵n‘Iµ°ƒ PŠ–m$V- ‚'ˆÇaeÚŠBŠ¢N†8hÄÁ0@¨ ©Äf˜` Û­ªPP£,A() ɖȃDäY¤á‹hÊ”€¡ˆ$=ÄÒ–¾šæC ÿâÀÀrÿsˆÊ€ hbc vÆÜfS1%'Ñ-E‹v„% ,2â§ ™MGp—¥ë†Ð ‚ÿâÂÀ?Åÿuôj| æ3\\v€—H DÔ-ÐWK9ðZcÉ3´‰&¾Ñ- ¤_U,ॠÙC`%1¥5¹5Kˆ™%Â2ØTH†Ÿ•¦eÄT åˆ ²#Z€¡ð œžÊÃ).)ÃA31oÁ„˜àcšb> ´¬<€Pt <¯Ev€RćEÇ4ÆMå‡grg€Q!ê`²ÂSP”, r—e0Qé"€Tc+tËŠ²Ä„eð±bFµDàhE¿mEKŽ‘Ä䘾Ch³f"q‚JJ.Œf}15̸äÞªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªƒîºD #?¢`æ'‚“ S Šj6°0¢xÃà &˜°LZÁDŠÖH„^iÀ,0‚7Ù(!mx×dÁŒ $Eœý†¹§$ðb‹ˆBÈÜñ ÕÚc#Cõ”¢æg¼òÖ -Ø{Tv¹éÔì5¡CGÓ‘MÓ%h$@©KZ—¡Ý PQ³ÁP V d$Ñ_fH‡ â ®`’•r®¡”ÚV!˜* ÄC²#0ª†¨îZÝ¡3f¯QxP±9›ç4´bXH84d H§AGÐÝb­YR'*ÂŽåÁ-Ü^Ï[`VÕèËPuH âFÿâÂÀ@ÿm\jlæ2ü-œ˜¢(º ¾-òtÊ!á£Æ¥Bšµ‡tºÊ\ã?« `Í_7-ˆÄK: %EÞ[ÁcáBn‚q¢„±”ššï°ÑÃÏ_‚8̰I(0èÂI ‚q!à&nJ™FZQz¥rà‘—‚‰\ EI5•1ƒb¼Q…;šŒ5ö™‘éÀÍð\dki(<ß.–&Èœ$“¸¹!‡×kŠ:‘ 0*!mS/Ä‹°%ìü®w~¶)ˆ)¨¦eÇ&õUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU €{Œ$˜0Bd#‰µÐÇ( LDU Ñ–È& e„\@b² ô—à(Ñ @ª!|&`Ûø$d·à,6 Ó"ÕLš°ø/E€-áe΀×ö‡(É(iÒ…Ü ©‚¿àáFèða*€ÂŠH L("f ”;,0ò·‰ÖdE˜€«ö „5‡Lè"ØYC\¤Ò€)U6ç(Ã*þ×ÒFâë/ÀÌ, @P‘Vs¶À›¢d—òuŒa.œ¬qT@eñ$P‘!+(*¤/t]²û‹ Ï^gÁh5YeÅàš„TÊÛâñ£à#ÿâÂÀ^Lÿo¤jx´æ²Ü1vI¦=©Êè—u6ˆ°/Ä…gˆÀwÙm’ltÔ¼«iâAÌ0218 ·pë?gb™=kM¾œ]Ky@¤&Ȱm/LqLñ 62BYFCã#ˆ7=kXÂÀ‚[B¤ ]Q]ç YÏ â$,ì@€qi ž°:a9–Gôõe¬æ–;ªjàÀÐóîÕ“4t&T[–¦ÍWKB|q€ T…Ó–Ë×”Qœ´'yÄ}SUY„?¾ËÍç³ÔÄÔS2ã“uUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUL +1ñÈÌMcfh–ˆ23¬Ç ó›L€5¼Üý¤ÓýÀø5‘øÆASn˜ v ŒT.4p Å!b§Iä• q…–KG¡ ³¼LŠb³DE1¢C 0ÀÅ"al *v ",3S—ða`C C"á  ÅHŽÈp®U!åez(ʃ€Œp®ÁÁÀÁà &'¢‘†¥š±Ù1ƒt !0ÃSel3Àã † „j²^<˜2;%z43 ="¡ó#¼ÍäêH $( ù+ÜHYöŒ-n ¡äé^îà„%ÿâÂÀžƒÿvôbdæòÝ÷mäÑrÍ·'¹K› Kĵf¢C#Rмjm/š Ê’t¿©sêÜxªAiŒpSž¿ªµö°¦l¹ZÚgZþž C³wÖºr ¯·z6RÅØ}{QVè*$Þir×õ­-©”™¥%HTÕ—4¼AFT¶:Ú.èË~¥Ž† •15̸äÝUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU0œã P{1Ïs#D>3 ÃCþ3¼$Ã9Òé2Î-C3"1¿,A¤_4:ÞSi3Ot“2Ð`ÁÁs hw01œÄB“'Í..™‰J&% 4AA3 Ìã1p] ™QšN¦/‡¡`™„ xàD0`ÂÀ@PèÃI@8ýé872`6;%1°ffš ¤Òß‹ †²qP‘#" ¢È1~¦¬ÁÓARF4V]C,‚2Ô†6È`ÃZ4ó¹¥¼0˜iiÁ "‰‡‚™šÍi4fHfR(84c‰cÊæf D€©± ÃÍIÿâÂÀudÿzTj\÷6xBP$DÉÌH@<ÅÕ È¡iÞ¿†@2®í Š 0d¹a"û¼ŒÁGPq!ÕQ5ÙIP!˜&J¸T¸˜¸ 8H’y*›‹ø^ˆTÉßB°¥6klÞi‰ŒÝšs]tÕYöL'zUÊ[Á¿`ŒIÅŠ9i ¤èesӭшI §Ù c´P­Qĺpg”óÙ©¬ÃªÐ_Y3·«šxŠÆ–E¡ÙL:é«lÛ±O>oL†¿öBÍ›»º ™­6iMÆÙÚ¯ z!LCa6ÙÓÿz—;[d ¯4¥E 7ÎÓSQLËŽMÕUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUŒ9,Bf 6lJƊǦcðæ!`4!`2A„à S:®Œk3 |3YM -J€œÈ¢äJjp"`  X<( Ìt51@YÓ0" ò€ªô0 ä‘Rþ`l䨂4ˆqÝ1f‘޳àUŠ}'ðÖSPð” ±Á+\æ@€(ñˆX^ƒæ[A 3JÜßBu‘1†eùÐcWØÃKꆅHó‡0¬$ð—F, b…Œ0ÇœI£î0ÒV@4®6ïzd€J %z]‡H…*t¹²4lx*Óœ0­•Ä]ë]åÿâÂÀ@ÿrÜfd÷4\Q ÍFoô·˜4}µKXÓ2JW¸ ìÉ”Má×µ¶@‹'a³ëJCÁ`‹Åä »À™³ÀNäÔ¦ÔÑGX²–=ðãúªîÃiÉ•V2ý³‡%XÒñ½O·ùYÁ Óqm™ÚõxÓž2îí$!Rù`Ák ³¤ Xuc-£È¬ í•´§ãf‹ËF´¨e¬½’R:ÎÂ\£‚“[M2åŠyõ|Þ?bºÝiV…¸Aõ¢ñò¬- ¶Írã÷¨õ#eoãôiˆ)¨¦eÇ&ꪪªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªRZcBf{gzæuÊffZ< -¨$h9`º»QU=Ì”9AXbB¹HºØH ¦ÛB`FObžcI`â5ùK€`æa×AV@ŒœW –Ãj48wJ LÙ· ¶Á`¬YJޱïBT´¶EkÊvü±VÞõ ½ÚIrÓ¥J”å–ÈxY A¦Aˆ3•ï,n®ƒlÙÞr¶žäH V¤ÐR.VËÞ™m¼Rxi®=ÚV¼ÃY88ÉQ§`¹žÌÔKúËÉQ?¯ÓÄ•ãwB ÂÚX„–$]›-‘®5‡É@Ì ¾¢Å± ÐËÃ+ ‹®¥A˜§F¨ FAÿâÂÀ©zÿjäf„Þ2øÂ.p`É `Œ#UP€Òt¾8F!ãÇ/x©À#ƒAhÂ$±¡ØjÊŒ @ …PƒD„Ž&€C›F.³а&˜AÎÐ Ð8hih‰PºPÐÒbP,x0âÙ”0<ÑU1ʬ`„d^  «=\/p¹äƒ•”>‘mJ3@D×ud’"]¤Tké.\ò¡ŸîK5}žšX*°?lÒTÜÙ|©¸ºQYäÄÔS2ã“zªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª1ä#GXÏFÄfpưŒ f äÁðX¦3 «4´0`F‰ âHФr,Ø^9˜Â™* ãÄ¢Á€Ð&6¸âE¾5%óI^ã &H,û ‚ÀAp0ÌÁ qtˆMYÕ\ÀÊC´(¬=Ë.¹Î ˜øP\ &ÄÇâ\,ä–œ*y+@&DL,€x4D T,&»Ž(Gß¡ác!44$$Ãdˆ0nâDÉe$e$É©n Ró/"…R€¸ œøÀ\ ˆ ”ÀB•Ø( eƒÌ0!&ŸP8l΋T53ŒQ…ˆƒAH”ÿâÂÀ®_ÿx\j`]ØŸ‰*0p4Š®­ëø˜É¡€a`1eΉF4#!,,8 ò.%@k¡Š?tÐü51DÄÚü»´˜(A¤E2ÃŒ!àæ r[ÎS±h eèÒÓä˜iuÿâÂÀ¿¾ÿvÄvŒ›Ðð B™…缆†×;—.œ§/„ }Õ½c—lB¤Ä bËšφ´ˆ˜Ðà&$`Àc„ÀN7A ‘$Ç€´5 Fô?:%„€Š‘ …ÀŒâ+x MâëQ­ÆÝ÷-犰5®‘q&Ðà§4èÏ„HX¨:QdW0 L… 4L p³ É60`èb‚EQfH0*ò]$‘@ÔÎwP€¾è0Uƒ G……yX‹¶ÁßxÒT0Oÿ [À¨¡£F(7ÿ˜‚ÁF•ƒEÅÎLAME3.97UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU ¾¹ª$œa¬„"᎙¹‘븈FCŒœ \¡ rPrBVv¢. 2,É’Q;—$p4;¼D€YÂ@yjŒ8A㦈(e¤; •6¨KYg£Œ…ˆ—¥aÁƒ®S2”Xsþ˜©€8¹3 ¬]º3 @|8‘´,`]˜`Âñ(³rö1©R‚,Iç@°(FѸ˜ (ê:µžh1ÙÁw•À€KRÏ šÒüecAl šI$Ü”!‚$ p’Ó!4p3$[ÊܳÃ^hïh Ö”¡{ƒ€•ˆhL¥ÿâÂÀ_àÿwntÛÐU ¢ƒIT-Q…†˜ä©t´G”Ô eXUÓ:‰¬**¥h3A €8 ðC\Yk!+e+Õ/ŸDêLwB¥¼`‘Qá¡j”ŠDÉŽ3)”a3 ÉhÁu ã™%@hÄ™„,‘,Úè(²ž7éGW“NkmBd0P-ÂS)ÄEq†|–qb×:é],ƒÇß%-{Pð@|ÈŒ< !dŒñKó5þ0€Ò-ˆ¬ÂÀAàáBf\H@ƒ*¶K ,-˜„j¿tLAME3.97UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU1(xÌgŒ&ˆ á,Mw;@pX€0($0˜f1@m5àÊ0`]0P,f F`@hÀÀ”ÀàpÀP¹&Òr¤F" ;SÂBƒx˜À¡b>^y=1‘1"gh„YH#Ù¢8É…˜Å¤"#©Š²ð!¹Ž¨‘8(aaÊ”˜„†,6¶JˆD†¦Dz”À³ÊËèbíf>dfLLLg§fx8&a#ƒ#‡x`ÍæŠ eC¢³†¨3uPÀxà1ާ˜èÀòIkTt bF€¸¼Ö qàãVr<¥«HtyDa¤ú¹k 'ˆ0ÿâÂÀׇÿzìjdîòÜ „ (±Sh¹Ê.ȇ‡Uíqít FÃuÚ]RÞ³eâ[5C‹$Û-&R E X¬h*¹å! /ér*¤kê®™uv¡“(RQÔ@½F¶¾Á!†ßcåÓPðr¬­ÑjAÄ¡@Ñ2± Œh&u"¿L¬ÀÄHSx…³ÈSƒB7›ulC¸q`‡/ôIæ~=ØIÀÂ굤lgBž!b¥«…sÁ –þ­„ª×Iy:OT…z?i*–)&ˆa—â(ÍiÖoÊP˜C'¦nk‘ªZ©A l(ó½2 ØY–,ä÷]1'̰R„gG=ùpYU=;çy›!?LgÏ™l ”é6ņ 耹ˆp4(ÁÊ3G`IêúÃ<|©Ú”C‰´ü$]HµÿâÂÀÎÿväv„œÐû0H 4 lp)‰Lbv¡™€hK«ŠÕ¤!.lº œ»Gú•Ji+NÍÈ.p¬¸ DµŠ:x)‰2fB„ Èh 8 L¡JÅ^"£‰UaáÃ+8,$Ë!‰s_jJ~CrªyF5¯Òå¼g/Æ‹±®Ô‹…  PÒ ^»a—BÉF]†æ¡é¯1‚G”F*r V 6ÆbÍ‚1ÁÀ„BãS (xÈ ›u¡v±júƒÔ¥EȘþ(Æ ( @\TÄÔS2ã“uUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU40,B3HàÐô“Gde¡5¢XÞùÃ‰È D“Œš`à)AŒHaP"ùIdD@H)jÚÔ‰v+!E‘9QހЅK E‘ $jG¢"Á‚EL°Q#>À& °4€Ê9 -I’tcJÕ‡0AÁLáÕm* j§b€ +dF¯¬0KCâû…Ä'Ë0Ä‚˜#¡Ì1wlÍ”"(ÊÌ0U-—Hiæ1hPÊÃ$- Œ½ ¤Ì@öd\paÄ’0*»&(ÿâÂÀßvÿ|4n|ÜÐ X¹%½J¤£ORÖ£pªú ã«y¢BU(&BÖÇ@¥h\PŸ"Pe* ƒ! Ý!!¨„& jV„pî†`Ðìå ˆ-#F ,  "™ø0ÊÁ@J,RP­¢¶#‰"ý€¿‡©C É7J ¡HXtRôÂ-‹ B ¨mèMã=ƒÆ›òÔ«„É[–²‘EºTË=u¢b%‰*´›ëLUEP(< ¾c"Ë8ªÉ¤¢$%¸Ç–E570ÂTY«C­ Rè §r¯q15̸äÝUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2 $ L¡aÏ”‘M`̨ D ÌELL Kxrê @°$)0t b,£“jT ›cL9ïY¨ €·$¤Pèˆqä…F K²ôHLYE-¸8ùaƒRaÁ¡ŒPpŠ(”2¤Ã 6# „‰`1L•aCÃ2È…—5‚ã̲³lÏR>”Õ"1ä òá¡& A˜6acPÌ==Ø`ÁFÁލØÑ%ÁC™"3q*@Pª“F!J`š-–D L´HpÊÀ ’Djq$9B’Þ*”:: ­êS„@A1‚ ð@b»ÿâÂÀtÿzÄntî²ô‰¤é»à (X‘4‘$*)ˆ ôÜðH ,`Sq°¡èÓÚ2:î0J0ÈŠ2³»­zʃ‹ ñ›a@"QT`h™0 Ö ,Z‘dÍ@Òº’d 5“ƒ‹ÒZ œE¶(c!R â0TÖ/2 Sh2hƒ8É5rHD 7Jpj # ‡ q¢W\b``™%T—h h×ów 0™PEîL ²Y‘Š`1mtdTãB’÷ˆ.âˆ\áÄ:BO)h±oú:D’ –à Ž.@á„2ukÔôLAME3.97UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU0l0 +53p2U*1Pe%!€x„;3,,3,%„(j —ªŠ€ ‘.a8ü’CÎ;%€…Y•À!< + ìE88qŽ_ñ@`ꥵN#£ÒB -©dU y³2¸i~Dp”áT(ˆ€ @1PäF”€$!U1ƒ2(Á7‘àð¡`(ãPÇ©».]OÓ0œÂ- „\*´L(A €æ áeRdG‰» ¤H‰4ÚpÞA¯* €hÍ1 ;†$(Bá.–UQ¡²´$L,Ð0 Ñ·líodËÖüÿâÂÀ¥›ÿuäjpî°ø .ÐÄI(@ŠêTºD¬‡ÌœÊ¤fÛ˜î8HÜY’ïH‹ÊòtÆCt@ÔXG¢Û;©`²Ç€ž¢KC’Y—A”˜g Á™L`íýABœ¢´‰M,pÁ‡ aØ‹ûQŒá/1c²w92Á§.aÐbÚ%Рa–.ÄpƒKÆÊ 0žˆ -†nëøºA.À"EN9 ][æ©7%ºð¿‹M‡¥ê°©Îè]À„†  ÈÔ_Àá—È· ¡ˆB°j™‰¹Ž@fV—ÑÀ/¦$ !EØ=Ü u/MuàÖ €Á àªIMñ3ÅUßx¼Ž/ÔÄÔS2ã“uUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUo’¤ò¤Ì†0…̾Eÿ;ÿÀ^S”ð ^-Ù¦ ˆ&ì2Ò$d²)ÐC Ì“!t•/bS—´q±ÁˤwBXtF#ê…ƒ²ÂqEELÁ§ê0 œÚŽeά¾ÁŒ.‹I"€5ô8Šp£Z€]Xa" &:(‚ éŽRÌ)Édµ‘ b‹ ² 1X[®ò¤Rx³&ì ”1 .Êâ8H%L£Ôu$!Ö|­ˆMDƒ%I—E•¾D `"4ˆ¬/¹"†Q`ä`7Ïþ‘ØÓƒÚD$L0¼"W¸ÈË KEŠa¬ÆÌɇƒ NÿâÂÀî5ÿt´jxÞ²4ÓQ°&°€&Œq€‰µ¤™DTµ˜0\UzjÖÅ«`vÀÑšobšÀ‚M[£ƒ[6CDÐ)Â0 d1À¼FKI4;±¿ "‰Zd„ ” ‚)'|BC@PFJ4³Ma¬«qtQ°Ë Ã)oÍŒ ^o2Æ.kHxɆ À=pˆÌŠ8bÓܘ(4b)zÑÀ #&™!&Šð-[úÍ^6\ʉ ^ÔSx8 RªŽ0¡ïÙ²©D gÀN`¨bʦSoe15̸äÝUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUƒ D €ŽX1zðÓ‰S]ŒI2 Ê£QÑQ•„ ¡aƒ€bÇPPP ,DÅXbÉ‹&)ˆ¯€|å¦6@X²¡-!†TÉJS²˜Ê$0ÂÙñ¥xA…LX±Á­ˆ„Aˆ©P‘  ]00I<`:e«Ru‚Š!$*QÆOó2Y4͉b¨ƒ.tì‹ ‰“.Kàæ¡ )ÀS iÀï¡”¦ ˜:"büƒ0ÇLŷžCmœ48Ñ ˜"#WÈÐAÛ4x¸àB‹Ü¡IÔ€|óA™ŒÞl´h˜ŸéZÎ]ö˜¨¨×ra•¬Œµúft¥À-1wÁd²†fé $`Ú0 ©IßwV<üŠ —BìVDîpZP jÁ¢áÏô ƒ;lFfHÉÊi:ƒ+ÀRœ»ªµ¦ ¦¢™—›ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª„e’ì’°:D˜àhÄ{*hd‹ÄCÀC 11P´M!1±µ"»\t¬NGFøÎdáAŒÜ0”;tÉ—®S"I‡@Λº6äBmAÓ¹ÊkÁCØ; 2]@À@v Å ( G]ˆiÚªÕMP „š¥ÈFÒªli»Ô»ªÛ&Ks:¸ ›ø`ÑÆvA‹6ZÎ@ÀÀ§ÌIF‡-Dй—™5 ²É(2´&¦‹¬œÁûcL‰K—2¼ðÄuápá`Ô7ªNŒ2i£ŠBǃA–kÆ?«\$9Ì+ƒX!`áPH®õÖµt•: g&"ÐÿâÂÀ7÷ÿl\f€öÞ°Ü„ g,¤02àâÁ.CBHÅðÀ‹ü UV^â ”‰y+Õ(öS±Pq.–yª¤Lµt—MÁ·e \Fˆ@Y)¤é "Á68È/IkŒÅ2e&ÅBL€©€ršo`©œU”4uXã®§¾À«‘Ê(ÉRý’.FvZ…W "úSéRØ‹ª…Or 2–ÕçhÈz5u7Á‘.ôÅ0mZÉ“Ja™l¡¬¿.ž ¤ò=÷%³Ô§Iˆ)¨¦eÇ&õUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU &8ÆGF$¹&Aˆç&u"FlÆF‹†E†9Æ1£fŒšæJ…&‹“ÆÅ`p|c€bèÊ`Ð4(OJ7˜‚ %Ú1¡c"WŽ3(¹§Ö Ž˜Á‡†€"AFâQ À0Ÿ#{3 D0ÃJ˘؋.š91–™0‘]ÏFŽ,-ÅZpfÄæðªaBf,D€ƒ…;åÓ!$A1ƒ‚˜Í ›4®“.'5Qt„LÅ2С¨`¸Y†¡ÈɈLhå*’|H$†ÌPM*ò&’9@`ÐÐãO{ÀJÀÆÝè²ÿâÂÀnÿ{tbXîðý™3µ*"LXv}Y–·rgM44»p[!\¥µL¥ThÍNY"¹VòÔ‰¬ áJB—Ë¡Uäâ0#Ð$E×@öZ×”Öv3ŽæÃ ¢ ADÑeI¥ 7dL[êÚ™‰ŠþMR£¢æ³Iœªí«$S)|³R¡tÆu bN'ì!Íë´I¢°¡ZùR×áök2õÚ—#èÒ!ô¿]nÐÒßf†ÀÖ’¨¨À„Šº–7yÊHEÀ! @D×ÖÛx»é˔߅Ä]'¨`9²&zæ«’ö  ™AÄi9Øk7e ¶½à¥3¤â r’b5 hüA15̸äÝUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU[·Æ@œRdT¹ž…f9œdzh)ѯ&fÍHþhr °—爙‹diɲÀ`jbBìªATÀ£L@6äc°W툎ªéq0q& bºP6,¾«/ˆÞ§¦cð!w‹¨ô€^)¸a·jÏ!&Ù›(:·"1x‘P,ÀцÁ ·q¤ŠÖ†w_0aÈ×™ì0h4YDÒAF™cò¡È4ãµÙzb*hFÊÇ1> Pp‹‡ k//B‡Aê|´)Þƒ¨?`( VÖÉI…ú‘*0½Qɸ.e„Swµ9fc¹K@(´·0ƒ~‡ d‚B¤ ‰LÿâÂÀÕÅÿj4^€>æ²yPº"i>–œ K4×jå· tÛ‚Åh ñF”­[Ÿç ·‘¢ræ-RÆ|_¢úÊœ¶Õ`6æÃ“ ‚Á‹HŒÌm–$£"%Œ0Vb›¼¬}-D T xšÂ4 0ŽL­m#’°ˆDNÅ\­ŠMçxÜ4&ä³"mý@SN±¹ « yÐL[çÝ ¤+ÄYû¶æ:M*äc örÕË]·ñ«•êÞ•15̸äÝUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU¤²` ˜1˜ø˜Ÿ÷ÈžY0š(¶š1˜"fž.˜y0|ÞÏ Í40 fËèhHÂÁÉfd6‰¦Â,x£$ÊA@•ƒ¿Ì´ çMÑ=Á@ Áæi„Dm—–N à& ,„<&pJõ3؇x“HBæ,ˆå"Þ˜[&éà ˆd@ŽxÀBê-aŠËÄ?òž%É`@.kc/Q&ùx¥êTÏÊósVJUDV4¢c@—Ag+;"a­A³&ÕTx}Ú{QÇ!¾DÆ<Þ£ø@&`…@ÛI6ŒˆèO`¨Òœ±´âD[ æ– H*i.ÖÿâÂÀ·(ÿl,^lîôQ©¹ÐS'½ˆË]—u/)GÖu;Ëih2•èΠi_¾+  ì­%Ï-xq¥ 1Ž0Önß‚€Æãf]oÂWÝÙ~Ôƒ´œ.ƒŠà¿RfÉ-LÊ•6uÎü±6³WðZ–ÉRš¾ÌÚXé)³MPÆâð+{ÁNØZtzN¨ß–æŒêô®D™4*Íi”D Ú6‰]bHŸdøv_ؽš˜Û”»T´7%T›¥³*b j)™qɺªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª0ôÓ QB4RZ£Qò21 £;!®3"5V1ÄL0UX3¼ÿ4à1À.1L8[¤  T„)0@Œm„ 1…Ö)›ð 2^ IC©‚P3ɰ8. Td‘ fy@¦M(¡‡Á†> ˜œ Ť0¢dÅ¡âÈ$ (0)D× sL¼U0˜XÚ4JŒÆEó@ÁB#%‹ŒE¥0xØÇB“ ŽÌà8Õ‰¨ ‰LÄ|8ÇâÀpHrIUZ` µ8@¼dc˜ƒE¡‚S Î`ÀÂa'J× †ËH ÂÌ0˜mÙV¸J2†ÿâÀÀðiÿxÔfP÷x4‚E±•¯‚ô£K9o˜‰ƒC† €¨ JQ@ø$¸šÓ<*…À‹YMe£¡H&Zî+–TÅ%Ë)7ƒOÓCgÁÀqbÑ ëåi ÖLf-\‘Ò¶í}÷o™»+‡/ u¦Í¥2ÖÂÈS©î‚šú¨%ìAØ™“tqØŠ2Cò§ŸÚ³—lu^ÒVž{!Ø6¼öÊ4¹m÷%Þ†ia—AÉ€[øuù¿-}e1ˆ„s|©œiPíi‡•œŒ:/»]’¶už'~¤äƒ'¡êV7 ¼/ËL‡ 8Ût‚hçSQLËŽMꪪªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª ‡ø,˜Cƒ!¥YjO‡¸Ž8 ™€-o ˜@‘’XwP…éƒÈN‰€¨#˜eˆñ€pÐ6‰‚H=˜‚ )'˜ÒÁƒ` ÁBÀ…Ü@1¢¬Â¶¼b`¡F”Æ ™p& ˜­ ,ü20"uEA,³JŠÌ 1tÆe³/¾L´‚0€˜te&±È „÷óÄ$IŽÁ? Ècs Ìl6€×Õ3G@‘à &aé9„B†5FÌVT0ŠPC0¸ÊB€P¬Èl°H ÁÀv8`Pxqåä]ÀQÀ ¦H¬ˆ¦ÿâÂÀ7êÿyÌfP^à¥àÐE:jG Cp‡Tejí¸e1Ñú0X©êŠ;¯˜A®³OtÂB'ÞÍ—¼oØÛ²H-;ãÐQ :ÏR”À·)a…¢z^(’™ÇúÖÚó)r"ïô¢ma߬ò=0Ħi÷tãr)tš~£r—Ar;rjX=I°®×.A ÄÚwÒ\ÚÆò©,=HôNS¶þÀ-¥èûµ I}3ë,`03VŽLÆ^ËP4-@Œæ3km)Ÿ4ÊHŽ-9ý´÷ZÌŠÃkjXéÃòw7w”’ê¸& ¦¢™—›ÕUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÂ¯ç ‚8rÝŒŒ‰ðÆ €E†NaÇs£:OñãÁ¢#(1 ()‰"šH Ðe’#H€J‰v õ¤VN•fH à /Â7—X@ Vp† 4 † 5F…E‹‰ X.8Jxqd $ ,£… ¬eBŠ BQ …ã•;?GDø»øpóh"ÒùdD0 dËŽ4`ªbâÅX>ND9j´]ß"DÀ„ Á¡Ör¸PR‚†$B|¡pÈ&Xa…0ábJ)ÊõìCpû; Y‘ t(f¡@"ÄÚ"—h¾ aOKÿâÂÀÛÿwìvˆ›Ða‘À AÄ&KZ!^2j~'$ÃXu4Á&âñ9êGÒºQI1¡ «ShèÆ'DDÔ(×$-éF~mžükt. še×lÀÌø @ƒ )³ØãhìÝ}/wóâï£Èµ#ôr¶ë˜Qæ\ÉÔcŽ•Z43â ACBà9Œ,רÁÙA@@NÌÉSDP 8k`0Á²â#4è‰GWPHY‰žÈ6’KUÊ¥LPR‚“^-5‡“ÿÂ!Z ÀÊ !ÿñЀPI ŒF jb j)™qɺªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª!Λ:Q±4šøÀ!Ï™XŒ|Ç‹ŒÎ4pă…ά` žC#dMƒ:l'©š ŠL˜ ¢CÊ…JÍRDCÊ€Š ÅÑÁ*ŒHá1”t ¤bv`†BiUÆ8¨pÓaKŠ" .è@"…‚$000iƒV¥Œ˜ÒAÂÌг8Åú›Œ¦Xȱԩ—%´<"DPàŸ(b8$Í!€ËŠ$:%0‚•£[´¬NJ&ˆEAkT  KqD˜vJ ÀK„,¬ˆ4õ0$ÝH—U B°u.œ^0)dƒÿâÂÀD¹ÿ|,npÛÐ#ƒ9. *‰5Kœ²Ë˜#ƒF  P¤Å¾q8(á‰,DZ&ã ÙiC…"°ðp SLÇ# D¢(¸³Y Q©‹'}äŠ^j…Å)ÉC d@,c òól}À&V€0‘ã¥FJ¤‡˜ ¥¢%(F"Z_e~Óšª].ÐJÈ«ZH0¨Î >& :6†8iŽ*P8ÓÌ@1 ÍÕ0K{ †L5%–¾šzÕR¥§TÃ2ƒÌpQ5ŠºÒxPû¸aL0I°aN1“d i«#œêb j)™qɽUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU©L¨(,n&†‚RsSçbÊf Fp‚ JB:!ÃPœ… ˜x $H.&`À‡M`¶ƒd>*ÒLIÑ›`ÀÊ(Yâë˜pÀåCGè SÈ V< AÃYI‡\.x¸…šðŒQPD<`‚©h•$˜F2T‚µtª0.D1Š­Lö&H4|0ƒ’ƒªlj‰ +Grƒ¤M"$Ñ<˜i,!\3°À¸3O4AHÄSSþ(7Œ¨ãq­¬v&ŽTÁάt  AUUaÀ( y¢*ä¼$Í5s"•”·&xŠÚ’!Á3v¸¢CÄ„]Mi'3aÿâÂÀ—bÿs¬jp´Þ²¼`H,£]ˆCd¬ñ¾ „ï6Bñ,c 'ép³À`¥í”B5@(jýœ0"-?„Œ]ÓÅ apÇB/*ñW("J÷¸2HoKj!hÑYa/;_*®±Q °<)eÄ& ^ò‰Ž)ö½’¢BŸkݰô3\ÁÅbªé C©ˆÜ™b°·&‰—[›/Z,°¸«P.$:  µ”´È@2€—M¯?+ÈÇA%Ü´øF€jbÒ¡ Óap„Øêb j)™qɺªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªe ` 1ÉfóQLT>(hÆ`ó­‹l`Äq–ÓæÑz˜îa0h6bð@ÀÁ  È@“Œ0£(Âá°ˆÇ$S’@ÛÔÕÌš°„`€ä&ÐP Ð‘À!ÄÚ@3xCs1=“àÂ¥1À‡ H¸õ»˜SEÈ!’‘1ÂÑ @HÍ+‚@%œq+Gñ¹ÌEH\›N€@ªv´”ÈÙÐô:(ÒEsŸ ÅŽVäÈ™ªÁ£‹G‡Q¶6˜‚«&:Z§*qR!L‘醭D§–¢ªã/ª‚Q4ÇpÈaÀ0Êì-KºP³Â͈€«JÀ¬@ÀÐÓVI‚§Ëf­’aβã‹$ë:Oµdž* ©ìÍKh¶ÖÙ-Á",nÑ.Ðw†+†˜Järr‹ÖØX»ÊµÐäÎy—>lQ¬ ç§t¤»dwßÕ8PÝ:r¦3Iz›”Žn1Å20`€!ÕT8Û®Û=)j LIE‰F ba§ËZÈb­-ŠÅ15̸äÞªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª0 ´ÆàðÏÃãA» j[0I,B2Ñ€Ø(9 ŒSÐÁ€ Åaà¦ãƒ…@Ì a^…DÌ„aAÑŪ›c1àT,LÓ 1Òt˜ p’PÀAw`¾ÊdfaáÂfYÀ@©@èTÃ Š ÌœT¾!ÃãètK 1P€ðT9 <ôlT2"ÆÂÇ©z¨´™Œ˜PÅŒXÌÅÖ²s™AŽ"IˆƒƒÀCF€c–Ôz~š[:Jcá#@¦ 1aT .áAàpI€Š !dZ‰š‰;ÒšÒšx„ïnW» –¾ÿâÂÀH¿ÿ{ v„œØ±·%,uÁ!¦"IibX˜X*(ˆ²F[Q!™:bCȧ0@(®; €®!HÖ( Œ ¦1¢PT`p0hÆø‹H9ñ'ÁF)à‡K”a‚ÎÁ!UKñ¿ TÏ=W|‘ÜIt•/ç‡Àƒ†NbnÌ –Úra©cCš˜…Ç/bîˆrÿ¼EÍ}‹üÖ­”¡“€¢¤·GwÔåñ·F˜‚šŠf\roUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU €ƒa`©Ä¼&V/yÔeÐøè0Ç%raA‚æ`Ac4Ó-Ä€0ã"1Ρ|Ši  &ÖK–¯RÀ2¢P¿ƒ‰…[‘ ,ªæ\‚±LøåEŸkå Kˆã¤+_¡‚Œf–#2¸ÓÆTQ 8 vcE¡)8Í²æ˜ (( v5™sÀ¡HÈcÁR€Ð ‡6àBÈÆXfdMyÙL¦f¡X˜æ)«¢ê¹!aŒ¬ œÇ¨ nƒk‘® F5š&àð¨9 É®ŠÁU¹jÈ•ð"jPÒ’?8l¢qM g‹µa„”†Â®V!ÿâÂÀŸÓÿrtfxLæ°ô×ueA.TÒe­åPåKi(ÑZ¡k0˜äºÔ ò:˜DÒ,²(Bÿ… TZ È €âÀna&hÆ +zIX´âIZo!¬ d¾¤È/²! „·©0­ ‚‚!4ä+ ÐH<I ©ä‰¥­%ÌÍTn D¹èHd¨ ÿNF 0d-¶î¹! Ô´Šê,ªÈÖ^¨PöÑñ Ò€Ž¢ªÂ­µ†u8Pòœy‰YS§1ËK¢ó,Uæ–Ò¤mà8m15̸äÝUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU€ÙÒ Ñ²¯7¹Ãg-0¦»pQY¡ ‰•GLð|ÑÌÄ!;ÌTpT=X‹˜! .-Y|‰äd«¼DZr ¸¢€Td @a‚ PT31Pð0€ƒŽ†©•PÂÞ‘Ó '@'„(ˆ(0$ …4̓À {¨J¢®@{àmÒi ZPªFyÂi„ÃjrSÂ$`n92ˆkdF6J©Ûòð¦ø Žä¨x`Ú€–«Ö»Þ¿F¦ u¯p)š›LM’D¬7›VñÕ •@Á4ätÌ ·A ")h „€ÀMИ‚‚c-N7h,£Q€FÿâÂÀÿrLj}ŒÞqH'gã&AÒ,¶TéVtiaFpŠ@È&¤IùYx( ‘Ñb´¸hÉÌùåB´jŒ"Õ‘=“'˘8"ü5rø"EtäGƒT3ïS‹V Íù.mx› {¸:Iˆ‰€& E‚"Ðq#ª-Ëÿ²Â@Y€ ¸‘ÒÇ%±E’ap½ÖPžœè® XènºÒ²†‡€Y0¸P–¹Ù^0ÀhKŽ ‹  §ª€®»â*lf!ÙÂÄFöñ/å´Ñ}& ¦¢™—›ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªcê{‰¦S"g æê$[ð(Ã1Ó5TÀº¬6`dC@Êð`A¡ˆ$ÀAâr‚aPQtÞ!™H ˜ Κ¦FÜ€FW€8„`?%SÁ…A50\BöŒ‚„/àÐ018 &-^d°ãeÆBà€JÎ<ˆBL0°0‰¸L*ƒ>ï;ƒê¯PKfp-88rñ!JP”4˜iŸDBÌpsèT0º T$È<‚äÀã¥À^È¡F™é`˜qN@ ¹eæ&J`0è ­óšÌVä0A‰¼,)RŽ˜ˆÆ¸cJŒ1„2Šk^âÖZê• & (î4\Ùªb>£‚@ÌD·È ‹¥…‰a°¯\¨àŒrfVÛ H%-CÚjB((ÓJnLaˆ>²$9† ݨ•عÿâÀÀföÿtœjpªÞ²¼tT£Là((ò_Ñ@ÂÁT ƒºk„Ì,ư¤0'pj¤¸—:¥jDhT×…‚\‰FÅÃRÖ¥ ¤Ë#uÅ{­ D š@¼À!˜ä¿\bØ’·ZT¡q&9!$Ä€fŠ ™Í)K¥0`X•’«–!„K L¢â­0¢ê™ >ædcS *ªËY$‰ˆVHÎ)ˆ)¨¦eÇ&õUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUP ¶ÉÉH"Á€†vür jM(Ù¸¤a5²'7b«¢7 ¤ˆNËRo'B–ð*óJpÄ™"Ž×ma‘šI˜E:kMUãä™0˪ « [f â PÅ`P5௖,p`h6œå¤¸&u3` Vȇ™ˆÌiÀ^…Ì÷*ˆ0¾ÂQåõ0Ezâ:i¢Š!tŸ5à¹É."dž‰œrû¸¡E`9°£ä銩1(IMQᆂÌpV²\dº/2³ˆÑ9åiZÅJ‚ý‚ F@UjÀ+Œ̤ÃJSuH¦Í,¶J¼PÒù7ªñ-KžŸIÒ^ÿâÂÀJ|ÿjäf†>ÆòШ hÇDn/À'%U[vx:"yƒ-Ú¦,#SS%ÔÁ˜SÜàdTÉ'¤rb«Ô—¥¢GEŽJÁæÕ¹yÇÒ2U¤D¸(á‰ÀÜ€E¦À R€I$jÛ¼ô J“U¦R·ÅÌ Š©KߥE &R“xõ¤µµ…X-/£¤²ÖÂíXƒ € þ\ Þ€ P`j!¥-z¥Ñº'²#žpŒï<Ó»¸PíôÄÔS2ã“uUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUïñÐs2F4„A¡âúû)¥1£‘‰¨ÎYÔká£'šj©¬´˜yʆ"& 3¡§hÄL„P cƒ`ÔŽxÐ "-MÄ^"VWÀĆ`Œ¸ÊÅ„•;Þ2´¢×˜Xù¤:¤2²Be1@À€Ðr‚†=bÝm‚S¨Ú 3ÒÉ™³dÐÁ‹D –ð0€”à q»¬)‡>×*+µƒDˆ«Å1RÛzج¼EõRèPHÊß.qk,…Ž2—`(ÎÀÉ jDÉdmÝìKÔá U’°&š«×ÎTé*8&î I˜L9c)ÿâÂÀA$ÿqblÞ±d‹B§.ì[>QÝwÞ$!Åbïêi¯=I¶(eQˆâ,:šŠ1PD¤QK£"I!Ç’‹Uø!\„å~Ž(vUDk@kö`+N!ã®QO•@a„W©<9Ø Žh YåhBõ Œ}z6‹á—J¯Ò1y±Æà®€RpaóŠ „ ­ëJUÉë._TPú|®ÐpVëÙpRv%ò»Ñ_[LFD€h h"Ñ’¾›n+F8ªMA·~+5× ºg1a ˆ)¨¦eÇ&ꪪªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª!•A&y±ò™ÃÒ¤ÂIøëq›2… ¤‹Ùמž(¤séþ<&Ê ™\@`G` |dqp`ØÃà Z"2¤x1ð8Ì¥£% F€F%´)0øÀAc L˜t2’Œ \ïÖ‘Lô9!˜x #)dp˜8$ L2b Ù©D  Ï&d4)ˆFE5˜8v0à ÂÃc[¯LN 1ª@ßB`((ᎌL8b"_³¦‰Cc£L  ID”€!H`T´ „ -Fæƒì’V©Ð€°¹2J–Ô@ €QÿâÂÀq ÿ{LjXï¸$å>©¯#CÔX!P3B´×áOÃ…*5êü8°µÛh)á¿‘t“ék¶Šñv²·©k /\性YÈ]²åL 0ì#)röY+Õ{8O)h;œl9„§CMCuc‡«Æ•weဤ鞫=«BêPÆÊ]Öº!õ‡uV@ݘœdNCfLÿ1"Þ´Æ´Š¤À"ÊgbŒÅVâ‚ÉZ”òÇgU>˜:¾‚ßÖØEöî@»¼ öoLì?¬Bgïk²Úº.l¼¢K¸µOÂ'CC~üB¢ëE(aôybÄ[GyF›5& ¦¢™—›ÕUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU… Y€¼Àd6Ì8 ôáíKM¶œÊ`¦LxTÃd.Ì'ÜÀìŒ3@”Ã4Àna& pŠ7â\0°™L*0è\À`Ó tCâBA Bx1x€  18™ÈN1xÁåÓ$¢a€£‡¥†L‡L€FW¬#„’`Á@Œ€"£cÖ©žf±8rtåY”S ašPŠc´!¯á #"Ì|18Ç£àH 1–\JP†¢A‘&.0Œ¢$,T)µ|Ù\-X ½®Û ςDž— Þ_¹ЦBÔ¹R˜$TTD»l©.ÕýÖÿâÂÀCÜÿyÄbX÷4œ¶<0S"F°‚€Eƒ˜`c3/s¾D=š.æ›,À.J @ ‚VnM7Ýʰ>í>´Û§M(dðÍþÉàÅ,ga€Ø`p5NΊîUo¥G&Ƭ.…¶e ½W¥ü)"cYYï³ü, –«¨C:aÏ’?ƒCðÄUTsFFRÍјéýDöDöJØZÛu X¢IðÎÛe(b*±€!!f¯v4ßnMKRx±dÄr"mm2FPË^¹;Hbp š LAME3.97UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU)ŠB©‡"ѹ͡Ã!‰LÉ—cAY†Q‡àÁ‚BY!)‡å)mB!Td(ŠÆƒÀª´}Mj^(c#DIdC,ÆÈËê¥MÄP8ýR#*ÎpF `q„íŠAT‰(#*™`h@\h<8H © ? A)º>I‹’X ðæ”ÅBE‚J6’†Cti! ´)ƒ„x@Qn“ˆìÒ]Ê<å±ydŒ #L¼iƒ« $Rè)\7QÙƒC.{MËU¸"j·Rà"šŠ”¨´­H¢õ å#Îú²Àáˈø1EÿâÂÀn‹ÿxTjlîò¼.i7$ÿVè Fthr™Šß’S9t«Í\"šB ›aRJ¡\%t\—ÁŽ484Çeo9}Ô°1tªÄ°ì|"×&*Ј0àÒ` HàR(¦Ÿƒ¥¬8Tã/µ;ƒÔÊ…Ð4Ë@Ä7FBiC3BB¸e©–MNç h„ÂwÜVõ–˜pF%îPXÛ¾ õ'Ä$€äž"€ "Q1`ÆE[ ʪ¿ hxs ‚­¥¬ j(b0qTGœ,8Ði¼‡yˆ%—Áˆ:ƒP :0°­ †¨“SQLËŽMÕUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU¿“ ƒÌZ<ìH0Œ×E€â áXEG¦V<y<"Æ¡b@(! ‚„b˜Òá0PÌÃ"‚(³·å¸˜‘7êÀ"$‰C°ÈÛ:ŠªÉ0@s,Ú`3‰ËÆcš¸¦­aô ¥ ¬ÆùÌPühÚ0F ‰S•5mÈ8, ¨Y0 < ÃŽ2 Ð=YÅ… ‚$Ï œ§ÀƒWé¬ †éôÿ3Æku4$MÑÇK4ý¿ò¥enÈ`©˜š`¢õ†Lš @!ÁWúñq P8­QCQ€+2*’´¤ÁeŒá]8Ià†ECá¨ä’J”¾ VbÿâÂÀ+~ÿpôjp\ÐG0MI·D½´¹™ÚhˆÁ2%F@Òˆ„eÁPÃFU{úÕ#TÒ„D)jÀ´BË9IIc,åJUép™ê_ªer\$KB']ÑC‰lYû'"fÍÙM–9P‘‰aB‘@%Q§ñ¯¿‰žZRå'ºèqÖÆ—ÙņÀhi("`Î^Ü–Z¥)‚ÇY´öÊd Éçb0t é5)rÖ€ Ò¶Ñh[B„4ƔΠheœ¸J:ê7®‚Á4øÁcɂ֮õ15̸äÝUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÇ *×›HI ߀òN7˜(ÕC+a¿LñÃIüõ ‡ßÌHåY×£‡žˆì9‚«½l„Ê蜆nî@Ì¥‚Èá¼Ó0|½Ç© ü -@Ö 4Â̈ € ˜  e†Uuø´n%ȬFå3î”®“ xܾ£ùDþN[‡á¸}§ˆƒÃˆ‰B@ÐÄA3 MŠ‹¡eË<Æ¡0 ¢ç21¦ÿâÂÀ¸;ÿ\„v´˜Ð³9.}åñw>ë?;h7ð³/Ó_·ÊòþßÇ®[¿~´c‡M©x¥J…C/Æ$òyHæ,âa7€…"­Ê)`³rÀä1jÞ)š†–Ô†zuôcÑw²ÕVçEVçqÿÏÿîjOm´|þ^ý93ªåÙLAME3.97UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUULŒÿÌÄNŒiðÝ›Ì8d²t7ñó¼2qh29™øzK@’Ó)$0B3 &€¼‡€Ø’­0¥Óð.×EsmLL “ |„,ñ•$„@ÑœL=(Y˜@CDfÉ`â RL`.LÄ/YpÁܦ€ë²úMQ·g( ­åBK(J1 "”tÀI²EQDEÔ”/tžw˜yžbË €C€¢B`.Dø0ÙfDk¹H5"Ø)~¦£XZ'…ƒƒ21„„.‹©ˆ)¨¦eÇ&ꪪªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª"dÐXHar‘¢ÁfÒ› n1Ó‰Ë0”Í£Sz·@“c3  ÄAP±ƒÆ¦R6€!dÇ¡æ¾D8R€€™0¡hƒD` Ó"SQ0 ­–¨`W1€(Âq`è"cTatÀ¢âgÂ2¡ž<¦!Ÿ¦AYqaâ£ÀR°è2@hÀ• `Œ˜aXZ_€AHF”( A ¡Q¢MÌ„ÖLtˆ34LØ´hp`Sw°HÂŒ’H˜rè—5¡/`¨Ê<†C"%[_W2ÔŸƒB!ì΂GDßHuuƒ—/H“&ã¨èL(q!tB2ñRÕJ©x½ÿâÂÀÚÔÿwÄjh æ³H0‘ü2¼Ven—(iT¥œù;R§þs'ÝÅn-]•¢<™×m³P‡#u;i8“ €PP˘(Z~…ŽdáÁ‡híÊh¢«"’.Û¾gÜ\h ”ø^Ы֯,è5&LŠÄŒb‹hÁ”jÄÀ16O¡‚€A)dÀH„ÆŸf¶ÃáYÕ;HxÁ •²Åä*E5@´°h á–¼(P!@Ù²ºƒK²‘ÈI ã’6‘'fëè‘tÔ\HðqLÁ=ELÄVD%TRñ‡I†h ô¥$„T%«_LAME3.97ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªáŽÃBs4ƒLŒËÝ¥Fgò¹¥Är µÍ„¨;40ÃaS Œd&9`” ó …Ëfg‚ Å·0r¤Âà$<0™tÀ¡¢UQЃ,;3q2 £*š˜ˆðD¨ªŠ †™ù§-ûŒ£Äd@I CÌŒ@JD p0Qs% 3C€@ ` è©—¸’¸à Œ E H„ܘ×ë žÊ ‰„11Œ‰d8"0´t1£…ë‰ ¼ ãX«ý­PVÒ£KLh" †Øj”—Eu?–˜«WK2‰Äu +˜d·«§–°À6¤Œ+´Â[õafHÀÃ$ÿâÂÀüæÿwtf`\Ø*ÉI&ˆÀ˜°k[Š@a²û£ìÓ!~“]L V%°ù\‚$â’¸«‘[—ʉ¹mT¸¨ E– Ü“0pUï[‘åfbÀ¨ÝàB€*òľv—ZÍg Ðà°ˆÁì¤x}´S@â瘠˜@Òø‹@Œ\ ¾S"ý‚¦#Á0ÌX[ÒÞ"°zùb €tÁ~Ř›GæˆâÆeðóÀÝœgJ¢jÁÖ\õ€@î[ä&¯×%´‚çšK<0Qƒ0 ErÖ È 5°«ly &\[P)bñ15̸äÞªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª0pÔÃhà R4‹øÕ¨Ñ4ÆÃ+ ú}sÓ’2PØ3rÄ€cyŒ I¾eƒ ? >!(Î5€ = /ÀÆÈEˆ@SšÀeM5²ÂÌPR€À£þL„ÐŽ1aL`ã ˜ºb j)™qɽUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU3ð0M5ÍDá°#ÝFMk`:  àlƒ)̰?4 À 0¨e(ÌF*ƒ‚áBb¹&8 L -¶Dœ “áe$%ÖÉlL RÞŠ2ÁË(˜pÑ‹$ȇ :a F8’óI5¤†Žs0Á‹+£OH(PH\é¨1 Œe0ªŒIC:$ËxÍ2äcÇ{ÇœRìT ‘¡äíðp´q’.ëID@h‡L‰ïE"æ¢T VŒ‰)n^±k†JX¾&2 R¬Q!KX`auh0¨‹•*97ƒO™Ÿ,T*EQj`†à ªø·BDU`À€©Ò†(nïXTJ>! šM ˜ÒS!x膋MŒ‚¤Ö¨ñP`·”‘ªÈ±ù‚`J‘PHn©šì?:˜‚šŠf\rnªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª  b€`€jd¼"uhá&fðÌ$ÐÛÆ %‚gÚžÓbBI€ªL–\ 8¸@ãi~a?Ça¦L4iåÆ.á˼,»B`& ôPø:§((H*Á …â2p¬’Æ¢æRÖ Ž TælÚ(9Œ¹€q-ç¢åÚ$‰ÀÇ9 Iƒ À5ÆIFëÀÁ÷ ˜=³Mò!ÈUL‘ƒ U3M$W 9¨Fˆ‚Vp24½MÐr@ÒÃ!JŒ/Ê”°Æcâ"BÄT Œ›AbpÐZ$’ÊŠ:#TÓ¤‘j‚ç.Ôg3Õ`Ž3´œÖª«9#b£¬Žó \0 .ÅÿâÂÀïpÿu¬jxêÞò\èæ^¸9Ëne ÄÉ4!¸ñd ¡€&€³Et¶\È À ABÈ"ƒQ‡Ly¯ -ƒµ…zY´+,™2KÏÊb#á„@"CJ¡Ð9Š*¨¢A©DÅ.r "@PƒSh£‚)—Í`ˇ¹ƒ *E,Hˆq3‹g’7 Pž-‰'Äc–|I SŠ`¶¥‹Äˆuœ1jS3 ‡Œt”&&[d¢,)X¸AAPÂÓª“¸+0ƒªÌ…R<"òeŽ%þK»‰PÚ¡qg”XÁ6¨P…ªnñ‹$ ¥ëR×Ð(ñ¿žZ°xL‡2‰j„At4gH¾EšT. $¢¬QòøÄ‚U ,ÞyA @@:𣒠p‚¤)œFq˜Œ×WáQèK0âá @â¥Ü|àv2ÿâÂÀ€ ÿutn€²Þ5TÁ„rŒYEÆYYŒc‚ PpØaßg á/©s8ò`ÂRJLª ʲÑX5Í ¬1YÁ¡Ìé"ØG*h`ÆŠ@hq£"A,Í æ¤AuÁC *1˜åħP¹Òá—¹–€Ž!jï—ƒ–x@# I ‹Rœ¬1÷0ÄR¸"[—#õA@H–! ¢©þa·f\Û+s–¹åNÉšc’x¥ !FÖšVPLVOR&\\d°HB¿+K–faKB7LúÎNñ15̸äÞªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª‡â1AÇLÆ1&ŒfB1ÈdÇãbû`T$Æ1P¨6"ƒ. &€T$=‰ˆÓ§‘‘$®Ë´ŽãÇDthIIP’d â€G¸,$pMŠ*f9a`vÈ€8ƒÀƒ„ U` P±ãt ÈÏŒ$hñ€43!X` °30C„`4(€)…27LzC-| µ‚Ä ˆD(ðr£ÞƒÂFfL,ÕN΂V²´`UjI®”‘HŠtמT‘ª °H^]Ø‘»y®å› |HBΨû7I”LöŽ’ÉÿâÂÀ` ÿv4jlæ²¼–«^1¥©/EE7‘¸)R¦ ­ª, H0ÖhÑbÉDš Q)‰¬e”’-.»êƒ¬¥v*CgŽÈÌX‹¬ N4¦bYŸg¢-=EôÙ—{GjÌÊ.ò‘tÂÁŽh…ádi.¶‹|ª«q*‘J “²ÆƒÈŒ •œ8ÿâÂÀ™,ÿtbdîòœ(N†×Ð8–Å  iniŒY‹­†ž™1…6aðZ(½±§Q '(`YÂo“©–¨+su êÌPu'GB& "à0ÊŠÀ@U…™1òò¡J¬I€šœÈ‡,jlØHeâ²Ì Sa<‘µ]FrÀ'NBríwKªŠ¯Y{UÄ~’Ì¡’±³Öá4W)¿v_„I]Y K! —RNÕ€£kHtÄø»Ì¥*û™D·ýl0÷ɼ/ÒcJ Xj#E¡–³¶íÅø–IÜø)þƒñ€dIˆ)¨¦eÇ&ꪪªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªY’05˜?„é1$œ6èI¿pª˜¿¢©š`à˜ƒÑ`ט4Ada)ƒˆHØà\Ò" šäœ<1¨×$H€“–c±H``y¾aP„c#ájŒŠ°0P„1h 0”b2€96h‘!`(aЩ¥#…ÆUCÌ¢76ÌY8 0Y0Ï%C Šàû2‘èÞpCš'ÄNƒ7‹ÀÆ¡iL€­Q•Ê㌳ ²0#øè#s‚À¡s2 Ó>ÆÔÄC‘Iˆ&"3˜"cCX`¼X*`ÕA˜ &0 RD2›L‚1€xFR28$. €p ÁT¸ €B€#‡L(íFTð[Œ2 Ž·òz¥ç|¢ú˜Tf ­jVà´UU]I0ÿâÂÀ»žÿubT]à2Ù*CCòø²–ý–ºûd­Þ_5¨&£¸ûÃMuìRrÕ÷i–^lr…¨¾‘Aâ ›fà ÀTÍU/ß&rå¿’`<–{ÖÍu *æÀò¶u…]íÝPÝs¡¤B[,†×3²¼ÕÖ­-±wY£Þ½šR$Ñü'3„›×ö}™ä‘™µ8ºÿx¢ôo$%¥[†"«½º¬wÔxÂÚÔ^’óRO—’»ºü§Ó}á ãut¸mÒ\–¬¶§—Oá*ªûÚ¯¬æ¿’6öj—&SQLËŽMꪪªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªB0‚W³m0¡i!®ƒL|DÓBMŒ0!SFiM `Y hÁÒL°!Á£a‚€0Â$ x0T ÿ-[O@"ÅJ…ÀWÔ(Hð$sB2¦H¡˜@ Ã†Àj…%°825¡,¼Ž±oÄ 9{€C ,€bB%`ADÕ˜¤1¹Àð9Š k ™¡¯é4 €‚”9£_uÄ€É_¾ºÄͷȹ®`$H1:x¬e¤…ÌUF"_ÔF@¸U °í¼RqÇѦ8ò÷ü»†(` ¨³•1ÂŒ˜0Š”Xi@ÿâÂÀSúÿyœvˆ›Ðr"@¥+™e&8zC¶Áp­ tp RÊ%Áv!׈I¥êâ1Hl §‚‡†?6VL0rÓŒðpQÎ&#.kP¼$ÒÍCã¼Æè6߉ŽÑ¼ŽêÀ çŒ!/2B¼ôì1v7… ^‘´qåñÄ„^‰€»F(^õ®¹££¦Š ‚T¨Ô3"ˆ( „;B&r(ÐÓ&ˆÞ”¾5ƒŒA‘TÕO¢Ø¦*.À€:7ŒfŽÁ!Ä©/É(ˆ ×»_l “ÿ€dž€L³&!Bü”B4ÈAa“ÀɈ)¨¦eÇ&õUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU ¬hmqÀ˜†Rb‘ŽDà‚x(  ™ð@H`F ‚G‚b±‚¬Œ.•»¦6€¦#40dŸZ!ˆ˜È<20dÆ„1¦A„ÀÓ²¡Ö@ÇNÚÀ…&@=£10†‡S€ )M !¢)ʱ (C bĉ‘Œà*H+˜P]§`c ‚Š !,Ða¡†¦ ê>€–Å…°WÝy&;쀇d`X ²‹làP E²,%9]”%–Õ2Y¨q²!«GI# @ȆBH ‰d” Ã&ˆîJÉT#FÙ³(pÚúÏ0ÌÿâÀÀºÂÿ{äjpÜÐ 57R"ÀBãÂÄ„¡9cªPh4½J `)@U£ÌD@D Š*ñˆC$£.FÐPÔõ!/a(cL…+zJ)ZíSU2‚‘iMõQ1K›£/²-Ž‚Lrî…Å4“*ˆÐ¨¢§›P˜°U™ƒ@ ::É1 I´)™‘8-[ˆñ²ÅHÐ ”/ ”gL2"”)¦ñ²pâì¼ IrL,¦J°¸UÀÞdÆ`ˆ*gP+jW@-]ßb/¢¾-A‰cËÈ. Æ-èP9¸b±d×Ö™uÀãÑÜŠ HzÄÔS2ã“uUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2@PÀ3>AÍp 3‘Ô2c~% z ,&-8T$#"62£Ó <5à 3@P1;K0p#4F "¹(Á‰™'é¹`PFmå&ZU1pPŽ8ØŸ ŒœÜŠÃLD\ÑØLüD  `P ±¡‹°˜x1…˜áˆ„©iÄ`¥f0PZ9ÊL„ÄBIc¸²tØá@Ž"^”‘4g¹†N¸„>?l "šb5Ð8IzB.͉B­µš÷Ì 1èÀH1ˆpæãƒF‘f1ÀdPQ—Ç‘C „Cs# L&0¸\»¡„£KB0GZ 04_4v08¡§‰L4X¢0`xÀ U¸¾fÙâ{“©ÙÐDEXmKÛ<8yž„ã{“DF l1• ÆE‘D'Ü0 ˆ­yE†€Â€©ç XxuÿâÂÀCgÿz¤j\ \àÌiÉÚ×”QÝAX1_·v,Π¥ô¶Úã=D8ZT­gÝ=Y-V!½«M·dlµc$8Ú•@I„ÍZó=héoHù5iA(:™# 2°|ö$Òê®xfTžÈxøu«µ·M¬ …@ H³l SUØ"$S7ÄdÀ@9"Œ³~R]P6wI¬Ï¼È´Ä— ­rmŒ8¹ìSZßùTi”ÀK8¢kFX¬½åPÖ†¤ r£cÁ¿Ë0H8t|¢Ìõ2Sô*l€ 4± ¢Ñ©¿U®Ø* ·¤ÄÔS2ã“zªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª€D%™L:˜TüH™ŽÄ\˜—ØAŽB™BVì˜8@†1 °ÕÒÐ.)•Dy5êæÐ\ê3¥HfSÐäÞÈˉÛ0BLjð"´d 85†Mâ<B@²¨^sTT£8ì*I¿¨0À ƒéf^BtZ@@ƒzL¨M&ÍŠS$˜á̲mÆ4WݦÍ6I—à ÜÇ3ÁŒ˜rÿ0F^càë0†Ì+Db5lÀÇ¥4´¯-YØÌVfHÒ X04“4KnfE‹ Ü*\ȯ2SL0j£Niå‹á*Ô¥™úóf(8˜‚Ä] žÿâÂÀ(oÿuœv€Р ‘+”ëEКE€&²¯/RÛ1GÍ9Ç‚Âçëça‹ökSÂ-Õ•ÎÆ™$E¼]í<·ï¾Ô̸ðóH-‚¸™Bi&r``qŠ4|È›3æ 8£%MÁ³Dzú8ÏÅ zJ}Õ˜‡íߦ݇áËæÀB–r¦$88™œÔpá>ÂÑ]—«+Ì-!‚€ ¨s8ð!hAÁ’ªbH‹0@øð Œav qÆ£ ðÍ'ÿ±6–Ã×:?ºÿþ,( $(Xp[eiˆ)¨¦eÇ&õUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU®€¯ì õ†‰Ì5´íkÀ”Fr¾pK¦<&„åØ ‚ L -ÂGÖ4P,šIÔ^‡e9A€(´U8(z¥÷VÈ›º+^°áˆ rù/D9’´,3UÂ0)$L ž2¨ÊH”À£(~—À@ì a€‘0v ¼:‡[*¥g F˜¬2ZÆL¯ žw™ð L ÍLßäo†>A5A`ÃQƒƒVNæHŸBssT¥Kx»À§2A2¨ ²ê1ÄŽ*)oׂ*»"R o—MZÈAS%Ö¦£"€¦šŒÉØc˜Bªª¡5KÐŒ,Á³ÐBKÿâÂÀ‰ÿk”j˜UÛÈÝS–™«Ä»kªÀEVæi ¼(vZ¨ð[d¼\ËÙ1dªqì¦C]G ©ÁC– KFƒu‡T+å@R.!Õ1fª.¨CÐP=#]’. ª^ÄËB °PŒgý!`){J0ALÝR…Þ­¢C%b·%*I5Yq ÈAZEì2KÚ¸eT`òð‘.¥Åºp†±E [gÎÓžºfß8 ³Æ%ô­Ñüonö·SQLËŽMÕUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUY¹ âà É43EÏ â@1*‹&T$`°Z ‰€éòa€C#K° XÀ€R÷6FD0§bs0zd€€“€°ñŒ!òÜ#$dÑ…— EH#)žqš5ÅˆŠ¡@ MÚ•“uÓ¬ ¸(ÀZµAôÃ.Øááu@DŠ”4 ð†E³\ŒE b1„G¨znK8´+À  Æ•hžQUáÐLºØÊã›\@ÖP‚$¼®m ¶„µ>"+>¤ˆ¶8pt•T´ˆ8<ÑÂD[â¨Ô½P$˜\ÆS èÒBÖFÃÔt ad…rŠ„¬èP¼ÿâÂÀ ŽÿmtfŒôæq©4!3ÐK©J˜+8T ‚¤—™u[šØ²e‡‰8ª$û“²Ö~„á'¥\¸jœ•a}XZ Œ%@Wº\&)wÓY”±–\Ä{4Èl„­5k36$Ø 6µ!a«Eê&SaÔ@wmʆe ’ûޤƒ ;1ô‰—…~ˆÂžiêé¥ó¶ª£Àn£ÑC9ôÍfLát¿hÚ•« ÙÖº lRVfù4hƒæÝØ<¹m785}È'èîí15̸äÝUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUFD¬Hýã/ºx*7É€Õ çÅAÈa0‚Ì 1‘`Ja1¡€F†k ‡_„‡±t-i@8°L12Ú· †*€…ðžìDGA"E™‘F 5åAM\5ȉa…!RÊiù—”…ż!a¹Qˆb¢1   $X× Æc§™,Ã?IR„öꎀR ¢Sl¿ÿâÂÀ}®ÿxìjp æ³ "Æ¢*>ˆfHÌŒŠ¶%¿F“,„²GT2FR뙤˜ ¤bBT (ÄÚê‚ eé*48`¬8Ç¿@ T@*@#£:t‚ŠNñ€Ë€© nl94˜ -p°¬Ü( …$±y‚¡« –¥©¬DPXumNuà^B@B¢jÈ0 Š˜BØŠ–aaR¨²€) æŒY‚"",¸î²¹kžSXTÑX‡K!Bãš‚®T©\à$Âç"i„tˆ…PŠ{¨® ÌÄPÄ,iB HÌ•"ËzÏaOôòb j)™qɺªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªd-Šƒ~*3¹¬Õ\ÑSƒÌ2b‚E§ŒcKp@Ô@ "ú4j ÈXŠqÆK`@Â,ó 2 pãÕ6 ª†<0<dàþ/A‘‹ƒ°QP0´9öšŽIŠ"oeŒ,"E 0ÀÔ|Y)+(FI–yAƒµ*cX²‡a" Ø[*‚ ð°ˆHø„ƒIp”æIe¢ rSPs)4©9ÃDšoï ,.àZ01»G“Mé ¸¯ÿ"¨'ƒv´ª hZ§z£,1ÚPDzSiZA)‹1"-A‘RX$˜Æ€0eF,шžƒK¾²BͤÓ6o–»·…Ï,¨88°P#Š pû§ðŠ"‹H^DqˆÄÆ1¦Iˆ*_ƒDÐ Èu´9¤¶f® §‰ˆ)¨¦eÇ&õUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU-?úqÌVXÑbÌìÆ"¨T`d(ÜD*oÇÆV*‰fHQ3˜ùˆ' Âx8‰5G‚ZÊ) ±™°ðdÚ<;ä#Q•ž†€á¬P¡&@(DîäJ¥U,ªa¨ÐÔèf«š,ä#r±@-š(¹¦,À3ÅÜ> IFÒü0t4(Ÿ" 1!$l–&!”t èÁ`ÄšA2c-¦.´ÚqCB¯T™ Še¤~]‚̦‚ó=Ȭ…(<¶·ÎR1']Ö¨yu†Z8‚‹&šzh0f€g\`a[±l“<Â=^kI¼e4;OJHÿâÂÀ–àÿob‚4Þq=¶—„š°!Ôˆ@Ô$€ä/Z0Q~Ö„t ø8±°Tƒê¥ã x˜2A‚’ÈœŒÖR £VªI˜”(½!dŒD QT™<íŽ99à ÒD…€Z¥”A(¬Á7­É®Ã뱚Ñr‹ä¥¬å’ ÖE6uÓ˜³Ép#*în‰YÇ.0¡¥•Bòt%¬ñEI«QéTßiJ¬)s1Pf,FvtjÐz6§Sd @T éi²f^íÂLAME3.97UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÁô©‡!À§ŒdˆÕ)fst $*DÀQ›Õæ !ñ‚ĆW-…á@ P*cÀ“Ú¡‹lÁÀtðG|š@ „B4á%Ì"4çð|ßÑÑ&^¯àIš:` ¥€„”,¡Œ§1‹­“ |ÂELa˜1Þ  –¨› C¬ª@°©YŨ…Ì ˆhÂS‘Ýä\Æ0"#–¯‚X¶©0MåìƒqJ7 ×™P-=[°ðº>²b‰°0 )XŒDT$„HÃlBƒ”PFDè5&VŽ*,<4JmUb  õ™ÛO–ÿâÂÀLÞÿsüjqtæðüª„”!‘E†cˆ¥ë—±¨d.¤‚ r®U¨:€ /²ìI11UMÝ‡Ó 0V[4'1mÂùMqu²Æo4ò7ù”¬8%Ùp %)\®šB9M2¯ÓÞÈB_@µ$+b)¨Ʀ…P‰Z%/Õ˜xÔ’HöR¹ek·Fm(TbLÌœ$òbÉú×`ÆoPWac/¸Ë4§#©`%š‹¨xÞ9‡ƒY šˆK¸¾ëU¼W©Ì`Ô~y×]ʤ8Tò„☂šŠf\rnªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª@ 1À~† Ɔš‚fKFZ™@$äÀ°Ôʤ Ó"°È4Ó’dPT1X>3¬Á!ó> Ì@D6PpÆ€c + ”°8Œa’À\h ˜JBЀÒ$#‚€QpH0‰Ö` x8\ˆ‚Awq‘«].B†3;™M>f ˆžc³Ddèq#thX#$˜¨fY£˜&Ø+ L d0ð`D17“ÄŠF`Ð537Ð1æ’#ˆà\ð`.;j¦ œùw£²ª8„¦˜a¾ê΄NC_‰ê4ˆq0*'0pê0ä—y/•ØMD²—!5J‰ÿâÂÀÖÿy4j\ï2œ¦ÑêDênDC)ÂM4€ºe@8àªÐØÖãFc 4 O£ÂûB†§éÓŽVU!ðEÉL%܇ÚtÊt²Ô”L–*ÄÖr/¥¨ ÃÁ'Âä\ËUu?©Ð„üTòê`È1!{#g)„á€ÈÀbˆŸ1ô ,âŽ&L껨hJ*Ì/YåäË’½k,°Ã[) ߯¥Q†· ¿oÛ€Ó^½CVÊÃTÑ\UÒû61@Rä° ÈœgVhê"x$7m¿”7SV\,²i/®j-)”,WeìŽZÉ15̸äÞªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª MÃcÈP)ŠhÓh›–y+e«4vP¸n*vq kÄk úe øf H 4ÀÇ …@èX¨.Nc"¡ÂŠr`ƒH' †HH(X `C†+ôe¤C,´i€Ä‚ËdY#@€acæ*¡bÇE . 0=+2dåŒDtÏJ”ìÁ\(ÂGŒº(ØD&ß2sC‰Ÿ2‚‚Æf˜ºA"Æ6Fÿ¡Ýf¥ãþ<*ÒË ›¬ýO]¡p¨X”:ñ¬+S}••Ý€Ú»BŠKR놊¤¤gIÞ ªÑôŒÕÈ;ж) }¡u“ GÿâÀÀ¢×ÿräjhîð¼PôDuÑ BR÷OÀG‚IKWó]Ge½?lq–Á z[Àm%z³E6‹@ÈšƒÍÉO36SB²d„ÞCnsQú2 2éO —º`¡K’[ƒ†["Ú O²Æ §Âu¿É6[¶H‹š÷e-cr ÂM$™t@¦‹•LWssQÆD)瓨 Mz f³¤¢øž/rý &ßT$UÐÉ0Îg‹uC•Q·WÒäô3¢ë^–W|aõû¨Í¹©KY‚ir¿ÔÄÔS2ã“zªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªAP˜…I€ ñ›É9ºa‡˜øI›àÖ˜0…‘‡Ø ™ô¨f„±£Ë†AàfdÁÑX&7–`BGÖ¼%Ü 5¹„G`°j@9¤íèÏ(™MHLñˆTp•-TÌTD·¯4?s5"20s9|IÓ9;71!Óº0cTÐ>CJå˜ñš‹œ.$DL|d†l²e…gÀ@ 2ó\m4°P`ÉÃEšð)…˜³qP4." !-©ªˆáɆ€4¨@psì G3pY4a-˜‚65°¨½ ±‰{ (k …aÿâÂÀ~ÿxTjT÷6HUwL˜Q¬¤#x»ÐÉ%ŸµöÑSAKJÀ(‘ɱ2K•«‡MþUíÉr·ÎòV$uÖÓV&÷‹ñ@‚U¯Ñ`·Ef‘ ¾î[ŒKÛ:'(ÙSM`±F»y”Â}F^VÐD€u¿u$­ÂN†b¬h`— ç}؇šÂùa4P}V i’§Ø‡Ê æN‡Ö—CÔ½»R¥ª¯gÊ]_5‡B†rÇ•±Ãdªôºã¸ú¶D˜¥k ±5IK*´›Œ°«z·+s„¥Z `ÃMlnt9KR¼IŽÝ¸Ú&ZE³¸^“SQLËŽMꪪªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª1pQ0¼J7C€;Ôµ38¯0ÈÒ3˜ 0D ‚ ôn € :aÀ  „&4! Ž‹˜0R ˆÃ@Âf„Öb…hXÔÌ$HÁA‘Rq$¿i@3öbf! ¢ÓE4€”…œD"àãm3Œ€Š <”Xô`$¥Ì2Qð¸áÀ ,'Á¹øø!‘• ‰‰šhpÐq)0P€Q’L~bHA'¥Ê’S¥ƒGÂG‡…Yë¡9S°Í T0`H޽ÌÈEWa¨Ôœ®» PòÔ""ÅlàÀõnyZÌÿâÂÀRáÿzŒnhîò¼%‹ú€¥zÉËvý7ÏjÁ Î’½GRÕÀTÂÂ6Ðdê^;ŒèháœRî…ÒQÍv" ±*Ñ-$, Æ´]…jCo@B€§ñ†zU¦ƒÖµØ>ÒA€1ÖP` maM†Bh—:YB Ò¥ ¨¡@ŒÎh&–5* ®1A5A£%tŠHBƒÀˆÊ*äù ~ `€2á,:l-RÒ _†ÑÐa¼] ¬B r$¯F•Õ %Â*&:b£$<2 ;4¥¬ p €2çí¡ˆ I8˜IFcØ ²YõÞ¦ ¦¢™—›ÕUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU¾ã"ƒLB<©`ËM3'ˆÌÆõš ˆ„ C‚Ì"6ËPɃtÇA1С‰A"‡e¿m€À0¸’Y¬,cÀšÐ¦p³ˆBU# k«Ô J‰™POúª'Dºæ #f•ࢦc(p2î^ …nD†‚#ÆÌ0Ð"’gHD1 q3ËÈ<ˆR|‡/Œ:D0Ç&Z¨p‹lðz‚ r¦ÄøÃðè¨tÀ”Â^øpD4¾1´É^ŠLt“Ž[‹µ°r‘ªð Pq²*ZE4ÀG¥t™­ÂXd|Þh(U¬.ƺ8µF¤më".y0ÿâÂÀsµÿoüfp\ÐàŠrï8̨X†³—h¾ÉʘÌLŒiLU’ù¤à‘Hœ´‹­¥{Æä]á @ LMÉq©\–$É÷Z¨ÿ…·¨¬ó'û-qô$¡”ów Hd™1¾@¼  ¬…cɹ#êÑn¡Á[”Ò@ÁZ$ôö©Â?7ér»™J´C°êS¥:a ê‚ÜÛµùa´®6Elšëuªá£ëSkåumf±™4FP^We ¦ Œ‘NÔ>äN\°˜‚šŠf\rnªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª%Ï/˜ÑAá€p“AFf:j`æ#j«æ\T,š€ãòAÁ¨ààÀSòë­UÈ!$,ÌÊÉ _"r¹k@Œá0$¬ÂK€¹ä| Šh l@¤ rPåCÎBˆ•Dá•R´ICÁ§LP"‚  A`âf P@q“¼4¨D* ˆçz7™Ó ö(x !_˜ †yZ¸4ÑBˆÁƒM0pT;i©'RƒÁÃ!¡þ2è •ƒ  ''cpJ攂©¼Eê1ÀÑ$WŽ!rY `p8ÁsL\d!¡,c€¦A‘2d#¢Á"PØTuÿâÂÀfæÿ| np¡ÜÐrÉ" ½JƒAÁL¨fä¹V6çØ¡z]äÞZ@“fÈ™f@ŒhÂõš8ñˆÀ)BÊ BÀ¨À3Ò ""Ê™Š.ÔVh.#XYîÒ3¹Jñ–ŒŒ”£k»˜ ¤‚AÄF@-v™/Qã™Ûè°1àÀáE Ñä“É1Ã" ³w ËâÈÚ¨”­]0ì…éè §™©’U/•XÂ0BÌAPÆ/Á  bºq‘ù B¥a¨¬Š»®“ UAÂ%Á ´€ÊfhË9扎BU¹w@HL %3¡‘yÞ¦ ¦¢™—›ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª85 $3Ë3BÜ3b}e7ÒÖÈ"\Ô¼Íü˜9±‚€Œ pa„©@Tþ4lųûÙcÅÀŒ£cªDÂ0@ÁS•¹*ƒ-C& :  ºšDƒš/1+Q„‰HTùP§ˆ%å8‘’é•Cš°áP@¢Èû™©®‰PŠ Â¡ÎK±cˤ×$*jDšl ði&:Â-4ç¥1©ímûL”‡´Â]êÙFV‹UP¨j,¡Eî0BäÞo—I† À Ë•EM`ÒÁËGÄ8 _I„ Ô—ÍŽXû@ɶ•¬êJ¬æN†ž° ÅMRÿâÂÀ?Kÿp.Ñ…A„ S L²–"*ŽÌ.I…€G+V$ɃJ®80ÀÌÄÄ01 4$Û$Ìp ¬C€'¹8ÝwÉ¥.ð@@˜è˜ „– 4oæÇÑ7C¼±t»è%†Ó¦NÈf•yz ÿâÂÀµNÿylj`\àÜÜÖ(\¾^EQgK=Én i&•3Wºƒ©8…ꛇ vÑa\'êãÎßµ²èó(š®W"<« ²݈7Á"Þ\ÁpJZ51À~˜ûº–«ÅS#“Ø4Ӣʟ \” V:€¥ŠƒÀ&,_rø²¨@ ŸFÅÂ0ZÕMfÚ»ƾéÁmªZ,x´f”À0`ó/3šö©tÒ=$4ž¤ß=/úâZ´q– °è óS{'冯Þˆ`p@•ÂA¥$Ú6ªˆjÞ•Ä X!ÂÀRÐÄþ/rÕ³Šb j)™qɺªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª AÁæ!‹Å&MTìmW!šAF#ZHG.EB}mhAPãã5ŒT7RTÉAÖØ(}ò`QDE˜! ²à qA®©"š`êFñС`!#2E F˜)#8¨ÄJy 5ˆ,c t¦XÁ„4,M.ÊÐÛA+ bƒ•F@À¬ãdPuh5Q¿Ô’°ãk@È; Ž7”ŽR éF` r¶z…Ñ“i0kÅ: )ÄÉeШ0A‡V@À‹jÖ™  fè°(`5a…P R >c˜:à§Ðkg/½fwÙMXv÷2:ÿâÂÀ‹ßÿ{¤v€œÐÔ‹‡ ¹2($' b@rÔR%£ÌÐRI|“ 9prÓ|H0j?ÍBµ„Bõ4ŠÓývÜüÅC & ‘`eß*‡Là1"<ͧ ¾`H€ˆ˜CePÂH fÉ 2åÉ’O.±¦_Ã.ÀZq¥Ó^³lrŠ{÷³†"Ôôòìj7#`¢‹\´iÈmÈ™hÈ$.`—hfÊ„ YBˆˆ 'J0’U2ŸEbÊÊ—üÒ0£€Ãf`À)¸äÔ¹×¥‡%_þ_µH˜ä ÿðäBÇÌÈ¢Ù†DôÄÔS2ã“zªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª`"g úpš (b2ÑÛ³÷Tž:2kÈ2‡AÐQ‡ÂƒC °0_€PQ‚`PA‰€b(ÀÀÃ×xµ!@¸ ”j ¥ÀI%¡X)„#NQP!¤îYä‚“X‰:ÐK`H³(·Å E@‹­I‚Ù€ƒ˜„V‚Š1fdž%)ˆ BTP˜X˜HP1dn0L±cmDÍ 2ÃËj4»F Ct1aÉ1…Ì9Æ ¨]– EËcáZ¨ÐD¤ã* (±³]á1è“U0€ÃT&ÁÏT¤ Y޹n óº]@áÊ¢8IV.2ø¥àŒIV c'ÿâÂÀÝÓÿzf€CÜЈ`@P§|µ  (te# hºF,@\š,1°C83+FU1ó/ERÑáCµôÐ …Ew,›$feîk Á°Zç`I jO5d‘ ¡-TZ …!ÑîdC"’ödË ˆ¨M¥ Tÿ—ù*­"5Œ©ª— ½¢€L01! á#Ô0¹Ê<<-¡ @m8ˆ:*ƒ&ª‰·D¬Oe^•à­ 8`‘¥ö€bpøX@@  0Ÿîš< Rå`RhjÈI€•E+``6°‹HÎô9ëRCôòÅÓSQLËŽMꪪªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªÚ uH“ê*/ñÁËyÀ‰ƒ )­8]t)6J¨r, ²ÅÌÝÀpQ×í|Åž$J”—¹x¡tㆠyôa Rh"pPƒL¤ðúXÃD2 •‰…V 0ÃË¡…E"Ùfœ[##x¦”<#(b^ða¢ÀÁ€ R IGÂŽ×M•²‘R§ ` ËÔF²ó*I 9D±{_€3,aÔQE–ì½Å.@k˜^òÛ©ÀêM,B Y ã˜å%akT ˆôŸT' $ ˜p &@ƒŒBšt4;5aÀ¨ Uæ’ìÿâÂÀûÿtüjŒßr¥+Å«4…†‹P¸C"ª¥£+9“1°&*ɾ°…ÆmTÍ‹Ð3 cÔHq¨|ð>B4 Ì_P„Ì€U„‚"@A#aã"ƒU5 MÒý£†Š82t2]í,ub …O&43-ªu–Èh ¨H ZÄ€JBK–ÏÚ¤p¢i (`´0SpÂL¡ÌRŒÙ† @Ê›Òí#-vªãѨ’…+j ¹ ŒF:Ì-:D…”ÆÛS(2CûZ˹˜S¯9©©C Dê$ŽV(‘,!삸˜‚šŠf\roUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÂp ÂìÇéÄÐTÅÐäÁÆÂ0 5H@ñÀXÁ±´ƒXaÀ6"Ì P‘ì(ÐY0ÖØç¢´Ð ‰@pS2(0 :Š1+ É€"A!ŒÉ´ª ‚K02!âFÁCŒ€°Ä šHd$@FÈÁ•(4ŒhÉž.g‘`Åò(~%1y™$j‰.À)C¨Þ? FZàªaãab'Èш:oGbæ*ê 4 mºABlˆÄŽI„á $ƒ € B ÁØ€ÙFqYrSøÎhã(±!ŒÖ6”ò LÄÑNà¨:t;ŠA¼Q´™YÿâÂÀ°úÿwtHU”d¾bh{_i^n&!, 0SI³$Ús‰ˆ)¨¦eÇ&ꪪªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª€ `9š5Áרѱš× ÔÜÉH@"†iÆf4±ÃLu†pëª -´¸. ,²–Tô¸æM$aà惲UaŽ¡›øˆàa±õ’%T…H%å„4ˆ‰. „ &ö8¨(xŒ‘3g´’à:9“[ÐBñ ‚Šk•˜¨ Ü96¡…!³U <p_ÅÆ¨ŒÖ#êŒ !§ÂÞEG.ªˆA$2áXBAqÇ&}NMJ©% Hp“D‚ª ‘lânŒ`€¢Ðata„ H2~$Z^¸@¤Z‚‚ƒ.ÿâÂÀŽÂÿvljqTÞ³"äE¬ Tc45ª_õ3Knê>‘á`W+d-ŸÈÑ úî‰S!,·ò6ª¾“y¯5pÈi¯ÊÖA3LÂJ¢é$ ŒŒ£Éj‚°”M@Ih_諺©Ç3 "…ÒPt‘U³ Iv¨ª³w 3 Dà O£;3',PJ?£AÎêb j)™qɽUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÀ€Ýy…€¡`AŠÇÁpài‰b`%qˆÄ·éôaÔ)’â@Ò!`i¦,02a €×ì:ô¶nLÄBm(Íz@TVfÆ‚¬X0p‹þ¶PZg@øèÒˆ ac©»¥^¡ÄpFð‰Ò‹K‘MÐìl‰'*2 Uí$²6‹8èBàÒô˜xFŒY’Í„Ka¨òw°%“¥ÕQ‹lõá!Eˆ³¦Æ°PÐ*¥¬É¬—ùP`Δ ˜ºT9f©ƒ>%¨_¿TÊ*Bp‘gƒé"œŠÚª ÒŸJRÓ;é%^Ìcß¶)và(šF²æÿâÂÀ‹Ðÿnljytæ²¼¼¤œ¬×Ù4ÃG%¢™q5òìù:³[\ê ¯Ö²`u@±ÚŠ6¸HôÜXÜ“HJPgy}51@ÉŽŸˆ.W¡“930ÅRµLÌSK‚`Œ ŒÈ ðAF: j†ÃÅV£©"L# RK*¡‰„’ÛŽ!·Í¢ÝNG½+ËäÛ©« }S½Q¡¶h™E¿H:¡0LblZ0ÙÇäBwŇZ³*Ý ¯×Z7yÂL&Lã¸Êå@¥=.êb j)™qɺªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª€.Ke`¦HàqSCD ý{Qñ§ia«¾rh86È–I‘2Dˆ¤ ,ÊFÖá Äá4,ähìá™Ð÷X·!2–v[¡a Rq‚3çý9“9g&šïQÁcte})aÑ8 ËÄt!&`ÝŽK tˆš5ãòDDhIzZÌJFÐò‰/ûp_͸`P‚O«€q2blå _{@*£K²ü! ãKF ËÔqäEZ)f’*p Øfi••;adèMC°dšÜA ‘n‡5µ elEC„‘ÈŠƒ²b¾ zªìņ!RéKÆlÿâÂÀ ÕÿjŒ^|^Öժ͢YHŸiÀ—‘öv¦Kq›=nâ" °Ä·ë+]/EJÀëˆ@7½æ"zt©Jj:¢#Œ„]¨Ú\âß³”…A2â]¡M‚ õŠ„\¬eXVR„æW.Â{6Тۣ«xÏž4;—¶òUTµaYû¼*o»­vc¨ÊÓJÄÆÒ%©«Ê…¥Å[i°³[x‰©»Nð› Д3ƒIÎp0ÕÕö €¢æîLQ Y“#U1 £s0ag#0±Ó€02bƒ °¡°:LœH×Ê XLÆ ˜~L ƒÆŠu€áä¨@3 7u3Š2tÏ®3ÑÃ!>3ôóD5ö£ZEX§8Ä¡is*ì;ðs3ø06óͧ4rP ñÊ<Œ¡@BN`Á(”PF8$g¥að@à0@àqޏ2| ¹Š “ +õºÕÙ…ÅĈ ÿâÂÀFþÿ{TfT÷6`„ À€RF2õ<à‘âû…@4µa,„¿iÎ)$pIï”p?–t eán/Ú«™É]­ì7f~™°,½U’óPrÂRe2”)‘ª•y;êlŸl¹!U®ÏñmcïúÕ¦Z'9Oó\h/›C´­k  J Ö™Ì 8ÅõV :u8ò˜ðH—+9u^™s:`Œe±­5+L•êëÅ3fôåFý…±Xq82V«rpá.ì HŒµéU ŒÌ[kÉè¦e $¹(â»_FšËDˆ}Œ-f·\äOa®Šq®Ê9|enÆi¦“SQLËŽMÕUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUYÀ.˜„Y‹ ü™•Ô‰œa.ù†ù÷·gâ-äJeóé³S`k(Õ3T£~—1 ™ŽÜŒŸILilêÊÅ„ÁÌú8Z†J"kzæ \ŠF"dmáȨM3 bÁ)™ ]ÀÀHlD*Jo¦"s'L3!C)4Ç"Ї D€p¸ÂÈ}@ÐAƒŒÇµŒ¤ôÀF•´ÛúÍh\„L1àßH$§ÁÆ4PeW§¤8b2ãc*í0¡$³@2@;*s°ð íG ˜9½ ?‰˜Øp²h 4R¾@€¢°Ã!à³R ÞfCèøJ*Ђӆâ3ÿâÂÀª’ÿw^P÷6%@ŠÔ:·a–‚ÕÔm装܉ôh‡íJÓX2»%Å|Ô’˜¿¯ì# È Q×é*ÁÀQbì¥Z–&üþEœ¦ù­&“'`¬UìjìEÚr™Êßu]Gu>aÁ{a÷u>ïú⦆*Á1ºUk‚U¢d.X(&òi;ë)šÀð ü‡rðˆAÁŽ+Ò‹ê£/b=*yrêXgm.V«ŠÍv¾Ð—-¦dëU« Jd.*pD“™°(›¢ð7]†ÝM_F0Гù¯·Þaîˆ9ÉàÆ˜š^Ë[W·)ª£SQLËŽMÕUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU†pV˜-„‘tGê“Q€Ø™˜>“q?˜_Á€(2AHXŠÑ´ ÂÌhÌýÓ þ ‰§¾ €tt4;0bC1Mª4°êò!)¬€˜(Y}ßI3U32“¡â° k11xŒ`$X&f † ]ÀH¨ º†pÂ,Xa!`P@…1é\B Å”F eæO*¨(BJÍ œ3l ˆŒ*0²Èà@sBÀÂs „Žá^ÀÓ†R…¦2hDZ“Š%€°hH>i〒|8!‰‚¦I„¬ÿâÂÀüƒÿv4fTöø|×iA`æ¼Ïó0Pôêdô²Qj5q’;¨ ™+Ì@rc ʆ285æ5OT\Ekp™2—Ü9$o v´àº1(=£°~óRÀTIر}U½OIܘÛêªÔ²ø„}Ñ{Ýjgö:øC² D¢ YŠ’:·ž[‹M¨?o,þ‹*h¼ñÂds²¤Îd’vÑ–¿RQÅ›G.rᩆš¾ÕЬ7)—>¯+·y©vºÄ& Θ]ÈiÓ‰Gú)«ÄÔħ3Rv…Hö?/¼¦3™É15̸äÝUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUŒý LYÇrÌX+Œ­ ÌùŽÎ< V0Ì? EÌA(Om À"‚“ÓGã‹ãO„ÓƒƒÓ„0p,`h,aÐ_£q lÅ€ƒ:¦ABaƒGa±D؈‚Þ*s @QÒ™ŸÇÁ ‘æ™ HN( ‚€#†I†&h‹ E‰ÂCÑÐèàXŽB ˜("aèÉÔ|f`°IŒ†…g±PÁ¸—Â@P0((ÅÅ#1˜Uˆ,2`Â!ã;´Vl0 Ÿƒ¡Às3\@hS( $P8@)¡ÖÃ"z° †‚&%64¯Re“+“ÕÿâÂÀqÜÿz,bP]à¾úØi* ¼—rxf ¿ÝÖXô@7ˆAÉÔÎ:îÚz¸E–ô`4 –AÒ÷\´¨R¾L$ †#Ò(WP\ à»í,ˆ&uàfJ¥ }Ô‡Ö«Âñ·Fýž3Vê$wÖSp°ÔÀÁÔÀ¤ÉG¤jKžOWõÄx\6Bì§²˜S–ž $å«Ç*äí~\Ì»ŠÒšSÍFÐú$mu¬f~µß»—i#°·~¨ÓÍcH88Ð4¸HÁeÚ/4ÉŒb¡U‚€Ì@ÿâÂÀ_ÿydv„›Ð qaà!@`¤äÈ™9­Q¨„8¿ÓA^@ŽÜú Ÿ†ÒoR3@‘3L¹ ‚ÁBãË@,†T0@P°s1œ?2ÃÅ„!̰xÏ‚01 ° Pì°‰*Ââʇ ð¦Ú+À)cLUvNû¿}O…+dèç?)²óB4Ň=§AÁÐ ±S6Ä‘Fà W¤ fìäÿð¸5 F¡¤@…ü%Â¥Þ@@äÄÔS2ã“zªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª1±Ã×K=Å¡©Óx‰a¿ “"+1½›³œ2@b$Æ&,Œ"C#†IQÂ< ‚Ø‘Rí5iåæ<ªÆ1äi„.bŠp( Œ^àaQщÒU8

    ]P!0ài$I2Õê½-p@©laC\&D:¨aQ@ŒOˆÂ_3¦Œ`Ë"€è³ ´Â *3LYư 2$—‘Fž¡¹E›(ÑÄùbéÓ}y6‘” K§ÝY‰@/êjŒƒˆ(P`;T0"„ …˜pp$¤*Õ@qrÌ Ê\[âß<­Ù5”¹P@dNK]R! Ð Ó ˜DDÅ]M8µSP¨öž2ÌsG¦ ¦¢™—›ÕUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU3€pÂFS[tM”R5¢tѰ£’ó#šŒ aŸ™ì<½0èHۤ 13ñè9˜z„`FÔn5ÛË´†FD¨ÁC+zYP±ÊeAá™Õˆ—ÌÌÂ< <ÃG?”¶àÔp0ÐbbÁ`+dYŠ˜Â,!(“èl¼…Ú%ŠD, IP¸ƒN5P͆PS³,ÌÊD ³HÞtg)!$ âGdH0‰±„ ÃNPº&€CÀ郮'Z¼¦4¢x*¨x²1¦ ÄÒp„Sý3šET–)¢ *†ã¨h‘­h a®ëæ`¨W¨`5ÿâÂÀ3°ÿ|„n\æ²¼HŠX@-`¸•)¤’àèÍ£%ƒÓ)…®”"5€ÀÑ”åå’r’Ò¦ÓC0Ï"Œ!F ¸4!`4Us %¤Ž(Ô˜ •#˜¢¡a+‘]"SÔµ /0 (*`¼rÄZsc“xBó…W¤8¡d‘v`7D3„¾H§}<’®’ÊŽDBkE&DªB"3wX¥(Eeð kªæ”]ä8¤k [EËVjˆc©<†¯ê¥êF&02!G·Ì^bÆ1?¿1‚oC&±‡J‡IÇ É“LºKüLAME3.97UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU1  昦5¨&J æRÙf}Æ3†/…&€àP˜×³tÃ’ † Æg¦ èT`P 6(Œ L%C€3FP¡”5š(8lt/I̘ˆ -/èÀÁ$q‰™ƒ…Ž @J-?Q¢¡ÆŒ&i $@@ `p:cI©¡ (tˆTĉ (yCŽÁÈC­;ÒÓ +-a†8Ìœl¼F*€3=5‚ DÐ 0Â$U“¸Ì,P¤•ŒIAäqoœ£)F†‚Y`€‹ž·QNÝë‹}pÀÑUʤɂÿâÂÀëYÿy j`]ØÔV`})Šk*6á5ÔÀ”¿(4Ý"‰>ÊÖ@Œ5ÚõU²dBá…牸‰ ØYC¬û¦d}·Ķ—\ý47eÝT …æÚÀÄ¢À-Ù™S\RÔÈ9O e€ä¤Ê/sp„1öB`ãC˜0l0ÄÅSa*Y¨„EØ‹º­q¹ñWéùsA€jR¼ÆŸ¨9B—´ȹLqk>+•ñZ^ÓÝn¸bB(<ùE%®»ÚîƒAC 4r cªeAƒ+ÕÓ†³Ù.f꘨ ZÑn¦ ¦¢™—›ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª0h12q0> ¦W•†`‡!„ðXa[&! ‡gB±…q„‚±ŽÅq‹ÀQ„¹Š„雈°§©¡:’¦9PÙƒe‡.Ò Iö4T¸ yML°#  Ì--ð†|´9¢€“›äb‚ MòqSLðü”:^! 5Å5HâdlAࢶMQSÈÓ¢ 4\" ¦;й«t Ú3YÁ§:!îeìÀãÀ%¤Hcøi»P4É­Ù})JÀ²lµlœÄ 1A$&`P1¦:r2|Ï£R`£ŽNGaÙèŒ;Êesèª ÿâÀÀhN Ê”$B`M€W‚"aˆ3WO+³ãïARO•_‘Óî]-Ÿ…¶-A#dÔ , aEKö ‘Y'µò¨#E’·G—0 9>ŠT#  F~’eP* ¢ÊÌ ¸Œa`\“$lF%-•¤käw‹Pª€P®Jk¨dB„îLip)è‚eàá#¦ F™áq!@*rd‰™0#@K²›J¦/î̈¢öŒBr|–°)” –!ð{b¦CHÒ `!$ÆŽmMš¥ àÐÒyÿâÂÀÞÖÿzTj|Þt¸9Ùà„1Ò@Å\™Â!ƒ×J›Á/ê˜ ‡LÂã„%.z:™p$2‘z„0eº.A |2dŒUØ®‡FPd@É€KAŒ /:Õ"ÁMZãx i9#\% 8`™ )@É“€ :!v5úzAÁ"ŸÉp8QsŒYd;Fð¨¥f% ˆ$8e#˜’…?x.(ÀŠ2@ÓXÄ Z”¨á…aE"Zn”#ˆíÂ8±I S`!ðâ®1oÅ€1Ã.µTcd& »4 åôHŠ[AöSQLËŽMꪪªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªR0ÒpC.cL6C2“ÌÑ “ â2L³‡LÚdnȨä HK›-€‚F%–`ÀE&¨%"!¦(H±s<¹&@º«‚Ž*˜83’L¥Eý‚¥×)`Hy1@ײküÖK5'ƒƒ’‹k.âÊ&:` ˜Á`8™)ƒ pðt Aô+`f8P@Q–ë 2˜Éº9ƒI :db’Ћ o˜iô\] ¡F ‘lå@€k°,\Ì 2ÒÔ§HCíœÇ1@Ì’ŠµËl€s0rà†ChJ  fZêAÀ,¼ гËN™£¢–M ”*J‹‰ÿâÂÀónÿynlæ²Ü à@D ÅÞD;‚.ñ†"I6Â¥ÉѪ tEÉ%`8'‡aØIŒ¨s©˜Z‰‚„ËÄ‚‡Q5]2âç!’c—½*Y²õ.pµK… T LbÈ á¨iÎ`ÐG Ȧ p7âºSàYò—NR)žŒB58_çi&Ñ¥kÅ+–xà"‚‚ŒƒÚ #ÐPö¡ÝöO`©*Ú_ÔmBz^º®ÓD• f¨4²*—̶«r(ã²U"J˜9иeLÂåŠ/0™DÝ ×€‡®dÐXÓ`ˆWõ/SQLËŽMꪪªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª1ðd0˜lØsˆœÎt<.–0€|€Ó$|1@XxF`!Ñ‰Ìæ)Ÿ°” CÁ3p…öb$¦Ž ¯J¦êB"†a‚€©n™ˆ* ‘L±I—P8ññ(M–&`à¥dÂ@ÐÎeΤAF`Ä*¬c f¦n4‚,`@æ2šp©f  =t2²$ÀbÑ3b]Œ‰ rœ Ó Ab‚™]˜=G]¼ 0L¿AÀÍ"S"H9 Ž†QvBÀ Â4õ8rÂ$™³Šqˆ‰)U<Àè{ßBlë0HûÐçD }‚ŸáÿâÂÀ4zÿyŒfdæô¸!Q À1ÁR‘Y7SÔaj,—Nº 3Åhn »i •Ý—²M§â_—Uj§*H)c޽–až^~…êa@¥ `¤µ-ÛDÖ¶­ ”²­}Ë”?k¹ÌS7>:­Š‘+tXxs<‰B› 0DyI*ÏL „ ·ãI Ηô•iÅ!࡚ƆÔÙL!Ô\C„.h(€ƒÁ §m‚‘Ùv‰«––€vÇ l)øHvuWNÜp¹àâÀ€A‘}K ÌC±"úŠY!Tj2 ŠÎ.W—& ¦¢™—›ÕUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU 0Pc0˜``2¬i(ÔTƒ Ì­#L Ì‚Í'.Lï (' LkÌß Œ$@H5BPŃ™)˜eÐŒ(tÀÊŠR4#81ÇÙ„d@và R(¼äÉÆ>H°q°jJÕ€„ ƒŒTª058Åæ0%ÛxÇJ iþaPg–€ ‚â8&$nVŸ`at ¸´YY¤ªŽI$‰@šLVtni0* CSÌ:0°ŒUp@,Ëó\ÀRë;ZÀà ( ‚À C.T)D!cÿâÂÀ@­ÿyTj`îø¼Ž9”Ãí9{‚‚ÁÀ¢Û³IòøAQ%°0J8 eìåü±VM/mç’‰´qå”/*èS"B÷¢5Õ[¬©ÉZ,%’º®²P:+ÙKXa€@Ðs±­TVæX…PÒ|-—ý¸¤òä3¢÷.e0KøšC'Ú2“K~“0ùdRê8†X °öe [•Ìù³')¿…¬•bˆ»Ne–XgÉ‘¸¥æ/í€d(9Q’ ¤â6шû2dI÷aªÒí¥+Œ± P” ".8Íur¤P° Æ.Ò‡(ân êt»Žp^.´çSQLËŽMÕUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU ‹N‡hIˆO‰¢°å3ÙñþéõýɘÁÁÏyښɒ”צa•L)§‡Y‡B„ÃA’&ñŤ)!á’ ¹‚ Ù„A]\ÈŒ„èx¬ `N†b,`i&@fÃAæ( = ¸ð(¬ô(:! ND¶Á„Á&rò 00cI0às2S 0c0 “ /0d .pàÈ4]NÌ,U,‹Â! nižc(Ȩ>2’09b à DÏ<‰o*ÀËø`„ÆPS/_@`@±à`ŠÌ3!#}€;x)á‡ÖjKHæ'ŒcÀHÿâÂÀÐÍÿyìj\îôÜØECTÉ‚fÆ81k–ÁD…ç q£ƒ”*O§íU€Ä^UÒ# ]&D_ À«Y$ ]I%Î8W»ÔÑ 5¨µ@S¾ú»*ÌÄ•2iÎÊ™rËe;nÌϳ®• 01e‘·ù÷…8q…‡]®ã°©œ¨ÞÚ…¿ú€¯0€Œ˜,… ƒI‰¤di²fjÑÓbs´~Ó€–„6ú*wý늽² 3µljwCM/oŸÕ× ÀBa˜"tAV ë3u(éŸV´ í™épb¼$U±¦LÌ™t3;Šb j)™qɺªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªD²L „fi„·9†NQ³¥‘«¬ÒY’è9HÞÁÀ%ª20 ij;•Æ&|5N‚\a>ËlT ÀÒÃÀWèP6ÒˆY0h![Ë2ÒUã3x <*«:££ƒ)Y¢2ï2¸2ÉO¶ƒÒ§Y†¹(d+åÚ6JF$Ê… à LËH•Ò`¥ŽHs51´M åƒ1 ¸U(`Ø Ì Ru²Ãâ"¢YV@TQ0¡"á§1 ‚E^·U»,Vk®i $º -¬!p¦èX Ï DV‹ÂÃ)HA2™*ì+`-y¶0!ƒ,Ò}(šUÏÿâÂÀ…¤ÿkLfp.îô,%ixS‘·ëmZã§u4—ZíZ¬14Óµ¤0$yGL¦ÉD•ãšz:#ʧ³NX&¤O›„_„‰-˜\R8¡ú:²²æ)L­ä‹ªÄeoŠêˆ@̦ AEVõÔê3­0.¼+¹†¬tŒ•«¥Èšj™sµÔÉwÞc.~Ô‚þCéôWLqU鄼ÔÑ(ËȢ頪KŸ7J–›Ñ)Úî•$ýŠYúù& ¦¢™—›ÕUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUŒ: L <úŽUŒ  ÌuLN Œ!“5ŒÌ;€BŠ‘i(XÐăw€Aê§bŽ¥$¶E¢sð”á’Ñ¡ Í„0ñ cP0i…‘#XYÄFðeæR¶—ZS˜BŽ[ MGU ;PUv2t·é0°)ޝ ¥x›¥`Ù V¢ë<ë¤LÎ!j®´xÐãO5f ŒÛÇ%Óž;›È€Â/•œf—%™~Y¥·fŠž­I² dàaé‚€qJÑ} )„ï½. \Aäwùw£d;²$Íp¬¾¢B¬†¾_Èuý“ÿâÂÀªÿs\jpî²üCܸõ¾jä¶Ä)–m F†êR–ŽbC 0´i=fHHö´05Øì¹jI°™M!¢ÉZ)ð]µL]Œe’•G#QGL}EÃ.@ŠÆÇ°´c±hB‰—ÀÝYÕØ»®ã 3Ã`¨„`”eD’ 2pàh& €!‚ˆvÒ'‹B_æÈšÁʨJ{4áãPJcL(U‚ ¢¢³à¸ $ÍË‚{Ï¿sj¢…µI7b (Ì„g¡ãbó‰ˆ)¨¦eÇ&ꪪªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª ‡Ø’,xp–9„&˜*4dZaÁkæùÆb± €À°(À,Á%³”8ÂA‘a#$ŒR/š)Ž W¹… <("…mÊÂÄ­.x¨à0) ©¨:"§¨Ð±Û QuUŒü@q° þˆ#a“°çÕj¼‰´b A5r÷ K±6Èô· €2î:ÆÔ 8ˆÄÌĈV `hàq+Øêù [ËÔР“¥Œ­Jú,Ú )9Ì(DÃÄ€T]Þ/84È2 Žùoµ‚Ü–í™»]MS’Ê›ì¶Ä…˜k¸èà’Ìö5§¥‚Á ™þ}£+¨&rè´ÿâÀÀêÈÿrDfp­\ØL¨“4¸*pë‡ÀŠœ c!„ 0 µ­dd>U$o ¯„õA……(1…€‚•UâLik9nŒ½+QÅe €Ø‚µ@eÉ_E®I˜|x%x¨L0Ë—aé„ü°, .@*‹<È4ÌÕ¥¬ªªšÀ±7%³™I5i>à-ĺm§Q˜¨fæ¹B˜‡€S¬i/&”Ð¿Ž¤µÉ÷jV•éh€À€H}+Ëp^ƒ\ð g•†:"Ê“ja,k²³ÈÊ(È <±ÙKRöR7D6 p¡ñ’ ß‘eHI ”ÅuÆEr“"¤ ÐL°‚®\†>ºÚBføQ(ÑA’èɰLßÿ7O\ƒ,4Ž 8˜‚šŠf\roUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU›Ÿs¦èÄŽ8Èü˜`B¯hCúöœ„€†qŒ²r„‘m˼ÈàUe¹LDÈ]‚ç ” ¨ BHâþ ]·dhŠ„ÕP¶ˆ6“˜­hLóy¡Ú5‡.äiéaÒ´A”­Tš®ô> m¬C¦S­P¹Hb¹¼òÿ €µ¨Û¦¢pÚRM–Ä „M%¤!#c.{$/rÙ$•5".Ò–ÄEˆ¹H>Ì<½Hr8ÀÙo•T¸~˜.ü6ŠIšð¨©CÊa„¤‰{½§s$2t¹mm7^ĉY!BšË‘ùsÊ€ÆP(ÀYØSD% †ÀÿâÂÀËãÿfj•·ÙÀGè½£^iâ0ù:š|¡B8Õn¨vSgÚýUv —Ȃአʪ¯ð¿ÊÄ,an®a Œ U À,fZÑ”ò˜½Ó.œ{Ø»ceͪ"*b-牑OFäÍÁaQå@U ¤Ý×ËzëG¥ë¥½`Y×ËYÃ/˶¦¤žÔ©°Ã¢Á‚˜šq?®s;Gr#Îäb÷SQLËŽMÕUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2`HÃsCFLåF›®Fxêæ=LJ0q3 T9»@ó$É0GCŠ$Í‘p@Á†C‚&(„€±³M0Y‰‹µ±ª¨LÂÂ(„;ÆÔV+Š’J¹i0´qÔ¨‹.J)2%NÓa—È‚@³*XdŽFa¡jäd vvDFL …¬›©îò@ ¶/¦ ¦¢™—›ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª"ÌŒ08hBÔ –9rèꥳC•L€$:j00’ËL@2@Ũ­à«M8€¤#.‹ˆÚ@*`á&¾iB@Á0PÉ ›€ ¡} ® '4àã~Àªp`©&P<×Ràh,”è8úN4>ìÀæ4S …šPÚ^®@à’ñC p(#èHfÂ`'t§R÷ƒœ•XB\Tõ‚%ÚZ«¤™3€†&„:. 0ñS#(y’@yUÈ0õóNMÉK„ÒÆ¤¼0H”¼¥üUÄ‹‹<°mÜ&bãPãeŒlÑC6SËÿâÂÀbÈÿz”j`#\Ø €cYC%H—T 4Jë¹Ï€hÄ ˜.û©0Ák>eðRîO¨ v<ÊE¹Ì5Pˆ1WcqnªZ`€ wHÀ€T¸„D·Î¶Ê]ZP‚äm/”mÑLÕÍ6ý¡Hè¨ ‚‚ ú i²S/º†˜ @ñ P iXÃÈBE¶-À:ZDÓmRµš«Xk舌e£§¨$8„ûup$† ˜O;}Ô›fXð:¼~ V@€¢‚öQykDˆ¾ª”ÂBÁ‚C*Ðá·vYæÈˆ¬´¡Á€ÔYãBV÷¯SQLËŽMꪪªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª0@$ 0é”ey´b8J`˜`02`PXgȪiP„hÌX<,C†£DFcÅ s §Å9 –(c   µ§p°Lj!„¦!X›åæ"ì9 À#†Ý °qZðÉ 4¦Í(S»HBàS… ³(2˜–œÊ2Ê ånôFxÙ9–dRŠˆ‡v*È]“(çÏ=wN8sˆhÃQìÇÍ<¾ Ë (Bè£kX™MÊ·t„ºZ^áéÃÈ…¤éFhC¤y½^$8Å•bPšaiF”1Åh*™cÑ×ñîžv[„>ûFèÿâÂÀÿÿ},v|Ð !C‚l0tà‹TÈ4H €ñªFlx©ÃFL–  Ê4¡ ¸Á¥@Æ5¥’·ºìb16ÿ^šÍƲŽoyˆAS€’‹3bÍPbÀPàæ@Iœl…AD&(:gÕ“5 ÄmˆŒÁ“ ˜èÕ‡kÊ)™t}öŽÐÆ,Ò¿5»Rº+n;ÈὩ 0ÄAö‡‡ÅġצÁ˜— Æ£,Ð)H4 &^²bˆdØ ñíGD¡¥RaÅ‘T1„øIH51¯ ·ëº–¡šŸþ\ècfñ˜`ÁÇZ³€ó,:ÑTp†4èva¨&SFN`Â&8\X$ òE&•è&D\£8pdƒSæ0$ ´ºaÊ™šŒMËÔ^£1"B¬–‚!"Fäƒ3âIÆ,Aš¦K¤´AÇÒ> ÍÂÀÀȧ‚Zöð1ª]&ÂUÅÔý’€/…â4 0ÛDpLAME3.97UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU€Ä0 5•Ç<©£402 ^0è H“‚3S€“Báà( DA0T 1(M‡T<’x C, [JÍEE/j U„…„¡ÕíÒÄT1b°Âž½Ò.!’J- Œ.h¸(–œ‰4í}dÎ`2:–!9‚ü‡šc .AŠÑ Œ,YGÍÌóÞ#ó µ&±âÚ‡Ó« $hã)É¢Ù| Œº£/Ô9“oÎÅ Ø"úBóšpé@¢¢\0À ,TClã™XFW ´…„à ç }TpÚPÀ–"”X[ÿâÂÀ›eÿwnt îpþ)ÁÓy"Ûc¨Qxah2€²´‰Eo9D`H¬¥¥C²õf{c¥‘vCAN(õø†8¦yŠk ˆ(Þ‡#I!fÌðT’íËšXƒ"#CLÄãJ´¦º£iœ©t6 „)‡€ˆ# !€ÎqUâÙZk ÀL§[.¸"b4¼],•*SBÛ€€‘<,S)‚ÏR(üBåDí,uÈ"ÔÁŸ *,X} “, U.4±MŽèF‡@B4ƒ('ŠKœ0á„-ñ…D2$6±(äïSQLËŽMÕUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU0L &ãPf€f$ƒ†DŒgX"fK#FÊÔ`£¦ ,4ˆ2 ‰@¤ÉÓ§ R‡ÞDОø™ðµ†VÂ!ÅÆ  IÊš 0ÑCÀÂF,qœRmJ)q44 7j@P†ÁK¸é–$:(Å-¹¶$ˆH°²ã ²æ`3 x…à ‚C„A2†R!ñV$" ›Â“!y—(Ò2ÂN òó .‚˜Ò1aCˆ‡€ŽaBH6Æ\)Š@]â¨ô >è€bÒ JÆD [RÕ˜ J"ÛÕ Dˆ0×0!M@ô$ €ÿâÂÀæNÿytjpîô,*LaŠrJ —Šlh0A8ú¶Ûhò2…C"xÀ2ñÀIœbŽ €j%vÔ¬h`àé²ÙÁ@(ŽZÕØÀAF¢~7Æ(YˆD}ÚL@9ÀÂi Œ(<$â(Ò[LAME3.97ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª.˜`j±¾Õp)±ðd¸ë,Îä’ABþ5Ñ}vAQ$ÈŒL3*ÃCÂvt2DZ$`P8ˆ q´g/Vs44¬xT¸±E ¡Š[ybãM–>£Í•È€2F•HŒ„5dÁ%Éš™ BÈݳJ˜(€Ë'@y‚2³…Ê™‹!0 (a† ˆ.žqF ËF¤ºz’P$ª†ŽŠ j:TÃ!&±Ã”¨bN/v” g"*OÂá/*¬(·€&€¦ÞZŒZÀÍ놋7…=Žª<°¹€©ÂÏ#qŠÈQP…¯O˜°DD1”ꙄÿâÂÀÞ ÿy\jhæ²Ü‚¨ 0p0Íi9“ƒŽ1JW§ÙrØ¢[˜ ”‹“*:b)›Ö¬¥ž"ÓiÓ`V*<@óATÜ¡¡Æ" L:=DˆH@‰çÔàz„²NEEaBÈHND9š¨§A&cŠä<À€õ!²i„\¾À‹gÊÊa¯¡t_ÁP’¬EÚ ŠÓŒãQÅ´ê_©×vƒš/’±DG€¸ÒzdpPâCð§`k ¡Ò‹IÓ(R##–LaQåÄQCÌ6üz¢W&À§Mõ“J˜Å,µñ[Ɉ)¨¦eÇ&õUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2lÃã*¬ Z80€Ù:“AŒpªM`hÃàa/r€p…Bê@:0˜$ÂAà9Œ…À¡6F‰å˾y# !$.j͉ ' &Z@â­Ì!‘%Ð`çj,‚ƒ@šQ‡ì%h¹Íj#—L‘ ‚6m%yŽ,|Z‚0©X<šØFµœP|ÈP˜<T™ÀÊ%5åLŠÆ!œ>ÌÓÀHˆˆ!aƒ¯‹\Þ#!dd ëI1 а1õœÊœLÅš ­Ã@˜Á C &#¾2YlTÖ‹@z  –0"+<8@PP9BâB( ‰Õ,H a‹¥6fq#„C‚¡LƒÃLÕî*ú*€“H„•,UìtØ3©‚dг²`Ìܾ†@hñc ‰$½MŒ¡Á†¨1†kÁ ZãSÀÅ+-1¦"2 Lб@H Qó2`.LzÛPsP 0Fdyã–.€Li…ªÿâÂÀñâÿ|tvlœÐR í Àˆˆ€J˜Á#&ÝLclÄ-„ òa‘+\$¢ a@"ÌÅ:€R‹ŒŠ"Àcc#˜z‘GØy|$@@Åêe ˜ æ¨»3jcÀRµ1SÕµ%TJ’Õ)±¨Œˆ…䪩$’MÙ¥¼‘uTDg@H˜a8 #`VÆ^¨”eÖnl=Ê]EîD³ Ї} Ä"!ÿ§ûêÎæå¾m#Xø GBa„<<2—! 5(PØÉ•EC aT]åDJXdl} Ö®‡ÿ€…H‚´5šÆ?üµ«™G]8}15̸äÞªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªÑP<ñ¯xriZG%°ðɨbfÊÆ<á«ppdÙ‡6QɈoÜ©xaÆЊ¼<Ï-7NÓl¢BM©ÎËÎÊN&M¢ÓÅsCœŠLºšS"ï@,©fQEò`H¬ÁŸ"ØA˜@—eäC#c,Ã4¢Ð·®Ó:~£ªb\Ê¢³žˆ®TÅPV"­¥î0È3Ö6Þ8b8^6T3F0Æ0 2‰¬-ÙS>iR^fak>qNtVv^xj|z}nlœ¦æ&Qf@  K"`a \¤ŠT˯O¾« ‰¥þ€bfœh¤h g˜ebŒ °¬££M£Ž£¿#ÿâÂÀ”Êÿqôj8'ÚÈÇY`Y’)§IV!Ws=a© ]ÒÒ—%—7Rꘘ‚˜‚šÉ™ƒ˜B€D1DÐ{IPÅPÜ»™Ó½.« ¹.íw®ËRC"²+&3ûbU—SSCQh a˜”m9KbYÒ—%!“ Ež0B1F2H2H1ÈZQX­v³†pÓ•>ਠP ƒ©Μ¥Ì\##C ã"²Â¥égLBL¢ÀF±ÃDÊFT©—s½.Þ8J]–rÎYÊíXTÅLVuÉ15̸äÞªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªLAME3.97ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªÿâÂÀ™ÿHªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªLAME3.97ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªTAG pygame-1.9.1release/examples/data/fist.bmp0000644000175000017500000001043207300416501020433 0ustar vincentvincentBM6(*K*'3-*3.-82,54.98/950;92<?8>52B;5C=8E76I:5H<9K69R<:QA9EC;KH>MB=QI?PE=ZKAFD@OH@OD@TKBSACZEAYFDYAC]CD]EE]KDZNHZRFUPHWPGZTK]YMZ_QW[S]KFaFI`LKcKKhMNhSLcXNaQNhUPe[QeTRkZTk\XnSOrUTpXWqV[v[YsVZx\\{cVbeZdcZls_eb\si^sc^|^a}l`hpbkxci|inda}jb{tht{lttfxthqv}px‡v~c^€^b€\c„ccƒje‚eh‡mi†cgˆejŒlj‹qh€{o„rlŒupˆ{sgk‘lm’tn‘jqštq•{s“rs›zvœtv¢xv¡ux¤{y¢}z¨{~©Š{ƒ‘†€u”€z•ˆ~—„}œŠ›€w ‚|¤‚~©~€ª‹€†‚Š’…‹”‡’“‰‘Ÿ”¤—›¥˜ž„€£Œ‚¥ƒ‚¬‹„«‡ˆ­‰®‘…¥•‹¬›’¦„„²Š†³ƒˆ³‹ŠµŒŒº“¶š¶‘»™¾”“·›’·–’¼™’¼š¼¢•¡«¡¡—¼¡™¾±¦®¶¨¬¶ª°¸¬±½°´»±¸Á´¶Ãµ¸Åº¿‘À”‘Áš“ž˜Ä—–ȗșʠ—Å¢šÃ¢Ë¢ŸÐ› È¦¤Â¨ Ç¢ Ì«¢Í¬©É³§Ç°§Í°¬Ê¹±Ã¿¸Î¥£Óª¥Õ¬ªÕ§¦Ø¬§Ú¦©Ú¬«Û±­Û¸±Ò»¶Ö´°Þ¸°Þ¸¸Û­®à±¯à³²ã¹´äº¹ã·¶è»¹ëÄ¿ÍþäÀ½îÁ¿ðÍÃÅÍÅÈÓÉÌÉÄÛÍÌÞÒÌÒÑÆÛÚÖØàÛÚÆÅåÏÌäÊÉéÑÎâÚÙæÓÑíÚ×êÞÚéÆÄñÏÎóÓÔôÚ×òרõÜÜôáÞëàßöåàãëæçêåêíéìñîîëêòìëøðîöðïøôóôøööööøø÷ùüüüüüûÆpkfcV=. €úüüüüüüüüüüüüüûÆpkfcV=. €úüüüüüüüüüüüüüü܉lgdU<2!!  üüüüüüüüüüüüüüüí–ni]U:.!! Øüüüüüüüüüüüüüüüö´pidW;/  ÞüüüüüüüüüüüüüüüüÚˆidYF9,, òüüüüüüüüüüüüüüüüÚˆidYF9,, òüüüüüüüüüüüüüüüüã–jgdW;-- )øüüüüüüüüüüüüüüüüôšnid[>55 Hüüüüüüüüüüüüüüüüüü»†lidU::, NüüüüüüüüüüüüüüüüüüâondW<<- QüüüüüüüüüüüüüüüüüüâondW<<- Qüüüüüüüüüüüüüüüüüüö˜†ndU::- Rüüüüüüüüüüüüüüüüüüú¸miW<<- RüüüüüüüüüüüüüüüüüüüÙ‘ogY>>5  |üüüüüüüüüüüüüüüüüüüæ˜{i]KK:+  ~üüüüüüüüüüüüüüüüüüüæ˜{i]KK:+  ~üüüüüüüüüüüüüüüüüüüö¶{j]]E/  GùüüüüüüüüüüüüüüüüüüüÇ‘†nggW9+  ¡üüüüüüüüüüüüüüüüüüüíªŽzii]>0  (ðüüüüüüüüüüüüüüüüüüø¶‘nndW6" qüüüüüüüüüüüüüüüüüüø¶‘nndW6" qüüüüüüüüüüüüüüüüüüüÀ¨ŽzzgY:+  ×üüüüüüüüüüüüüüüüüüÊ¨Ž††xeF-  *òüüüüüüüüüüüüüüüüüà¨zjY9!  ~üüüüüüüüüüüüüüüüüå©ŽŽŽ†ygE5  ïüüüüüüüüüüüüüüüüå©ŽŽŽ†ygE5  ïüüüüüüüüüüüüüüüüô³¨ŽŽŽn]<0   ¦üüüüüüüüüüüüüüüü÷¿¬¨¨¨‘†jW<3"  ƒüüüüüüüüüüüüüüüüûž®®­©”†gX<4'"  ~üüüüüüüüüüüüüüüüüÏò²²­«‘n]KC6- |üüüüüüüüüüüüüüüüüÏò²²­«‘n]KC6- |üüüüüüüüüüüüüüüüüßÁ¾¾²¶®«ŽjZLC60   ~üüüüüüüüüüüüüüüüüáÃÃþ¾²­”yeZL740  œüüüüüüüüüüüüüüüüüäÄÁÁ¾¿¾­”†g]XC73&& ÛüüüüüüüüüüüüüüüüüêÌÁÁ¿Ä¿±™‰n`ZLC600" ?øüüüüüüüüüüüüüüüüüêÌÁÁ¿Ä¿±™‰n`ZLC600" ?øüüüüüüüüüüüüüüüüüìÍÄÄÄË¿±ªzj`ZLC33# }üüüüüüüüüüüüüüüüüüîÍËËËË¿±ª‘Žyh`XC33# (ÛùüüüüüüüüüüüüüüüîÍËËÄËÁ±ª”zjg]E66#  MÝüüüüüüüüüüüüüüìÐÍÍ˾±¬©”‡yj]K77#  @øüüüüüüüüüüüüüìÐÍÍ˾±¬©”‡yj]K77#  @øüüüüüüüüüüüüüëÑÐÐÍÄ¿²­ª”zj]K77- ÖüüüüüüüüüüüüüéÑÎÎ̾²®ª©”zx`K77- ‚üüüüüüüüüüüüüèÑÍÍËÅ¿²®©•”†x`K770 $ qüüüüüüüüüüüüüëÑÍÍËž±ª©”ŽneKCC3"BùüüüüüüüüüüüüëÑÍÍËž±ª©”ŽneKCC3"BùüüüüüüüüüüüüêÑÎÎÍÄ¿²±­ªªngY>>3 BùüüüüüüüüüüüüèÔÑÑÎÈ¿²­­ªª”†jdEE2  ¢üüüüüüüüüüüüüèÔÑÑÑÎþ±±®ª•ngXX:" qùüüüüüüüüüüüüüçÑÑÑÑÎľ±¶¶®ª”†nee>0 üüüüüüüüüüüüüüçÑÑÑÑÎľ±¶¶®ª”†nee>0 üüüüüüüüüüüüüûÕÑÏÏÑ̾«˜«¶±¬”ŽzjjW5 rüüüüüüüüüüüüüúÔÎÈÈÉÀ±˜‡‹ž±®ª”‡xx]9 IùüüüüüüüüüüüüõÑÈÀÀ·µ˜‡hhŠž±¯¨Žyy]9 Jüüüüüüüüüüüüü÷ÑÌÀÀ¶«–„eK^w°•nnY5"%¥üüüüüüüüüüüüü÷ÑÌÀÀ¶«–„eK^w°•nnY5"%¥üüüüüüüüüüüüü÷ÎÈÅÅÀºµ’vZDCs—’‡jjX5"%NøüüüüüüüüüüüüüüÓÅ¿¿ª‡eK<-4Ls‰yhhX6'&$?¤üüüüüüüüüüüüüüôÀªªŽvh`L+"^h„…ssXC71&(§üüüüüüüüüüüüüüí··°™‡‡j9 a„‡„„hXD71"Hðüüüüüüüüüüüüüí··°™‡‡j9 a„‡„„hXD71"Hðüüüüüüüüüüüüüüææª‡–¶z832wŽˆˆˆvbLCA'(£üüüüüüüüüüüüüüüüñ¹º¶dTse>‹¾³††ZtaLA4#œüüüüüüüüüüüüüüüüüúâªy“™nTб\\2Db^DA1#£üüüüüüüüüüüüüüüüüüüÚ™ª˜yYs˜nFF-quPLC1%$SóüüüüüüüüüüüüüüüüüüüÚ™ª˜yYs˜nFF-quPLC1%$SóüüüüüüüüüüüüüüüüüüüüÙ™–†dX‰g<<&$Øö¼bLD›Øùüüüüüüüüüüüüüüüüüüüüüüæ°‡jEv]00$?óüüñÛïüüüüüüüüüüüüüüüüüüüüüüüüüüø½Š`aK''$¢üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüôÒŒ_OOŸùüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüôÒŒ_OOŸùüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüøøøüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüpygame-1.9.1release/examples/data/explosion1.gif0000644000175000017500000001456107406772533021606 0ustar vincentvincentGIF89aZZ÷€€€€€€€€€ÀÀÀÀÜÀ¦Êð» ¼#¼,¼=,¼Bº8B¹7NÌÂÉ@>8`G$b öÂÌ hHB2º 7¡…¼à $€<ƒúaK_þÃd°…0ð ?è„RÀ ¼pKœ„EHã9-ÉR¶ P²–"' NÌÅÏ¢.VÁ„Ì \° ¢Á.®n‚XÁh`üPpdp‚PËb¼º%±D¦0Ep¡ pˆ"‘ƒ$0À€ ŒApE‘„ZÜp¹0¼` ëÈ*t m„B#BF¬¡‚(à #HA1œ…LÁ0.ÊÍ$q3£‰.¨ Àb–`ƒò‘Ü@‰…;ã `ÅdCáˆFv,@F ÁÄaxBâ!hÈâ 0Áx@‚DMC.°‚'(Æ’X…#(j‰}Šc¸ Æ/þbT DÁ@s‹hhÃÝД“±‰Eà s°#A%¤ð!ƒ ¶…D! ØÀ¾dÜ ˜€2q _ðÀ %ØÄ׆·O2H‚Y°ø†8h‡”IaJ:±[Hã¾èÄ9j± \D泺)\$ð¦…M¸ÁØ(B ²àIOQ &ˆB šýD¡ÝxR ‚&) €€B&ü0‰=l¢¯¨.¢d¸pE(”Ñ _@#Ú@*¶A 9dA—xEíÜàˆ@d" Cƒ ¢0‚ÅÇ b8^€ 0À@ /( NŠ[tã 8ÁþA—iÌaï vD8Pñ S¬#"èÔ!ç_<ã˸…/žÑl`çŒ)¤31= | L·P€k€ \0EtH…Ú% _À¹s p›ð À™@ÚàÐp›L` Ádr ·Ðß·0 ›ð â°e²—¯ð ¯À VâüW " >àRd€bÀ°· ,Z@—ƒˆðð«  µà ê`5¨ù°0 á` Æg§` ³ €g Úp Ðà á O °- |%Ð# þ% -D&8   gmˆT€ gPDC× .ÕÐ àð 5… JÐ ¯§p Ï€”pf¯°ƒBàr kPQà(pðɧ ²àù°Èðp(-€‰à  §Xs9n  ›ðrÏP Õ0¡ Ó@ ×  3‡Y1 ™×€ ÞàßÔR \P Mð#ðÝ€Ðih)ȰeMi9(€X0 iP;íAaâ ¥ ›Ða$Ñ¿ð w ·P ‚0)í  ³€—ÐM UZ& ÐþŠñ øÖB &6ð`M¹P.‰%L∠J€ Õ` í€ Ê‡„vñ ›€ ÚP/¸@ ´à á€3ðJã,¸ 2 (R0‰‘#S”X•üò 2À“¹ã•À-Ž žT+Î p6 p ÝŽ0›` հаa —p »c `’ )B'V b@ ùð†0dˆq Oà^|rÐŒ° ˜0]wâ ¸ ÇÐ ‰p ¡pñ ]€ ÜP Õp ¬° ßÀ ‡ (ްE[28¯ ’(€Váþ  á@döç–pÊpb-€ X€’ðP(@³•W™LPn{0z”¡06¡À ±¨` “šR—“EPb c‹0’\*ÐÀé X%N€ fYZ)@XX@DªC ì! –à Ë@ wð Ðð Ô'† f Ü âà °À  €…à T¢;YD cà`P,À À0‰à–*}p/1àbƒà˜ Æ?4¦´€&Ûp¶P9íp &7ÝÀœÔá ¬p ™òF #U0]f1“°\€- [à;' * þ 0^rð¨@ Ý :v(0"›{°ð áÐ­ð  ¬À Òð µx£ŽDºó man‘$_ ÌÀ  *!Ðl;P 4pLÚ¯€ Ö`%‚à|à % §  Ðzë°×Q`§°n R ?£:Ä’E¹)PÒ@‰ÐȰ¿Ð %_$Zp4+Aõ]6#¹¯0 áÀ/Sg¸ Í vN™‘¥€ H!™Ð t°OÀC“ £ Zž½(7pOj*¦º ¶LFOBJ’À{–þ! '¦Ð Ø 3ÂØÖ! ¯1ï”p Jsm{à\˜À7pà^YÀ9ÀÉQp(àbMØÐ >p.ÐXð9‡5 öÛV j  ³ ªp¹i ò§ ­ ñ Ù -©˜Ó$º ›À’0,€Qˆ€±~ÅlÑWb€û ŸNUQYÄ«`Jn   ¨° þj ‰”6 ›à ÐÕ@ Úð í@ ¶Ü"Y¤ ¯  ‹R”"a«Pð$1”‰„# ¹ù ƒ7§ Ì, ƒ€€ðÄi;j›P º “ã0fTM’ V³ ¥  AC P‚†SC ‚~€‰uE“ @«`-EQ+‰€e@žaY0R0„a |p ¥0 "º X‚¥¯À,P 3íþÐ Ív 9ƒ CpP‰Tð “! Øâr |ÀœH ÖH)Ž º  M2)›€6)ð7ðn >1 Ê(þ4ÑŽð ¥ »LŒÀÃ2D E•{»(àkFˆÐÒ€ t!ÜP ¨À-”›¨ ®À 9ªOSJd pÛ Ïà Öð ¦}F™Y  óý: A`‹9j:­€ePÇiP h@ ‘P¿0†²€Ý€Ð ¯ Ø@Ìæ„_R¥£0å#wP à°H˜€óÓöù«ã!åÓ$)]V“ðþ„ÀN- ÛÐ hÒ Ÿc.¾ Ë• Ú¤Dà= ~  Ï«§æÑP¢q™Uš‚¦0 5Ž€äPJØ•-… ¥ âà®Ð s—àÞÐÖ¸° km ÀÁ /7 • É­v qÐáðc¯¾ð F%¹QXé²¹ T@Tm8ç A)ƒÐï0 \³%ï‘s'¢ ÉI HÀ Ðð‰£ñ¥K€ Òp >Iíà ÄAªá³k1ú PB ö! z³XšpÛZ0ì’ š2 Sìd è@ ï #$ ¤ðåä âð § á⠣ʕb³ç  ƒ'—0þ+ë €3b ˜àšð ·4ŸK«c1‹0«@u³0 aR 6o¡·À_¾ ÖpAèú' ¶ ßà ³šÒ€ ° ‰–#»DC˜ŽIg€€òn tÀPn€ ±qn r€ ᶸ°q À଱@ ¡àÖÑð ê& á°/“ƒIàÑ‹Ð<² aÀO}áÏîp€_:ÀYðò< n°‹€ sᶃÖ0Åt¡´ð/a °° @ ‰° K Ýàå @¾p ¦ âÀ ,á ˜ƒ1’áΙà›ÕŽÀ94 V “þbJ""/ Ô ®0/1Ñ.qvû¡P «P á úŒ Ñð2­³ð »€-µ³ ™ à|0P—àÒÞ£`‰€ Ñÿ\‰ÏHâÂ1 —H›²kJÖá‚Õì”8(¨HႦ-T¸]¦´ û†K $A’D&‘äè‰$H’4MšéP FÞͤYÓæMœ9¯akwjÏ4\Õh%3õí•6¤Ûr.½‰e ,ŒeDäIPäH²ÄÔë×Y°vj£e ,W·piw똩¯^%Áɤ)ͦM’ð¾’dÄ‘&”qß”6 Õ-[L„áR§Í®q·´Á 78gI“°”ÁªÐAdrü`QãÈòiÔ©½Ú£è•ݙ醸Q]Û¶eId‘Ħœ9v—ŽÜ&^§&,-‰H"&îÝ!Æ¥O¯©IŽ#! ¨o7>H“""|¸·-I @‹È¯gßÞý{øñåϧ_ß>ù€;pygame-1.9.1release/examples/data/danger.gif0000644000175000017500000000531107202715154020724 0ustar vincentvincentGIF89aF÷€€€€€€€€€ÀÀÀÀÜÀ¦Êð [W)U3S>PGNRL\ Jf!Hp#Fz$D'?˜(=£*;­+9·-7„%BÁ.5Ë03Õ11à3.é4,ô5*þ7(7MŸÌ4ÐÌ4Ч`÷¹Ÿ}^ôDL÷¹¶}^ô7ÝD ¹ä Ì4pÌ4p§`—÷³—ÿÿ…p@º¸¹äà@. ÿÿÿ¹äŒ7ê‚@¼X¹äˆ‚@º¸¹å@. ÿÿÿ¹äÀ7ê‚@¼X¹ä¼‚¹å 7s‚¹åpuÞ¹åºl€– 7¹åpuÞ§`¹äÔ¹å\@-‚¹å<7ûd‚¹åhtР"»è´í¹åh÷ þ¹å€tР!à$´í¹å€÷ þ÷âw÷¡u",¹å°tР!ßð´í¹å°÷ þ¹åÈtÐ|þIô´í¹åÈ÷ þ÷³ý `¯ü þIô¹åð÷F ý þIø¹æ" `¯þIø÷¸¹æù?ˆü d÷¸vB¹ç4÷m `¯/v F)ø(oW°d|W'#cd¹æð.xP¹æì¹æð¹æP9µ¹ç˜ûþ÷âw¹ç/`¹ç ¹ç¹æx.xP¹ç˜ûþ÷âwêã/`b¦È¹ç¹ç/`¹æØêÙ/`b¦È¹ç/`÷¹¶z8Ì4pè¶¹ç(̱ ̤Ì1Ì4pÖÌ0?Ì0Ì4pÌ4p¹ç,¹ç˜õj2PÿÿÿÌ4p78€Ì4pD•ÕÌ4pc c ÿûð  ¤€€€ÿÿÿÿÿÿÿÿÿÿÿÿ,FþH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£>hXÊ´©Ó¦ zóÁÓ«X¤¢«×¯`ÆؠA*Õ³.3ˆ»Àb‡µp×v€€¶.Êq¿^°È ¯_°Ø,RÂßf)r=|øCbÂ5¾õÛáâdÆGÞ|±ï_ |1c®Ì¹´ÄÅy?\D-úïÓ°^Ž[ÁrkÆbëNèÙ¯àŠ½oÿ¥»£ÕCYÃÍp±‚pƵ!6x`õ)õ’Ó¯kd@]»Á4þløÐµ­ÎìgÃ%^ÑÃóÃ. Pa<| ¿v¿tÆè , ÁayPA~5 bypAâ¹Ö^ A Á̶Á AÄuLa¸y 8py^i¥@ppåfQï5¶ZÂY@âA†åÚ —I žpÄÀ‰~}äB¶(Ð4ê5rk-Y‘syàŸp 9c7%\ 8Ðd^ì!Ô1zÅB<ŠÖA‘Á˜Wm øøU~C²uÑ™q™µÀzþ&A€ÞFšAxå•A˜¹ˆm~ÕáAfÞ¦ÙAX ©X®øW¨Ùé—¤™zØ“Vþ8úŦh1Ðgk 0•ïmZP¢`yð©XùQ)–ŠWà@”2†à@ úªéj¬”çµÈ2zëh©*×}ëÕ¢íF'‹y!tÁµ!„Ù(¼]=»íµ¤Ö)­p— Ôik(îZýN4ðZÔ¬Xªä%¼Ù”#½!h»o¯Ý[i|ˆ>g¥ÿ®ps‡}Lƒ~q\Ð[ZV Ý=@ßÂkE,Ьô¢-ňYL/Akz#Í^-KÑ{"„r^&¯Á¡aÀØìºJ*ÎôÚÌÀÅï±÷®pÖ³‰º+¯Z‘Ù`5<%Ï!\:q\H Rÿe³þ¹]]­‚Èu^Ô†,Ö›$ÿëAó¦ÆÐÝtsåfVðí•y;ç…A˜XÕ_³pÍi¯q]`ÏŒtÜ žt¬£&Á€v yU‹Õoïm'öÀ_”+@úr´·ûäà`td\tûõa@@¶lw•°D¬ÿ…6A¡¯Ç¨DðšákÝhlX¯ 4¼_—"=²As¯¥òñb=Æ#׬€ìç¢AЖ¦IdzyYœAºw*ƒôhrš Añ¢¹ùùËPa ¹8å—Åun-¤‚Ñv·ÀÃ4O!¯»^DX/ƽ®+ \Q[ó»ÚuÌQAàZT˜Bà/,þfYS\2 BŠL…É^ò5 Æå{É[’ÆÂÛ¨o8uúÌ@4‡úJaqQÍP‡°n„…iB¿bƉq-1Èc¥̰5T@ ²Æ¯è/“Ý~ãİl€Pp1ßB )–<"¤|ŽœHÉ6¬)„Œ«¡_òõº þÅŒƒKûðFƨŽ!¥ ¡E–¥ÀÌ;a¤X¾÷ø\*ha¼Ün75‚¬,iR"ì’™5 •_ÁÀ [ÀLlHVId~%†¸cw³$)‚yÜã-ILŠ0@·ñ@"K`J$àæFª3Tà…_þ± ð¼â+fiq û,Ú¯6Y¥U*7zc”t( XÀ]IŠÈ¤8ÊŒ´^ÝêcW ¨Ñ¸í‚~yÌE½’Æ_Þ¦i %Þ³æãžBˆ šÍ 7bÍJ!çd~±ÙòºL'¤¦. P󽃤”p0O$`-*À‹bYgBàyZäƒp»)Aþ ­ðE5‹~142Ç÷p@ª9jŒšf-†9d¢¢ÌT¯õ­&Ñ{$²Uføø‘bñ RÔ”3Eu-•= ¦ i€¹fz‘¶^ËéWü3TN6ð§µÝPÃÒÏ^« suçB¨JÔ‹4Ž^6jÜ‚¸‚Œ5!v|þÏö@ê*›9¶m Ád^ì*‘Ðʶ¹m›\ÚÑž D²!@k€ÞâŸæjs˜ ¨hêØÚEf†·®Ç †SžY–p*E27¹„ÔR8‹ò­Wܼ˜îªô LCjÊY¯Š6UÕÈk'[Ê(ľ̬ÖeǵÏaD½£nå¤XÇ3¤A®r¥™%8=·@—:íZŒÆN†a—"ÚeÌY%Ø0Iºß¥[x3 œ¿!ºeL †`ã:ÄZïň†E³üTDH&6I»ÂZ°øçK¡Î³.¦%ÿTt"ç ‡1àU@€·ý@s# '¥v;X óR(ðöJÔž(ë@µõ´³6GŽ VQ²C”Bf꘹ °*=ש·ò@(ÀÞ$¿#¬û€Ÿ‹#“þ~ za‚@•¿2[†dÇÎ0ñ1£{Râ®h9C¢ñߦGM’N¿ФNõGÊêªÎªúÕásŒ\ ëZ_—ý³­w-ÍͺW×¼¶š|—/ ûØéo›ŠŠìf;$ 6`ììj«‰Ñ^è ©iín3Nfjî‘_öîzûÜèN·ºo;pygame-1.9.1release/examples/data/chimp.bmp0000644000175000017500000001257207504130274020603 0ustar vincentvincentBMz2(6OH  ÿÿ~}óNPO¢¥£),*ÐÓÑxzyþçë麽»cfdŽ‘<>=›ñ¿Áßfd©„‡…Y[Z¯²°ô÷õÜßÝÅÈÆ™œšnqo465!#!EHF`\ù ÍÑ谳ʳ·ÍÿÕÔᦥÉ×Ù÷xvˆ»»È™™¼ª­«’¨A@úIGfÀÄÚ$'D³³¿~ƒƒ”—•BC[/10SVThkiãæäúýû^a_ÆÆÒ–•¡Š‹ACAµ¸¶ØÛÙÀÃÁÌÏÍàßì<@?ñõóvywLOM àãûtuæéç¡ ­êîë')(ÊËê@>N}€~¼¿½•˜–·º¸’ûÿüÒÕÓy|z`caORP¤§¥jmk586‹ŽŒÎÑÏ"$#¸¸ÄÇÊÈ«®¬€ƒUWV=@>…ˆ†Z][±´²uxvÞáß&('egf åèæÂÅÃðóñ¨«©»¾¼›žœGIH031_b`ËÊ×¹¼Óöù÷ÆÉÇ BECKNL­°®éìêÝàÞilj""""""""""""""""""’’Ë’x’0Y""""""""""""""""""""""""""""""""""""""""""""šì::s:˜ºˆýl""""""""""""""""""""""""""""""""""""""""""™«Ëõ:õ::::l""""""""""""""""""""""""""""""""""""""""""š:x˜ì|™{õŸ:x"""""""""""""""""""""""""""""""""""""A=’Ú˜:š:˜{{õ:h""""""""""""""""ý""""""""""""""""""""R5v·—::z:::{::š""""""""""’bwš’"""""""""""""""""""â–yDz :::ì:™›³˜†"","hŸbˆwš:|)í"""""""""""""""""""5y–+©©ˆ::õÄx’wBÖb’Vxî›’®’:xx@@:w""""""""""""""""""©o+©©©–F:˜˜ÚÌû:üo9¿² Ç@µõ왟:˜B3¸"""""""""""""""æv+©©©©©©µ:@Žwššy©ƒZ’=u::s8æB’’"""""""""""""""b©©©©©©éŒ›z:::‚Ìa:j–vD"""æšd:>™:ÄA""""""""""""""Yio©©©©©y Ð:::Ýš:šPx"""""q˜™{ìêšL""""""""""""""c©©©©©©u0–88šš„:õ¿,"""""™$':::BxÚ›A""""""""""""+©©©©©©"™…˜¯u›|ì:AÛK"""""'š’{šæV š°u"""""""""""œ©©©©©© ""’ƒýš3::¦J¥#""""Ä{ºxvÌ’€""""""""""""™Û©©©©©©©©ê""¿bjàwxìžt"""":::YhàÇ—w""""""""""""d©©©©©©à""Ý镜yÊðOË""""ݘì{::ê¼;’""""""""""""b©©©©©©©]K""xéw|x·ð¤£©‘""""a™ìY:{xŠÞë""""""""""""©©©©©©©Ì""Ä胎MÚw„˜Á©©ƒ™""""’ûz{ÄAw ›""""""""""""¤©©©©©©©©Ü""'¤¤™šš w©©©ë"""š)3:{{x b """""""""""†Ø©©©©©©©x""¥–wÊŠ3lÚm©©©©–ð""""xs˜::æ™M"""""""""""wé©©©©©©©©N"%\O…mœ°w–©©©©©©Œ"""ÚÒBüµÄ^ŸŠ""""""""""~©©©©©©©©˜N¥…—àðyœÀ¹©©©©©9""""u›xšxÝ€C""""""""Å£©©©©©©©©b—bˆ °²° ©©©©©+ê"""®VÚVö3wb‡"""""""È ©©©©©©XT–è@M–ƒ©©©©©Œ""""’Ÿ’’së‚"""""""" –©©©©©©©©Û¹JŽ’ uœ•—– –©©©©©©K"""—ŠA‚ÚA š¡""""""=ƒ©©©©©©©à’lµm¼ò9ƒ’©©©¹’"""èðu’’ûèu""""""”©©©©©©©©•‚ÊvÎ’v”¿yèž©©©©©9ð5¼"""u w@ˆ]—¤x""""""E©©©©©©©–”]V^Û•²uÏ©©©©ƒ£”•"""ˆy°›š)¯^"""""œ©©©©©©¥Šu蕜ÇÁá©©©©©©–wÝŸ)‚"""›Ç Ö^’bê"""",©©©©©©–£’Úwm—uà·¿ ·©©©©©©¹5x½Ä’"""u©5 Ú^‘Z""""0©©©©© ÚwRààç–©©©©©©©žsì{u""Ж xVbb…bs"""©©©©éàu¬¼°°¤”—5Û©©©©©©çò:u""Lé¿ðµY„•Ü""""Þ©©©©©–žb3  ðI]èéàày©©©©©©Û–’™³""¶—ƒƒvÌÇ’""""b©©©©èÊu—M èw¿²u¹©©©©©©Jð lqw"""ý/y¯”–mÊuY"""8–©©©©]² ¼Ÿ;?àè5©©©©©©•Ymuæ"""x éðmè;^àŠÃ(™"""™ñ©©©y·R·•¹£ð £”J©©©©©–5ûx""""š”çàžub—B"""™–©©©©Áé5Çèð° £ÁÁ©©©©©5›""""Úð£u‘ x˜u=""Ú#+©©©©ðu jà–•wu5©©©©©–•@ """"""y¹uw™ì)¢""ÚŒ·©©©©©•¼DzDžç©©©©©©£¼€@]ý"""""m¹¼ lÖ ³—Ÿ""†¾i©©©–JO𣤣ð°á©©©©©œ°mÝ"""""æ°–Jv ›)™°š""’©©©©¿1–¤èð°u–¤£©©©©©©+y·0""""""#¥”+5¤ ’ý|u™#""ñ©©©–£5œà—ð̤9·+©©©©©©ÏŽ""""""""Ž©¥¯qÎüÄu?m"""©©©J—Çò¥òwwJ5²©©©©©©+&"""""""""\©è·Ÿüš’wvu""""+©Rc5锹ޛléð+©©©©©©©²ó""""""""G–£¹èšìíkê""""–©éÇ—’xunw©©©©©©©©ow™"""""">y²w„€ µZ""""""9£y5൵û]s©©©©©©©©©©è""""""ð–ž š˜Y u="""""æ•©£•–ÏÇÊb±ˆèè>–©©©©©©©©©©© """""祠bm? Ë""""""·ƒ©ƒJBu’vœ’i©©©©©©©©©©W""""h–3 M1 †""""""4+œ –vx’›ûð9©©©©©©©©©©©w"""˜£àµxxM]>]"""""""^©©•?œ yy5Û3 ÌY°±+©©©©©©©©©©Ç"""5¼ ’Ðv ±a""""""Å©¼¼ÊJ÷ð‘BŸy©©©©©©©©©©©©B""v©ð±us5¼ """""""'©–—°žà59à¹x@xµ¤¹©©©©©©©©©©É""°©Ju°——~é"""""""©©¹ðœ]œJ¤j ’¯¤+©––©©©©©©'¤©•wðù•""""""""²©Ûç¤ˆŽ )â ¿©–£ °5©©©©©©·¦©¼M è¤9-˜""""""""@–©œ•àÊŸÇuxM¤+©©ìì˜:Am©©©©©©©©»Ç…£–r""""""""""5œ–èî‘]Mb»˜:::ê˜:©©©©©©©©£¤èǹ'""""""""""< ·vm·ƒ™Ú@¬›²©¤õ«Š’Y:§©©©©©5y?œJ—ý"""""""""""¥Š—ƒ¼V °3©bß›Ÿw)ûšh¤©©©©©–ƒ–Ç—œ·"""""""""""")5 w?5w9𔕕wæ::ÄõYš:b©©©©Jàyà ç5§""""""""""""JŸwy¤^ƒ–ƒ ½::˜ì{{õ)Τ©©©J—à ·—ô"""""""""""""à¼Ú^s^³ë¿¹{˜Ä|Æz{:w^ ˆ–©©©ÛÇà^œœ•°‡"""""""""""""’–¤]) ý{:wÇé›::™õ:{::Ž]¬Ç©²y°]â5€vÝ""""""""""""""¿°°>›ü{:x•°1: AMx::›¼âÖ ç–©éž›?u‘ê"""""""""""""" u]œê::^–•’|™::ì:˜˜’sÞ¤ƒ5uÚ uÐ…"""""""""""""""ÄuvM˜õ  ?@|„™8˜™›))ìõ¤u·ym—â B""""""""""""""""Ÿð—?3)ËBuxx€š:®¬YõÚ:)êh–Ç•èR¥‡"""""""""""""""""è?Šx™¥°Çx¬Ú˜)›ˆìš|šì’ )w¿¹–©žw‚A""""""""""""""""""—] VR–uÚw°ðuîŸ5ƒ–ž5’@v’˜|:‚ƒðÕ<"""""""""""""""""""9·m¼àJè@’¤—b °‘Mü’›q˜ öœ–£“"""""""""""""""""""""›—·5›¥âxÚì:õšY:ì: 3@Ÿ¯b—B e¹ö"""""""""""""""""""""""¬à–•RbÚÚ„„dîÚëÎb5^Ì1°õx’""""""""""""""""""""""""""­s•à9—@Î’ ::’bÚ 9ž¤—?КÄ""""""""""""""""""""""""""""Uð° |xûŸ:˜ˆÝ™Vuॹ¥A""""""""""""""""""""""""""""""šð” |mb®B)wΘ‚ƒuˆ'Ä""""""""""""""""""""""""""""""""¬å’R u¤wèb¤b;y•º""""""""""""""""""""""""""""""""""""œ°mu^Ú¤Ø""""""""""""""""""""""""""""""""""""""™êè uvuUvub’uÕ"""""""""""""""""""""""""""""""""""""""""""#Äý8=3ˆŠ¨ý""""""""""""""""""""pygame-1.9.1release/examples/data/car_door.wav0000644000175000017500000000750607202715154021314 0ustar vincentvincentRIFF>WAVEfmt ++fact—data—(m½Î}iqlŒ=W§°ˆƒ‘xkEa†ž–€•²šƒ]J|’——–Ÿ˜¡•‡’i†‡…¥œsvƒwˆu~‰•€Štzu}€sp‡hfmwcz“‹`…r†q{txy„Žƒyzrek„½áÐרÜèÏܺÒÈЯ¬ÒÏØÐÏÓ²¼°¯®µ¯¹ÄžŸ‡›™Œn†kdbe`fb_C>>?PCI:HX:$%8L>=7) 1PZC.*!)@WN~€{xwlWhmvkhnfhUZw~ry‚n{~r}t‰’†t€sjuy€‚ƒ„vnkpn^_qtsmgXqVYZo‹rXTW[POYgpu‚}tqyy|k{y„sq}’„Ž}wkffvs€€˜¡ƒ—¯¥¡ª’zszjrhv~ƒUYasv„ƒ–‘ˆ³Ä«²ËÎÆÍµ¶´œ˜±¶ÉÅÓǷ¶ÃÁ¨´«µ¤º±Ïéæãß·µÑßÏÔÓµ˜¢µ¯µµ©~mr{wpmkbV?&",12:A6,+ +S`$'D'-/3jG-f9 ,+5BM><97?P9F9#0WEeXKEI!->4IV7;Fvgw`eZrtj^tg…Љ™…‡–¤ÁÓ¨§¢©¡–˜¬¶È¤«Š|~|ƒ‡_\S:VUySb?3,8BBQad[RLD`OOnicI;:5=Z`N( @5:3  0( (<985/+HOfcqaj]Ghm}‰‹œhSo”emŠ„™•q``V\et——‚{………ˆ†~Œ’yƒ™®œ…  ’ˆ‡” š•|•œ‘Œ”Ž’‘›®¬½¼¢š‰ˆ”‹š¦›˜ž¦°—•ŠŠ|Œ‡Ž˜‹…tnpcoq{ncgafnmhmpp|†…‚v`k‚††}€s€y‡•‰~xmjppr~viSWks\NRWdXYSQP\jmvvgYXmyކ‚tnox€|‹n|„‘Œ€{Œ‡„}fht…„Žxpq› £œ’Œ™—Š‚‹Ÿ¢ŒƒŽœ  Ÿ©±²©’˜¨¯¼¼±¯¢±ºÊ¾Šˆˆš¤¤¨­¦¢¡œ£¢©®›š £¤¥¦œŸ¦½³ ¤§­¬¯©§¬±´¼¸©©®ÂËË·³¯¬¯¯·Áº¸¬´¹Ã¸©£ž¦·½¾»®±¸­µ´¨¬ÁÁ¼¸¸¾ÇÉÌÍÃËÊÃÆÀ»ÃÇÉÒÆÄÃÆÅÀ·º¼»¼ÆÀ¼¹·¸µ»¼½»´´¯¯°º·´²®µ¯³¦¬«°°¨¯±µ°¥¥«©­³´¸°ª§¡ª¥ª®·°©£¬ ¤¨®²¸¼´³©–¤¿¿¼¤•ž«ºÁ³¨›‘‘“’…Š{|x~ˆ†zm{“¦‰€w‡Œ‘”€w|†š’‡‡‡“™›š•“š¨Ÿ•™˜Ÿ¢ª¤š˜Ÿ—™£¡¨©žŒ›£©¢—Ž•¢­ Œ–£©³¬›¡›¡¬¹¸°­¥¬º¯´µ±²·½®©¦«³»¾«¡¨²¢¥£¡š™š‘™š—’‘š“‘‘ž”‰~…Œ’‘—œ˜š”ˆ~~„‰Žˆ€ƒ„„‡†‡zx{uwx{‚„}‰{wr{{vot}xttqkirwyxpfhmvxteggiepplrtuxkh`dqorqomlggs|vujbaaegi][hpof[[blliplh``adkkgpqkfhcfoslegkmsokjdhmkeinrw{lgihgjow}|rpkx„Œ‹~…ƒˆƒ†Œ‘“’‹‰…ˆŒ–œ˜–’ˆ‚ŒŒ“˜“„—…‚‡—˜Š…‡ˆ‹{€|„ƒˆ’”€x‚ƒ}}}ts~}uvxqvrv{sontnejy~ob\kofc]elhqum[^X][kojomdcirihiin{qhhedfirppnnxsnjms|tieeptw}wxxywrryvsx{r]n~†}min|zyljnpjbe`]bgd[TRXXZ]^YURQU\cb`aj`aV[dfg\[ejma]]ahmkkgLލmla[cbvz_Sl‚mgwup}}p[v|~l]bjnroq€zsdi~†ywxxndmxŒ–‘•Šsv|zˆˆ‹˜–†}|‚{}u|…†spvyƒ}€~zwtwyy|wvx{}y{|ƒxƒ…z}…††„€{zt|zuwƒ‚…€€‹‰}~‚}v}~uz|~wrstttnlgrƒ}sust}{wxtsqry|‚‚~zy€~„|}‚~xuvw~…€yustz{rprvuqprppnrwvrpklllpw€}vuqrruyyolmuyyzwrov~|wz|‚~qsy}ƒ|~…„‚††…„{z|{…Œ†~‚‡ŒŽŒ‹‡†…ŒŽŒ‘’ŽŽ‰‡Œ’‘Œ‡†ŠŽ‹Š‹’”•”ŽŠˆ‰‹ŽŒ‹ŠŠŠƒ‚‡‹ˆˆ„‰‡†ˆŠ†‚}~}€€„„„‚‚„…}~~€‚€„€~~y|yz€ƒ…}utw}}yysrqsywvrvvxspkkmvwwspuyvpijllnopnijnlnnijmnjkhjplhhlmospgbdhjkknnjhfefhikkmkfgijfiqrpprqoqtuvwustswuvz}wuwzwtsvvqtwttsvvvsnqvyzwtqrrtuywspqpsstttxxxvuvzzwvsqtuwttx}€vprpqy~€xux|}{~‚‚€zx|‚~~|~€|~}{~ƒ~}}zzzxy{z|}zzywxvx{}{zxuwz}{z{xy{y||||}xyz}}{zy}~yz}}}}}{|{€ƒƒ‚‚ƒ‚‚€}}~€{{zz~~}}{|}€}z|€}|{ywy||}}|{z|~€|xy|z~€}~‚‚}{~~~‚ƒ‚ƒƒƒ‚~~€‚„†ƒ€‚€€‚€€‚‚€~€ƒ€‚‚„…ˆ„‚‚„…„„‡‡†…ƒ‚„…‡……€€€‚……‚€„…„„„ƒ„††ƒƒƒ„…‡ˆŠˆ‰‰‡……ƒƒ„‰ˆ………„…††ˆˆ†††††„ƒƒƒ…‡ˆ…ƒ‚€ƒ…‡„„††………†††‡‡„„†ˆˆˆ‰††ˆ‰Š‰ˆŠŒŒ‹‹‰‰ˆˆ‰ŠŠŠ‰Šˆ‡…‡…„……ˆ‰‰‡††ˆ‡†…††………„„„†ˆ‡…ƒ…†‡…„‚‚…ˆˆˆ†„ƒƒ†‡„ƒƒ„……………†„‚‚ƒ…………„ƒ…„„„„‚‚‚‚‚„„…‚‚„…††„„„ƒƒ‚‚ƒ………ƒ€€€‚„ƒƒƒ‚ƒ‚„„ƒ€€€‚‚€~}}}€€€€€‚‚‚€}‚€€€‚€€‚‚‚ƒ‚‚ƒ‚€~~€„„‚€€‚‚„‚€ƒ‚‚‚€‚…„ƒ€‚‚„ƒƒƒƒ„„„„ƒƒƒƒƒƒƒ‚ƒƒ…†…„…ƒƒ„„ƒƒ‚‚…ƒ…„ƒƒ‚ƒ€‚‚‚‚‚‚‚‚ƒ‚€€ƒƒ‚‚€€‚ƒƒ‚‚‚‚ƒƒ€ƒ„‚‚€€‚„ƒ‚€€€€€€€€€€€€€€€‚‚‚€€~€€€€‚€€€€€€€€€€€€€€€€€€€‚€€€€‚‚€€€€€€€€€€€€€€€€€€€€€‚‚€€‚‚€€€ƒƒ‚‚€€‚‚‚‚‚‚ƒ‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚‚‚€‚ƒƒƒƒƒ‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚„„ƒƒ‚‚ƒƒƒƒ„ƒƒƒ‚‚„„‚ƒƒƒƒƒ‚‚ƒƒ‚‚ƒ‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€‚‚€‚‚‚‚‚‚€€€‚€€€€€€€€€€€€€€€€€€€€€€‚‚‚€€€‚€€€€€€€€€€€€smpl$'±JLIST@INFOICOP"Copyright 1999 Sonic Network Inc.INAM Car Doorpygame-1.9.1release/examples/data/boom.wav0000644000175000017500000003042207204675402020454 0ustar vincentvincentRIFF 1WAVEfmt ++fact0data0ÒÑÎȾµ¯¨ ™ˆ€}vngaZWUMKFB>:9833333338:ABFGKKMUX_jt€€~xvqaUj–’}ˆŒxxx«’ŠÆðæ×ÑÒ×ÚáîøôæÚÑȺµ³«©¡›”ƒ€€‚ˆŒ”™Ÿ¡©¯³µ¾¿ÆÆÇÇÇÇÆÆ¿¿ºµ²«¨ ›’Œƒ~vnjaZWQMFA>83/.(&#  #&&()./2389:>>>:2((:MZjq}ˆ”™Ÿ ¡¦¦¨¨¨©©©©©©¨¦¡ Ÿ™™–™Ÿ¡¨«²³¹º¾¿ÂÆÇÇÈÍÍÍÎÎÍÍÍÍÍÈÈÈÇÇÆÆÆÆÇÆÂºµ¯¦ ›–Œ~tqnnljgea``_ZXXa`K:AN`_UMKGA>KXgq}€€€~}vnja_XUNKFBA>::>>AAABGKNW_nten}Š”›²¾ºµµµµº¾¿¿ÂÂÆÇÈÈÍÍÈÇÆÂ¿ºµ¯©¦Ÿ–’Œˆ‚€~xvqnjjgeaaa`_U:BZq~ƒŠŒŒŒŒŒŠˆƒƒˆŠŒ””™››Ÿ¡¡¡¡¡¡¡¡¡¡¡ Ÿ››–”’ŒŠƒ‚€~xvqnjga_ZUUUUUQMF>3(  (3>GQZalv~‚Œ”›¡©²¹¾ÂÈÎÒØÝáæêîðôöøùþÿÿÿÿÿÿÿÿÿÿÿÿþùøøöôðîìêæáàÚØÒÑÍÈ¿º¹³²«©¦¡ Ÿ››™–””””’’’’’”””–™››Ÿ¡¡¨©«²³¹º¿ÂÇÈÎÑ×ÚÝáåêìîðöøùþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøðêà×ÍÆ¾µ« ™’ˆ~}Œƒ>&3B/&(((((&&&##   (&3FXjv€ˆ’™ ¡¨¨©¨¦¡¡Ÿ™”Šƒ€}vqjejxeMA)3KA8/.(/BU_gqx}xtvtqqqqt}’›’Š‚~v}‚Œ”›Ÿ¡³ÎÎÆÆØæðùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿÿÿêììðøøØÂÝÚÒáÆŠ Œ}’²›U&3Ma`>&:`lNXXB)(2. /8 9XF/:.8A_FGWZG88FU_j€‚xxjU)&FUg€‚aaB9Wnˆ¡«™¡¦¡¦³³¹Â²”³ÇÝùê””ÑðÚÑÑÑׯàæùàÍàѳÈȳ¦ ÇððêdzÎÝ¡ŒµÂ”€ˆºÆÒ×ÎàþÿÿÿÿêðÿðæÚÎÒ¹¯ÆØîö׿³ØÒ¾ÂáѳÎðááΩ‚}anljx€€‚’Ÿ¾º©«¦ŠŸ™ŒŸ²Â¹ÆÂº¦ƒ‚–ŠjW`_gvvgeeK3KKB.)/:>)(KjvtqŠƒv`XŒ›²¡‚n`ZNAKlnqnQQQ//9QWWA :K9):99/# )8FB>9FZ_KKanleg‚”¦Ÿ’ƒ”µº¾º©«¾¨”K:a}ˆˆŠ¹Æ¨Š~taeja`_Za```a~ˆŠ”¨º³«©«Ÿ–™Ÿ¡™›¯¹©©¦™ ›’‚ƒ›e`jx€‚’””–ŠtW83G`eWa}”Œ~tZAUZZXUXUNAWx‚~‚€XG`q›ÂƯˆ€””nZNMB8)   &Zjagnlx}‚ƒ”¡ˆ–¾ÑáåðÿÿùþðøðåÒ×ÑÇ«ŒŒ¦Ÿƒqaa_qxqZ. &KUNN>.2Œƒ”›™ŸŸŠƒŒ›¨³Çáùÿð꺃Œ³Ç²³ÎÈÍáöáÆ¾ÈæøþÿÿðΡ€Œ«¾³²¾È¹«Ÿ”€€”ƒnx€ˆ––‚v}}€ƒvlq€ˆqjjxŠƒxXNKU_ZWM92:AUajqte9 #&3BGBABWUBQj€ƒˆƒ€€}jajjlgWNQG:2))(&&&& &(&&&().2:>A9339:>Mjlaq€‚ˆƒ’™’›«²µ¿ÇÑáåæîøÿÿùøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøêÝκ««–Œ ¨”}gqeUe€””€q€ˆŠŒ”––Ÿ«³ºÂ¾³«ºÆº¹Â¯™ˆƒƒŒ¡¨–ˆŒ™¡©©¨©²¡ŸŸ¡¨¡¡¡–”””””’ŠƒŠˆ€ˆŒŒ”–™’Œƒ~x}xjUN`ZUA33>B3:B39NWnƒ‚‚xˆ¡¨«³³ºÂÑÒÚæðôððêÚÚìôêàÎÈÑàêÚ²ŸŸŸŸ«²›”›¦¨›”Š”Ÿ™ŒˆŒ›³µ³«›””™µÈ¹© ›™–’ƒxjgt~xt~ˆ‚xnqjgxvj_KFXjaenn~€ŠŠ~€™Ÿ›Œ€‚€xqljnvnjjgjaUZZWQUaUUZXjqqXQennq€ŒŠƒƒ‚”™›  –ˆ~jqveQQMFGF>:8/  (()3 :A# .8AA9FGG`xŸ ›Šxlq€vjnˆ–¡Œnj~ˆŠ’Š~Œ–’nqŸ–™©²¯²¯¨ ¨µ³”ˆ™«ºÈÑͳ™ŠˆŒˆ}v}v_MZjg`aljnqnvxtlZKMQF. #)2/3K_elx‚ƒteagqx‚›¨µºº¹ÂÑÑÑÎÑÒÑÒÒ׿ôððþÿÿÿÿÿÿÿÿÿøðæÚÝììáÚÚÚׯ¿ÂÇÎÑÑǯ›’Š€ŠŒ– ¡ –’ƒƒ’’v~‚ƒ‚~}ƒ’’ˆ”€vƒ””–¨¾Æ¹©›’ŒŒˆnXXglx‚€xvqt€ˆŒ’Šˆ’›¦«²µ²©©µÎ×ο¹ÂǾº¹³¯¯¯«©¦›Ÿ¦¦¯¹ºµ¯««µ¾¿Âƾ«¡Ÿ™™™››”‚~ƒ›©«¾ÑÒ¾¨ Šƒ’’€l``q}xZ8# &8N`ajtŠ”™Ÿ ¡©«³¹ºº³µ¿Âº¾ÂÆÈÍÑÑÎÒØØÒØÑº¿ÇÆÆÍÚááÚÒÒ×Ⱥµ³¯¡™”’ŒŠŠˆˆˆˆŠƒƒ‚Œ›¨¨¡Ÿ¡³º²¯³¡ŒˆƒŠ–€}vt€naglaWK98A>323FUQX`Q>>F:) 2BGMKKXe`UNQUZajnjZW_`ZXXUKKG3 &BZjvtlaXUKFUeeZQKNXax›ºÂº³¯²³³³µ³¯³µ¹³²µ¾º¯¡™›¨¨¡ ›”””’Ÿ«¯«¯¹Âƾ¹¿ÇÆÈÎÑÑÍÈ×ÚÚÑÈÇÇÈÎǾµº¾Â¿¾º¾ÎÚκ¿ÍÑÒÎÇÎæøøìÝÒ͵«Ÿ››”Šƒqjge_UUWNFBMU_xŠ”€}x~€€‚tjaZMGKWejgWFFKKF:23FUXUMKKNUQK>) (. #A_ntqnjXKFMajZFFWZZZXZaZMFGUWQF::>3&)8GXjxˆ–«¾ÍÝìîæ×ǹ¦ ¯ºº²¡›”ƒ}ne_UMB3.&   3MQFABKUWW_ejeajqlaalƒƒ™ºÈ« ¡©««³ÂØáåÝØÚåêêêðùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøêؾ¦–ŒŒ”™››¨¡ƒx€Œ¡µ¾²¦¨©™jZQG8.(&.883/(  .AKKGFBN_aen`B3:MU_l›³³¡›«µ¯ Œ‚ƒŒŠ~qj`ZXKFB:.((((&(../39:BNUQNNNX`jnq}€€€ƒŠˆŠŒ”¡«¹º²©²ÇáîðîêêæáÝØÈµ²²«¡©¯¡–””–Œxaajv‚ŒƒŠŠƒŠ™¨¯©›ŒŒ›™ˆŠ’ˆ}x~~xx}~x}ˆŠ€vx~€qaaaae`XUQKKXaeejjlg`WMKNWj~Š–¡©²¹¾ºµ©”Œ’’Œ’ ¹Ç²  ³º²Ÿ–”’Œƒ}llZZjx€ƒˆ™ «¿ÑÝæþÿÿÿÿÿôìöðÒº©©µ¾Â¿« ’‚™¦ŸŒƒŒ’’”ƒ‚}jaentqv~ˆ”™~gXWXM:39BGKGAFGGKUX_`ZXagZMA98>KNNQXWF9>GWajgjv}x~}ngglnnntx~tnqqnnllt}xqnqtv~€‚ƒ ¨¦¨©¯© ¡©©©²¹ºº¹µ³³³²©¦¡ŸŸ¡¦  ›››™”Š€€€}ttqjgjljgea`a``_ZZWQMKKGBAA>BBFB:2//(##  (.2228>GNQQWWNMNW__`aejq~ƒŠŠˆ€ƒŒ–Ÿ¡¡©¯¨ Ÿ Ÿ–’Šˆ€tga`XUWXWUQQNKKKGGKKFBGMMMUZXX_``aaajnnlnqqqqv}~~~xv€’–ƒŒ”””™Ÿ Ÿ ¡¡¡©«³µ³³ºÂ¾¾ÆÍÍÍÒÚÚε³¾ÆÂÇÑÑÈ¿µ³¯©¦¨«ºÇÈÂÇ×êêØÍÈÍר×ÒØÝåêêàרáåØÑØÝàÚ×ÒÒÒ×ÚáååîþþðîöðêæáÒÈÍÒÚÚѳ«¡’‚‚ƒŠˆƒˆŒŠƒ€q`UQUZ`_Z`gt~xnjgjnnnqv}}xxqa`eaXM:&   #  &)(###&.23/(&&)2>B:::>:.&2>B>BXeaejjjg`Zevƒ›¯µ³²²¿ÑÚ×ÒÚåæåìøÿÿÿÿÿÿÿÿÿÿÿÿÿþêáææáÝÒÎÈÇÆÂº³³µ¹ºÂÇȾ¿ºµ³ºÆÂ¹¯«²¯¯²«Ÿ’ŒŒˆˆŠ‚}qlgjqqngjjjelx~~xqnlq~ƒŒŒƒ€‚ƒ‚~}€ƒŠƒ‚‚ƒƒ€xxxx}~vqxxj`WUUUUMGKUQKGGKKKKKB:33.)./333//2.&&/2...&#).)).238:::99:BFKNW_agjjejqv}‚ŠƒƒƒˆŒ›¡¡¡¦¦¡ Ÿ¦³º¾ÆÍÒÚÝàÚÚááááåêêìêêáÒÇ¿ºººº¾¿ÈÚÝÚÑÈÇÈÑÑÒÚáìêáÚ×Òͺ³ºÂǾ¿º³¡–’’ŒŠˆƒ}}xxxvttqnlntx€ƒ””–™ ¨«³º¾¿¾ÂÂÈÎÑÑÎÍÍÍÍÎÍÇÂÆÆÂ¾³©¡Ÿ›–”Œ€qjlljgeaXNUZ_ZUKABBBAABABKKFFFA:/  #&(./..8BFBAA93:ABKGFGKMKKQWXUUQUZ_aaejntx}~}~€ƒˆˆˆ‚‚ˆ–¦¯³³²¯²µµµµµ²«¨¨¯¹¿ÂÆÇÎÒÑÍÆÂÆÇÍÑÒÎÍÈÈÈÆÆÂÂÂÆÆÆÆºµ³¹º¿ÂÆÂ¾¾µ²«©©¡ŸŸ›–’ŒŠŠŒŠˆ~‚‚‚ˆŠ’’”–››ŸŸŸ¡¦¡ ›””–›¡ ™””’ŠŠƒƒƒƒˆŒ’’Š~tqqtv}~~~}}}}}~~~€€xng``ajqvvxxtnjea`___ZXXWWWQQQNNUWWWWX__XUNKKKG>999998999:AMUWZ____``aajntx}}xvx}}}}~~~xxxxvqleejlnqv}~xx~€‚~‚‚‚}vvvvx}}x}}~}vvx}}}}~€‚Š’’’–Ÿ¨«²³µ¹º¿¿ºº¾¾º¹¹¹³¯©¨¡¡Ÿ  Ÿ›”ŒŠˆƒƒ‚€~xvtqnnnqqlgeegaaaaeggjnqqqtx}€€€‚‚ˆŒŒŠŠŒŒŒŒŒŒŒŠˆƒ‚€€€€€‚ƒŒ’™Ÿ¡¦«¯³º¿ÂÇÈÎÒÚÝàáæêêîðöøøøøøùÿÿÿþùùøôðôööðîêåàÚØ×ÑÍÈǹ²«¨¡›”ŒŠƒ€xxvtnjje`ZWUNKFBBBBB>83222222/)(...((((&().)&      #(/338:>BFGKMNNNQUWXZZZZ_aaaegjjjjjgggggjjjjjnqqqnnqx}~€ƒŒ’”™››™™Ÿ¦©«¯²µºÂÇÈÍÈÈÈÍÍÎÒÒÑÎÍÍÎÍÍÍÍÍÈÈÈÈÇ¿ººº¾ÂÆÈÈ¿º¾¾ººº¹µ¹º¿Â¿¿¿¿¾¹³µµ³³³³³³µµµ³¯¯¯««¯¯«¦ ›™–”’ŒŠŠˆˆˆˆˆƒƒ‚€~xvtqlga_ZXUNKFBB>:988833333333338833:>BFGKMUWXWWX`aeegjljlnqtvxxvx}€€ƒˆŒŒ”›››™–––”Œˆˆƒ€}xxxxxtqqqnjjgeggeaa_ZZXWWXXXXWWWWXZ_`_ZWUUXZXUNKGGKGGBBBBBBBBBBBBFKNUWXZZ`ejjlqqtx~€€‚ƒŠŠŠŒŒ’””––––››™–™›¡¨©«¯³¹º¾¿ÂÆÇÈÑØáêôùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþùùøøðêêêåÝ×ÑÈÆ¿¹²¨ ™”Œƒ‚‚ƒƒ‚€xqjjjjje`ZZZWUUNF:3......)()../239:AA>:9::93..)(((&# ##&()...)./33389::BGMUZa`XQNQQUWZ_``ZXZajllgaaglqnlqqtvxxxvxx~€ƒƒŠŠŒŠŠŒ”›¡¡¦¡¡¡   ¡¨«²³²²«¨¦¦¨¨©«««©©«¯²³²¯©©©¨¦¦¦¦¡¡ ŸŸŸ¡¦¡   ŸŸ›™”’’’’ŒŠŠˆƒ‚€~xtqljlljga```_XWWWZZZXXZZZZXXXXXZ`agggjjnvx}}}}xxxx~~~}~ƒŠŒ’’––™ ¦¨¨©¨¨¨©«²µ¹µ³µ³²²²¯²³³µµ¹¹µµ²¯©¨¦¡¡¡¡¡¡¦¦¦¨¨¨¦¡Ÿ™”’Œˆ‚‚‚‚‚ƒƒˆˆ‚€}vqqnqqqqqqnjeaaaaaeeaeaaaaZZXWUUXZZZZZXXWWZ_`aa_ZXUUWZ__ZWUUUUXZZXXXWUUMKMMMMMMMKKKKKKKKKKGFFFFFFFFGKKGKKKMNQUUWZ_`agjntxx}~€€‚ƒˆŒ’””””””–›Ÿ¡¡¡  ¡¦©««¯¯«©¦¡›–”–™™™™™™–”Šƒ€}}xtnljjlljgjjjgggjjjjjjjljjjllnnnqqqtttqnllnqttttvxx~€‚ˆŒŒ”›¡¨©«««¯²³µº¾ÂÆÆÆÂÂÂÇÍÑÒÒÑÍÈÈÈÍÎÑÒÑÍÆÂÂÆÈÎÑÑÑȺ³«««²³µµ³«Ÿ’ŠˆˆˆƒƒƒƒŠŠŠŠŒŒŒŒŠŠŒŒŒŒŠƒƒƒƒƒˆŒ’’”’’’’”––”–™›››™–™›™”’Š‚€€€€€~~xvqljgge`WNKGBA:8332////28::::>>>:::>BFGGGKMMKKMNNKFBFMUWXXZaagjlnqqnjjjljjea__`agjjlnqxx}xtqqv}€€€€€€€€ƒˆŒ’””ŒŒŒŒƒ~€€‚€~}xxxtqqnllnqqvxx~~~€‚ƒƒŠŒŒŒŒŒ’”’’”’ŒŠƒ€€€~~~~€€€€€~}xvx~€‚ƒˆˆƒƒ‚‚‚ƒˆƒ‚ƒˆƒ‚ƒˆƒ€~€€~~}~€‚ˆˆˆˆƒŠ’””–––™™›Ÿ¡¡¦©«¯¯«©¦¨¨¨¨©©¨¦¦¦¨¦¡ ŸŸ›™”ˆ‚‚‚ƒ‚€€~~}xtlgggjllnljeea`_ZWUQQQUWZ_`aaeeggggea`aegjlllllnnqqtttvx}~~}vvvx~}xtqljjlllgeaaaa_XWXZ_``_ZZZXWQMKGFBAAAA:989AFMNQQUUXZ`egge`___ejnqqqqqqtx}€Š’™›Ÿ ¡¨©«¯²³³¹ºÂÈÍÑ××ÑÍÈÆÂÂÂÈÈÍÈÆ¾¹µµ¹¹º¾¿¿¾¹³«¨¡¡¡¨¨¦¡¡ ŸŸ›ŸŸ››™”ŒŠˆƒˆŠˆƒ€xqjeaaaaege`ZXWUNMMMKF>9389999:AFGKKKKMUZ_aagnvx}€‚ƒƒˆŠŒ””™›¡¨©«©¨¦¦¦¨«¯³µººº¹³³²¯«¨¡¡¡¦¨©¨¦¡  ¡ ›™–”’Œˆƒxtqlnqlgeaaaaaagjlnqvxvtqqtvxx}€€€€‚ƒƒƒƒƒŠˆˆˆŒ’”’ŒŒ’”™™›› ¡¡¡¦¨¨¡›™› ¦¦¦¡ ›–”’ŒŒŠˆƒƒxxxvtqjjjjgeaa`ZWUUUUUUQQNNNUWWXXXXZZZZZ___ZZZ_ZZZZ_aejgeaaaegjlqtx}~~~€€€€}xtqqx}~~~~~}}~€€~}}€€€}xvxx~~~~~~€€€€€xvxxxxvtvx€‚ƒƒ‚‚‚ƒˆŠŠˆƒ‚€~xvx}~}}}}xxxvvttttttqqqnnnqqqnnntx~€‚ƒŠŒ””––™›Ÿ ¦¨¨¡¡¡¨«¯²³³³³³µ¹µµ³³³²¯«¯²³³³¯«©¨¡Ÿ››Ÿ ¡¨©¨¦¡ ŸŸŸŸŸ›™––””’ŒŒŠŒ’”””’’’”™›Ÿ›™™›Ÿ ŸŸ›™™–””’”–››™”Œƒƒ‚‚€~~}xqnjg`ZWUUQQQQUUUNKGFFGGGGGGGFB>>AFKKFA:3/22//../2//..///239:>ABFFFFGKQX`eeggjllnnqtx}~€‚ƒŠŠ’””””””––”’’’’’ŒŒŒŒ’’”””’’’’’’””’’’’’””––™™›Ÿ      ¡¦¦¦¨©««¯²²³µµ¹¹¹¹ºº¾¿ÆÇÇÇÇÇÇÇÇÇ¿¾¿¿¾¹³¯©¨¡Ÿ›–Šƒ€€~}vqjaZWUQNMGB:999832//2222/.........///////2338:>BFGKMNUZajjllnqvx}~}}}~€€ƒŠŒ’””””””–™™™™™™››››™””’’Œˆ‚‚ƒŒŒŒŠƒ}}}~~~}}~~~~€€€€‚‚ƒƒƒˆŒŒŒŒŒŒŠŠŒ’”–™™™››ŸŸŸ›››™›››™™™™™™™™–”’Œˆƒ€ƒˆŠŒŠˆŠŒ”™››–’Œˆƒ‚€~~€€€~~~}xxxxxxxxtqjgaaagjnqqttqnnqqqqqqnnllllljjjjjjjjjgggjlnnnnnnqqqqtttqqttvx}~}xx}€‚ƒƒƒ‚‚ƒŒ’””””–””’Œ””–™››››››™–”””’ŠˆƒƒƒƒƒƒƒˆŠŠŠŠŠˆˆƒƒƒˆˆˆƒƒ‚ƒƒƒƒƒ€€€‚‚€€€~}xxx}}}xvvxxxxxtqtvvttttvxxxxxxxvtvvvvvvttvxxxxvttv}€‚ƒƒƒƒ€~}xxxxxvvvvvxx}}xxtqqqqqnllnnqtvvxx}~~xtnjjjjlljjjjjjnqqqqqqqvx}~~~~~€€ƒƒˆŠŠŠŠŠŠŠŒŒŒŒŠŠŒ’”””’ŒŒŠŒŒŒŒŒ’ŒŒŒŒŒ’’ŒŠˆˆŠŠŠŠˆƒƒƒƒƒƒˆƒƒƒƒˆŠŠŠŠŠŒŒŠƒƒƒƒƒˆŒ”–›› ¡¡ Ÿ››™–”––››ŸŸ››™–””’ŒŠˆƒƒƒƒˆŠŒ’””””’ŒŠˆˆƒƒƒƒ€‚ƒƒ‚‚‚€€~}}}~~~}vtqnnqttqqnnnlljgeeaaaa``ZXWUWWWWWWXXWWXWWWWWWXZZ__Z_Z___`````aaa```aaaaegggeeeglqv}~~}}x}}~€‚ƒˆˆˆˆŠŠŠŒ’””––™™››ŸŸ››››™™™™™››™™›Ÿ  ¡¡   ŸŸŸŸŸ›™™––”’’’’”’’’’ŒŒŠŠŠˆˆˆˆˆƒƒƒ‚‚‚‚€€~}}xxxxxvqnnlljjgea```````__ZZZXXXZZ__ZZZZZZ___`___````aaeejlntttttqqqqtvxxx}~‚ƒˆŠŒŒ’””–™›››››Ÿ¡¡¡¦¨©©©©©«««««¯¯¯¯««««©©©©©©¨¨¨¦¡  Ÿ››–––™››››™”ŒŒŠˆƒƒ‚€~xvqqqnnnnlljgeeaaaaZXWWXZZZZXWWUUQNNNQUUUQQQQQNNNMMNQUUUUUUUUUUWXXZZ_``aaaegjnnnllllnqqtvx}~€ƒƒŠŠŒŒŒŒŒŒŒŒ’””””–™›Ÿ ¡¡¡¡¡    ¡¡¡  Ÿ››››Ÿ ¡¡  Ÿ››››™™––––™™™–””””””””’’’”–™™–”’ŒŠŠŠŒŒŒŠŠŠŠŠŠŠˆƒ‚€€€€€€€€€€€~~}xvvxx~~~}}}~~~~~€€€€€€€€€‚‚‚‚‚‚€€€€€‚ƒˆŠŒŒŒŒˆƒƒ‚‚‚€€€€€€€€~~~~~}xvtqqqqnljjjjjjjjjgeeaa`__````_ZZZZZZZXZZZZZZZZ__```aaaaegjjjllllnqqqtttttqttxx~€€‚‚‚ƒƒˆŒŒ’’’’’ŒŒŒŒ’”–––––”””””––––™™››™™™–””’’””–™™™™™™››››ŸŸ   Ÿ›™–––™™›™™›››››™–’ŒŒŒŒŒŒŒŒŒŠŠŠŠŒŒŒŠˆˆƒƒƒƒ‚‚‚ƒƒƒƒƒ‚€€€€~}}xxxxxxx}}}}}}}}}}}}}xvvvvvvvttqqqqqnnllllllnlllllnnnqnnlllljjgeeeeeeeeeeeeeeeeeeggggjjjljjllllljjjjlllnqqttvvvvx}}}}}}}xxxxx}}}}}xxxxxxx}}~€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚ƒƒƒˆˆˆƒƒƒ‚ƒ‚‚‚‚‚€€€€€€€€~~}}x}}}}}}xvvvtvvvttqqqnnnlllnnllljjjjjjjjjgggjjllnnnqqvvvvvvvvvvvvvvxxxxvvvvxxx}~€‚‚ƒƒˆŠŒŒŒ’””–™™›™™™™››ŸŸ         ¡¡¡¦¦¦¡¡  Ÿ››››››››››››››››››™™›››››Ÿ›››™™–””””––––™™™™™™––”””””””””””””””’’”””””””””’’’’’’’ŒŒŒŒŠˆŠŠŠŒŒŒŒŠŠŠŠŠˆƒƒ‚€€€€€€€€€€€€~~}}xxxvvvvvtqnljjggeggjjjjjgaa_ZZXXXXXXXWWWWUUQQQQQQNMMMMMMMNNNQQQUUUUUUUUUQQUUWWUUUUWXZZZZZ_`aaaaaaaaegjlnqqqqqtttvxx}~€€€€‚‚ƒƒƒƒˆˆŠŒŒŒŒŒŒ’’’’’’’””””–™™›™™™––™™››››››ŸŸ  ¡¡¡¡¡ ŸŸ››››››››››››››ŸŸ››–”’’’’”””””’ŒŒŠˆƒƒƒ‚‚‚‚‚‚‚€€€~}xvtqnlllllllnqqqqnljjjjjjjjjjjjlnnqqqqqqtttttvxx}~€€€€€€€€‚ƒˆˆŠŒ’”””–™™›››››››››™™––””””””–––––””””””””’ŒŒ’’’’’’ŒŒŒŒŒŠŠŠˆˆˆƒƒƒƒ‚‚€€~~~~~~~}xxxxxxxtqqqnnqqqnljjjjjjjjjjjllnnnnnnnnnnnnnnnnnqqqqqtttttqqqqqqnnqqqttvvvvvxxxxxxxxxx}}}~~~~}}}}}}}}}~~~~~~~~€€€€‚‚‚‚‚ƒƒƒƒƒƒˆˆˆˆˆˆˆŠŠŠŠŠŠŒŒŒŒŒŒŒŒŒŠŠŠŠŠŠŠŠˆˆˆˆƒƒˆˆˆˆˆƒˆƒƒƒƒƒƒ‚‚ƒ‚‚‚€€~~~~~~~~~~~~}}}xxvvvvvvvttvvvxvtttqqnqnnnnnnnnnnnnnlljjjljljjjjjjjjjjjjlllllljjjjjjjjjjjlllnnnqqqnnqqqqtttvvvxxx}}}}}~~~~€€€€€€€€€€€€‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒˆˆˆŠŠŠˆˆƒƒ‚‚‚‚‚‚ƒƒƒƒƒ‚‚‚€‚‚‚€€€€€~~~~~~}~~~~~~~~~~~~€€€€€€€€‚‚‚‚‚‚‚ƒƒƒƒˆˆˆˆˆŠŠŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ’”””””””””””–™™™™–––””––™››››››››››››™™™™™™™™™™–––™™™™™™™™™™™––”””””””’’’ŒŒŒŒŒŒŒŠŠˆƒƒƒ‚‚€€€~}}xxxvvtttqqqqqqqqqqqnnllllljjjgeeeeeeeaaaaaaaaaaaaaaa``__ZZZZZZZZZ__```aaaaaaaaaaaaeeaaeeeeeeeeeegggggggggggggjjjjjjjjjjjlnqqqqqqqttvxxxxxx}}}~~€€€€‚‚ƒƒƒƒƒˆˆŠŠŠŠŠŠŠŒŒŒŒ’’””””””””––––––––––––––™™™–––”–––™™™™™–””””””””””–””–––”””––––™™™™™››››ŸŸŸŸŸŸ           ŸŸŸ››››››™™™™–––”””’ŒŒŒŒŠŠˆˆƒƒƒ‚€€€~~}xxxvvvvvvttqqqnnljjgeeaaaaaa``_______ZZZXWWWWWWWWUUUUUUUUUUUUUUUUUWWXXXXXZZZ_______``aaeggjjjllnnnnnqqqttvxxxxxxxxxxxxxx}}~€€‚ƒƒƒƒƒƒˆˆŠŒŒŒŒŒ’’””––™™›››››ŸŸŸŸ››››››››››ŸŸ   ¡¡¡¡¡   ŸŸ›››››Ÿ›››Ÿ››››™™–––––”””””’’ŒŒŒŒŒŠŠŠŠˆˆƒƒƒ‚€€€€€€€€~~}}xxxxxxxxvvvvvttqqqnnnllljjjggeeeeeeeaaaaaaaaaeeggggggeeeegjjlllllllllnnnnqqttvvxxxx}~€€‚‚ƒ‚‚‚ƒƒƒˆˆˆˆˆˆˆŠŠŠŒŒŒŒŒŒŒŠŠŠŠŠŠˆˆˆˆˆˆˆˆˆƒƒƒƒƒƒƒ‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~}}}}}}}xxx}x}}}}xxxxxxxxxx}}x}}}}}}~}}}}}}}}}~~~~~~~~~~~~~€€€€‚‚‚‚‚ƒƒƒˆˆˆˆˆˆˆˆˆˆˆŠŠŠŠŒŒŒŒŒŒ’’’’’’’’’”””’’’’’’’’’ŒŒŒŠŠˆˆˆˆˆˆˆˆƒƒ‚‚‚€~~}}}}xxxxxvtqqqqqqqqqqqqqqqqqqnnnnllllllllljjggeeeeeeeeeaaaaaaaaaaaaaaeeeeeeeeeggggjjjjjllllllnnnqqqtvvxxxxxx}~~~~~€€€‚‚ƒƒƒƒˆŠŒŒŒ’’””””––––™™››››››››››››››ŸŸŸŸŸŸŸŸŸŸŸ››››››››››™™™™™™–””””’ŒŒŒŒŒŒŠŠˆˆˆˆˆƒƒƒ‚‚‚‚€€€€€~~}}xxxxxxvvvttqqqqqqqnnllllllllllllnnnnnnnqqqqqqqqqqqnnllllllllljjjlllljjjjlllllllnqqqqtqqtttvxxxx}}~~~€€€€‚‚‚‚ƒƒƒƒƒƒƒƒƒƒˆˆˆˆˆŠŠŠŒŒŒŒŒŒŠŠŠŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŠŠŠˆŠˆˆˆˆƒƒƒƒƒƒƒ‚‚‚‚€€€€€€€€€~~~~}}}xxxxxxxvvvxxxxxxxxvttttttqqqqqqqqnnnnnnnnnnnnnnnlllllllllllllnnnqqqqqqqtttvvxxxxxxx}}}~~~€€€‚‚‚ƒƒƒˆˆˆˆŠŠŒŒŒ’’””””––™™›››››››Ÿ›ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ››››››››››™™™™–––––––””””’’ŒŒŒŒŒŒŒŒŠŠˆƒƒƒ‚€€€€~}xxvtqqqqnnljjjggeeaaaa`````___________```````aaaaaaaeeegggjjjjllnnqqqqqtttvvvxxxx}}}}~~~€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒˆˆˆˆˆˆˆˆˆŠŠŠŠŒŒŒ’’’’”””––––––––™™™™™™™™™™™™™™–––”””””’’’’’ŒŠŠˆˆƒƒƒƒ‚‚‚‚€€~~~~~}}xxvvtttttttqqqnnnnnnnlllllllllllljjjgjggggggegggggjjllllllllllnnnqnnnqqqqqttttttvvvvvxxx}}}xxxxxxxxxx}}}}}}}}}~~~~~~~~~~~€€€€€€€€€€€€€€€€€‚‚‚‚‚ƒƒ‚ƒ‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}}}}}}~~~~}}}~€€€€€€LISTBINFOICRD 1995-09-25IENGMichael BrossISFT Sound Forgepygame-1.9.1release/examples/data/bomb.gif0000644000175000017500000000221207202715154020400 0ustar vincentvincentGIF89a÷€€€€€€€€€ÀÀÀÀÜÀ¦Êð […„;Ž6˜’:Ÿ™?¤›6 Ÿ>¢£9¦¢:®ª>°¦6¹©=»­;µ±>µ´9·¶?º°>Œ‹F‘”Fš“JžŸA›˜MœQžšZ¤žB N¨›@§¡E«¢C«¥A­¢A¬¦F­¬C«¨O¤¥U®¤T©¦Y©ªR¯°N´¦H³ªE³¯Gµ«A·©G·«E¶¯F´«Hµ¯M¹®M¾¯H½¯M³­Q³­S³¨]¶¯\¼¯T°±C²±D´°@·³A²±L¶²H»±A¹µC»·G¼²D¿µA¿µC¿µEº±H¹³M¸´J¼°J¾·J¹º@¾¹D¿¸K¿¸M·±Yµ°_´µY¿´[¼¶\¾ºV¸»[¬«t³¨k²®j·¸f¼ºzº>ǹ?ɾ?Á´EöGÄ·JÁ¹AûAùGÁ¿AÿEĹ@ŽCǼAÁºMüOĽJÉ»AɽAÊ¿DɽI̾H»PúSǽSÁ¹[Å¿[ľ^É¿QɽYümƺhȽ`ûsľvÂÀ>ÇÅ?ÅÁBÇÂGÆÄDÄÃJÇÀKÇÀOÆÅHÈÁBÊÁEÊÅDÌÁFÌÄFÉÁHÉÅJÌÁHÌÄIÍÅMÊÈJÍÈKÎÌNÆÅRÇÆWÆÂXÉÂWËÁWËÅVÍÄQÊÁXÉÁ^ÎÂYÍÂ]ÌÆ^ÉÈQËÊUÏËSÐÉUÐÌTÑÊ[ÒÈ^ÒÎ_ÅÁaÇÆeÆÉmÊÁ`ÉÁeÊÆdÏÆeËÃkÈÀlÍÇmËÈmÎËnÆÁrÅÆzÎÈpÑÄeÔÆfÑÄiÓÊaÐÊfÕÌgÓÍiÕÌiÑÉqÑÌwÒÏzØÏpÔÑj×ÑmÓÒsÖÐpÖÓvÒÑ~ÕÐyØÒrÙÓuØÐzÙÒÚÔxÚØ}ØÏ’ÕÖ‚ØÑ‚Ø×‚ߨÜÝÖÒ”ÔÕ‘×Ö¯ÝÞ ÜÚ¬ÛÙ±ßá›áÞ‘áÜ”áߣçÞ©æâ¢éå­áâ¾çë¹èå°êé´éè»æçÁìçÂèæÊc c ÿûð  ¤€€€ÿÿÿÿÿÿÿÿÿÿÿÿ,þx©KX©SŸ>• „åÅ{)«Ví/dÎý”%D…|mÓÕìÕ­S¥ºÑá#˜1†p‘J5‡Ï8lø¨àK˜Z :J"¢ƒ.S:6U<1X=2X>5\>0]?4Z?8\@/^@0^@3_B1^A5\A8`A3`B1aB2cC3bB4cD3dC6dE3dD4dD6eF4fE4fE6gF4fF6`B8aE;eF:fGvR=xR>zT>^WSdH@jJAnN@nNDbWUqNAuPAyR@zTAzUF|SC}U@}VF|VHXA~XJ€VBWDXA‚XE„[C…ZE†\DZK‡\H†\Lˆ^E‰[H‰\HŒ_JŽ_L‹`GŽaH`Lƒl[bI’aL‘dJ“dL”fK•gL—hN˜hMœkO›kPžmP¡nR£pS¦rTªuV¬vX±yZ´|[µ}\¸~]»€_¼_–ŽŠ™ŽŒÿûð  ¤€€€ÿÿÿÿÿÿÿÿÿÿÿÿ,~àþmH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sÌ¢³§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§kHJµªÕ«X³jÝʵ«×¯`ÃRí&¶¬Ù³hÁI˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿~iH\ƒ°áÁˆ '>¬¸1ãÇ‹#;– y²åʘ)k¾¼93çÏžCw š´èÒ¨O«6Í:uëÕ®c‡&+ûõfÛµs‡^«÷ißÀ{_¶Q˜8 ãÈ‹+?¾<9óçΣ ‡MKóëбKÏÎ}»wíà§þKý½;xóèË«/~øùõéßËOßypê÷ó·Ç¿_?ÿÿþØß€[ˆš€&Ø| .‡àƒ>fÝ€*áTV¦˜`nèa‡ ~(bˆ$Žhb‰(ž¨bŠ(Òàâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@)äDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜d–iæ™h¦©æšl¶Ù&nÆ)çœtÖiçxæ©çž|öé矀*è „j衆r@ƒ¢Œ.êh£>*i¤”Nji¥˜^ªi¦œnêi§ ~*j¨¤Žjj©¨žªj¤¿¬êjªþ°¾*+EÌjk¬•Þª+®»öÊ믾 ì°ÂKì±Æ&‹ì²Ê6Ëì³ÎF í´ÒVKíµÖf )Üvëí·à†+î¸ä–kî¹è¦ë­¶ìbK©»í²/¼ôNZï½í2úíÝòË­¿,p¿ÿ[pÀlðÂ3¬pÃ?,qÂw»èºû{±¢gÌíÆ4tü±Èì±¾%£²É#³œ2È$¯¬2Éàn¬îÍ8ç¬óÎçÚÌóÏ@-ô·>môÑH[tÒL7môÒNG-µºPOÍ4([­´Ö@WÍuº^-öÔam6ÒeŸ­öÐi¯í¶Îm¿-÷ÍqÏm÷Ýxç­÷þÞ|÷í÷߀ËïànxሮxâŒ/îxã?.yä”Onyå˜_®yæœoîyç .zè¤nz騟®z꬯îzë°¿.;ë¿Änûì¸'>Äí˜óžûï¾üðÂOüñÆ'üò•3ï¼ò™o ýôÔWoýõØg¯ýöÜwïý÷à‡/þøä—oþù觯þúì·ïþûðÇ/ÿüô×oÿýøç¯ÿþü÷ïÿÿ  ؾzð€Û3ÈÀ:ðŒ 'HÁ Zð‚Ì 燅 zðƒ ¡GHšð„(L¡ WȺÐ~Ø@ g(ÃÒð†6Ì!w¨Ãòð‡þ> "‡(Ä"ñˆFL"—¨Ä&‘‰Pt¢£HÅ)êPXÌ¢·ÈÅ.zñ‹` £ÇHÆ2šñŒhL£×ÈÆ6ºñpŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>úñ€ ¤ IÈBòˆL¤"ÉÈF’±ŽŒd‰ ÉJZò’˜Ì¤&7ÉÉNzò“  ¥(GIÊRšò”¨L¥*WÉÊVºò•°Tc40ËZÒò–¶Ì%.w©Ë^òò—º„0‡éËbó˜ÆL&2—©L[2ó™Í„æ2¥ÍjRóšÖÌ&6·©Ínró›Þ '8Ç)Îr’óœæL':שÎv²óîŒ'<ç)ÏzÒóžöþÌ'>÷©Ï~òóŸþ (@*Ђô M(B™™†:ô¡¨D'JÑŠZô¢ͨF7ÊÑŽzô£ ©HGJÒ’šô¤(M©JWÊÒ–ºô¥0©LgJÓšÚô¦8Í©NwÊÓžúô§@ ªP‡JÔ¢õ¨HMªR—ºT dÀ©P}ªT£JÕ©ZµªX½ªV³ÊÕ­zµ«`ýªTêÔ±–õ¬dM«YÕŠÖµºµ­pe«\ß:׸Òõ®vÍk]÷ŠW¾êµ¯€ý«`ýJØÀv°†M,\±€ØÆ:€jdŸ:YÈJö²”Ŭe3ËÙÍz¶² Õlh;KËÏF•´¢MmgKÖÑšµ°}þ­l]K[ÕÎÖ¶µme[‹ÛÞêÖ··ý­pƒKÜÜÖ5·Å.r—«Üæw·Š=¬t£K]ÇV—°U½®v­«×ì¢Õ»Óý®XÃJÞñš·¼è=¯zÓËÞõº·½ð}¯|ãKßùÚ·¾ø½¯~ÓKýú7¿~¯ þKà¬øÀNðz1Àà;øÁް„'Lá [øÂΰ†7Ìá{øÃ ±ˆGLâ›øÄ(N±ŠWÌâ»øÅ0ޱŒgLãÛøÆ8Î±Š¡ ãwø©>²‡Lä"ùÈHN²’—Ìä&;ùÉP޲”§Lå*[ùÊXβ–·Ìå.{ùËJÖ˜Y ƒ1›ùÌhN³þš×ì` `ÀÍp~³œãLç9Û¹Îx¾³žóÌç=û¹Ï€þ³ MèAºÐˆ>´¢ÍèE;ºÑ~´¤#MéI[ºÒ˜¾´¦3ÍéMÏÙ µ¨GMêR›úÔ¨NµªWÍêV»úհ޵¬gMëZÛúָε®wÍë^ûú×À¶°‡MìbûØÈN¶²—Íìf;ûÙÐŽ¶´§Míj[ûÚØÎ¶¶·Íín{ûÛà·¸ÇMîr›ûÜèN·º×Më XÀÝð~·¼ãMïyÛ»Þø¾·¾óÍï}û»ßÿ·ÀNð¼à?¸ÂÎð…;¼á¸Ä#Nñ‰[¼âÇøÅ7®ñŽÿ» ¹ÈþGNò’›üä(O¹ÊWÎò–»üå0¹ÌgNóšÛüæ8ϹÎwÎóžûüç@ºÐ‡Nô¢ýèH:’Îô_ éPºÔ§Nõª[ýêXϺַÎõ®{ýë`»ØÇNö²›ýìhO»Úמö¥³ýèO»ÜçN÷ºÛýîxÏ»Þ÷Ît]Ø\ |OøÀ~ð‡/<â¯øÆ'þñŒ‡¼ã#?‚È[~ò“—¼æ/¿yÌwþóœ½çEúÑ›¾ô¨'½êO¿úÔ³þõ®}ëg{Ú˾ö¸¿½îmÏûÜ÷~÷¾>ðQOáÿþøÆO~b€üá7ÿøÎWþó¥Oýè[úׯ>ö·þ¯}áþûˆ¿øÃOþñ›¿üè?¿úÓÏþõ»¿ýð¿üãOÿùÛ¿þø¿¿þóÏÿýû¿ÿø€8€X€x€ ˜€é'ø€8Xx˜¸Øø ‚"8‚$X‚&x‚(˜‚*¸‚,Ø‚.ø‚0ƒ28ƒ4Xƒ6xƒ8˜ƒ:¸ƒ<؃>øƒ@„B8„DX„Fx„H˜„J¸„LØ„Nø„P¸º…;Tx…X˜…Z¸…\Ȃׅ:ènTèAøn`¨ƒfx†8˜†jˆ‚dˆl؆4X°‚o(‡H‡xXƒz¸‡3¨‡ 8ˆ‚Xˆ„xˆþ†˜ˆˆ¸ˆŠØˆŒøˆŽ‰8‰’考W‰”˜‰˜¸‰šØ‰œø‰„xu艤ЦXЍxŠ–8Šª˜Š®ØŠ°˜Š¢‹´øŠ¶X‹‘8‹·¸‹¸È‹¯¨‹½Œ¾(Œ›ŒÃxŒÄˆŒ¡ˆÉØŒÊHŒ¢øŒÒèŒÁH‡pØ˜Ú¸ÜØÞøàŽâ8ŽäˆÑXŽè˜Žê¸ŽìŽçØŽðò8hôxø˜ÝøŽúØþüø9ãy™— ÉÙÙßçY‘þø™‘ðˆ‘Ù‘éÈ‘’â’"Y’ûh&™’áH’*©’,Ù’&ùþ’ôØ‹æH²ˆ’)x7§“XÞø÷¨“`P”@‡E‰”L¹”N¹”HI‡tH”Ty”Cy•U™•X¹•`”^ù•`Y”à ˆÙ808@‰Žé À@ùÐdÙ 0"Ð=à>Ð/À 0tÙ — —déŒI‘d™˜ù˜ 0™9™ À ™ °™—”i™y™“ù˜ °(€*€š)07€¨‰%›±‰$@§i›µ™›¸I›$P½©*9ÀIPV H<€R€xà„@ —0 –àk€_ Kþ )à<°*`âi@žð @˜à pðŸ,ð~ OpZ WpQПLÀJð*÷yL0 ªi0gpd0eÀlà ]À\àÚ`]С\@ ¢Ê¡! ¢c0¡nuÀ…0 Žà›P ŽÀ¢¢` Â` ª€ ±  ˜à}zà˜0zHš¤y°{„•0 ½ À «0 »À Àà ¾€ Ô@ Ò  Èp Ç@ TJ ˜P —Ð Äà ÇÐ £ ™0 £ ±P © ­P § ° ŸÐð þ¥à§³€ ¹€ µ0 °P  ð ¡Ð ¡u0v €‚p‚Ú‡p’ žð Úœ Ÿ  ˆ ©  К °€ Ï ÑÐ ‰Š Æ ÐÐ Ëà«Ûà Þã@ç¬äÜ ß Ø` Ö0 Ð` Øà¬Ïz × Î° Ëà ЮáÊ ÆP ¯ ³P ·°®ˆÚ«¹p ³à ·ð Õ° Ú° àà ÛP º: ¡À  à¨Œ Šð’°; ·à À ¡   œÐ ±œÀ† ŒÀ±Œ±¥p¨ïZ ꊨ¹ Æ ¨·þ ÆÐ Í É³Æ°²Ãà­Â í…þn~ñ9Náø»¼[<¹Xüئ0Þ—_ÄØ=²»Ú«¦ëàƒ­½¥ûµRÛ«-¬ à0°?à°ÐÛP§½éðÚà`]Û`ÑÕÒÎáyíÒ ék×Ýþ±Œ ‘þ{ºÏ˽®ðèÊ É¦ì¼5Ͷñ*À©°Žô¥\±ËüP·Im¶¶ŠÀ÷úûÔ«µ%<÷÷𝿰ì€Ú¨­é ìàñîëС[ÇNàÀtèÆ=«ÕIÐ:þÜ¡ø¤P©Jqzô¨SÆZÆšE‹Ö,W-X©@ub)IGŒ©Bqäjå#F%‚ĉ#£œ)’ª¨ÌGDCÁ¢…«Ù³gѪ‘ÔVÎ\¹qå¶k—Ü6qæÐ™S×Î;xñäÅ‹÷Î]»cÅ¢ç\9m¸R%ªÄ?‚ 1"œ³f(PgݺEËU'I\ÕjìªT©•œXr|Ùf§Gþ¦b¹šU«­” %ökè! N3IšŒV­\Ѳf%èNž¼uÞ¤>Ëe¬Z8ÞéÔ%7î«8pÚ¼«†ëö­Y¡Xjï(‰°¢œŠ ÞQIJcçF%u”̘֬÷³R¦‚ÿ®\¹’»UÌ4°Æ §c`E3PyÈ"EB±l½TfIe=N\i*¿d ÒœºLÊÅ—`Éür!‘ÄZœŠ&*âä»,¥Ì8™%K“¦&섾”B±ÑG]aвün!2ªjžq†¤gŠY¦š«ÎÄ.ƒì0›lrPBñ‰E mZ³)£·âr± >ST1ó@NÖ{$6ú®u¯NF¡Cò’íÎG QD9äø‘óìR×5er©¦ÚÜܬ‘̇*2dÇT81D"@ÂDo3PJ©µHÇòÐN*Vì½ËR1…Ú~äQ¦P. Å»ÁÀAfƒ©×Šó¼Èh<Ј}ò)2þq™EØÏbˆñu\Iæ]xÌ*볬”T4–‰¥1•P5N,veÌM0Ó½-M;T#2©$¸bË8Ó¬£šzí™ØÎjòް‡‰ÉÊ¢6]¨#Ó®W‹€²LN"lʘ“ÆÄåmVl†ñZ†6ªîÄBö¦~SYdÄÖ‹lM?·[ÙµƒÇM™Z•Æ…Ð04“àš2cD^¦Ù;§¡šõ,eíØßœvlê–Ç$)å–§H2IÓc—•9ÜÑa1ð_ïyDÈ–•¸»Û þã 8`Všà ~æ/—õ(±Ù5sÐz•V’äüp¹ã–]ý!©-\IYP`:‚¥å#þYÙŒu+ŸÄÊ2,ñØÝ &îÙDt¡²&ò²‰ÜÌ{KäÞAi€`–fjt›ü˜5 옲ÂD¸¥‰N3*#ØzÆBýEÄ"Y|Ò‰SlªMÒÒ±fÓÍÉHá•'¯VA$"‚¸CDÌ78´Á o¸ƒ!”2›¤‚2¦ÉÅSš©\ †¹0R£v•‘&¦Jg>R—q8¨ÐT‘)XL´“—t,3IAÊ\q“ࢠëZ* óèÏ/wâÿR/vÂpÒÏIhaœj@êR™J$ó#©g¼*Îx#åŽ%ºX¹Èb×Z£„‚TŠ?þÁKþü×Ú.£²R\‹J"zF*¶PЂN/)X_V#žç'Ü_yš²§¢„ÄsJÆŠ’‘ŸWÂñ=ïÁÍSžQ élCÍŒ£õ°…Nw>¥Ψ¾vN¼Œ(:L ¸Øf=øHÈb–Šc+vX(› 2Ø_ƒˆÔQÍB"ÉŪÞåiÆðPlrÑJ:æ GA%*ÍØSb&SNmlc**¥Tœ1Nì8ª· }’§:jÁ¯jÔRŒSbY$%ZêÊ^å=.vQt€Í1-„¢kág©Ð’O}d(DÙèO—!͵Þ‹®F‰¤)ÑœJDGËÍC§$U²Áç¬cšþE.¢¢ Àj#•É ¬R‡œtFYãeWõ5yD}E¹œþÈLMXQKY 0JgØ4ØhM”±”ïCÇ ©é’ˆw©yídÉk×zæd,[Ö6~È(2´zÖ³I%>IYº©×5©±$XjdLzGÒÌZjœ´Úþ]WüÈÒô¬¬˜á«n•y£ªÚLpR¡ô2tDíLFå(>Ÿ2õ1Ž®7 3›•„¢¸,·c`}’‰R:®mcئ})½û!QÉÛ+Éáî8¤ëÝO2 ¤r¶cj,ÎRí#E‘èÉl0âsÚ¾f&àÍøãYSбÞZ!þ2ðƒ' -£x¿V¦‘{~7d÷˜M$öÖ\HxO°&‹_ž‰þ“_@³³½0ŸS 5›DæÜû¡úL^ÝòîÁPNè-³D·qý,Î<‹YRxf>äŸø¤ÖLó‡·ô+Mœì­×”ŠƒþZžó0âx@KÁcvÂ0ëDl1QåúŒaöÄóDnª­K:b*hÿ+´®J²K·¼1“3 C›)6Š¥çšŸ¸eŒeq ‰ˆ™yÁ›Ç"ž${ õ@º÷ë˜j /Õ©KÚçÊêáºÖ *ÖB®¬z+ÓØ/ÿ²¾6šœí338#²ýÙó‘˜w9£"¿Q³í•GÑ4íXÀ¾Àæ‹ Äˆ—¾ð¾èŒÃXþ‰ÂÃ,þ2 Ky#0T'ûج¶àSÀà$ÚŽYp»y:'”ØŒ3À‘o¬X:'$ô­À1¾”‰¡™©Ú_±³—9˜¡H²\“-ã+­b;=„CËØ—Ôx6;3µÂ—ÌaŠâ¥ÉÒx9ܪ”GA@:Ò*´òÄZ”6‹ú¢u¢¿ ÄÁ0÷9¢4* Ê0®‹9‰Å0‘ý’&ÇP.ù œÅ¦ÿÙÀÕ¸´3a EÙ<‰,Ó³(œ?|»ñªÅœÅŒ×H‰à$ˆ˜ˆô.Ó2&! ¦`œ·2‘mQ¼¬ñq!Ø£žRŒ¦!µ8;ÓŠ eµy²¹³B¾‚³ÅOªˆ;+Œ‡ù ñ"ÇÀ ² ™;NdœZ¢£B³–©‘/í° eÁ$¼ùÆC|{A„Š‚ðÀ› JC‹¯é‚À4ÜÁpŒ@¥ù8`,À`¡Š¢‹bÏ  2)w#“!Éõ¢£Z+Ÿé j™…ÜŸ™\—›úƒz6û#Œ¥©‚ýé¢-Êɉ`,Çú¡Oò¢¿Ê›ËÀ/œð’ŽÁ°¬!“ÒÀ…€;pygame-1.9.1release/examples/data/asprite.bmp0000644000175000017500000000110210367302405021133 0ustar vincentvincentBMBB( m m ÿÿÿÿÿ"""""!"!!""!""""!""""""""!""""""""""""""!""""""""!""""""""""""""""""""""""""""""""""""""""!""""""""!""""""""""""""!""""""""""pygame-1.9.1release/examples/data/arraydemo.bmp0000644000175000017500000022606607300416501021465 0ustar vincentvincentBM6,6(È€  ±Êõÿÿø ÿðÿðÿðÿõÿö ÿô ÿôÿóÿóÿóÿó ÿó ÿôÿö ÿ÷ ÿø ÿø ÿû ÿú ÿø ÿ÷ ÿö ÿö ÿ÷ ÿ÷ÿø ÿø ÿø ÿø ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ ÿö ÿö ÿö ÿö ÿö ÿö ÿø ÿø ÿ÷ ÿ÷ ÿ÷ ÿ÷ÿøÿø ÿ÷ ÿø ÿû ÿú ÿ÷ ÿô ÿ÷ÿ÷ ÿø ÿøÿúÿøÿøÿöÿöÿô ÿö ÿ÷ ÿø ÿú ÿú ÿø ÿø ÿ÷ ÿö ÿöÿöÿöÿøÿø þû ÿú ÿú ÿ÷ ÿ÷ ÿöÿö ÿö ÿ÷ ÿ÷ÿøÿø ÿø ÿ÷ ÿö ÿôÿ÷ÿ÷ ÿö ÿö ÿø ÿ÷ ÿö ÿô ÿô ÿô ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ÿ÷ÿ÷ÿøÿøÿøÿ÷ ÿ÷ ÿö ÿô ÿö ÿ÷ ÿøÿ÷ÿ÷ÿ÷ÿ÷ÿø ÿø ÿ÷ ÿ÷ ÿö ÿöÿöÿöÿøÿ÷ ÿö ÿö ÿ÷ ÿøþûÿú ÿö ÿô ÿ÷ ÿ÷ ÿ÷ ÿö ÿö ÿö ÿø ÿú ÿøÿøÿøÿø ÿú ÿú ÿú ÿúÿúÿúÿø ÿø ÿ÷ ÿ÷ ÿö ÿöÿ÷ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿö ÿö ÿ÷ ÿ÷ ÿú ÿúÿøÿ÷ ÿö ÿö þûýýûÿûþüýýûüþýþ°Êôÿþøÿòÿòÿóÿõÿö ÿô ÿôÿóÿóÿóÿóÿóÿôÿö ÿ÷ ÿø ÿø ÿú ÿø ÿø ÿ÷ ÿö ÿö ÿ÷ ÿ÷ ÿ÷ ÿø ÿø ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ ÿö ÿö ÿö ÿö ÿö ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ÿ÷ÿøÿ÷ ÿ÷ ÿ÷ ÿú ÿú ÿ÷ ÿöÿ÷ÿ÷ÿ÷ÿøÿøÿøÿøÿ÷ÿöÿôÿö ÿö ÿø ÿú ÿú ÿø ÿ÷ ÿö ÿö ÿöÿöÿ÷ÿ÷ÿø ÿú ÿú ÿø ÿ÷ ÿöÿöÿöÿö ÿ÷ ÿ÷ÿ÷ÿø ÿø ÿ÷ ÿö ÿöÿ÷ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ÿöÿö ÿö ÿö ÿ÷ ÿ÷ ÿ÷ ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿøÿøÿøÿø ÿ÷ ÿö ÿö ÿö ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿø ÿø ÿ÷ ÿ÷ ÿö ÿöÿöÿ÷ÿøÿøÿö ÿö ÿ÷ ÿøÿúÿø ÿö ÿö ÿ÷ ÿ÷ ÿ÷ ÿö ÿö ÿöÿø ÿø ÿø ÿ÷ÿøÿø ÿø ÿø ÿø ÿø ÿø ÿø ÿø ÿ÷ÿ÷ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿø ÿøÿøÿ÷ ÿ÷ ÿøýýüþûþûþüýüýýýýý¯Ê$óÿýúÿóþöþöÿõÿöÿôÿôÿóÿóÿôÿôÿóÿôÿöÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿöÿöÿ÷ ÿ÷ ÿ÷ ÿ÷ÿ÷ÿ÷ÿ÷ÿöÿöÿöÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿøÿ÷ÿ÷ ÿö ÿö ÿöÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿøÿøÿ÷ÿöÿöÿôÿöÿ÷ÿøÿøÿøÿöÿö ÿö ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ ÿø ÿ÷ ÿ÷ ÿöÿôÿôÿöÿöÿ÷ÿ÷ÿ÷ÿ÷ ÿ÷ ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿöÿöÿ÷ÿ÷ÿ÷ÿ÷ ÿø ÿøÿøÿ÷ÿ÷ÿ÷ÿöÿöÿ÷ ÿø ÿø ÿøÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ ÿ÷ÿøÿøÿøÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿøÿøÿ÷ÿöÿöÿ÷ÿ÷ÿ÷ ÿ÷ ÿö ÿ÷ ÿ÷ ÿ÷ÿ÷ ÿ÷ ÿ÷ ÿö ÿö ÿö ÿ÷ÿ÷ÿ÷ ÿø ÿø ÿ÷ ÿö ÿö ÿ÷ ÿøÿøÿøÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿø ÿøþûûÿûÿûþüýüýýýýýþû¯Ê&òÿüûþöýùýùÿ÷ÿöÿöÿöÿóÿóÿôÿôÿóÿôÿöÿ÷ÿ÷ÿ÷ÿöÿöÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ ÿ÷ ÿ÷ÿ÷ÿ÷ÿöÿöÿöÿöÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿöÿ÷ÿøÿøÿ÷ÿöÿöÿöÿôÿöÿ÷ÿøÿ÷ÿ÷ÿöÿöÿöÿ÷ÿ÷ÿ÷ÿ÷ÿöÿöÿöÿ÷ÿ÷ÿøÿ÷ÿöÿôÿöÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿöÿöÿöÿöÿôÿôÿöÿ÷ÿøÿ÷ÿöÿö ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿøÿ÷ÿöÿöÿøÿøÿøÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿöÿöÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿøÿøÿøÿøÿ÷ÿöÿö ÿ÷ ÿø ÿøÿøÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿøÿøÿøÿøÿ÷ÿ÷ÿ÷ÿ÷ÿöÿöÿ÷ÿøÿøÿøÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ ÿ÷ ÿö ÿ÷ ÿ÷ÿ÷ÿ÷ÿ÷ÿöÿöÿôÿöÿöÿ÷ÿ÷ÿø ÿøÿ÷ÿöÿöÿ÷ÿøÿúÿøÿøÿ÷ÿ÷ ÿ÷ ÿ÷ ÿ÷ ÿ÷ÿúýýûÿûÿüþüýýýýûýûþú®Ë&òÿûýý÷ýùýùÿøÿøÿ÷ÿöÿóÿóÿôÿôÿóÿóÿöÿ÷ÿ÷ÿ÷ÿöÿöÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿöÿ÷ÿ÷ÿ÷ÿ÷ÿöÿöÿöÿöÿ÷ÿ÷ÿ÷ÿ÷ÿøÿøÿøÿøÿ÷ÿ÷ÿ÷ÿ÷ÿøÿ÷ÿöÿöÿ÷ÿ÷ÿöÿöÿ÷ÿøÿ÷ÿ÷ÿöÿöÿöÿöÿ÷ÿ÷ÿ÷ÿ÷ÿöÿöÿ÷þøþøÿ÷ÿôÿôÿôÿöÿöÿöÿ÷ÿöÿôÿôÿöÿöÿ÷ÿ÷ÿ÷þøþúþúÿöÿöÿ÷ÿ÷ÿøÿøÿ÷ÿ÷ÿøÿ÷ÿôÿöÿøþúþúÿøÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿöÿöÿöÿ÷ÿ÷ÿ÷þøÿøÿ÷ÿ÷ ÿ÷ ÿ÷ÿ÷ÿ÷ÿøÿ÷ÿ÷ÿöÿ÷ÿ÷ÿøÿøÿøÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿöÿ÷ÿøÿøÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿöÿöÿ÷ÿ÷ÿ÷ ÿø ÿøÿøÿøÿøÿ÷ÿöÿöÿöÿöÿöÿ÷ÿ÷ÿ÷ÿøÿ÷ÿöÿ÷ÿø ÿúÿúÿøÿ÷ÿ÷ ÿö ÿö ÿö ÿ÷þúýûýûüýüþüþüýýûþøþø®Ë(ñÿúþýùýùþ÷ÿøÿùÿ÷ÿöÿóÿóÿôÿôÿóÿóÿöÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷þøÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿöÿöÿöÿöÿöÿ÷ÿ÷ÿ÷þøþøþøþøÿ÷ÿ÷ÿ÷ÿ÷ÿøÿ÷ÿöÿöÿ÷þøÿöÿöÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿöÿöÿöÿ÷ÿ÷ÿøÿ÷ÿ÷ÿöþøþøþøÿ÷ÿôÿóÿöÿöÿöÿöÿ÷ÿ÷ÿöÿôÿôÿöÿ÷þøþøþøþúþúÿöÿöÿöÿ÷ÿøÿøÿ÷ÿ÷ÿ÷ÿ÷ÿôÿôÿ÷þøÿøÿøÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿöÿöÿöÿöÿöÿ÷ÿ÷þøÿøÿøÿ÷ÿöÿöÿ÷ÿ÷ÿ÷ÿ÷ÿöÿ÷ÿ÷ÿøÿøÿ÷ÿöÿöÿöÿ÷ÿ÷ÿ÷ÿ÷þøþøÿ÷ÿöÿ÷ÿ÷ÿöÿöÿöÿöÿ÷ÿ÷ÿøÿ÷ÿøÿøÿøÿ÷ÿ÷ÿöÿ÷ÿöÿ÷ÿ÷ÿ÷ÿ÷þøÿ÷ÿöÿöÿøÿøÿøÿøÿ÷ÿ÷ÿöÿöÿôÿöÿøþøþøþøýûüýýûýúþøÿ÷­Ì)ïÿùÿüùý÷þöÿøÿùÿ÷ÿöÿóÿóÿóÿóÿóÿóÿöÿöÿöÿ÷ýúýúÿ÷ÿöÿ÷ÿ÷ÿ÷þ÷þ÷ÿ÷ÿ÷þøþøþøÿ÷ÿ÷ÿöÿöÿôÿôÿôÿöÿöÿöÿ÷ÿ÷ÿ÷ÿ÷þøÿ÷ÿ÷ÿöÿ÷ÿ÷ÿöÿöþøýøýøþ÷ÿ÷ÿ÷ÿöÿöþøþøÿöÿöÿ÷ÿ÷þøÿ÷ÿ÷ÿöþøþøþøÿ÷ÿôÿôÿ÷ÿ÷ÿ÷ÿ÷þøþøÿ÷ÿöÿôÿôÿ÷þøþøþøþøÿ÷ÿöÿöÿöÿöþøþøÿöÿöÿöÿöÿôÿôÿöÿ÷ÿ÷ÿ÷ÿ÷ÿöÿ÷ÿ÷þøþøÿ÷ÿ÷ÿöÿôÿôÿôÿôÿöÿöÿ÷þøþøÿ÷ÿöÿôÿôÿöÿ÷ÿ÷ÿ÷ÿöÿöÿöÿöÿöÿôÿôÿöÿ÷ÿ÷ÿ÷ÿöÿ÷þ÷ÿ÷ÿöÿöÿöÿôÿôÿöÿöÿöÿöÿ÷ÿöÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷þøÿ÷þøýøýøýøþ÷þ÷ÿöÿöÿöÿöÿ÷ÿ÷ÿ÷ÿ÷ÿöÿôÿöÿöÿöÿöÿôÿôÿ÷þøÿ÷ÿ÷þøþø©Ò1ìÿ&õÿøþúüûú ýù#ÿùþö!þô#ÿó#ÿóÿñÿñ!ÿó#ÿó!þô!þô!þô!þö!üø!ûúüøý÷þöþö!ý÷#ü÷$ýö#ýöý÷üøüø!ý÷ý÷ý÷þöþöÿôÿôÿôÿô!þö!þö!þö!þö!þö!þö!ý÷!ý÷#ýö#ýö!þöþöÿôþö!ý÷#ü÷#ü÷!ý÷ý÷þö!þô!þöüøüøþöþöý÷ý÷ý÷ý÷!þô!þô!þö!þöý÷þöÿôÿôþöý÷þöþöý÷ý÷ý÷ý÷þöÿô!þöý÷üøüøý÷þöý÷!þö!þö!þö!üø!ý÷þöÿô!þô!þô!þô!þôÿôÿô!þö!þö!þôÿôþöþöý÷ý÷ý÷þöþö!þô!þô!þôÿôÿôþö!þö#ü÷#ü÷#ýö#þô#þô!ÿó!þô!þö#ýö!þöþöÿôÿôÿô#þô#þô#þô!þö!ý÷ý÷!þö!þô#þô#þô!ý÷ý÷ÿôÿó!þô!þô!þôÿôÿôÿôÿôþöþöþöþöþö!þö$ýö(üö*üö-ûö/ûö-ûö-ûö+üô*ýô(ýô$þô#ÿó#þô#ýö#ýö#ýö#ýö#þô!þôþöþöÿôÿóÿðÿïÿïÿïÿðÿðÿñÿñ¥ßBêÿ6ïÿ/óÿ-õÿ,öÿ5ýÿ4ýú5þú8ÿø7þö7ÿõ5ÿô5ÿô8ÿö8ÿõ8ÿö5þó5ÿø6þ÷5üø6ûù4úù6üû5þú0üõ6ÿù4þ÷4üõ3ýö1üù6ÿþ1ú÷4ýù1úö2û÷1ýø2þù1ýø1ýø0ü÷1ýø3ýö3ýö1üó2ýô4ýò2ýô3ýö2û÷8ûø:üö6ûó6ýõ1ûô0üõ1ûô5ÿ÷1þõ.ýõ1ÿø.ýõ4þ÷4þ÷3üù4ýú3üø4þ÷3üø3üø3üø3ýö5ÿõ5ÿô8ÿö7ÿõ8ÿ÷4úô5ûõ7þö6ÿô6ÿø1ýö3ÿø2ÿö2ÿö0üõ0ü÷0ûø2þù1ûô0ü÷1üù0ûø3ÿú0ü÷4üû0ø÷/ýø/ýø/øõ3üø/ûô.þô1ÿó5ÿ÷7ýù7ûõ4üñ3üñ6ýõ5þõ5þó3ÿò3ÿó0ýô4ÿù1ýø3ÿú5þú4û÷7ýù9ÿû6üø6þ÷2üõ1ýö1ýö3ýö7ý÷:ûø<þø:þø7ÿ÷3ÿ÷/üó2û÷3üø2û÷3ÿø0þò3ÿ÷2û÷3úö5ýö5üø1üù1üù3ýö2ýô2þò4ÿö1üù6ÿü4ýô6þó8ýõ5ùó3üó3þõ0ÿö.ÿö0ýô2þ÷0ÿ÷1ÿø6ÿù6ÿö9þö@ýôGúñRýõXýõXûó[ÿùVþ÷NýóJþóHÿøAÿ÷<ÿö9ÿö=ÿø:üö4úô3ûô5ûõ5ûõ8þü5þû6ÿù1ÿó,ÿî.ÿí#ÿâ'ÿå,ÿç)ÿä(ÿå'ÿäeÓ‘ú•ò›ñ ›ðžâ#²×@ÒÞ=ÑÑFÚÔGÙÔC×Ï?ÚÌ=ØÉ>ÖÉ=ÔÊ7ÎÄ8ÏÆ3ÉÃ/ý-¿º'¸¶*·º8ÇÊGÙÙTéåIáÛCÞÕ<×Ð@ÚÕ@ÙØ@ÙØ?ÕÕCÙÚAרFÞßBÙÝEÜàGÞâGÞâMäèMäèPæçLââIàÝHàÛBØÒBÚÔCߨOçâZæçSÚÜLÔÐEÑÊ6ÈÃ5ÉÃ=ÓÍ7ÐÇ;ÙÍ8×Í.ÏÇ6ÔÎ9ÔÏ9ÒÏ8ÐÑ:ÒÓ<ÔÕ8ÐÑ3ËÌ6ÎÏ6ÎÏ<ÕÒ<×Ð<×Î6ÐÅ/ƽ'¹´,»¹BÎÏMÜÚPäÞGà×>ØÓ?ÙÔ@ÜÕ?ÛÔ=ØÔCÜÛEÜàDÚàEÝÞBÛÜ@ÙÜ@ÚßDÝàFßâFÜãHÞäGããEßÞJààIàÝ=ÖÓ3ÏÈDá×YñëcóôaíìWåÞEÔË8ÈÃ3ÅÀ1Ƽ.É»1ÍÂ4ÑÇ6ÔÍ9×Ñ?ÚÖCÜÛ<ÒÒ:ÍÏ5ÆÈ5ÆÈ3ÇÇ4ÍÌ9ÓÒ9ÖÒ4ÐÉ.ż7ÄÁ8ÂÁAÍÌGÙÕIáÜAÛÖCÝØAÚ×DÛØAÙÔHàÛFÞÙFÜÜHÞßIÝÝIÝÝGßàHáàFÝÚAÙÓ>ÚÏBßÕGâÞKáá_îìXâáSÝÜ@ÍÊ8ÊÅ1È¿-ÊÀ4ÓÉ5ÓÌ3ÑË4ÓÏAÜØ:ÏÌ£ž– ”K°¨gº²uµ¯º²~¸³~½´t¹¯X«£0œ–!Ÿ™¥>ÍÄ?ÊÆ3À½%·³±­¨¤"±¯>ÍÐNÞãPææJèÜ=èÎ%â¯ëš ïŽîŽ íŽî î"é%ê(æ&â'æ4Ð >–=t›B}‡MІM‰ƒD…|C‰|>‰y?ˆxA‰|Aˆ~Dˆ<x2rl-ih!Z[OR TZb˜Ÿ‰ÃÈÇÀe±¦Z¦¢L––Ršš]¢¥Y¤V›¤a¦°e©¶a¤³g¬½g«¾k¯Âz¾Ñt¹Ê|¿Îx½Çr¶½o´·_¥¥SœšU£œ„ÎʵÁ|¨µr›ž^ЉK}{E~{?zI†EƒE”‡D–ŠC“ŒBŽK•™?ˆM•Ÿ:‚Œ7‹89€Ž8ƒŒ;‡T¡£G”‘=‰…,spXY?E*^km£®y¹ºt¹¶_¥¤VŸTŸU¡ \¦ªa©±Z ­_¤µd©º`§µ`§µc«¼g¬¿f«¾l®Áq´Ãj±»q·¾o±¶s¶¹] £GŒ]§£ÕÔ¢Þä”È··¸j›™F~7sr/tj3}q6„y>„F™‘D˜”A‘S £I‘˜Cˆ‘:}†9|…%js"ks7…‹R¢£K›”1zr$`_']^“C•–\§©i©­89&„MH°PPÁMLÀOL¿NK»LJ•ED# 95ÿABìFG…%%, LTTLY[GVY@OR2@F.9AGU†” ¬ÀÅ›¶²ˆ§ w—–v–›œ¥|˜£|˜£ž¬‚Ÿ®€ž¯}›¬°ˆ¤¼‰¤¾Š¥¿Œ§Á˜³È›µÆ›µÃ“«·˜®¹†ž¤v“—|™¢»¿´ÄÊ«­µŸœ¥ˆ‰“ow~dvubytc‚{`‚{aŠƒbŽˆfj”y¥nŽ›h…”VrƒOm~FgwHkyX|†r™›uš–g‡‚bxvYei^enbhs—Œ¥©…¤¥ƒ¥¥}œŸ…›¦†œ¨Œ¡°‹£¯¦°Ž§±¥±‹£¯ˆžª€š¡}œ£ˆ­£‰¦£– ±²°ÆŸ™ª“šw}‚n|{\ukVzlQs^‡h”“vœ v–›p†Œ$(- "` ÛBCÿFEÿC?ÿB<ÿEAôDCÆBB] "#U^aP\`CQW;FNBHS]]m…‡™Œ’¥Œ§¤{»>¸Fçù ÷ ÷ ù ù ÿ ÿÿÿ ÿæ5>­t³lygw}`tuUlhKf\GeXIm]Ei[HpeMtlUzp]€v`x_xt]opWdfENQDMQdmzŽœ¨›²´Ž­ª„¤£w–—y–š€š¡œ¦† ®† °†Ÿ³Š¢¸¥»¥»š³Ç™±Ã–°¾”­·“­´¦ªy˜—uŸ”ª¢‹¥« ­”–¨‹…–—™…~…„‡Œo{{^umXykW~n]ˆ{eŽb_Šb‰‘p“ iˆ—kˆ—oŒ›d„‘aƒY}‡]ƒˆk“’l’Œ_€yPhfDT[(4@OZhƒ” ¸¶“²«y˜•v•˜z—žœ¥ƒ ©¨ž¬ƒ ®ƒ¡²…£¶ˆ¢ºŠ£½ˆ£½ªÄ™²Ìœ´Êž·Ç“«·–¬·“ª²€¢p’‚ ¡›²´§°¹££¯‹‰•wx‚py|hyv]tpWvo[€xZƒ|c‹‰j’‘o“™b…kˆ—^z‹Zv‡PnLkzNq{`†‹dŠŠr•‘b€{ZomYdhZ^ikq~‡—žŠ ¥‹©ªƒ¢£~› ‚œ£‡Ÿ«‡©ˆ¡«‡ ª‡Ÿ«ˆ ¬ˆžªš¤œ¡€¢¡|¤™v˜‘‡š¡¡¨·¤£³”žŠ‹•s|cxpQqfQ{pW†~f‘Žc‹ŠdŠŒh…‰FRV8©)*ðDDþB=ÿ>8ÿ?<üBAçDBš$#. DGKR^`LZ`R]eY_jegrwx†’¤‡œšrª;±Bäøø ø ø ÷ ÿ ÿ þÿ ÿà9@­u~°mxŒcuvVlgD_V6VK1TF:aQ9eTAm`EsgLwnT}v\y\}vXtnSheQ^`LV]NR]u{ˆ–¢¬š°µ€¤žr˜’v“—{•œœ¦ƒ©‚«ˆ¢²ˆ¢³Œ¦·”®¿™³Ä—°À”®¼¦°Ž¨¯Ž¥­v’“zœ•¦ž‡ª¦‰¦«Š–¨‡ˆ ˜©• ŽŽ”q{{\olPmdQtfb‹|bŒ…X‚Xƒ†[„lœg„“y“£k…“mˆ–Ro}Kl{Nr|Yƒt›™lއPniDY[9HQ5AMZht—«°¢¼¼‡§¢x™•u”—x•ž{–¤tv”ŸŸª‚¡°°™µˆ ¼‹¤¾ˆ£½Œ¥¿‹¦»œ³Ã‘©µ”ªµ‘«²€¢t“–~¡’±°™®¶˜¡®Žš„~‰sv{mtw_mkawrVunSxpbˆ‚f‹h‘jŽ–t‘Ÿe‚‘YsƒWr€MhvEcnRv~X}l‘n‰_|s\qnT^eQU`ru„–£¢¤„£ ~ š{œ|˜Ÿƒœ¦‡¨‡¨„ž¥„ž¥‚›¥~—¡~˜Ÿ~ ƒ¨¤uœ”„§†œšŸ¥²™—ª‡‡“z€‡hwyVnlPrlVx\‚|^ƒY€~XxwATW %gÎ@?ö?=ÿ=:ÿ87ÿ=;ý@?Ë86K [`cYeiVck`mumw~y~‡Œ|Œ‹nžz=ªCâöõõ÷ö þ ü ÿ ý üÝ08£kx¦]m}RieEbY5XJ.RD)SB5bQQ Í=<ô=;ÿC@ÿC?ÿ?=ï?>¿;;V''asrcy~a{]zb†fƒˆhƒE~W07 âóô õ ö øÿÿÿÿÿ â#4›F\…2QZ%MB L?%VF1bRG{jZiž•w¨ªw§­t¢ªm›£]“ZŠŒ^‹c‰_„€XwvRhmL\cMV`\fpФޭ®z¦¥s¤¢už yŸ£yŸ¤{¢ª|£¬†¬¸Œ¯¼°½±»‡«µ‡§²‡§²¢¬~¢¬yž¦oœŸs¬£n¬ s¯¥¯°–®À±¾Ô𩲅œž^€KunIymJ€sW’ŠW‘U’\’™X‹•P‰Hw9go.\g&T_#RZOR?uuq©¤€³«e”ŒIqlEgg-JO4ýCBÿB>ÿ><öA?Ü@@Ž %EZX]yyZ}€X|‚U{€Z€‚P|o=yP)—1Þòóõ ö øÿÿÿÿÿ!â.•7Qy,MV+UJ/]P8iYK|l`“…n¢˜~±ª‡´·†°·ƒ©µ~¤°k“ŸZ…ŽX…‰]‹ŒbŒ\„PqmD\\JY\V`gkx€|’˜¥¥|«¨t£¡nœwŸ¤{Ÿ©x›¥‚¤±¡®£­£­~¢¬ƒ¦°¢¬£°} ­t™§m™ q¤ m¥šrªy¦£¥º»Äߣ®¼‰™Ÿh‚ˆZ||ItkEwkN…|T‹ˆQ†‰U†ŽN‚‰Bv}6il1dg/ag*\b;lnCuua—’|²«yª¢h’‹OrnFef5TW9?.:Tbn“¨°ž½À‡¯ª|¨¢o–˜s˜ t›¤vžªz ¬|¢®} ­{ ®„©½’·Í“µÍ’·Í«¾–ÁÒ’¹Çбº‘µ¿±¹…¨¬{¡¡t£›w¨ ‚±¯•·½—§·Š‘¢…†”ˆ‹“t}€burSrkT{sd†d“‹Wˆ†N}Es{KxƒQ{‡Jw‚?pz9kwOEz„UŒc••uœšc|8LG!  !.0HWZrˆŽ€–œM]c  AFO„‰’{ƒŠnz~]oph~|p‰…y”w–yš“‚™ƒ’”&00XÁ;;ôDCÿB@ÿ@<ýB>ñA@À;8B%"XztY‚}Q{zV}V}{Rq=|P(™1áõôô ô ÷ÿÿÿÿÿ!â-“0Mt(LT3^S=n`I}l]‚r¤˜‚³«Ž½ºº½´½…§´t•¤gŠ˜Z‚ŽP|ƒS€ƒ`i—‘_ˆNniMb`JVZS\f€˜Œ©®ƒ«ªx§¤pŸœqœŸwœ¤}Ÿ¬}Ÿ¬„¤¯€£­} ª€£­ƒ§¯{ž¨€ ­z›ªuš¨oš£mžq¦r©šu£“«½±¼×§°¾Š—Ÿs†RpqIoiBpdK~vS†‚T…‡Sƒ‡Fy|;qrEyyI}}Rƒ…W‰‰d–’m ™q¤€±©w¤›fŒ†XwtJff>Z[)AG)8AP\h‚’Ÿ™°¸œÁ½«¤rœ›p™œsš¢wž§xŸ¨v¦v™¦{ž¬…©»†©½ˆªÁ„©½}¨¹“½Ê•¹ÃŒ­¶ ©d€‡Nhn]yzr•‘y¤›~¯§„®­‘­¸•¤´’—¦œ€„‰pzz\soUvo_‡{aƒV†€OU‡P‡Hv~:hp;ltCv€P‚ŽQ‚ŒZˆ[‚„Feb&!    .=@ &: 3 gisv{„pv}clp^jn`oqm~m‚o†m‚p}S\_7˜'%ðFEÿA?ÿA?þ?<üA=ÚC?{$"# >aWPvUƒ}S€}U~yOm:{N$•-ßóóô õ öÿÿÿÿÿ!â),Js3Zb?maFykTŠyc–ˆs¥›ˆ¸²¹º†°·z ¬{œ«r‘ e‡”Y}‡IpxIsxR‚h”“rž˜^„~MhdFXYBKTXaov†–ˆ¤«„­¨u§r¡Ÿq› y§}Ÿ¬…¥°ƒ¡¬ƒ¢«‚¡ªŸªŸªœªŸ¬zœ©wž§l˜™n¡šx­£w§¡‚¢¯ ³Èž©·˜¢¬‚’˜d||OqkGphQ}vK{uVˆ„R„‚VŒ‡fœ•s¨Ÿr¥~¬¦x¤ž‚­¤ªŸv£šv£šl•`‚|]usQfgJ_a>QV9DLBLVhuƒ£®—»»„²¬v¥oœ™s› x¥yž¦wœ¤wš¤{ž«¦´§¹…ª¾‡­¿†¯¾‘·Ã¤9OU # @ZTrœ‘°§‰¯±”¯¹”Ÿ­†…~‚‡lzy[tp]uZ„yX…|T‡€ZŒŒI|~K{P€„S‡P„ŠT…Q|…Ffl "%B] uwgJ ,M ˜42¾FF¸@@+)O #{Œ~ƒŒy{…pv}mvzfrr]kj[ihbrqgtvamm ,ˆ"#îFEÿA?ÿ@>ÿ@=þA>éDA·<:Q + QsT‰€R†RyM€l6zK’*àôõö ÷ ø ÿÿÿÿÿ ã+‘5S|>ÁBCÏGHÓKGÊJE³EA73W/:¤75ÚIGéFDéFDÛGG§=<*cnv“›¨~‚vx‚mqvktwfrtjvxlxzm{zZff0“+,íDFÿ@AÿA?ÿ@=ÿB?ñB?ÝDA$!"9aVTˆX‘‰YŒ„M…n5{L”(áôôôõ õÿÿÿÿÿã-“>]„BjoGxjO…t\“‚a”†c•‰u¥Ÿs¡¢h”›[ƒd‡•d„‘Ss~Fgp;^h3V`5YcU|„n˜—x¤ždŠ„IheGZ_AMYS[l}ŒœŽ¨´¨ªt©œq§šqŸ xœ¤š¤…ž¨œ¥¡§„ž¤…£‰Ÿª„š¥{•›{–šy‘—w“”q”x™{ œ‚Ÿ£§´Â§®½Š“œs?MK/+  )@;A[Uq‡ƒ¤wž–m‘‹dƒ‚e€}j„~f€zb}y:QM 3:=Y`i_kw…•¢•¯µ‹³®{ª¡w£tžu¢uœ¤yž¦zž¨‚¥¯‚¥²€¤´‚¤´m‰”.I4Umc‚ªŸ„­¨‰¦¯•¥µ–𬖖¤…ˆs|j~]xu^€y]…z_‹~^‘ƒ]’‰]Œ[‹^„‰4LR  )[ ¦/0Ï@BÙB>ãCAé@BíBDëA?èC@ÝA<ÚDCÍ>@©12pG` ,+ÜFFðECóB?óB?î>>Å??= Zns‘¡®“ž¬ˆ–…‰ŽˆŒu€„tƒw„†w…„GQQC­56ïCCÿABÿAAÿ@@ü@?ùB@òBAÂ=:@ .+`Š[‘Œa•ŽU{>‰V ˜,âõõõö ÷ÿÿÿÿÿ ä,’?\ƒEkpLzmOƒqZ‘~g›Šf˜Œl•n›f“—\„Y|ŠRtHku:^f5Xb1T^1S`LpzZƒ…sž›i“ŒTxr@Y[BT[IUa_l|‚”¥ž§|«£s¨›w¤¡xŸ¡¤„›£…¡¨‚œ¢uˆ‹Xgj7CI ,2   !84>XRo†‚«¶¾¨®»y|„#&* 5JG^yu`{xbwygz}hzy`sp%63  MSZS\f|…“Ÿ«”³´‚«¤x¤r šqžo—œv›£{Ÿ§¡¬€¢¯¤²‚¡°?S^ _˜51µDA›:7?  -%£•‡´«ˆ¯±·Ã¦º”–¨Ž—ƒ‡Œwƒ‡_tu`|vY{p`Šy^}\‘„^‘Ši’:W[ ,x ¹==ß??ò?>ô=9ø=9ù<=÷:;ø<;õ<8ò;9ð;9ð=<à<=Å??¬-.Ä:;Û?@ð@@ù?>õ<8ø=9ø:;Ï;;@E]]—¯»–©¸“™¤‘™†Œ‘†‘•€ŒŽ‘zˆ‡,43g Ë?@÷DEÿAAÿAAÿ@@þA@ÿCBþA@ÝDAw#"Aggb”’e›–]‡K˜e$Ÿ1âóôôõöÿÿÿÿÿã"2œOhQsyTrT„rTˆva“c—†b”ˆd—g”˜_‡“W|ŠX{‰SvƒCgq3X`4Xb0S`5\eEoth”“u¡šhŽˆQnkLabVinds|u{Ž}Šš†£ªƒ®«~ª£}¦¡}œŸ€˜žm†7FI  398hlm&#% 9HJcru`pweu{fuwBNN :u‡''f.:?Bov‚’š§š­µŽ­°‚¬¥q£™ož›n™œuœ¤|Ÿ©€¡ªŸªˆ«¸€ž©$,fËJGéIGçFBÑFC320 g‡|„¯¤~«¨‘µ»’¡´˜²žœ¨––œƒŒl{}czuXvkZo\‡xY‰}g“ŒZyxI 52ÎDEãCCóIEúFAÿGAÿC>ý@=þA@û>;üA=ú@?øA?÷C>òC@êEBëHFïGF÷GGþDDÿDCü@;ýA<û>;×DBZ#<8¢¦ ½Æ£¬º–˜£”˜–™“z‹Žgss'–!"ã?@úCAÿA?ÿ@>ÿCAÿ?=ÿA>ÿAAìEB²<7J48^Š‹f˜–j©•R¡p%¢4áõööõôÿÿÿÿ ÿã'5ŸWj•Yt~W{oSnW…r]Žz_‘_“‚_ˆb’\†’ZSx†Tz†Gnw5\e3Zc'MY1Wc?krc‘’w¥Ÿj“‹\}vPkgYnoZjqx{Š„ˆ›‘¡±‰¦­…«¥…ª¢…ŸŸGZ] ")04/)%  ,P|)++-W* bkooz‚lx~juy%*+G ›;5ÎGEÕED»B@r govdirv|‰‰’ ‡œ¤‚ª¥y«¡t¤žnœršŸ{Ÿ§ ©|¦†©³b~… 3Ÿ54êHFÿD@þF@æD?µ==KF_U{¦™„µ­{¤¦”ª¼¤ªÁªª¸¡ ©’˜ƒ’bxs`{qUxjQxiVvkˆ0.3¡3/ÛFBñGEõB@úFAÿHDþC?ÿC@ûB>úCAøCAøCA÷DBöCAöD?öD?ûDBüBAÿFFÿEEÿDCÿC@ÿA<ü@;ÿ@=ÜDC_ :4r™—›¾Â–¥µ¡¤³¦¨°¤©¬…“™x‡ŠP[Y  ;¼74ò?=þA>ÿA?ÿ@>ÿ><ÿA?ÿCAÿ@@õCBÔB=‰$"# Bffd•“e¥’W¨w)¨;ãôóôöõÿÿÿÿ ÿä/9¤apžXnzVsjRugRzhYƒqb}g™‡a“‡^Œ]‹“X‚X‚V|ˆKr{7^g:cl2Zf7amDpw^‹Žs£m›g^}tYqoevyw~‡y|Š…˜«‰££Š¤žGUS &Cp –# ¸66¾67»55®/.—#"xP. ){ËFBÙCBÞEDÒAC–+-$INOxƒ‡o{\cf '˜0+ÝKFíD@ïB?åB?³865 GPT[el`gp|„œ‡¦§ƒ¯©v¦ ož›s™| ¨}ž§ƒ¢«ˆ§°F\bR¾>?òHGÿC@þD>îF?ÉDAe *?7{Ÿ“…µ©mš—¶Æ£®Ä­­½§¦°™œ¤‰•—bur`{rKmbMsg]‚xHd^ +wÙGB÷GAúD>ýB>þBAû>?ÿABÿCDøEDõHFíFCêGDêEBíGBõFC÷DBüBAÿCBýA@û?>ÿDDÿC@ýA<û?:ÿ?=áCCc&<7o•‚¨¨¦»Ê¤®¿¥§¯œ¡‚‘p|~065TÔB=û?:ÿ@<ÿ?;ÿDAÿB?ÿB?ÿ@=ÿAAú@?ë@>½<9A  --Z†‡\›‹[¬}(§:áõôõöõÿÿÿ ÿ ÿæ6=ªnx¨bqcxua|rZ{lYm]ˆsf•a’‚b‘`Ž•U‚]‰–^…“Sy…Bht=eq:dp@jvJxXˆ‰iœ•m‘d‚^‚vVqmbwxjy|gpyx{Š‡š‚Ž’:HD <t®96ÓD?äC?í@=ôA?ôA@î>=èC@ÙGB¸:9Œ**P 38oÏ@;ñC=ÿD@û>=ö=?Ì@AN387wƒ…o|~EJK :Å@=ôC@ÿD@ü@;ú=:Ò?=Y.58]ikXbituƒ‰–‘©¯³³{©£r¢œr›v›Ÿ~ž¤†£ªˆ¤«.BGnÌ@AôFFÿDAÿB=óE?ÕB@w#);4£™²¤v¥šµÃž«Á²´Æ®«º¢£­Ž—›o€^xrIkaSwkXwn"Z ¾@<íD@ÿC>ÿB=ÿC@ü?>÷??ñBEãDFÈ<=ª+*£*(£,* *%¨+'½73ÚDCìDCöCBù?>ÿCBÿDDÿC@þB=þ@;ÿ?=âBBn$:5p”Žs™™˜·À•¨µ¬®¸¡¡§‘˜›s{{ )~$#ßC=þ>7ÿ@:ÿA=ð?<ë>;ûA@ÿ??ÿ@@ü@?ú@?ØBAy(%  ;acV‘‚]®)ª=âõôöööÿÿÿ ÿ ÿç<@°z³qzŽjwy`to\uk\|k[€l]ˆs_Œ{]ކ[Y‰[ˆ“aˆ–Y~ŒOt‚?ftAkwFt|N}V‡…a”k“c‘…\†{]x_}xc{{aqwelu^ai$'+%d °53ÝBFïCE÷FCöC<üC?û@<ü?<þA>üB<öC<îD@åECÊ>=¥½-,Ü?<òB<þB=ÿ@=ÿ??ø;<ÕAAa-41iwugut3==WÒBAüDDÿBAý>;ÿ<:ÝB?n#! (,-\hj]im`endmw|Ž™¬³„¯¬x¨¢v¡žvœž|œ¡ž¥Œ¦­-AFiÌ@?õEDÿC@ÿD@öB=àC@†%$6/|ž”|ª°¨‹¨±šª»º½Ò²°Ãªª¶š §~]usNpfUuj7NF/ .(äEAöCAÿDAÿAAÿCBû?>îDBÈB>ˆ$ L ,+)).9o¾<=ã@AùCCý>;ÿCCÿBBÿ@=ÿ@<ÿ?=ãD@€% # x—–l’”‚©«–´¹¥®»¡£­’—š`edD®=;èD?ÿ=6ÿ>8ûB>Ä31¥ë??þABú@?÷@<úA=åD@¶A>N  )*X‹}S£t(«=äôòö÷öÿÿÿÿÿç>B³ˆ‹Â~ƒœyˆq~dyq]vhVvcX~hZ‡t`„]Œc••]“]…‘X}‹Lp€>esGtM{ƒL{Sƒ„Y‹‡a”aˆ[ˆ]…z[}v\{x]tvKVZ(j¿?:ëFCý@Bÿ?AÿA?ÿA=ÿA=ÿA=ÿA?ÿB>ÿB<ÿC=ÿC?ÿ@=øCA÷DBþDCÿDAÿD@ÿB>ÿB@ÿ@@ú>=Ø@?v$# `ok^ok*53bÜFEÿDCÿ@@ÿC@ÿ;9áA?h#.00cqpXgiZdkU^hkv„£®‰¯¯zª¤qŸ™o—–x˜ƒŸ¦§®DX][Æ>:÷GFÿCAÿA=ûB>çB?˜!) w˜‘}«Ÿ|«£€ ¥¢²Â½ÀÕ±¯Ã««¹›¡¨y‡^stSriVqg%!XÐD>õA<ü@?ÿBAÿBCûCCçA@Á;7p 6%Y±23ãB>ùB>ÿEAÿB?ÿ@=ÿ?=ÿ><æC@‹+%' }šžk”tž…«« ³»˜¡«‹“9;;gÍHEïB?þ;7ÿ>8ðA>Ÿ*'bÄ/2ïCCõB@õ>:ø?;ïB?ÛHFŠ%##Bk\On(ª?áõ ôõô÷ÿÿÿÿÿçAD·“•Ï‡Š¦†Š•ŠŽr}g{o_zjXydQzeWƒvT…}WІ[X…‰ZƒŒIs€Dp}Ly†P}ŠN|„V„‹Y‰Š^Œ\Œ†YˆYƒx[ƒxX|vTol.7:j ÇC<åC>úC?ÿA>ÿA?ÿDBÿDBÿFBÿB@ÿCCÿDDÿC?ÿA=ÿB@ÿDBÿC@ÿC>ÿC>ÿB?ÿDDÿCCÿECÿDA÷;:ÜDCƒ,/&M^UJ]T,82^ßHDÿDAÿECÿ?=ü=:àC@y&%"bvqVmiN^dT`jemzŠ™¢‰¨«†±®z¨¢sž›w•š‡¡¨‰£ªRelUÄ?;öIGÿEBÿ@<þC?ê@<¦'&, t“y¨Ÿz«£~¢¢Ž¢­¤©¾¶³É®®ºš¥|ˆŽfz{[uoOf^ %…*&âC?ÿDAþ>?ÿ@AÿDDõII¸89b , ##*44" K±3.èE=ýFBÿB?ÿ@>ÿ>>ÿ>?éA@Ž*&+  ~› yž¢q›š~¦¤’°µ™¬³•œ!#‰àHGó@>ý<9ÿ?;äC?qAÒBAïB?ú?;ú?;úCAòECÁ??< .J“e*¬Aáó ôóóøÿÿ ÿÿÿè>Hº˜žÙ—œ»•¤Ž”›~††q~vj}n^xfWwfTyoW‚yXŠ€[އ\‹‰Z‡ŠR€ˆR€‹Q~‹Mz‡R|ˆXƒŒ\‰`‘Y‹‡Z†\‰€a‹€^…}LgcE¸:6çA:öC<ü@;ÿA=ÿB>ÿCCÿFEþGE÷HEðHGëHFïHEñGEöFEúDDÿB=ÿA=ÿA=ÿB?ÿCCÿDDÿEBÿFCù=<ÝDC…++*  L`TKcY9GAJ×E@ÿEBÿC@ÿDAû;;àC@Š-**f~vSrkLceK[bMV`x„Ž€œ£ˆ¯±x«¤v¦ s”—ƒŸ¦ˆ¥®QfnO¼@:òHFÿC@ÿDAû@<îA>¦%". r’‘y«¡x¬¢s›™„ž¥­³ÊÍÍå±±¿™œ¤‡‘˜rƒavsBSP7£64íC?ÿ><ÿAAý?@ÿDCåLKs'!25Xquާ©j}FZUb ÆA:ôGDÿB?ÿAAÿ>>ÿ?@êBA‘'&.x•œ~¤©w ¢pš™ƒ«ª§ÅÆt|ƒ .¬1/óIHù?>ù<9ù@<Ì=:I%E£33åB?ù>:û>;þA>ÿEDÞFEz$$" 2uH&¤:ãôó õöôÿÿÿÿÿ å0B³ˆ›Ôœ½Ž˜ª‰‹–‚ƒ‡z~yv~siwk[qe_{u^ƒ{]ˆ{`Ž‚`‡[ЇS„†N~‚L|‚L{ƒT~ŠXƒŒV‚‰\‹WˆŠY‹‰V‰‚d‰n•0LF5–-0äKJúFA÷A;üB<ÿA=ÿ?<ü@?îA?Õ?>¿>;­<:2/¡63¥2/¾::×?>òA>ÿD?ÿ??ÿ@>ÿA=ÿ@<ÿEBÿFF÷=<ÜDC‰-,,  G`VLg]CUN G ÑDAýFDÿCBý@?ü=:áA?‰,)* l‰€]xJffI]b;HP[iu|–¤‡¬´x®§r© tœ›€¢¨‚£¬KelC²?<îIFÿC@ÿB?úA=íC?¡%. oŽ|¯¡q¨™m—‡§­ª·ÍÃÇਪ¼•›¦ˆ“—w„†dts2@?Q½@<òC@ÿ?;ÿ?<ú@?ï?>¿>;237þ>?ÿ>@èBC¡542l–~¥®{¢ªsœŸy§¡Á»:DD?Ì>=ýFDÿAAÿCBé><±321aÓ@>÷>:ÿDAÿC>ÿA>ëB>»=9T9.¤=áôóó øúÿÿÿÿÿ"å-G³„¡Ô“«Ç£²‘™¦‘™„„„~{szshtneyta}w]t_‡{e‡c‘‹XІT††U†ˆX†[†Y‚‹[†XˆŽX‹Ž^‘“Y‹‰e‘‹e‡kÈ>?òFFÿCBüC?üC?þC?ò?=âDD±--uR<23:N„Ê?<å@=ûCCÿAAÿA:ÿD=ÿ@>ÿCCù?>ÝDC•631 A\SNncG\T C ÍDB÷DBûDBü@?ü=:ãCA‰,),l†c‰ƒOnkF^^H[`JZfcw‰‰©¶†¹µqª¡v¢¡yŸ£€¥­]y€8£64êHFÿDAÿ@@ù?>íD=¬.)/ c‚wªœo©—q¥›¥§™«¼¯¶Ï¥¨½–›ª‰“š‚‘mz|*,j ÏB?öD?ÿ@<ÿ>;÷B@åCA›,* 04178=$ael¨¨ƒ»¶Oy4\[=>J ÓEDøCAü@?þ>>ÿ=?êDC¤755 k—©µƒ§±yŸ£rž˜€¢›  fàDDÿDAÿEBùDBàDD‹!  0®22ëA?üEAÿD?ÿ@<÷@<ÞB=’!,"’,àöóó ÷ú ÿÿÿ ÿÿ à&D©wšÅ‚¦¶‚¢§¢ªœ¦…‹’‚†}~|vywt}l}zb|va‚{dˆ‚eއYˆ€R…~\ŒU…‡[ˆŒV‚‰Y‡T†ŒV‹ŽWŠŒV†ˆc‰‰F^\,§0.ã@=÷DBüBAûA@úCAôA?ÝFB*(>" )T §63åB@ÿ@@ÿ@<ÿA;ÿB@ÿCC÷=<ÝDC <:7E`VZzoLb]@ ÈA?øGDûDBüA=ú::à@>0--b…n—’YzvNjjLbg@R]YewŒŸ®¸»{¬ª{ª§v¢¡{£¨e‚‰3ž52æIFÿEDý@=û@<ôA?º521]|yz¬ q¬r§™y¢Œ¤°«¾©«Ã™š®Š“œ„”q}(+ßDAúC?ÿ@<ÿ?<óA@×EEzACEFQQ=|zg¥Ÿ‡À¸Uˆ8ac3TW ##,ÀB>ðC@ùB@ÿ@=ÿ==ìEB¦847 i‰”¦´}¡«}¢¦~£¡Rpk2–+-èBAÿA?ÿC@ôDCÌCAe nÌCAòEBÿD?ÿ@<ý@=ôA?È:9Mßóóõ ø ùÿÿÿ ÿ ÿ!â'C¨r–¾­´¨£„¦¦‰¡§†“›…‹’‚†wvxux|r||dvuaywf~g‰ƒaŠ‚`‡_’‹V‡…Y‡ˆU‚…XˆŽXŠZZW…Œb…‰./RÉ?9ñ?:úC?ýCBÿDCòBAÞED›'&7 !  OÀ89ïAAÿB?ÿC@ÿ@=ÿB@÷=<áEE¤:9;Id[a~uVlg2½:7öGDöA?û@<ý@?åCA¡<:7 Popl—”hŒ†VurIdh>QYR]kœ~¦}¨«wª£wª£y¤§eƒˆ 0›64æHHÿDCý@?üA=÷@>½421f}}¬£n§˜m£’u£—‡¥ª—§·Ÿ£»š›°–£ˆ—sy~”%#çECøA=ÿ>:ÿA>ðCAËDBc $CB@ji=qqF}a•~º°ƒ¸¯X†€?fh@_b"9;"¬53ëDAùB@ÿ@=ÿ?<íCA¯:5>  fƒ‘Œ±¿‚¦°‰«±‡¥¦$96VÀ;>òBAÿD@ÿC@ìEBµ?>C: 43çGEüA=ÿB=ÿ@<ý==âBBˆ$"%q!âôôô÷ û ÿÿÿÿÿ ä-C­s•Àx¥©}® ¯¢‰°¨‡£¤ƒ“š†–ƒ„ކ…Žˆ‹t}€hwyfz{`{x]x_ŠZ‰€U‰\Œ†X‰‡W‡‹W†Ža‘—ZŠXƒŒLmv%€+)ØD>ó@9ù@<þC?ÿBAêGE™,*< 6@Zz…v˜¥{˜§lƒ’BO]  'oÏ@B÷DCÿA=ÿD>ÿ?;ö=9áDAª::CLb]j„~cwr .º96õHE÷B@ýA@ø;8ã@=«><> Gdhk“’p–]{MiiAW\JYbk{ˆu€¥­{®§z¯¦w£¤b€… ,—55èHHÿCBþA@ü@?ù?>Â435i€{|¦Ÿo¤—u¬™{¬œ¦¢¥°›£º¢£½šœ®‚„yy›*(æCAö@@ÿ>>ÿ?=ïB@ÇDAY Hc`wœ˜|§¤~­ª´«‰½³}¬£c†PopNimîCA¾@>îBB¿;;P n!ãôòô ö ú ÿÿÿÿ ÿä.B¯v“ÀuŸ¦yªœ|°ž†µ¥ˆ®¨ž„–ˆ‘›ŠŠ–…„Ž{„tziuy`tu`~y\wP~q_’„^’ˆZ†b‘•W…a—V„ŒZ‚Ž:W`<§@>ßE@ó=7ùB>ûDBýFDÔ@@X   k‚Š|ž«…¬»|¤¶„©½Œ«À˜®ÀQ_k7˜'*êBAÿC?ÿC=ÿB;ù@<ãCA¶ABM=NKezwfuq.¸;7ðGCöCAû?>ü=:êC@­98B B\b^„†j“ŽcŒ„SuoEaaH\aWgsr…”…£®}°©w¬£{§¦n  )‡&(éIIÿBBÿBAû?>ü@?Ê;8? QhcwŸšv§Ÿtª™w«š~© „£¦«½«¯È¥¦»Ÿ…‚‹™*(ã@AøBCÿ@@þ=:òC@ÊD@\Lc_„¤Ÿ€¥¡}¦¡­¦‚­¤m–ŽdŠ„WvwSlnLac %¥.,êEBöA?ü?<ÿA>ïB@ÉB@YHes‡«»Š¯½ª³Tbh/¯/0ï@Cü?>ÿA=ÿC@ãKJg*'7FB1¯24ìFEûD@þ@;ÿB?ôA@âBB+ qÞóò õ ÷ ú ÿÿÿ ÿ ÿ æ1B±vÁt—¥u¢™|­²ž~­y£˜‚¢¡Œ¤ª–Ÿ­ŠŠš‘š–}ƒˆl{}cywRslR}n[Œ|[ƒ\‘ˆ^‹ŽWƒŠe›X€Œjš9SZU ¾HGáB>ò>9÷@>÷DCêBA³340 [jmz›¤©¶|§¶w¢³§º‰«Â¬Ä¤´ )2` áDAÿ?=ÿEAþ@;÷>:äC?¿GGW ü;8íD@²=:I:RXTz~]Їd“‹]ˆGmgC_`M`hXhx|” †°¯|¯¨®«t–• #%%èHHÿCCÿ@@ý@?ý@=Ò@;G H_[wžœs¢Ÿw¦t¤˜t¦šˆ±¬›´¾²½ÑŸ¡¹’‘¥~|ˆ$#àDDö@Aÿ>>ü?<óE?×B>s ,:8{’Žq’Žo”s–’r–hŠƒb‡]~WuvEX[+¸98ðECõB@ù@<ÿ??ñA@ËAB]Liw‚¦¶‡«»Š¦±!,0L Í=<ûA@þ?<ÿC@ýCBÑEDC :KGaxsrËB@óE?ÿB:ÿA>ü@?ôA@¿E5'm%Þ õñ ó öû ÿÿÿÿÿå/@¯s‰½v–©uœš~©ž|¬šy­–|­™}«Ÿ…©©˜«¸‘—ª£ ¯¤¡ª–šŸ{‡‡astSnjSzkQ€pYŽb—Ž[‰Š\†c™^„w—¢*BHcÈHIæC@ñ<:÷??òDDàGHˆ#!$•š¦®qž©w¢±tœ®|£¹†ªÂˆªÂ™²Æ_my 9Ì;9þA>ÿA>ÿB=ö=9åD@ÃHFX CHIpuvjpo#¢-*ëHEôC@û?>ü;8îD@ÀECV -@GJlrT€j™–c•‹RvGgfNdjO_lr…’‡ª®ƒ¯®ƒ²¯rš• x%$æIFÿC@ÿ??ÿ@@ÿA<×A;O;PN££}§¦x¡œt¡˜w©†²«Ž¯²ž±¾›¤¸“–«‡ˆ–&%.wÙFDôA@ÿ==üA=òB<æEA›(%# Ufca|yc‚iˆ‡f…‚b„}d†Y|xZvv*+BÍA@ôA@ùB>úA=ÿ??òBBÏ@Ba?]hˆªº‡«»pŒ— #{%%ßDAþ?<ÿA>ü@?öEBº;:(Lf`bƒ|.IE;¢65æF@ÿC>ÿ@=ÿAAÿBB×K:_6 'i-àññ ó ÷ú ÿÿÿ ÿÿ ä/C°{“Çw–­xš wžœz¥š{¬˜~²š|²›{©”³¼–¤·®®À²®º¥¥«˜˜o~€UmkKndQ}pU‰VŠƒYŠˆ\‰e›w©|›¤"8>uÓIJîDBø>=÷:;ïDFÑIKn2=Aˆž¤~£«y£¯€ª·„ª¼„©¿‡«Ã‹­Å–±Å ­-³0-÷EDÿB?ü=:÷=<äA>ÆIE[ LKMwyzoqr"œ+)æFDôBAù=<ý==òECÊGD^ 2?GAZd\€ˆnš›o¢›_Ž…RuqPik\ktr‚†Ÿ©‡¬°‚´°r¡™w*(ÞGCÿB?ÿ==ÿ??ÿ>:áB>e "/1†Ÿ£¡¦{¡¡|¥ ~«¢‚¯¦¶±”µ¸ž±À”ž°‹ŸDDP\ÌD@òBAÿ?<ÿBAøA?ôDCÁ??2!,*Shf^xxUqqStpRvpVxqXur?US '$#ãGGü@?ý@=ü?<ÿ??ôAB×BEp,HSˆ©¸Œ­¼@Yc=¨::æC@ÿA<ÿ@>ú@?èEC–'%TvoaŠ‚Vxq[ÓC>ö?;ý@=ÿB?ÿEBæP?“P#Em4Ü õ óó ö ÷ÿÿÿ ÿÿ ä/C°{“Çw•®w˜¡x™œyŸ™{§–xª’v­’z®œ¥©›²Â´·Ì²®Á¨¥®—šžv…\qrNohNxmQƒya–_‘[‹f”œ{¡­~¦$8=uØIKîDBô:9û>?ê?AÊHI^ OZ^–žv›£t¡¬w¡®§¹~¢º}¡¹„©¿®Á’£°"'«-,ôIGüBAú=:÷=<èC@ÈGDe=:<‹‡Œxw{+*. ›.,áFCòBAù=<ÿABó@AÓDAl (07Wit\z…bŒ‘d–’d•Y|GfeTgnP`lxˆ˜‹§²®¬y¨ 3*aÞHGýB>ÿ@=ÿ><ÿ?=ìB@–+'3 p€†ƒ›¡‚¡¤‚§¥†¯¨ˆ³ªƒ²©«¥ƒ£©–«º™«cfuE±;6ïECÿB?û>=þABüDDÙEEe !!SefbwxYqoLgc=YS#85 T½>?îDCÿA>ÿA=ÿ?;ÿ>>õABÜCDx,EOª¸Žªµ'/fÊBCîD@ÿA=ÿ><ö@@×DBq)%SxpZ…zdŒ=îDCÏGHh 9EI}—s¤u£®l™§uŸ²w›³| ¸‚§»†§·¤¯#'(¨)*ñEEøA=üA=÷=<êC@ÐJFt2.3‡ƒˆ‚€†,+/#"ÞFEïAAú=>ý:=úACçII…# RbiVr}U|…Y‹‹f™•\ˆ‚MrpHgjI_jao‡š©{£¨‚­ª%@7]ÝGFý@=ÿA<ÿ>:ÿ><ó@?È?=]`nt—œ‰¨§¥Ÿ…°§y«Ÿq¥›}©¨‚£¬Ž¢³ryŒ ,Š,'ãD@ÿ@=ÿ??þ@AÿDEïFH¾9;b " %% +):¨-1ã@BøCAÿB=ÿA=ÿ?;ÿ@=öCBÜCBz!-CN”®ºuŠ’'”$$æFDó@>ÿ@=ÿ?=óA@¿@?M,DBY{uYvbŠa€y  mÎECí@>ÿ@=ÿEBìK<·U+xƒ<Ý ôñ ó õ øÿÿÿÿÿ ä0D±~–Ê‚·„¡ª€¢~œ ™{¢“x§‘z®—w¨šz   ³«¯Ç»¸È¤¢®•œ¥duxZurNskR~qR‚v_”‹a–“b’˜tœ¨t‘š16‚%$ÒIGèC@î;9÷@>ðECÚIG"#&{”˜t›£o ªnžªq®r™¯}¢¸¤¸ˆ©¸¢ª0´22öFEþEAü?<ø>=ëA?ÖKHu=<@•“™‹ˆ‘206~ÛHFïCCø;<ÿ@CþACñCC·63:"-1ThsPqzP}_‘i—‘VzGkk=Y`S`pzˆš‚ «…¨«(@8ZÝGGþA@ÿB=ÿ@<ÿ><ý@AçA@¡&$; /<>ezx}–’ˆ©¢y¤—{«Ÿyª¢„­¯¬º‘¡²,3<U Ï><øA?ÿBAþ>?ÿCBøEDçABÀ::l-  $?–01ÜAEø?AÿD@ÿC>ÿA:ÿ?;ÿ@>øCAáA?ƒ&9A‹¡¬M]c<À=:ôEBøA?ÿ@=ÿ@>ê@>›/.3 PdeTqnV{sPxmUzr2LF<Ÿ32æDBÿEDÿB?ìI:»S(€…;Üó ò ó õ øÿÿÿÿÿ æ1D³—Ë‚ž¶…¢«…¡¨ƒ ¤Ÿš{¡•x¥•u§•z¬šy¤›… ªŸ­¿½¾Ò££³Ž”¡|Š_wwWxqOwkY‡z\†\‹XˆŒeŽ—]}ƒ.3sÏJGéCBò=;ûA@ôC@æGC—&#% evytšŸpŸ§pž©sŸ¬tŸ®z£²€¦¸‹ª¹dt{ :Å=9ùDBÿCCÿ==ø<;îCAÚHC:=B«­µž¦88>x×JGíCBö<<þ@AÿABþABÜCBl' ,8>>V\Qw|]‹Œa”Œ]Œ„Qxv>[`Pbmixˆƒ˜§‡ž¦-@=ZÜEHÿAAÿB=ÿA<ÿ?<ÿAAü?@âBB”%#>8FBczrp’ˆv¡˜|©¦Ž³» ¼Ç^jt ,¤((èBAø@@ÿBAþC?ýD@øCAïEDÔ@@¡,-\0" &5Hwº9<áDHñAAþBAÿB?ÿB>ÿA=ÿ@<ÿ?=ü@?êC@˜# ")ŒŸ¦ -/]ÛIDûB>þA@þ>>ÿ?<âB@t" "|c{{YytRwmQynTsj  `×EE÷AAþA@ëI7»V)~…:Ýôñ ó õ÷ÿÿÿ ÿÿ æ1D³—Ë‚¡¸ƒ¢«†¡«…¢§|™x•v¢•v¥•|­z¨œ}¡¡‘ª´ºÄÖµ¹ÌŽ”¡Š“œfy|UsnPthP{nU…y[ކ\ŒŽZ‡‹Vy}";=Y ÁFDåCAö?=ûA@öCAïFBµ735(46t”™pœ£sž§r¦w¡­|¢®¢±‡Ÿ«(,[×DBÿD@ÿAAÿCC÷;:ñDBàGD’'$  &+£«²©«µFENtÔKIêBAö<;ÿEBÿC@ÿCCñCC»<;b )-1:^^R{tgˆb…KijYouYkvu…–†–£GTVJ ÖADþ@AÿA>ÿ@<ÿA=ÿ?=ÿ?=ûCCÚGEš,(T ) &Prhy£œ†²³‹¯µ¡¬"dÄ;9ïDBÿEAÿE?ÿD?ý@?ÿBCøBCæFF¼A?”0.y% j)#›73·B?ÑEDìCEûBDÿDCþA>ÿB?ÿA=ÿ@<ÿ?=ÿ?=ÿ??îCAž'%  %~‘–"‡11åIDÿA<ÿ@@ÿ?@ù=<ØBAS @OR”¤ªjWtqLngItg]u3GB 4®44êGEüECëI7¾W*~„=Þô ò óö÷ÿÿÿ ÿÿç/C²{–É€ ·€¡ª„¡¨ƒ¢¥}œvœ–w¡–w¥™s£—u¥™y§›ƒ¥¤™©¹«²Æ’˜¥ˆ˜p€†YqqSunQyn^‰~b†^ŠV…ƒQxz7VU@¦=:âFAõ>:÷AAùCCöCA×DBn% 0KOj”q› o™ y§|š¥h|‡+30)*çDEÿDCÿA>ÿC@ö<;óDAæGC.,"—£©§­¸ablkÏJGéCBõ;:ÿD=ÿG@ÿ?=ü@?ì@@Ç8:o 4 .)F_[YuuKghPgohvˆƒŸO[a @ÐACý@BÿBBÿA=ÿB>ÿA=ÿ@>þ>>í>;âB@Í=<Ÿ)(\ 3% A^Uz¦ Œµ·—²¼IUa0„# ÞC@ûB>þD<ÿE@ÿBCþABûDBôEBêEBãCAÞBBÞEDÞEDâEBéDAîCAùFDûB>þA>ÿC@ÿB?ÿB?ü?<ÿ??ÿ?@ÿABìA?ž'%  !r…ˆ  0¢=;éICÿE=ÿ@@ý?@ô>>¿328 o}ƒ•¨­}”–\uwOojQymX€tPqj"tÐJFïDBéG5¼T%ƒ…=Ü õó õ õ øÿÿÿ ÿÿç,C±x•È}´€¢¨ƒ£©ƒ¤§€¢¢|¡Ÿ{¤x¥œv§Ÿr¥r§šu¡š}œ¥°¿£¯»– ~‹“j~ƒVurSxp_ˆ€`‹‚b‘‰]‹…`Œ†f‡ƒ %€,'ÛFBó?:÷AAùCCùB@èEC¸>>[ "!3PTUrvSjr-ö=9ñB?çHDŸ.,"’¦§³ÃÊ`lr^ ÇHGäA?õ><ÿE@ÿF?ÿA=ÿC@þ>?ðBBÊ>=’+)J #/-NhhJ`fKXhnv‡LS\>ÏCDûAAÿAAÿ@>ÿA=ÿA=ÿ@>ÿA?ö96ö<;ô<<á><Â@@Ÿ54&)U, f…ˆ³°¯¸—¨µ'*2 @´97èGC÷F?ÿE?ÿCDÿBCþEAûC=ü@;þ?<ÿ==ý=>ú=>ø>=û?>û>;ýB>ýFBùGB÷FCòC@öEBùB@ý@?ÿ??þ@AìA?¢)'" hz{4£<:êJDÿD?ÿ??ô>>åCA™$!) •¡«­´‘¤©fza{{UzpYuV~s+GA:‰*'ÌFBÎJ9¬W*{‰;Ü õòô õ øÿÿÿÿÿ!æ-D²v’È|œ³£©„¤ª‚¢§ƒ¤§€¤¤}¥ y¥Ÿu¦¤t©¦s©¢x®§u¥¦‰¯´ ¶Á”¡¯}‰•z‰’[wxUxt\„a‹„nš“rŸ–w¤›€¥7NJ PÍB?ó@>ûFDüECýD@õDAæEA¸98S " 2j È>8ëA=ÿB?ÿCAÿ@>ÿEB÷@<òHDçIIŸ//! ’«§”´³VrrX ÃLJãCAò<<ÿFEÿEBÿEBÿEBÿDE÷DCñGEãIDÎFB¡.+m=! #"DWZL[dNZfQTb> ÐHDÿHFÿBBÿBBÿDAÿDAÿCCÿCCü@?þBAÿB=ûB>ðFEèHHæJKÑIJŽ*&?.LA‰­§¡ÅͯÉׂ‹˜ Y ®75Ú95ì51ýA@ÿBAÿC@ÿC>ÿB>ÿD@ÿDBÿFFýA@ö?=ü@?ý@?û>?ò@?âB@Î95Â3.ÜD?ð@?û?>ÿ??ú@?ñDBµ84%Zff)‘41×;6ö96÷9:é?>À@;^ (2²»É§«¶š¡ªr‡auzUplRukQymKja)a„<+}S)Y3Þôñò ö øÿÿÿÿÿ!æ,C±tÆz𱀡ª~ ¦Ÿ¤|Ÿ£¢¥~£¡wŸv£¦s¤¦w¬©v®©sª§‚°±˜·À£¶Ãˆ“¡€Œ–i„_~}h‹‡m“xŸ—¦ž©ž‚§Ÿn‡ƒ+­55çA@ôC@ûB>ýD@ûB>úCAêHF²;ÿC>ÿA=ÿ=;ÿA?ÿB?÷C>ðFBèJJ¨66! h‚||¥žJmiS ½LIßDAò?>ÿBCÿDCÿEBÿFBøEDöDCûDBøD?øGDèFDÎDE¥77u" =+:ÿCBÿBCÿEFõHFÌ@:…)$u—•»¿°» °À]fs#W ®3/Ò83òECýCBÿBBÿB?ÿEAÿEAÿDAÿCAÿCBùB@úBBòBAãCCÎ@?¤0/nd²<7æDBúBBýA@÷B@ìFE¯86&iuw ]¿A=Ý@=ÞBCÈBB~& ,KWa­ºÈ¯°¾©~‡‘jz€_tuXvqV{q_wPd_  )j)Üóòòùùÿÿÿÿÿ!ä+B°sÅ|š³|¦}Ÿ¥z¡~ž£yšy›šwžœz ¤y£¨y©ªr¤¢yª¨­¬Š­±‘«²”£¬…˜s‚…f{yj†€l‹‚u‘‹{™”w—’mˆp‡ƒ)'tË@CðDDû?>ú@?ù?>þABö@AéCB×DB§)%‡g [`z£$#É64æEAðB<ûC=ÿB=ÿ@@ÿ>?ÿA?ÿA>ô?=óFDîHG²;9'k‚~‚¨¢`‚|H °EAàGFñ>=þBAÿE@ÿD<úG@ìDCéCBøFEüECûDBöDCìACãCCÛED±>;PFY\"B+'ÛHF÷EDÿDEÿBBÿB@ÿ@<ÿA>ÿC?ÿDDûCCôFFÙFD¢96b0%(aÏCDòADûCCóCCáKK’-+ }‰ÇB?ËB@ØC?ìA?ù?>ý>;ÿ?;ÿA=ÿ@=ÿ>>ÿ??ÿ?=þ?<ûA@ôBAïEC¹<8+i~|‚¢hƒ 2–B<ÆGFÞBBêEBìC<ñC=æF@³--™Ò@@æDBóCBûDBû>?ûAAò=;ÙD@‹64# >STI^`,8> %¡0.âC?ôC@üA=ü?@ëCB¼A?Z4C(%ÚDCêDCõCBú@?õB@Ý>:›*'#d‰‚±©†µ²Š¯·“­¹†–¢$,33‰"Á:8ßFEêDCðECóCBôC@îD@çGGÕCC·55‡" =  )Š%'ËCEÙGIÒHI¨::W);:„™šq‡ "30  r‡……¥¤z™œ£°¾ž¢´•¢~…Žo{h|}d|z_zv`~sfw`sj3A;pàôñó øúÿÿÿÿÿ"å+A±uŽÆz˜³w—¢zœ¢v™tšœs——yš–z™–p‘PjpþDCù=<ý@?ÿA>þA>ø@@ôABðADî@@îA?ôC@úBBý?@þ>>ÿ?<ÿ@=ÿ>;ÿAAÿ>>ÿB?ÿB?ü?>õ??õHF¹77.brqg|yTeaQ%†52œ21²=:ÆD?ØIF¾CAZ9l±;6äHCò?=ú@?û?>øA?ÛB?™850 D_\Kji6LRlÅAAìC?ûB>ö>>ÝDEs+9~!Æ>?åB@õDAëA=ÏC=r,$~£™~¬ {­£‚¯¬²¶¢¹È”¡±>@J#?t¥86º<;ÊDDÆA>¨30~$#O 2   )J hj$$:  Xwp}£žh€€+*   e{y‡¨¤vŸ˜}¥ ‚Ÿ¤“¤±œ£´‚…”y†o{}jzydyv`xve~zs‡w‘‹o†]‚n0s@"›-åôó öö ÷ÿÿÿÿÿ"å*@°qŒÄw•°w—¢w—u–™w˜›}œ›u‰Nc`!$  >‰%#Á>;ÜA>ì?=ú@?ÿA>ÿA>þABþABÿADÿABÿC@ýB>ÿBAþ@Aú<=ùAAðCAëDAà><ìDCùB@ü?<ÿCBõEDâFF²CA0  +=HVq l"'T ¬61ßJFìB@ôA?ó@>ÛD@Ž3/)RtmPxsLim%+6‡+*ÅE@ÕC>Í?>’""6 .d¬31ÑDAÐJF72BAZV}¢š|§žs¥™±§½º½È§¶ž§T\c %8Kd_ ?#/69GPS  &1/~ ™}©¢¦¤ ¡–—GTV *59Zfj|‘“‰§¨„©§y£œ}©¢{¡¡Š§®—¤´„ˆšƒŽz€‡nwzivxhz{h|}k„€u‘‹€œ–z£Ži°~3°Bãööõô ùÿÿÿÿÿ ä'?¯nŒÃw–¯z™¢u•šz™œ}••`sp&,ATlq†!&#%!‹"&#‘$"Ž# €sT=) %B,(×EEóCCÿDCÿA>þEAüC?ÿCBÿCBýFBüEAÿDCÿCDù@BêACÉABœ+)l¨43çB?úA=øCAãFC¶@?l%"   F ˜96ÌD@äC?ëA?ÓHEc $ aŒƒWˆ€Hjj2GI %F XI -    "9jw,*<  m‚„ƒ¢£u o ˜v¨œ‰»±¾¿šÂǘµ¾Ÿ²ºƒ…:7@   #,5MYcar{Uhp2EM ??ÓAA×B>ÚA>Û@=ÜA>ÜA>Û>;ÜA>ÛEDÑEDÀAB¦88„(#f@'4€Ì@AéCB÷E@ûGBýFBÿFCþDC÷ICðGCðHGëHIØDD³77t>.VÃB?ÜC@ÔEB¥0-T '""&5@BOK7,'#  7v°;8ÁCB–1/2&C@[‰ƒ]‰QxvLhi#/3  '$&KHJ'"$  5EK‡ž¦†¦«z¡£n›˜|«¢€²¨{²©t§£Œµ¸ž¹Ã¨±¿££±~‡DBH"#  7KFUjlv‰qƒŽj}Š]sQjtC\f@ZaF]_=RP.+&00W^aux€vˆ‚™¡†©­†­«|¤£ƒ¤­€ «|›¤{™¤}š¨{›¦zž¦y¥x˜£}ž§|¡¥y£¢r šu£†­¯‡¤«•¢²}”zzŠpp|edmdgkX]`OYYQ^\D^N4i=(–,ßõóõ ù ùÿÿÿÿÿ!æ'=­hƒ»p¨v•žx•™Zpn %Oˆ$ ¾=:×DBäDBëCBìACðDDòBAôC@õDAõDAöCBöCBöCBõDAñB?ïEAìDCæCAäDDßFGÄ:;›&'] 0%X ·95áB>ì?=ó><û?>ôB=åE?ÕE@ÈDD¥77r# = r"!A@g1#:g ’%#¦/-µ65Ä=;Ð@?ÖCAØECÒBAÆ<=³.0›##|Y4 .= % NlqS}‚XˆŠg‘Oqq6LQ+1%,    1FH~›Ÿ…¢©€ ¦vœ z¡£uœj–i¡”y±¦ŽÀ¼˜¼Âž±À¨®Áª©¹Ÿ›§™—‚†TXY;CC)64$:5Mmbn“‹y€¢¨v’m…‘aw‚YpxEahJjpW{c‰p—•k‡c€we|tcprbows†“}š¡‚ª¥ƒ¯¨€¦ªxœ¤y˜¡z— }™¤u”t–œq•r•Ÿu˜¢vš¤vœ¡sšœw¢Ÿ{«¥z¥¢”±¸~Žž{‚•tvˆhfrmjs\X^YX\\^_HYK9c:*Ž(ßòóóõöÿÿÿÿÿ å*<­n‡¿z™²‚¢¨z‘“*(,s"µ@7ÙD@òECü@?ÿ??ÿ??ý@?þA@ÿAAÿA>ý@=ÿA>ÿ??ÿAAÿAAÿBAÿC@üA=ü?<ý@?ÿ@@ý@AöBCäDDÄBB--B "R§41Ä@@ÒCEØECÆ>:£/(€d9  "1,m¤66ËABãEEìBAôBAùB@üA=ÿ@=ÿA>ýB>öA?ò?@êDCÚEAÂE=˜4/^ 2TiqPoxGnwDpwx¦§U}|Cbe/5Xho˜œY`]  " 126%'Pck„¡¨ƒ¥«‚£¬£«~£«| ¨v˜žuœn¢˜n¦™}²©»º£¿Ê§µÇ­®Ã¡Ÿ²Ÿ ª’—šˆ‹ertRebF`ZPvjj‘‰zœœp’Pfq.CK+2).+01LPMqwY„‡aŽh—e‹av_usEW^et„}“Ÿyžšƒ¯¨€©«vœ¡q’›v•žv•žv— q•q–žu˜¢q•Ÿwš§xœ¦xœ¢vŸu¥Ÿ{¬¤†°¯~ž£”¡‹œx{Šljvmgrmhqjfl\g]OtL5•0"àóõóô÷ÿÿÿÿÿ æ1A²z‘Éž·ž£]jl#‰#Ð?7éE@õBAý?@ÿ=?ÿ??ÿ@@ÿ@@ÿ@@ÿ@@ÿ@@ÿ@=ÿA>ÿ?=ÿ@>ÿ>>ÿ>>ý@?ü?<ÿ@=ÿB?þA>úA=øA=õB@íC?ÞEDµ99f ')B _b !@% 6HI#Qž/-ÓCBçCDñCCùCCûAAý@?ÿ??ÿ@=ÿ@=ý@=üA=üA=ÿEDù?>óC=íE>âB<ÕDB¬00_ $*Sfnd}‡Tr}?an6_hPƒnœHjj/HL7ý@=ÿ??ÿ?@ÿ?@ÿ?@ÿ?=ÿ?=ÿ@>ÿ@>ÿA?ÿ@>ÿB>ÿ@<ÿ@<ÿ><ÿ>>ÿ??þA>ÿ@<ÿ?;ýA<þC?üC?üA=ÿB?øA?èECÃABp+  D\\u”ƒœ aru "^´;9ßDAó@>ÿ??ÿ@@ÿ??ÿ@@ÿ??ÿ?=ÿA>ÿA>ÿA>ÿB=ÿB?ÿA>ÿ@=ÿB:þC;þ?<ö?=æ@A¿==d# (65ZmtWpzJfq;[f'JWe h‹Š¨»ˆ«¿‹¯Á‚¦¶¦´~¦²ƒ©µ‡ª·‚£¬v˜žr™›l›˜l¡”p¦™|¬¦“·½ª¿Ô¹ÄÚ£ª¹œ¡ª˜ §x…‡_qpG^YCYT!   4WSdŠd‰b‹„[}wXqsLWejt…˜ } £…±«x¥¢l’–m’šl“œg™\ƒ‘m’ s—§uš¨wž§{¢ª~¡«|¦yž¢v¡žr¦œtªz«£x Ÿr›wŽžr‚“t{Ž}xx}€kn?¢>"ßòóõ÷öÿÿÿÿÿä*@°v’È~žµw” '‚-ÙC8ø>4ÿ@<ÿ><ÿ=>ÿ=>ÿ>>ÿ?=ÿB>ÿB>ÿ@=ÿA=ÿ@<ÿB;ÿ@9ÿA:ÿ@<ÿ@=ÿA>ÿA>ÿ@<ÿ?;ÿ@=ý@?ü@?ýA@þA@ýB>óC=åB?ÔFEˆ"#% (-1POU{up“¡ ¢¥…¢¦XlmsËCEãA?óA<üE<ÿC;ÿA>ÿ@@ÿ??ÿ??ÿ@=ÿ@=ÿ?=ÿ?=ÿ@>ÿ?=ÿ@=ÿB=ýB:ýB:ÿ@=ü@?ôBAâB@ÉB@„%"/ @Z`7Xa2U_ GP1:'-!RT|¬­Y€;ZY)*} ÊEBåGGíAAõEEñCCéFCÀF@B0@LЍ¹…ª¾‚ª¼…®½‡®½†­»„­¶ƒ­´ƒ¨°¥ªsšœm™˜q¡›r§žr«¢y«©“·¿§»Ì³¹Ì®®À¡¡­•šm|~Uhe+'3Xv''Q - Svrj™‘i˜XyNmlXirR_mn~Ž’®µŽ·²u£f’m‘›o’Ÿlf›v¬~¢´£³«²~¦«}¡©¡¬{Ÿ§q—›n›˜r£›vª wª¢{ª¨z¢§‡¤²…–«†‡£™£…¯F­Kß ô õ õõ÷ÿÿÿÿ ÿ!æ+A±u‘Ç|›²dz 9œ;-áC5ü>3ÿB;ÿ@<ÿ@>ÿ@>ÿ@>ÿ@>ÿA=ÿ?<ÿ@=ÿ@<ÿA=ýA<üD>ùB>÷C>öA?ùB@ü@?ÿA>ÿA>ÿA>þA@þA@ý@?ÿDCÿCBûC=øE>öEBÏCBX $(-nvƒˆš¥Š°²†´®€¯§}©£‚¨¨y˜›)* =¿ÿB?ÿ>>ÿ??ÿA>ÿA>ÿ@>ÿA?ÿ@>ÿ?=ÿB>ÿD?þB=ý@=ÿ@@ý@?øA?ð@?îDBÏGC…1,-*.$GKBG26/3:ÿA=ÿ@<ÿ@<ýA@ò@?êBAáAAâDDäDBæCAïB@ûA@ÿA>ü?<ü?<ÿA>ÿ??ÿEDÿHGþC?ýC=ûA;æGCŸ544 ,21OSX‚…”ˆ•¥€ ¦ƒ²°z¯¦|¯§€¨§Pno%‰//ÝEDûCCÿBAÿBBÿA>ÿFAÿB?ÿEBÿAAÿAAÿA>ÿ@=þ@;ÿ@=ÿ@>ÿ@>ÿD@ÿB>ÿ@@ÿBCÿBCý@AøBBöDCñA@ëHFÌEC| =[\Dpo5jg7lim£žŽÄ¿‹»µfŠ„Md` "qÙFDûFDýD@þC?ÿD@ÿEAÿDAèHF™77/ $ˆ£·Š¯ÅŠ¬Ã•¸Ì·É‰²Áˆ´Á«·ª³«²„¬±{¤§n–›m›œq¤ €¶¯€¹±€¯­˜µ¾ž®¾ ¨µž£¬•œ$-1`¹@>ÓB@äDBçDEäABÚ<<½?>^  Q~{_˜]’…^‰~LkjCY_(8Ixž–À¿y«§f•p— p“ q–¤n–¨w ¶{¤»}£»¤º€¤¶‚£²‚¦®}¥ª{£¨zš v–›wŸžz¨¢z© ®¦‡³²™¾Æ©¾Ó·½Ì¬SºX àô ô ö õõÿÿÿÿ ÿ!ã.C°qŽÁx—¬v*†1!ÚF6õ=/ÿB;ÿA=ÿA=þB=úCAôBAìBAæDBßDAÓ@>Å98©)*•‚~’ ¡''À84ÜEAèEBñA@þA@ÿAAÿHIÿCDÿDAÿD?ÿB=óDAÌ@Al EKPmm}}ƒ–†œ¨„¨®€³¬|¯§ˆ«§":8T ¿CCïECÿB?ÿBBÿAAÿBBÿEBÿFCÿFCÿ??ü?@÷AAñDBìEBçDAéCBëCBôEBúECýCCÿBDÿCDýCBøEDøEDõ??ôBAòHFÄC@P 23†­«‰»·‰¸µ€°ª‚²¬{¥žbƒ|J`[ 278æFDÿEAÿHDþC?ÿDAÿFAÿGDëHE¨<;9}—¨‘³Ê¯Æ˜»Ï‚ª¼‰´ÃŒ·Æ­º}¦¯¨°…ª²„©±yž¦s› qšœg—‘n¦›z¯¦¢ÈÌ­ÈÒ¬¼È¢«µŽ”› ˜)'Ý@=ï?>ó><ï<;î;<é65Ô>=ˆ/+'  HqsVŠd™c‡TvpJce1@[rƒª¬‚±¯n˜m”œp”žv™¦p˜ª|¥»}¦½¤¾Š­ÇŽ°ÇŽ¯¾£­}¥ªy¡¦‚¢¨{˜Ÿ{ ¤{£¢w¢™qŸ“‹º± ÊɬÌÙ­ÎѵçÇ_Æe!á õ ö ö õõÿÿÿÿ ÿ"á,G¯r“Át•¨y•–%31F º;,å;/ò:4ö;7ï;6æ=9Ø?<Æ>?­;;†&&X ?2%#  6n!®:9×AAî>=ö98ü?@ÿBCü?<þB=ÿ@@ûAAî@@±32':CFRT^tw†‘—®“¥¶ƒ©«ƒ¬¥pŠ„ #‘##Ý??ûA@ÿ@>ÿA?ÿ>?ÿ?@ÿA?þ?<ÿB?÷:9ð<=à<=Ï?>µ;;¦:9¢87©86Å@=Ü@@ð?Bù>@ùB@øA=úECúCAýCBÿEDöA?ßDA›2/88QSkkŽp“n’Œi‹„^}tQhc7¤53éDAÿC?ÿC@ÿEBÿCAÿCAÿB>ìFA§868 {’¡‹¬¿‰¬ÀµÉƒ¨¼…­¿‹¶Ç‚®»„«³„¨®ˆ©²Šªµˆ«µz›¤s–šr™—~­¤‚´ª€­ª‚§«©µ•¥±tz.·63ïB@ö?=ûA@üDDüDDõ;:ÜA>¡=;5 Hnr\Œ`‘e“]{Rol-AL>T`}š¡š¿ÃvŸ¢l•˜s—p“}¢°}£µ¦¼£»£»‚¥¹£³€£°ƒ§¯}¡§€ ¦€ ¦yš£q–šm•sž“y§š‡³¬—»Å¦ÍϵëÎ\Äg$Þ ô õõôôÿÿÿ ÿÿ"á5N´}Èwš¨x˜—H_[#r ±5*ÏC=Î=;Â<8ª1/~Z@) Hž00ÜC@ï>;ùAAý@Aü?<þA>ÿ@@ÿ?@ÿAAÒ?=I  &(]cjfgu~—•¬ˆž©ˆ¤¤OaZ <¾88ï=<ÿ@=ÿ@=ÿA?ÿB@ÿ?@ÿ@@ÿA>÷B@çB?Ï><§//pE33:Y! Å=>àBBîA?øD?ûD@ýD@ÿEAýB>ÿDAí@=Ê?­85íCAÿC?ÿB@ÿDBÿDEÿDBÿC?ìFA¤848 u‹—Š«»‰­¿Œ±Å„©½†®À‹¶ÇŒ¶Ãˆ­µ‡©¯Œ«´‹©´‰©´ƒ¢«¢t––|¥ž¬£…³­‹µ´–¸¾–ªµx€‡ 3½2/öA?üA=ýB>ýCCÿEDø<;âB@¢;96 Giof’™X‡‹kš˜aŠƒSuo=U[/CNp‰“”´º„«­r›w™Ÿ~Ÿ¨£­s˜¦}¢¶¤º|¡·€£·¥µ€£±£°¡¬ ©¢«|œ§w™Ÿt™—w ˜n™Œz¥œ¸»©ÖÓµïÒ[Åh"Þ ö ÷ ÷öñÿÿÿÿÿ!ä9L³Ž¨Ð€§¯y¢›nŒ‡ 3d!S B *  .1!99>^YA`]"6;$;¨4-ßC=ôBAú@@ü@?ÿB?ÿA>ÿ?<ÿA>âEBs! S\`T[dll~‘’¦Š”¥‘˜&$eÕCC÷=<ÿB>ÿB?ÿ?=ÿA?ÿ??ÿ>>þ>>ëDAµ:6g . %O •+*ßFEøED÷B@üBAÿEDþA>þC?õA<êBA«-,3?VXe„ƒ_€|WyrXzsJle6OKI¸=;ïDBÿC?ÿCAÿDBÿBCÿB@ÿD@éGB 742 vŒ˜Œª»®Á´Æ³ÅŠ³Â†±À‰³À‹¯¹ˆ©²‹ª³†¥®…¤­…¥«†£ªw˜›xŸu¡š®¦‚®¨†¬¬šµ¹yƒŠ 9Â52÷@>úA=ýB>ýCCÿEDö:9áDAœ;85 Pox^‡UƒŠ`‘j™‘S|uJei,BMj€Œ‰¤®´²vžœxš {›¦xŸ§y¡­¥·¢¶¤¸‚¦¸‚¦¸„¥¸‚¤´£°€£­¢«Ÿª ©{ž¡s›–cŒ„sž•ޏ·°âظõÓWÅeÞ õõôôô ÿÿÿÿÿ å7D°’¥ÐŒ±¹ˆ³¨‚§^yo     /;ARdkpˆŽ›¡‚¡y˜™r›–¦¤ƒ ¥…˜ EQWa ÆA=íCAýA@ýA@ý@=ÿ@=ÿ@<ÿ@<èC@—33, KXZdnuadrpr„ƒ–uz‰  (€&%ÝAAý==ÿB>ÿA;ÿ@=ÿ><ÿ@@ÿBAõBAÒA?d #   L º:;çCDöDCýCBÿDCÿCBüA=úA=ù??Ñ??R  56kЇa„€Jpj9_Y5YS+CASÀA@ñDBÿC?ÿCAÿDBÿBCÿCDÿC?æD?’.*0 „š¦Ž­¼Ž¯¿¯¿‰­½€©¸~ª·†°¼Š¬¹†¦±‹©´Š©²ˆ§°ˆ¨®‰¦­|œ¡|¢¤u›w£œ|© †°©‹¬¨YhkDË<9ú@?û@<ýB>ýCBýFDõ<8ÝB?0-+mŠ“r™¢_•ZŠŒa’Š^ŠƒKjm2IQ,?Nƒ™¤´²y¡œz¡y¥x ¥y£ª}¡±¥·¥·~¢´|Ÿ³‚¥¹ƒ§¹‚¤´ƒ¦³¤®„¤¯ˆ§°£©u˜›r—“x¡š„­¨›Ï¾Ÿâ»OÃ`á ôô÷÷óÿÿÿÿÿæ;BµŸ­á½È•À³„± «™d‡y1I?  -0ÿ@<îCA¯;:@BPOaps]fo]cpxyll~ ;¥:7ãA?ý<9ÿA>ÿA;ÿA=ÿ?;ÿ@>ùB@ßAA”%#+ -4Toys– y§j‰’4GN $tËDBëA@ø>>ÿCDÿCBþC?üA=ÿ?@áCC}"#^}zNvq0YT*VPOtr?YYXÅAAòBAÿB@ÿD@ÿDBÿBDÿCDÿD@çF>Œ($0†œ§„¤¯„¦³…¨¶†ªº†­¼†°½‡±½Š¬¹‰§²‰¥°‰¦¯‡¦¯ˆ§°Š©²‡§­ƒ¥«r˜šp™”x¥œ±¥z¡™UghJ Ó@>ý@?þ?<þA>þDCýFDõ<8ÛB?‡+*'!$r˜}¤­cŒ•T„XІbŠLpp8RX0ANu‰”‰¨«‰®¬}££uœžvŸ¢wž¦¢¯} ®¡±w˜«zœ³£»‚¤»¥·‚¥³‡©¶…¥°‡¥°ˆ§°¤¨zžžm•j”x­™z˜?·Rãõôôòó ÿÿÿÿÿè,2©ŒÆ«¼‘¸°Œº§†µŸ«š}¡“p…|O^Z4AC9HKaps|”‰¡§ª³…¢±‘®ÃŽ­Ä˜·Î’²Å²¿Œ­¶ˆ«¯v˜ž~£§‚«®•µº®ºÆšž©"))àDDý@=ÿ@@ÿ??ÿA>ÿA=ÿ@<òC@¿A@O:KH[mnVdjKU_\^pSRbKµ?:êC@ü;8ÿC?ÿA;ÿ@<ÿ@<ÿ><ï?>Å>=ÿ??ÿ@=þA>þDCýFDô=9ÝDA„-+&$'𤇧²p”œ]ƒˆO|t¢£[C`d@S[Pbm„ž¥®±¦¤u›wž vœ¡w›¥yœ©} ®u–©ƒ¥½ƒ¤¾‚¦¾ƒ¨¼‚¦¸³ÁŒ¬¹‰§²‰¨±‰©¯x›žr—•r›”~³ŸƒÎ¢A¾Vâóööòõÿÿÿ ÿ ÿâ &z…Á‰¡¹¬­›Ã·¼©ƒ²œz¨’¤”£™Ÿ }› ‚ ¥…£¨„¡¨Ÿª‡£´ª¿”²Ë—¶Í°Ã›»È¬µ‘®µ„£¬}¢¦p¢žšÄâµÂ¥¬»57?cÝDCÿ??ÿ@Aÿ@AÿA>ÿ@<ÿ?;ñB?ÈFA_ *;7asrSfiAQXDJW::FWÈJEëDAû<9ÿB>ÿ@=ÿ=:ÿ?;ÿ><ìB@ª74:Shwv–©rœ¯x¥º©À„­Ã£µsŽœ,/+ßAAú=>ÿDFýEE÷@>ýB>ÿ>>ðBB»@>J94,XR,_Xb”’¹»YrtcÍ?>ôBAÿB@ÿD@ÿEAÿEBÿDAÿD@çFB‡&#+}•›~¢ªƒ¦°ƒ¦³‚§µ‚©·©µ{£¯¤®†¤¯†¢­‡£®ˆ¦±‰§²ˆ§°ˆ¨®‹ª³}£s——rœ•lŸ‘‡³¦Ofb HÔ>=þ>>ÿ@=þA>ùDBùFDò;7ÜEA++%"†š¥}—£l…Ur{Jqzn˜`ˆ‡KkjMchVgpo‚Œ¨¯…¬ª{¥žo—–ušžr–žt—¡q”¢q’¥£»€¡»€¤¼ƒ¨¾…¨¼‘³ÃŒ­¼‰©´‰©¯‹«°~¡¥z q˜–iŒe°„4²Håöôõòóÿÿÿÿÿ é#˜Ya€­š¯·Ÿ¼¹—»¯‹µ£­–{¨•y¤—uœšušžxœ¢|ž¤~¦w• œ«Š¨»—¶Í’±È›¸Íœ¸É™µÀ’¯¸“¯º~ ¦w§¡‡µ¯¬ÃË ©¶*,4 #màEBÿ@@ÿ?@ÿ?@ÿ@=ÿA=ÿB>ñB?ËFBc #72h{RjjK^aHQZ "*mÍHAë@>ü<<ÿA?ÿA>ÿ>;ÿ>:ÿ@>åB?ˆ'#+ i“w™°x£¸|¨¿~§À©Àx¡·ƒ¤´'7>"x&!ÞEDù<=ýDFúDDøA?ýB>ÿ@>õCBÊCA[ )$/[UO‚~p¢ |£¥4MQl ÒC@õCBÿB?ÿDAÿFBÿD?ÿB=ÿDBçEC…)('|•™¡§|Ÿ©zž¨|¢®{£¯y£¯}¦¯¡¬…£®ˆ¤¯‹§²‰¦´ˆ¦±†¥®‡§­ª³†£ªx˜q˜–mŸ“„°£Ja\J×?>ÿ??ÿ@=üA=úECùFDñ=8ØC?|*)""&|Œ˜y›^r}B[e/Q^R{„y¡ŸPuqRkmPckYjw€–¡££Š²­u›q——s—t—¡o’ u–©£»€¡»…§¿…§¾Š¬Ã®Á‘³Ã¯¼‰«±…¨¬„§«¢¦z¡o ’e­‚3¯Eãöóõôóÿÿ ÿ ÿÿä48rwz™‘˜§Œ˜¤¤¦¯¤‹´Ÿ¯™®›ƒ¬¤¦¤~¡¥¡§ ©|›¤‚¢­‰¨·‹«¾‰¨¿­Â‹©¼—´Ã‹¦´‹§²~ž¤s›š~£Ÿªª:IK=¢00çDBü?>ÿCBÿ??ÿ@@ÿA>ÿ@>õDAÉB@d&=8l‹„[vsMb`KTXvÖJCñDAþ>>ÿDBÿCAÿ@>ÿ?=ÿ?=áA?l*1}—¨yž´w ¶qž³o›²x¤»z£¼ƒ¤¸3CO`ØBAö9:ûBDúBBûB>üB<ÿA=õC>ÕE@r$Clg[ŽŠc•“n”˜6: w×DBóA@ÿC@ÿC@ÿG@ÿD;ÿG>ÿCAãCCt &%€™{£} ª| ª|£¬|¥®y¤­z£¬‚¢­†¥®‡¦¯†¤¯†£±‡¤²‰§²Š©²“°¹‰¦¯}š¡vššu¡š€¨/E@]ÞBBÿ@@þ?<ýB>ùB@üGEö?;ØFAg%15r…[q|I^f9R\@ODmv}ª§T}vUqrRelfxƒoƒŽˆ¢¨”¶¶€ª£pœ•p•™s– kŽ›r–¦zœ´ º†¨À‡§¾­ÄŠ«¿°Ã°À…¨²„¦¬‚¤ª£©~Ÿ¨v£šg®ƒ4®Dãõôõôõÿÿÿÿÿå!*™SXrv“ƒˆ—„‹š‘§•«©¯¤Š² ‚¯œ„®£}¥ z y™Ÿzš €Ÿ¨u–Ÿ†©³ˆ©¹Œª½’­Â”¯ÃŸ¹É”®º“ª²©­e„ƒNif,?<#pÏA@ñDBü?>ý@=ÿB?ÿ@@ÿ??ÿ?=ñA@ÇCCZ &D?o”Œe„}YpkUaa }ÝICñB?ý==ÿCAÿCAÿA>ÿ?<ÿ?=ßDAc&7@z˜©q™¬y£¶oœ±q µ~­Ã|¥¾‰¨½1CN\ÔA?÷;:ýCCüBBýB>ýA<ÿA:öB=ÛD@v$!GpkUˆc•‘j”";? xÙD@ôBAÿB?ÿB@ÿF?ÿC;ÿC;ÿECâCEh 1<:›œx¡zž¤|¡©}¤­}¦¯|¥®~¥®¤®†¥®‡¦¯‡¦¯‡¤²‰¦´Š¨³ª³—²¼¨²ž§{› wŸu™“)=8eàBBÿ??þ?<ý@=þDCüECö=9ÓB@\#24]syD^e5LT.8%3_fzª¤a†MklZpvZmtUhpxŠ•“­³’½´u¤›l’–p”žk™kžs•¬¡¹‡§¾‡§¾ˆ¨¿‹«ÂŒ¬Ãˆ©¼ˆ©¸ˆ«µƒ¤­¢«ƒ¡¬y£œj®…4®Dâôõõôôÿÿÿÿÿä"0 _m¢lz‘wƒˆ’‹”ž˜ ˆ›ž¬¥Š°¤®¥}¬¤wŸžt—›y™Ÿxš xœ¤yœ¦Šª·Ž¨¸š²Äœ³Ã›±¼†œ¢bqt4BAI¶4/ëB>ùB>ý@=ÿ??ÿ@@ÿ??ÿ><ÿA=íC?¹??J4YUu¡še‹ZukZhg "ãIDöEBÿ??ÿCDÿABÿ@>ÿ?<ÿ@=ÜC@Z*=Dv›©qŸ°t ±u£´{­¿±ÅªÃŒ«À8GP_ÙD@ö:9ýCCý@AÿA>ÿ@<ÿ@<÷C>ÝDCy%"KsnW‡c“k‘“#:< y ÜC@ôA@ÿB?ÿCAÿEAÿD>ÿA=ÿCAåEEe1@<€¡u wž z ¥}¡«{¡­x ¬{¢«€£­‚£¬…¥«…¥«†¤¯‡¥°Š¥³Š¦±”®ºª´‚Ÿ¨w—{¡¡yš–/@=hÞBBÿ>>ÿ?<ÿ@=ÿDCþDCû?>ÕB@]!34Pko3QV7<$*-46fh|¯§cˆQpqUnrRkmObiZes‰›¦§ÏÊz©¡l“•p•h•j‘šyš­‚¢¹‡¨¼‡¨¼‰©À­Ä‰«ÃˆªÁ°Ã°À‰©¶¡¬‚ «z¤k®‡6¬Eâôõõôôÿÿÿÿÿä 1 Zm dzŒi|p|€}…Œ‡’…Ž—Ž ¡­ª…±ª{¬¤}¨¥n””p‘”v”™¢y•œ‘§²…™¤k}ˆ:KT.5 .[©;5áC=úB<üB<ÿB?ÿ@=ÿ@=ÿ>?ÿ?=ÿ@<èC@¡763 @hgnž˜f‘„d„yXji "›*'æGCöEBý==ÿDEÿABÿ@>ÿA>þ?<Ô?;K AW]o–¤pŸ­w¤²w¦´x¬¼}¯Á~§½€ž±!18l×B>ó98ýCCý@Aÿ@=ÿ?;ÿ@<õB@ÚDDt++Kpl[Š‚`‡r—•!99 ßB?õBAÿB?ÿD@ÿFBÿA?ÿB@ÿECäDDe->:‚¦ v¤žv¡žw £y ©xžªvžªyŸ«} ª€ «ƒ£©„¤ª…¤­…£®‡¢°‡¢°«¶«¶ƒ ©p–u˜œz–—-;:gàC@ÿ??ÿ?=ÿB?þA@ÿEDø<;ÔA?]-.;Z]?A'+ 69Wˆ†²ªh•ŒZzyXtuOkkL`eDM[ƒ‘ŸÃÃ…³­r™›k‘•l’—n’œw™©|°…¦º‡¨¼ˆ¨¿‡§¾‰«ÃŒ®ÆŒ¬Ã­Àˆ©¹ƒ£°‚ «{§ n±Œ7­Háôôõôõÿÿÿÿÿ!æ#2 Vjš]t„awuewvp||x~ƒ}€ˆ€…Ž‹›¡‰®¬†¶°}«¥uŸ˜mŒi„[nqKZ]+5<  :f ¢-.ÎC@æEAöCAýB>ýC=þB=ÿ@<ÿ?;ÿ@@ÿ@@þ?<ÞD?x%$Sy}a‘’e’‰iŽ„[qo#¡,)êGD÷DBü?<ÿECÿA?ÿA>ÿA>ü?>Ð?=B DZ_s™¥p«n›¨r¤°t¨¸y¬¼{ ´€šª"%}.+ÔB=ò=;úDDûAAý@?þ?<ÿ@=óA@Ñ@Bh !99OplMxoZ‡~kŽŠ.,"ãB>÷B@ÿB?ÿD@ÿECÿ@@ÿCCÿECåECb,:8„¨¢y¨ w¥Ÿu¡ tž¥t¦sž§x¡ª|ž«Ÿª€¡ª‚¤ª‚£¬ƒ¢«†¢­†¡¯¨¶‡¥°€Ÿ¨y˜¡‚¢¨…ž¢&24 "påCAÿ?=ÿ?=ÿ@>ÿ@@ÿEDû?>ÖECY )*DD21(*'ONNzynš®¥g‘†]~zUqqXttH_a6?Lco{ª¯›ÁÃtššgŽn”˜m’šmž{­„¥¹†¦½Š«¿Œ¬Ã’²É‘±È†¤½‹ª¿ˆ¨»‚£²„¤¯}©£o³6­Jáõõõôôÿÿÿÿÿ å!3žTk™Ys^yue|wi}xkuuinqhks{…Œ‰¥¦´²‡­§\~w62 #-I p#  ;9ÌEGâCEôDCüBAû?>ýB>þB=ÿA<ÿA=ÿ@<ÿ@@ÿ??úC?ÒEBO 13hŽ“[ŠŽbŒq—‘d|z%¡*(îIFùDBÿ@=ÿDBÿB@ÿA>ÿ@=ü@?ÑB?B Ibfv™¦rŸ¬t¢­p¢®w«¸w¨¸z¢´y–¤"%~,+ÕC>ï:8ùCCûAAý@=ÿ@=ÿ@=òBAË?@]ùB@ÿB?ÿD@ÿECÿA?ÿC@ÿB@àEBX7@Cˆ§¦€©¤{ª¢v¦ q¡¢n¡o¤už§} ªŸªŸª © ©€Ÿ¨ƒŸª„Ÿ­Š§µ‚¢¯Ÿªyš£|™¢xŽ” %€% æCAÿ?=ÿ><ÿ@=ÿDCýCBö<;ÎA>G 8MKRywJvuc‹Šrš˜«¥‡³¬{¥šiŽ„[|u]zwTppF_a9FN@OX£®­ËÐ|£¡m•“o”˜r–žn‘ž‚¥³…¦ºŒ¬ÃޮŔµÉ‘²ÆŒ­Á‰¨¿’±Æ‹«¾‚£³„¥´{§¦n³’3¬Jàõõõôôÿÿÿÿÿ!ä4VqXv\{t[zs]xo[qlVgcTa_]iiu…‹Ylq 23 )<_ {)(¸52È;8ØFAÝB?æA>ôGEò?@øBBýFDþC?ý@=ÿA>ÿA>ÿ@=ÿ??û?>íCA¨0+'þ?<ü?>Ñ@>AE`dv¦pªt¢­s£¯p¡±r¢´z¨ºhŽš "#~*,ØBAò;9úBBý@AÿA>ÿ?;ÿ@<õDAÉ@>ZFWZ\vvAi^R}ph‡€# %ž&&è@?ú@?ÿB?ÿDBÿFBÿA=ÿD@ÿD?ØFAG POYŠ›¤¡¦}¨¥w¬£qª¡m¥ o¡¡tž£{ž¨|œ§~›©|œ©|¦{œ¥›¦€œ§ƒ£°~ ­{ž¨yš£}š£z– +‹*&åCAÿA>ü?<úA=üECúECó><ÉA=>YihŠ©¨†­«´²´°‡­§€¨m†e‡|Wyo`xWssOhjEX]1BKmzˆ±¼‰«ªn—’l–r•Ÿo“} ­~¡µŠ¬ÃˆªÁ‰ª¾ˆ©¼‰ªº®Á•³ÆŒ¬¿¡´„¤·{¨«n´–1¬Lßõõõ õ õÿÿÿÿÿ"å9¡Yy¤Y|†Y~vX{qSujQodJbXFTN;FC   '>f‹.+­89Ã==Ô>=ß<9ì97ò95÷>:ö>8û@<ø>=ù@BûCCýCBÿEAÿB?ÿA>þ?<ý@=ýA@ìBAÉ@>f f~„lŒ™n‘Ÿb†h‹f|z )­20òGEþDCÿ?<ÿEAÿC?ÿ@>ÿ@=ü?>Ì<;>Ibfsœ¥p ¬o¨t¡®u¤²{©ºt¢³n” $&"…--ÙA@ó98ýCCÿABÿA>ÿ?;ÿ?;óDAÇB?WO^a^vvEjbFkak‡!' $$ëA@ú@?ÿA>ÿDBÿDBÿA=ÿD@ÿC@ÕFCD GFPŠ˜y‘yž¢x©§v¯¦o¬¢n¦¡q¢¤u¢wš¤w˜§xš§yœ¦y¥}›¦}›¦€¢¯|Ÿ¬xœ¦t˜¢z˜£v•  +Š)%äC?ÿ@=û@<ùB@øCAúGEòA>ÇB?< P^]z””s“’v•’mŒ‰d†€_z\~t]u[s^wYxuQmmI`b:LSLWež®º•··vžœl‘•q•xœ¤} ª‚£¶Œ­Á°Ä³Å±Á±Á•¶Æ‹¬¼Œª»‚¢µ µ|©­s¹›4¯Oà õõõ õôÿÿÿÿÿ â;¦U|©dŽ›cˆ\‡zXpStfIaU;H@ ,O€­02Ë?@ÝEDåECëEDïCCõE?úC?ÿCBÿCCÿFBÿG@ÿFBÿDDÿCEÿCCÿDAÿE@þ=:ý<9þ@;ö@:ê@>Ç@>u"!#>TZmˆ’k†”iˆ—Wy†^}†Qgl0¾<7õFCÿDCÿ@=ÿEAÿD@ÿ@>þ>>ù?>¿642^uwwž¦m›¦oœ§oœ§s¡¬v£®rœ©d„ 0•63ÞC@õ;:ÿCDþ@Aÿ??ÿ@=ÿ?;ðC@Â@@RYfh~’“QpmEgad~x ' %#ìA?úA=ÿB?ÿA?ÿCDÿA?ÿA?ÿDCÒBAB 6=ûAAúBBùFEê=:¿>;9 1?>OdfNgiWoo^vta{{_|yUysMtlIqfNvkU|tVxrZrrGZ_?KUt‡Ž­°€§©r›s™} ¤€Ÿ¨ƒ£°„¥´ƒ¨¶„«¹…¬»ˆ¬¼Š¬¼‡¨·…¤³†¤µ‰¦»‚¬±s·˜7°Náööôôõÿÿÿÿÿ!æ7¤Px¨f’£g–“i—‹b‹|[|mH_Q  %N,)¼=<ÜDCîBBûCCÿB?ÿA>ÿ??ÿB?ÿE=ÿD?ÿAAÿAAÿFBÿE?ÿCAÿB@ÿABÿBBÿC@ÿC@ÿC@üA=óA<çGAÀ>9u) ,1l…h‚Žf€Ž]x†Pp}PmvI\c3¿:6ùFDÿCBÿA>ÿECÿB@ÿ@>ÿ??÷@>»420ez|v›£mš¥mš¥k™¡sž§r›¤o’Ÿ\y‚  6 =9ßB?ö<;ÿDEÿABÿBAþ?<ÿ?;ìB>¶87G x„ˆŽŸ¢YuuC`]Qhd(«,+ïB?úA=ÿA=ÿCAÿCDÿ@@ÿBBÿCBØDDT1:=\fpWfvm{’x’£u £s®¦u¶­r³ªo¦£lœžk•¡q™¥v¦uœ¤sš¢r™¢|£¬y ©r›¤l” n‘Ÿi… ,Ž+'åE?þ@;ü?>ú@@ûCC÷EDê=:¿>;; *66DUXNadSgh_stdyzYuuPso>g_?jaAocP}tW€yYxu=TVJZaUhpФ«Ž±µ€ª©n˜—v™‚Ÿ¦‚¡ª‚¢­‡«µˆ®ºˆ­»†ªºˆ«¹‰ª¹Š©¸‹ª¹­Àе¸|À¡;´Rßóôöôóÿÿÿÿÿ å/Kn [†™iš˜n•l”ˆ\vh!0qÀ=:âB@ìB@õB@ûA@ÿC@ÿB?ÿA>ÿA>ÿB=ÿA<þ@;þ>>ÿ??ÿ?;ÿ@=ÿA@ÿB@ÿC?ÿA?ÿ@Bÿ@BÿCB÷GFàGD±:8Y #Kdn`z†_y…^x„RmwHcmF]e;KQ0¾88ûEEÿC@ÿ@>ÿECÿB@ÿ@>ÿA>ú@@¿34/i}~t˜žk–Ÿk–Ÿj•žqš£r– o‘ž^yƒ 9£?:ÞC@ö<;þDDý@AÿBAý>;ÿA=íD@®75? {†Ž‰™ f}LdbQda ,µ33óB?üB<ÿ@<ÿDBÿDDÿAAÿDCÿDAàGDo "(-bpvYjsQ]oo€“t”¡ož¢}¹³¼²w®¥o žj–o˜¡rœ£pš¡o™ q˜ y ©uœ¥p— n•žl’ž]zƒ 6 43éDAÿA>ü?@÷>@úDDöDCì?<¸74/ GON]fihuwgvyvŠ‹i~Zwt>c[4_T5f^AvmK{uS{XzKlhG[`HYbs†Ž•²·ƒ«©mš—t—›|›¤~¦‚¡ª‹«¸¬»ˆ¨µ†¨µ‡¨·ˆ©¸‰ª¹ˆ©¸‰ª¹†²±r·–7°Nâöõôôõÿÿÿÿÿå.œGgœU~”`j•’r—/F8+xÉABìA?ú>9ÿA>ÿB?ÿA>ÿA>ÿ??ÿA>ÿA=ÿ@<ÿA<ýA<ü?<þ<<ÿA?ÿ@>ÿ>>û?>öA?ñDBìCEäCEÙEE¾=:•)(T !#>WaRp{Sq|OluKfpB]g:S]2GO(4:0Â7:ýEEÿC@ÿA=ÿECÿB@ÿA=ý@=ø@@¾45/g}{r—›g“šf‘šj•žl•žn•žr”¡f‰ 9¢<7áDAó<:þDDþBAþA@ý>;ÿA=ìC?¬65< †’œ—¥±yŒ‘[pnN\Z -»55öA?ÿA<ÿ@<ÿCAÿDDÿCBþC?ÿB?æGC•1-2 L[]Qdi@P\Ueu~–¨„¦³~®¯·°~³©u¨¡p›žn˜Ÿm—žk•œm”œo–žyž¦u™£q•Ÿr– t›¤]z<§69êBAÿ@=û>?ø@@ùCCøEDì<;´30-_dez‚ˆŒ€’‡›œkOmh0WO6cZJ|xWŒ‰X‰‡Yˆ…c‘‹T|wKghBU\TclŠ ¦ƒ¨¦}¨¥z ¢x›Ÿzœ¢Ÿª†£²ˆ¥´†£±‰©¶Œ¬¹‰ª¹ˆ©¸†§¶…§´€­ªs¸—6¯Màôóôôôÿÿÿÿÿä-›<[EiQy~c‰‰Wvo +}%ÓDAï??ûB>ÿB:ÿB>ÿ=;ÿ@Aü>?þA@ÿB?ÿA=ÿA<üA9ûA;û@<þ>>ÿ>>þ>>ðA>æDBÖDD¼=<0.($U 3% !50SroMsxLu~8]eCdm3R[0OX$@K&:E#9ËýA<ò@?±//* f…~rš™h•™f’™k–Ÿh™¡l›£l“œ[w~ @©=9ãCAõ;:ÿCDÿBAý@?ÿ@=ÿ@<íC?«76< „”¡œ«»…˜p|~P\\ -½34ù?>ÿA:ÿA;ÿBBÿEEÿC@ÿFAýB>éDA¶?=G&%LabBX]9MXUfyvŒž{Ÿ§}©¨ƒ·­|°¦x¤£ršŸn“›m‘›p“q•x¥{Ÿ©r•Ÿo‘žp”ž[w~ ;§77êC@ÿ@=ü?<ýA@úCAùFEí=<³11) x{™œ¤˜ §”£¦¢ d}y?`Y+XOK{umŸs¢¦`“W‡‰_’Ž_‡Fhg>UWDV]p‚‰ƒ£ˆ¬¬|¦Ÿrž˜w›¡y™¦~›©ž¬ž¬„¤±†¦³‡§´†¨µ‡ª´Šªµ‡³­y½š:³Qáôõöõôÿÿÿÿÿ å*˜0L‚7UpCdmXuy1.\ÃC6ñA@ÿ??ÿ?;ÿD=ÿ?=ÿAAÿBCÿCBþBAüA=øA?õDAêFAáE@ÜCBÜCDÞEDÍ<:®0,!pO7%)55f}Vz5eg3cgLP2\a#IN"FN6A,6 CÓACÿDCÿD@ÿD=ÿFBÿC?ÿB>þB=í@>¥'&' w™v¤ži™še–d˜e™ f—Ÿn•žMgnK´C@âB@ô=;ÿCDÿBAý@=ÿA>ÿ@<íCA¤537 ‚•¢•¥¶ƒŒ–€†‹Waa 3Â35û?>ÿA:ÿA;ÿBBÿEEÿEBÿE@ÿC@ðCAÐ@?{)!32?STJ\cGTdkyŒ{’¢zœ¢†´®ƒµ«}ª§r›j—j—p›r’x¥v›£gŠ”jŒ™l™Xry=¬87íCAÿ@<þ@;ÿB?úA=øECë><³34'Ž‘•ª­µ§¯¶’¤¥s‹‰Fe^+PH:hbp¡Ÿ¼À„­¶m–ŸWƒŠXŠŠi›—U}xIfc9NPCSZx‰’Ž©­…¯¨x§Ÿuž xœ¤~ž©‚ «‚¢¯€ ­‚Ÿ­ƒ¡¬¡¬~¡«‚¡ª}©£p´‘5®Láõôôôôÿÿÿÿÿ ã %“.J€:WrHcmH[` +*â@4ýD@ÿ>>ÿEBÿA>ÿA>ÿCCÿB?ÿD@úA=ôA?ëCBÖBB·><•1/t "aZE+#   &+HTVauve„\„‚L|};qqQQ!TV?Cí@>¡#"' !| ”v§Ÿf˜–a‹b–j™¡h–žs—ŸG]cV ¾GEäC?ô=9þDCÿCBý@=ÿ@=ÿ>:çB?“*'0 ‡¡­ˆœ­…Š™ƒ„ŽJQT <Ê9;ý@?ÿ@<ÿ@=ÿCAÿDDÿEEÿB?ÿB?üBAïAA¿99T /8;AJSOZho}“~—§„ª¬ˆ´®„µ­v¥¢l”™l™p’Ÿt—¡{Ÿ§o•š_ƒhŒ–q‘œVks E°88ëA?ÿ?;ÿ?;ÿB=þD>ùGBç=;°53' ž¦¦·¾Á°½¿ƒ™—Ooj2YQ.XQc޼¿”»Ãvš¤aŽJnxS€„i—˜i’Img>VV1AGaivަ²°~­¥u£uŸžzŸ£{œ¥€ «~ž©Ÿª„¢­„¤¯¥­…¤­~ª¤qµ’6°Láõôõõôÿÿÿÿÿ!æ)—=YCazSmt%15F É=0ö?5ÿD?ÿDAÿB?ÿDAÿDCÿCBÿD@øECæDBÒBA­33|L.  0-DWT‚‘”†”šq…h{~a}}jn›YŽ‹H~~8nn+]]"ORBE=@-. HÔ@@ÿDCÿE@ÿB>ÿEAÿD@ÿ@<úA=ìB@$"%#~¢–}¯¥g›”`‘g™h–žf’™r“œCY_Z ÁFDæEAð<7üECþBAÿA>ÿ>;ÿ?;çFBŠ%#+#${›¡„Ÿ­ §¸ORV CÑ??ÿ??ÿ@<ÿ@<ÿDBÿDDÿEEÿCCÿB?ü=:ÿCBäB@¡42G""+43=Oxˆ™~˜ž†«©ˆ·¯|­¥o˜šk—o’œw• €œ£t‘–gƒŠ`|ƒcz‚:JQR½?>îCAÿ@<ÿ?;ÿ@<þD>øFAç@= )'""¶¾½¼ÄÄ•¢¤^tr7WR4[SPyt}¨«šÁÉ€¤¬iˆ‘Ws~Pp{7^g`Šoš—V|v=WW8HNMS^†œŒ©®ƒ«ª}¬¤v¥wŸxž {£~¦€ž©‚ «€ «€¡ª¢«z¦Ÿn³Ž4®Jáõõõôóÿÿÿÿÿ ã,š>YŒ9Yp8RX  %t"ßH:þB7ÿF>ÿB?ÿA>ÿ@=ý@?ý@Aù?>åBCª56c,  &*+åD@‹*') !!r˜šŒ­¶š¦¸““¥YY_ EÔ@@ÿ>>ÿ@<ÿ@<ÿDBÿEBÿBBÿ@@ÿC@ÿ@=ÿ@@üECåFB¼:5x; !*aqx…¡¢–Á¸„³ªy¡Ÿs™›z™¢‚œ£_ms,59  \Ä@@ïB@ÿB>ý?:ÿA<ý@=÷DBäA?–%#  V\[ino@IL6FE5KIB`[q“’…­²²ºx•œh‚‰Idn7V_*MWNs{q›šm”’Mii>QT1:CX`myˆ˜ˆ ¬€¨¦{ª¡}ª¡|¦Ÿzžž}£~¦~ž©ŸªŸª~Ÿ¨w¦žm³Ž5¯Kâõõôôõÿÿÿÿÿä+š?W‹=\q/HL7 :.çE9ÿA6ÿC?ÿC@ÿA>ý@?ü@?õBAêDC´22D !#1?EL^eh{ƒv‰‘v•v‘›x•žu”t–œz¤£w¢Ÿz¥¢†§ª…”mv€ZhnYmnejŒ‹všš|£¡…­¨„®§„¯¦Œ®§CTPR ØFAÿDAÿC@ÿ?=ÿFBÿD@ÿBBøCAáB>“%!#%"’³¬ˆ¸¬o¤›aŽ‘g‘˜k•œr™¡r”šA\`[ ÅFEéHDî<7ýFDÿDCÿ@=ÿ?=ÿ@=áA?Š-,%p›˜Œµ¸¡´–œ¯^^d FÕ?>ÿ@=ÿ?=ÿ@>ÿB@ÿDBÿ@=ÿDAÿ@=ÿ@>ÿ@>ÿC@úA=îEAÓED¢22^0  4GJ±ª·¬‚«¤x›{–šK^c ,dÐBAóA@ÿ=;ÿA<ÿB?þA@öCBæCDœ'(#)(`zz‹«±€Ÿ¨t—e†;W^@_h,LWÿCCÿAAý@?ü@?ëDAº=9` -NGW~vo““x›Ÿp’˜z™¢w–Ÿx–¡|™¨y˜§u—¤w›¥y¡¦už¡y£¢ƒ¦©Œ¡©x„Žjs|T_c@RQEZXZopd||oЇu“Ž}Ÿ˜‡£3?9_ßFCÿDBÿA?ÿ@>ÿFBÿEAÿ??ø@@ßB?€"&89›º·¾µo¤›]Ž_Ž’f•™m—œy™Ÿ(>CrÐHIæ@?ó><ÿFEÿBAÿB?þ?<ÿ@@ãCC|""" &&z«£s¢ Œ¥µš¤¶aejHÔ>=þ?<ÿ?<ÿA>ÿB@ÿFBÿB>ÿ@<ÿ@<ÿ@<ÿCAÿ@=û@<÷B@ñCCæBCØDD¯0/zK#4JE‘°§¸­‚§ŸH][%9RQ@NzÖ?;ûDBÿ?=ÿA<ü?<ý@?úDEæBCž$$3 J]bvŽ”f‚‰]zƒ<ÿD@ÿDBÿAB÷AAÜC@y />A ¾¿¼´n¥œd––^Žf•™tž£€¤';@vÕIJêBAô=;ÿEDÿCBþA>ü?<ÿ@@àBBl!@=|°¦o£œ¯¼’¢³DJQ S ×A@ÿ@=ÿ>>ÿ@>ÿC?ÿEAÿ?;ÿA=ÿA=ÿ?;þ?<þA>ý@=ü?<þA@ý?@ûAAìA?ÖD?¶@;x$< ZqiŸÂ¸‡©Ÿ*&0m¢53ÁABÂ>>°75µ93É94ìEBý@=ÿ>:ÿ>:ÿC>þA@ùAAì@@À21udcXC:3  Uekj„‹Yw‚B`k/OZ%IS8dkYŒr¤¤h“YzvG^`DRXNU^hn{{…–ŒŸ¬~ Ÿ¬£}«Ÿx§žw¢ŸvŸw›¡{œ¥{Ÿ§w¥Ÿl²5¯Kâõõõôôÿÿÿÿÿ å.žCXLaw'*#}ÝJ@öG:ÿA4ÿH=þC;þ?<ÿ@=ÿB=ÜD?ioŒ|™ |¯¨|µ¬r£¥e“›eŽ—hœkŸ^„–bžd¡i•¢l–¢u ©v¢©t¡¥oœŸj›™„­¯|–¢iy…eptXbbZcfW`dZad[dgVbdcoo%+*eàHGÿC@ÿC@ÿ?=ÿC?ÿCAÿBBõBAÖ@?x,6=‘ª®†³°v¬¥k›d”•i˜œtœ¡~ž¤*@EtÑGHìDCô:9ÿCBÿFEû@<ý@=ÿ>>Þ@@h"A>|±¤uª¡²º‡ž­>FM]ÛCBÿ@=ÿ>>ÿ?=ÿD@ÿEAÿA=ÿ=;ÿB@ÿC@û@<úA=ÿA<ÿ?;û>=ý@Aú;>üBBñDAäD>ÙFD²>=Q ‰¡™}• +*(ÑHFìFGî?BòBBîDBíC?öA?û>;ÿ?=ÿA>ÿ@<ÿB=ýA<þC?úA=ñA@ãCCÚDDÝEDØECÔFEËDBº;:‡#!8 "&f|‡Sp~Keu/N].U^7elM}lžžm—]†~IdaEYZP\`S\emtƒ†¡“©´†§ªz¦Ÿz¬ {ª¢v¡žwŸž{¡£| ¦s¢šj°‹4®Iâöõõõõÿÿÿ ÿÿä*š>R‹FZs"(#€àKAöE8ÿB5ÿG<þC;ÿA>ÿ?<þ@;ÞFAg ]l|z–¡{ª§ƒ¼´wª¬jš g‘g‘žbˆš`‹œnœ­c”¤oœªu¡®„®ºz¥®|¨¯nž l¡žw©©| ª{“Ÿn~…fosgmtkotqtyruzhnsw~7<=I ÈA?÷FCýB>ÿB?ÿFBÿA?ÿB?ðECÄA>Z,3<…˜ •¼¾´°lŸ›e—•j™u¢}£(?AmÌJJå?>õ><ÿDCÿDCüA=üA=ý==ÞEDa;8v¨œt¬¡q› Ž«´CMT]ÛCBÿ?<ÿ=>ÿ?=ÿD@ÿF?ÿ@<ÿ@>þA@î>=È-*Ø>9öB=ÿ@=ÿBAþ@AÿBDÿBCþC?ûD@÷B@ÝDC =98]lhbqmHµ@=ðFEÿAAÿBDÿ@AÿC@ÿFBÿ@>ÿA?ÿ?=ÿA=ÿA=ÿ@<ÿB?þA>ÿD@ÿB?ÿDEÿDEÿFEÿD@úCAøEDî@@ÒBA…//(  YnvZuƒMjy7Ve8^j;foQ†e——o¢šaŽ…XxsSjfOdbYhk^dqrvˆ‰•§†œ¨€¤¤~ª£}¬£z© x§Ÿx£ y ¢q£™h¯‡4®Iãöõõôôÿÿÿÿÿ æ- =VŽG^x.5"yÜL@ùH9ÿA4ÿC?ÿBBÿ@@ý==û?:ãGB…&#+  3=Ooƒ”¦¨À¾€¶¶m¢¥d“›l˜¥e’ h–§m›¬i—©x¦¸~¨»‰¯Á~£±~¦«}©ªj˜™u£¤y¨¬}¢ªzœt€Œou€vy„ˆ„ˆ}„‡‡Ž‘SXY(—.+âKGöD?ÿ@<ÿCAÿC@ÿD@àFA”2,0>@Ky‡“‘±¶°®z®§q§¢h™›uŸ¤ž¥H]_R ¼GDäB@ò=;ûFDùB@ÿB?ü?<ù?>Ì<;I  4SPr¤˜w¯¤lœ‰«±=IOYÛBAÿ@>ÿ>?ÿ@>ÿC?ÿE?ÿ<9ü?<ðCA¾1.\ˆ$ ÝB?ú@?ÿFCÿC@ÿ@@ÿAAÿD?ÿD?ÿCBïEDÇCC` -55DLKf ÍFDõEDÿCAÿ?@ÿ>?ÿGCÿG@ÿ>:ÿA?ÿ?=ÿ@=ÿA>ÿA>ÿAAÿ@@ÿC@ÿDAÿBCþBAý@=ÿDAúCAûDBò87ã@>¶ABN @SZ[v€Gep<^k<_lCkwR~…[‹f™’i˜_„zWvoKd`Sdgdmv]`opt‡‚Œž‡›¦ £{¨Ÿ|¯¡z¯¢v©¡y£¢t¦šh¯‡4®Iâõõõôôÿÿÿÿÿ æ/Ÿ:UTm‡3EL`ÈF9öH;ÿ@6ÿDBÿ?Aÿ=?ÿ>>þ@;éC>±86H DM[…ž¢Ž³±’¿¼x¨©m—œn— j’žo–¤s˜¦£³ˆªºu–¦l…•TlxIfk]{|\{|g‰‰x Ÿ~£§~˜¤|‹›€ƒ‘‹Š“—˜œ“”–™˜›‰‰HŸ40×HEæC@íFCéGEÜFE¬96J  GIS`ivŠ£­µ¹€±©n£šk›œu¢€¤auz 5—85ØGEê=;÷FCùFDú@?ò@?ãCCœ('+ Rqnt£š¶¬z­©„ª¬LYa AÉ>;÷@>ÿ>>ÿ@>ÿC?ÿFBÿ><ôC@ÔCA{04–%#ÛBAùFEÿEEÿEEÿCAÿD?ÿD?ÿBBôDDÔDC}>CFsÒFEóDAÿC?ÿ@AÿB@ÿFBÿJBÿC?ÿ><ÿ@@ÿAAÿ@@ÿAAÿ?@þA@ÿCBÿCBÿDCýA@ÿC@û@<üBAûA@ö74ë;:ÎDEj"28]w~NnyIlyBesHm{OzƒZ‰_Žg˜dŽƒ\wVunRjhbpvPVagi{x|ƒŸ€”Ÿ~ Ÿ~¬ ´¦¶©­§s©˜g²†4¯Gãõõõõôÿÿÿÿÿ ä3¡Nj Zx‘CY_?¦:/çA4ÿ;1ÿA?ÿ@Aÿ@>ÿ@<ÿ@<÷C>âEB,"'(^olލ¢„¤Ÿt“–w”™y˜o„ŒVksEX`#4= *=:`xx†£¨£®–—¥¦ «¡¡§ž£¦¥®±œ©«…”–EQS+l86¬?=”/-j3 #*->DIFOYw†––¯¹‡±ª{ª¡y¡Ÿv›Ÿ|™ {‘—!#K µ99Û;;å86í<9ë;;Ø>?¥79I(79s‘’vŸšw©Ÿ}³¦t˜q‹"’&"ÝA<ï=8û:6ü;8ö74õ;;Ü@@›4183ˆ$"ÞCGüACÿ??ÿ@>ÿC>þD>ÿEBöFEÑFCr%*3TYb\ Á??ê@>þ@;ÿ?;ÿA=ÿB?ÿC@ÿA=ÿ@<ÿ?=ÿA>ÿ@@ÿ@@ÿ@@ü@?ýCBýFDýCBþEAþC?þC?ýCBÿDCù84ò>9ÞFE† ! ![q}Ggr@frChvCjxCp}P‰V‰‹]‹g–c‚^„xWyoZrpYjmYbl\apil‚‰„•¢€¡ª¢ƒ²¢°¢v³™g¹…2´Eåõ ÷ ôöóÿÿÿÿÿ ä4¢On£Z|“Tos '†-"âD6û:0ÿB>ÿ?=ÿ?=ÿ@<ÿC?û>;õBAÐ?=v7# /@<(:;%69*.  lˆ‰ ¸¾¤§µ°«º««±¯´·®º¼‘£¤r‡ˆMab$$0;0 *(DTSàD?ã@>ß??×BE¬87M 2š'*ßDHòBBþBAÿEBÿDAÿB?íHEµ>ÿ@<ÿ@>ÿ@>ÿ??ÿ@@ÿ@@ü@?þDCûDBüC?þEAþEAþDCÿEDÿBAü;8òA>ÕCC| (SlvQt~Iq}Ejx>es@mzOƒŠUˆ‹Y‹‰d•i™c‚Z‚vVwpOgeUfi`jt\`sqt‰„‹Ÿ†•¥€œ¦žŠ¶©{¶šhº…0²Cåõõòõôÿÿÿÿÿ å5¥Ut©]„š] TÔC4ù@2ÿ@9ÿ?=ÿ@>ÿ?=ÿ@>ÿ@@ý@AòDDÕ??¥++\2  '5L` r_ ; ,*Šž£®µÄÀ¿Ï»»Á·¼½§¶¸–—WooD_\-JG73 2GD\vpG`\9KLDPVW\kŒ—¥•°º‡­¯|¨¡|¨¡{ž¡|˜Ÿy•*-)J I 5#8GJ„Ÿ£z tœšt£›‡¾­lœŽ£«pw† 0_Œ/.Ÿ69Ž+-p"#: 5…(%ÓEDòDDü?@ÿBBÿFEÝGF|)(" MY_o{ $i ÄFBçGEîBBõBAÿCEÿEFÿ@>ÿ@>ÿA>ÿ@>ÿ?=ÿ@>ÿA>ýB>ÿB?ÿFBÿEDýCBûDBùB@ýCBÿDCý==îDCÀFFT +BDXx~Ry@kt?gsFnzJxƒT…V†ŠQƒƒ]‰hšk›_Š[€vSqlOgg^ntR[h^evv{‡¤Š–¨†œ§ˆ«§„¸ sÀ4³Fãöõôôôÿÿÿÿÿ å!6©Xw®b‹¡m“•;PM 2¬2$çA4ûD;ÿA=ÿ><ÿ?=ÿ@=ÿ??ÿ@@û>?÷??æBCÄBB+)Y :("$#'0Haƒ($¢74¹B@ÄC@ËDBÂCB¤96dPcf®»É¾ÅÔµ·¿²·ºž­°n††Fa^9[U5^WIrkYytF^\*-  27Tpq{›šm’ŠPqj=US9GM4:Eclz†˜©…£®‡³¬~®¢y¡ }¢ƒ ¥s‰Ž(79  >JN†šŸ„¤©t›rœ›qŸ™¸§t¤˜€š¡š¥³[]e   *8- :FLeqw,x¿;;äHIçDEÙFDž/-< %%ctwctw&..1h˜'%©--Á9;Ð>@çCDù?>ÿ?=ÿA>ÿA>ÿ@>ÿ@>ÿ@=ýB>÷DBïDBåCAÞEBàIEÜGCÜEAÞEBÝDCÈFF{%%-  Qmm`††U€ƒP|ƒT}†S|…Ix€N€†O‡M~€X‹‡c–Žp¤šf–Š^‰|X{qPmj\qsRbiT]jagzptŒ€…žŠ˜«—}¨™Ç™9µKãôõõõôÿÿÿÿÿ å!6©\z±h§dˆŽ`y{kÇD7ìC;ÿC>ÿ@<ÿ?;ÿA<ý@=ÿA>ÿB?ü?<õ@>ê@>âFFÑCBÄ@@²79œ**„ˆŸ)(¶76ÏCBÚGEàGDåECêGEéCBëDAêDCæFFÆDEd')¥«°Ã˽¿Éº¼Ä”¤ª_yy;\U0XM2bVWˆ€qœ™‚¨ª€ ¥Zv}NhnHbhJfmBbhPv{vŸ¡z£œ]‚z?\Y8LMGSYW`m‚¥§·‹³®|¬ y§¡y¡ yœŸ‚¡¤†¢£Wkp!.6  .ÿ@<ÿA>ý@=ÿA>ÿA>ÿ@=ùB@à@>¯*'%"†+'*&+&€*$~*%kU'0+g‡‚`‰„[…„\‡ŠT~ƒMy€P~…VˆŽU‡S†ˆ]Œ]‘Šc˜hšŽh—‡c‹a|[tvUinP`gT`jP[i[ax}„ ~ž‚Ü=¶Náôôõõôÿÿÿÿÿä!6©]z³mލx˜£œ 1FD2ˆ(ÚG?öD?ÿB?ÿ?=ý@=ýB>ýA<ýA<þB=þD>þC?ýFDøEDòECñGFëHIæMJáHEêHFðDDöCAúC?ûD@ûDBüDDúACüDDùAAüBBãGH“65+ a€Ÿ¼ÀÅÎ×´¹Â–¤ªe}}Cd]=h[I{oešjœ˜t¤¥n•c‡‘VyƒOr|>bj2YaDpwh•˜~ª¤sš’Llg:RP?NQ4>Hai€®’±²†±¨z©¡w¤¡{¡¡~¡¤Ÿ¤†¢©‹ž«wˆ•cu|Xhnjv|‚—’§¯¦°’«µ‹¨¯£©tšŸtœ¡v¢¡w¬Ÿy«Ÿq——}– «²Å¬¬¾ŒŠ–UR[)(, '62ý@=þA>ÿA>ÿ@=ôBAÐ@?o:'###"  QfciŒ‚b„\ˆ‚]‰ˆ\‡Š^‹Ž_Ž’ZS…‹T‡Š[U‰‚^’‹g›‘h™‰cŽ^ƒ{YvsSlnNbgQejPajT`riqˆ{‚›}—yµ“?³Oáôôõôõÿÿÿÿÿæ"8¨c~¶r­ƒ¡¬ˆ¥¬r‰‹?¯71ãA?ö@@ÿBCü?>ü@?ý@=þC?úD>ýGAúD>úC?ûD@üEAùB@÷B@òBAïB@ôDCõDAùE@ûD@úC?øBBýFJüEIùCDö@@úDDÝDCœ=:. Yxw“²³µÇΨ±»œ¦­u„†RmiIqfP€t_“‰`”[bŒ“[QtJly5Yc,S\;fo[ˆŒy¦£{¦Xzt>YU8LMDOWVZl‡ “ª²…§§…¯¨«¤€¨¦~¡¤‚Ÿ¦ƒž¨† ¬„œ¨Ž¤¯¥­¥­‘«²‹¨±¬µ¨²‰¦¯‚¡ªxš yŸ¤y£¢u§›{°¢mœ“w–«º¦­À£ °™•¡‡Š’jvx_mlReb`ztZ{t\„o™˜j”Sw}Djo>ae)BF  B^Xe‡}WyrUvrYxwTmq?OV?DM[]e-6: # IØA=ÿA<ÿA>ý@=þA>þA>ÿ??îBBÂ@@X#      SZ]i~|_‚xY‡z`†^Žˆ_‹Š]‹ŒV‡‰Uˆ‹U‡S†‰VŠŠP…‚ZŒŠb•Žk‘lšb€^ƒyVspSmmUnpVlqM_jJYi`h|’˜m£…>¯Máõöõôöÿÿÿÿÿç$:ªg‚º}šµ…£®ƒ£©šž_ml\ »@>âCEòAD÷??ýA@ýB>üC?üHCùGBûD@ýD@ýB>ü?<ý@=ü?<ù=<ø>=÷@>ö?=øA=ùB>øA=ùCCÿGKýFJøBBöCAöCBÝGF,*# `||lŽŽ˜°¶«»Â¥­´Ž™`vtY{tY„{^†^‘‰]ŽŒ]ŠŽVˆMs7]i.U^0W`ÿ@=þA>þA>ÿ??ëCB¼BBO $"&  &)1VS\wpw‰ˆŒluycwxWzpXƒt^Œ€`†]‡\‹WŠŒV‹ŽT‡ŠPƒ†V‰‹\‘\ŽŽ]e˜‘d–Œb“…_‹~Y~tTtoOnmQmnG_eFXcFOcWmsdš|<­Kßõöõõõÿÿÿÿÿç%=¯t’É„£¼ ©w™Ÿƒ ¤ˆœ@KH T§23ÚABé==ò;9ù>:õ<8ùDBõBAüDDÿBCÿCDÿDDÿGAÿGAÿEDÿDEÿDEÿEFÿEDüEAýFBüECù??ù??õ@>óA<ð?<ÍA@V+-x‘•~ †¥¦ ¹»¢«´“˜¡hz{WroSwqZ…|^‹‚]‡W‡ˆSˆEs{@kt5`i=ip@nuS„†c–’v§Ÿp—[zsLdb>ORKU\V_it~‚•¢„¥¨~ª¤y¨Ÿw¦žvŸ¢x¥{Ÿ§¢«Ÿª€ «‚ «‚¡ª€¡ª~Ÿ¨€¦ž§zœ¢xœ¤x¥yŸ¤x¢¡z¦ŸnŸ‘|ªž„«©•¯¶š¢³Ž¡ƒƒ‘y{…luyfuwc|xf‡€jŠfŠbŠX„ƒDrs5a`1WW5ZX7^\@eaPqmTrmlŠ…†¨¡z¦™m›Ža€]‡|W{uStpPlmAT[*9B>MV‹¡§´ËÍL^]B ÑB=û@<ÿ@@ÿA>ÿ@=ÿC>þA>éDA±>;Catwx”•v™•{œš°¶¯¹Ã¥¡¬§¢«‡”gyz]zqV|pZ…x]`“‹_•R‹ŠZ’“Q„‡R‚†\Ž”_‘—ZŠŽU…‰[‹\ŽŒXƒ\‘ƒb‘]…yZ|vUqqRkmK^eEUb°u“Êzœ´w›£u™Ÿ{› v‘•t‰‡2=5I‘'&ÈC@ÜC@êC@ðA>öDCöBCüCEÿCEÿBCÿBAþF@ÿGAÿEDÿDEÿCDÿBCþBAýD@þEAýD@ü@?úCAñ@=èD?×E@š/,,N]`§­z˜d‰‡¯®¦¶½˜¢¬|ˆŽauv\yvW{uW‚wX‡~XІWˆŠR‚ˆM}ƒDryDryAquPƒ…[‘Œr£›o˜e‡€ZurDYZVehGRZahw„‘¡‡ ª§©«¤z©¡w£¢x¡¤w¢| ¨y§{ž¨}¨~ž©~ž©}¨}œ¥}œ¥{œ¥zž¦w›¥zŸ§€¦«}¥¤w¤›zªž¬£~¢¢¡®“›¬ˆˆ˜~~Švydosezxd{l‹ˆq”xŸy¡Ÿu›tœšt™—t™•t˜rž—{¤xž˜{¡›sœ”g˜Š]‚W…yW€xY€xUysRnnJ`e:KT3COƒ–ž›±¶bwu8Ä96ú@?ÿ??ÿ??ÿB?þB=þA>çFB¦:69v|žžw£‚­ª“¶º™®¶¥¤´ž—¦‹Ž–p€c}w]uX€tR€tTˆ~RˆW‘Œ_˜—Rƒ…b—a—]‹“Y‡W…b›`’˜]’WŒƒ`’†_€W~vYzvVrrTmoQfnDd_àóôôö øÿÿÿÿÿ ç$>°qÇyœ¶t›¤n‘›iŠ“hˆŽf…jxw'0-#S˜96ÏIIçHJòFHûEFüBBÿCBÿDCÿEAûD@úC?üA=ýA@ýCBýD@ÿE?ÿD?ÿD?ÿB?ÿDCõCBæC@ÌHAŽ5+= sˆŠ¤«{› n””|£¡™·¼Ÿµ»›£‹’`svTqnNylV‡y`•ŒUЇV‰ŒU‡Qƒ‰Pƒ†Nƒ†VŒ\‹h™‘qž•o˜]~zQkkObeQ^f[dnw€Ž„“£ƒœ¦€§¥|«£y¨ z¥¢xž£z§xœ¦yž¦z§z§zœ©y›¨zš¥z›¤w˜¡wš¤v™¦wš§€£­z ¥y£¢y¨ y«¡x¤žƒ¢¥Ÿª”¦……•tvemtfsuYkjdzxo‡…x•’‚¡ž‰¨¥Š©¦‹¬¨ˆ«§‰¬¨€¦ §¡zŸ—zŸ—m—Œe“‡T„xQ}vYƒ|XyY€xPtnNjjBT[@LX^gu•Ÿ©{Œ/¼53ùB@ÿAAÿ=>ÿA>ý@=þC?åFB¢735 yŒƒ¡¢z¡Ÿ†±®wŸžš¶½®­Á°§»Ÿ¡©†’’d{wZ{tVyoZ„y^„]ˆc™’b—”T…‡b—n— i’›b–c™`‹šbœašZŠXŠˆYŒ„\ˆ_ˆ\~xZyxZvwQvl;xR%–4áôôôööÿÿÿÿÿ ç%@¯pÅo”®p–¢c†“[‰Vz‚Vv{[prTfg/24o¤14Ä?AÚHJàGFæFDèEBèC@èB=ìC?òEBðC@îD@ìC?íE>ëE>éE@çFBâIHÑED¸?=v/Rfqˆ¤¯Š§°Šª°z ¢p˜—Œ´³”³¶©³–¡p{ƒdyzKqeKzjWŒ‚[‘Œ^‘“Y‹‘R„ŠK…R†ŒUˆŠ[‹`“Œiœ”`‡]ƒ}\{xTkmVflYdl]fpowˆ~Žž€ž£§¥~«¢z©¡xž¢{Ÿ§w›£w›¥yœ¦yœ¦xš§xš§x›¥wš¤w—¢t–£u˜¥r•¢y›¨uš¢t t Ÿx©¡|­¥€§¥‰¦«—¦¶…‹žjm|eitYahKVZVbdZgi^poh}{o„m„€i„rŒu’mˆm‰d‰b‡\„yP{pK{oKzrQ€xM|sV„xZƒ{RsoMfh=LUKRa‚Š—Š˜ž '¯10í@>ÿABÿ?@þ?<þA>ûB>çFB¯:7B!10SkkXwvs•”ƒ¨¦”®´™œ±´¯Ä©¨±‘™™j}YvsWyrRyqMzqW‰_’Šb•‘[h—›|£¬‚¨´„¬¸‹³¿¦µw¯k“¥^Š—XˆŽQƒƒ[‰]‹…]…€Z}yUutKvg6xO‘-ßòôô ÷ ÷ÿÿÿÿÿ ã9¥\}¯_…W€‰QxHoxFlqBgk>_b<[^/OT49 $Ai!!*(’.,­98ÁD@ÊEAÑDAÓB@ÕB@ÓDAÊB>ÂB=·?:«85 74‚+)]6  Vju’¯½•¶Å’¯½ˆ¨³€¥­pœpš†­«´ÇΟ¨µŒ– dwzFe\HsdOw`“\_•YˆW…Z‰‘W‡‹\ŒZ‰]“Œ\‘ˆd‰`ƒ\uwXmoVgjP^d\er{…–‚—¦{›¡|¨¢~­¤{£¡‚§«u™¡u˜¢y™¤x›¥v™£u™£u˜¥t—¤v˜¥t–£s–£r™¢yž¦x¥xž£vŸ¢t¡žw¥Ÿ~¨¡‰°®‘¯º}‘£hn\\l\`kSU_OQYADIBILEOOCQPFVUPdeVklXmnZrp[xuYzvWzvSzrIuhEui?rjAvmG|rNƒv\‰€T}vGlh=YZ=KWcly~‹“ áA?õ??ÿ@@ü?<ûB>üBAîDBÈ?=i "2GD^or¡¨¹±²Æ¦¤°™œ¡v…ˆ\ttVyuQzsR}tZ‰€VŠ€\“Š[kšž¨±‹®»‰¯»¤²z›ªx™¨y™¬n Z„‘Q~‰XˆŽXˆŠY…„Zƒ~U~wM~j@…X'6ã õ ôôõõÿÿÿÿÿ#æ =¦Z|ªV~>hmAkpAlo4`a2]Z0XV)QOHKFI69  #0DSbty{ueWM?2%(Viv“­½Ž¯¿‰ª½—µÆ‡§´†ª´x¡¤qž›…¬ª¨¬ž±¹Ÿ«·–\uqDg]Hsjd”Ž_b’˜Y…’VƒUƒŽZ‰‘\‹ZŠ‹Z‰]’‰[Œ„_‰‚^{YtqRhfWklYeoit‚{‰›xŽšz  „²¬~¬¦|§¤vœ¡u˜¢wš¤wš¤t˜¢s—¡r•¢q”¡p’Ÿr•¢o–Ÿr›¤wž¦v›£z§xœ¤už ršu¡›v£ tŸ¢t˜ }Ž›kv„bkyZ`mVXcMLUVV\UX\QX[S\_XegWfh[jldxy^xxZyxSvrIoiP[amyDMVI·?:îBDÿ>@þ>>ü?<þC?ùE@íB@àBBÎBC¨12pK / [an«ª¾••§Œ‘š{ˆŠd||XurOpiNvkU…yYŽ…^Žc“—s¡¬©¶¦´|Ÿ©z— €¤‚§€¦nŒ—jŠ—aƒ_†WˆX…ˆ\Š‹T‹zG’d&£6áô ó ôõöÿÿÿÿÿ á%>¦^~§gŽ–l™cŽ…_Ša‚e”„az^Œy`‘‰mŸ›r¥žw¨ «¤„«£ˆ©¢k…GXT,:4#   $"IVXz’†Ÿ©„¤±…§·…©»ŽªÂ­Â•³Æ‘°¿Šª·Œ«´†£ªz›žz¦ |¤Ÿ¡»Â™©µ‘œ¤etwSqlb‰mš—\ŒŽZ‡’R}ŒVƒ‘U‚VƒŽZ†_‹Œ]Œ‰Y‡^–‹a‘…bŒ\~wZyvNjjH\aIP_dj}€’£~¦}¬¤z°£t¦¢n›žn•n•žn–›o—œq˜¡r•¢p“ gŠ—dŽšg‘u©|Ÿ­~Ÿ®{ª}¡©|¡¥s› s¢ x¬¢x®¡‚³«tžc‰Žd‚j€Œp|ˆ†ˆ“ˆ„ˆ†ŒŒŠ”—œ‘—œŒ—›‹œŸ}••b€Jkg5[U)WQBxsfŸ q©®w¨°V†ŒT‡Šb””s¡›_‡‚Gdh=RZGS]^en,-)æBCÿ?Aÿ==ÿ@=ÿC>þD>ô=;ó@?ð=>èDEÏCB¼EC86s(&/ ƒ„˜£¤¹‘• }…Œl}€]rsc~zQslQ|qX‡~[Ї^Žs£©p¨w©v™£|™¢v’™qŽ“k‡ŽZuZt€`|‡[{†V{ƒR|ƒX…‰W„G–j ¡6âó ó ó ô ÷ÿÿÿÿÿ!â'7¢m‚¯u”} –…§Œ«¢‰« …©™†«—ƒ©—‹°¦“·±„¨¢€¤ž€¢œy™”w”‘sŽ‹j…k…`{rSneFaX4OF/IC2ID6ME7NF6ME*=:&15)09\boœ¤‹©¤v˜‘v”•}šŸyš£zœ©†©·„¦¶‘±Ä’°Ã“±ÂŒª»‡¦µ‰©¶…¤­¢¦w ›„¬ª¢ÁÊ›±½˜ž©…ŒaqpUsn\…€\‰†\…ˆU|„U€‰RŠJxƒW†ŽV„‹V…‰VˆˆWІ_ˆa‡d’†WvOqjJbbT^hW]px€—“¤~£¡‚±¨y©£x§¥o–žs—Ÿs˜œr˜œršŸl“œiŒšp’¢zŸ­z¡¯¥±|£¬}¡«}¡©}¡©{£z›¤yž¢y¡Ÿ{¥ž~¨¡~«¢~­¥y£¢zœ¢Š¢®“ž¬‘Ÿ¡œ¥¬¦««®³¦ª ¬°•§¨rŠˆRrm7^V)SLAtms¥¥½ÃЏÀjœTz†PzS~l˜—k’Ihg>SU6BHU[b[ Ù@=ÿ@@ÿB?ÿC@ÿFBÿGCÿD?ÿB?ÿCBÿDC÷E@ôHBíFCÖHG.+0fkz§­À¡¤³‡‹–|†m|~_wuTrmWyrXwSxY‰ƒg˜–i™›i“šlši‡’dŠ[xSovMhrNgqQlvMjsJktOs{QxE|sB”i"©=âôò ó ô øÿÿÿÿÿã'1fr¢j€‹q‰t‹ƒ€˜Ž™„ž„ ~›‹{–s‡f{qІo‡…j‚€h‚‚^{xWwrVxqNqgNthCk`=g\@iaAgaW|tZ|u`zPkgEZ\6FM]dsŠ˜¤žÀ¿}©¢n””v›Ÿxœ¤} ª…§´®½“´ÄŠ«»Œª»“¯À‘°¿‹«¸ˆ§°Œ¬±xœœtšš~¤¨’¯¶©²¿Š˜t}`usVzt^ˆ^†„T}T~ƒO}„Q€ˆTƒ‹X†‘X‡W‡‰Z‹‰]‹_’Š`•ˆ_‚S{oTrmXjqQZhT[ov„–œ¡Š±¯ƒ±«¬©sœŸp”šq•›s—l”™eŒ•mžlŽžn’¢m‘¡¦´z ¬~¢¬¦®|¦{œ¥~¦}£x›žyžœ~§ ‚­¤w§›x©¡~©¬¤ÂÍ ¯¿©¬»»¶¿Â¾Ã´¹¼®º¼ž­¯s‰‡Srk;`X(QI:iac”’ƒ´¶¸Áu›§^€Np}=bjAinnš›rš˜^{;QOBNRFLQ>BG 3»:7ïB@ýA@ÿDAÿEAÿFBÿB>ÿB@ÿCAÿB>ÿ@:ÿB<ÿ@=õED¾?>TCLU™¤²¦«º†‰˜y}ˆu}„jy{cxvazv\|wV}u]Š`‡\‹ˆV„U|„Uz‚JnvEfoFflA^g?ZdE`jD_i@^iKkv<_l;nj@‘j&ª@ãõò ó ö ÷ÿÿÿÿÿ ä$)–S[ŠUbpUfbYjafwnhypg{obwh]rc]oh^qn\nmcxvbvwbvwbwx`{x[zsRukDla9dY0]T6g_=mgCroP~xUxi‡ZyvLffEX[@ISkuª¯‡­­x£ l–•w›¡Ÿª‹¨¶”±À¯¾Ž¯¿‘¯À’±À°½Œ«´‹¨±‹§®ˆ¥¬r•˜y¥Ÿ‚¨¨“©µ“ž¬‹“šuƒ‚\wsW~v`‹‚T‚|W…†Vƒ†Q€„M}ƒV‡‘Z‹“V†ˆQ€~W‰…WŠƒešh›Y‡zW|tPikO`iBP\Raq}‚›¥‡¯ª‚±©y¤¡l•—m‘™t—¡r– lœlœr•£| °{Ÿ±}¡³€¤´‹®¼~¢¬¡¬~Ÿ¨|ž¤{£{ž¢|Ÿ¢z¡Ÿw ›u¢™e”Œ~«®¢ÆÎ¹ÈØÂÅÔ¿ÁÉËÐÓÀÌΙ«ªp†„LjeJN@FKUY^"sÌBCóCBÿA>ÿB?ÿB@ÿAAÿ??ÿ><ÿ?=ÿB?ÿ@:ÿ=:ôA?Ì@Ao )68 ¥•£¯’›©‡‡—‹sv{nuxetvf|ze†h…h‘‰f’‹Y…„Mz}>mq4bi3_f6]e8[e5S^4R]1OZ4Q_5Wd3Vc1b`5[)¥Aâöôôö÷ÿÿÿÿÿ å%(”LPKRcLWUP[SQ\RQ[UJUMMYMP^R^lh_mlgtvgvybsvfz{cywZuqOpi@e[5^V+WP=mgHzvOQƒS„‚]Їk“‘`…Lkh9QO8DJKU_€’—µº|§¤rŸœt™|›¤ˆ¤¯‰¤²‡¦µ†§¶„£²‡§´‰©´‰¨±‹§®‰¥¬Š¥¯}¢vŸš€¬¦Š©²Ÿ²¿’›¥†Ž•p‚_~w_†~a†_‡Z‰†U„‚Sƒ…R…ˆZK|~L|}ZŠ‹\‹e™’c˜Že—‹Z…zXyuYrtWkp@P\Ucuzœ £Ž¶±ƒ¯¨oš—o•šs–£q“ s•¢s–£zªn’¢u™«x›¯ƒ¦ºƒ¥µ‚¥³€£­€¡ª~Ÿ¨}Ÿ¥|ž¤{ž¢vœžr˜˜sœ—h”Žs¢ ¡ÇÌÌÛëáæõÎÔÛÁËË™©¨h~|Ca\:_W5`U6e\R€zf•“®±x¤«q˜¡d‡”Nq{:]g(MU5`c[‰Š|©¦g‰Nlg=OPKTXX\a./35Œ((ØBBôABþABÿBBÿ>>ÿ?=ÿ@>ÿ><ÿ><ÿ>;ÿ?<ðA>ÉCCg 30‡¢ŸŒ¥© ¨ˆ–uu…pnzdclhns\kmlƒl‹„mˆtš”gbŽV†‡?qq+X['RU/W\0U],OY0R_'JW&IV-R`'XVdC&Ÿ=âöõö÷÷ÿÿÿ ÿÿ å*-šUT†VWlVZ[W[VUZQab^ce_ci^fndlwulw{p{p|€q€ƒk€_xtOng?aZ2YQ+UN:gdaŽh˜™r£¥g˜šZŠŒ[‰ŠX†‡h“[y>\W>QT4AIajx‹¨©¨v£ p––zšŸž§Ÿª‚¤±‡©¶Šª·‘¯º­¸‡¤­ˆ¦«‰¦«©°Ž«²q——w¢Ÿ‚ª©“±¶ «¹•›¨Š”›fxyc~{Z~x_\Œ€Zˆ‚\‹ˆS†‚\‘ŽQ……]“e“šd”šX‹ŽYb–c•‹\†X{wVppCV]M^kl|}Ÿ•¯µ¸°|© m˜›n•žu—¤y™¦t—¡s–£o“£‚¥¹‚¤»‡©À‚¥¹€¢²€¢¯¤®‚£¬ ©~Ÿ¨¡§¡§~¡¥q˜–o˜“u¤¡ªÐÔÍÜìÜàòÄÊϰ¼¼u‡†Rmj;]V@j_EuiI}s`’Žc“”u¢¦rœ£o–ŸTw„Dgq-PZ&KS+UZN}{«¥v¡˜XzsH^\GSW@DI]]c 7Ÿ13ØCGòCFú<=ÿA=ÿ@9ÿ?;ÿ><ÿ=>ÿ<=ÿB@éB?¢447F\Z¥Ÿ…®§ƒ¨¦‡¡¨z‡—jkgdtkjsW\_[hfg|yj‚‚u“”wš–s›–q›”f’‹P|v9da2\[%PSELifg“”‡´·‰¶ºˆµ¹v ¥e–[…ŠT„†kš˜h‘ŠPrkAYW@PVCKX~Š–”´¹‚ª©xŸxœœ{›¡‚¢­} ª¤®¡¬ƒ¡¬‡£®‡¤­Š¨­ˆ¦«ª±‡¤«x›Ÿvœœz¦ ƒ¨¦™ª·§¯À£°„Ž•aru\wsWs]‹~`„[Œ„X‹ƒ^‘WˆŠXˆŽX†Ž]‹“R‰[‹‘d”•^Žˆd“‹[…~QrnLhi?T\5FShvˆ†™¦”µ±Š´­uŸžm–™t˜ y™¤t˜ u™£yž¬~¢´…§¾£º¤¸{Ÿ±€¢²¢±¡®Ÿª€ «¡¬ƒ¤­„¦¬zžžl”a‰¸·ÌßîØßðÁÇÌ›¥¥cwxNifCh^KwjR‚vUˆ€`’g˜šu¢¦l•ž]€Qt?an4Wa5Yc:diW‡ˆu¨¡kš‘[‚zJebOabW`d^afZX^G&)¾9<ÞDEëDAóE?ôD>óB?ô@Aî@@äA?º88Rnˆˆ†«©†²«‰µ®‡««ƒ¤u‚’sw‰oq|dglV]`YegSagatwq‰‡y˜‘Œ®§ƒ¨ u›•g‰[ƒJts5beIM NUNV"PX VO W5˜5âõõööøÿÿÿÿÿä04¥fdŸokˆtoxyru|ttzwŒ†‰‚‹Š†Ž•˜—£§Ž …—˜s‰‡\wsFha0YR,XR;gfi”—“½ÂŸÆÎ•ºÂ€¢¨iŠ“[{†Os}M|€c“”v¢›\ƒ{Fc`@SV6@Jajw‚–¡‹©®~¦¡t˜tšœ| ¦xœ¤~Ÿ¨ ©ƒ¢«„¡ª„¡¨‡§­‡§­…¤­Š©²ƒ ©w˜›u —”½¶Š§®¨¸È­°¿¢¤¯‚‘h{x\{tX€u[†{\‹‚Y‰ƒ]ŒŠ`‘_‹’k™ pž¥k•¡i‘_‰W‚…c’c“]†PrqJcgGZbN_lpއ¨®³‹³®{¤Ÿp–˜vš p•n’œm’ p”¤‚¦¸¤¸ƒ§¹€¤¶€¡´ƒ¤·„¤·‚£³ƒ¢±‚¢¯†¤¯Šª° £m’k—‘³³Á×ãËÖä­±¶—ž¡n‚WqqOrhPxlTt]Œ„^Žb“•g“šg™_‚Mp}<^k7Yf2UbDnuXˆ‰f™’r¤šcŽƒ\|wSigWcgemtrt_^h#Cy%'¬;9ÉFCÒF@ÒC>ÍA@¶<<‚&%EBVW~˜žŸ¤§©Œ´²Œ¹°©¢ £y˜t‚Ždjw^aibejX[`TY\Ub`Yjfl~{”„Ÿœ „§£„©¥n–”Vƒ€Ixv?qq5ge/m]"tI7áôó ôöøÿÿÿÿÿå5<¯w{¶}y…‰‚‡„†“Œ‰˜’¡ž–žš¢«® ¯²Ž ¡w‹[wqCe^&OH$PJ>mkd‘”½Á¦ÍÕ™¼ÆŸªsŽ˜d‰Qmx=`j@ls\ŒŽr šk”Qrn:RR5CI1;Ew„”‰Ÿª…­¨}¬¤tžvœ yš£~¦€Ÿ¨¡§¡§„¤ª‡¦¯„£¬‡¦¯‹ª³‡¢¬z˜y¢š‰¶­|¢¤ˆ¡«¯¶Ç­¬¼˜ž¥kxzczvMohQ|qQ€waŽ‹f‘”m”œ|£¬‘¸Á‘¸Á²¿ƒ¥²u• b‡Xƒ†d“‘`Œ‹RzxTstJcgE[aMallމŸªŒ®­†¯¨y žtšœtšŸwœ¤yŸ«zŸ­}¡±£³~¢´€¤¶¢¶„¥¹…¤»„£¸…£¶…¤³‰§²Œ¬²‡§¬u™™iŽt˜˜—³º¯Ą́°·‘—œw„Œ^suUtmTyoV~s]‰‚^c”–y¥¬q—£a„’Wx‡JjwDfs?boJs|V…‰a’hœ’e“‡a†~[yt]qr]loOU`klzNNZ  Afuue G%(=>w’–œ¥}œ¥¡§~¤¤‚¯¦€°¤€¬¥xžžsŽ˜s…enxghrgbkZV\OQROWVT``_npeyzsˆ‰œ™„¤Ÿ„¨¢w ™qš•e“Uˆ€Hˆr=‘a ¤9áôñ ô õ ÷ÿÿÿÿ ÿç4Aµ~‰Å‹±‹Šš˜™ ˜™¡œ™¦£ž«¬££ª£¢®®™«¬wŽŠWsmAc\*SK"NH>mjg—˜‹º¾ÇΖºÄ¡¬u‘œf‰VlwD^j6Sa3ZcLy}rž{¤Ÿ^}@[X0DE%2:TYnˆ–¨“º¸®¦{¦£sšœz™¢~›¤Ÿ¥€¢¨‚¤ª€¡ª†¤¯‡¥°Š¨³‹ª³ˆ£­|œ¡sœ—v¥x§Ÿr––¹ÆÔÅÉÛŸ¥²~Š_tuBb]Ala:i`qž›w £˜»Å¬ËÚ¥ÂÑ—´Âª¸‡Ÿ«w‘h…Ž\|‡X‡c“e‘V~yVwsVrsXpvZmzs†“Š£­‘°³Ž³¯w ›p—™q–žwœ¤k™u›§~£±y­{Ÿ±|Ÿ³£º„£¼„¤»…¤¹‹¬¼¯¼ˆ©²Šª°€¡¤s——w››”µ¸¨ÂÈŸ«µ•›¦‰“q‡]uuMkfLqiS}v_ŽŒmŸy¢«g™`ƒ‘Vw†MmzHjwRuƒW|ŠXƒŒXˆŠ]‰_Ž…dއ_ƒ}WupRhfTbh]cnyy‹abp)64  ,?Fw’œ{›¦y™¤w–Ÿ}œ¥¢¦z¡Ÿ©¢}ª¡}ª¡x¢¡n‘•r‰‘pz„okv`XbYUZPQUNSVJSWNZ^Vehfxymƒu‹u“Žu•wž–pœk¦ŠZ®x&«=äó õ ö ö÷ÿÿÿÿÿæ2E¸…—Ò“¿˜š¬§Ÿ©°ª«³°¬³µ¯¯·¬µÀ¶Ÿ°­xŽŒWrn9[T(QI,XQApm]ŽŒ»¿›ÇΘ¿Çˆ¬´pŽ™k†Zp{DZf=Ua4R](LV>hml˜™|§¤a‡Ee`.DB&3;Wkvy“Ÿ|›ªx›©u—¤x˜£w–Ÿxš v›Ÿx Ÿw£œt£šx¨¢x¤£~¡¥€•~„‘|z†mjsdbhZX^TTZLPUGPSNZ\Yfhcuvbvwh€~n†q•‰hžV¤o*¬=ä ö õ õ ÷ ùÿÿÿÿÿè+C³‚›Ó­¼Ý¦­¾º·ÀÅÀÁÁÅÀ½Å¾µÃ·¥¹¬{‘ŒSnj:\U*SK(TNEtq_}¬°¤ÐלÃË®·v–œ`{…l…C\f4LX:T`2P[;E;eji—˜|©¦o™’Kmg0EF)1 '8lv‡Œ©®‹²°~¦¤y¡ o•w”{›¡|ž¤Ÿªƒ£°†¤¯ˆ¤¯‹©´‰§²¢«t™v£ u§w®›t¢•|–œ¿ÌÚÉÑÞ¢«µwŠHgf4^WV‚{šÂÁ³ØÜÊéòºÕßœ´º£¨{Ž‘gx{_ouPbiK`h?ZdHhsW~†Zˆ‰_‡W|x[{zSpuIblKalmƒŽŠ§¬¾Á‚¨¨j‘“j”k‘–k™yœ©zž®r–¨‚¥¹¡¸…§¿ƒ¥½‹«Âˆ§¼‘¯À­º†¦±ˆ©²…¥«z l”’x Ÿ”·»•®¸ž§µ™¡®Š˜ž`uv0RLQzs{£¢šÀŃ¥²h‡–^{‰QlzJgpJhs>`mW|ŠZV€ŒSˆf–—Z‰‡_‹…eކ]{A]^?T\ .@ZjzЧ¬™»ºŒ®®b‚9TX&?C08088RYNish‚v¡v’£zš­zœ¬s—§wš¨t—¤u˜¢xœ¤t™¡w¢v›Ÿrš™v¤žw¨ ®«„ª¬}Ÿ~…˜}€wv€wpwpinebdcee\ab^gjcos`pvdwzd|zg{X„mN’c*¡8Þ õ ôõ ø öÿÿÿÿÿ!é)F² Ó©¼Ý¶¾ÏÏÏÕÖ×ÕÍÔϼËô¥uJib,PJ%NG*VP?nkg—˜u¤¨‡³º”»Ä¤®r‘šeˆ[u|Vpw6Q[@[e>Xd.MV#HP8bgY‰‹°®s›–Onk1DI#-#,9_nwŽ«°ˆ«®Š²°{£¢o•u”|¦ ©}¨‚Ÿ­ƒ¡¬ˆ¦±Š¨³…¥°w›¡qšœqž›p¢–s«–s¢’‚ ¡¡±½ÞåôÁÇÔ ¥Njj2[Tk—¿ååÉéî²ÎÕ£¯pƒ’fvƒVdjS`bQ]aP^dNaf>S[D^j:ZeS}‚cŽe‹[€|QruLin?W](=Ei}ˆ ºÁ›¿¿x žh‘m“˜o“jšl p”¦‚¥¹€¢¹…§¿…§¿ˆ¨¿ˆ¨¿“³ÆŠ¨¹Šª·…¥°‰¨±yœ s›šy£¢už ¢ÂȾËÙ¶»Ê±½Ã\pq/QKV~y€¦¨ž¿È‚ «p‹™_y‡MeqLgqDcl>`mW|ŠY€Z„‘c™Z†U‚…_‹Šk—‘c†@ec(EJ ".?UaŒ¨¯Ž°¶ˆ®³j”^…‡i“^‹d†“jšn“¡s—©wš®w™°|±z›®s—©{Ÿ±zž®} ­| ª|Ÿ¬zž¨xœ¤q–šqœ™t¥x­¤‡¶³‚¢­†š«„ŽŸŠŠšŒ„…z‚x{zuvvuwty|r{kyeu{cvyawuW}kD…W(Ÿ3à ôóó ö öÿÿ ÿ ÿÿ ã>¥yšÈ´ÉåÎÙçîñõàåãÅÓÍš¯¦l‰y;_O%LD!LI;heP}a‘’q ¤¯¶‰²»£­r’r˜Wr|TnuLfm>ZaLho>[d&HN&LQ4_bW‡ˆ‚±¯wš–]uu9GS*6"29Mch|šŸ¢¥³µ|¢¤€¢¨}ž§~ž«ƒ£°‡¥°Š©²†¤¯‡¥°‰§²{Ÿ§tšžsŸžq¡›s¨›k£Ž}­›Œ«ª„” ãêûÚßîš§¯Xqs2XR€©¢ÔööÁÜà’¨®k{ŒFOuPW~LUcNZ\UacR_aO`cAUZ]fNtyd’j–•`‡…Jji@\] &(5‰¨³ÕÔˆ±¬a‰ˆg‘jŽ˜_‚r”¤{œ¯¢¶†¨¿€¤¼…§¿†¥¾°Çˆ§¾‰©¼’³ÂŒ¬¹Œ«´‹­³r˜œsœnš³µ²ÂÏÏÖ嵿Æl~}.SKeމ«ÏÕ¤Â͉¥°d|ˆLbnG]iB[e:Yb9\iXXŽ`‡–h^ˆ”V‚‰W„‡pœ›t¢œGqj>:!=RZ2CPzœŸª‹´·¼¹y«§W…ŒdŽ›l“¡n•£n™ªo™¬t™­x›¯žµv–­zœ³v˜¯~ž± ¯¢¯{Ÿ©¦®w¢sšœnœ–a•‹o¢šz¥¨„¤¯”§¶Ž•¨‰…˜‹‚Љ‡}ƒ‹„‡‹ˆŠ‚‡Šs~‚n|‚l„by{Ryi> V`q›¨¶“®²…§¦££s–™q”˜} ¤‚¢¨€¡ª£°…¥²‡¦¯‰¦¯ˆ¦±«¶{œ¥x¡w¡ kš—s¦žt©›o§’~«›”°±àîúÖÝÁºÇÏe}}0RL´®Øó÷®ÄÊs„‡Q^lKQvHKqKRaIRUQZ]Q]_O\^ARURej>S[4LX=]hRyi–™n™–Qvr8XW/4br~¹Ù؜ƿp˜—e‹o“eˆ•l~ °y¯~ ·€¤¼€¤¼„¦¾‘°É‰§À”³È•¶Æ±ÀŒªµˆ©²‹¯µg’k™“‡®¬ÌÞéèðý¿ÈÌexu5ZRˆ±¬µÙáºÈv™UjrGXeJ[h+COGep8[h6]kY€Ž[‚[‚gŽœe™Y„O|€mœšg˜]‰‚>^]F\b&3CScz—¥µºŽÂ»x®§^Ž”`šh”¡bœS’g•§j’¥r—­r‘ªr“­{ž¸}¡¹~Ÿ³‡¨¸~¡®£­¥­| ¦vœ k•”f—n¢˜z©¦„­°ªÅÓ”£¶‰Œ¡ˆ‚•ˆ~ЂВ‡Š‘‹Œ‘Š‘”‘¡„•˜n‚‡Pwh7|J–*Ý$ ì ë í ððÿÿÿÿÿ !á"B¥ŸÈÅØíñýÿõýýÒÝÚv‹ƒ-K>=+/^NQƒd•—g–šo¤m—žk•œf•^ƒ‹^‚Œ_‚Œ_Š^~‰QpyOlsHej?]b>^d2V\W‚…‡³²hAa`#:<"+EJ_ž­½†¬¬‡¸°|§¤o•—s“™ž§ž§Ÿª~¢¬£­ˆ§°Œ©²ŒªµŠ©²xš vœžpšu¥Ÿx«£b—Šƒ·¥„°£€–›âîúãìú±ºÇu…‹%==`xæÿÿÙïõ“¤­^moQ]_SYdPSaLRWIPSOX[T]`Q]_DSUARU7JQ9O[/JX6YcMuz°®e‘‹5WV 79*2´ÕÑ¡ËÄo—•d‹i•g‰–mžs•¥£µx𱄍À¢¼„¥¿…¦Àˆ§À„¤»ˆ¨»–·Æª¸®¹¯µp–˜o™’޲¬ÈÛâí÷ÿ×à䃔‘=3cŒ‡Åéó®ËÚ ·¿qƒŠTbnIYfJ`l6Q_2Xd3]jYƒY[ƒižfœV€Wb‘•a—\‡Fki1LP##:I†¥´Š³¼‹À½z°«^‘c›iš¤V†’j˜ªj•ªn—­{¢¸}¢¼{£¼y¢»n—®¢¶t–¦¤²‚¦°„¥®†¨®„©­l•—pœ–r¡™|­¥¹¸¡ÃР¸Ì”ž¶¥‘Š™“ˆ’•ž––•““’—–œ¦¦…”–n„Rti0oE#Ž1#Ò+æàà âãÿÿÿÿÿ$â? q·Ðáôôÿÿìöö­»µOf^8*=jW_€n žj j˜ f‘š`‰’aˆ‘cˆn“›p”ž_ƒ^€\‰[y„MmsA^c@^c:@DIKyz€¯¬zœ›Uqq&;=,5(*B|Šœpš|´©¯©vœœz— …Ÿ«‚œ¨‚ «}¡«| ª‡¦¯Œ©²‹§²€Ÿ¨t—›|¢¢t¡žs¤œs¦žk “†º©}§œu‹‘âíûóüÿÅÑÛr…Š%=;ª¤êÿÿÀÓÛpˆR`_O[USYXOTSPUVIQQSZ]YbeO[[FTSFUXCV[AWc1KY2R_Mt|‚±¯v¦ Gih.0 ŸÀ¼±ÛÔ{£¡aˆŠfŠ’gŠ”gŠ˜r”¤£µu—®‚¦¾‚¥¿†¦Ã…¦À–´Ï‡§¾™¹Ì—¸Ç“°¿“±¼–·Àx›žp™‘…ª¢ÃÖÝñþÿëñö„’!D:}¦¡Îñþ«Èב¦®eu{T`lFVcGZi)DR3Xf1[hWYƒ]ƒ{ ®cŠ™cŒ›VŽR‚ˆh ›r§žRzu*HI $+~œ­ŸÇÓ–ÊÊu¬©_Œg•_šZŒ˜m›­tŸ´m–¬qš±qš³s›·o›³pš±€¥¹„¨¸Ž³Á¥¯Šªµ‰«±Ž²¸uœžm˜•pŸ—p¢˜‚²¬–¹Æ¸Ì ­Ç˜œ´Ÿœ«›“š¢—š­££žš™¡¤¢©±±œo€ƒHh] [5* ²ÉÒÏÁÁ pygame-1.9.1release/examples/data/alien3.png0000644000175000017500000000667610543371201020666 0ustar vincentvincent‰PNG  IHDRPG§0¼ëPLTE€€€€€€€€€ÀÀÀÀÜÀ¦Êð ,&$+(-10,-*1R m r&Q'r'J./N(4q4.n8A;G.By9AU/FrLR _7M.5lq'n7.GGG4LK5kPGTM3dI~ArK5~kpk&NKPNQmYdqnQOjXhogXqop® /‡0ž/®)4‰49˜)9³9.ª Â9Ê,;ÌDA¡n¡/L5K‰4M§6l•9d ?UÂ7QÓ0GôuƒHWIS¬Oh’Rj¤eZ‰lrŠcv¦KTÉhOÓmwÅP•qJªzt†ui§z/’Š:‡£ ÖÚOˆ›R‹¥L²ˆu…Œn©n«Šw¦ªnò Š,–: ˜43§3¸3€q‹3E¥m°6DC ”HT0ˆv ”b3­L­P, `­f5´d4VN…^j”fTŽuoªVM³Zg«lU´}L«vjÂÂ- Ä3 Ñ8IÌNÈJËT+ÃT2Ïk Îo0Ã~;ä[à~çi+ÉKOÍ[bÍvGÒpPÅmtƒ”ލˆ0’/« ¸£;‰ )µ¿7·-Ï£3Ñ›OŠ…M±†|†¤Q³£~ƒ«w¨¨JÔ­pÊÑ<ÞÊ{‡âr¥ÂLÔÍNèÉqÏÈnîÝeå“‹.¨–¬—-¸¨¶¨(‘K‡y˜§t²—L°‰u±¨R¬§nÊϘ-Щ3äª/Ï”RÐŽkÒ­Lʲpà“]åžxåµQî±yîÎnˆ‡†”˜¨•©™™¬ª®–Œ§š¤®§—©©¨–†Ô˜ªÌ¶¹Äµ¸æÀ¦¹Ä·ÕȹÈÇ¼ÍæÅ’ŒÈš¦Ì¨—Ä·±íª…ÇŒÖÚ…éüÃãÿà¹Ïê¦ðÕÉÉÅ·è݆âȳÅÇÄÀÜÀÐÙäÛâÙÓãääÕÐãÛá俨ù÷ñÿûð  ¤€€€7Æ‘´tRNS@æØfbKGDˆH pHYs  šœtIMEÖ%,Î;Ðu LIDATXÃí˜LçDZÄt‘Þ³“ø=îfKØn׸Xý‹;¼l ™E»´ÄtÕè&(t*ÝP'Fc§–Û*iaÓ¤­0¦h4KºQiѶ88? Žö æ^Í‹EOcݼœ@°ÿÜsg iÓ®Më?÷¼Öù|?>ï÷yÞçyï=çå}²¡õuyumååȼM^™¥sÄ#ë+©µ5Y^Îoý½…TjuY^ˉÓ(µžZ__N¥VVVsâ3 ¸”‚ƒ@æFalˆËÀ“åœGÿ³¸º*'o½ºp+9êÌÇSã¿–„Ïäød4¾35ñæä¿'''ßœ¸vÙ•ƒa¡''Ƨ&¦&ÆÆ®Ñ¹æ]ïŒ]›*ËUí×ãcצl¹ÁÑè©·Æ'Þ›èA¹á.>±8:úÇÑÑÑhB‹4Ÿ/©»S)YNH 1G£EÉòÚlúìe å‘”“Ò-)„¯ŠJd‘Šô»w6ÈŠÅ“ò¢¹–$)SмZ„Ð}ÏÞ-­¬Êñ8¥2ÃeNIJPK•\Z’åTúùÜ%­ÈTüÆ ˜tƒtT̈iQ±4IĵVñà#ÏÞ…»q‰"dFà DæD ÏH$‘&i‰²´¿¢bÿ§ÕHë»å¼Kb(•İ“‡3ÉP(‘$’ž%‰9µô;}ª<.Ó²¼”Ni1 ÉX:Sî‡c`08Ð(ˆ„€ÊËÿ3Óiþ¾¢@ > ûå¥x,­§‡_M/gÄd’ψ*àìî9}ÄiÈ!?3ÅÇ;ÿú`ÿL’#$³à^¨Çéâ ‰É+k;âi‘Äx{±óXO0‚Á¡Ò~¿?;ÜäøHÏmoœ:3tn$¹ƒÏ$ÒRxA_ž‘Áÿu®ÉÊ‹ »­Ø F¢Ó³„øè8ìöø‡¡¡×58t.9SB$)Œ¼áy>CÒT*AÈÆ†¼£~V!ší6{( ¥¥4἟ïˆ|SÑϧú~ý[Š ‰JÑPäúY¸Ø,RP.ƒ™Œ+‰D™#[ÔI B@ÞUŸæÉ°ÍUÎwƒÄˆ2Ö69~f¨°¿ÿÑÁó*ŒüæµKò2¯cíÓDŠF£óóa¿Ã¦3Qâ…õ|¹#¶!—+ãR\b|ZG’ýƒ§¿pf`àÔå&%½ ³ õÏb%2 Äh„¶óf+ ÖóÒÚZ4,ÖÛÒ¹ì¼CI¨`(šp°6r¹pdà4ÿŠù}\Ñ4ßÔäohnæ-^¯Q$é¢HÈÅÛmf§ž—$I´éõz³ÞÆ;{‚ÁÑWƒaQJfLFކ©ãÔÀà¿F††’dø=³¿¹¹±±±ÙìõZ€(A‰ÍG‚ Þé4èõÓa›Óf(±»× …3MDv`Ž3rXêzôô©ÁÓç·—*E¼¿éHccCcC³Ãâv» ÒDZŒ€[©ù`ðØ±²ûe®r[Éýe=ÁÐüq0¨"²ÀãX G7Èó/Jqy3yèˆÝ[ciT¬¡™pœ·á¡H´§½3ÑÓÕÕÙÙÕÙÑÑÕÑÛ{Ç7Žvv¶GHrFÁqØd²˜õfBÍ)S{Sv‘K—_7š|–æï‚cñûû÷WzìñÅÌp< …Jø/•ˆ÷dÊîá­Ï<ÓÙ~4Dâ”Hc†a8ÌuÛ}ßÑ‹ÅfkÐô¬‰w©#^/©âjj̬ia߸¿âñMf`úODm™0d¹²¸¸ßœ¹)ŧ-@d9ΩAèèÑ ÓfªqqˆŠDýôõQÎíÅvìýr¢ò± Zeee‚ǘƜÁiMH&ÛŒcæ†ôD{‹µôÉxÌÈp,׳w·vïs? rF“¥œ7Z|ˆ"íoŠLB<,˜þý¾CV|«¢@d"ÇÀð–Ñd¦´¥­­íÇmOîÀàó®ãzfçÞ>%œc¯³Øy%„ÍuöÞ¾‹˜Áô2öíÿzå¾ÕršÆuœ×È1ƒ¸›¡çÚ[Ú¬Ö{­O·µ´Ýœ¦¡GŒY¥_\2öbÐPã³Ã:ùkkûzËá.ßJ¨´UT|U d³,f>ìg-v¯™Á¹ÔZjµîé|ùäÉ–¶'âvšÁœ:<ô…?µ¾bðÙÒà Žê¼5"ÇÐÓr÷¾êj%†î Å(`çQÕ_š†hbìÛaÛcíøùÏNþ ¥ô&Q$BêpøÏ½­­¬»ÆT£…AAö‡¼Æ‡”HÅä@eå!¡@8ä ,-ñ4‡O\Æg9ÙY€2ÐJK[:^~é%>%”Þ†~àDë [U£ 2BµU^ß_M>ìI½+ì« ÎRòR˜˜±½ <:Ûeà–¡—ëÛö€Ï'ÑÒÒb}Šr€ÏøÂU ÃUq¬²”Ú…¼Þ*·»ÚÀDz>•ç(b§9¦ü]ñ`àCóñöo[Òþ´õ§-{JoPF8§?ñ /bÆÙmÊ>ýðÁ*îp~~>óÞœ 54G +ujTÂY¤zQ±§¬-@³>m!1ˆmn}±­e9š7;9ìF R„ÂüLÅfý˜³p1Sc´YŽU³ò`ŽŠÏXïÝsoi»µô¦ìS:3/Ý œÉ´ù”.ÔxªÜÕŠß‚gÜt_ýŠ^Goev>4%Ášæâ‰8¬nâñ&8ë>Ý ŒÛÄmÏ^Z|ˆžƒ*ÑÍ0î9Ñ{õêÕkž{`ïî];i0Õoˆ#{`ñx¬ g»áœäÁíÜ~âi°»ªªÚûp•›ÂK¿Õ{BµÞÞ« ØWÇK8‹ŠÄàA5ãñä+,A©=D—¼ÿˆÒ`Á]å}ø0»Våíp>[ììêëëlßÛo¿ý—_öu´¶Þb˜Í (®ì+ªÝnº5¨°ph.Ü©Qz—Ý^á°àaêX"„óOFƒZ²n&ß}Xa!œÏ ­ƒÏ éu·¯ç‹à'V‡Jب«…ñVò`<ÍÔù8ìrFÖ‡káv_>Öh |!Ëc°ét\ˆê´p™_·ç›«óUcÔ„6‚FhìQ)Ùéì𻇳òà iuÚ;–":-Ò ±"OQ˜/ÀÍ*õ¶¦&œjÿæÙt˜Ãi‘öÎÕ’‹× :„0†h ÙìSïß„©»Û&¨[`Š}Ì Ñ¥Et¡Ñ3Ÿh7G#pêãyêZ®™ÛEr›áÛ6Pˆ~=RxôI+l0Xáoo›¥¡, ŒþTËv­F5­z£ê–FÙh‘)Ç4šÍCwóž²i*I“ Õ–*Uü 5wùš¬yß¶H›ÇPöû3½|ߎÍêÝÂ~ö?H¶dmþÜÆŽ·úÜŽr@„çºC±&gPæmJî€y*0ïÿ¶iÿ¤Ä‹#  ÃIEND®B`‚pygame-1.9.1release/examples/data/alien3.gif0000644000175000017500000000736507406772533020664 0ustar vincentvincentGIF89aPG÷€€€€€€€€€ÀÀÀÀÜÀ¦Êð ,&$+(-10,-*1R m r&Q'r'J./N(4q4.n8A;G.By9AU/FrLR _7M.5lq'n7.GGG4LK5kPGTM3dI~ArK5~kpk&NKPNQmYdqnQOjXhogXqop® /‡0ž/®)4‰49˜)9³9.ª Â9Ê,;ÌDA¡n¡/L5K‰4M§6l•9d ?UÂ7QÓ0GôuƒHWIS¬Oh’Rj¤eZ‰lrŠcv¦KTÉhOÓmwÅP•qJªzt†ui§z/’Š:‡£ ÖÚOˆ›R‹¥L²ˆu…Œn©n«Šw¦ªnò Š,–: ˜43§3¸3€q‹3E¥m°6DC ”HT0ˆv ”b3­L­P, `­f5´d4VN…^j”fTŽuoªVM³Zg«lU´}L«vjÂÂ- Ä3 Ñ8IÌNÈJËT+ÃT2Ïk Îo0Ã~;ä[à~çi+ÉKOÍ[bÍvGÒpPÅmtƒ”ލˆ0’/« ¸£;‰ )µ¿7·-Ï£3Ñ›OŠ…M±†|†¤Q³£~ƒ«w¨¨JÔ­pÊÑ<ÞÊ{‡âr¥ÂLÔÍNèÉqÏÈnîÝeå“‹.¨–¬—-¸¨¶¨(‘K‡y˜§t²—L°‰u±¨R¬§nÊϘ-Щ3äª/Ï”RÐŽkÒ­Lʲpà“]åžxåµQî±yîÎnˆ‡†”˜¨•©™™¬ª®–Œ§š¤®§—©©¨–†Ô˜ªÌ¶¹Äµ¸æÀ¦¹Ä·ÕȹÈÇ¼ÍæÅ’ŒÈš¦Ì¨—Ä·±íª…ÇŒÖÚ…éüÃãÿà¹Ïê¦ðÕÉÉÅ·è݆âȳÅÇÄÀÜÀÐÙäÛâÙÓãääÕÐãÛá俨ù÷ñÿûð  ¤€€€ÿÿÿÿÿÿÿÿÿÿÿÿ!ùp,PGþáH° ÁƒÔ«×N=S JœH±¢E„ ÚÁÓØN£4CŠ™Z=xóèÑëXÏÉ—0).0YïÜ·yóä½kG/bÌŸ@Ì«7´Þ;œðàÉ ´éKEqÎKºžO§X/.¸¶è»¤Û]ÍJV"¯uàäÉk§Ž]¦oìÔñªQ¶®Aʆ‰cÇ7._udžk·.3eƈKw¬11cÁ|Ù`ZØ.ƒcƆ!F,LX0a (W¶ Ù0ÏÁR+{1ºµÀÙyV&Ãue #–X˜1@ DÛnÊŽpàxñ²¥œW´p횥0üç‚?8;†›®Y4]º¢þE›và@GzÒà®.sjGul§±›Ö+Z/]¿¨•gžgú± Ô„Õ‘6ðCß.ºpG |æÁ×P ,@B²·@ Jµ£6ý¨Ë 5LÃÝå”§N9åt4Ï=ƒñ†´ÀFhÍ3<>3 4ÔPsO4ÍàÓÌ=Í$™ä=Ô„sÍ7úÑ£Ã3 Èͤä3Iê¢d3혂C Ô4£‹M2yÏ4ABY:èD†–Ið‡FAÞÃe3»4c!ã™Yàᣎ!ˆöb¢Ò4ùM;ó”Ó ë‘…[ GvTÎ=áPãL3üIH ê\s>7Ø€d3×BÈ«þÞ$:^(š÷NpX1€ )HâébE;åhÓj¨¢òÜóŽ‘ê¨ƒƒ‘øH "È«¾6ãŒ~X1m’ø¨ð«°˺°˜£5U [5Ò Š( 5Ø€C×hD=ö   ’Ô\ƒÃ *Ôà „ôbÈ‘úÝc…3à€Š)eÐPiE2À2 («òŠ:LΚ#Jˆ¾7àÓÎ=,ýkÏJK–Î 2$üj}Î4JÍÄ[ 3Ì@³€ +ŸxŠ*ê<Ã5&öÒp&½à 5>B0O§ÔÜ]Hq3à<߈®É$4à î4ƒC)ˆ$Ãþ*óh²I(©@Í4P3^4†ôR *rãðA3‚wTd3ムº8ƒÏ=|`à ܰs/ÞD#M8pÎ+ª(í7(¯H`§¼òŠ'›¨2Ï.XÐŒá¥÷"| øTAƒ )„u‘”Ûƒ6tqϾ¦Èð9°-ü¬2xø±&žh¢ ž¬bÑä”rÊ.í¼ƒƒÌðí4âEã7˜bÅñ|Pæ4ãXppàC2X€ lp9¶%ªÚp†¾N`›Ø'|A)Š0àðQǾà€(€Í`“4êg˜¢b€ ê6Ài¨ä;ÍèBàTŒþ*{•!žC È€¾ß+6Ñ §©âH œq·2XA f0@€$hàw÷Héìc}áì5L4fÈ@pü€d€ƒ0Œ¼È!¼4 uàøĉMx¯PÚ»‚+˜Á‘fƒ$Íð.‚à‹TKÜ4¼aµod­5È©…ÀÈ ,˜ îÈBBø(Ch0 \ 4à' Ð Nx¢«°ŠAR ·2TA’bi‚8³Lš8öªyxãU~ðà NPƒ|N,8Á fo✂èV™,PK[Z‚,ÃV‘‹\LCíþÈAЋ a ¤@±H ["A @\4a=„|àƒô Ñ<äyxD&ÊA€Ãx˜¨zñ g´Ó–ð€@ Gÿ€ïiG  C0¡ÀÀS0¨`Íh€Ð'`A àÀ‡)>„8C°#`A3B€„&`ô`<‚ j&@²^ –ðCH€‡\¨à°€(Ei@ÏFÍ( Šp)LA bø@]¿Á" a¨=€“š <AíG4dp@ªEƒ¿‡f?”gdãžÎY)`[ÖÂQƒžÐS þñšá 8£¼¸À0L (G° ƒW=Hn8p0 Œõ0`’‚¤ jp 4x4¦á;¬Á. ƒ±4@ ”-ˆ@Zp‡:â–+½4‚(à#o °BzaŒØò¢e€+xà„!è :¨@ŒÛƒ“5·¬¦@s'LaX×k ƒ†÷@‡<d=+!à-€Ä/ GøÌp…<¹ «sßAðBèAa+'%¼l¬W¸€/P^ ç ¼de7¼K˜@&Ѓèál8c¬:ž;G;„ÈÀþ¢0ê,À T $q&O ð0D'ü`Áxs-ÀN h °Â;ýù ƒ .¯•K ‡F0‚ö‚6fÀ Ÿ‚¤Å-Þàˆ °y É®ðÏ@¤ÀLf€3Úñ(A ÇÍB`ˆkà¹zÀƒ„'çN8 °ò¤MJH‚nXƒ ²A 0—÷¬gÅÅ#Þð ì` °m@D0ƒ%xq emn¿‘\'ä@ÁN@B X„œu¾˜jpÒ¦@°9hnÚa‚€ÃyhD"mœ¡ pYƒE¼áz¨¯Š0ŸTˆ E@Bþ¬‘Ó ø`Ýð±Þ]T˜§º¸À“‘ã¼À¬¨àC˜l |° t(A¤™ÍˆK¬áè&8ÃhÐéæÒ×C(…òòÕÔÐÅ"8S >p¿¨aˆAªÜ§™|?èxØdíùµ}ŽmØ &èƒÔ`‚Häa B‡Æ40a ,â‡@„É£ðßxW ŒÀW)àò8LaŠö˜‚¶$ü„‡ ÷3y¸ÆL°‹Þ|FÁŠ}… ¼v°J›™+y,XÀŠ`$x}Á9CXR/ +µ÷¼­=¦@_ ”v̶sÚµþñŒ+—@.°x³ÑDëX*˜:˜\ÞÞ«T8€¼®ã;sÁfÝÁ“/€^À@`mF@€fwPÜ  áP]Nò!eð`aW€QàLÖ{Oæx°)Ð@y;vFpXV‹ðÀ°‚Á@ wéÅö`MÆ ×ð!r aXKåµ¾§[ø!0ÃWõÇ^G9P|H € °Z¸… ‚*¸‚, ÃÀv€c•—4fXV>àÐ{º‡¶,€K˜ÇLpÎ4|–g Ã0gY¸þ° Š˜ ˜ yÀm' „6€öv“8„Dè{;€ZÐñð‡$¸[9 9vW`> 8`ƒ §†;@€; 6 ‹6j×¶ €Y‡)`Œ£å{9`W@È·†>Ð\Î@WÀxaG°f}ˆF±hb½„(…Âhg¨åXà €Z!F„xèM`JpyøXŽsG^@^ä5aç‹éFaRÐ º(Œ×f Ðî2àŽ €Zo(sø‡——å˜X€¹‘I€o˜T€ Ó8€(U!âÖ#¡/¨õP!Í݇OVVù‘¹†úH‰6“ÆNò“s6 n ÐŽÁÑ‹:™”J¹”vf¸‘@éW"ŽX!¸”8ZéV‰ÃvV ?‰Z¨UOY!ꑨemo·–“HaÄfle •&fbt’+ 9—sÙq •"Ž(YŒ ù”s–cÉS‰—âè—b ”a‰–b9˜VyŒV☈9˜¹˜•Ù—xY#!˜•‰˜hÙ˜ É™ç“™ñ™&Fš³³™vˆšªy>¸1”9˜¯‰¨E™AY›#¡™’©›¾ù›Àœ;pygame-1.9.1release/examples/data/alien2.png0000644000175000017500000000670610543371201020657 0ustar vincentvincent‰PNG  IHDRPG§0¼ëPLTE€€€€€€€€€ÀÀÀÀÜÀ¦Êð ,&$+(-10,-*1R m&Q'r'J*q./N(4q r8A;G..n6By9AU/FrL_7M.5q/ n7.GGD~G4LK5kPGTM3dIrK5~kpk&NKPNQmYdqnQOjXhogXqop /‡/Š6¨)4‰9.ª7 ÄDA¡n¡/L3N¤6l•9d ?UÂF ‘O«W/S&®g4´NÈY+Ë`åm+çHWIS¬Oh’Rj¤eZ‰L´lrŠcv¦zHÌŒ®-ž6˜4,®6³)…tÂ4Ë7Ì,HŠ4H¯7P•qJªzt†ui§zNÒ8Cô0QÉKOÓkuÅm~ño•‡¨‘¸¤/’Š:‡£.¬“)µ£6µÀ-Ï”3Ѧ ÖÚ<ÞÔOˆ›R‹¥L²ˆR²¦u…Œn©n«Šw¦ªKÓ«pʰMÓÅNèÑqÏÌnîËeåà–: ˜43¸3€q‹3E¥m°6D”HQ2ˆv ”b3¯L­P-­f5VN…^j”fTŽuoªVM³Zg«lU«vjÂÂ- Ñ8IÌNÃT2Ïk Îo0à~ÉKOÍ[bÒpPÅmt;Æ|†£~ƒÊ{‡âr¥“‹.¨–¬—-¸¨¶¨(‘K‡y˜§t²—L°‰u±¨R¬§nÊϘ-Щ3äª/Ï”RÐŽkÒ­Lʲpà“]åžxåµQî±yîÎn‹Š”˜¨•©™™¬ª®–Œ§š¤®§—­­ª–†Ô˜ªÌ¶¹Äµ¸æÀ¦¹Ä·ÕÈ…éÜÿæ¹ÈÇ¼Íæ§ïëÅ’ŒÈš¦Ì¨—Ä·±íª…üÃà¹ÏÕÉÉÅ·è݆âȳÈÊÆÐÙåÛâÙÓãääÕÐãÜá俨ôôò78€Ì©°D•ÕÌ©°c c ÿûð  ¤€€€núCtRNS@æØfbKGDˆH pHYs  šœtIMEÖ%7D^™ TIDATXÃí˜]P×Ç‘GÓõÜ•lëîn%yIišƒiôÅJT\9)vê´2xDÁÅi\O‰“fÇt<›Ì4e’©cƒAŽ”ŒMq›ik96Ä’,XìªÖ´¤€Jªz¡^:H=»âÄI'zìYf‘öãwÿÿsϽ{WŸheEZZDy $-Â&-NÑyâ‘•Åôò²$­ æ‹·òÁl:½´ -çÅ4J¯¤WVÒéÅÅ¥¼x¦Ó+«i‰ÌÂøÊÊJzx’”àп斖¤ÔÍ7fo¦†yp<>ò›)ø˃Æ÷ÆGßûçØØØÛ£W/;óÐ-ôØèÈøèøèððÕa:?ݼõ½‘á«ãeù{àzdtøê¸5?8½7þÎÈèÛã}()ÜÊ'熆~?44KJB±êËuo:-II1)Ä"‘XL¤(IZž*@_|ÃðHI)ñ¦E#oŠJæ²ô;7[@$9)iNŒ^ŠˆI’’(h@Z*FèîŠ—¤D‚R˜‘2‡(&©yŠJÍÏKR:óÊ¡Çîˆ%*q}B¼NH&&d…Œ G†$㳄Z®{ä±ïÀ®J˜§™„ˆ ‘ù "“b&™ÉdDBfÉüÁººƒŸW#­ë•Að. áPL">ɦÂápTIfŠ$g¥ôüoyô¹ê¸XÈHÒ|&I&²Áp(LÅ3Ùr'ŽC¡Ð @c *-üÏJ§ù»‹ƒÁ†X,æñ`0 ´¾>~)³R)>+d© £·ï´& †pLÈ–|ïäSÏCü-EöL½pŸÃÉ——WW7'2‰ó¶ÇÙ¾P4 Cea°Ýþ‰Î­Ïo9Þr¢3µ™Ï&3bx!'_ž•Àÿ —%¹‡…¤ÍZâ…¢±‰)B@ í6Û' üEKËSO6·œHM–QŒ†¢oDyžÏ’ •N²º*mn˜’‰f›Õ…Ã1Cx;à{ƒß^|»À“ÿnlúùsAvcáèµ p±Y `¸@ ®®f³ÎÈD6C™åÁr‰M%ÍÓs'ZZ›Z:uøLggsÓ‰ô¥BV ±™X4 f÷Û­Å’DÅ!õä ž Zå|/HŒÊ}m•Ç[›n>ù±ñ×§Ÿ¹$-ðZÖ6AÄX,63 Ø­Z3D^VØÀ—Û³+r:³NÙ2Z’jl>ö•ãMMG/´(éE˜U¨£Z¿Å"ˆd ˆ±(?hãÍ*gPhàÅååXDh°"¤uÚx»\P¡p,ig­ärcsgÓ1Hþ[æqÅ|{{ µ£ƒ·ø|FdÂrŠ¢a'o³š:^EÁªÓéÌ:+ïè …†ÞE1•59¦Ž£MÍïliI‘ àsŽ@GG[[[‡Ùç³Q„!6 ÍFy‡Ã ÓAMG¬«¡Ôæ\O(ɶÉŽ9ÎÈÙa©wôácG›ÜXªóöýmm­m­v‹Ûíf2Dœ‹‚­ôL(tölÙ=Ž2g¹µôž²¾PxæŒ"°ÀãX G·ƒÈ“/Š i­xè¨ÍWei“£µƒpœ¯õ:¡H¬ïTw²¯§§»»§ûÌ™ž3ýgàÓ¹¹ÕÓÝݧ¢$5)ã8l2YÌ:3¡¦å©½=·È¥Ë¯M~KÇ“%XøåÁƒõGb.;˜HÄÂáRþk¥Â]Ù²»ø¯¿ðB÷©Óa’ 3 Ãa®÷ì¶»O_,1XƒÎ cM¼S©áZ©—«ªjm5³¦Ù‡âÁº'’4m˜„é?³f#PIä­¹¹¹DâÆä 11a"ËqB§O‡S•}¿]%ê&® qn¶aß7’õ×ÕÂV__Ÿä1¦1g°CY’€É6kŸ¼.>º§B_ôt"nd8–ëÛ±M³ãå_…8£ÉRÎ-þ,d‘´GG !LÿîÀ‘Gê~V·½É –Aàõ ÉdQEeeå*w?½ƒç­çt*Õ–r:‡_?k±ñr ;jlý1ƒéR{ààëÚ^WwXÊи†ó9†c° îfèé=•z=Ö?説¨¼1AC‹³r»¸tøµ¡Êoƒu TWô—Ã]þÅpý¦ÚºººÕÖnŸ•x̲˜5úq€µØ|f[¤"}‘^Ï<øÐÞ½•&l4ƒ9¥{è7ÿÐõºÁo»_38ªñU‹=COH½† n:tW8NA»O+~i²‰±³‚ÑïþÁ÷÷~«¢è‘%Bépøý]]¬»ÊT¥NA¶û}ÆûåLÅ¥`}ý‘MÛ7ùIp~ž§9|þ2¶8ʶØÌº(­¨¨b÷C÷ÝÀg%ƒÜÃÐ÷žïzµÛâg½Ur'#TíõùÿlòcOúýÚ‡k·o¿@IóÎÅœ¿ˆmeàèBcX†^h¨dÀóî½?¬¨¨Ð?KÙÁ3~ó Ð ŒŸá¼+/¥¶"ŸÏëvïò0 ‘„_ ŤiŠØhŽ)? I—= ¬14ŸØóSý÷ö¸ô¿Ù]Á]§ŒpNwþÕW_Ã?ô³Û”{"ú^nŸZ­f>˜–` MSƒò85*†p)§žATüY}Ån é]úI‡ÜÖà®×N±Õ,ç‚Í—›¶!·w'ˆt¹\/Iò=À œ…‹™*£ÅÈr¬R…PÓTbR-íÑÝürcÆãã 9g2­=¥ U¯{—ìÛå‚3n(º¯}S§¥×+[ ›\íÓ‰dV7‰D;œõÀ ¿‰ƒæ]ŒÛÄmÌ^¼ˆž ÑÍ0.Üw¾ÿÊ•+Wß|ùÞÛ¶n¡!ßGö:À‰x;Î5Â97ȃÚ²ñÄSa·×»Ë÷€×͸vÂK¿Ó^‰þþ+2ØWFJ9‹‚ÄHàA5ãñ¨e–K{ˆ.ýð¥Â.·×÷Àw`võª¿½OÍ–8zú;ðî»ïþé×gººî1ÌZä.–U»Ý(t«PaáÐ\¸E%·–Ý>×>—‡©a=FÈVËNFƒ2d݌ڽOf!¬fÐzŠÁ3ÈC:í­ëùbøŠ•®r­ÖTCˆ<O05~Î9#ëÇÕp»_U*Œ+Çc° iµ]ˆj5p™’_·ç»;w©•`”‚6‚FØ<Ø£PrÓÙ¾÷÷åäÁ,Òh5·-E´¤BbYž¬Pí‚›ê-›R@pÊUýÏša#¤AšÛWKN^…¶h²éÊUŸrÿLù¸.eÏLŽOY!:5ˆ.Ô"aæ3òfâh¦>§¬Õ!á:¹1Hn |Ëb@‡dž }Ö B«EVfø[·µ‹¼¡ ‚þ\ËvJ r£bK%ï4H‡äc*ÕÚ¡;yOY …¤Ê¥j]•¢ ¾Ðª;|MV}뤵c(÷ÿ ½|ߊÍé]Ç~ñHÖe­}ÝÀ‰·úÜŽò@„çºM±*o?P¬uJþ€ °àÿ±ÿ$výàãIEND®B`‚pygame-1.9.1release/examples/data/alien2.gif0000644000175000017500000000737207406772533020661 0ustar vincentvincentGIF89aPG÷€€€€€€€€€ÀÀÀÀÜÀ¦Êð ,&$+(-10,-*1R m&Q'r'J*q./N(4q r8A;G..n6By9AU/FrL_7M.5q/ n7.GGD~G4LK5kPGTM3dIrK5~kpk&NKPNQmYdqnQOjXhogXqop /‡/Š6¨)4‰9.ª7 ÄDA¡n¡/L3N¤6l•9d ?UÂF ‘O«W/S&®g4´NÈY+Ë`åm+çHWIS¬Oh’Rj¤eZ‰L´lrŠcv¦zHÌŒ®-ž6˜4,®6³)…tÂ4Ë7Ì,HŠ4H¯7P•qJªzt†ui§zNÒ8Cô0QÉKOÓkuÅm~ño•‡¨‘¸¤/’Š:‡£.¬“)µ£6µÀ-Ï”3Ѧ ÖÚ<ÞÔOˆ›R‹¥L²ˆR²¦u…Œn©n«Šw¦ªKÓ«pʰMÓÅNèÑqÏÌnîËeåà–: ˜43¸3€q‹3E¥m°6D”HQ2ˆv ”b3¯L­P-­f5VN…^j”fTŽuoªVM³Zg«lU«vjÂÂ- Ñ8IÌNÃT2Ïk Îo0à~ÉKOÍ[bÒpPÅmt;Æ|†£~ƒÊ{‡âr¥“‹.¨–¬—-¸¨¶¨(‘K‡y˜§t²—L°‰u±¨R¬§nÊϘ-Щ3äª/Ï”RÐŽkÒ­Lʲpà“]åžxåµQî±yîÎn‹Š”˜¨•©™™¬ª®–Œ§š¤®§—­­ª–†Ô˜ªÌ¶¹Äµ¸æÀ¦¹Ä·ÕÈ…éÜÿæ¹ÈÇ¼Íæ§ïëÅ’ŒÈš¦Ì¨—Ä·±íª…üÃà¹ÏÕÉÉÅ·è݆âȳÈÊÆÐÙåÛâÙÓãääÕÐãÜá俨ôôò78€Ì©°D•ÕÌ©°c c ÿûð  ¤€€€ÿÿÿÿÿÿÿÿÿÿÿÿ!ùŒ,PGþ H° Áƒ¼{‡Ž;V JœH±¢E„ ЩӈN£³CŠ™Ú;uíÜ¹ëøŽÉ—0)*0ùnœ·víØ¥Cç.bÌŸ@´{7ô]:œêÔ± ´éËCíál—t£:ŸN³^T0m!ÑtI;¢Ãªµ¬D\æ¾±c‡®Ü9UÞΕÃ5ì]ƒ Œý w®¯Ü¾å†ýFö®]dÆ„Fn˜c`Âzé¢ÁÔðÝÄýJœØ—¯^¾T¶|ù²_Ÿ{©6Ö‚´kˆ5 ûl ÆkË  &öK±/a™Œ¾ÝtÁà¾áÂ%k9®fàÐ%C€øO˜pv÷ \²f¶lþ5köìÀŽîœ1*l]&ÕŽåÚ>;÷,W³\¶vA3î#d”ât‘E]hxY˜h$ä=]&sK2žtBÞ™3Ø>åx¢h.'錓ޠӎ8®ØÀ^Y¹¡€dG⨠2øhh'š”3Í=øÔ@C’ÉL£I'þ°v³(yB¦x^:Âeµ€ #  ‰&fŒgKèˆc«¢ŽšI&6°sO:G–SŽ Gâs€&3`’É&°þšŒ2ûPµJâ“ÂO ’G!ì’M9ÐLA¬8Ð8£¨¢™Ì@ƒ BN£‘;ö؃€5IB3 1¤0Ã%™t’‹'HîwOUÄ`C+¬ø!Ã¥ÁPÈt€,!å @íšõÝÛɾ5àƒÎ=,lÏJLš N 0( «}Ê< ÅW¡‰ 1Ä@ÒˆÐAGrÀA‡ å,³4'æâ°*¹Ø 5>CÐ8BŒf8q2àC ŠÞóL“6È`ø˜h’Œ ~  þ ƒ¬ãÆur4 È yÍx’K0­ÌmÃÉ Þ‘‘ÉŒ>4Øê=|@C šÔ°s.Ý4ã 8hó !‚(ý7„D`Ñ}BoÒÎ-PÌá¥ç"¼&øL! (ttÀ4GVn>6Ð`Æ=ü²Ãç6`¶ð´Âð!ÈnÀá†^À1ˆE `ÃG· “Ž P¸ÏŒ×L7ÝhÂJÇ7ð™Ï WÀÌ`ƒÈ¶€h@̱mQ¹°†2¡ðÍÁwxÃâ  KQdêˆO9‡< H†›œa¿ûØ€ûh`7>C%àI†¨€ÐÀbþ2P¬:á èÈ€0€†.ÂGˆ7ÌÁi‚ØÅ$‚eàÍUÐÃþ`!øÝ=Gºûxb_8ûÀ "`ƒ=#0ˆ€?Ø` ë.Tщ/=£øð@*°Åá pà!”/„¢ €äö@É?|à‹ #Õ÷ŒnXÍY›Á 0 Çj%p0ÀÀ b@ƒX¢Äyb6Á ’|´ 6 A"Q‰HLÂÐQ2 ˜µ¶ÄÄ% 0‚IÔ"ÀHIJ x z7JF0Vàƒ D! zÐÃìê -„ D傜ØÑ`` B8šR­ÐØÅ76 ¢j,£øTÊ: Ür°Ð$&щ …ˆþ‚ Œ— ŸD@ÁÀEp Ä@A08¸ †,`Á¸Yà‚rÁa H€¬ÀÀ•$$k@£KøÁ2˜ñŒ3 !8Ž• TÀ´™`ÀI@¢¸di l<z[@ü apà–í^¡4€! kÈ‚°p\.¬É¹fðœKá /àº'È6L#(+Z°‰`A)\_Œâ °˜@ð+Ä€¥¨EYŸ›h`A ]ø «9áedµBÀXóNøæ-ë´ñ]#\à¸@n` WCdݱÚIZ ¬À èþ¢ð„TGU‚JAŠ4YOP‡'¸ €ãÎi Ö@¤šKvR O@àùÏLè8Ax¯<$0a KÐð¬ƒL­&$,f±ˆQ` ÍCˆH`€j;hò”Lha c@®ÂOLãЭÄ$&LaÑ<—ÂO@À•)}#8¡ KÐANP h„Ù¼hE+-H±ˆEPQˆ-"¢€ ŒC0«sý¥ å¢AÄ ‰Ù`h….$‚Ô ´(ì œût\`áÍð˜ÐƒHû€@*lÖ¼@‹øD%ìKDÁ'’‚þ‚ðièT;hÇ6~<,h@­88lQ(‹BÇ1hÁY[a 4™X@:Ì`„ HºÙK¸B–~@@žv.,x‘ñJ``O0o_)PF<@_ôÁ3…°ƒ û žà„ Ð¡ÁuºÉ5¸Äމ]V c;è6°Êp% áXÅr`tf Ž€(>ñ P ü Ær%áá}…6?qÄ4¦l?+ÚyKÄS˜Øt—p“°<@\ G<¿ ƒÛ X("A)˜ö5_2Y  øàAû –ï±,ÏU(+ð{‹û D¡¾0-™)þ|ç¶[cXžð Þj #Ñ;Î@ ®„&›ø+°± !ùÏ\þYqå X. pm6`€gEwàÚ` à`]O"~aew€OàM|P&yÀ(À€y8@v?hV— ¢@ ¼Ð‚½ ’ðêõ ÆaN¶À Ó" 2 (ahKæ…Á·[è Æç÷Gb77€|A @ ¤ \Ø…¤À‚,Ø‚.È ¿°–€d…™DfhV;°|»%‡·$+€MxÆDÏd|ÀšG c ¥@gþ[( ¥p ŒX ©P ”Ðm%@„V€6w•X„F|8ZÀñà ‡&È[77PvV@;(€ƒdž8`€8& ‹ 8jØÖ €]‡(€Œ¤|7`V Ëe8;à\Ê0Vyeg¸D‰&ö³xb¿8„Õe xg©ÕXÐ Z"f„z¸EðB°yüXwW^P^åueŒêVaP° ¼HŒØF Àò0 ZqXsú§›wÕØx€ ù‘!i€qxR@ ×X€)e!ãÆ#±/©åâ `!Î%‡ê(’mø‘mè–a7iVíd!BÉ1Aã¶ñ(¿Ø“LÙ”Nyg˜9”N%æ(€B€NY€¤¥n—HlP ”©•Zf!•⎙Z×6wnY‰Vldž–Syb'f'ºòvi— @—Si!æÈ’ÇøRi—di–ía•{iŽY–CI–kY–†™•Éx%‘¹˜†)™Ž‰™€¹—6‚…‰™‹¹–9šŸ‰>œy¢yb§9;ž‰‡«Ùšè“q™†)›Y‘Z—I”¸9Y™½œÂ9œÄ);pygame-1.9.1release/examples/data/alien1.png0000644000175000017500000000670210543371201020652 0ustar vincentvincent‰PNG  IHDRPG§0¼ëPLTE€€€€€€€€€ÀÀÀÀÜÀ¦Êð ,&$+(-10,-*1R m r&Q'r'J./N(4q Rlq%~?8A;G.By9AU/FrL_7M.5rq'n6.GGG4LK5kPGTM3dIrK5~kpk&NKPNQmYdqnQOjXhogXqop€ /‡)4‰9.ªDA¡n¡/L4M§6l•9d ?UÂHWIS¬Oh’Rj¤eZ‰lrŠcv¦ €Š(¦/ @Ÿ]­I0R-­N4´a Ä/ÈEãW+ËQ;Ã{+çeP•qJªzL´zt†ui§zGÍs/’Š:‡£ ÖÚOˆ›R‹¥L²ˆu…Œn©n«Šw¦ª€ž3–: ˜44®®3¸3³)=€q/O‹3E¥m§5P°6D”HT0„v“”b3­L­P,­f5VN…^j”fTŽuoªVM³Zg«lU«vjÂÂÊ=Â- Ì,?Ñ8IÓ7Tô0LÌNÃT2Ïk Îo0à~ÉKOÉKWÍ[bÓeOÒpPÅmu†|†£~ƒÊ{‡òn„âr¥“‹.’…0‹¢<¨Š¨–¸œªŒ0¬—-µœ)¸¨¶¨(º¿7Œ›O‘K‡y˜§t°ƒN²—L°‰u²¦Q¬§n©«wÊÏŒ-Ϙ-ÑŸ3Щ3äª/Ï”RÐŽkÒªKÔ¿LÊ«pʲpà“]åžxåµQî±yÞÍ<ÏÇqèÉNîËnåÚe…„ƒ”˜¨•©™™¬ª®–Œ§š¤®§—¦¦¦–†Ô˜ªÌ¶¹Äµ¸æÀ¦¹Ä·ÕȹÈÇ¼ÍæÅ’ŒÈš¦Ì¨—Ä·±íª…üÃà¹ÏÖÇ‹ÉÅ·èÛ…âȳÿáðè¦ÃÅÂÀÜÀÐÙäÛâÙÓãäåÏÙäÕÐãÛáãåØù÷ñÿûðÿûð  ¤€€€‚ç6tRNS@æØfbKGDˆH pHYs  šœtIMEÖ&Ùgg PIDATXÃí˜LçDZ†t‘Þ³“ø½ÝÍnŒ°Ý5ë@„Õ¿8Ûsæ´s ¦Œ%]³nšè6A¡#-­‹–@À©½¶Qš‚Tm!Óš!2¶)Îpº(Æ„ŽVíbîÕ¼XðèÜl'Ð0 ûÏ=wš6íÚ´þsÏkÏ÷ãó~Ÿç}ž÷ÞsAÁ'ZY‘––ûPAž I‹Ð¤Å):O<²²˜^^–¤•¾|ñVÞM§—¤å¼8Ò+é••…tzqq)/>Ó€KË8d~ÆW€¸c#cyÐøöxôµ±޽½rÉ‘‡a¡Ç¢#ãÑñèðð•a:?üåí‘á+`ãåùª=ðz$:|eÜ’Þ}$úÚp´å#„[øäÜÐÐ†bII(Q}¾¤îJ§%))&…X8‹‰%IËSè³—1”GJJ‰·ÄH,~•PT2‡”¥ß½³D’-‘’æÄÈŰ˜$)‰‚¤¥„î{æn‰¨dqIJ$rÌp¹]“Ô>@„ð¤H’ ™%ó[Z~Z´¶KZ$ ï¢ ÆD!lçÃál* ED‘d¦HrVJÏÿšGŸ*K„Œ$Íg’dB„‚Á@*žÉV8Àáx  Î4"! ÒÂÿÌtš¿¯$¨‹ÅÂ~i>B@ëîæ—2 Y!•Ⳃ@ì]Ý' €09ä—eK?ŽwýÍ·Àþ•"{H¦À½P·ÝÁ——WW7%2‰óÖRûñî`$$d•ñû­üÙ¾FÛGznyëêàÕÁèhjŸMfÄð‚¾"+ÿ+\–ä’VK©=ŒÄ&¦ñѰY­%𯃃oþv`0šš,#¢ FÎDxžÏ’ •†¡]]•6ÕM,ÁdµXCÁP(#foãý|W@àKîx}¹½ÿ¦²‘˜ E®…‹Må9¸ºšÍ:ÂÙ erT*@bd&6•4MÏFÛûGµxitt ?š¾XÌ $6‹D"웥ê$¡ ï¨Ëð¤Ïâ¨à»@bDk‹”¸:Ø>ÐÞ~dàú‡ ã½?]º(-ðÖ:AÄX,63èóÛ,D^VXÇWزa r8²Ùe &&4$Õ>pþ WûûÏ]ú`RÒÿY…ú‘Æg6 "™b,Â÷Yy“Êêxqy9ê,iVÞ&'T0KÚX ¹Ô>0Ú‚ÿªé}\Éߨè¯ojâÍ^¯^ ™¢HÈÁ[-&»–EQ°hµZ“ÖÂÛ»ƒÁ¡3Á° ¦²F=GÃÔq®àߣƒƒ)²ü‰¿ÉßÔÔÐÐÐdòzÍ@¡Äf"ÁÙo·ë´Ú¬ÎÚ-º2«pÁP8ÛH$æ8=gƒ¥Þ¹#çÏ œ¿¾±T)áý{êê›lf—ËõÅ ç"àVz&<~¼ü~{¹£ÂRvyw04s *…,ð8ÖÌÑ òú… bBZK:bõVšd«o"ç­¿A(ë>Ü‘ìîììèèì8v¬óXÏ1Ø;1·z´£ãp„¤&e‡F³Ik"Ô´<µ7æ¹tÅ5½Ñgnú1X)ž>x°õÔËgæ²}‰D,*ã¿\&Ü›-¿—ÿÊSOu>" J 1Ã0溎o½ïè…R“ŽÕiuZÖÈ;”Œ®•y¸ÊÊúzkœ=pòy l9“¤iÝ$Lÿɘ%†L"¯ÎÍÍ%7'oЉ 3Y޳«:z4h7ƒ+m{l‚,Q;qmˆsy±{¿šl}¹¥Zkkk’ǘƜΖ•k8“cÖ6yC||_¡è‰D\Ïp,×½c«zÇ‘Ÿ9½Ñ\Áë;,D‘ö7F¢Å3¦sàÔó-¿lÙÞ ÈdËŽáu£ÉdQMmmí·k÷>± ƒÏ[NhUªÍ;zåp¿tÜlåå6U[{z/`Ó ¤ùÀÁ_´8¹½¥å”¡q5çÕs Ç`'ÜÍÐÓûjj †{ <\[S{s‚†1få~qÙð A]¥Ï ë䯪êí©€»|‹¡VÐÖÒòtsóöY‰Ç,‹Y½ûY³Õkb°Y*2 ÛylÿþšÚÇVšÁœ2<ô+¿o{Iç³>¨…U{+%nŽ¡'¤®‡É1Î »œžõá*¸ÝWˆU*Æ™ã1X…4š.ÄŠ5j¸L‰¯ËýÍ» c”„ÖƒFhnìV(¹él÷;»sòà ©5ê;–"5R!±,OVXè„›êmMI 8å¬ú»{Ía#¤Fê;WK^…6k¢éÌeŸrÿLÙÝ0§²e&ÛǬjDk0ó‰q3r4§>ž§¬Õ!àZ¹Q$·¾m…è×"™§BŸ´ÂÓh€•þö¶ö`‘ÊÁÀèOµlW«S+7*n©äi‘|L¥Z;t7ï)k¦T¹P­«R”ÁZu—¯Éª÷m´v å¾?ÓË÷íØœÞuìgÿƒd]ÖÚÏ üçx«ÿÀí(Dxî ;«òöeÁÚ äX  þokö_jΑ2Í®*ƒIEND®B`‚pygame-1.9.1release/examples/data/alien1.jpg0000644000175000017500000000603710543374517020664 0ustar vincentvincentÿØÿàJFIFHHÿáExifMM*ÿÛC  !"$"$ÿÛCÿÀGP"ÿÄ ÿÄ.!"1A#2QaBq3‘ÿÄÿÄ/!1AQaq‘±Ñ"ð2Rb¡ÁÿÚ ?غ4hÒ¨¨Ñ£Qžå·é¨å·_¦¤•+)g&‚TïIY /ë*@i‡ª«È yØQPvv¿iPî«ÕQ7Ûí<5T”11NIJˆH1E6⤖fb]ÙÛë³jèí½LŽŠÙÙû+ýEMT¡›„Õp46LGŽY¹9:Ó§ÄdšEÎzz†z뙌ÕÉ<µöñI$°Ù#FŽp[’V|þ’ƒò¢žÝQ¹­·-Ì›’²ÓE,uhm¨&„TFÍ"ˆÓ5 ªÉ ‰H-žy\ !!,“þ\ÄAÜíÛ¯‚iôÌl|Àï•£4kššáASU--5m4Õ¢É$Qʬè¬ÎªÄ G 䣃®<•F5F ŽòÚ²Z3º¬B¦t–p‹š21FydÀ©Ø‚=õÕÈÛwiTÈiîÕ†:j"Ò xŒ³G T…`ÁÖð‘apptŒ¾n:ŸcIè^SML©¾‚†`Åx ](ˆ1à“Èûz/<“´µ°Æ^Iò½Šé¼° {¬š>¬¡4[Ó-tåA’¾í ´T´œƒŒ´n¢ySÀ"«q"qD©Ý lEu­–ëW*žá[*¼ó§rIU£p­4T(U(Ô߸Ô\¬?–š®“ïn¡©©‡–E^%‘ŒÜIÎIøÅGvÖGhºSÔW[æ© ‚`ÓG&CaȨùlGóíü:Aãå´X®„m1órèqÝ®µÖ(('ŽZ— Ó/9G’xr0Á‡cœŒŒø£Ü_Ž·‰ÚÇpÄXB_Ϻ’y€3“'ÚŒ•þ¾ñK{Aù»•¼Äù3Z®³Q»€O§ÐÀ8òp0œc'=½%Ýw~ž~3gnúšjÛ=L‚ue,Í1·ò„r)PëMé*äDJ©<í¨6e<Ô”ÝÌÈÊBòä _‘…ÇÁ??²îêûü î*æ ¦ªÐ»7Ü]¶=ÂOí^àAËã-ÿEFCä1œíÓá9)åSý YÖ×Qn…k}mÆ‘jíõtõtÎX,°H©*À0ñà‚ðAèÖ[Û‘ÜöÖï†íf§«JîÙ‰Ö`¯,”üÒIO&!’È àÿéöæÿ&´É$´òÃWHëC4kNýµc,JÏh³2ŽG9FÛ'>›‚©îddÜlEŠ^HœÁr²¯V·½óq÷74W_º¶¹Å4#§·ž_o8ŒŒ‚Ñ©‘Ù‡.NñUUZ½6çKõÔÅC‹Oqbšj°Å%—ŠÉöèPà¿%ƒz8“‚J+×.”÷¿-nÿ™éë-Žmõ „о˜§Nk—‰“‰É$/ӪͽzØI³n÷*-»Wh¸ËSº²¤5Iî •N#ýBà${KW `| ÿSÛ‡~QÚ¯Ûƒk_m·Q$H­UK VFË´yVàÑå[%y6xŸ>5{+cY’â›ïq¬Í5-¿Ì0°\†r¥¼-ãÆqé,®W•«ª¹T\ Žát¹Uº™Þ¥"ì!ÂÄÙ$18ÛÐ< úϤ¡–¥ÅõM.&ÛØùùašÜÅë¨ZàÌ8p´^ç;,,~ýú߸v<5uOê[sKž øºžRŸõ.©ã óärÒ {d:JÝë®/W_[¹g¨{ì=¦’÷h¤áƒ•*ÊOŒ®qðÙw tWÈlg§Û×iJ0uso‘r 90È ŒçK¾½ÉoªÝ¶˜)«éª+i-qÓ\ªâ~äfu/ˆÉËñ|ÿ 18[ðüÒKÅNÃü€Ïìè±h1*Êék¦—Êþ~êÓkê5U% ®×[᧘´t´·(^¢¢˜àe ²sàDl–OL7µî.¨Ø¢©˜ŒRŠÜ$ÉKF$^ìŒü›†@«HbD¿Ê.V­¨õpÚ9r•ÂÊÓàÏÃæ0B¯cŒŸÊ^0¬_¥»ÇzõVÏ%]*Ëj²IùjâæU)*rûaÈgÔÓ8+‘ÈBþàqÑBîSªšƒœ,÷\êFÖÓ©×%èê "xŒ:î'0ÓvŒºîO°Ó=œÿV½¬Þ4±o=Ÿ¦á …Ö®S×p‹ Ç#ÙÝœ/»Œž*§].óÔm»[᧨•¥y•ŽFGŸŒäOóÿßÕ}.º³Ñ‡Ô '¾Û¥¥º*ñŽén—±T ñÈ-‚²«Çõ° ã‚s«Ãñi¨ò·¢ÔÌ—3ªÀƒpÐÙ®orÛ“‰â),\§£M gä¡‚‡@F#9Ÿ3êRgª÷:§E©†•!r²@õ·0!¥r²ðCŸ}Ö¯)vï§`e@”טŠŒ! LЩÜ€Àí/ƒå‰R[‡¡l°[Ò®¿§÷Ñ¥í°x«_$3 ìƒê#ÃÜŒèM6 ˆ8IWß×óÙªé™Ë‰ä7¦Þ‹Ínü·Tž ´¶Œât´e±È*ìþqç9ùþuV¸VÑÕWGS TI'/4t”«¢•OØ=†0°ÇŒgÄ%î ÍŽç5®õkªµ×ÃÇ»MYNðË% 9#`Œ‚Èò:œ±lÝû|µCt³ìMÏt¡œ·jªŽ×<±I†âxº¡08>þ°Z¥¨Â(Ü_'$]Q0 y¿¢‘·ï-ûqž8Þ78¡™»|ê.Ï}ù»0éÔ\ EY=:VÒUÆŒcû˜•»Oý¯5gࢫ¤¸ÛîÑVÓËGWM+E<FRHÝI Œ§È ‚#ß#ZSé§éÒ›ª›N§zoªû•\¡-ÙQ m"ÆÎ’³¡‚¨`@â}/ãIéøÝ403ØëT1©J¡·7Fò®J¡a¬»Ë±Ç+ÓÀï !!L¯ûP7õ3(98;³é‹¤5])Û×1v¹A]x»N¯TÔù1"GÈF2«1Ã1' Bé,Ì]µ¶îϲGeÛj;Mx=ªhÂó`ª¼Üû»ª ±,p2N¦u竱)«צÁ1 ;bÓThÑ£YÈèÑ£F¢Š›Ô^—l¡ö[xmŠ+œÐ`GQ–ŠuQË ÝŒ«ð˱áž99Æ@:¹hÑ«¹Qgn¹}*íΡîæÜö[ßøµmW&¸¤t"¢*™IÏt/4àçÏ" pp‘fWB:]jé&È;j×q¬¸÷êMeUEHUç;G9EQéCÛ),F|±Ñ£V\H²«+þ5ʵÿÙpygame-1.9.1release/examples/data/alien1.gif0000644000175000017500000000736207406772533020657 0ustar vincentvincentGIF89aPG÷€€€€€€€€€ÀÀÀÀÜÀ¦Êð ,&$+(-10,-*1R m r&Q'r'J./N(4q Rlq%~?8A;G.By9AU/FrL_7M.5rq'n6.GGG4LK5kPGTM3dIrK5~kpk&NKPNQmYdqnQOjXhogXqop€ /‡)4‰9.ªDA¡n¡/L4M§6l•9d ?UÂHWIS¬Oh’Rj¤eZ‰lrŠcv¦ €Š(¦/ @Ÿ]­I0R-­N4´a Ä/ÈEãW+ËQ;Ã{+çeP•qJªzL´zt†ui§zGÍs/’Š:‡£ ÖÚOˆ›R‹¥L²ˆu…Œn©n«Šw¦ª€ž3–: ˜44®®3¸3³)=€q/O‹3E¥m§5P°6D”HT0„v“”b3­L­P,­f5VN…^j”fTŽuoªVM³Zg«lU«vjÂÂÊ=Â- Ì,?Ñ8IÓ7Tô0LÌNÃT2Ïk Îo0à~ÉKOÉKWÍ[bÓeOÒpPÅmu†|†£~ƒÊ{‡òn„âr¥“‹.’…0‹¢<¨Š¨–¸œªŒ0¬—-µœ)¸¨¶¨(º¿7Œ›O‘K‡y˜§t°ƒN²—L°‰u²¦Q¬§n©«wÊÏŒ-Ϙ-ÑŸ3Щ3äª/Ï”RÐŽkÒªKÔ¿LÊ«pʲpà“]åžxåµQî±yÞÍ<ÏÇqèÉNîËnåÚe…„ƒ”˜¨•©™™¬ª®–Œ§š¤®§—¦¦¦–†Ô˜ªÌ¶¹Äµ¸æÀ¦¹Ä·ÕȹÈÇ¼ÍæÅ’ŒÈš¦Ì¨—Ä·±íª…üÃà¹ÏÖÇ‹ÉÅ·èÛ…âȳÿáðè¦ÃÅÂÀÜÀÐÙäÛâÙÓãäåÏÙäÕÐãÛáãåØù÷ñÿûðÿûð  ¤€€€ÿÿÿÿÿÿÿÿÿÿÿÿ!ùt,PGþéH° ÁƒУ·.Þ¼N JœH±¢E„ Ö¹Ó¸N£4CŠ™=wòæÍëH¯É—0).0IÜ7yòâµ[7/bÌŸ@È£7”^;œîÜÅ ´éKEqÊKºÑO§X/.¸¶h»¤×]ÍJVâ¬sàâÅ[g§oèÌͲQ¶®AÆz‰CÇ7._sÃz k·î2cÀ| +7¬±/`ºjÝ`ZØ.ƒaÀz!FÌ‹—.^ (W¶ aY/ϺRƒ1ºµÀÙy66Ãue 땘0B DÛnÊBŽpàfÍJ¥|V´pëš­0üç‚A8;†›®Y4X°¢þE›và@ÇyÒè®.sjGsl§¡›F+-X¶¨•gžgú± Ô„Õ‘6ðC_,°pG |æÁ×Ð ,`‚²·À J­£6z 6LÃÝã”gÎ8ãt$Ï=‡8 †´ÀFhÍ3<>3 4ÔPsO4ÍàÓÌ=Í$™dá\ó~óÀÁÈŒ2@3)ùL’°(ÙÌ:äP5ÍÀâ#5áyÏ4A>9ÎpÀ1G†–I0ˆFAR³e3±4“"ã•iCàácN"ˆÒb¢Ò ùÍ:òŒóIë‘…Û Gv4Î=i:ÓL!"Rˆ9×܃7 ÙÌ5… âª7þ‰Ž$ŠæµV ä` …ò…x°,±Î8Ú° j¨„’C<÷´c¤9æä`d3bà „âj¯Í8£ßKH›$>,üÄ€0È(£®2é˜CÂŽC4ˆ"Jˆ 7ää5ÍSO=hƒ$5×ä@ 6B"´$r¤~÷,± 9xÒ 5TZÑ Ê좊ÇÀcÒ†³fÈ"’/ø¬sKþÖ³Ò’d†Cà »ZŸ3R#ñÄKR 4Ä3ª¨‚ )§¨Œ9ϸ@‰´0Ì -9dÈ“&5ÿ®ƒÀÒ<ÜŒ7Óð'¢kÞCM5äî …4“+ˆ4ƒþ0óôQJ+·@Í5P3^4‰Ðò‹'rç µFgä¿øàs,ÎàsÏ"Ü€C!8èL‹7ÑHŽÜ€ 0Iû­J0XÄ@-ÁsJ)ÀÈ 4c8é´_>JÔ0à a]3-å9ÜðÅ=úv2ƒç9 ²vð²Îà¡Ç}œÒG|œ"ŒE œ#K-±¬ÓNX@ƒ·Óˆ7ÞÒÉÆ; ™Óˆûï9ÀA ð‹,à7°ÜÚE m8Ãê*°‹R”bµ Eø˜ãbp€F0‚f°Iò³O:A1àuà4Tòf|Á€ pÀ (Vƒ”¹*þÏ©f@Zt/¥@EÓ€a Hdθ–P†4¤!#B4à»{$ntöID¾n&H &šF3f 6Š@3È †ˆYp]š†9ð \€E)N¡Ž`$Í]YÃÒ°È4˜á‘iGÀÅ©%nÞ¨Ú7°fd F"à l0ƒ ¸€7 c ‘Xà ªÁ.p?Ö€#£à*Fq TÃ*YÜР„G–Á U¬ÁvÀÌ ¸màh˜«äá W B0H `๸ 0XX"¼aˆr‚[d²À,iiü Æ+^1 å þ  ‚€„<òŸU¤-ƒP .„Ø ÂAˆ@€xèþˆ?Pâ „!ÀQ?@t´xÐ3ÖIË „ #xãþÀ÷¬ ~¡Œ0 cÈéX0f¼asˆ$0Á pà£B\"\ƒ¸ $À H¸Á €ØƒA m  ˜ÆzYB0^ÁdÀŸü¤BÐ<5ã.ðÁ€„2”AsýFÁ ÆNœGh2ð ­#ј§ jؘýP6ž‘z:cb¥€hiTÈ~@„ HH ¡Åkþ†O$àŒ_Ìâ;Âh0 ¨ qÀØ0\8Äá¸áÈÁ&Ö d`€4Ó†žŠTƒg@c`˜‚:à3K¸Àh ñ‚4à|Ð"j‰Rä@#0>òÆ€% À-/Z„¢ `4‡°¸q0ÙrÇÊ` ,÷Áf€ž<à(X8 P ֲBÀð‚Jì÷¼˜„ F@10 L %*ñ ±2·Ô`Cæ ˆ8 öqƒËÂÊ„ lñáu°Â+VpC»Pè@6Ð*4 Ά3Âjã ¨3´p/ˆ Á4 Îþ–„$T‚8@òŒàŽDÄáÀq‚Ã|‚G)×ê´€Œ0%´sŸ"pðÖáîJ™TÈ®Pa0hƒ ppYüGQ¬B“Èš‡ ,€ ü,Ä x€d8cƒhðP\68‚‰¸Æš ?8øÁ¡a)?ºRØ®ð'x ÔàrxËZVVPBr°ÀàÚDd4‡0Öåò«Ç… ‰:‚E9`@Y%Q‹ ŒÀ8í «ƒåaàw),…,XÁ Íö€Ö‘•2„ˆøZÀHðI…’àƒ Á6þäÑ ãaÝ'ð„yÆ‹ ,Y5¦ Èê‰@dÉ Úñ(p ÑȾBœ@ô¨á5ÈôrE‹‰"0BxõjêÐ Т˜)8˜_ÔHÄ!µnÓHÆ lük±æ|Ú:Ï6¦Ð…Ta Mè€¤à„ŸCãx°$±ˆE4BäFØïBp+‡?Ðë@y £¥--û:¡NZþÁ¿n{ƒ‘¼€\C p‚ø.ð¼?ƒ`ÁfÂäЈ=X £ÕË<–,`>øA¶®ƒâß!,¦—ÆĪ{ÝÊžH€¯FûåËÙìÚxÆ”9þ°L»ÙX¡m¬@=H¯îO*€[Âð™Y|²î`ÉÀÀ,b H»Á@HVm7hÀ ÚÒÕ$‚ æuh!€dº·d‹wë± 0‘·]÷ôgcÕo„ ”€ (¨ ¢À2P^ð¡l –d `Ðp ò!×à€ &€³^;°{¸…p3|> D°u Â#ÀÄ@ ’p…XH 'x‚(˜‚¸Ð .À_V@I_6€cÅ<@º‡[mHKÁá„:|A@@ÀLÀG=0y€0P of…’P ÇpˆþŰ •ðØ–?è`Ø`l‰@„»·¦ €"m‚¹¥G ^ÇÀ@3¨Ðpg¸¸GÀ`°­HÁ1ƒœ6m¸ýgu±ÃZ»§õÀIP|K&€ÀËå À‰çuÑXK@hIÀ`FàŠ"¦‹>KF€rfZàЦÕaAX‡éVŽýW!ÿ—”Zå&‰¿vK =iZ¦UMY!鑦%ml—–aÀ&lcé”"&bt‚+ —qÙo锎')Œ Ù”qù•aÉQi—áÈ—`é“_i–`˜TIŒU˜†˜™˜“¹—vY#˜“i˜f¹˜ž©™äs™Ñ™"&𲓙shš¨I>¸1’˜­‰¦%™?9›#™‰›¼Ù›¾ù›;pygame-1.9.1release/docs/tut/SpriteIntro.html0000644000175000017500000005063011132454222021157 0ustar vincentvincent Pygame Tutorials - Sprite Module Intoduction

    Pygame Tutorials
    Sprite Module Introduction

    by Pete Shinners
    pete@shinners.org

    Revision 1.1, April 12th, 2002



    Pygame version 1.3 comes with a new module, pygame.sprite. This module is written in python and includes some higher level classes to manage your game objects. By using this module to its full potential, you can easily manage and draw your game objects. The sprite classes are very optimized, so it's likely your game will run faster with the sprite module than without.

    The sprite module is also meant to be very generic. It turns out you can use it with nearly any type of gameplay. All this flexibility comes with a slight penalty, it needs a little understanding to properly use it. The reference documentation for the sprite module can keep you running, but you'll probably need a bit more explanation of how to use pygame.sprite in your own game.

    Several of the pygame examples (like "chimp" and "aliens") have been updated to use the sprite module. You may want to look into those first to see what this sprite module is all about. The chimp module even has it's own line-by-line tutorial, which may help get more an understanding of programming with python and pygame.

    Note that this introduction will assume you have a bit of experience programming with python, and are somewhat framiliar with the different parts of creating a simple game. In this tutorial the word "reference" is occasianally used. This represents a python variable. Variables in python are references, so you can have several variables all pointing to the same object.

    History Lesson

    The term "sprite" is a holdover from older computer and game machines. These older boxes were unable to draw and erase normal graphics fast enough for them to work as games. These machines had special hardware to handle game like objects that needed to animate very quickly. These objects were called 'sprites' and had special limitations, but could be drawn and updated very fast. They usually existed in special overlay buffers in the video. These days computers have become generally fast enough to handle sprite like objects without dedicated hardware. The term sprite is still used to represent just about anything in a 2D game that is animated.


    The Classes

    The sprite module comes with two main classes. The first is Sprite, which should be used as a base class for all your game objects. This class doesn't really do anything on its own, it just includes several functions to help manage the game object. The other type of class is Group. The Group class is a container for different Sprite objects. There are actually several different types of group classes. Some of the Groups can draw all the elements they contain, for example.

    This is all there really is to it. We'll start with a description of what each type of class does, and then discuss the proper ways to use these two classes.

    The Sprite Class

    As mentioned before, the Sprite class is designed to be a base class for all your game objects. You cannot really use it on its own, as it only has several methods to help it work with the different Group classes. The sprite keeps track of which groups it belongs to. The class constructor (__init__ method) takes an argument of a Group (or list of Groups) the Sprite instance should belong to. You can also change the Group membership for the Sprite with the add() and remove() methods. There is also a groups() method, which returns a list of the current groups containing the sprite.

    When using the your Sprite classes it's best to think of them as "valid" or "alive" when they are belonging to one or more Groups. When you remove the instance from all groups pygame will clean up the object. (Unless you have your own references to the instance somewhere else.) The kill() method removes the sprite from all groups it belongs to. This will cleanly delete the sprite object. If you've put some little games together, you'll know sometimes cleanly deleting a game object can be tricky. The sprite also comes with an alive() method, which returns true if it is still a member of any groups.


    The Group Class

    The Group class is just a simple container. Similar to the sprite, it has an add() and remove() method which can change which sprites belong to the group. You also can pass a sprite or list of sprites to the contructor (__init__ method) to create a Group instance that contains some initial sprites.

    The Group has a few other methods like empty() to remove all sprites from the group and copy() which will return a copy of the group with all the same members. Also the has() method will quickly check if the Group contains a sprite or list of sprites.

    The other function you will use frequently is the sprites() method. This returns an object that can be looped on to access every sprite the group contains. Currently this is just a list of the sprites, but in later version of python this will likely use iterators for better performance.

    As a shortcut, the Group also has an update() method, which will call an update() method on every sprite in the group. Passing the same arguments to each one. Usually in a game you need some function that updates the state of a game object. It's very easy to call your own methods using the Group.sprites() method, but this is a shortcut that's used enough to be included. Also note that the base Sprite class has a "dummy" update() method that takes any sort of arguments and does nothing.

    Lastly, the Group has a couple other methods that allow you to use it with the builtlin len() method, getting the number of sprites it contains. and the "truth" operator, which allows you to do "if mygroup:" to check if the group has any sprites.

    Mixing Them Together

    At this point the two classes seem pretty basic. Not doing a lot more than you can do with a simple list and your own class of game objects. But there are some big advantages to using the Sprite and Group together. A sprite can belong to as many groups as you want. Remember as soon as it belongs to no groups, it will usually be cleared up (unless you have other "non-group" references to that object)

    The first big thing is a fast simple way to categorize sprites. For example, say we had a pacman-like game. We could make separate groups for the different types of objects in the game. Ghosts, Pac, and Pellets. When pac eats a power pellet, we can change the state for all ghost objects by effecting everything in the Ghost group. This is quicker and simpler than looping through a list of all the game objects and checking which ones are ghosts.

    Adding and removing groups and sprites from each other is a very fast operation, quicker than using lists to store everything. Therefore you can very efficiently change group memberships. Groups can be used to work like simple attributes for each game object. Instead of tracking some attribute like "close_to_player" for a bunch of enemy objects, you could add them to a separate group. Then when you need to access all the enemies that are near the player, you already have a list of them, instead of going through a list of all the enemies, checking for the "close_to_player" flag. Later on your game could add multiple players, and instead of adding more "close_to_player2", "close_to_player3" attributes, you can easily add them to different groups for each player.

    Another important benefit of using the Sprites and Groups, the groups cleanly handle the deleting (or killing) of game objects. In a game where many objects are referencing other objects, sometimes deleting an object can be the hardest part, since it can't go away until it is not referenced by anyone. Say we have an object that is "chasing" another object. The chaser can keep a simple Group that references the object (or objects) it is chasing. If the object being chased happens to be destroyed, we don't need to worry about notifying the chaser to stop chasing. The chaser can see for itself that its group is now empty, and perhaps find a new target.

    Again, the thing to remember is that adding and removing sprites from groups is a very cheap/fast operation. You may be best off by adding many groups to contain and organize your game objects. Some could even be empty for large portions of the game, there isn't any penalties for managing your game like this.

    The Many Group Types

    The above examples and reasons to use Sprites and Groups are only a tip of the iceberg. Another advantage is that the sprite module comes with several different types of Groups. These groups all work just like a regular old Group, but they also have added functionality (or slightly different functionality). Here's a list of the Group classes included with the sprite module.
    Group
    This is the standard "no frills" group mainly explained above. Most of the other Groups are derived from this one, but not all.

    GroupSingle
    This works exactly like the regular Group class, but it only contains the most recently added sprite. Therefore when you add a sprite to this group, it "forgets" about any previous sprites it had. Therefore it always contains only one or zero sprites.

    RenderPlain
    This is a standard group derived from Group. It has a draw() method that draws all the sprites it contains to the screen (or any Surface). For this to work, it requires all sprites it contains to have a "image" and "rect" attributes. It uses these to know what to blit, and where to blit it.

    RenderClear
    This is derived from the RenderPlain group, and adds a method named clear(). This will erase the previous position of all drawn sprites. It uses a background image to fill in the areas where the sprite were. It is smart enough to handle deleted sprites and properly clear them from the screen when the clear() method is called.

    RenderUpdates
    This is the cadillac of rendering Groups. It is inherited from RenderClear, but changes the draw() method to also return a list of pygame Rects, which represent all the areas onscreen that have been changed.

    That is the list of different groups available We'll discuss more about these rendering groups in the next section. There's nothing stopping you from creating your own Group classes as well. They are just python code, so you can inherit from one of these and add/change whatever you want. In the future I hope we can add a couple more Groups to this list. A GroupMulti which is like the GroupSingle, but can hold up to a given number of sprites (in some sort of circular buffer?). Also a super-render group that can clear the position of the old sprites without needing a background image to do it (by grabbing a copy of the screen before blitting). Who knows really, but in the future we can add more useful classes to this list.

    The Rendering Groups

    From above we can see there are three different rendering groups. We could probably just get away with the RenderUpdates one, but it adds overhead not really needed for something like a scrolling game. So we have a couple tools here, pick the right one for the right job.

    For a scrolling type game, where the background completely changes every frame. We obviously don't need to worry about python's update rectangles in the call to display.update(). You should definitely go with the RenderPlain group here to manage your rendering.

    For games where the background is more stationary, you definitely don't want pygame updating the entire screen (since it doesn't need to). This type of game usually involves erasing the old position of each object, then drawing it in a new place for each frame. This way we are only changing what is necessary. Most of the time you will just want to use the RenderUpdates class here. Since you will also want to pass this list of changes to the display.update() function.

    The RenderUpdates class also does a good job an minimizing overlapping areas in the list of updated rectangles. If the previous position and current position of an object overlap, it will merge them into a single rectangle. Combine this with the fact that is properly handles deleted objects and this is one powerful Group class. If you've written a game that manages the changed rectangles for the objects in a game, you know this the cause for a lot of messy code in your game. Especially once you start to throw in objects that can be deleted at anytime. All this work is reduced down to a clear() and draw() method with this monster class. Plus with the overlap checking, it is likely faster than if you did it yourself.

    Also note that there's nothing stopping you from mixing and matching these render groups in your game. You should definitely use multiple rendering groups when you want to do layering with your sprites. Also if the screen is split into multiple sections, perhaps each section of the screen should use an appropriate render group?

    Collision Detection

    The sprite module also comes with two very generic collision detection functions. For more complex games, these really won't work for you, but you can easily grab the sourcecode for them, and modify them as needed.
    Here's a summary of what they are, and what they do.
    spritecollide(sprite, group, dokill) -> list
    This checks for collisions between a single sprite and the sprites in a group. It requires a "rect" attribute for all the sprites used. It returns a list of all the sprites that overlap with the first sprite. The "dokill" argument is a boolean argument. If it is true, the function will call the kill() method on all the sprites. This means the last reference to each sprite is probably in the returned list. Once the list goes away so do the sprites. A quick example of using this in a loop,
    	>>> for bomb in sprite.spritecollide(player, bombs, 1):
    ... boom_sound.play()
    ... Explosion(bomb, 0)
    This finds all the sprites in the "bomb" group that collide with the player. Because of the "dokill" argument it deletes all the crashed bombs. For each bomb that did collide, it plays a "boom" sound effect, and creates a new Explosion where the bomb was. (Note, the Explosion class here knows to add each instance to the appropriate class, so we don't need to store it in a variable, that last line might feel a little "funny" to you python programmers.

    groupcollide(group1, group2, dokill1, dokill2) -> dictionary
    This is similar to the spritecollide function, but a little more complex. It checks for collisions for all the sprites in one group, to the sprites in another. There is a dokill argument for the sprites in each list. When dokill1 is true, the colliding sprites in group1 will be kill()ed. When dokill2 is true, we get the same results for group2. The dictionary it returns works like this; each key in the dictionary is a sprite from group1 that had a collision. The value for that key is a list of the sprites that it collided with. Perhaps another quick code sample explains it best
    	>>> for alien in sprite.groupcollide(aliens, shots, 1, 1).keys()
        ...     boom_sound.play()
        ...     Explosion(alien, 0)
        ...     kills += 1
    
    This code checks for the collisions between player bullets and all the aliens they might intersect. In this case we only loop over the dictionary keys, but we could loop over the values() or items() if we wanted to do something to the specific shots that collided with aliens. If we did loop over the values() we would be looping through lists that contain sprites. The same sprite may even appear more than once in these different loops, since the same "shot" could have collided against multiple "aliens".


    Those are the basic collision functions that come with pygame. It should be easy to roll your own that perhaps use something differen than the "rect" attribute. Or maybe try to fine-tweak your code a little more by directly effecting the collision object, instead of building a list of the collision? The code in the sprite collision functions is very optimized, but you could speed it up slightly by taking out some functionality you don't need.

    Common Problems

    Currently there is one main problem that catches new users. When you derive your new sprite class with the Sprite base, you must call the Sprite.__init__() method from your own class __init__() method. If you forget to call the Sprite.__init__() method, you get a cryptic error, like this; AttributeError: 'mysprite' instance has no attribute '_Sprite__g'.


    Extending Your Own Classes (Advanced)

    Because of speed concerns, the current Group classes try to only do exactly what they need, and not handle a lot of general situations. If you decide you need extra features, you may want to create your own Group class.

    The Sprite and Group classes were designed to be extended, so feel free to create your own Group classes to do specialized things. The best place to start is probably the actual python source code for the sprite module. Looking at the current Sprite groups should be enough example on how to create your own.

    For example, here is the source code for a rendering Group that calls a render() method for each sprite, instead of just blitting an "image" variable from it. Since we want it to also handle updated areas, we will start with a copy of the original RenderUpdates group, here is the code:

    class RenderUpdatesDraw(RenderClear):
        """call sprite.draw(screen) to render sprites"""
        def draw(self, surface):
            dirty = self.lostsprites
            self.lostsprites = []
            for s, r in self.spritedict.items():
                newrect = s.draw(screen) #Here's the big change
                if r is 0:
                    dirty.append(newrect)
                else:
                    dirty.append(newrect.union(r))
                self.spritedict[s] = newrect
            return dirty
    

    Following is more information on how you could create your own Sprite and Group objects from scratch.

    The Sprite objects only "require" two methods. "add_internal()" and "remove_internal()". These are called by the Group classes when they are removing a sprite from themselves. The add_internal() and remove_internal() have a single argument which is a group. Your Sprite will need some way to also keep track of the Groups it belongs to. You will likely want to try to match the other methods and arguments to the real Sprite class, but if you're not going to use those methods, you sure don't need them.

    It is almost the same requirements for creating your own Group. In fact, if you look at the source you'll see the GroupSingle isn't derived from the Group class, it just implements the same methods so you can't really tell the difference. Again you need an "add_internal()" and "remove_internal()" method that the sprites call when they want to belong or remove themselves from the group. The add_internal() and remove_internal() have a single argument which is a sprite. The only other requirement for the Group classes is they have a dummy attribute named "_spritegroup". It doesn't matter what the value is, as long as the attribute is present. The Sprite classes can look for this attribute to determine the difference between a "group" and any ordinary python container. (This is important, because several sprite methods can take an argument of a single group, or a sequence of groups. Since they both look similar, this is the most flexible way to "see" the difference.)

    You should through the code for the sprite module. While the code is a bit "tuned", it's got enough comments to help you follow along. There's even a todo section in the source if you feel like contributing.

    pygame-1.9.1release/docs/tut/newbieguide.html0000644000175000017500000005176507670466467021230 0ustar vincentvincent A Newbie Guide to pygame

    A Newbie Guide to pygame

    or

    Things I learned by trial and error so you don't have to.

    or

    How I learned to stop worrying and love the blit.

    Pygame is a python wrapper for SDL, written by Pete Shinners. What this means is that, using pygame, you can write games or other multimedia applications in Python that will run unaltered on any of SDL's supported platforms (Windows, Unix, Mac, beOS and others).

    Pygame may be easy to learn, but the world of graphics programming can be pretty confusing to the newcomer. I wrote this to try to distill the practical knowledge I've gained over the past year or so of working with pygame, and it's predecessor, pySDL. I've tried to rank these suggestions in order of importance, but how relevent any particular hint is will depend on your own background and the details of your project.

    1. Get comfortable working in Python.

    The most important thing is to feel confident using python. Learning something as potentially complicated as graphics programming will be a real chore if you're also unfamiliar with the language you're using. Write a few sizable non-graphical programs in python - parse some text files, write a guessing game or a journal-entry program or something. Get comfortable with string and list manipulation - know how to split, slice and combine strings and lists. Know how import works - try writing a program that is spread across several source files. Write your own functions, and practice manipulating numbers and characters; know how to convert between the two. Get to the point where the syntax for using lists and dictionaries is second-nature - you don't want to have to run to the documentation every time you need to slice a list or sort a set of keys. Resist the temptation to run to a mailing list, comp.lang.python, or irc when you run into trouble. Instead, fire up the interpreter and play with the problem for a few hours. Print out the Python 2.0 Quick Reference and keep it by your computer.

    This may sound incredibly dull, but the confidence you'll gain through your familiarity with python will work wonders when it comes time to write your game. The time you spend making python code second-nature will be nothing compared to the time you'll save when you're writing real code.

    2. Recognize which parts of pygame you really need.

    Looking at the jumble of classes at the top of the pygame Documentation index may be confusing. The important thing is to realize that you can do a great deal with only a tiny subset of functions. Many classes you'll probably never use - in a year, I haven't touched the Channel, Joystick, cursors, Userrect, surfarray or version functions.

    3. Know what a surface is

    The most important part of pygame is the surface. Just think of a surface as a blank piece of paper. You can do a lot of things with a surface - you can draw lines on it, fill parts of it with color, copy images to and from it, and set or read individual pixel colors on it. A surface can be any size (within reason) and you can have as many of them as you like (again, within reason). One surface is special - the one you create with pygame.display.set_mode(). This 'display surface' represents the screen; whatever you do to it will appear on the user's screen. You can only have one of these - that's an SDL limitation, not a pygame one.

    So how do you create surfaces? As mentioned above, you create the special 'display surface' with pygame.display.set_mode(). You can create a surface that contains an image by using image.load(), or you can make a surface that contains text with font.render(). You can even create a surface that contains nothing at all with Surface().

    Most of the surface functions are not critical. Just learn blit(), fill(), set_at() and get_at(), and you'll be fine.

    4. Use surface.convert()

    When I first read the documentation for surface.convert(), I didn't think it was something I had to worry about. "I only use pngs, therefore everything I do will be in the same format. So I don't need convert()". It turns out I was very, very wrong.

    The 'format' that convert() refers to isn't the file format (ie png, jpeg, gif), it's what's called the 'pixel format'. This refers to the particular way that a surface records individual colors in a specific pixel. If the surface format isn't the same as the display format, SDL will have to convert it on-the-fly for every blit - a fairly time-consuming process. Don't worry too much about the explanation; just note that convert() is necessary if you want to get any kind of speed out of your blits.

    How do you use convert? Just call it after creating a surface with the image.load() function. Instead of just doing:

    surface = pygame.image.load('foo.png')

    Do:

    surface = pygame.image.load('foo.png').convert()

    It's that easy. You just need to call it once per surface, when you load an image off the disk. You'll be pleased with the results; I see about a 6x increase in blitting speed by calling convert().

    The only times you don't want to use convert() is when you really need to have absolute control over an image's internal format - say you were writing an image conversion program or something, and you needed to ensure that the output file had the same pixel format as the input file. If you're writing a game, you need speed. Use convert().

    5. Dirty rect animation

    The most common cause of inadequate frame rates in pygame programs results from misunderstanding the pygame.display.update() function. With pygame, merely drawing something to the display surface doesn't cause it to appear on the screen - you need to call pygame.display.update(). There are three ways of calling this function:

    1. pygame.display.update() - This updates the whole window (or the whole screen for fullscreen displays).
    2. pygame.display.flip() - This does the same thing, and will also do the right thing if you're using doublebuffered hardware acceleration, which you're not, so on to...
    3. pygame.display.update(a rectangle or some list of rectangles) - This updates just the rectangular areas of the screen you specify.

    Most people new to graphics programming use the first option - they update the whole screen every frame. The problem is that this is unacceptably slow for most people. Calling update() takes 35 milliseconds on my machine, which doesn't sound like much, until you realize that 1000 / 35 = 28 frames per second maximum. And that's with no game logic, no blits, no input, no AI, nothing. I'm just sitting there updating the screen, and 28 fps is my maximum framerate. Ugh.

    The solution is called 'dirty rect animation'. Instead of updating the whole screen every frame, only the parts that changed since the last frame are updated. I do this by keeping track of those rectangles in a list, then calling update(the_dirty_rectangles) at the end of the frame. In detail for a moving sprite, I:

    1. Blit a piece of the background over the sprite's current location, erasing it.
    2. Append the sprite's current location rectangle to a list called dirty_rects.
    3. Move the sprite.
    4. Draw the sprite at it's new location.
    5. Append the sprite's new location to my dirty_rects list.
    6. Call display.update(dirty_rects)

    The difference in speed is astonishing. Consider that Solarwolf has dozens of constantly moving sprites updating smoothly, and still has enough time left over to display a parallax starfield in the background, and update that too.

    There are two cases where this technique just won't work. The first is where the whole window or screen really is being updated every frame - think of a smooth-scrolling engine like an overhead real-time strategy game or a side-scroller. So what do you do in this case? Well, the short answer is - don't write this kind of game in pygame. The long answer is to scroll in steps of several pixels at a time; don't try to make scrolling perfectly smooth. Your player will appreciate a game that scrolls quickly, and won't notice the background jumping along too much.

    A final note - not every game requires high framerates. A strategic wargame could easily get by on just a few updates per second - in this case, the added complexity of dirty rect animation may not be necessary.

    6. There is NO rule six.

    7. Hardware surfaces are more trouble than they're worth.

    If you've been looking at the various flags you can use with pygame.display.set_mode(), you may have thought like this: "Hey, HWSURFACE! Well, I want that - who doesn't like hardware acceleration. Ooo... DOUBLEBUF; well, that sounds fast, I guess I want that too!". It's not your fault; we've been trained by years of 3-d gaming to believe that hardware acceleration is good, and software rendering is slow.

    Unfortunately, hardware rendering comes with a long list of drawbacks:

    • It only works on some platforms. Windows machines can usually get hardware surfaces if you ask for them. Most other platforms can't. Linux, for example, may be able to provide a hardware surface if X4 is installed, if DGA2 is working properly, and if the moons are aligned correctly. If a hardware surface is unavailable, sdl will silently give you a software surface instead.
    • It only works fullscreen.
    • It complicates per-pixel access. If you have a hardware surface, you need to Lock the surface before writing or reading individual pixel values on it. If you don't, Bad Things Happen. Then you need to quickly Unlock the surface again, before the OS gets all confused and starts to panic. Most of this process is automated for you in pygame, but it's something else to take into account.
    • You lose the mouse pointer. If you specify HWSURFACE (and actually get it), your pointer will usually just vanish (or worse, hang around in a half-there, half-not flickery state). You'll need to create a sprite to act as a manual mouse pointer, and you'll need to worry about pointer acceleration and sensitivity. What a pain.
    • It might be slower anyway. Many drivers are not accelerated for the types of drawing that we do, and since everything has to be blitted across the video bus (unless you can cram your source surface into video memory as well), it might end up being slower than software access anyway.

    Hardware rendering has it's place. It works pretty reliably under Windows, so if you're not interested in cross-platform performance, it may provide you with a substantial speed increase. However, it comes at a cost - increased headaches and complexity. It's best to stick with good old reliable SWSURFACEs until you're sure you know what you're doing.

    8. Don't get distracted by side issues.

    Sometimes, new game programmers spend too much time worrying about issues that aren't really critical to their game's success. The desire to get secondary issues 'right' is understandable, but early in the process of creating a game, you cannot even know what the important questions are, let alone what answers you should choose. The result can be a lot of needless prevarication.

    For example, consider the question of how to organize your graphics files. Should each frame have its own graphics file, or each sprite? Perhaps all the graphics should be zipped up into one archive? A great deal of time has been wasted on a lot of projects, asking these questions on mailing lists, debating the answers, profiling, etc, etc. This is a secondary issue; any time spent discussing it should have been spent coding the actual game.

    The insight here is that it is far better to have a 'pretty good' solution that was actually implemented, than a perfect solution that you never got around to writing.

    9. Rects are your friends.

    Pete Shinners' wrapper may have cool alpha effects and fast blitting speeds, but I have to admit my favorite part of pygame is the lowly Rect class. A rect is simply a rectangle - defined only by the position of its top left corner, its width, and its height. Many pygame functions take rects as arguments, and they also take 'rectstyles', a sequence that has the same values as a rect. So if I need a rectangle that defines the area between 10, 20 and 40, 50, I can do any of the following:

    rect = pygame.Rect(10, 20, 30, 30)
    rect = pygame.Rect((10, 20, 30, 30))
    rect = pygame.Rect((10, 20), (30, 30))
    rect = (10, 20, 30, 30)
    rect = ((10, 20, 30, 30))
    

    If you use any of the first three versions, however, you get access to Rect's utility functions. These include functions to move, shrink and inflate rects, find the union of two rects, and a variety of collision-detection functions.

    For example, suppose I'd like to get a list of all the sprites that contain a point (x, y) - maybe the player clicked there, or maybe that's the current location of a bullet. It's simple if each sprite has a .rect member - I just do:

    sprites_clicked = [sprite for sprite in all_my_sprites_list if sprite.rect.collidepoint(x, y)]
    

    Rects have no other relation to surfaces or graphics functions, other than the fact that you can use them as arguments. You can also use them in places that have nothing to do with graphics, but still need to be defined as rectangles. Every project I discover a few new places to use rects where I never thought I'd need them.

    10. Don't bother with pixel-perfect collision detection.

    So you've got your sprites moving around, and you need to know whether or not they're bumping into one another. It's tempting to write something like the following:

    1. Check to see if the rects are in collision. If they aren't, ignore them.
    2. For each pixel in the overlapping area, see if the corresponding pixels from both sprites are opaque. If so, there's a collision.

    There are other ways to do this, with ANDing sprite masks and so on, but any way you do it in pygame, it's probably going to be too slow. For most games, it's probably better just to do 'sub-rect collision' - create a rect for each sprite that's a little smaller than the actual image, and use that for collisions instead. It will be much faster, and in most cases the player won't notice the inprecision.

    11. Managing the event subsystem

    Pygame's event system is kind of tricky. There are actually two different ways to find out what an input device (keyboard, mouse or joystick) is doing.

    The first is by directly checking the state of the device. You do this by calling, say, pygame.mouse.get_pos() or pygame.key.get_pressed(). This will tell you the state of that device at the moment you call the function.

    The second method uses the SDL event queue. This queue is a list of events - events are added to the list as they're detected, and they're deleted from the queue as they're read off.

    There are advantages and disadvantages to each system. State-checking (system 1) gives you precision - you know exactly when a given input was made - if mouse.get_pressed([0]) is 1, that means that the left mouse button is down right at this moment. The event queue merely reports that the mouse was down at some time in the past; if you check the queue fairly often, that can be ok, but if you're delayed from checking it by other code, input latency can grow. Another advantage of the state-checking system is that it detects "chording" easily; that is, several states at the same time. If you want to know whether the t and f keys are down at the same time, just check:

    if (key.get_pressed[K_t] and key.get_pressed[K_f]):
         print "Yup!"
    

    In the queue system, however, each keypress arrives in the queue as a completely separate event, so you'd need to remember that the t key was down, and hadn't come up yet, while checking for the f key. A little more complicated.

    The state system has one great weakness, however. It only reports what the state of the device is at the moment it's called; if the user hits a mouse button then releases it just before a call to mouse.get_pressed(), the mouse button will return 0 - get_pressed() missed the mouse button press completely. The two events, MOUSEBUTTONDOWN and MOUSEBUTTONUP, will still be sitting in the event queue, however, waiting to be retrieved and processed.

    The lesson is: choose the system that meets your requirements. If you don't have much going on in your loop - say you're just sitting in a 'while 1' loop, waiting for input, use get_pressed() or another state function; the latency will be lower. On the other hand, if every keypress is crucial, but latency isn't as important - say your user is typing something in an editbox, use the event queue. Some keypresses may be slightly late, but at least you'll get them all.

    A note about event.poll() vs. wait() - poll() may seem better, since it doesn't block your program from doing anything while it's waiting for input - wait() suspends the program until an event is received. However, poll() will consume 100% of available cpu time while it runs, and it will fill the event queue with NOEVENTS. Use set_blocked() to select just those event types you're interested in - your queue will be much more manageable.

    12. Colorkey vs. Alpha

    There's a lot of confusion around these two techniques, and much of it comes from the terminology used.

    'Colorkey blitting' involves telling pygame that all pixels of a certain color in a certain image are transparent instead of whatever color they happen to be. These transparent pixels are not blitted when the rest of the image is blitted, and so don't obscure the background. This is how we make sprites that aren't rectangular in shape. Simply call surface.set_colorkey(color), where color is a rgb tuple - say (0,0,0). This would make every pixel in the source image transparent instead of black.

    'Alpha' is different, and it comes in two flavors. 'Image alpha' applies to the whole image, and is probably what you want. Properly known as 'translucency', alpha causes each pixel in the source image to be only partially opaque. For example, if you set a surface's alpha to 192 and then blitted it onto a background, 3/4 of each pixel's color would come from the source image, and 1/4 from the background. Alpha is measured from 255 to 0, where 0 is completely transparent, and 255 is completely opaque. Note that colorkey and alpha blitting can be combined - this produces an image that is fully transparent in some spots, and semi-transparent in others.

    'Per-pixel alpha' is the other flavor of alpha, and it's more complicated. Basically, each pixel in the source image has its own alpha value, from 0 to 255. Each pixel, therefore, can have a different opacity when blitted onto a background. This type of alpha can't be mixed with colorkey blitting, and it overrides per-image alpha. Per-pixel alpha is rarely used in games, and to use it you have to save your source image in a graphic editor with a special alpha channel. It's complicated - don't use it yet.

    13. Do things the pythony way.

    A final note (this isn't the least important one; it just comes at the end). Pygame is a pretty lightweight wrapper around SDL, which is in turn a pretty lightweight wrapper around your native OS graphics calls. Chances are pretty good that if your code is still slow, and you've done the things I've mentioned above, then the problem lies in the way you're addressing your data in python. Certain idioms are just going to be slow in python no matter what you do. Luckily, python is a very clear language - if a piece of code looks awkward or unweildy, chances are its speed can be improved, too. Read over Python Performance Tips for some great advice on how you can improve the speed of your code. That said, premature optimisation is the root of all evil; if it's just not fast enough, don't torture the code trying to make it faster. Some things are just not meant to be :)

    There you go. Now you know practically everything I know about using pygame. Now, go write that game!


    David Clark is an avid pygame user and the editor of the Pygame Code Repository, a showcase for community-submitted python game code. He is also the author of Twitch, an entirely average pygame arcade game.

    pygame-1.9.1release/docs/tut/MoveIt.html0000644000175000017500000005240407530455334020115 0ustar vincentvincent Pygame Tutorials - Help! How Do I Move An Image?

    Pygame Tutorials
    Help! How Do I Move An Image?

    by Pete Shinners
    pete@shinners.org

    Revision 1.2, August 20, 2002



    Many people new to programming and graphics have a hard time figuring out how to make an image move around the screen. Without understanding all the concepts, it can be very confusing. You're not the first person to be stuck here, I'll do my best to take things step by step. We'll even try to end with methods of keeping your animations efficient.

    Note that we won't be teaching you to program with python in this article, just introduce you to some of the basics with pygame.

    Just Pixels On The Screen

    Pygame has a display Surface. This is basically an image that is visible on the screen, and the image is made up of pixels. The main way you change these pixels is by calling the blit() function. This copies the pixels from one image onto another.

    This is the first thing to understand. When you blit an image onto the screen, you are simply changing the color of the pixels on the screen. Pixels aren't added or moved, we just change the colors of the pixels aready on the screen. These images you blit to the screen are also Surfaces in pygame, but they are in no way connected to the display Surface. When they are blitted to the screen they are copied into the display, but you still have a unique copy of the original.

    With this brief description. Perhaps you can already understand what is needed to "move" an image. We don't actually move anything at all. We simply blit the image in a new position. But before we draw the image in the new position, we'll need to "erase" the old one. Otherwise the image will be visible in two places on the screen. By rapidly erasing the image and redrawing it in a new place, we achieve the "illusion" of movement.

    Through the rest of this tutorial we will break this process down into simpler steps. Even explaining the best ways to have multiple images moving around the screen. You probably already have questions. Like, how do we "erase" the image before drawing it in a new position? Perhaps you're still totally lost? Well hopefully the rest of this tutorial can straighten things out for you.

    Let's Go Back A Step

    Perhaps the concept of pixels and images is still a little foreign to you? Well good news, for the next few sections we are going to use code that does everything we want, it just doesn't use pixels. We're going to create a small python list of 6 numbers, and imagine it represents some fantastic graphics we could see on the screen. It might actually be surprising how closely this represents exactly what we'll later be doing with real graphics.

    So let's begin by creating our screen list and fill it with a beautiful landscape of 1s and 2s.
    >>> screen = [1, 1, 2, 2, 2, 1]
    >>> print screen
    [1, 1, 2, 2, 2, 1]
    
    Now we've created our background. It's not going to be very exciting unless we also draw a player on the screen. We'll create a mighty hero that looks like the number 8. Let's stick him near the middle of the map and see what it looks like.
    >>> screen[3] = 8
    >>> print screen
    [1, 1, 2, 8, 2, 1]
    
    This might have been as far as you've gotten if you jumped right in doing some graphics programming with pygame. You've got some nice looking stuff on the screen, but it cannot move anywhere. Perhaps now that our screen is just a list of numbers, it's easier to see how to move him?

    Making The Hero Move

    Before we can start moving the character. We need to keep track of some sort of position for him. In the last section when we drew him, we just picked an arbitrary position. Let's do it a little more officially this time.
    >>> playerpos = 3
    >>> screen[playerpos] = 8
    >>> print screen
    [1, 1, 2, 8, 2, 1]
    
    Now it is pretty easy to move him to a new position. We simple change the value of playerpos, and draw him on the screen again.
    >>> playerpos = playerpos - 1
    >>> screen[playerpos] = 8
    >>> print screen
    [1, 1, 8, 8, 2, 1]
    
    Whoops. Now we can see two heros. One in the old position, and one in his new position. This is exactly the reason we need to "erase" the hero in his old position before we draw him in the new position. To erase him, we need to change that value in the list back to what it was before the hero was there. That means we need to keep track of the values on the screen before the hero replaced them. There's several way you could do this, but the easiest is usually to keep a separate copy of the screen background. This means we need to make some changes to our little game.

    Creating A Map

    What we want to do is create a separate list we will call our background. We will create the background so it looks like our original screen did, with 1s and 2s. Then we will copy each item from the background to the screen. After that we can finally draw our hero back onto the screen.
    >>> background = [1, 1, 2, 2, 2, 1]
    >>> screen = [0]*6                     #a new blank screen
    >>> for i in range(6):
    ...    screen[i] = background[i]
    >>> print screen
    [1, 1, 2, 2, 2, 1]
    >>> playerpos = 3
    >>> screen[playerpos] = 8
    >>> print screen
    [1, 1, 2, 8, 2, 1]
    
    It may seem like a lot of extra work. We're no farther off than we were before the last time we tried to make him move. But this time we have the extra information we need to move him properly.

    Making The Hero Move (Take 2)

    This time it will be easy to move the hero around. First we will erase the hero from his old position. We do this by copying the correct value from the background onto the screen. Then we will draw the character in his new position on the screen
    >>> print screen
    [1, 1, 2, 8, 2, 1]
    >>> screen[playerpos] = background[playerpos]
    >>> playerpos = playerpos - 1
    >>> screen[playerpos] = 8
    >>> print screen
    [1, 1, 8, 2, 2, 1]
    
    There it is. The hero has moved one space to the left. We can use this same code to move him to the left again.
    >>> screen[playerpos] = background[playerpos]
    >>> playerpos = playerpos - 1
    >>> screen[playerpos] = 8
    >>> print screen
    [1, 8, 2, 2, 2, 1]
    
    Excellent! This isn't exactly what you'd call smooth animation. But with a couple small changes, we'll make this work directly with graphics on the screen.

    Definition: "blit"

    In the next sections we will transform our program from using lists to using real graphics on the screen. When displaying the graphics we will use the term blit frequently. If you are new to doing graphics work, you are probably unframiliar with this common term.

    BLIT: Basically, blit means to copy graphics from one image to another. A more formal definition is to copy an array of data to a bitmapped array destination. You can think of blit as just "assigning" pixels. Much like setting values in our screen-list above, blitting assigns the color of pixels in our image.

    Other graphics libraries will use the word bitblt, or just blt, but they are talking about the same thing. It is basically copying memory from one place to another. Actually, it is a bit more advanced than straight copying of memory, since it needs to handle things like pixel formats, clipping, and scanline pitches. Advanced blitters can also handle things like transparancy and other special effects.

    Going From The List To The Screen

    To take the code we see in the above to examples and make them work with pygame is very straightforward. We'll pretend we have loaded some pretty graphics and named them "terrain1", "terrain2", and "hero". Where before we assigned numbers to a list, we now blit graphics to the screen. Another big change, instead of using positions as a single index (0 through 5), we now need a two dimensional coordinate. We'll pretend each of the graphics in our game is 10 pixels wide.
    >>> background = [terrain1, terrain1, terrain2, terrain2, terrain2, terrain1]
    >>> screen = create_graphics_screen()
    >>> for i in range(6):
    ...    screen.blit(background[i], (i*10, 0))
    >>> playerpos = 3
    >>> screen.blit(playerimage, (playerpos*10, 0))
    
    Hmm, that code should seem very familiar, and hopefully more importantly; the code above should make a little sense. Hopefully my illustration of setting simple values in a list shows the similarity of setting pixels on the screen (with blit). The only part that's really extra work is converting the player position into coordinates on the screen. For now we just use a crude "(playerpos*10, 0)", but we can certainly do better than that. Now let's move the player image over a space. This code should have no surprises.
    >>> screen.blit(background[playerpos], (playerpos*10, 0))
    >>> playerpos = playerpos - 1
    >>> screen.blit(playerimage, (playerpos*10, 0))
    
    There you have it. With this code we've shown how to display a simple background with a hero's image on it. Then we've properly moved that hero one space to the left. So where do we go from here? Well for one the code is still a little awkward. First thing we'll want to do is find a cleaner way to represent the background and player position. Then perhaps a bit of smoother, real animation.

    Screen Coordinates

    To position an object on the screen, we need to tell the blit() function where to put the image. In pygame we always pass positions as an (X,Y) coordinate. This represents the number of pixels to the right, and the number of pixels down to place the image. The top-left corner of a Surface is coordinate (0, 0). Moving to the right a little would be (10, 0), and then moving down just as much would be (10, 10). When blitting, the position argument represents where the topleft corner of the source should be placed on the destination.

    Pygame comes with a convenient container for these coordinates, it is a Rect. The Rect basically represents a rectangular area in these coordinates. It has topleft corner and a size. The Rect comes with a lot of convenient methods which help you move and position them. In our next examples we will represent the positions of our objects with the Rects.

    Also know that many functions in pygame expect Rect arguments. All of these functions can also accept a simple tuple of 4 elements (left, top, width, height). You aren't always required to use these Rect objects, but you will mainly want to. Also, the blit() function can accept a Rect as it's position argument, it simply uses the topleft corner of the Rect as the real position.


    Changing The Background

    In all our previous sections, we've been storing the background as a list of different types of ground. That is a good way to create a tile-based game, but we want smooth scrolling. To make that a little easier, we're going to change the background into a single image that covers the whole screen. This way, when we want to "erase" our objects (before redrawing them) we only need to blit the section of the erased background onto the screen.

    By passing an optional third Rect argument to blit, we tell blit to only use that subsection of the source image. You'll see that in use below as we erase the player image.

    Also note, now when we finish drawing to the screen, we call pygame.display.update() which will show everything we've drawn onto the screen.

    Smooth Movement

    To make something appear to move smoothly, we only want to move it a couple pixels at a time. Here is the code to make an object move smoothly across the screen. Based on what we already now know, this should look pretty simple.

    >>> screen = create_screen()
    >>> player = load_player_image()
    >>> background = load_background_image()
    >>> screen.blit(background, (0, 0))       #draw the background
    >>> position = player.get_rect()
    >>> screen.blit(player, position)         #draw the player
    >>> pygame.display.update()               #and show it all
    >>> for x in range(100):                  #animate 100 frames
    ...    screen.blit(background, position, position) #erase
    ...    position = position.move(2, 0)     #move player
    ...    screen.blit(player, position)      #draw new player
    ...    pygame.display.update()            #and show it all
    ...    pygame.time.delay(100)             #stop the program for 1/10 second
    
    There you have it. This is all the code that is needed to smoothly animate an object across the screen. We can even use a pretty background character. Another benefit of doing the background this way, the image for the player can have transparancy or cutout sections and it will still draw correctly over the background (a free bonus).

    We also throw in a call to pygame.time.delay() at the end of our loop above. This slows down our program a little, otherwise it might run so fast you might not see it.

    So, What Next?

    Well there we have it. Hopefully this article has done everything it promised to do. But, at this point the code really isn't ready for the next bestselling game. How do we easily have multiple moving objects? What exactly are those mysterious functions like load_player_image()? We also need a way to get simple user input, and loop for more than 100 frames. We'll take the example we have here, and turn it into an object oriented creation that would make momma proud.

    First, The Mystery Functions

    Full information on these types of functions can be found in other tutorials and reference. The pygame.image module has a load() function which will do what we want. The lines to load the images should become this.
    >>> player = pygame.image.load('player.bmp').convert()
    >>> background = pygame.image.load('liquid.bmp').convert()
    
    We can see that's pretty simple, the load function just takes a filename and returns a new Surface with the loaded image. After loading we make a call to the Surface method, convert(). Convert returns us a new Surface of the image, but now converted to the same pixel format as our display. Since the images will be the same format at the screen, they will blit very quickly. If we did not convert, the blit() function is slower, since it has to convert from one type of pixel to another as it goes.

    You may also have noticed that both the load() and convert() return new Surfaces. This means we're really creating two Surfaces on each of these lines. In other programming languages, this results in a memory leak (not a good thing). Fortunately Python is smart enough to handle this, and pygame will properly clean up the Surface we end up not using.

    The other mystery function we saw in the above example was create_screen(). In pygame it is simple to create a new window for graphics. The code to create a 640x480 surface is below. By passing no other arguments, pygame will just pick the best colordepth and pixel format for us.

    >>> screen = pygame.display.set_mode((640, 480))
    

    Handling Some Input

    We desparately need to change the main loop to look for any user input, (like when the user closes the window). We need to add "event handling" to our program. All graphical programs use this Event Based design. The program gets events like "keyboard pressed" or "mouse moved" from the computer. Then the program responds to the different events. Here's what the code should look like. Instead of looping for 100 frames, we'll keep looping until the user asks us to stop.
    >>> while 1:
    ...    for event in pygame.event.get():
    ...        if event.type in (QUIT, KEYDOWN):
    ...            sys.exit()
    ...    move_and_draw_all_game_objects()
    
    What this code simply does is, first loop forever, then check if there are any events from the user. We exit the program if the user presses the keyboard or the close button on the window. After we've checked all the events we move and draw our game objects. (We'll also erase them before they move, too)

    Moving Multiple Images

    Here's the part where we're really going to change things around. Let's say we want 10 different images moving around on the screen. A good way to handle this is to use python's classes. We'll create a class that represents our game object. This object will have a function to move itself, and then we can create as many as we like. The functions to draw and move the object need to work in a way where they only move one frame (or one step) at a time. Here's the python code to create our class.
    >>> class GameObject:
    ...    def __init__(self, image, height, speed):
    ...        self.speed = speed
    ...        self.image = image
    ...        self.pos = image.get_rect().move(0, height)
    ...    def move(self):
    ...        self.pos = self.pos.move(0, self.speed)
    ...        if self.pos.right > 600:
    ...            self.pos.left = 0
    
    So we have two functions in our class. The init function constructs our object. It positions the object and sets its speed. The move method moves the object one step. If it's gone too far, it moves the object back to the left.

    Putting It All Together

    Now with our new object class, we can put together the entire game. Here is what the main function for our program will look like.
    >>> screen = pygame.display.set_mode((640, 480))
    >>> player = pygame.image.load('player.bmp').convert()
    >>> background = pygame.image.load('background.bmp').convert()
    >>> screen.blit(background, (0, 0))
    >>> objects = []
    >>> for x in range(10): 		#create 10 objects
    ...    o = GameObject(player, x*40, x)
    ...    objects.append(o)
    >>> while 1:
    ...    for event in pygame.event.get():
    ...        if event.type in (QUIT, KEYDOWN):
    ...            sys.exit()
    ...    for o in objects:
    ...        screen.blit(background, o.pos, o.pos)
    ...    for o in objects:
    ...        o.move()
    ...        screen.draw(o.image, o.pos)
    ...    pygame.display.update()
    ...    pygame.time.delay(100)
    
    And there it is. This is the code we need to animate 10 objects on the screen. The only point that might need explaining is the two loops we use to clear all the objects and draw all the objects. In order to do things properly, we need to erase all the objects before drawing any of them. In our sample here it may not matter, but when objects are overlapping, using two loops like this becomes important.

    Your On Your Own From Here

    So what would be next on your road to learning? Well first playing around with this example a bit. The full running version of this example is available in the pygame examples directory. It is the example named "moveit.py". Take a look at the code and play with it, run it, learn it.

    Things you may want to work on is maybe having more than one type of object. Finding a way to cleanly "delete" objects when you don't want to show them anymore. Also updating the display.update() call to pass a list of the areas onscreen that have changed.

    There are also other tutorials and examples in pygame that cover these issues. So when you're ready to keep learning, keep on reading. :-)

    Lastly, you can feel free to come to the pygame mailing list or chatroom with any questions on this stuff. There's always folks on hand who can help you out with this sort of business.

    Lastly, have fun, that's what games are for!

    pygame-1.9.1release/docs/tut/ImportInit.html0000644000175000017500000000563507425452213021010 0ustar vincentvincent Pygame Tutorials - Import and Initialize

    Pygame Tutorials
    Import and Initialize

    by Pete Shinners
    pete@shinners.org

    Revision 1.0, January 28th, 2002



    Getting pygame imported and initialized is a very simple process. It is also flexible enough to give you control over what is happening. Pygame is a collection of different modules in a single python package. Some of the modules are written in C, and some are written in python. Some modules are also optional, and might not always be present.
     
    This is just a quick introduction on what is going on when you import pygame. For a clearer explanation definitely see the pygame examples.
     
     

    Import

    First we must import the pygame package. Since pygame version 1.4 this has been updated to be much easier. Most games will import all of pygame like this.
      import pygame
      from pygame.locals import *
    The first line here is the only necessary one. It imports all the available pygame modules into the pygame package. The second line is optional, and puts a limited set of constants and functions into the global namespace of your script.
     
    An important thing to keep in mind is that several pygame modules are optional. For example, one of these is the font module. When you "import pygame", pygame will check to see if the font module is available. If the font module is available it will be imported as "pygame.font". If the module is not available, "pygame.font" will be set to None. This makes it fairly easy to later on test if the font module is available.
     
     

    Init

    Before you can do much with pygame, you will need to initialize it. The most common way to do this is just make one call.
      pygame.init()
    This will attempt to initialize all the pygame modules for you. Not all pygame modules need to be initialized, but this will automatically initialize the ones that do. You can also easily initialize each pygame module by hand. For example to only initialize the font module you would just call.
      pygame.font.init()
    Note that if there is an error when you initialize with "pygame.init()", it will silently fail. When hand initializing modules like this, any errors will raise an exception. Any modules that must be initialized also have a "get_init()" function, which will return true if the module has been initialized.
     
    It is safe to call the init() function for any module more than once.
     
     

    Quit

    Modules that are initialized also usually have a quit() function that will clean up. There is no need to explicitly call these, as pygame will cleanly quit all the initilized modules when python finishes. pygame-1.9.1release/docs/tut/DisplayModes.html0000644000175000017500000002157210746560435021313 0ustar vincentvincent Pygame Tutorials - Setting Display Modes

    Pygame Tutorials
    Setting Display Modes

    by Pete Shinners
    pete@shinners.org

    Revision 1.1, May 21, 2002



    Introduction

    Setting the display mode in pygame creates a visible image surface on the monitor. This surface can either cover the full screen, or be windowed on platforms that support a window manager. The display surface is nothing more than a standard pygame surface object. There are special functions needed in the pygame.display module to keep the image surface contents updated on the monitor.

    Setting the display mode in pygame is an easier task than with most graphic libraries. The advantage is if your display mode is not available, pygame will emulate the display mode that you asked for. Pygame will select a display resolution and color depth that best matches the settings you have requested, then allow you to access the display with the format you have requested. In reality, since the pygame.display module is a binding around the SDL library, SDL is really doing all this work.

    There are advantages and disadvantages to setting the display mode in this manner. The advantage is that if your game requires a specific display mode, your game will run on platforms that do not support your requirements. It also makes life easier when your getting something started, it is always easy to go back later and make the mode selection a little more particular. The disadvantage is that what you request is not always what you will get. There is also a performance penalty when the display mode must be emulated. This tutorial will help you understand the different methods for querying the platforms display capabilities, and setting the display mode for your game.


    Setting Basics

    The first thing to learn about is how to actually set the current display mode. The display mode may be set at anytime after the pygame.display module has been initialized. If you have previously set the display mode, setting it again will change the current mode. Setting the display mode is handled with the function pygame.display.set_mode((width, height), flags, depth). The only required argument in this function is a sequence containing the width and height of the new display mode. The depth flag is the requested bits per pixel for the surface. If the given depth is 8, pygame will create a color-mapped surface. When given a higher bit depth, pygame will use a packed color mode. Much more information about depths and color modes can be found in the documentation for the display and surface modules. The default value for depth is 0. When given an argument of 0, pygame will select the best bit depth to use, usually the same as the system's current bit depth. The flags argument lets you control extra features for the display mode. You can create the display surface in hardware memory with the HWSURFACE flag. Again, more information about this is found in the pygame reference documents.


    How to Decide

    So how do you select a display mode that is going to work best with your graphic resources and the platform your game is running on? There are several methods for gathering information about the display device. All of these methods must be called after the display module has been initialized, but you likely want to call them before setting the display mode. First, pygame.display.get_info() will return a special object type of VidInfo, which can tell you a lot about the graphics driver capabilities. The function pygame.display.list_modes(depth, flags) can be used to find the supported graphic modes by the system. Pygame.display.mode_ok((width, height), flags, depth) takes the same arguments as set_mode(), but returns the closest matching bit depth to the one you request. Lastly, pygame.display.get_driver() will return the name of the graphics driver selected by pygame.

    Just remember the golden rule. Pygame will work with pretty much any display mode you request. Some display modes will need to be emulated, which will slow your game down, since pygame will need to convert every update you make to the "real" display mode. The best bet is to always let pygame choose the best bit depth, and convert all your graphic resources to that format when they are loaded. You let pygame choose it's bit depth by calling set_mode() with no depth argument or a depth of 0, or you can call mode_ok() to find a closest matching bit depth to what you need.

    When your display mode is windowed, you usually must math the same bit depth as the desktop. When you are fullscreen, some platforms can switch to any bit depth that best suits your needs. You can find the depth of the current desktop if you get a VidInfo object before ever setting your display mode.

    After setting the display mode, you can find out information about it's settings by getting a VidInfo object, or by calling any of the Surface.get* methods on the display surface.


    Functions

    These are the routines you can use to determine the most appropriate display mode. You can find more information about these functions in the display module documentation.

    pygame.display.mode_ok(size, flags, depth)
    This function takes the exact same arguments as pygame.display.set_mode(). It returns the best available bit depth for the mode you have described. If this returns zero, then the desired display mode is not available without emulation.

    pygame.display.list_modes(depth, flags)
    Returns a list of supported display modes with the requested depth and flags. An empty list is returned when there are no modes. The flags argument defaults to FULLSCREEN. If you specify your own flags without FULLSCREEN, you will likely get a return value of -1. This means that any display size is fine, since the display will be windowed. Note that the listed modes are sorted largest to smallest.

    pygame.display.get_info()
    This function returns an object with many members describing the display devic. Printing the VidInfo object will quickly show you all the members and values for this object.
    >>> import pygame.display
    >>> pygame.display.init()
    >>> info = pygame.display.get_info()
    >>> print info
    <VideoInfo(hw = 1, wm = 1,video_mem = 27354
    blit_hw = 1, blit_hw_CC = 1, blit_hw_A = 0,
    blit_sw = 1, blit_sw_CC = 1, blit_sw_A = 0,
    bitsize = 32, bytesize = 4,
    masks = (16711680, 65280, 255, 0),
    shifts = (16, 8, 0, 0),
    losses = (0, 0, 0, 8)>

    You can test all these flags as simply members of the VidInfo object. The different blit flags tell if hardware acceleration is supported when blitting from the various types of surfaces to a hardware surface.


    Examples

    Here are some examples of different methods to init the graphics display. They should help you get an idea of how to go about setting your display mode.

    >>> #give me the best depth with a 640 x 480 windowed display
    >>> pygame.display.set_mode((640, 480))

    >>> #give me the biggest 16bit display available
    >>> modes = pygame.display.list_modes(16)
    >>> if not modes:
    ...     print '16bit not supported'
    ... else:
    ...     print 'Found Resolution:', modes[0]
    ...     pygame.display.set_mode(modes[0], FULLSCREEN, 16)

    >>> #need an 8bit surface, nothing else will do
    >>> if pygame.display.mode_ok((800, 600), 0, 8) != 8:
    ...     print 'Can only work with an 8bit display, sorry'
    ... else:
    ...     pygame.display.set_mode((800, 600), 0, 8)

    pygame-1.9.1release/docs/ref/transform.html0000644000175000017500000003662011206601410020646 0ustar vincentvincent transform - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.transform
    pygame-1.9.1release/docs/ref/time.html0000644000175000017500000002442211205141271017571 0ustar vincentvincent time - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.time
    pygame-1.9.1release/docs/ref/tests.html0000644000175000017500000001621611204400076017777 0ustar vincentvincent tests - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.tests
    pygame-1.9.1release/docs/ref/surfarray.html0000644000175000017500000003504511204400076020654 0ustar vincentvincent surfarray - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.surfarray
    pygame-1.9.1release/docs/ref/surface.html0000644000175000017500000013027711227457534020311 0ustar vincentvincent surface - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.Surface
    pygame-1.9.1release/docs/ref/sprite.html0000644000175000017500000013315611204400076020146 0ustar vincentvincent sprite - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.sprite
    pygame-1.9.1release/docs/ref/sndarray.html0000644000175000017500000002033211204400076020452 0ustar vincentvincent sndarray - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.sndarray
    pygame-1.9.1release/docs/ref/scrap.html0000644000175000017500000002527211204532103017744 0ustar vincentvincent scrap - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.scrap
    pygame-1.9.1release/docs/ref/rect.html0000644000175000017500000004073711210363734017605 0ustar vincentvincent rect - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.Rect
    pygame-1.9.1release/docs/ref/pygame_cursor.html0000644000175000017500000000547410415716076021535 0ustar vincentvincent pygame.cursor

    pygame   documentation
    ||  Home  ||  Help Contents  ||
     
    || pygame || cdrom || constants || cursor || display || draw ||
    || event || font || image || joystick || key || mixer ||
    || mixer_music || mouse || movie || sndarray || surfarray || time ||
    || transform ||
     
    || CD || Channel || Clock || Font || Joystick || Movie ||
    || Overlay || Rect || Sound || Surface ||
     
    || color || cursors || sprite ||

    pygame.cursor

    {module}
    compile - compile cursor strings into cursor data

    compile
    pygame.cursor.compile(strings, black, white,xor) -> data, mask

     

    pygame-1.9.1release/docs/ref/pygame.html0000644000175000017500000002521511204400076020116 0ustar vincentvincent pygame - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame
    pygame-1.9.1release/docs/ref/pixelarray.html0000644000175000017500000002400411204400076021007 0ustar vincentvincent pixelarray - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.PixelArray
    pygame-1.9.1release/docs/ref/overlay.html0000644000175000017500000001301611204400076020311 0ustar vincentvincent overlay - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.Overlay
    pygame-1.9.1release/docs/ref/music.html0000644000175000017500000003037311204532103017752 0ustar vincentvincent music - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.mixer.music
    pygame-1.9.1release/docs/ref/movie.html0000644000175000017500000003021711204400076017751 0ustar vincentvincent movie - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.movie
    pygame-1.9.1release/docs/ref/mouse.html0000644000175000017500000002524011204400076017762 0ustar vincentvincent mouse - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.mouse
    pygame-1.9.1release/docs/ref/mixer.html0000644000175000017500000007747211204400076017774 0ustar vincentvincent mixer - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.mixer
    pygame-1.9.1release/docs/ref/midi.html0000644000175000017500000005267611210672261017575 0ustar vincentvincent midi - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.midi
    pygame-1.9.1release/docs/ref/mask.html0000644000175000017500000003724611210364127017601 0ustar vincentvincent mask - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.mask
    pygame-1.9.1release/docs/ref/locals.html0000644000175000017500000000612311205140452020106 0ustar vincentvincent locals - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.locals
      pygame constants

      This module contains various constants used by Pygame. It's contents are automatically placed in the pygame module namespace. However, an application can use pygame.locals to include only the Pygame constants with a 'from pygame.locals import *'.

      Detailed descriptions of the various constants are found throughout the Pygame documentation. pygame.display.set_mode flags like HWSURFACE are found in the Display section. Event types are explained in the Event section. Keyboard K_ constants relating to the key attribute of a KEYDOWN or KEYUP event are listed in the Key section. Also found there are the various MOD_ key modifiers. Finally, TIMER_RESOLUTION is defined in Time.

       

    pygame-1.9.1release/docs/ref/key.html0000644000175000017500000003301211204400076017416 0ustar vincentvincent key - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.key
    pygame-1.9.1release/docs/ref/joystick.html0000644000175000017500000003733011204400076020474 0ustar vincentvincent joystick - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.joystick
    pygame-1.9.1release/docs/ref/index.html0000644000175000017500000022410111216627051017745 0ustar vincentvincent Index - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame-1.9.1release/docs/ref/image.html0000644000175000017500000002471511204400076017722 0ustar vincentvincent image - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.image
    pygame-1.9.1release/docs/ref/gfxdraw.html0000644000175000017500000003204411210364127020277 0ustar vincentvincent gfxdraw - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.gfxdraw
    pygame-1.9.1release/docs/ref/font.html0000644000175000017500000004514011204400076017601 0ustar vincentvincent font - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.font
    pygame-1.9.1release/docs/ref/examples.html0000644000175000017500000006200511204400076020450 0ustar vincentvincent examples - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.examples
    pygame-1.9.1release/docs/ref/event.html0000644000175000017500000004220711204400076017755 0ustar vincentvincent event - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.event
    pygame-1.9.1release/docs/ref/draw.html0000644000175000017500000002427011204400076017571 0ustar vincentvincent draw - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.draw
    pygame-1.9.1release/docs/ref/display.html0000644000175000017500000007251211204400076020303 0ustar vincentvincent display - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.display
    pygame-1.9.1release/docs/ref/cursors.html0000644000175000017500000001731311210364127020337 0ustar vincentvincent cursors - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.cursors
    pygame-1.9.1release/docs/ref/color.html0000644000175000017500000002455211216627051017764 0ustar vincentvincent color - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.Color
    pygame-1.9.1release/docs/ref/cdrom.html0000644000175000017500000004265311204400076017745 0ustar vincentvincent cdrom - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.cdrom
    pygame-1.9.1release/docs/ref/camera.html0000644000175000017500000002731611206601410020065 0ustar vincentvincent camera - Pygame Documentation

    pygame documentation
    ||  Pygame Home  ||  Help Contents  || Reference Index  ||
     
    Camera ||  Cdrom ||  Color ||  Cursors ||  Display ||  Draw ||  Event ||  Examples ||  Font ||  Gfxdraw ||  Image ||  Joystick ||  Key ||  Locals ||  Mask ||  Midi ||  Mixer ||  Mouse ||  Movie ||  Music ||  Overlay ||  Pixelarray ||  Pygame ||  Rect ||  Scrap ||  Sndarray ||  Sprite ||  Surface ||  Surfarray ||  Tests ||  Time ||  Transform

    pygame.camera
    pygame-1.9.1release/test/util/build_page/warnings.php0000644000175000017500000000225311057365076022647 0ustar vincentvincent Alert! Warnings for <? echo $build_tag; ?> Automated Pygame Build Page

    Alert! Warnings for Automated Pygame Build Page


    Below are the setup">build warnings for the build from the Spectacularly Adequate Automated Pygame Build Page. Although most warnings are related to casting or types and are harmless, they may indicate a bug or error in the build.


    Automated build warnings:

    pygame-1.9.1release/test/util/build_page/remote_push.bat0000644000175000017500000000006611057365076023330 0ustar vincentvincentrsync -za * -e ssh wazoocom@wazoo.com.au:~/www/pygame/pygame-1.9.1release/test/util/build_page/index.php0000644000175000017500000001033511057365076022126 0ustar vincentvincent strlen($prefix) + strlen($suffix)) { if (strncasecmp($filename, $prefix, strlen($prefix)) == 0) { $testsuffix = substr($filename, strlen($filename) - strlen($suffix)); if (strcasecmp($testsuffix, $suffix) == 0) { $tag = substr($filename, strlen($prefix), strlen($filename) - strlen($prefix) - strlen($suffix)); $contents = explode("\n", file_get_contents($filename)); $file_map[$tag] = $contents; } } } } return $file_map; } $prebuilt_list = sandwiched_file_list("prebuilt_", ".txt"); $results_list = sandwiched_file_list("buildresults_", ".txt"); ?> The Spectacularly Adequate Automated Pygame Build Page

    The Spectacularly Adequate Automated Pygame Build Page


    These automated builds are Prerelease Unstable from the latest SVN sources - but all posted installers have passed unittests, so they should be suitable for evaluating new features or confirming that bugs have been fixed.

    NOTE: these builds modify the pygame.version.ver string to include the SVN revision they were built from - please note the revision number when reporting bugs with these builds.


    Installers:
    $platform_file) { echo ""; } ?> $platform_file) { echo ""; } ?> $platform_file) { if (strncasecmp($platform_file[2], "uploading", 9) == 0) { echo ""; } else { if (preg_match('/failed_tests_(.*)/', $platform_file[2], $group)) { $passing_installer = $group[1]; echo ""; } else { echo "No passing build yet!"; } } else { echo ""; } } } ?>
    " . $platform_tag . "

    Revision: " . $platform_file[0] . " Built: " . $platform_file[1] . "

    Uploading... please wait

    Most Recent Build:
    " . $platform_file[2] . "
    "; echo "
    Most Recent Build Successfuly Passing Tests:
    (see pygame.version.ver for svn version number)
    "; if (file_exists($passing_installer)) { echo " " . $passing_installer . "
    " . $platform_file[2] . "

    Most recent Automated build results:
    $platform_file) { echo ""; } ?> $platform_file) { echo ""; } ?> $platform_file) { echo ""; } ?> $platform_file) { echo ""; } ?>
    " . $platform_tag . "

    Revision: " . $platform_file[0] . " Built: " . $platform_file[1] . "

    " . $platform_file[2] . "

    "; if (trim($platform_file[3]) != "") { echo "

    " . $platform_file[3] . "

    "; } if (trim($platform_file[4]) != "") { echo "view warnings "; echo "  build info "; } echo "
    pygame-1.9.1release/test/util/build_page/.htaccess0000644000175000017500000000012311057365076022076 0ustar vincentvincentOptions +FollowSymLinks +ExecCGI AddHandler cgi-script py DirectoryIndex index.phppygame-1.9.1release/test/run_tests__tests/timeout/sleep_test.py0000644000175000017500000000174411207055754025054 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest import time class KeyModuleTest(unittest.TestCase): def test_get_focused(self): stop_time = time.time() + 10.0 while time.time() < stop_time: time.sleep(1) self.assert_(True) if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/run_tests__tests/timeout/fake_2_test.py0000644000175000017500000000223211207055754025064 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/timeout/__init__.py0000644000175000017500000000001011207055754024425 0ustar vincentvincent# empty pygame-1.9.1release/test/run_tests__tests/print_stdout/fake_4_test.py0000644000175000017500000000232111207055754026135 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(False, "Some Jibberish") def test_name(self): self.assert_(True) def test_set_mods(self): if 1: if 1: assert False def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/print_stdout/fake_3_test.py0000644000175000017500000000241611207055754026141 0ustar vincentvincentimport sys if __name__ == '__main__': import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): sys.stdout.write("jibberish ruins everything\n") self.assert_(False) def test_name(self): sys.stdout.write("forgot to remove debug crap\n") self.assert_(True) def test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/run_tests__tests/print_stdout/fake_2_test.py0000644000175000017500000000223211207055754026134 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/print_stdout/__init__.py0000644000175000017500000000001011207055754025475 0ustar vincentvincent# empty pygame-1.9.1release/test/run_tests__tests/print_stderr/fake_4_test.py0000644000175000017500000000232111207055754026116 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(False, "Some Jibberish") def test_name(self): self.assert_(True) def test_set_mods(self): if 1: if 1: assert False def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/print_stderr/fake_3_test.py0000644000175000017500000000232211207055754026116 0ustar vincentvincentimport sys if __name__ == '__main__': import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(True) def test_name(self): sys.stderr.write("jibberish messes things up\n") self.assert_(False) def test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/run_tests__tests/print_stderr/fake_2_test.py0000644000175000017500000000223211207055754026115 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/print_stderr/__init__.py0000644000175000017500000000001011207055754025456 0ustar vincentvincent# empty pygame-1.9.1release/test/run_tests__tests/infinite_loop/fake_2_test.py0000644000175000017500000000223211207055754026234 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/infinite_loop/fake_1_test.py0000644000175000017500000000224511207055754026237 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): while True: pass def test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/infinite_loop/__init__.py0000644000175000017500000000001011207055754025575 0ustar vincentvincent# empty pygame-1.9.1release/test/run_tests__tests/incomplete_todo/fake_3_test.py0000644000175000017500000000223211207055754026563 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/incomplete_todo/fake_2_test.py0000644000175000017500000000224611207055754026567 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def todo_test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def todo_test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/run_tests__tests/incomplete_todo/__init__.py0000644000175000017500000000001011207055754026123 0ustar vincentvincent# empty pygame-1.9.1release/test/run_tests__tests/incomplete/fake_3_test.py0000644000175000017500000000223211207055754025536 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/incomplete/fake_2_test.py0000644000175000017500000000232611207055754025541 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(test_utils.test_not_implemented()) def test_name(self): self.assert_(True) def test_set_mods(self): self.assert_(test_utils.test_not_implemented()) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/run_tests__tests/incomplete/__init__.py0000644000175000017500000000001011207055754025076 0ustar vincentvincent# empty pygame-1.9.1release/test/run_tests__tests/failures1/fake_4_test.py0000644000175000017500000000232111207055754025272 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(False, "Some Jibberish") def test_name(self): self.assert_(True) def test_set_mods(self): if 1: if 1: assert False def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/failures1/fake_3_test.py0000644000175000017500000000223211207055754025272 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/failures1/fake_2_test.py0000644000175000017500000000223211207055754025271 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/failures1/__init__.py0000644000175000017500000000001011207055754024632 0ustar vincentvincent# empty pygame-1.9.1release/test/run_tests__tests/exclude/magic_tag_test.py0000644000175000017500000000216511207055754025620 0ustar vincentvincent__tags__ = ['magic'] if __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def test_set_mods(self): self.assert_(True) if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/run_tests__tests/exclude/invisible_tag_test.py0000644000175000017500000000227011207055754026521 0ustar vincentvincent__tags__ = ['invisible'] if __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/run_tests__tests/exclude/fake_2_test.py0000644000175000017500000000223211207055754025027 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/exclude/__init__.py0000644000175000017500000000001011207055754024370 0ustar vincentvincent# empty pygame-1.9.1release/test/run_tests__tests/everything/sleep_test.py0000644000175000017500000000174411207055754025552 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest import time class KeyModuleTest(unittest.TestCase): def test_get_focused(self): stop_time = time.time() + 10.0 while time.time() < stop_time: time.sleep(1) self.assert_(True) if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/run_tests__tests/everything/magic_tag_test.py0000644000175000017500000000216511207055754026353 0ustar vincentvincent__tags__ = ['magic'] if __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def test_set_mods(self): self.assert_(True) if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/run_tests__tests/everything/incomplete_todo_test.py0000644000175000017500000000224611207055754027624 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def todo_test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def todo_test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main() pygame-1.9.1release/test/run_tests__tests/everything/fake_2_test.py0000644000175000017500000000223211207055754025562 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/everything/__init__.py0000644000175000017500000000001011207055754025123 0ustar vincentvincent# empty pygame-1.9.1release/test/run_tests__tests/all_ok/zero_tests_test.py0000644000175000017500000000146411207055754025717 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): pass if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/all_ok/no_assertions__ret_code_of_1__test.py0000644000175000017500000000210011207055754031436 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): pass def test_get_mods(self): pass def test_get_pressed(self): pass def test_name(self): pass def test_set_mods(self): pass def test_set_repeat(self): pass if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/all_ok/fake_6_test.py0000644000175000017500000000223211207055754024643 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/all_ok/fake_5_test.py0000644000175000017500000000223211207055754024642 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/all_ok/fake_4_test.py0000644000175000017500000000223211207055754024641 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/all_ok/fake_3_test.py0000644000175000017500000000223211207055754024640 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/all_ok/fake_2_test.py0000644000175000017500000000223211207055754024637 0ustar vincentvincentif __name__ == '__main__': import sys import os pkg_dir = (os.path.split( os.path.split( os.path.split( os.path.abspath(__file__))[0])[0])[0]) parent_dir, pkg_name = os.path.split(pkg_dir) is_pygame_pkg = (pkg_name == 'tests' and os.path.split(parent_dir)[1] == 'pygame') if not is_pygame_pkg: sys.path.insert(0, parent_dir) else: is_pygame_pkg = __name__.startswith('pygame.tests.') if is_pygame_pkg: from pygame.tests import test_utils from pygame.tests.test_utils import unittest else: from test import test_utils from test.test_utils import unittest class KeyModuleTest(unittest.TestCase): def test_get_focused(self): self.assert_(True) def test_get_mods(self): self.assert_(True) def test_get_pressed(self): self.assert_(True) def test_name(self): self.assert_(True) def test_set_mods(self): self.assert_(True) def test_set_repeat(self): self.assert_(True) if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/run_tests__tests/all_ok/__init__.py0000644000175000017500000000001011207055754024200 0ustar vincentvincent# empty pygame-1.9.1release/test/fixtures/xbm_cursors/white_sizing_mask.xbm0000644000175000017500000000060711044767544025706 0ustar vincentvincent#define resize_white_mask_width 16 #define resize_white_mask_height 16 #define resize_white_mask_x_hot 7 #define resize_white_mask_y_hot 7 static unsigned char resize_white_mask_bits[] = { 0xff, 0x03, 0xff, 0x03, 0xff, 0x03, 0x07, 0x00, 0xf7, 0x0f, 0xf7, 0x0f, 0xf7, 0xef, 0x77, 0xee, 0x77, 0xee, 0xf7, 0xef, 0xf0, 0xef, 0xf0, 0xff, 0x00, 0xf8, 0xc0, 0xff, 0xc0, 0xff, 0xc0, 0xff}; pygame-1.9.1release/test/fixtures/xbm_cursors/white_sizing.xbm0000644000175000017500000000055611044767544024676 0ustar vincentvincent#define resize_white_width 16 #define resize_white_height 16 #define resize_white_x_hot 7 #define resize_white_y_hot 7 static unsigned char resize_white_bits[] = { 0xff, 0x03, 0x01, 0x02, 0xfd, 0x03, 0x05, 0x00, 0xf5, 0x0f, 0x15, 0x08, 0xd5, 0xeb, 0x55, 0xaa, 0x55, 0xaa, 0xd7, 0xab, 0x10, 0xa8, 0xf0, 0xb7, 0x00, 0xa8, 0xc0, 0x9f, 0x40, 0x80, 0xc0, 0xff}; pygame-1.9.1release/examples/macosx/aliens_app_example/setup.py0000644000175000017500000000110211153131223024675 0ustar vincentvincent""" Script for building the example. Usage: python setup.py py2app """ from distutils.core import setup import py2app NAME = 'aliens' VERSION = '0.1' plist = dict( CFBundleIconFile=NAME, CFBundleName=NAME, CFBundleShortVersionString=VERSION, CFBundleGetInfoString=' '.join([NAME, VERSION]), CFBundleExecutable=NAME, CFBundleIdentifier='org.pygame.examples.aliens', ) setup( data_files=['English.lproj', '../../data'], app=[ #dict(script="aliens_bootstrap.py", plist=plist), dict(script="aliens.py", plist=plist), ], ) pygame-1.9.1release/examples/macosx/aliens_app_example/README.txt0000644000175000017500000000066011153131223024671 0ustar vincentvincent********************************************************************* THESE INSTRUCTIONS ARE ONLY FOR MAC OS X 10.3, AND WILL ONLY CREATE STANDALONE BUNDLES FOR MAC OS X 10.3. THERE IS NO SUPPORT FOR MAC OS X 10.2. Also works on 10.4 and 10.5 ********************************************************************* Install py2app and its dependencies. easy_install py2app To create the bundle: python setup.py py2app pygame-1.9.1release/examples/macosx/aliens_app_example/aliens.py0000644000175000017500000002263611153131223025027 0ustar vincentvincent#! /usr/bin/env python import random, os.path #import basic pygame modules import pygame from pygame.locals import * #see if we can load more than standard BMP if not pygame.image.get_extended(): raise SystemExit, "Sorry, extended image module required" #game constants MAX_SHOTS = 2 #most player bullets onscreen ALIEN_ODDS = 22 #chances a new alien appears BOMB_ODDS = 60 #chances a new bomb will drop ALIEN_RELOAD = 12 #frames between new aliens SCREENRECT = Rect(0, 0, 640, 480) SCORE = 0 def load_image(file): "loads an image, prepares it for play" file = os.path.join('data', file) try: surface = pygame.image.load(file) except pygame.error: raise SystemExit, 'Could not load image "%s" %s'%(file, pygame.get_error()) return surface.convert() def load_images(*files): imgs = [] for file in files: imgs.append(load_image(file)) return imgs class dummysound: def play(self): pass def load_sound(file): if not pygame.mixer: return dummysound() file = os.path.join('data', file) try: sound = pygame.mixer.Sound(file) return sound except pygame.error: print 'Warning, unable to load,', file return dummysound() # each type of game object gets an init and an # update function. the update function is called # once per frame, and it is when each object should # change it's current position and state. the Player # object actually gets a "move" function instead of # update, since it is passed extra information about # the keyboard class Player(pygame.sprite.Sprite): speed = 10 bounce = 24 gun_offset = -11 images = [] def __init__(self): pygame.sprite.Sprite.__init__(self, self.containers) self.image = self.images[0] self.rect = self.image.get_rect() self.reloading = 0 self.rect.centerx = SCREENRECT.centerx self.rect.bottom = SCREENRECT.bottom - 1 self.origtop = self.rect.top self.facing = -1 def move(self, direction): if direction: self.facing = direction self.rect.move_ip(direction*self.speed, 0) self.rect = self.rect.clamp(SCREENRECT) if direction < 0: self.image = self.images[0] elif direction > 0: self.image = self.images[1] self.rect.top = self.origtop - (self.rect.left/self.bounce%2) def gunpos(self): pos = self.facing*self.gun_offset + self.rect.centerx return pos, self.rect.top class Alien(pygame.sprite.Sprite): speed = 13 animcycle = 12 images = [] def __init__(self): pygame.sprite.Sprite.__init__(self, self.containers) self.image = self.images[0] self.rect = self.image.get_rect() self.facing = random.choice((-1,1)) * Alien.speed self.frame = 0 if self.facing < 0: self.rect.right = SCREENRECT.right def update(self): self.rect.move_ip(self.facing, 0) if not SCREENRECT.contains(self.rect): self.facing = -self.facing; self.rect.top = self.rect.bottom + 1 self.rect = self.rect.clamp(SCREENRECT) self.frame = self.frame + 1 self.image = self.images[self.frame/self.animcycle%3] class Explosion(pygame.sprite.Sprite): defaultlife = 12 animcycle = 3 images = [] def __init__(self, actor): pygame.sprite.Sprite.__init__(self, self.containers) self.image = self.images[0] self.rect = self.image.get_rect() self.life = self.defaultlife self.rect.center = actor.rect.center def update(self): self.life = self.life - 1 self.image = self.images[self.life/self.animcycle%2] if self.life <= 0: self.kill() class Shot(pygame.sprite.Sprite): speed = -11 images = [] def __init__(self, pos): pygame.sprite.Sprite.__init__(self, self.containers) self.image = self.images[0] self.rect = self.image.get_rect() self.rect.midbottom = pos def update(self): self.rect.move_ip(0, self.speed) if self.rect.top <= 0: self.kill() class Bomb(pygame.sprite.Sprite): speed = 9 images = [] def __init__(self, alien): pygame.sprite.Sprite.__init__(self, self.containers) self.image = self.images[0] self.rect = self.image.get_rect() self.rect.centerx = alien.rect.centerx self.rect.bottom = alien.rect.bottom + 5 def update(self): self.rect.move_ip(0, self.speed) if self.rect.bottom >= 470: Explosion(self) self.kill() class Score(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.font = pygame.font.Font(None, 20) self.font.set_italic(1) self.color = Color('white') self.lastscore = -1 self.update() self.rect = self.image.get_rect().move(10, 450) def update(self): if SCORE != self.lastscore: self.lastscore = SCORE msg = "Score: %d" % SCORE self.image = self.font.render(msg, 0, self.color) def main(winstyle = 0): # Initialize pygame pygame.init() if pygame.mixer and not pygame.mixer.get_init(): print 'Warning, no sound' pygame.mixer = None # Set the display mode winstyle = 0 # |FULLSCREEN bestdepth = pygame.display.mode_ok(SCREENRECT.size, winstyle, 32) screen = pygame.display.set_mode(SCREENRECT.size, winstyle, bestdepth) #Load images, assign to sprite classes #(do this before the classes are used, after screen setup) img = load_image('player1.gif') Player.images = [img, pygame.transform.flip(img, 1, 0)] img = load_image('explosion1.gif') Explosion.images = [img, pygame.transform.flip(img, 1, 1)] Alien.images = load_images('alien1.gif', 'alien2.gif', 'alien3.gif') Bomb.images = [load_image('bomb.gif')] Shot.images = [load_image('shot.gif')] #decorate the game window icon = pygame.transform.scale(Alien.images[0], (32, 32)) pygame.display.set_icon(icon) pygame.display.set_caption('Pygame Aliens') pygame.mouse.set_visible(0) #create the background, tile the bgd image bgdtile = load_image('background.gif') background = pygame.Surface(SCREENRECT.size) for x in range(0, SCREENRECT.width, bgdtile.get_width()): background.blit(bgdtile, (x, 0)) screen.blit(background, (0,0)) pygame.display.flip() #load the sound effects boom_sound = load_sound('boom.wav') shoot_sound = load_sound('car_door.wav') if pygame.mixer and pygame.mixer.music: music = os.path.join('data', 'house_lo.wav') pygame.mixer.music.load(music) pygame.mixer.music.play(-1) # Initialize Game Groups aliens = pygame.sprite.Group() shots = pygame.sprite.Group() bombs = pygame.sprite.Group() all = pygame.sprite.RenderUpdates() lastalien = pygame.sprite.GroupSingle() #assign default groups to each sprite class Player.containers = all Alien.containers = aliens, all, lastalien Shot.containers = shots, all Bomb.containers = bombs, all Explosion.containers = all Score.containers = all #Create Some Starting Values global score alienreload = ALIEN_RELOAD kills = 0 clock = pygame.time.Clock() #initialize our starting sprites global SCORE player = Player() Alien() #note, this 'lives' because it goes into a sprite group if pygame.font: all.add(Score()) while player.alive(): #get input for event in pygame.event.get(): if event.type == QUIT or \ (event.type == KEYDOWN and event.key == K_ESCAPE): return keystate = pygame.key.get_pressed() # clear/erase the last drawn sprites all.clear(screen, background) #update all the sprites all.update() #handle player input direction = keystate[K_RIGHT] - keystate[K_LEFT] player.move(direction) firing = keystate[K_SPACE] if not player.reloading and firing and len(shots) < MAX_SHOTS: Shot(player.gunpos()) shoot_sound.play() player.reloading = firing # Create new alien if alienreload: alienreload = alienreload - 1 elif not int(random.random() * ALIEN_ODDS): Alien() alienreload = ALIEN_RELOAD # Drop bombs if lastalien and not int(random.random() * BOMB_ODDS): Bomb(lastalien.sprite) # Detect collisions for alien in pygame.sprite.spritecollide(player, aliens, 1): boom_sound.play() Explosion(alien) Explosion(player) SCORE = SCORE + 1 player.kill() for alien in pygame.sprite.groupcollide(shots, aliens, 1, 1).keys(): boom_sound.play() Explosion(alien) SCORE = SCORE + 1 for bomb in pygame.sprite.spritecollide(player, bombs, 1): boom_sound.play() Explosion(player) Explosion(bomb) player.kill() #draw the scene dirty = all.draw(screen) pygame.display.update(dirty) #cap the framerate clock.tick(40) if pygame.mixer and pygame.mixer.music: pygame.mixer.music.fadeout(1000) pygame.time.wait(1000) #call the "main" function if running this script if __name__ == '__main__': main() pygame-1.9.1release/docs/tut/tom/radians.png0000644000175000017500000004200107670446465020754 0ustar vincentvincent‰PNG  IHDRB8·öœ:sBIT|dˆtEXtTitleMade with SodipodiŸô/'tEXtAuthorUnknownŒ! òzTXtDescriptionxœKT(ÈL.)-J_~êô , IDATxœíÝwœ\UùÇñϤ’„@ ”PB HiAzQŽÒ¥ˆ"‚‚øH•Ž•&ˆÒ;"ˆ€t 0ÔÐi¤=¿?žϽwgwfggæÜ™ù¾_¯ye3{wæÙ½gæ>sÎsΑæù:`ÅÛ¹‘c¡_ìDDDDbQ"$Íd‰¯ Ñ¢)R"$"""K‰4“z„DD$W”‰ˆˆHÇR"$ͤ!É%B"""Ò±”I,ê‘è”I3YåCDDDšG‰Ä¢!‰n@ì¤m †—¹ÍŸøzóÄñk‡—¹M-þû0¯)Ñ‹ˆHGÒ§r©¤°4°Râ¶ 0šàŒ qmi:!Aú˜¼¸=ÌhÐs‹ˆH›S"$%#H';++ã€!ãªÄ€I„ÄèÅÄׯ¡%é¡Î4?° ðYàSxÒ³X3Ùs“ÞJÞVv,ÿ$ð å‡Ó’·¾Ô±Ížþ ü¸x m‹ˆH‘¡Î°°)°°%°½K0Þ"=UêmùOp¦P]rqpIñëK€¯Tñ3ÉÚ£…•I÷Z­ ¬ò÷˜ ÜÜ…'F/ôâgED¤Í¨Xº= 6"$>ëPù\ÏþCù!¦) ‹´²éÅÛÛx}ÐÙï–¥ü°^¹^®E€Ý‹7€×ñ„¨”M¬kô"""ÒpñŸ“€{Oðšîn³€Ó€€±4§wðÀD —T8¶ë¿Ã{°zú»ðp1°7°hb‘­ü îééâ>xø°-^#C³¡¬°p$p=ð>=ÿÝæw_&ÞßLDDD–ŽÇ§wwŸ‡ÿØX0J¤]@ˆñ7qC ?>lx,p ^ïÔÝßt*p%ð¹âωˆˆH“,€ß÷R”»P¿ œìA~Ÿ¬ÈW"”5ø žhÞ…'”åþÖ¯ã½k«Ç SDD¤ý >\ƒ —» OÁëY6£5f@ˆýÒ¸¡Te à|ªw=EGÓ÷åDDD_µù'À{t_èü`Oò½Ða9_¦µ¡¤µðóò&Ý×aÝìFk$¥"""¹²>pÝÇü ïyhå™LÉD貸¡Ôl^p~ 0òçj"p80_œEDDZÇfÀm”¿ NÂkQV‹]}íOë'BI à3ẫÝzZÓŒ3‘Œmû)?ãë||û‹vbI&B—GŽ¥ÞF§à³Ë²çô]àûä·ˆ]DD¤)ú_À÷½*Wûs¾…D»ÚöM„J†Gà[”+n? -:‘ûOÓõâ8¸X.ZtÍÓ ‰PÉ à`|Û’ì9Ÿ†¯ñ´d´èDDDš €'@åz¦çc¢E×|û~ÿ+"ÇÒ,ýñí:J»Þ'o³€ ñ-NDDDÚʦ”¿ø}œ‰oþÙi:1*)»à[dÛÄ àd4ËLDDÚÀ¢ø°Ovüd༨¶SíCø{\9–˜¶î£kB4Ø.b\"""5ë|@× ïâ;¡w:%Biûâ[£d¢ë€¥#Æ%""Ò+ëS~&Øï謠Jö&üm®ŠK^ôÁ§Ø'ÛÎTà8¼èZDD$—Â×üÉ.¦÷<°uĸòJ‰P÷Æ÷˶¥g-"Æ%""ÒEß þºÎ;/´\K&BWGŽ%¯6Ä7rÍ.²y5°xĸDDDXx®Ã`7¢iЕì…¡jôŽÄgfg‰¯K%""ÒTýð¢çÙ¤/N/;FŒ«•$¡k"ÇÒ ÇÆì ć¥"Æ%""fà¯t v:04b\­fO”Õb ¼V(ÙþÞvŠ”ˆˆt†Mñ]à“¡ðâVéd"ôÛȱ´šþÀI¤‹©ç?A3ËDD¤úá…ÏÉ¡°¹øªÐªÑ¨Í—P"ÔWã‰t*/$i7£ÛH_lÞÆW–Ú)ª…€H·Ï÷ñ-0‡ôPØ©x}†ô¡ú[Ÿ¹˜LÜ–‹”ˆˆ´–Å€;H_LÞB«C×Ûî„¿ïï#ÇÒNF×’n¿»Å JDDZà À›¤/"wâɑԗ¡Æ)GàË:$ÛòÏ‹ßébàcÂEc>EYCañEÂßú‘ciWëH'CWc%""ù³7éBÓw€U¢FÔþ”5ÇPàÒÉÐ߀ùc%""ùqé…é^VŒQgØð7ÿcäXÚ]?à\ÒÉÐ?ÐB ""­ü€ôÅáI45¾Y”5߉¤ÛûóÀ2Q#‘(¿!}Q¸Ÿq#Í‘L„þ9–NòUÒËBLV‘ˆˆ4ÕPà&ÒIÐõÀ˜Au / D(–]¤W¢Þ$jD""Ò ᛤ&“ ‹Ð̰’‰Ðµ‘céD›ÎÁt`稉ˆHC- , ¼@úÂW£F$""uµ>%¾ô&ÿ ¾ó¹Äµ áœ\9–N·ð(édèëQ#‘ L£R•‘À¿ oîSOGHJ”åËà~Ò+«1jD"Ò Ûì0Õ·J†÷‘î Ú&jD’´3éY{ß0àï„ó2Ø2jD"’`ÃÀ.³âmߨI~ n ]´wÔˆ$K‰P>ž%œ›)¨U$l°çIÁïKÅŽLò§\LºÞá›Q#’rv"œŸ"Ç"iK¯ÎÏ[ø„i:ëvØ'é$èÒÒëS[BIg’N‚ÎŒŽtC‰P¾­Bz¦åKÀbQ#é8¶ØÝéȦÀWß"¼6õ!ER¾I: º­”W;ÎÓ‘c‘ò6Ä'”ÎÓãÀˆ¨‰t ÛìýLô زÀÂërù¸qJžìMzùðZ!É'%B­a;`á\Ý Ì5"‘¶fÃÁ.Ë$@³ÁN+]Ó^"¼&—ªäÊ6ø¬°Røí–wÉDèÏ‘c‘žíÌ#½¦¦íŠÔ›I‚^Û0s`rm¼±MSrgm`¡Qüí"ß v@‰P+ù6éaç ã†#ÒN¬?Ø÷‹=?É$è2ï!êb"ᵸt3#•üYø/¡A¼‚¯$-ù—L„nŠ‹TçG¤“¡Cã†#ÒlÙââˆÉè}¯êVrV§¦Ïw°p ¡1h=…Ö²=J„ZM+·ÀZQ#ii¶¯ÏK%Awûl±%;Æ4>NÉ«ã a.°mÜp¤—”µ¦ùðÙc¥s÷P®ë^Dºe#Á®É$@³À¾ Ö¯ŠxðÔ(H‡Ú˜Ö jeÛÎßÍ‘c‘Þ‡¯8]:×Ä G¤•ئ`3IÐó`ëöâAÞ ¼þ´¾WÊÖݦɷ"%B­mOÒõB_ŽHÞÙ@°3Àæd’  À†õòÁ’ *.ZÿX%Ï À_ `2°dÔˆ¤VŸ'œÇ¿DŽEjs>áNÖŒŽH^Ù8°G2 Ðd°]j|À· ¯½Ñõ‹SZÁw'~1•Ö¤D¨õ©^H¤";ìãLtX_j{&^w ×'NiŸ!½Âíâ†#}´-á\Þ9©ÝŠÀG„syuÜpDòÂF]›I€f‚ Ö×­Ÿ’ûŽê{¬Ò F‘^7áTÔꔵ½H× 7‘Øl+°I™$èi°z ¿Gx½-X§Ç”+àÅ´Z/¨½lC8§‹ôݤë…ÖˆŽH 6ìÇ`s Ð<°_‚ÕsÛ§¯7í¤ÐŽ%]´}Üp¤N”µ—!À„sú`þ¨‰4•­öx¦è-°íðd^k 4àñ%GVfNøã†#u”L„þ9©•H× 7‘f°Øa`Ó3IÐÍ`šÑ•|i‚B›»p²C;^·“Ï¡D¨íG8¯³Ñ”zik6ì¦L4ìð:D÷äcÂ묷kI I.Ø6Õ´›d"tkäX¤¾n#œÛñ:?‘6cŸ/}%“ Ç}ˆ¬á¦^cC›ð|Á¤÷RùiÜp¤>‹¡vµ"é!íƒã†#RO6ìÅ"èR4ìl/–nŠé„××|MzNi²s'ymGJ„ÚÛi„ó;­u"mÁÖ{*Ó 4 lë&’ü Ñ¬äKšhMÒª~)n8Ò [Îñm‘c‘ú¼D8ÇÆ G¤/¬€/„83“] #Éÿ„ðÚáù¥ xM.íO‰PûÛžpŽçãã†#R [ìÖL4ì+ƒJvhqá6sáäÎÄk ¤=mE8×·GŽEçzÂyþšù)-ÅvÆ7GM&A€Å¾6Í!¼®ôšj#£Ho$wZÜp¤Á”u†e€©„s}dÜpDªaÃÀ.È$@sÀÎËÃPÔ\ÂkJ³2ÛÈ…„û2^c íkKÂù¾#r,ÒXß%œëÅã†#Ò[ìùLô*ئ±#K°ÄMÚÄxÒ®¶ÑhJ„:Ç àYÂùÖõ’CÖì8°O2IÐoÁò´ŸWtí]olüºîIŸõž'œØëã†#M²áœß9i¼-ð½Kç|øáˆ$ÙR`wg )`ûÅŽ¬Œþ„×Ñœ^þì¡À;uHúìK„“:¯)ö§D¨ó\E8çEŽE¤Èö{?“=¶lìȺ1€ð:šÕËŸý:J„r§‡ïŸL€&ƒí;²:Zðºy¯‡ã6 ldþ!žC×Dh>^µšM²aO±¹Àªqш’ub÷EŽE⹕Ð.ˆ‹´4;ìãLtر#«³Q„×Ì»Ž_ªdw|!ÆrFâSí¬S|RÁÕ„xmäX$.%BéZ±™t­i©ÀF]›I€f‚ Vˆ],LxÍÔc»ŒãðÙgCëðXRÁÒ„âÈyørßÒ¹6"¼˜ï‹Äu¡-ü(r,R G5æ¡m+°I™$èi°5ó|¹0šðzy»3x¦ø8‡ö=,©Æñ„“wkäX$>%BR²¡-¼o*)­¯€¯Só>~në81ƃýln"šöK°ì"‚ífQÂëåÍ><ÎP¼7h3ü\Ir,Òw«àç²4£k-à1ºÝRÅ øBˆ33IÐu`£ºß‘–%¼F^Š‹Tá0t±“ò’3 ÿ9É/ÚÅ ‘c‘¾Û?—kg³ð4Wêz¨-vk&š ö•fÜ–'¼F&DŽEªð0á„iåJIR"$å Á—Ø(µñqÑ>:’Ðsñp8e§ÑÛÎøæ¨É$è°›mkXðúx1r,RÁJ„“5X(n8’3ÉÇŽ‹äËE„¶qnäX¤oJð·àE¾6 ì‚L4ìL°M޵U¬ˆzM[Æé„“¥ V%K‰tgBÛx—îwÍ–ü€÷ •aë€=ŸI‚^Ó+=Kv2<9©àUÂÉÚ9r,’?ëÚÇ?"Ç"ùRÀgÃèý£-Y?°ãÀ>É$A¿;º°2áµÑÇ…*¥‘’ëø^B"IJ„¤'gÚÇy‘c‘º±¥ÀîÎ$@SÀö‹Y )ÍÄ3|©£>eâë{ð5AD’,ñµÙ”¬Û_o- ©#ÛxØÝNh#ûFŽEjbãÁ&d’ —À6ŒY [ƒðºx"r,m§^Cck‹¿~x¦N+íE]ºRIr¿1 µëö}à~|À’Ëñ¡0­V»äµz^´(ÚT½º(“oXw£ žT¦!)ç®Ä×[v{”äŒ- \ l”¸óàëPø}œ˜ÚJòýR×לú3¡Ûî«‘c‘üú4¡ü3r,’O€)„vRfo*ÉÛ¯8 ,9vX™Å¥Fë ²‚\ëOzyüâ†#9¦DHª‘Ü„U{Nå–»&“Íû®¯$u¤‰& Tƺ0¢øõkhC8鞦ÏK5’ÃcªÊ%Û/ÚÝ+qç‹Àg ð(¨Ž¥¾4}¾ê‘%Çñïêö(‘êd!%͹aÁÎÀÏÑ2‰o\| êémŒäk@IfÝFè²Û?r,’okÚÊ¿"Ç"ùÕßo¬ÔVV‰Ž8‡ïŸ › ¶KìÈ:À†„×ÃC‘ci;}íDz–€z„D¤¯æá«Ó—hx,:;ÿð²^âÎÛ5¡pCœ˜:Šz„¨¯‰Ðx`hñëI}|ìmóÐ\êj ¾ö­œøZkH%ê’j½|\üz!`ሱt öc¼þ³”ð+`=%AQhAÅêk"´RâëúøX""%†·—¬ÔÝRO¶ ð0p áúð6°Ž€ÂŒh¡u6m±Ñ@}I„ ÀЉÿ+’ÞPT’|OQ"ÔPV; _èt­Ä7þ¬…[âÄ%Eêj ¾Ô-,Püú}`rßÑ6§°ô†¡¦°ÑÀ%À‰;gÇçAA¯ÛøÔ#Ô@}I„4,&}¡!©D‰PÃÙçKEw>D?'&)C=B Ô—¡1%BÒ[zKo(jö |è«”Í~ŒW”;êj %B"’W/’çåéûr€­oÜy¡§á `£ð€Qø¹…5ƒ$Ô#”S·–üÞ5r,ÒV%´™§"Ç"­áUB›Y±Â±Ò#+€ 63³MÆu¾p"<\¼s–ÁéVŸý(¥ï>Ox¨p½ÎÔ#$"y¦á±º°Å¿?/@á=ƒaÀ[Åï Žþi𩦇+YZP1‡ææàÙé K¤'«>Õ<9i ¿$´™c"ÇÒ¢lçâæ¨É^ GÀÊö°le09qðTƒ›µ¤ì@xÜ9–¶SkÐ @ÿâׯà{ψˆÔ›z„jfÃÀ.n ¬Ì=8 Ø /–û©Ü , ü xü0à:óýÅZÅÀïbQGêÊ¡ÝÙéÍ‘c‘Ö±2¡Ý<9i Ÿ%´™û"ÇÒBl°ç3½@¯‚mÚ«Gí >J<ÈЏÎîˆDíDxÜ9–¶SkêƒD¤Ô#Ô+Öì8<Hþ½~¬ …^%“/Ì]x³x×O ¶¨1¸ÞÌúë_ù>Í"lµ"pMŸo Zƒ¶ÖZhÓUé­ÿÓ‹_&¬f/]ØRø°Ö€AÅ;?ö‡Â^Pø°–G-ÀKÀŽøjÓ€ëÍw¨ÆPà$|–è¬âcÜŽb'ß.~lƒoà= ˜P¼ohâ¸~ÅûþS<æEàTààbY¸¯k†'y»Uù{Ħéó9t¡›n‡ ÇŠ”|ŠÐn´`›Të%B»Y>r,9e{€½Ÿ {l¹º=ì›xð³«ü±R±û±ÀX<¹°xßž‰ãîÄ“šG€ñâxÓ¤’sñdê`` ž M>K—Û§øXÄ“­õ?á5PûWù»Ä”,GùcäX¤èÂIÙ,n(ÒB’‰Ðs‘c‘Öñ¡Ý¬UáØcÃÁ.Ë$@³ÁN«û”wŸä=K÷Ôtç@àk™ûùCqRâ¾;ñž¿á™c(~½>,ô½Ì1Kâ½CÝ%Bý€w«ËÄw9¾WfÞ}‘ð¨Ôó%½Të %ÙX?®G ÒÔ¥+µH¾Çd/”ÌÆW‘î%{Ø oГž l ,ì \\áøKñs¶=°0/ü-çº^OÞÅg­lˆe'èL¢çV+£ðaÕÓ2ß[ï}Z„|o®¡ªµF(ùf4µHÇQTK‰PŠõû>p?é$è `í&Aà3–>(~½qDžгž´|òЦ—¹/idÇMëáçFÿ…%o§ÿí[T#Ô@ê’fÒ Xj¡DèlYàJ¼Ž¦äàëPø}£Ÿ½ó ÞÃ{Q*Íì œ÷ ’¸0µ}*Õ®‡×• Ä—æx¹‡Ÿ3|Õì“3ßÛr{“|SPÕÚ#”ÜO‰ˆ4’!l?¼^*™Ý ¬ÕŒ$(aNñßJ¤‡ãÉRòÂ=OäJ_÷ÆýxÐÀbÅûúãu>#èþƒÖGxÁõ>¤{±¶Ák“¶íe1¨G¨jI„úÆlçÑs—¤H’¦ÏK-’‰PîŠn#Á®Á‡¾JËÌþØ ¯59 Ò–J•z„^ÂkŠÁw¸ï•yx8øv/žw°^ý&ž·Þ,þÛoá³ÄîÃÿvïà{¯ý8¨1Ä¢¡œY€P½>%r,ÒZÆÚŽÖŸ’jJh7'FŽ¥ÉlS°‰™Ya/€­%X>HvöVw–vÇ{cJ‰ì0|&To–C,Q|ŒÕð)å¥åIO³ïÎH`«bÜ3fªíH5Fg¾îm»™ŒO—ÎŒ¯‰s4á¿áSο…±"Ë8X´øõ¹_{§Ýš|ë×Ëã“I²z„꬀²KiªKðZÇ£€ó¢F#áTÒ|æÁü°ÌyðÄaä¿kÊ 8æ!¸øuša.{Ûæ¿Ö*¯ÁÌÕà©b÷\ôØz¸õ6ÉhµÞéó¯Ç¢Ý˜nº5çÖÏàu#5ø|ƒ9ˆM·6¾BþŒ ¶1ßµâfƒÑ±ÿN]n·â/Ô9`ëä Ý0¼ÇPêh½Ÿ9X¦øõÇÀ«uHÚØ¼ApÞŠpz⾯kOƒÿ oÍéî'¥£ÍŒ-~=_<¯7r8,†ù?·â›±g7Toð$¾ôr¹ IDATø\õ6VkR2¯?[ë­“ŠÄ›¢–.ÁÍ€{Š_ß l^¯`¤í^ãð²ƒÔ/]hBq¨y»? ˜Y€4úù¤Ïv®+~}=é™U­j0éÕ‚ëy‹qqnõ¸EzåÓ„ÆÓæ¤ÎÆò¿¶ó…·À¦^5w*Øn£ÏÌÇãÌàƒ5ý|ÒgÉUu/‹ˆ´™Z6]mó©¬Ò@‰O^×ÍÆÿI|ðG°“ÁYÀx>^­=¸ÒZ¯X²ÓhÉi˜Z¡©‰¯•Iž6ÀWÎýßø°ÕiОJ/yøañ¿«ãC’_J„D$Wæ'tSO­p¬HÒÒ„¶31ÜmÀÎÉ “Ø`cˆÁPƒIÅ'zÏ`¾F<ÔÅ„vkkiSµôM#,è4´ÆÇI(ÌÂÑÀAø¶%k€Õ}WéLN(þw!à‹õ~©õ‰HîL!|B[ r,Ò:–"´›n–]°Ï€½™éšöµzc0ÈàÍâ“MàÑⱊ÷ MׯxߊǼˆozð‡ ±¬Ü ÌÁ'2Ü4|QÊ&S"$"¹s¡x±Ï#écíæ¿½ûQ[lB¦ˆz.Ø }]|ÑàââV»‡Ï/ýÇ8_-{}àÂâ}{&Ž»Oj6Ž)wIâ¸sñdê`üo´#ž0}HºVê!àŽÄÿ÷)>Öñdk}àOÀ\|5æv1‘ÐnÆFDD¤èÂÓ‘‘c‘Ö‘L„&õþÇmØeÖúØÐÊ?ßÍ£ÂuÅúw•?r ¾[lÒ (NJÜw'>M?Ûkúa–ÚrøÐ_v}œ%ñÞ¡î¡~À»ÀÕe⻜0Ü×êà‡Ò^TCâ†#"í¦Öz„_¯T@¤#ôqsÃÂ{`Û?ŽH|cw`*+¼V× ß­òøKñäf{|I€qøâå¼@×áœwñíD6ćӲÛOžë!†•€Qøò§e¾·0Þû´0¹‡ÇhËá³Á{gDŒ%¯¶Â×Áúzì@DZQ­5BJ„$’Â( ‚÷”¬ < ¶qoÍ`qB‘ôUþØW½1«áIË÷(ŸèM¯ðX#{8nZ?7¢øïl|(,y{8…¾^çEòýå…nêlãh¿º0‘¦Q4S/‹¥{R¸ìyàZ`tñÎÑÀ`‡û÷«òÂp˯«8~4¾ië¥x2V2˜Ú~§g‹ÿ®‡×• V^îáç x 89ó½ñž”7kˆ'o”U¦MƒEú Ö¡W[!Œ!½à™H“Àˆ'w.û…ïaÖ=óÙg‡ÿ{G¬âI‡ãÓà“SúW&¾îûñ: 3€ÅŠ÷õÇë|FÐýpâGxÁõ>xâS² ^›´m/ãÈ+%B]­ƒ'¿¿,~´ ^(Ÿ\ªa8ðe<9‘:z†PøúéȱHkXŒÐfª†ª‚ +Lg‹¨ï[¨ìOÀ2o$îÍÚ¯ðDèà^¼0ùTàx=з‹ÇÝIùäêVÒ[z,<ïañ>¼õ ›ÈÞGh3y_𲾌ŸïW€kð„ø&ü܃ï›÷pVâgÎÇëÍTh.Rg×Þ öŠ‹´†%BàSèíÄâ”úd24Á§Þ'Ž„/LItf O¸4^¤½1¡Gt^´º|/g°Dñ1VÃk=J…ÔIO³ïÎH¼`vw|¶Y;y›Ðf–ŽKlcðbñäjèk’à’í‹÷­l'ìÙž#©ƒ³oP'Ç EZÄ¢„6Ó úÛìãL24lGƒÕ îÈtý´1qTmðpéš½“ñ¿Ó¦bÊ‹ íe*ª…ù*>A Û³s9éDàbàéâý'4>4‘ÎtáMê·qC‘Ñ„D|û {¹”ë d–È)óæR˜›H€Þ4Ø®q1ôʦÀüïòOüSÿ`¿˜AåÀxB{y•ø™]ðdi“æ…)Ò9.&¼Q}#r,’ÉD([ÓÐ6ìÉ2ë SiñEiºø´ïÒf«Ùk;Ù|x-Ùîô~O©³£¶r»`‹$-LÔDÀæ»¶L2t+Ø‚qb’2Ö'´•W"Ç""Ò­µH/§‚iéI!(.¾x2ؼL2ô"ØÊñâ’„ïÚÊ¥‘céV?|îÒ–."Ò“Q„¶29r,€í65“ }¶}ìÈ„[ meÿȱˆˆôèO„7¬Ã#Ç"ù–³DÀÖ›˜I†æ‚}'vdl0ÐV´ÔˆäÚa„7¬k#Ç"ù–\{êÝȱ$Ø"`÷–©º LU6ߦ„v¢çE$÷V&}qÓrîÒœ&B6ì‚2ÉÐ#`cbG×aN&´“óã†""R× o\kGŽEò+¹‰æ{‘cé†6+“ ½¶AìÈ:Ƚ„v²GäXDDªráëÛ‘c‘üjDÀ¶{7“ ÍSÑnã %½~Ð"qéÎÁ„ Ü_"Ç"ù5’ÐNÞK¶ØSe†ÊÎë;º6ö9BùwäXDDª¶,áÍë#|UX‘¬J„l8Ø e’¡¿‚Œ]›:‹ÐF~9‘^y™ð¶aäX$ŸFÚÈ‘c©’õ;­Ìâ‹Ïƒ­;º6ôBÙ)r,""½r á ìøÈ±H>µ`"Tb{€MË$C€m;²62˜ƒ·9x¢ˆHËØ‡p‘»#r,’OÉDèÃȱÔÀÖ{5“ ÍÓú؉Ð>‰‹ˆH¯-Ax›ÏþIZ€–N„lQ°ÊÔ ]6_ìèZÜy„öñƒÈ±ˆˆÔä1ÂÙA‘c‘üI&BS"ÇÒ6ìâ2ÉÐÃ`‹ÇŽ®E "½oá&qéÍQ„7²{â†"94œ¶H„JìH°Ù™dhØz±#kA»ÚÆË@!n8""µY˜MX mlÔh$oÚ,°­ÁÞË$CÓÁö‰Y‹¹ŽÐ6N‹ˆHŸÜLxC;!r,’/ó“^oªMØ `Ï”*û¡O¿— F‘^Mz\ÜpDDúæK„‹vŽ–¤6M„l°?—I†n;ºœ;ŒÐ.Š‹ˆHŸ Ág•ÞØÆÇ Grd¡]|9–°~`g–Y|ñY0õrtïaB»84r,""uqáíÜȱH~´J"4ør7·*¦ÈÛ^Å:¡d2ô>Øçs«Z‰Ð&f Å GD¤>6!¼¹½‹OJhS#ÇÒ“å€G3··ñ¸«¼PÛ:`ÿÍ$C³ÁŽjPÌ­êtB›øSäXDDê¦@zï±]ã†#9Ñ*‰PÖŠø&±§÷îÇl1°‡ÊÔ ýlp#m1ý€‰„6±sÔhDDêìÂÜõ‘c‘|BhÓ"ÇR­ñ¢ÿëñ w/Ù`°KË$Cz¢ÔÑ6'´‡ÉÀÀ¨ÑˆˆÔÙ øTXçƎŠŽä@«%B€Û'ño}`Gãû’%“¡×|­cý†Ð~9‘†xðFwxäX$¾d"4=r,Õ8¯ [Ÿ‡³Ï‹¦“ÉÐ4°=ëóø-e(¾¨f©=h5niK‡ÞèžEËæwºùhDèp¼'³Î{^Ù8°ç2Éмâ´ûNZ|ñ Òï ""mi$>%¶ô†·CÜp$²d"4#r,=Ù˜üXX%qÞ÷‡·`)S7ôg°úþø¹×¯»*µ…câ†ó?[¿ŽDÎl|1ÂóžlÓ‹ãW¾Ñ XªÕNíç"`Ë~Ní¥gÞðþÞÌ'–ÜLk$BÉBÿì­N3›¬?¾G6zlùú(Ʊjâ˜Wñ’ˆñDwrñ÷ùzâ˜ÙxÂr%¾`éÕøRÐõþÅçz¿`¿üÈ®ÅõgàD¯Rû9ÿû'7\^ÿ;ïVçXzÛ†ª9ÿï‘«tNÕ^ªt á ð/Í|bÉ„6ðIäXrÈæ»¢L2t?ØèØÑÕÁçHÏ\4Rcð¡Ù+÷­¿Ñ&‡6¶/Þ·°5Þf½îS5«˜Åߨ¯JÜ·%þwÝÖ˜ˆ¿Ï–f"Ã{±®(>‡{%~þ×ø©äPàñ2Ï}Þ{Y2 ¿hžœ¸ïUüï¶Dâ¾ÇñOåà=kïâŸÈKÖÇ/˜å.l|c޿ϼãŽL|g(w=UÓ~Â}Ç‹ÿ­½ª|¥6TÍù/—õtNÕ^ª4ï–5üøt3Ÿ\rA‰PUì˜2‹/¾ ¶vìÈúè^Âù9$öUü"•íÙ¹œ®5ã]ôï'ôð˜ËâŸT»»U³VTµ«˜ï€ÿ ³Ÿn¿çm\üþ™ïO@Ç¿ÿkº_Íû\¼§)kqübV2ÿvâ¾WñÞ©¤†ƒvǯÙÞŠ;)a+mÌ»{æø£ð÷‘äßêk4~X¬Úös é]žÀg7u§Ymh*Ÿÿr‰POç´¥ÛK3×-ù!ó*ßkâsK>¨F¨*…³ñ®àw. <–}q·ŠMðÞ ð‹È#Ʋ<þæ›-ØÏÖ$€¿¹.¯„~f96ëîV©ˆvþþ8ØãïÎ xÛx+sÿ¯€âC%óŠÏ›ô,~ñž |دոêIÇ®L(óÜïàŸþoÂ/¸ïS~Õõû2ÿOþ>Ëc?sLw ̸⿧â…ö¥Ûøp{²'á?Åãçëæ±ê¡Úöó|J÷p¼¾eMÒ½HYÍjC¨|þËé霶t{iF±tÒYxV[À‹žVA‹©‰”Qø+ØxàFÂtÔ¡ÀïÁVN†BO˼9>ñõøx},S)¡,W‹µž<ŒÀë èæ1ߢçD©’Ÿã=8PyCâ¹ô<Ñe&þ©w>äPRúô?ï‘;?Þ/]ø.þž\Ú'Ûãѯ?Y ¦¸/σ'»=Å_nxh‰2÷•â/Æ}»Ì÷“…·CŠÏ=§ÌqõRmû¹¸b]¯y¸‡ÇmfªtþËé霶t{iöJ¶Oáoìà¤ÿkòóK\êê• Àx|¶ÃÿîÄ‹û®ëãþgM³.a±³9À"Æþ)p ¼x5i£ÌÿÁ–;/¸ü žŒ–³0 OðÊÝŽïæçÀW1ÿ ^X:±Šø_À?U'g»ôÇ/:ßÁ?ð¶“´!Þ“´ Þ†æá§{¿÷)Âßàßx-IÒúÀÚÀ—ðaÂñ‚Ôìß±» i2þ…ðž­dü›us|é“ÿ\|8¤t+àµQ'އ¸nd"TmûùòÙÿ_Yáq›Õ†Ö¡òùϪtN[½½4Ýz„:Ùx·—t†þ¤Ï½TÅúƒ]¦ˆúß`ËÆŽ® ×Î{¥‹A3 ^Çg°•6ƒ>ãL?\<„·Û‹?sN79?ÞcÔÝ­»…ÛªYÅükxýEé÷üÍþÁâ1ýñâSÃ{(Æý >…üâ÷þ)yóâ±'â½ý‹ˆ–z÷Á/@Ië9´øÿ~ÀO‹÷ý*qÜD§j/5øáñ’XAHÓ%¡F~bkSöå2‹/NÛ"vd=Xÿäiø×*qÃùŸ Ót?Ä/`Ç.dâ5É^—]ðß¡žûÏU³ŠùEÅÿ'·_Y ï%˜WŒé­J–LJb r1ü}·T¸Zz̙ş‹S'6é!‰^lø´äYøç2¼µ´eÁDz¾°'f“‹Ïý>>äxa¦Pö¶~Ñ3|m:ÃÁlÝ]øE²Ñ*µŸ’øßøîÆRKªtþ{›©½Ô`‰šKø#í­J„úÈÆƒ½‘I†fVùg›®€Š+ó?Å §‹ùðOÇ»S¾>(ïá½{ãLˆ_@ö¦üRãðÕ€?ßÍ÷ï(sÿ§ñ€Å‹ÿŒ¯TÛ;ÙOȆ{àCxýð–r3’?·fñ¹W/óýeðiÖ£Ê|¯ªi?#ñ„úÀ&ÅÔ•Îo©½ÔàFÂäcô~9oi=ÉDhn…c¥[6ì‘2Ceçƒu76†H/—д\¥.6$ =ÔÓ’ø'ûC÷-ƒ÷(|¹ûz^â †ãðš”îjËÚ‰ÚK Æâ•æ¥7ÊØ;KãP"T'6ìê2Éн`‹ÄŽ/n|‡p¾ÏèùpÉ©iÌþ§áíâI|úöÒ @öÖøP`^&ŒÅk´’52@í¥ß#¼Q~@פ½(ª++€67“ ½¶fäàÎ'œëWèŒOÄíh,]gŸÕËx’ð|M_,M¾¶nŠ÷mFgÍ‹ÚK¯ ŠÊÓŒi¬Ò¹n¥5prζ›’I†¦‚Õ{O£j­'º¥s½S¤8DDZÂV¤/Ž›GFM‰PCØÊ`/f’¡y`'yÏQÓôÇW7.ç{>\DDÀÇüJoœÏÐýþ'ÒúJS©-v íÇ»­LÝПÀ†UþùºøáüNûÊED¤‚Åñâ§ÒèqqÑR"ÔP6ìge’¡'ÀÆ6øÉÅkýJçWû ŠˆôÂ7 o Sñb&i?ÉÚ‘N*"l2;lf&zlÓÊ?[³+ çö9Zsm‘hÞH¯‹Ž4ˆ¡¦±Ï€½Yfñů5àÉ6'ÝÛ׈)´""moCÒÊíâ†# 0‡p~›½éo²¥À+3Tvn_HX3Åðš?©QiÃ÷ÒY çÃ¥Å(j: öÛ2ÉÐ]` ×á J‹^ë·xχ‹ˆHOÄ7|+½±Þ€†PÚÉl¹ն*Mc°ï•Y|ñ%°rûðTkkÒ½¸Ñ60i';‘®78:n8RGJ„¢²À>Ê$CíRÃ-NØÙÜ€ÛP/ŸˆHÝü„ðû ¾Z­´¾d"4 r,ÊV›I†æ‚ЋÅûwÎåÀèFE,"Ò‰Þh_Á‡Í¤µÍB‰PØ(°;ÊÔ ýÞkŠ*:…pç áEDb,ð>á ÷zT/Ôê”å† ûe™dè_`=­ãµé¢÷›®ˆH‡Ú™t½Š1[Û'„s©­TrÁû$“ ½ ¶q™ƒÞ$œÃÛQ]ˆHÃý”t½ÐzqÑ>P"”K¶q1ùI&CŸ€}%qPàNÒuA‹ÆˆVD¤Ó þAx~5"©ÕLÂyÔ ¹bKƒ=^f¨ì>ŒÆI¤ë‚¶ˆ®ˆH‡Kº^è:T/ÔŠ”åš ûC×dèíÇ`¡d]ÐI‘éH»®:2n8Rƒ„ó78r,R–ÀNìºøâƒU ¸­%"ÍÏÒYøÊ¶Ò:”µ Ûæ}œN†>šOî;2‘N6ø'ábú1Zl±•L'œ»ù"Ç"=Ý/gk†æ‚ý_/_‘:[_`±tA ¬5"©–¡ÖP® 6¸;› ¾‘ëØŠˆtªwÕ‰À˜˜IU¦Ι.¢ùu6á< 9ì¼2ÉÐ?Á–Œ«ˆHÇZ+½a?…¶áÈ;%Bùw,©$ˆ_‡oÙ¡`³2ÉЛ`Æ UDD>Kz‘¾Ð6Ï’‰P5{ZIs@zfæé2CÌ6{'“ Í;°ÙÁŠˆˆÛ˜Kxóþ3ÚÇ*¯¦¢D(¯vfÎÏ]t;³ÏÆ‚=Yf¨ì0M­‰àÒÝù—¢óH‰P>mDº·î_À=ÿˆÍvm™dèV0 Q‹ˆDp:édè‡qÑ2’5]Ã"Ç"nUÒ«¶O ê=Ĭv2ؼL2ô"ØÊ XDDÊ+’N†¾5"ÉR"”/Ë“çäM`ùÞ?Œí65“ }¶}]£‘Šúãû•ÞØçáÃf’ÎÍü‘cétËã—ÎLJÀZµ?œ­ 61“ ÍûN=‚‘êÍÜCºgèG¨f(”åÃ:ÀÛ„s1ؼïk‹€Ý[¦nè*-¾("Ò\ ’N†.C³Éb›B8Ã#ÇÒ©¶"N¶¬ßÃÛ ° Ê$C€iÑS‘&šô0™7£ÙJ1)Šk`&á¼ ŒoÌSÙáe_|lƒÆ<Ÿˆˆ”Ó¸€t2ô°PÌ :؇„óPaz¶ÔÙ7H¯·õ*Ðà™]¶Ø»™dh˜v°i²SI'CÏKE¨3)Šã4Òíÿi I{„Ùr`O•*;-¾("ÒT‡‘þDü°JÔˆ:Ï„¿ÿˆÈ±t‚þt]RâAšÞ#jÃÁn(“ ýÕ×"‘fÙtÄ{€6Œl%BÍ3p=é$è&¢ÕÈY?°Óèºøâvqâé\[’.Úhá·æH&B##ÇÒÎF÷’N‚.%³&m°i‰DHõB""|x‹p‘˜ ƒÖj´äVJ„cðé$èäªmÛj`'€i‘ˆ–Ç÷UÊŒŠT›S"ÔX’Þ†W“n§ûÆ JDDÚÃà,Ò‹/ξô‹W;Hö¸©(½6kÒuVØ“ÀJ1ƒ‘ö³-ðé έÀè˜Aµ8%B}s(0ƒt›¼3(i_cèº0ÝÀcÕÂ’‰¥j¯ª·^¯–l‡{Å JDD:ÃàtÒCeü _¼Nª§D¨wÇâõ?ɶ÷8j{""Òdëo’¾ ÍÄw¶×ÐDuÞ&üí‰KÞm†ïo™ÛÅÀ ˆq‰ˆHü˜CúâôÚ¯¬J„*[ ¸’ôºV¥‚h-ô)""¹°6]W¤6à`™ˆqå]2RÑyZà¤7¦5|ƒà£Èņ©"""A?à+t]„qðhø¢œäF·J„‚ñÀctM¬ ,1.‘ŠFÒµ˜ú9`«ˆqåQ2Z4r,y ¶#""mc<ð/º~ª¿ —•$‹Í;9š8ßU½‰""Ò6úG’¾ÀÍn6ˆZ.tz"48®Ã©\fi‹R~æ·›G‹,®7‡Å"ÇÒL‹à=@ÙÙ€—ñUÌEDDÚÎÚÀéZbÀÀçB´èš¯Ó¡1À9ÀTºžÿ øîñ‘¶·2p9¾ykö‚ø°±¡ëë„ß{ñȱ4ÒrÀùø‚›Ùóý ¾K¼¦Ã‹ˆHÇY–ξ@¶{"´2påÞ_ 3^‘~Jù!“—ïÑžÅÄ“¿g»¬3O†?üŒ8IDATpn |MØýtÞ¨ˆˆHUz*¢ Ü ,+À:k—D¨lœ¼G×sgÀmø~a"""RÁHàxÊO«.­/s Þ³ÐÊCgÿ%üNc"ÇR‹e)žæá=CëÇ PDD¤• ön¡|‰ákñüX+RŒ}ÑŠ‰ÐH|+•û(?ôUÎ<X>RŒ"""mg1àhʯV]ºý8†Öfzû’‘céÉ`à÷À Êÿí?À·ÇØÕÿˆˆˆ4ÔêÀHרdë‰Î¶†Ç ³¢¼&BüoüM|h+»|é6 ø3°;¾M†ˆˆˆ4Qà³øªÕåfœ•n³‡ðBì­ð!·ì¶Rñ6Ø_í¹'ïàÉâ]ÅÿÓ€ØDD$G”µ¯…ð5lJ‰Ñ*T>ßóð¡«·‹ÿ–zPúj"a‡õeŠÏW«áøðÖJ™Û8¼·¬’€{ ÉÏ3Ôçw‘¡D¨s,†ïx_JŒz;Üó ð,!Az˜|\æ6OªÊ™HωÐüx‚Sº%ÿ¿ °!áéíôû©ø*Ï¥Äç ¼È\DD:”¡Î5Ø ï=)%ËãÅØõ0O<²IÒ¦„Þš'Á¤ŸzµÉÉ„¤íàø0`w šˆˆt %B’4O†²CM+’ÏÙRŸHá•nïGŒKDDZ„!©Ö0` <1Z¯A*7|5Aí;¬O£üp[iÈ-™ð¼‚zxDD¤”I£ !•¦Ë€ÑÅcvÆ›d²£bei[/ÖéY6r,""Òáj¾iyJ„¤Ù’C_𑍔‰ˆˆHÇR"$1©GHDD¢R"$ͦYa""’J„DDD¤c)’fS±´ˆˆä†!éXJ„¤ÙÔ#$""¹¡DHDDD:–!i6õ‰ˆHnü?+‘7% !EIEND®B`‚pygame-1.9.1release/docs/tut/tom/MakeGames.html0000644000175000017500000002157410032735501021333 0ustar vincentvincent Making games with Pygame

    Making games with Pygame

    Revision History
    Revision 1.15th March 2003
    Corrections, included full code in 6.3
    Revision 1.02nd March 2003
    First release

    The most current version of this document will always be found at http://www.tomchance.org.uk/writing/pygame.


    1. Introduction

    First of all, I will assume you have read the Line By Line Chimp tutorial, which introduces the basics of Python and Pygame. Give it a read before reading this tutorial, as I won't bother repeating what that tutorial says (or at least not in as much detail). This tutorial is aimed at those who understand how to make a ridiculously simple little "game", and who would like to make a relatively simple game like Pong. It introduces you to some concepts of game design, some simple mathematics to work out ball physics, and some ways to keep your game easy to maintain and expand.

    All the code in this tutorial works toward implementing TomPong, a game I've written. By the end of the tutorial, you should not only have a firmer grasp of Pygame, but you should also understand how TomPong works, and how to make your own version.

    Now, for a brief recap of the basics of Pygame. A common method of organising the code for a game is to divide it into the following six sections:

    • Load modules which are required in the game. Standard stuff, except that you should remember to import the Pygame local names as well as the Pygame module itself

    • Resource handling classes; define some classes to handle your most basic resources, which will be loading images and sounds, as well as connecting and disconnecting to and from networks, loading save game files, and any other resources you might have.

    • Game object classes; define the classes for your game object. In the pong example, these will be one for the player's bat (which you can initialise multiple times, one for each player in the game), and one for the ball (which can again have multiple instances). If you're going to have a nice in-game menu, it's also a good idea to make a menu class.

    • Any other game functions; define other necessary functions, such as scoreboards, menu handling, etc. Any code that you could put into the main game logic, but that would make understanding said logic harder, should be put into its own function. So as plotting a scoreboard isn't game logic, it should be moved into a function.

    • Initialise the game, including the Pygame objects themselves, the background, the game objects (initialising instances of the classes) and any other little bits of code you might want to add in.

    • The main loop, into which you put any input handling (i.e. watching for users hitting keys/mouse buttons), the code for updating the game objects, and finally for updating the screen.

    Every game you make will have some or all of those sections, possibly with more of your own. For the purposes of this tutorial, I will write about how TomPong is laid out, and the ideas I write about can be transferred to almopst any kind of game you might make. I will also assume that you want to keep all of the code in a single file, but if you're making a reasonably large game, it's often a good idea to source certain sections into module files. Putting the game object classes into a file called "objects.py", for example, can help you keep game logic separate from game objects. If you have a lot of resource handling code, it can also be handy to put that into "resources.py". You can then "from objects,resources import *" to import all of the classes and functions.

    1.1. A note on coding styles

    The first thing to remember when approaching any programming project is to decide on a coding style, and stay consistent. Python solves a lot of the problems because of its strict interpretation of whitespace and indentation, but you can still choose the size of your indentations, whether you put each module import on a new line, how you comment code, etc. You'll see how I do all of this in the code examples; you needn't use my style, but whatever style you adopt, use it all the way through the program code. Also try to document all of your classes, and comment on any bits of code that seem obscure, though don't start commenting the obvious. I've seen plenty of people do the following:

    player1.score += scoreup	# Add scoreup to player1 score

    The worst code is poorly laid out, with seemingly random changes in style, and poor documentation. Poor code is not only annoying for other people, but it also makes it difficult for you to maintain.

    pygame-1.9.1release/docs/tut/tom/games6.html0000644000175000017500000015067007670446465020711 0ustar vincentvincent Putting it all together

    6. Putting it all together

    So far you've learnt all the basics necessary to build a simple game. You should understand how to create Pygame objects, how Pygame displays objects, how it handles events, and how you can use physics to introduce some motion into your game. Now I'll just show how you can take all those chunks of code and put them together into a working game. What we need first is to let the ball hit the sides of the screen, and for the bat to be able to hit the ball, otherwise there's not going to be much game play involved. We do this using Pygame's collision methods.

    6.1. Let the ball hit sides

    The basics principle behind making it bounce of the sides is easy to grasp. You grab the coordinates of the four corners of the ball, and check to see if they correspond with the x or y coordinate of the edge of the screen. So if the top right and top left corners both have a y coordinate of zero, you know that the ball is currently on the top edge of the screen. We do all this in the update function, after we've worked out the new position of the ball.

    if not self.area.contains(newpos):
    	tl = not self.area.collidepoint(newpos.topleft)
    	tr = not self.area.collidepoint(newpos.topright)
    	bl = not self.area.collidepoint(newpos.bottomleft)
    	br = not self.area.collidepoint(newpos.bottomright)
    	if tr and tl or (br and bl):
    		angle = -angle
    	if tl and bl:
    		self.offcourt(player=2)
    	if tr and br:
    		self.offcourt(player=1)
    
    self.vector = (angle,z)

    Here we check to see if the area contains the new position of the ball (it always should, so we needn't have an else clause, though in other circumstances you might want to consider it. We then check if the coordinates for the four corners are colliding with the area's edges, and create objects for each result. If they are, the objects will have a value of 1, or TRUE. If they don't, then the value will be None, or FALSE. We then see if it has hit the top or bottom, and if it has we change the ball's direction. Handily, using radians we can do this by simply reversing its positive/negative value. We also check to see if the ball has gone off the sides, and if it has we call the offcourt function. This, in my game, resets the ball, adds 1 point to the score of the player specified when calling the function, and displays the new score.

    Finally, we recompile the vector based on the new angle. And that is it. The ball will now merrily bounce off the walls and go offcourt with good grace.

    6.2. Let the ball hit bats

    Making the ball hit the bats is very similar to making it hit the sides of the screen. We still use the collide method, but this time we check to see if the rectangles for the ball and either bat collide. In this code I've also put in some extra code to avoid various glitches. You'll find that you'll have to put all sorts of extra code in to avoid glitches and bugs, so it's good to get used to seeing it.

    else:
    	# Deflate the rectangles so you can't catch a ball behind the bat
    	player1.rect.inflate(-3, -3)
    	player2.rect.inflate(-3, -3)
    
    	# Do ball and bat collide?
    	# Note I put in an odd rule that sets self.hit to 1 when they collide, and unsets it in the next
    	# iteration. this is to stop odd ball behaviour where it finds a collision *inside* the
    	# bat, the ball reverses, and is still inside the bat, so bounces around inside.
    	# This way, the ball can always escape and bounce away cleanly
    	if self.rect.colliderect(player1.rect) == 1 and not self.hit:
    		angle = math.pi - angle
    		self.hit = not self.hit
    	elif self.rect.colliderect(player2.rect) == 1 and not self.hit:
    		angle = math.pi - angle
    		self.hit = not self.hit
    	elif self.hit:
    		self.hit = not self.hit
    self.vector = (angle,z)

    We start this section with an else statement, because this carries on from the previous chunk of code to check if the ball hits the sides. It makes sense that if it doesn't hit the sides, it might hit a bat, so we carry on the conditional statement. The first glitch to fix is to shrink the players' rectangles by 3 pixels in both dimensions, to stop the bat catching a ball that goes behind them (if you imagine you just move the bat so that as the ball travels behind it, the rectangles overlap, and so normally the ball would then have been "hit" - this prevents that).

    Next we check if the rectangles collide, with one more glitch fix. Notice that I've commented on these odd bits of code - it's always good to explain bits of code that are abnormal, both for others who look at your code, and so you understand it when you come back to it. The without the fix, the ball might hit a corner of the bat, change direction, and one frame later still find itself inside the bat. Then it would again think it has been hit, and change its direction. This can happen several times, making the ball's motion completely unrealistic. So we have a variable, self.hit, which we set to TRUE when it has been hit, and FALSE one frame later. When we check if the rectangles have collided, we also check if self.hit is TRUE/FALSE, to stop internal bouncing.

    The important code here is pretty easy to understand. All rectangles have a colliderect function, into which you feed the rectangle of another object, which returns 1 (TRUE) if the rectangles do overlap, and 0 (FALSE) if not. If they do, we can change the direction by subtracting the current angle from pi (again, a handy trick you can do with radians, which will adjust the angle by 90 degrees and send it off in the right direction; you might find at this point that a thorough understanding of radians is in order!). Just to finish the glitch checking, we switch self.hit back to FALSE if it's the frame after they were hit.

    We also then recompile the vector. You would of course want to remove the same line in the previous chunk of code, so that you only do this once after the if-else conditional statement. And that's it! The combined code will now allow the ball to hit sides and bats.

    6.3. The Finished product

    The final product, with all the bits of code thrown together, as well as some other bits ofcode to glue it all together, will look like this:

    #!/usr/bin/python
    #
    # Tom's Pong
    # A simple pong game with realistic physics and AI
    # http://www.tomchance.uklinux.net/projects/pong.shtml
    #
    # Released under the GNU General Public License
    
    VERSION = "0.4"
    
    try:
            import sys
            import random
            import math
            import os
            import getopt
            import pygame
            from socket import *
            from pygame.locals import *
    except ImportError, err:
            print "couldn't load module. %s" % (err)
            sys.exit(2)
    
    def load_png(name):
            """ Load image and return image object"""
            fullname = os.path.join('data', name)
            try:
                    image = pygame.image.load(fullname)
                    if image.get_alpha is None:
                            image = image.convert()
                    else:
                            image = image.convert_alpha()
            except pygame.error, message:
                    print 'Cannot load image:', fullname
                    raise SystemExit, message
            return image, image.get_rect()
    
    class Ball(pygame.sprite.Sprite):
            """A ball that will move across the screen
            Returns: ball object
            Functions: update, calcnewpos
            Attributes: area, vector"""
    
            def __init__(self, (xy), vector):
                    pygame.sprite.Sprite.__init__(self)
                    self.image, self.rect = load_png('ball.png')
                    screen = pygame.display.get_surface()
                    self.area = screen.get_rect()
                    self.vector = vector
    		self.hit = 0
    
            def update(self):
                    newpos = self.calcnewpos(self.rect,self.vector)
                    self.rect = newpos
    		(angle,z) = self.vector
    
    		if not self.area.contains(newpos):
    			tl = not self.area.collidepoint(newpos.topleft)
    			tr = not self.area.collidepoint(newpos.topright)
    			bl = not self.area.collidepoint(newpos.bottomleft)
    			br = not self.area.collidepoint(newpos.bottomright)
    			if tr and tl or (br and bl):
    				angle = -angle
    			if tl and bl:
    				#self.offcourt()
    				angle = math.pi - angle
    			if tr and br:
    				angle = math.pi - angle
    				#self.offcourt()
    		else:
    			# Deflate the rectangles so you can't catch a ball behind the bat
    			player1.rect.inflate(-3, -3)
    			player2.rect.inflate(-3, -3)
    
    			# Do ball and bat collide?
    			# Note I put in an odd rule that sets self.hit to 1 when they collide, and unsets it in the next
    			# iteration. this is to stop odd ball behaviour where it finds a collision *inside* the
    			# bat, the ball reverses, and is still inside the bat, so bounces around inside.
    			# This way, the ball can always escape and bounce away cleanly
    			if self.rect.colliderect(player1.rect) == 1 and not self.hit:
    				angle = math.pi - angle
    				self.hit = not self.hit
    			elif self.rect.colliderect(player2.rect) == 1 and not self.hit:
    				angle = math.pi - angle
    				self.hit = not self.hit
    			elif self.hit:
    				self.hit = not self.hit
    		self.vector = (angle,z)
    
            def calcnewpos(self,rect,vector):
                    (angle,z) = vector
                    (dx,dy) = (z*math.cos(angle),z*math.sin(angle))
                    return rect.move(dx,dy)
    
    class Bat(pygame.sprite.Sprite):
            """Movable tennis 'bat' with which one hits the ball
            Returns: bat object
            Functions: reinit, update, moveup, movedown
            Attributes: which, speed"""
    
            def __init__(self, side):
                    pygame.sprite.Sprite.__init__(self)
                    self.image, self.rect = load_png('bat.png')
                    screen = pygame.display.get_surface()
                    self.area = screen.get_rect()
                    self.side = side
                    self.speed = 10
                    self.state = "still"
                    self.reinit()
    
            def reinit(self):
                    self.state = "still"
                    self.movepos = [0,0]
                    if self.side == "left":
                            self.rect.midleft = self.area.midleft
                    elif self.side == "right":
                            self.rect.midright = self.area.midright
    
            def update(self):
                    newpos = self.rect.move(self.movepos)
                    if self.area.contains(newpos):
                            self.rect = newpos
                    pygame.event.pump()
    
            def moveup(self):
                    self.movepos[1] = self.movepos[1] - (self.speed)
    		self.state = "moveup"
    
            def movedown(self):
                    self.movepos[1] = self.movepos[1] + (self.speed)
    		self.state = "movedown"
    
    
    def main():
            # Initialise screen
            pygame.init()
            screen = pygame.display.set_mode((640, 480))
            pygame.display.set_caption('Basic Pong')
    
            # Fill background
            background = pygame.Surface(screen.get_size())
            background = background.convert()
            background.fill((0, 0, 0))
    
    	# Initialise players
    	global player1
    	global player2
    	player1 = Bat("left")
    	player2 = Bat("right")
    
    	# Initialise ball
    	speed = 13
    	rand = ((0.1 * (random.randint(5,8))))
    	ball = Ball((0,0),(0.47,speed))
    
    	# Initialise sprites
    	playersprites = pygame.sprite.RenderPlain((player1, player2))
    	ballsprite = pygame.sprite.RenderPlain(ball)
    
            # Blit everything to the screen
            screen.blit(background, (0, 0))
            pygame.display.flip()
    
    	# Initialise clock
    	clock = pygame.time.Clock()
    
            # Event loop
            while 1:
    		# Make sure game doesn't run at more than 60 frames per second
    		clock.tick(60)
    
    		for event in pygame.event.get():
    			if event.type == QUIT:
    				return
    			elif event.type == KEYDOWN:
    				if event.key == K_a:
    					player1.moveup()
    				if event.key == K_z:
    					player1.movedown()
    				if event.key == K_UP:
    					player2.moveup()
    				if event.key == K_DOWN:
    					player2.movedown()
    			elif event.type == KEYUP:
    				if event.key == K_a or event.key == K_z:
    					player1.movepos = [0,0]
    					player1.state = "still"
    				if event.key == K_UP or event.key == K_DOWN:
    					player2.movepos = [0,0]
    					player2.state = "still"
    
                    screen.blit(background, ball.rect, ball.rect)
    		screen.blit(background, player1.rect, player1.rect)
    		screen.blit(background, player2.rect, player2.rect)
    		ballsprite.update()
    		playersprites.update()
    		ballsprite.draw(screen)
    		playersprites.draw(screen)
                    pygame.display.flip()
    
    
    if __name__ == '__main__': main()
    

    As well as showing you the final product, I'll point you back to TomPong, upon which all of this is based. Download it, have a look at the source code, and you'll see a full implementation of pong using all of the code you've seen in this tutorial, as well as lots of other code I've added in various versions, such as some extra physics for spinning, and various other bug and glitch fixes.

    Oh, find TomPong at http://www.tomchance.uklinux.net/projects/pong.shtml.

    pygame-1.9.1release/docs/tut/tom/games5.html0000644000175000017500000002100707670446465020677 0ustar vincentvincent User-controllable objects

    5. User-controllable objects

    So far you can create a Pygame window, and render a ball that will fly across the screen. The next step is to make some bats which the user can control. This is potentially far more simple than the ball, because it requires no physics (unless your user-controlled object will move in ways more complex than up and down, e.g. a platform character like Mario, in which case you'll need more physics). User-controllable objects are pretty easy to create, thanks to Pygame's event queue system, as you'll see.

    5.1. A simple bat class

    The principle behind the bat class is similar to that of the ball class. You need an __init__ function to initialise the ball (so you can create object instances for each bat), an update function to perform per-frame changes on the bat before it is blitted the bat to the screen, and the functions that will define what this class will actually do. Here's some sample code:

    class Bat(pygame.sprite.Sprite):
    	"""Movable tennis 'bat' with which one hits the ball
    	Returns: bat object
    	Functions: reinit, update, moveup, movedown
    	Attributes: which, speed"""
    
    	def __init__(self, side):
    		pygame.sprite.Sprite.__init__(self)
    		self.image, self.rect = load_png('bat.png')
    		screen = pygame.display.get_surface()
    		self.area = screen.get_rect()
    		self.side = side
    		self.speed = 10
    		self.state = "still"
    		self.reinit()
    
    	def reinit(self):
    		self.state = "still"
    		self.movepos = [0,0]
    		if self.side == "left":
    			self.rect.midleft = self.area.midleft
    		elif self.side == "right":
    			self.rect.midright = self.area.midright
    
    	def update(self):
    		newpos = self.rect.move(self.movepos)
    		if self.area.contains(newpos):
    			self.rect = newpos
    		pygame.event.pump()
    
    	def moveup(self):
    		self.movepos[1] = self.movepos[1] - (self.speed)
    		self.state = "moveup"
    
    	def movedown(self):
    		self.movepos[1] = self.movepos[1] + (self.speed)
    		self.state = "movedown"

    As you can see, this class is very similar to the ball class in its structure. But there are differences in what each function does. First of all, there is a reinit function, which is used when a round ends, and the bat needs to be set back in its starting place, with any attributes set back to their necessary values. Next, the way in which the bat is moved is a little more complex than with the ball, because here its movement is simple (up/down), but it relies on the user telling it to move, unlike the ball which just keeps moving in every frame. To make sense of how the ball moves, it is helpful to look at a quick diagram to show the sequence of events:

    What happens here is that the person controlling the bat pushes down on the key that moves the bat up. For each iteration of the main game loop (for every frame), if the key is still held down, then the state attribute of that bat object will be set to "moving", and the moveup function will be called, causing the ball's y position to be reduced by the value of the speed attribute (in this example, 10). In other words, so long as the key is held down, the bat will move up the screen by 10 pixels per frame. The state attribute isn't used here yet, but it's useful to know if you're dealing with spin, or would like some useful debugging output.

    As soon as the player lets go of that key, the second set of boxes is invoked, and the state attribute of the bat object will be set back to "still", and the movepos attribute will be set back to [0,0], meaning that when the update function is called, it won't move the bat any more. So when the player lets go of the key, the bat stops moving. Simple!

    5.1.1. Diversion 3: Pygame events

    So how do we know when the player is pushing keys down, and then releasing them? With the Pygame event queue system, dummy! It's a really easy system to use and understand, so this shouldn't take long :) You've already seen the event queue in action in the basic Pygame program, where it was used to check if the user was quitting the application. The code for moving the bat is about as simple as that:

    for event in pygame.event.get():
    	if event.type == QUIT:
    		return
    	elif event.type == KEYDOWN:
    		if event.key == K_UP:
    			player.moveup()
    		if event.key == K_DOWN:
    			player.movedown()
    	elif event.type == KEYUP:
    		if event.key == K_UP or event.key == K_DOWN:
    			player.movepos = [0,0]
    			player.state = "still"

    Here assume that you've already created an instance of a bat, and called the object player. You can see the familiar layout of the for structure, which iterates through each event found in the Pygame event queue, which is retrieved with the event.get() function. As the user hits keys, pushes mouse buttons and moves the joystick about, those actions are pumped into the Pygame event queue, and left there until dealt with. So in each iteration of the main game loop, you go through these events, checking if they're ones you want to deal with, and then dealing with them appropriately. The event.pump() function that was in the Bat.update function is then called in every iteration to pump out old events, and keep the queue current.

    First we check if the user is quitting the program, and quit it if they are. Then we check if any keys are being pushed down, and if they are, we check if they're the designated keys for moving the bat up and down. If they are, then we call the appropriate moving function, and set the player state appropriately (though the states moveup and movedown and changed in the moveup() and movedown() functions, which makes for neater code, and doesn't break encapsulation, which means that you assign attributes to the object itself, without referring to the name of the instance of that object). Notice here we have three states: still, moveup, and movedown. Again, these come in handy if you want to debug or calculate spin. We also check if any keys have been "let go" (i.e. are no longer being held down), and again if they're the right keys, we stop the bat from moving.

    pygame-1.9.1release/docs/tut/tom/games4.html0000644000175000017500000002276207670446465020707 0ustar vincentvincent Game object classes

    4. Game object classes

    Once you've loaded your modules, and written your resource handling functions, you'll want to get on to writing some game objects. The way this is done is fairly simple, though it can seem complex at first. You write a class for each type of object in the game, and then create an instance of those classes for the objects. You can then use those classes' methods to manipulate the objects, giving objects some motion and interactive capabilities. So your game, in pseudo-code, will look like this:

    #!/usr/bin/python
    
    [load modules here]
    
    [resource handling functions here]
    
    class Ball:
    	[ball functions (methods) here]
    	[e.g. a function to calculate new position]
    	[and a function to check if it hits the side]
    
    def main:
    	[initiate game environment here]
    
    	[create new object as instance of ball class]
    	ball = Ball()
    
    	while 1:
    		[check for user input]
    
    		[call ball's update function]
    		ball.update()

    This is, of course, a very simple example, and you'd need to put in all the code, instead of those little bracketed comments. But you should get the basic idea. You crate a class, into which you put all the functions for a ball, including __init__, which would create all the ball's attributes, and update, which would move the ball to its new position, before blitting it onto the screen in this position.

    You can then create more classes for all of your other game objects, and then create instances of them so that you can handle them easily in the main function and the main program loop. Contrast this with initiating the ball in the main function, and then having lots of classless functions to manipulate a set ball object, and you'll hopefully see why using classes is an advantage: It allows you to put all of the code for each object in one place; it makes using objects easier; it makes adding new objects, and manipulating them, more flexible. Rather than adding more code for each new ball object, you could simply create new instances of the Ball class for each new ball object. Magic!

    4.1. A simple ball class

    Here is a simple class with the functions necessary for creating a ball object that will, if the update function is called in the main loop, move across the screen:

    class Ball(pygame.sprite.Sprite):
    	"""A ball that will move across the screen
    	Returns: ball object
    	Functions: update, calcnewpos
    	Attributes: area, vector"""
    
    	def __init__(self, vector):
    		pygame.sprite.Sprite.__init__(self)
    		self.image, self.rect = load_png('ball.png')
    		screen = pygame.display.get_surface()
    		self.area = screen.get_rect()
    		self.vector = vector
    
    	def update(self):
    		newpos = self.calcnewpos(self.rect,self.vector)
    		self.rect = newpos
    
    	def calcnewpos(self,rect,vector):
    		(angle,z) = vector
    		(dx,dy) = (z*math.cos(angle),z*math.sin(angle))
    		return rect.move(dx,dy)

    Here we have the Ball class, with an __init__ function that sets the ball up, an update function that changes the ball's rectangle to be in the new position, and a calcnewpos function to calculate the ball's new position based on its current position, and the vector by which it is moving. I'll explain the physics in a moment. The one other thing to note is the documentation string, which is a little bit longer this time, and explains the basics of the class. These strings are handy not only to yourself and other programmers looking at the code, but also for tools to parse your code and document it. They won't make much of a difference in small programs, but with large ones they're invaluable, so it's a good habit to get into.

    4.1.1. Diversion 1: Sprites

    The other reason for creating a class for each object is sprites. Each image you render in your game will be a sprite object, and so to begin with, the class for each object should inherit the Sprite class. This is a really nice feature of Python - class inheritance. Now the Ball class has all of the functions that come with the Sprite class, and any object instances of the Ball class will be registered by Pygame as sprites. Whereas with text and the background, which don't move, it's OK to blit the object onto the background, Pygame handles sprite objects in a different manner, which you'll see when we look at the whole program's code.

    Basically, you create both a ball object, and a sprite object for that ball, and you then call the ball's update function on the sprite object, thus updating the sprite. Sprites also give you sophisticated ways of determining if two objects have collided. Normally you might just check in the main loop to see if their rectangles overlap, but that would involve a lot of code, which would be a waste because the Sprite class provides two functions (spritecollide and groupcollide) to do this for you.

    4.1.2. Diversion 2: Vector physics

    Other than the structure of the Ball class, the notable thing about this code is the vector physics, used to calculate the ball's movement. With any game involving angular movement, you won't get very far unless you're comfortable with trigonometry, so I'll just introduce the basics you need to know to make sense of the calcnewpos function.

    To begin with, you'll notice that the ball has an attribute vector, which is made up of angle and z. The angle is measured in radians, and will give you the direction in which the ball is moving. Z is the speed at which the ball moves. So by using this vector, we can determine the direction and speed of the ball, and therefore how much it will move on the x and y axes:

    The diagram above illustrates the basic maths behind vectors. In the left hand diagram, you can see the ball's projected movement represented by the blue line. The length of that line (z) represents its speed, and the angle is the direction in which it will move. The angle for the ball's movement will always be taken from the x axis on the right, and it is measured clockwise from that line, as shown in the diagram.

    From the angle and speed of the ball, we can then work out how much it has moved along the x and y axes. We need to do this because Pygame doesn't support vectors itself, and we can only move the ball by moving its rectangle along the two axes. So we need to resolve the angle and speed into its movement on the x axis (dx) and on the y axis (dy). This is a simple matter of trigonometry, and can be done with the formulae shown in the diagram.

    If you've studied elementary trigonometry before, none of this should be news to you. But just in case you're forgetful, here are some useful formulae to remember, that will help you visualise the angles (I find it easier to visualise angles in degrees than in radians!)

    pygame-1.9.1release/docs/tut/tom/games3.html0000644000175000017500000001614407670446465020703 0ustar vincentvincent Kicking things off

    3. Kicking things off

    The first sections of code are relatively simple, and, once written, can usually be reused in every game you consequently make. They will do all of the boring, generic tasks like loading modules, loading images, opening networking connections, playing music, and so on. They will also include some simple but effective error handling, and any customisation you wish to provide on top of functions provided by modules like sys and pygame.

    3.1. The first lines, and loading modules

    First off, you need to start off your game and load up your modules. It's always a good idea to set a few things straight at the top of the main source file, such as the name of the file, what it contains, the license it is under, and any other helpful info you might want to give those will will be looking at it. Then you can load modules, with some error checking so that Python doesn't print out a nasty traceback, which non-programmers won't understand. The code is fairly simple, so I won't bother explaining any of it:

    #!/usr/bin/env python
    #
    # Tom's Pong
    # A simple pong game with realistic physics and AI
    # http://www.tomchance.uklinux.net/projects/pong.shtml
    #
    # Released under the GNU General Public License
    
    VERSION = "0.4"
    
    try:
    	import sys
    	import random
    	import math
    	import os
    	import getopt
    	import pygame
    	from socket import *
    	from pygame.locals import *
    except ImportError, err:
    	print "couldn't load module. %s" % (err)
    	sys.exit(2)

    3.2. Resource handling functions

    In the Line By Line Chimp example, the first code to be written was for loading images and sounds. As these were totally independent of any game logic or game objects, they were written as separate functions, and were written first so that later code could make use of them. I generally put all my code of this nature first, in their own, classless functions; these will, generally speaking, be resource handling functions. You can of course create classes for these, so that you can group them together, and maybe have an object with which you can control all of your resources. As with any good programming environment, it's up to you to develop your own best practice and style.

    It's always a good idea to write your own resource handling functions, because although Pygame has methods for opening images and sounds, and other modules will have their methods of opening other resources, those methods can take up more than one line, they can require consistent modification by yourself, and they often don't provide satisfactory error handling. Writing resource handling functions gives you sophisticated, reusable code, and gives you more control over your resources. Take this example of an image loading function:

    def load_png(name):
    	""" Load image and return image object"""
    	fullname = os.path.join('data', name)
    	try:
    		image = pygame.image.load(fullname)
    		if image.get_alpha() is None:
    			image = image.convert()
    		else:
    			image = image.convert_alpha()
    	except pygame.error, message:
            	print 'Cannot load image:', fullname
            	raise SystemExit, message
    	return image, image.get_rect()

    Here we make a more sophisticated image loading function than the one provided by Pygame (image.load). Note that the first line of the function is a documentation string describing what the function does, and what object(s) it returns. The function assumes that all of your images are in a directory called data, and so it takes the filename and creates the full pathname, for example data/ball.png, using the os module to ensure cross-platform compatibility. Then it tries to load the image, and convert any alpha regions so you can achieve transparency, and it returns a more human-readable error if there's a problem. Finally it returns the image object, and its rect.

    You can make similar functions for loading any other resources, such as loading sounds. You can also make resource handling classes, to give you more flexibility with more complex resources. For example, you could make a music class, with an __init__ function that loads the sound (perhaps borrowing from a load_sound() function), a function to pause the music, and a function to restart. Another handy resource handling class is for network connections. Functions to open sockets, pass data with suitable security and error checking, close sockets, finger addresses, and other network tasks, can make writing a game with network capabilities relatively painless.

    Remember the chief task of these functions/classes is to ensure that by the time you get around to writing game object classes, and the main loop, there's almost nothing left to do. Class inheritance can make these basic classes especially handy. Don't go overboard though; functions which will only be used by one class should be written as part of that class, not as a global function.

    pygame-1.9.1release/docs/tut/tom/games2.html0000644000175000017500000002066407670446465020704 0ustar vincentvincent Revision: Pygame fundamentals

    2. Revision: Pygame fundamentals

    2.1. The basic Pygame game

    For the sake of revision, and to ensure that you are familiar with the basic structure of a Pygame program, I'll briefly run through a basic Pygame program, which will display no more than a window with some text in it, that should, by the end, look something like this (though of course the window decoration will probably be different on your system):

    The full code for this example looks like this:

    #!/usr/bin/python
    
    import pygame
    from pygame.locals import *
    
    def main():
    	# Initialise screen
    	pygame.init()
    	screen = pygame.display.set_mode((150, 50))
    	pygame.display.set_caption('Basic Pygame program')
    
    	# Fill background
    	background = pygame.Surface(screen.get_size())
    	background = background.convert()
    	background.fill((250, 250, 250))
    
    	# Display some text
    	font = pygame.font.Font(None, 36)
    	text = font.render("Hello There", 1, (10, 10, 10))
    	textpos = text.get_rect()
    	textpos.centerx = background.get_rect().centerx
    	background.blit(text, textpos)
    
    	# Blit everything to the screen
    	screen.blit(background, (0, 0))
    	pygame.display.flip()
    
    	# Event loop
    	while 1:
    		for event in pygame.event.get():
    			if event.type == QUIT:
    				return
    
    		screen.blit(background, (0, 0))
    		pygame.display.flip()
    
    
    if __name__ == '__main__': main()

    2.2. Basic Pygame objects

    As you can see, the code consists of three main objects: the screen, the background, and the text. Each of these objects is created by first calling an instance of an in-built Pygame object, and then modifying it to fit our needs. The screen is a slightly special case, because we still modify the display through Pygame calls, rather than calling methods belonging to the screen object. But for all other Pygame objects, we first create the object as a copy of a Pygame object, giving it some attributes, and build our game objects from them.

    With the background, we first create a Pygame Surface object, and make it the size of the screen. We then perform the convert() operation to convert the Surface to a single pixel format. This is more obviously necessary when we have several images and surfaces, all of different pixel formats, which makes rendering them quite slow. By converting all the surfaces, we can drastically speed up rendering times. Finally, we fill the background surface with white (255, 255, 255). These values are RGB (Red Green Blue), and can be worked out from any good paint program.

    With the text, we require more than one object. First, we create a font object, which defines which font to use, and the size of the font. Then we create a text object, by using the render method that belongs to our font object, supplying three arguments: the text to be rendered, whether or not it should be anti-aliased (1=yes, 0=no), and the color of the text (again in RGB format). Next we create a third text object, which gets the rectangle for the text. The easiest way to understand this is to imagine drawing a rectangle that will surround all of the text; you can then use this rectangle to get/set the position of the text on the screen. So in this example we get the rectangle, set its centerx attribute to be the centerx attribute of the background (so the text's center will be the same as the background's center, i.e. the text will be centered on the screen on the x axis). We could also set the y coordinate, but it's not any different so I left the text at the top of the screen. As the screen is small anyway, it didn't seem necessary.

    2.3. Blitting

    Now we have created our game objects, we need to actually render them. If we didn't and we ran the program, we'd just see a blank window, and the objects would remain invisible. The term used for rendering objects is blitting, which is where you copy the pixels belonging to said object onto the destination object. So to render the background object, you blit it onto the screen. In this example, to make things simple, we blit the text onto the background (so the background will now have a copy of the text on it), and then blit the background onto the screen.

    Blitting is one of the slowest operations in any game, so you need to be careful not to blit too much onto the screen in every frame. If you have a background image, and a ball flying around the screen, then you could blit the background and then the ball in every frame, which would cover up the ball's previous position and render the new ball, but this would be pretty slow. A better solution is to blit the background onto the area that the ball previously occupied, which can be found by the ball's previous rectangle, and then blitting the ball, so that you are only blitting two small areas.

    2.4. The event loop

    Once you've set the game up, you need to put it into a loop so that it will continuously run until the user signals that he/she wants to exit. So you start an open while loop, and then for each iteration of the loop, which will be each frame of the game, update the game. The first thing is to check for any Pygame events, which will be the user hitting the keyboard, clicking a mouse button, moving a joystick, resizing the window, or trying to close it. In this case, we simply want to watch out for for user trying to quit the game by closing the window, in which case the game should return, which will end the while loop. Then we simply need to re-blit the background, and flip (update) the display to have everything drawn. OK, as nothing moves or happens in this example, we don't strictly speaking need to re-blit the background in every iteration, but I put it in because when things are moving around on the screen, you will need to do all your blitting here.

    2.5. Ta-da!

    And that's it - your most basic Pygame game! All games will take a form similar to this, but with lots more code for the actual game functions themselves, which are more to do your with programming, and less guided in structure by the workings of Pygame. This is what this tutorial is really about, and will now go onto.

    pygame-1.9.1release/docs/tut/tom/formulae.png0000644000175000017500000001515307670446465021155 0ustar vincentvincent‰PNG  IHDRà1£íübKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÓ:+~N]ºøIDATxœíwXUGÀϤ PTZP1(*ÒT4à"‚a#‘ÅhbÄUq- J(ÆX0fCäÃnDì!D”H”¢€Qx´<¤#½Íþq–ù®ï&”êüþºSî½3óî;sæÌ™! ƒÑÿÐ×`0 Fû0Í`0ý&  £ŸÂ4ƒÁ`ôS$ûº ƒ!V®]»vþüùÇ Åoß¾=++kòäÉÙÙÙNNNfff4©¡¡!<<<===;;;00PMMM™:ujjjª¼¼ü¦M›!°jÕªœœœØØØ¾. ƒñ7˜;w®ÁÅ‹mmmÃÂÂΟ?ÿé§ŸÞºu vîÜ B³‚ÇÏ‘iÐŒ® ##ãççgii‰ÁñãÇã…®®î¨Q£FÕwEc0þ6JJJéééZZZ‘‘‘‘‘‘3fÌ@é ¯Ú:(RRRâ)Ó ]„JçšššŠŠ ¼.//ï»1Ý"--MBBBQQñöíÛíÊeñÃ4£[ܼyôõõûº F·X¼x±¢¢bSSÓýû÷ ¶¶vΜ9 +++š¹µµU<¥“€®®®¦×eeeb«^ïñâÅ‹¾.B·è©òGFFJII}øá‡TTT€’’’y8ƒ!âââN:µgϧ¯¯Î7nܨ­­EkÆÀ¹ù›ššÄS°ÞÐîîîfff†††¥ªªjmmÝ«ïí=ŠŠŠöïß¿råÊáÇ×××÷uqºÈ½{÷†îííÝýGíÞ½{ذa4˜““ÓÚÚ:iÒ¤î?™Á=€õë×cÐÒÒ]îΜ9óÉ'ŸÀÙ³giæ²²²¼¼<1¬wô Aƒ>üðÄ„*Ë$$$@NN®WßÛ{ 2ÄÍÍíÇ™¾.Îߦ°°¦M›3g΀gÏžuùi豯¥¥…ÁAƒIHHäååu»¤½Kmm­•••ƒƒC_äME œè™âö‰‰‰h4Ÿ2eJ_—åMí³ÐÜÜLáóùÊÊÊ’’’b+À“'O!eee ®®N)**jjjzí---¢¢/55–,YBctuu //ƒàëë‹×222†††=U‘Γ€¾ÿ¾^$6àØ±c}]Š®ðàÁ77·+W®€›››ŸŸßáÇ»ü´’’’Çsc=zÔÚÚÚíbö:™™™Ðº3´´´¸rŠÏç?}úTlo€éÓ§§¦¦êéé%&&~ûí·ØÉ-555Ü5„#GŽ<~ü8ý\wïÞ2úã?Æ YYYôÞM›6ihhLž<ìííãââz·zm¼^@gffâEee¥PÒóçÏ«ªªðB(©¡¡á?þ „ ¡355•& ennnÎÏÏÇë—/_ÒøŠŠ zA¯¹wåää`.222𛛝^½ B©ùùùXe!ž={Fk']Ý_]]-”TPP ÚªHUUÕóçÏ[ZZ¸‘---ùùù¨ wT???HJJ€M›6ñx<33³Ž2¿Å<|øP<ÃÇ·99¹Îb¯’˜˜kÖ¬QQQ VRR²´´|­]QQQ\\\[[[SS#jkk¹©¥¥¥eeeåååEEE\AÄÍ““Ó“Õx~£•••ëÖ­Cc1!Mæ4ƒ±±1p 1Ü{ñÿïää„VZ{{{Œ···WVV€/^ÐÌø„÷ß´µµ !!!!h›_»v-z½ xWZZÆ,_¾;©$ö"¢ÔÔÔtÞ:>Ÿ/--mkk‹Ö[¡ú½cfÍš%--­  Ðn-ÐÄ1oÞŸÛ¶mÃlx— ~šwîÜ€ØØX‡‰'À!ÀÈÈhåÊ•„ªª*PSSÃ'mmmjÍç&Ñ~”òý÷ß«ªªvTÚWÀÑ£G çúÖsçÎ==½¥K—Ž;vîÜÉM òòò200àñxñññÙÒÒ¬¢¢òÏþ|||öíÛ÷믿BqP[íà6•Hrr²§§çÚµk`ãÆÜÅÅÅíÛ·oþüùô£BÂÂÂÀÎη€hö---±±±ß|ó ~0ááá°uëVšWЩ««ÛÛÛ éRµµµ...Ó¦M3fŒ­­­´´4Æ_¹rÊ………ÜwMŸ>]RRr„ èÕCyòäÉ¥K—äååQ£š:u*þ/¸ƒEtñrrrRSSsrrjlll·"xãÉ“'õõõïß¿úbPPPµTÿà5£>>^MM-88˜´Í£^ºt ¯  €ß<ú `ÒóçÏ`ðàÁ¤m<„ÿµvéd·x ªÔ·KKKKjjª¬¬¬®®nRRÒàÁƒi} ÑöÁƒ¤í¦º<º.|ôÑG´•ôõõñúÆ8’¦ƒÐÐP%%¥¹sç–––R7!Bˆ@ ÀA›³³óÙ³goÞ¼‰Ž@¡¡¡x#jÄׯ_'„xxx 6¬£Š\»v–dáÂ…„äädnwòvЙ€F׿ٳgs#áUÅSMMÍßߟRVV†Þ*¯¼€ÄîšZH@EE…¦æääI4¡ †† ¢V‹š&!ä¯ÌÞv ,W5jSvssÃBÒ•8í–?""P#ø] uøhíAq0kÖ,øïÿ‹I(ÐoܸAqrr€~øÞˆû¹Ðֵ׋Òùß9tèPG‚ ;¼öÕ=pº:ü°üñG úûûSYƒ‚ššš¤ÍC`Ú´i˜„­qäÈų́¨(PTTDYBß%ÔwR;•¼¼üéÓ§ñÚÀÀ€&áʈŋcÒ”)S:š „ìaçÎ?ýôÓ_i ìàåää ø|>–›%99ó ~@M `eeÅmÏ‘#Grƒ\µ@KKkܸqÜTú_ÀÞqÉ’%øŸÅ•¨TKûì³ÏhÎòòrGGÇv-KœìÕÒÒú+µ~éL@£q€;•I€É“'Óà?üaaa„;vÀÁƒ¹™áU™5jÔ(¼þþûïáU%nÈ!ðêÙô{Å{iï|ñÅ€}C/ 2jL*ò¨íR¯µ/¿üRRR„n€›7oB† \3zà åG·••´)Êø"îL¿ìÍ›7w¯Æo!/_¾„W{÷€€tÌB¤¤¤Ö¯_O9qâp|­pÊÆÆƒ‹-Žßiû¼³³³¹¯Û¿?þ²µµµ8ƒ_ iûæ¹÷RËuQQNÏäææödåÛû¡Ïï×_€E‹јéÓ§Sã$:ÕqËtº {µC‡a—•þöÛoÜÌÜkn·Z¦ÿѲuŸ‚‚‚àààì9öìÙƒ S¯ÒÙB ƒÍ‡} ‚ã[8xYµj÷!7nä©û$ú–cOŽ”””às`Û¶m€¸víXXXêàéé)//ÿõ×_wR8|ø0¯$%%£££;¹wáÂ…ÀY_éé麺º8PÀÎßÝÝU× &ˆ>aóæÍK—.]ºti^^NÀåË—W¬X!”ùÞ½{ï½÷ÞÖ­[KJJp´A WTTtppxñâw ŸÏÇE@ÞÞÞ²²²Û·o§û1åÄÄÄÐ\^çÎkll¼{÷®‰‰IXX؉'Ž;†IÓ¦MSWWÇï»w…7NCCƒûpWWWºNùÏþƒ/2eÊúõëóòòè"üæÍÍÍ]\\\]] 芭aÆa€³Ç½Êˆ#çK(¨/£¾àîÝ»8†¸sçNtt´¥¥¥¦¦&¦¢ê–ŸŸÏ½U„ß~û-**jáÂ…è‘hµÀn’[$!!a„ ô¿³|ùrÜdYôHªw”N„7Lœ8‘óóÏ?À¾}û0ˆS ¸0áìÙ³¸½&åææ¢1äúõë¹¹¹UUUׯ_€”””Û·oB‡9ØëÞºu Gv8OBß‹þ 555ÅÅÅ\Ýíbû÷ï酪™™>>>¢ãÁÝ»wïÚµ«ó©ìlèB ”מžž………8$D ¥¦ÃùóçÛÙÙuÒ¶_}õ•h$×éíÖ­[ôáB¿EJJ NÃúùùQ—LìϸëŒÒÒRÜEÉý†q§…lO!Ž?...æææË—/çºj /ù½{÷¸ùQƒqqq‰‰‰r ¾xñ"|üñÇçÎri š)ö%;vìè¼R³gÏÖ×ן(‚¶¶ö²eË„ü/EÁ¡§P6xuíjÙ‰‰‰¤mºžë¤abbˆiii(࿞ë&Œ:2^ã9­´ññ^ê€PkaçÆw„tdd$\¹rEøkkkBÈÖ­[ÇŽ‹Ÿþ¸›‘#Gbo¬¡¡áääD™>}:Œ=íª8CˆÂZEEeÅŠ fffVVVOž<€™3gr_ ööö÷ïß=z45~á¨óÎ;=Û(BõEÛ±­­­………ŠŠŠ¢¢"ió&455%„DDDÈÈȸººÒQ¡““Ĩ‹:TÒ–ljjrttTVV¦ö%u¡ÖFµgÂÂB´2£bÎ?/((À$=== 222x²BfÍšÕ¶D®7!ú Q#²@  “I·nÝZ³f ·‡;xð  ß–<ˆ.°Ø¼=ÂÌ(ÐrRYY‰ƒlê,‹Ò#++«¶¶ÖÝÝÎrëëúÞY:Ð666íþÛ³²²,X€[j`Œ††ÆªU«ð:**jàÀÊÊÊØ¸hJ¦¿hkkSõáèÑ£¸³;ZQ='„¤§§À‚ èKq|ŠÓ•öööØ¥£/&&¦š¡c¢££Ñ¥ÏÈȈ‚&:„j‘’’’¦¦&·ŸðòòÚ“ûLÔ8DW¯477ÓÑúÀq“PFKIIq¶ ÖÔÔTRRÂAFxxxÏVÿ-€NäVUU©««ÿôÓOààà€^ªªª€+Œ¢¢¢FŒA§Ñæ“&M}¬ŽŽW°"¨!nÙ²…ÒÐÐ0yòä… ¢§Ð¥K—`ݺu„ÒÒÒÙ³gÛØØ`OèKŠ×ŠŠŠBþj= Ž…"Gމ_8ió‹€eË–ÅÆÆâ\ ޼¼¼LMMÇŽ«¢¢âïïÿòåKd̘1c×®]„´{à¬ã† ,--Geddäââ’——‡ãfúRô²uvvŽŠŠB«&Æ£3ØçŸÞ{ð¦ÀSõ<Û¶m“••¥Aô¦âά¾¡øúúr@ÊêÕ«×®]»wïÞ/¾øBhXŠšÑîÝ»¿ýö[ÜëèèL˜0¡¯ÊÓ}222Ðp)ú·ÁU6|>G]èkL8¾Þ™™™¸ê¡]ù.>|È]0É‚õõõ™™™B›Šèëë/^¼˜Ïç·´´lÙ²‡ü\ßÄÇw´Æ'--íéÓ§B†f$55õÙ³gt (’——WSS“ššš‘‘!”Ôpý+„xüø1í·*++¹þš999éééÔј»yCaa¡M¦¨¨(55•¶myÑý:ÒÓÓqñ$Zf=z”™™™––ÖÕÊuÈÈÈï¾ûŽ;MåïïÔÑJñÀtσ\o†@O» ‰ôC¯®IAëäåË—iŒ¡¡!]PçááœÉ(ƒÑ£G‹­ØÝÚÖk þù'¼º¬Žñ6±eËè\$ÜW°#¯zž™3gž:uÊÚÚzРAsæÌ:t(ú!½¡ 6¬¢¢’8÷@ÉÊÊΉ±0`Àºc@@Àøñã øÿ7fllœ«¢û?:::^^^LOO755EvÆ[ƪU«83zôè1cÆäææŽ3f̘1ÑÑѧOŸÆ1b_ÁNõîþõ¯999555566*))‰#sñ€g©DEEýûßÿ€œœœ‡RG+À¥HHHÈñãÇ9B×L÷gBCCíì줥¥ýýý›››}}}ƒ‚‚úºPŒ^ÁÀÀ %%E]]][[455q·–Ù³g÷uÑ€GÚ¼»ŒÎáñxëÖ­Û»w/©©©Áyy ??¿”””ÂÂB\˜`eeóûï¿£ }´ðFðË/¿”——óx}ÊÝZ¹´´TFFF^^¾‹LƒfüEp<Ö‹²k×®œœŸ;ü1ý®tUUÕ>—Îoòd†x(++úSSSîØúúúšššÖÖÖ... !!A÷ ¨¯¯ÇÝ뜜lcc#†&Œ· fâ`¼žÒÒR§  P___WW7dÈîšïêêêúúzii骪*<Ì—Kee¥„„Dkk«’’’xKÍ`¼ñ0Í`0ýfƒf0Œ~ Ð ƒÑOašÁ`0ú)L@3 F?å­íÆ ‹s²ÔIEND®B`‚pygame-1.9.1release/docs/tut/tom/event-flowchart.png0000644000175000017500000001263007670446465022450 0ustar vincentvincent‰PNG  IHDR‚%ÖvˆjsBIT|dˆtEXtTitleMade with SodipodiŸô/'tEXtAuthorUnknownŒ! òzTXtDescriptionxœKT(ÈL.)-J_~êô ,çIDATxœí{´U}Ç?7 yÜðBx%@ (äÕ€WåÕ"AHÑP("U¨ ZðQ¨•,¢Bëª,Dj @ • A1Р<ÂB¨„1ˆ ä’þñÝÃì3wf眙sïþ¬uÖ½3³göcf~óÛ{ÿ~¿ÝE È"àà᪠¨-û «º@‚YÀ¶U"ÐQ<pPÕ…tÁ@ (EPuäNàÓU"Ѐzi¯ï~V ¯Ã1ÀÁhØÿ>“þ8³ýpð(zÁ³Òç)gž~ ¼Jch•“ÛP}ßü—)çàx`p;°ÑºVtìàÇæz˜:­¦1>ÙD`à³ý‡ÄvÈ'™¼Fuþ)jÏMÖùBm}ºÇ79êSG¾_u!•s#pnÕ…ðà“¥ƒ]ŽB¶ìÉ[§û‰å`ò;•'Ÿ¶0 ¸8»™j˺ª ࡽ ›²q²±Ø xÓ¤9¸X‚:8/§˜}6 x…{"8)À\y lƒŸIH ]|øÿ \l~iéó–³ ¯ç˜ÿç+k ö°p7p%ðQà[HˆÞœeÒŸmêu­)÷|¤Ðý'ðA`ñÉþ õhoA6C×û¢i£ëÌuº§Íö À§Ì¹—£ú_zÔç™<¾ç¨OŽž“ÙU$Pg喙|²4ÈQ‘&{ŠÔi9±|®`>måŠvg¨-ë€?©¸ 7gëÞ¶4ÛïA£Lûším7€Ó¬sNC/ìvÀ¨gy€9v'ðw%óºøkó°õJ#æ™}¤¤÷•³Uô—YÛK—‰Gí>FþÆ¡ìñVúÏk‘ <µÏnæØ6hd¦Ù…Úz+ïEÖµæo¡¶›d®5Ù:~§9dŽ:]èIÓNþøMÕ…TÊ%À·«.„aRŽ’ô-ß‚uÓCþ:ÙrÐn·dVɲà,è$D½Õ[cÑæ1ı䦢™Uh´jð œ`ŽÍFSKyÏúÿIâö9)¤¿Ì(g h..ùähóêÔ¸âîCߥ¾V!aÒÞ§¢ùû7©Ó€ÇP/!ÉPdïô0ðûvªIt£ÞÃ2ÔŒ¬CJȹÀ7Ñóy5©Z‡l1Þþ6qÞOÈ&eó²é¾†‚`?€Å3d{·-ç`‡Œkõº*‘ÂÆÄö†Œtc_¡Q¾ˆ§M~cÍö45óà/Pûlvä55²R ísëlXŸ…zÊÒ"tbù»c~ãQ›<Ž^ÈUHœ@üÜv![“¢6¾¼l¦ á5 0½G–+ZÎ Àéæÿ¤¢õ8ýþ²Ê8…3ˆ¦:'£Uäw=ðeôüΠ|ȃ€3Q›DÕSJ^«Õt!ö“Éçdç“£¿!%Q'YZ„N,ÿn yZ—|{– G]©SGà›¾yÀŒA®ÍsíЗZ\®Vtã¾Øž©­póLá1nDŠøðç¼°¢Øt«Q›Eö ÷¡Ö/¶Î™‡¦4]['!lj9 é²´*9êJ“uÝ´òg¥õÕü²Øuí¼r<ò ÑGå󿨧è; »˜X!8­/F/Ñ;¨ç ¹ÜŒ†]W{ä$éEá1¢h i‹nÈwäRô!ëFF¦+‘’¶õ²–‰¼?G‚g[síÝ­43у šZâ-F®ñ½4¾<Ék&±×Pà?€‡’ îöóµ}D;ÁGÑóó}•"xKÊ~›ýч$KŽþ }¶*UJ^ÃнšhímöE˪¦û³Ò7³œ­b*÷Êâæa+Ô.[#£ë‘hJèùçV¡Až‚‹(§ÚrúÊÒ*åhV×u“åw¥õÕÏ'‹]×."Ç}òÔ——ë>´C\ìLÁ½Œc–"á’¥AŽº)R§:ãU—o~óÐÕ‹4îäËïsýÞiöQúÑKöGøÝÀ#át'îiÓ^›Ì¾Fd‹–¡°]¼{p»ƒûÈ£nF£³My÷Ì™G$¸F£:ÞOl„îk?WÛÛ¼NëÁÐTâU胹sâxE00°Ø½sÑ»>}”/ÍqnŠàOƒÌÿãh)JS]reiÕr4-M‘p"¾´¾úõP>¬‰ëÜ$.yš§Î®ûÐEð1ÔÁø-ðoŽt>E0Xær½ ïµ¶oFâËè;ä¹~E®ßÐlÄj4d|"ŒsÌßÇоínà¿0û®Äí•!*%ߢζ;øhxú˜çÅVp~ˆ†±ß;Ðd’PïçTâ¥à’nôÐØ~ËÈn{ãhTn›Á($4/EŽ#7ÓwŠ%0¸xMA~½ã#Ñs1¯äõvAÏ~ôÜ}Ô#mo4#°)>û ÷e½É{4â² 0ìBb;¤Dì”Õã‘"º;êH¥á’£Iê"Gí4>ùb;çå‘E®ú¹d±¯~eäxš<Í[22µY¼¦†OGß•»È6© œøÁ¥(,Dò¸~߀¦>< ¿eöçuÏÓ³YéOÒ‡V¸ƒ§õ¸²þ߀œ&v,xÝÈSs>Z"ìUòµ_VÛ»8…FCÜf1‰ØQgë\?‹´0#ЈÔ@ Wâc"ròØÆl¿âHÛNn6¿áè×.E#n‘óB¤Dk¡þ™e\‹:ŠO ¸‰?Gòj9Rþ^DÏé Ä­ç"…1Z¹`/¤œ¹ï:QŽÚiŠ„éð¥õÕ¯?aMÊÈñ4yš·ÎyeêGˆ'òÇYp<ê”l…¢_\EûÁ G[ÃÄ6ª¯ ûÚLö¦Ñ±²¢Î"É©á©HøÚƶç !÷ˆm‘tºùjþ¶Ñšfé&ž®ðM[ö&ÒL,×55¼#(Ç#ÃÓ³ÈG45¼‡µïsô>:qÎÛÈy$ÑTF7úX>A<ýàk¿(¿´¶·IN E÷·™¿ûÑÔÚiè~}9Q†VN 'ŸÙ9èCg r °-ðßè}Ú“Æ`ÑJÚÔp䡱K~#~W† ÷=Rô†›íÈN·ØÕ:wkb2)ÇZÇó:‹ØØÏeÕr4-ïºvù}i}õsÉbßµ‹Èq—<ÍSgȾÉ©á¹héµfþÖ¢È=ÈüéÑ”:Bk¦†»mcP»> \`ö ¾ŠîõchÉ=WGÁ•þbâu›íkv±I> Ç£žr$p·D†¬$λõÎì妺‘áë7¬}_Bö[Ð:EðoÌÿ§"¥m¼•v²éÉÃp4õ…Ú†<©ÞA«í#Ú¡ÞŠÊ÷{4“ħæ ‘'Ìň ®ß—‘×Éhêð(êâ0³ RªfÓx?ìcçÑX¿ÃQÀ]›‰æ¾r÷7<hªsk÷NFáNŽ[Y…"x? {² }ïÁªåhVš"áD\i}õëOX“"rÜ'O}yE¤Ý‡v(‚w PK›pÛÒºÁ²az:UŽæ‘“®¼!x¢2$ÁÑH‘›k¥9u>Ó"‹äI_X,‹ËõÔ“þ5éö‰ítOsñö…%ñ1Ü\3ùPO#p¹2`ÎãÄR_û¹ÚÚ£þ =ˆY‹”»Á<á!ò†¹8 ÈedfíEFØW";³^àë(é<Ôó²#ÉŸmò¾õ’7!û ÇxÒ9à&s]_¹›žèÓ¤+$«ÉŽÜß T¡NBöaÉ÷ú*‚e©£-r]_Z_ýúÖ¤¿r¼H^i÷¡Šà‘}ÞC¸•‘,E°?az:UŽæ‘“®¼‹†™+JR<Äld¥9ÂìÛ•¾äIß6E0‹nd€»œÁ7Œl+‚U·íÛ¡~Be×»ÁÜá!Š„¹€¾P“ôÒkq)^‘Ðÿ±³Å8t·ÒÙòt£^ì;hi+ÐhÒz¤ÐùÊÝŒðDW;KØ,E³S©B¼ ­Ã<2åX³Á,³­®ûÐEðôì'C€%ÉR{(¦§Så¨ONúòî¡aæ|$Á¯61ΤI[‚3OúTEзÄ\3Ù=¿BêöQ§¶? ­$Pf¡w;<ıhzéâÐÉ3h ùP†[­ÿŸn'67XAÜ< ½„¶ÆmHPí‡ €Ÿ$^©a6IXÒÄrg…'µyÚºÚϘcü,@ ߆ ò®Ó»<˜©ú>œ<ш«qÉÒ.G³ä¤/oß÷'É,4¸ò:š²µ>sB÷+,EÞïi£EÓ¿‹/|L3‰†°{Û˜g]øé^ºíb ´½/ ë­}O£6‚ Ñ·¯ !~5ReÊ]4<Ñ.¤‡Šy…Fã䀟´íÛÅ@y—;ªïÃ=ý<¿?azÊP9)žYrr½'ï_R,<Ñd –Fžçæe4ë0žx•¥ÈÇ!M–Mÿ.íTað ¯^²ƒÍ¶³ ÎŽÈfç3æ7L?Ž^ÌUè…?xÍÜ.dôÝê÷*doº=ñÔàdd¤û‚Ù¾…Ë9õV?fë*·½jDš—àLÔÓ†8ˆñ×ÍöShjùîÄ9»Ñ¾ ¸æ0Þå€ë>ÔÝË%KŸe`ÊÑhæ#KN¾éÉÛ÷ýI2…‚¾Ü¾›Ý €”ÐÍÈ&ùy³oRhW5!ý» Cy¹§@ÁAšñ{8ÅH:=Ø«‘0¶ƒd®Añ’Î1ûæ¡x‘ywŸ„^¤K”m RöÏ0ùw!¯³ÄAV_@=ùk#Cã<åÞ„„ÔLdtòÄKršÖxÇœ»y‚lŠÒœBöF=ì@ 0xpÉÒk˜r4"KN¾åÉûÜߟ$­²%Yëhƒˆ—P{œ¦°»·óÄŠîG‘½ýœéS†̦=ߦµ†îýe!ZìýyôÜNA=½¯™ã둇×íÈy 2À=Mø¦5Τ¼û𮏹ïïDnb“•î:ä¸a{ØùÊ hÿnÒ퇜¼.°®N¼ÂΨgM ,§Ñ$(&šcæ1M['‡Qÿ6\²t ËQŸœtåíûþ$yžþ²‰¦¶3e})ÚŸD#– s¦O¥îÃ×Áǃ¨·5Û‘f4ìþ4醺#P ä7ÌõÊ.X†QÈHx5E–Kó•{8Š£µ˜F››i¨‡¼²I™ŠÂ5¼i¥„Ã4b¡÷4²˜T;‰^à‹(ØoØ‹F=08¹…'©šEèß%ã¸K–49šGNæÉÛ÷ý)Ë4³+ð¿Öþ!h÷eSžä4ó5À_æL€Ù7ÄÚŸ¶æy P)­\Yd ’7<Ñ™4*LÑÚºLácN¡+‹t*U‡qó…™@~§œóP î< G£˜•† Õr5Šþ? P?JzH™@ ´Ÿhæ&ï”òW‘=`¾ƒtHzp·Ýk84Ÿ¼á‰6/ïtŸùÀ` ê0n>ÖPÜ_#9MìbNÖ êÈ‘ÈÈ5ðf5@êÆ­–E0P7‘¾ŽbYŠô˜ÉU :• êÆ%U ÛèÔqS ‚÷‚º Ë‚½Õ6Š)»èsˆü{!€J(ë#)«Ñr›íÌ6G6Feø°ø @CáJ¡ê…Ø>5ü«œç‡R@iHAJ³Ñ,N\›¥Ü±+“mw>èÚWÁuž³*íúgØ¢ÆÆýÑóžÒ,A ,Ä:ª%®A¯Lq«ëÓÛ–˜6}о(GÕÖm(\.@€5“ …ƒ7ŒýÁã?±— 7´ %0‘Ýûv£~Õ{˃’’gr¤eZhü¢KÍ}&1?•ƒ@:©È¼F)SôðCí²QŽ÷†^™0Ã5ƒ)ŠÛ’”¢Ìv'swÚ¶eœøAÜŽÐøÈO< !DܨÁ{êä‹ç‡GÞ œ/„‚5‹[kÖ×´Q6@â |òcwÚž ÿO× BÞIÿtï_kt½÷ãçyæGÎVµéêñ®Oé¶A¶‡WSV-õûzzºøÉ6Çù¨ýúù š_cº…6ƱóÃb‘‹:wñÒø›—ĵMwþEÔj£¿õœ¦F!„y?òèc&udÔû¯S¯Ï„!øWH±8ñ&Iq«ØßÅNþ÷xqöOúÚ&}M%e㵟u|*»½õÑ­[¶^šq>ó©áF¼å~â‡wn{´ˆ;ßÿNîÊž ÊeX 𬯭[Mã„ú}M·l„7ª8_ó¥©àÂÿθ-MRnr?¾µÿí™­BÖ,L·58ûòÄèh®4)d fàö67»ÃM7H‚ոżwÁϽã›l!8II¦\Ÿž¼E·=ãð¦& DÁŽ¡ŒîOOuíbôFƒO*­8ħ©Ns—>™ûÃ`æîž â2õ¥®ž{ÕkÍ8nK`˜»ÇeÞó@kf‡[>óª.Çßð†^«ðU÷Ù•Ò½)¿ÿ¹àðW÷J}oççŽúQ/ ¬Ùq9t4Ç$`$ÖÈÜí´·¹n‹e§¤bŬXÃmI»-–»Ýͽåå.ú1etC1_f `ì P@¤ÛÌ´ Ô §Ÿ9î6­šO¿xúàC¡a“ÊlëJ" Ž}ko2b©9䧃¡WrþŒJÞ¨‚etFr A¦EIÐB™·¥% 4¤„š€€ ™€P@¨‚ÜmÖb­Žæþ?þõ.Gþ¹{ïúÏþìÐ-QØŸÃé3cÌ –Ìì¶Ø]÷gœf‹Hbd£$!M䤩cw&ÝlWWMOZÈ´¸¼Ka4œ”ËŽÒ¹7ú»?tdF½)óãÞôüéa'm»©ÑÅÄnÛ^·moë®ýO?3àºöžÜ «ç/—~ž¸i[i(Yæ È~Q1C)ÈM6I›`§$‘´H€ hŠPºÒc«¦çóÁØyÀÞZHØŽ `âßχRbŽ%€´cæ¹PrN.šŽÅD¤Š¡s§•Ÿ ’ÄUÓ,XH@~& ã;A`&é¹wÐÙ?OÙ{ú!ØŽËAçÎѳ/ÿCg[@gŸ«$F£>`ÿƒ“ ¿ÈÒMÖè«C]Ÿë6yŽ|cM› ž|êlÒB†€M¯&kŸñí”ËZ!å&Dë¢9HÀ šÊÏä9ÌK+ôØZèCç&²»\‡ëþÌŽGûˆ£ã4fhšÈn²‰ˆ5ˆ–n6I€3Û)Ëi²‘B‚©Jo¸µaË–ÍKÑ“ˆ–‰Ú0‚fó4ý\nÏé3œ¹ˆö%¥ÁŒ¿÷~ßÏûÖÄŒ³˜ˆ ìÙÐÿÜIæ°”‡Ž?5ÔÚ¹?»kÿóƒC/½´»àhos¹¼¾ÐB@GUƒ^hS‚dŽf/A0« ‡'é›omhhhHҷܶùŽÛ7W£34¼é|ðžÐý@6(úјè]ôY3•dFRJZ1˜41”„TsÑ,‚„Œf:š‰@D—C7XŠ ¶`r*ÓÉ¢m ݲá‹Cão tî€$Ršì&@‡ÐtêåÜèÅà •DUjZï­³qãz—‚Ñ7rîövÅQ)°{w7yÓp[2Éb˜Ah|܃V!ÃV\fÏÏwÞãÅP±VRH¥ Œ4¡:(†vÊòü5[I%é¦` óïÏ+…Í›LÊõèSy{«+m󸚊M‡$jNJÊNî¸csåc^Âå˳VŠXÀÄÆªtÖL°Í\΀‹È/²-(IG‚ÙÛ"i:“?=z䛇%0ð"3†:v²E[Qš½‹Ô¦5,¦­´ IŒt€Û¶×8ÀiJþzÏ©èÿ³S¬4Kau?Øê4Y–EvJz¢Ì‚$ (23[Â.sZQq” ––JÃ̃`¤–QHÖ4B.sx’^(ÌoÙÒ áÖ†ØÛoOÌV•ÞÿüðÀ®^Ð,b›Y{BúaH¬yr²p×][7êäd5ËrQQŠªÒ¡±å¶†$1þ:ùn!I/+Fôx2 ËdçÎŒèûö“áŸxÏý'ú_sS£DÁè¹\™]‡ ü̶V/¬$F²„®ÝÍ^ÒÐ9ÿ>|¨óoíO§ÝÞÙl»sê¥á¡WFÆs9ž ;¢œ  ®yFCf¢…Zûa3X+Ò2€"!Y+‚d­L«H†<B¥Ã“ôÙ«ó›~»|e6ù:ô…™ƒ [JÊŒ…é¨Ñ¹f ¾|e¶¢Q …Y  äp†yŽ+$苟 ƒJz¢f}ATZ^'%¥ƒb´¢òù<§º¹±ùÎLcš[/ä˜ý%ç´Ih°É„x¹qhdïq<ùÝ~Ï Ý;;ÛïïNZp,€?£x.r]Âi¦R€Y’–š³$0‰èñU•Ü*ô2_U£W´Z©Rœ8å…RÝŸ Ǧ|32E.$š¶pužµ‰ìå?ïG6F’ô·' …+³…ÂlL¿|evòÝB%=Q€‰i€ÝD¬ÁÌI9ô‹q.âÐc‡Ž|«Ï»0Ò½oë8n³ã§,jOA9®?ã/&rimß‹5l‹èÐÿÜI¬áÏÚwe·½ëÓíf1[°RÀ›ÎCƒ•J–9¢b¦Æ2Jg2]s±ÃËé[¶”…¿-·o^L_lD)ޱR€Ä\¹Ô>Ÿë¼Û¡f3èÏÎγV$Lt¦áñû¾"êtKÄ'EKÑ[ðÞ Z·;m®wqQŽ‚YÎñɤ½öm¹ž}¾?s2—SptÖŸwÑ·RÄ¡ â b¤H̛Լ)¿ï»ƒ/¹-¬¹ÿù‘Þ­ƒÿy sþ•wê¥!ÇÉ ŠÍÜz·À¿YRȤë˜Á6‘Ò¸ãöê“’Éw ¬Á Ò•ng–‹é…Â,„4‘ëwm¹(,ÄW-”,í™]jŒŽæN»N÷}†™…¬XB(ògÂs¿ÍQ‘Y@–©J7w[Šnül pnt|ï¾Öì=ÎÉ—¢½:N<¢”rØá8røÜĹsÃD6•×—™CQZ”ŽBK»ÊN" V ;äÐÖfB»`!ä5Ѧ‚ÌûˆÙû-Þ»/=bBŸ`AZ‡`¶4CXvÊaAÑÚé¥tßíéÜíú—Ô׎žDÑŒ¨„…½‹XGµÄUêU¯vÝçz¤ @×¾ùiȆ ãú¸Ìžæpaör=P1pɆ°’ó±&: ŒœëànßµkçýÇÊêTñ*˜th%9 ´9T‚-H‘e Y_: ‚,³ßëmmsüKAß3Cù|¸äø¹®oGTȇtìß—Ðóå‘Ña›‚ 38'kr¨Š>sx£ã,™r,²*<¶:c¯öp3=¥þÚÑWŽ…¯š#_¥J@KÝ}t”W,‹NükysløÜÄ©3¹©é|¥÷qsؽ3Ós Ãq$€ž/޼:$É‚$¬RËjÍš }”ŸãV—Â!Qé±µÑil´¼¿f;Ž]ÿùXÜ oºÔ@b”;ú/Ý{þ*+%ï©‘ßyr^^–Kceí:Y”ÞjÙ–ìÜáš=÷³¯Lÿ·ÓþtN’HÄ@iÞo,Ïùc£ÇÊûë®>Ä­4Û\¬3naõR¤ÒþœfçàÁŽÎ®»}ãÞ˜~ebðÌøè+CÈ4*÷éèÉÛŸ,ÇùQ»&úkß2Ç¥›Ã*$'æP `Íéæt¶Í!Aî6Ç©ô^ cáÁÕëþLàçééл0¡8”‚*­UhqÁ6È'ËpþØù¨¿FëœhÇ@ãÆr™ÙÖ,)± · CÈOyCÓæ]bÄÇDJséÅîu”æÕpãVS˜ ²HÑq÷†xf9€äúUN¼~u|˜‘½÷ñX÷ýUÕ¬u|ˆÀ‰FŒÚ•â-ã:>ÄXhÄÒùk½¿ÖâF¤x®÷×=ƒ.×ãkí 9èFóáeÆWyÛB6uµìQP¬¶Ü¾e©«Ë·œ$VM\ Îþâ컿¸ÌÌoN¸-áf¢_kõøZ‹HÆ×x_âÿEÝûÙ½Ãéu"ˇõõk­bcãëðo†÷i¿s—#o“Î]Îþ/í?õóSk1èçý¾o÷µf[åmRÞ&³Ù¾o÷ùy½ ¼_ììê4µèù»ž‰w&çYNeM±ÍPÑÿ|¿Ûê&‡5¸k!¾b~~~~~>³ãðüûó7üP—f¯ÎV½zø±ÃT ¬jù†‰¿þ¥Õd-6˜nN¿öë×–S‹eÖ¨"ÃÑï­¸£Õd½ýæÛÉÌ+­ì³ýÏVÜ}™ª~Úw6­Ù²­;n×GVê…ëÃäO–{1ùê#‹-_¿]/¿{¹j£´lk)\)ܤv­Š¤»WQÙts:y÷å[¨úÉìx$n×›_O<u}ºkâÍ uUM¼9±çó{Lâ ?xa¥ƒgÿsý\ŒÞì:ñô‰Ëï^.\)<Ûÿ¬ùmO~:?ðãõ+~ÜmîÙ¡³…+…É?NÆU~u8ΰŠÊ‘±iþÚÒšÝ%U<ß¼þúÚ¯_‹¿&»QrÄþþÀ÷WÔ_Ûw¶›”£ß9šÌùÔÓO™ôÝŸÝ}“úëï_ÿ}œ8ùÇÉ Öê*ûó¡ŸÇ9WdaÉþú¾é¯Î_Wúü.^$ƒ?€Ü…\¬ßñ±;ªñ.z+º©7åï9ГLïy¨çÉ#OȽ“«B[dwdcÝmq+®®®²]÷u­ÑBYú›a7s8oüד¿‚ZâA¸Â³N:ú;wáL¸"ƒë…ÕUÖü”v-Ê®®zxEˆ m5Yþäú,BÒÍéüt€Ÿ÷ã¶4_bíÆcí•]wmÈú5“É%œ ãñ€buèÑC½_éíýJïØc+²™½' +æG?ˆ¾fîά¾ÄkÀÚ+»îº ë×ÅWg¯ÎÆk’Žû:̼cò“ÝÝm­&+ž ,sÞôÓÓ?ŸíÖÌ$“˃£Ç.§"«˜7]?}í•]‘…ªŸõY¿.çêÑã•kù$’³»e¶ëüûó»?»{)ƒéæôÍ[¿Þ0}•]‘…ªŸ[¿ö}£¯ûÁŽ?Úû·½«°9øÂ »­r: Àj²Îž>k[ØÙ]{e×l!ш7µ¿šÏO²çó{ÌÞJ˶–‡ÿþáŠí·õW3d=~4^˶ïl?òÍ#+í©ëÞ_×XÙY¸Q=½ïßÚþxýýá;²÷>>6~€»}ýý¦ÚAýüµVQ¿©6Q¿©Q¸6Q¯µŠ…ó×z|­%¨ÒôªÇ׿ֱÁ¨Ç×ZE}ýZ›¨¯_kõõkm¢_kõøZ›¨Ç×ZD=¾Ö&êñµVQ¯µ‰z|­EÔãkm¢_kõó×ÚDýüµQ?­MTùý«e9½‡Jÿ$¡$²¯uùç&ËÈJ•~ÿ¿«:j ÉßqÔQCÔв-þa^ü§*ôë\ªë¬Ž¥2üQ ·O»ÿ×îIEND®B`‚pygame-1.9.1release/docs/tut/surfarray/xfade.jpg0000644000175000017500000002060007670466467021642 0ustar vincentvincentÿØÿàJFIFÿÛC     ÿÛC   ÿÀ€È"ÿÄÿÄD!1AQa‘"q¡#2±ÁÑ3BR¢br²ð$4Cs‚’á5ScñÿÄÿÄ5!12AQa¡±Ñ"4qrÁ3BRb#%‘ÿÚ ?ómŒyƒœc¿Fsþ!NMpÕ»^Ûã¤;ì÷Ÿ¸“‚éI ö»¯Þ÷‰áÇŽhš$M@€\J6óV ;ÃynÌ­´¹nC¦Ê„Úªm…×KÝ`ÌZۆ׼×tJTH9oËæˆôÊUâÂá’Ë1ãÄXe€ÂHâ N9'ËëTW ƒ2YjÙnq¢ì—7HP£›]¹«tVm̆ÚR‡ñ+©õ¡4ÝÔè¦Ft©;§èk™IaÒØ Œøb¦Á”óuéH‚ÓAÂP• •þ±@mœ.,VÚÚõìL¸wp€ãKFÍ$tÁñIß?J®×š9«Äço·[‘•©¬`…g/§•%S¥*CùRÕ÷RFÉâ¥Æ˜ûAhKªm ­½(L¶vˆ îNÈ=’¤½öM 5g¦û ;Lfí¾ßû«TE¥n• 9#âjSëìÑ7ZâÊÜÇÆŠƒM[£"tð¶„‚¢?ˆÐ’zGuà·œá¹]’„8R” V¬”œž5“Ý+Ï‘9­»åa;ž”ˆK‚‡\T·øwî›PZÕÏ¨× V‰Ý£@˜ÛjâäìÅÿó­[ØD$[&51IKò€N2)spfF™º¨Éè«_ºú<<é{aÖ›“Ö¡_m¥Ëã«R¸’§2p<÷åóõ«Žõ-0 „÷I¥^ixbj¨Îv[CPëèƒp6+Rbº™ 8CAø]žp¸z¾í xЕ֓ý†Jz-êýjBËöØßj‚£…qõ…Ý%?t˜[S¶¸†É犧ÉNb‘ÌqÙ:/Î.vSoÉŽíšYÂ6Ãcqöéw(Kd2®ž1ІëmY#©QawÒ>ÙÐN*ŠUÒûq|•â@e¹X4E±r-µÁn<2[O»AÄÖWÛ2nØÂ]W8R¼Nw¬¬Âw»šÿ™XlR€qóAv¶ûË”DgO gþáWz´*Áo~t™ëf;cYÁ'¢@êj† ¸&ÇVy:ƒýB‡{Dº;«õ³R³ì0RâADZ’OÈëZNê©-Ü•×|bCjXOñü•[QêíH•¦-ÊL r¶ S‡ˆ#ÏÓjÄèÏ+ŽdÉ2œ<Ô¥s?<Ñ2RÜv@m´'aÈ(|j×n3LK%µû«Ã™m'‡/3ŠÙ™…áxT@ÕXžÿE—ç|‡Ý\—Ùå°î‡$6|BÇé] \µf®‰–ùÊmJz#ûŒgÀç_¿Þmc7]?*:9÷ˆAÀõ@ºknð\ƒ+ò$ÈØG,ù äÓ:¡‚TÓ¸Æ@6Ó©¼Ö9z6Í~cUÚ!΋”F}ê³üªN:ço•S]î&í=¤5îCŽrþ"§—úÅ&!tN<Á²‡äAh¶·hŽBBK«ŒŽ§Æ»‰É<è_v¢îŸº&Ñj†'ÝT¥qç°ydgóª wl—û$ÆÆ¤¶²¸.($¿aHóæAømN[I<±™ƒIhë^h6;¦ë-ðŒ šáw’¨V÷j)y{ øVÎ\b±izà·€†”÷ÅÑË€¬úÒVíÚ&¨Öòž~ÔÛVëbTRÒ\JP$ÏÃjõ%,•O-·=ˆð5(ùˆ7'Էݸ5¿ïòæj²ûsÏíF&gøB²sJg{K¸A·KµÞ-¨‘qØÅu¿º¢N7ÜuÛáU14L¹Í*TÙ‹bb½ô%¾Mž™ÿÕISᕵotLoGt“¤h%9R·ìñ‹,–Ú9JÈRÿ´u8­ .+VUršFwÊÄOÔ'éU¶ýo9­;yspÈ¡kܬpŒŸ#ü*l·­Oo†«•Ù~Ê€Ì\†ÇL' ¨”8eDóãmÈÝx¼5·%Ûã¦$H÷[m)úU%‚ÉtíõsŠ‹¨¶F†°‚”¤’ T¡Ðåñ¢ 01C2´+eÈ&>ÒžYZ‚0ç5ªbô•sÓ²*3ko­“œÐIrnÙtm·³8ôXj[Ó$¨)Ùy~n@oµm€Œ¼áÜ‘±ðÍ)tõÆv•Õp­²f½:Ý(p¡.’xvÏ-ÀåãMV&‰+Si‡­c•ñKM!†]ÆêI§>£dC"le¤„…¸RF(nlÆ¢äž(x “>ba³Ý¤åjçå\ìz}S–‰2°S÷’…>f™±¤‹»d{—اZŠ—µ(`œŸ©¬©Š KŽlµêk+6¨ýgüÊçÚê>ifNéñãOâ(BÖáo_^ñûG)'ž6?…¶ÑyÖÐ3•-#oñ ©íN.ÐüìwÒ÷d#ª“Ðþ ÿ굩m%KevÀ®¼ãAš¡ƒúþJÚûÙ–‰l1ûÕ¶B|ü«¯e=¡X4µÛTô9m¸(ãÎ6JVsÔÆÞ"¢Yõ+ÃI-<”:y²³…ùÔ™¶˜wþó·Š“¿¯:Ø1L2Õ©-“Ô ;œI@{­º•LÔ냌ÛY\„Gm/+!´¡° "eè[ä© äUsµd}k“3õ†[o&c·[Z6S.(žåœãâ6ªWÖQ´ÈFfŽÄñµ ~‰Ã‹ÒÔ§^[Q¥g¸¤æo¾¼_d?ö“‚³¹ÝJÏÔQ‚â«WZs‹%Ç[xg Vé<ˆ8ê>´¡šT[¥î:ÎTÛ âB”)N%Ø‹Ço’,À†]wí:WeKÜ?hÓƒ êÍ=m.%½3dC{¡È:£Œd”‚Ik¤…i©'ÁH?ÕMÍ¥ËÒG2}‰¡·ø9âÆÖ:Àü¢Ó\¶ÉLá.v£©æëÉá'ù}Ü}1]uk!í;4 8†|ipOqÚÅñ )°£Ÿ4 Ô½Bž;ñŒýŠ¿ ´àÀ?s{ŠB]%D‘]2?³ÂÕÆr!©QþWÇ %£H:n=ÓþcW¹aÞÂYŒœ­jfJTðRÍQheñé¨Ã9ÁPþ£P\*jÞÞãæ•Ÿ¢«¶øÏLj[¥O2’³Ð¨ºkX¦š&dŽA rφL×-q1ÖáG†Âø–çwŸ/R)…Ùßfðmn!õ0•ÂòÑ•)]U¿-ù ˜Æ±³‡ÈèiÚÜ”œQgqÑÛû0¹Ü´=îï1…7už¤.$S²¸¬œƒË<€>G\7l†ÜIðä5)€Rxqœm¾qŽUèÙd¾àá÷P’(¶iV„¹9ÝåISjɽð*ƒC‹ÔÒÌéuvéáˆ9º¡È².3O$—ç‚*‚f°q‹Œ˜q­ÌuÕÝdíã€ZiÕñØàçìSøW={:{µK‹¥%Iz1l¤oxþ•§bÕóÓQG<&ÄÚÿø˜DÀçVš7O]µEôj q X0RRÚ÷аq·>¹ÏÂŽôü®ê=ÆSßu8sâyTØ×1g»<üVŠàËN`òÄW˜MâS6¨ã»C«ï^#¢ô+¨šJ©Œ’›’¤›`Ü¡IÒ¶õ]Š®†ZÎ[ýï:-J°ž{¨ëZÆe=ÛqÚ,´ò©©ŒÄàÓwß$pÛŽåEŒ)Áýõ~&²¾¸0ë£ûêüMefµ¬ÿ™\û_ñrýGÍ-™q,¼ÒÔ®¥Ä’£ÓÞqM&┪Nídæ(BÌÊ»ÁmßÝ—ÑÅðâ7´žÔ¥YnXl1RüÒ€¢§wK`çu8ß*Ðpæ¹ã$bî%uïÚ¨Ïõü•×Rö9§/²¸â°»c¼Šâ“‘éŠض©³´§,÷Öæ4žLÈÊ×mò:xеM]dZMÎÎÅÅ rVÈ)W¨ÈúQ3?ÚÁ9¤¢Ti°WüAM…=ÁüªÀ_BïÜÓ÷TËsuÕ³xºY®lÛu B}ÑöNãÝ^øÏߨ«÷K­© IPÁIäETëb;R½ZãÛb8Í®*/¼0¥Œü9}jÜ$ày­O©©ª¥qª×°ö¨éZÖ»ÝP;$™û2]þÖµe˜ë6 ó)>¾ï¥SX Öz‹ûî©c¾ùýjWfqœ½_¯O4 L‡iPðÉ'éÃYs·1Ú„¸« Je*lŸâÊAϪUTL5ÑÅ‹‡7btòNÞ ‹UÛX ¯M΢R¨SS²Å¥ÝeVp N|Á#ò¥ìè‰ øË$%Ä”“ᚯÒ:îûÙí½v§m ¹GAQaÆ”F2sàvÎ}jsŠèf™ì–&ÜZÚ"R½­¸rï¬[ö~Ù¦Œñ# Œtû1úW[ªxíSœe•¡ªËx¹_uÍCvlGyñÂÛ#øSÈ,ø×M]qM¾Ã$“ïº;¤v?LÔÆè°—sÅ·> H|žê•Ùë~ÛÙÜô¨à2Ô” ¼RN~µYÙúø´òGò¸¡Dú.Ñ3Oi(î4ƒÞ?fC/# Wp7ê%Ùʳdy9Ý/¾Bª¼0ïúï+7A|Ö¾äË+œŠdÏ!ºJôZ8Qî tç>Ð}Ø0œè—Æß#^™‹*Žƒï$ö<©§ W»íä–¦jІ ÞÖ™ ÐW´tKIVGˆX4pâ’®c¥ ëøŠs@j¨€¥DYÁðÆj¦Þ²p㥂SéE•éØ'ÿÏR*¢L¸=¦<ähTSŽñCîƒËå]ôJ¸´ÔLmŽ!ýF·±¾˜®ÚÖ´ñ¥l©8ÿ±bµlgÞÁ£ws|”l_ªSÓ¨¿Xd¿:#qfÇy-)M#…+ÈÎ~•s¥­Ê‡ãq{g¤Ë óæO¯åUs/\!Úâ„¡rŸï7ú~4d†›Y a¶ýÔøý+'ÍR k¢ïhÊ[*ÇÊ¥Kpã¨<1\"20:«F®“›a' R½åô K9Á­°U\Kpø­_æ5•"áCŸ)€A º¤ä|MefõLûö•Ïÿ/Ô|ÒâÌ@»C'—|Œÿä(_^¤éÞÔ^+þsIîÞæî€GÈCEa›´?úÈÿ0£›ö™© ª%Æ:d2NFv)> ô5£á.¤LÞ¢ºûŒ[ž¥ƒúþJY²ëo¶iiq Ü)' Ö®ÄbAËŒ¶áV€jS݃JeÒlwçc å]Óàà|Á…U'³}T©*a½@ÂÊq¹ô­j>*¥‘—–3u˜˜6*jRÛ [@ðØ ÔZ›ÚÂí– dÉxp)mòHëƒùô¨›K] j(öY—?l’êBÖ¢RÚwü4O×nÓÖâxZHhó‡Þ?ëÀTŒ5Òb±¸B9qu¸ïöDÊ#:êUf¼ê>Ï®îÔÄèë÷”žjIø¤þF¾v…® ëdڤ‡*5ú;…*l§ 'žë¿-¼kªuý¤»ÁÄèOÿaFߎ~•o47qe ¸áNòzЇ D¡ôsj7Jó\œuWD¹¶}B,±²›pã'ÈþUz•¥C!@hCTÚ¸ê[$@ß ¦>qM -@©#×sQeè¨ñu½ÎÊÔ™Ë#ß$q“vñ>$1‰éê½ìpØítŸ,æEEoµ¶¥=%C“h9Qù~´DÅëQF‘s+bJ÷„ñž…_<¨: ¹aNÜ'H—){©Â®¿<“Lp쪵¦HÛ÷F|­f‡uÙoUhö8cÁMÊÚ³ÄÚÐr@>YÈô«}¦./ßU¨ïM%€Ú8Xg;çÏ\mŸZ¡öMI¦Åm¸»:*Fñ]$€<’OኊΜºÜ`ût«¤†åà¸Û|G<üvùT””8¼¬ö9/•º÷$ƒ£ðÝ=´Ô>öâýÙÑÄ´¡M7ž™ÆOÐzU¬gË€œàü©7oí‚t.Ïá¡ ¦Eår XØ€ã s>òG™ç\àö“ª4¼¶¿®ç\„¶óà@†«BŠyZéۆÒž‹qR ·8rO!U®êÖ¬Î--WÈ«<Å}¹ÏCv–i`¦JâžJA ƒó¥†¤×Í=0Fö#už±žå'düyïåŠB8µÔ\ö!s­©Ý2šŸûQ*—œ÷Ê+瞦²«´¼Õ\l0ä®8ˆ§RTX‘¹ÛzÊËêÁö‰í>kŸ«µª—ê>hVǵâýd˜S?÷«÷vó¥…q]á¾^@þ¡Lk•Á渎4Ÿ½Q4¹„Øaj`ÇòTùÊE¶ÌûÊ#½PÛÈ%jkÚ¥)g.lü‡® Wz³Ýg<9ç[3œp€AøŠ+€êYÿHé°JЧ;IÔå—\d–Ò£àè+ö!¿j»•kR#>à.`ã#'?<ëR5 jÓý¦<ëÇì.H JÏ,œõZßRZdÉ\[…½|K7烟ʴʺ«tTý!ºdâ-ÎÉÒÖŒ²¿låÚã˜E<=ØlžyçÏ#´äagÔ:‚ÎÚÔäx’T–ʼˆüô¢vÙ¨Û·˜ãN‘r)à=ÃΩô½™ëdwÞ–²äÙKïQ99̟߯FðÝ[+yŽi ¥êÂËÍåÚF˜ Imä8@Øì¢*ú‰FåÚN§–¢ S„gæåQÔ¤¯´»HQ÷[o'6Y¯šh‡µ.¤xƒ ÿ’ªB2$âóü$/hl¾ê™Òߟ Ï ÎåÙGßs8Ârzü‰¢›föm? ;θ,åµ¾J†|xyPäFS3µ;Skûˆl©Yð Y¦•™ŸÛ·õ¸ác$,ƒ°ªþ?S,Õïkîµ/ FTÛ%¼[ìšz1HKÏIS‹™8ó­§ÌnÝ é}Æ’Uñò©º;ßß4Ã9È.¬àsÇPë…ði©{ã%#ú…X8nGCEQ8Ü+¤f÷žï¦t-÷´HɸJ¸~˵ºOtÛc*Zsƒ¶FÛs>”qrµ[ûìöêõ°8.L‡Ú)dà–I¢>Î"):2ÂËi»U¾ úì6+‹îcü;T®Æ5©›[—¢IrB¸ÝI;g势ã5’atÃLlÝ3¡î$¡øº†ål¸µ ûÙ”îͼ‘±>¸4A=}Ü *çÂÚÐÕgmØTÆí¬€ãÍÈ÷ y¸úþU&ðTÕ‚gêÔ ñ<&àXŒõt²óÍòÑd`iBß±Ýg³+Uñ ì×WR±à”c?4}hŠúÊ/Ziòß¼Ðu-ÇéEšÄ‹ÿa¦ØG’ËŽ¹,,ð}@ m 1OÚ\†ð=ìU–Ô•sýdT'ÎÙ5öx)iÛk8"m5«=£³¨Ó%9†ím“÷Š~èø‘Â([FÄvk²ïs‰k%$ŽC;ãðùPØba›#M4¢˜®KïUðŸÃ4myœÖ±­M€ž†ÙOŸOÖ‚Pˆe–®£hî>è’ºã(ëM-6 »,RFÏýƲ¡hÜoGZƒ¹ã,…óÜ“ùÖW<âsk%xëq>+ ­©wŸ4;l‘ì·®àu'ëE»tx©ÒxE©E)@ÊŠ“ó¢½!{ЧÄyymC¡«•#Ëb v®¾ã‹Œ_É[Üä"U%9IöÛ%Ú]–£Â‘îïãSµªä%·¬žyÜU;¬ªêä{<ý“{¸±õ&ž5¡ÅQ]ke ºÿ †¾·g¾öw™L¼Fp¯åKïÛ³ô¤“mÔQiÆýÔÈHÊVã&MµÀ‘Þ‚2“¸æ<)ñjÒ6tLmÆ­PÙ<[-ÐPÖ´°[µ5ÿ†t&d)q¨ : ŒU€qMYw2ÀÕÚ›û;@J­4ZÔ}¡.K$®$vH.†xp>¤× 4óvA{-iiõ>T’³Ž-Ï_›ñ˜¶i˜]Ë6FZŽ}î(ãüO3ëU:ŸGéÍYhUÓÙÖÓ©WZIBþÆ¡©ñ‡G]í¤jOš9ÝÊ€têWxí×a‚òd¤©;Œ‘÷©úÓÖÓnMžÛÜŸqYYÆ ¾É4¤( ͸µ¢;+áBÔx‹ŠIòÍ0QÅ!Eg“š­©5S:CûÒÌe†Tœí¡µ1ª´»Î£) þðXÏåCÝ :`àÎî:©ü©ó«´»]XÌ9Åm”ñ™ ýæ×˯ÇqK›/a‰zeË­åË”H‹ mžÁÈ É;|*bƒm-´Åº¹','8rghæ³NÛè([HÉÁ‡£Öõý°êÆfÀlîâ}Åscp}hžýwáÿveYð€~bªwØãÞ;ñp~>^s¹m·ZP‚FP”ú6èWVÉ µ6-©µlHNU’4“±îb}¢s–Ùâ<ØøŒQN¨ìù­HâîÑý™q@â. ÈÏÝ¥å#‰+ãÎsÏ­¤vg{}ðé·-*þê‡ëNûGÿþŠ? —MÙÄ•݃ÇÕu+ZüRPù@ÓDƒ•¢µ wqí/¸¢1œ§õ¢KFƒ¸X­Á¶â­éo{Ï:01ä)±ÔÖ PqMH oª†—PôÝÁqDpˆ©“ì—In:–®µò°ŠÅ_Àx£å²XÜ´ååˆí˜±Vµã¦26øÕ#:&ùí }È.WÏqúÓ¤l+1F¨ZÐÔ åž{QUÁÅ, à¹õ¨W1seûë~[›¬ ŒŒô¦7e x¦©ºäoªñ`:¤¤- y[×mî…ÉDmõ­ghËüÉ(l[\ çECaNÜVxÑOUrÑãêŠØÃREZ÷:PŒmïF„ÊÉÿÖ‰Ò³Ùm,¢Ê‘ùÓ+•gJ7ùMU­xú¯ÀK‡tÅÇn‹;øŠÒë¦nÛ?Ý£8ëË; c gn´Ê¬t-⪦›äoª÷,n’‘ôEá˜RvÜúœRÒ„•åõ¥–™ìƒX™ó®—$„K}d%*RIJ}~å^¸¬§ôkWC7=±4žûú¤Ý\Û]yïØþ±¿êÌ»cݲ?¾¥©IÇžÿëL-%¢u)¸:‰¶·#ÅB}Ò²‘Ÿ!½>qŠÏõ_×VLf‘¹ùú¡d-`°JoöVæÒ–”Áw„(ãaË&²› VUEø”qyUO—„é&‘Ò9î¹7êô_ÿÙpygame-1.9.1release/docs/tut/surfarray/SurfarrayIntro.html0000644000175000017500000005315311132454222023710 0ustar vincentvincent Pygame Tutorials - Surfarray Introduction

    Pygame Tutorials
    Surfarray Introduction

    by Pete Shinners
    pete@shinners.org

    Revision 1.02, Sep 7, 2001



    Introduction

    This tutorial will attempt to introduce users to both Numeric and the pygame Surfarray module. To beginners, the code that uses surfarray can be quite intimidating. But actually there are only a few concepts to understand and you will be up and running. Using the surfarray module, it becomes possible to perform pixel level operations from straight python code. The performance can become quite close to the level of doing the code in C.
     
    You may just want to jump down to the "Examples" section to get an idea of what is possible with this module, then start at the beginning here to work your way up.
     
    Now I won't try to fool you into thinking everything is very easy. To get more advanced effects by modifying pixel values is very tricky. Just mastering Numeric Python takes a lot of learning. In this tutorial I'll be sticking with the basics and using a lot of examples in an attempt to plant seeds of wisdom. After finishing the tutorial you should have a basic handle on how the surfarray works.

    Numeric Python

    If you do not have the python Numeric package installed, you will need to do that now. You can download the package from the Numeric Downloads Page. To make sure Numeric is working for you, you should get something like this from the interactive python prompt.
    >>> from Numeric import *                  #import numeric
    >>> a = array((1,2,3,4,5))                 #create an array
    >>> a                                      #display the array
    array([1, 2, 3, 4, 5])
    >>> a[2]                                   #index into the array
    3
    >>> a*2                                    #new array with twiced values
    array([ 2,  4,  6,  8, 10])
    

    As you can see, the Numeric module gives us a new data type, the array. This object holds an array of fixed size, and all values inside are of the same type. The arrays can also be multidimensional, which is how we will use them with images. There's a bit more to it than this, but it is enough to get us started.
     
    If you look at the last command above, you'll see that mathematical operations on Numeric arrays apply to all values in the array. This is called "elementwise operations". These arrays can also be sliced like normal lists. The slicing syntax is the same as used on standard python objects. (so study up if you need to :] ). Here are some more examples of working with arrays.
    >>> len(a)                                 #get array size
    5
    >>> a[2:]                                  #elements 2 and up
    array([3, 4, 5])
    >>> a[:-2]                                 #all except last 2
    array([1, 2, 3])
    >>> a[2:] + a[:-2]                         #add first and last
    array([4, 6, 8])
    >>> array((1,2,3)) + array((3,4))          #add arrays of wrong sizes
    Traceback (innermost last):
      File "<interactive input>", line 1, in ?
    ValueError: frames are not aligned
    

    We get an error on the last commend, because we try add together two arrays that are different sizes. In order for two arrays two operate with each other, including comparisons and assignment, they must have the same dimensions. It is very important to know that the new arrays created from slicing the original all reference the same values. So changing the values in a slice also changes the original values. It is important how this is done.
    >>> a                                      #show our starting array
    array([1, 2, 3, 4, 5])
    >>> aa = a[1:3]                            #slice middle 2 elements
    >>> aa                                     #show the slice
    array([2, 3])
    >>> aa[1] = 13                             #chance value in slice
    >>> a                                      #show change in original
    array([ 1, 2, 13,  4,  5])
    >>> aaa = array(a)                         #make copy of array
    >>> aaa                                    #show copy
    array([ 1, 2, 13,  4,  5])
    >>> aaa[1:4] = 0                           #set middle values to 0
    >>> aaa                                    #show copy
    array([1, 0, 0, 0, 5])
    >>> a                                      #show original again
    array([ 1, 2, 13,  4,  5])
    

    Now we will look at small arrays with two dimensions. Don't be too worried, getting started it is the same as having a two dimensional tuple (a tuple inside a tuple). Let's get started with two dimensional arrays.
    >>> row1 = (1,2,3)                         #create a tuple of vals
    >>> row2 = (3,4,5)                         #another tuple
    >>> (row1,row2)                            #show as a 2D tuple
    ((1, 2, 3), (3, 4, 5))
    >>> b = array((row1, row2))                #create a 2D array
    >>> b                                      #show the array
    array([[1, 2, 3],
           [3, 4, 5]])
    >>> array(((1,2),(3,4),(5,6)))             #show a new 2D array
    array([[1, 2],
           [3, 4],
           [5, 6]])
    

    Now with this two dimensional array (from now on as "2D") we can index specific values and do slicing on both dimensions. Simply using a comma to separate the indices allows us to lookup/slice in multiple dimensions. Just using ":" as an index (or not supplying enough indices) gives us all the values in that dimension. Let's see how this works.
    >>> b                                      #show our array from above
    array([[1, 2, 3],
           [3, 4, 5]])
    >>> b[0,1]                                 #index a single value
    2
    >>> b[1,:]                                 #slice second row
    array([3, 4, 5])
    >>> b[1]                                   #slice second row (same as above)
    array([3, 4, 5])
    >>> b[:,2]                                 #slice last column
    array([3, 5])
    >>> b[:,:2]                                #slice into a 2x2 array
    array([[1, 2],
           [3, 4]])
    

    Ok, stay with me here, this is about as hard as it gets. When using Numeric there is one more feature to slicing. Slicing arrays also allow you to specify a slice increment. The syntax for a slice with increment is start_index : end_index : increment.
    >>> c = arange(10)                         #like range, but makes an array
    >>> c                                      #show the array
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> c[1:6:2]                               #slice odd values from 1 to 6
    array([1, 3, 5])
    >>> c[4::4]                                #slice every 4th val starting at 4
    array([4, 8])
    >>> c[8:1:-1]                              #slice 1 to 8, reversed
    array([8, 7, 6, 5, 4, 3, 2])
    

    Well that is it. There's enough information there to get you started using Numeric with the surfarray module. There's certainly a lot more to Numeric, but this is only an introduction. Besides, we want to get on to the fun stuff, correct?
     

    Import Surfarray

    In order to use the surfarray module we need to import it. Since both surfarray and Numeric are optional components for pygame, it is nice to make sure they import correctly before using them. In these examples I'm going to import Numeric into a variable named N. This will let you know which functions I'm using are from the Numeric package. (and is a lot shorter than typing Numeric before each function)
    try:
        import Numeric as N
        import pygame.surfarray as surfarray
    except ImportError:
        raise ImportError, "Numeric and Surfarray are required."
    


     

    Surfarray Introduction

    There are two main types of functions in surfarray. One set of functions for creating an array that is a copy of a surface pixel data. The other functions create a referenced copy of the array pixel data, so that changes to the array directly affect the original surface. There are other functions that allow you to access any per-pixel alpha values as arrays along with a few other helpful functions. We will look at these other functions later on.
     
    When working with these surface arrays, there are two ways of representing the pixel values. First, they can be represented as mapped integers. This type of array is a simple 2D array with a single integer representing the surface's mapped color value. This type of array is good for moving parts of an image around. The other type of array uses three RGB values to represent each pixel color. This type of array makes it extremely simple to do types of effects that change the color of each pixel. This type of array is also a little trickier to deal with, since it is essentially a 3D numeric array. Still, once you get your mind into the right mode, it is not much harder than using the normal 2D arrays.
     
    The Numeric module uses a machine's natural number types to represent the data values, so a Numeric array can consist of integers that are 8bits, 16bits, and 32bits. (the arrays can also use other types like floats and doubles, but for our image manipulation we mainly need to worry about the integer types). Because of this limitation of integer sizes, you must take a little extra care that the type of arrays that reference pixel data can be properly mapped to a proper type of data. The functions create these arrays from surfaces are:
    surfarray.pixels2d(surface)
    Creates a 2D array (integer pixel values) that reference the original surface data. This will work for all surface formats except 24bit.
    surfarray.array2d(surface)
    Creates a 2D array (integer pixel values) that is copied from any type of surface.
    surfarray.pixels3d(surface)
    Creates a 3D array (RGB pixel values) that reference the original surface data. This will only work on 24bit and 32bit surfaces that have RGB or BGR formatting.
    surfarray.array3d(surface)
    Creates a 3D array (RGB pixel values) that is copied from any type of surface.
    Here is a small chart that might better illustrate what types of functions should be used on which surfaces. As you can see, both the arrayXD functions will work with any type of surface.
    32bit24bit16bit8bit(c-map)
    pixel2dyesyesyes
    array2dyesyesyesyes
    pixel3dyesyes
    array3dyesyesyesyes

     

    Examples

    With this information, we are equipped to start trying things with surface arrays. The following are short little demonstrations that create a Numeric array and display them in pygame. These different tests are found in the arraydemo.py example. There is a simple function named surfdemo_show that displays an array on the screen.
     
    allblack
    allblack = N.zeros((128, 128))
    surfdemo_show(allblack, 'allblack')
    
    Our first example creates an all black array. Whenever you need to create a new numeric array of a specific size, it is best to use the zeros function. Here we create a 2D array of all zeros and display it.
    striped
    striped = N.zeros((128, 128, 3))
    striped[:] = (255, 0, 0)
    striped[:,::3] = (0, 255, 255)
    surfdemo_show(striped, 'striped')
    
    Here we are dealing with a 3D array. We start by creating an all red image. Then we slice out every third row and assign it to a blue/green color. As you can see, we can treat the 3D arrays almost exactly the same as 2D arrays, just be sure to assign them 3 values instead of a single mapped integer. (grr, jpg kind of wrecked the colors)
    imgarray
    imgsurface = pygame.image.load('surfarray.jpg')
    imgarray = surfarray.array2d(imgsurface)
    surfdemo_show(imgarray, 'imgarray')
    
    Here we load an image with the image module, then convert it to a 2D array of integers. We will use this image in the rest of the samples.
    flipped
    flipped = imgarray[:,::-1]
    surfdemo_show(flipped, 'flipped')
    
    Here we flip the image vertically. All we need to do is take the original image array and slice it using a negative increment.
    scaledown
    scaledown = imgarray[::2,::2]
    surfdemo_show(scaledown, 'scaledown')
    
    Based on the last example, scaling an image down is pretty logical. We just slice out all the pixels using an increment of 2 vertically and horizontally.
    scaleup
    size = N.array(imgarray.shape)*2
    scaleup = N.zeros(size)
    scaleup[::2,::2] = imgarray
    scaleup[1::2,::2] = imgarray
    scaleup[:,1::2] = scaleup[:,::2]
    surfdemo_show(scaleup, 'scaleup')
    
    Scaling the image up is a little more work, but is similar to the previous scaling down, we do it all with slicing. First we create an array that is double the size of our original. First we copy the original array into every other pixel of the new array. Then we do it again for every other pixel doing the odd columns. At this point we have the image scaled properly going across, but every other row is black, so we simply need to copy each row to the one underneath it. Then we have an image doubled in size.
    redimg
    rgbarray = surfarray.array3d(imgsurface)
    redimg = N.array(rgbarray)
    redimg[:,:,1:] = 0
    surfdemo_show(redimg, 'redimg')
    
    Now we are getting back to using 3D arrays to change the colors. Here we simple make a 3D array from the original loaded image and set all the values in green and blue to zero. This leaves us with just the red channel.
    soften
    soften = N.array(rgbarray)
    soften[1:,:]  += rgbarray[:-1,:]*8
    soften[:-1,:] += rgbarray[1:,:]*8
    soften[:,1:]  += rgbarray[:,:-1]*8
    soften[:,:-1] += rgbarray[:,1:]*8
    soften /= 33
    surfdemo_show(soften, 'soften')
    
    Here we perform a 3x3 convolution filter that will soften our image. It looks like a lot of steps here, but what we are doing is shifting the image 1 pixel in each direction and adding them all together (with some multiplication for weighting). Then average all the values. It's no gaussian, but it's fast.
    xfade
    src = N.array(rgbarray)
    dest = N.zeros(rgbarray.shape)
    dest[:] = 20, 50, 100
    diff = (dest - src) * 0.50
    xfade = src + diff.astype(N.Int)
    surfdemo_show(xfade, 'xfade')
    
    Lastly, we are cross fading between the original image and a solid blue-ish image. Not exciting, but the dest image could be anything, and changing the 0.50 multiplier will let you choose any step in a linear crossfade between two images.

    Hopefully by this point you are starting to see how surfarray can be used to perform special effects and transformations that are only possible at the pixel level. At the very least, you can use the surfarray to do a lot of Surface.set_at() Surface.get_at() type operations very quickly. But don't think you are finished yet, there is still much to learn.
     

    Surface Locking

    Like the rest of pygame, surfarray will lock any Surfaces it needs to automatically when accessing pixel data. There is one extra thing to be aware of though. When creating the pixel arrays, the original surface will be locked during the lifetime of that pixel array. This is important to remember. Be sure to "del" the pixel array or let it go out of scope (ie, when the function returns, etc).
     
    Also be aware that you really don't want to be doing much (if any) direct pixel access on hardware surfaces (HWSURFACE). This is because the actual surface data lives on the graphics card, and transferring pixel changes over the PCI/AGP bus is not fast.
     

    Transparency

    The surfarray module has several methods for accessing a Surface's alpha/colorkey values. None of the alpha functions are effected by overal transparency of a Surface, just the pixel alpha values. Here's the list of those functions.
    surfarray.pixels_alpha(surface)
    Creates a 2D array (integer pixel values) that references the original surface alpha data. This will only work on 32bit images with an 8bit alpha component.
    surfarray.array_alpha(surface)
    Creates a 2D array (integer pixel values) that is copied from any type of surface. If the surface has no alpha values, the array will be fully opaque values (255).
    surfarray.array_colorkey(surface)
    Creates a 2D array (integer pixel values) that is set to transparent (0) wherever that pixel color matches the Surface colorkey.

     

    Other Surfarray Functions

    There are only a few other functions available in surfarray. You can get a better list with more documentation on the surfarrayreference page. There is one very useful function though.
    surfarray.blit_array(surface, array)
    This will transfer any type of 2D or 3D surface array onto a Surface of the same dimensions. This surfarray blit will generally be faster than assigning an array to a referenced pixel array. Still, it should not be as fast as normal Surface blitting, since those are very optimized.

     

    More Advanced Numeric

    There's a couple last things you should know about Numeric arrays. When dealing with very large arrays, like the kind that are 640x480 big, there are some extra things you should be careful about. Mainly, while using the operators like + and * on the arrays makes them easy to use, it is also very expensive on big arrays. These operators must make new temporary copies of the array, that are then usually copied into another array. This can get very time consuming. Fortunately, all the Numeric operators come with special functions that can perform the operation "in place". For example, you would want to replace screen[:] = screen + brightmap with the much faster add(screen, brightmap, screen). Anyways, you'll want to read up on the Numeric UFunc documentation for more about this. It is important when dealing with the arrays.
     
    When dealing with the 16bit pixel arrays, Numeric doesn't offer an unsigned 16bit datatype, so some values will be treated as signed. Hopefully this does not present a problem.
     
    Another thing to be aware of when working with Numeric arrays is the datatype of the array. Some of the arrays (especially the mapped pixel type) often return arrays with an unsigned 8bit value. These arrays will easily overflow if you are not careful. Numeric will use the same coercion that you find in C programs, so mixing an operation with 8bit numbers and 32bit numbers will give a result as 32bit numbers. You can convert the datatype of an array, but definitely be aware of what types of arrays you have, if Numeric gets in a situation where precision would be ruined, it will raise an exception.
     
    Lastly, be aware that when assigning values into the 3D arrays, they must be between 0 and 255, or you will get some undefined truncating.
     

    Graduation

    Well there you have it. My quick primer on Numeric python and surfarray. Hopefully now you see what is possible, and even if you never use them for yourself, you do not have to be afraid when you see code that does. Look into the vgrade example for more numeric array action. There are also some "flame" demos floating around that use surfarray to create a realtime fire effect.
     
    Best of all, try some things on your own. Take it slow at first and build up, I've seen some great things with surfarray already like radial gradients and more. Good Luck. pygame-1.9.1release/docs/tut/surfarray/striped.jpg0000644000175000017500000000530207670466467022227 0ustar vincentvincentÿØÿàJFIFÿÛC     ÿÛC   ÿÀ€€"ÿÄÿÄU—Ò&f¥ÿÄÿÄ% $%RTcd“•£ÑÒ¥ÿÚ ?›™'nk#1Õ&IÛšÈÌuHbu±Ë’A¬rÇe¤âpT¨ò_D&IÛšÈÌuI’væ²3RA¬rÇd†'Pk±Ù)8œ!Q侈L“·5‘˜ê“$íÍdf:¤1:ƒXåŽÉ N Ö9c²Rq8B£É}™'nk#1Õ&IÛšÈÌuHbu±Ë’A¬rÇd¤âp…G’ú!2NÜÖFcªL“·5‘˜êÄê c–;$1:ƒXåŽÉIÄá %ôBd¹¬ŒÇT™'nk#1Õ!‰ÔÇ,vHbu±Ë’“‰ÂKè„É;sYŽ©2NÜÖFcªC¨5ŽXìÄê c–;%'„*<—Ñ ’væ²3Rd¹¬ŒÇT†'Pk±Ù!‰ÔÇ,vJN'Ty/¢'xÏKöÓŒô¿mQL“·5‘˜ê“$íÍdf:¨a%`ºìj¦¯+n­ü‰Þ3Òý´ã=/ÛTS$íÍdf:¤É;sYŽ© +Ð?a0}y[uoäNñž—í§é~Ú¢™'nk#1Õ&IÛšÈÌuHIX.û ƒëÊÛ«"wŒô¿m8ÏKöÕÉ;sYŽ©2NÜÖFcªBJÁtØL^VÝ[ù¼g¥ûiÆz_¶¨¦IÛšÈÌuI’væ²3RV  ~Â`úò¶êßÈã=/ÛN3ÒýµE2NÜÖFcªL“·5‘˜ê’°]öו·VþDïé~Úqž—íª)’væ²3Rd¹¬ŒÇT„•‚è°˜>¼­º·ò'xÏKöÓŒô¿mQL“·5‘˜ê“$íÍdf:¤$¬@ý„ÁõåmÕ¿†'Pk±Ù!‰ÔÇ,vS¼g¥ûiÆz_¶‘R¶]sô÷×e¶¦þ…1:ƒXåŽÉ N Ö9c²ã=/ÛN3Òý´Š•²ëŸ —¾»-µ7ô(¡‰ÔÇ,vHbu±Ë”ïé~Úqž—í¤T­—\ý½õÙm©¿¡E N Ö9c²C¨5ŽXì§xÏKöÓŒô¿m"¥lºçè%ï®ËmMý (bu±Ë’A¬rÇe;Æz_¶œg¥ûi+e×?A/}v[joèQC¨5ŽXìÄê c–;)Þ3Òý´ã=/ÛH©[.¹ú {ë²ÛSBŠA¬rÇd†'Pk±ÙNñž—í§é~ÚEJÙuÏÐKß]–Ú›úPÄê c–;$1:ƒXåŽÊwŒô¿m8ÏKöÒ*VË®~‚^úì¶ÔßТ™'nk#1Õ&IÛšÈÌuHbu±Ë’A¬rÇeu'„ej<—Ñ ’væ²3Rd¹¬ŒÇT†'Pk±Ù!‰ÔÇ,vJN'Ty/¢$íÍdf:¤É;sYŽ© N Ö9c²C¨5ŽX씜N¨ò_D&IÛšÈÌuI’væ²3RA¬rÇd†'Pk±Ù)8œ!Q侈L“·5‘˜ê“$íÍdf:¤1:ƒXåŽÉ N Ö9c²Rq8B£É}™'nk#1Õ&IÛšÈÌuHbu±Ë’A¬rÇd¤âp…G’ú!2NÜÖFcªL“·5‘˜êÄê c–;$1:ƒXåŽÉIÄá %ôBd¹¬ŒÇT™'nk#1Õ!‰ÔÇ,vHbu±Ë’“‰ÂKè‰Þ3Òý´ã=/ÛTS$íÍdf:¤É;sYŽªIX.û©ƒëÊÛ«"wŒô¿m8ÏKöÕÉ;sYŽ©2NÜÖFcªBJÁtØL^VÝ[ù¼g¥ûiÆz_¶¨¦IÛšÈÌuI’væ²3RV  ~Â`úò¶êßÈã=/ÛN3ÒýµE2NÜÖFcªL“·5‘˜ê’°]öו·VþDïé~Úqž—íª)’væ²3Rd¹¬ŒÇT„•‚è°˜>¼­º·ò'xÏKöÓŒô¿mQL“·5‘˜ê“$íÍdf:¤$¬@ý„ÁõåmÕ¿‘;Æz_¶œg¥ûjŠd¹¬ŒÇT™'nk#1Õ!%`ºì&¯+n­ü‰Þ3Òý´ã=/ÛTS$íÍdf:¤É;sYŽ© +Ð?a0}y[uoä!‰ÔÇ,vHbu±Ë”ïé~Úqž—í¤T­—\ý½õÙm©¿¡E N Ö9c²C¨5ŽXì§xÏKöÓŒô¿m"¥lºçè%ï®ËmMý (bu±Ë’A¬rÇe;Æz_¶œg¥ûi+e×?A/}v[joèQC¨5ŽXìÄê c–;)Þ3Òý´ã=/ÛH©[.¹ú {ë²ÛSBŠA¬rÇd†'Pk±ÙNñž—í§é~ÚEJÙuÏÐKß]–Ú›úPÄê c–;$1:ƒXåŽÊwŒô¿m8ÏKöÒ*VË®~‚^úì¶ÔßТ†'Pk±Ù!‰ÔÇ,vS¼g¥ûiÆz_¶‘R¶]sô÷×e¶¦þ…1:ƒXåŽÉ N Ö9c²ã=/ÛN3Òý´Š•²ëŸ —¾»-µ7ô(¦IÛšÈÌuI’væ²3RA¬rÇd†'Pk±Ù]IÄáZ%ôBd¹¬ŒÇT™'nk#1Õ!‰ÔÇ,vHbu±Ë’“‰ÂKè„É;sYŽ©2NÜÖFcªC¨5ŽXìÄê c–;%'„*<—Ñ ’væ²3Rd¹¬ŒÇT†'Pk±Ù!‰ÔÇ,vJN'Ty/¢$íÍdf:¤É;sYŽ© N Ö9c²C¨5ŽX씜N¨ò_D&IÛšÈÌuI’væ²3RA¬rÇd†'Pk±Ù)8œ!Q侈L“·5‘˜ê“$íÍdf:¤1:ƒXåŽÉ N Ö9c²Rq8B£É}™'nk#1Õ&IÛšÈÌuHbu±Ë’A¬rÇd¤âp…G’ú"wŒô¿m8ÏKöÕÉ;sYŽ©2NÜÖFcª†V  ~ƪ`úò¶êßÈã=/ÛN3ÒýµE2NÜÖFcªL“·5‘˜ê’°]öו·VþDïé~Úqž—íª)’væ²3Rd¹¬ŒÇT„•‚è°˜>¼­º·ò'xÏKöÓŒô¿mQL“·5‘˜ê“$íÍdf:¤$¬@ý„ÁõåmÕ¿‘;Æz_¶œg¥ûjŠd¹¬ŒÇT™'nk#1Õ!%`ºì&¯+n­ü‰Þ3Òý´ã=/ÛTS$íÍdf:¤É;sYŽ© +Ð?a0}y[uoäNñž—í§é~Ú¢™'nk#1Õ&IÛšÈÌuHIX.û ƒëÊÛ«"wŒô¿m8ÏKöÕÉ;sYŽ©2NÜÖFcªBJÁtØL^VÝ[ùÿÙpygame-1.9.1release/docs/tut/surfarray/soften.jpg0000644000175000017500000002230207670466467022052 0ustar vincentvincentÿØÿàJFIFÿÛC     ÿÛC   ÿÀ€È"ÿÄ ÿÄC!1"AQaq”Ñð#2U¡BR‘±$%bÁ5Cc4Dr¢áÿÄ ÿÄ; !1AQ±"Raq2‘Ñ#5br¡$%3CDSÁsÿÚ ?é³ap@ àq&ÆÞªpõ†Û´µ‚Üf‹dG˰ÁYŠ\ˆyà)-ƒÀ±þž~áÇžŠ‘LodVL0è'Þ˜Öà ž!êTýÅ ÆWÓ€1î¶ê6üðA]ñ­€¹àMà$Pò•ÙªzjX¶Bé›f^"˜©”rÒ¿.Hùk…€’QŠ… •Æá﨨MUZÔ‰Vqd2’2ªIûÑç³ÂvY¸P[dg*»m3¸¬æRmÈ“FýôLTÀ òÏZ!h{ƒ]VrÆÉ¬OÉ@ÄD¼Jxˆâ©“·ddƒd ¡žµ)ß*Ì(€ó£…ŸÎ&%¤¿­sêt³š>N8âº+ D ]Ãz¦k=ð»@á1x[6è&ÇAúó¢ì¨4ŽÀÃ{®H9;fíu{ÞnXÇ•€ˆ3iÀ\ª_ï¸:ùzöýmÚ£Kgn ± ȇ8p¨vÀÚ—«JÚ[S^+s\†2éªqíŒ=Ò—ÙõûUíõ‹퉛«áÇCךœ-œ3«¹Ñ ¹$ e ¤‡\ùZ3„àÀº·§cQ‹'T*šEö®ç±ÑÆ †D»ˆ™ïûR¡Ø¢eô}×u[éªgPŒƒ˜˜ÙÇ=ëÆ·<£ÛŽPÍÅ~Sn.„ò¨‚¦ÞúYߎ٧þ‰PÌeg1Ø.ë³P`¸SbÑ“c [~ÈþÕÂn9裷„’…ÜÇD ?Ú¹³oi29ØEúKÁÿ¼¨gTIŠòœz?Ž)#ЙpAÉV‡Ùàç$GgjF´´$xöÂb¢¦DR(øª²ºâRY!B9?ÀÙN3ˆðe@By}¢xþ"©tÕ3¶áVÐó€óßæƒVZ>‘!žxx…0Ϻ¯š´²Ö$¹g³ 6j˜¿0ù­U¹b”Ϧ9òéT=}ºê¦­´µS}“uˆ±×¯*™´µ¾KKi#ܹØ]HâãÛd#ý°«ŒµSµ VMŒÃ¨ØSŽç7xÅ­¤ÑT^™)2ùòø‰”´BI6Ñ ¥ Ù{*Š:œözMHûR ÌÚÄé”D¡ï«“˜ÓV•¯¹à¸ùÿàU˜Í4î<‹JšÆAëÄ/CQÈWT%Ó|v~œ´d²ÒÐ…8 †®ˆxs¿ZøRô»à~ݳŸ"ŸQ:Iˆà*åÔ‘»¢•†‡‡záë¿Â!(#]й[å|­pØçè…‹Ú¢xÊô6Ê¿Zju«4ÏðÚ¸@S/˜UFí¸sL ’&寳±Ðq]º`›Oû<µ€Ybý²¢¢€#¹wÅ.SÝ£iû™ uXŦfˆsØ£Ÿ­šB|8IwO¢\{‰üHâÕóiIC7DÀe:…CNÉÌÉa™‰cãºkÚB-Êèg"ÜC½X‚ÿ š˜ ‚3Ñ}u¾.q„¨ñz.(ä¤{½¡¸#ÍlK^r@WËRÜF×b R”\¨Æ`ó®õ‰²aÎF€ZëÚmÍqÙ¶£Ë):bäâÊQ-®×w­«0Ý+æE¸P.Û—‘Æô£¦º¦V62X:œl„¬k°ãºn¢)”À®ºAHhEA \Ÿ š¾VºãZZ ÜgX T½ Œ—Æ|ü)3»µûQ5~UË«pˆÆA¤q*pÜàÖ½iµÔÜæ1ÓÆ^G`±$Ín\ó²=³Œ¸œïͦÁ‡ªY åÙz·7Æ6ÀAP3šU×í?úÚ¸áÁÌÉ€šÉt0×ûûjñU9*Ôò¥Ü3‘?⢚'P§%™½]&’š(±É×¶I'cZOTáÓ»V8휬'A ‰ aÈ{CêéJS ˜y“2E<ø>¾¼*КÏ0ÖÆ¸ãgRqaËHçêp‚¡ÚÚWf¢EF/9:@HÀ² ÿ„ž4‹MWÖÖº#˘}ï–ëΙ±³.=Q.ÛdHÈMÈ\h—ouR¬«Nw\né¨á¸‰Å‚€˜— `φhˆ‚<”žsÂP.}”;{£I8”xù glÔr~3&ÿj´º¶Ñu­·EKiw)m„‡O#òéeei5½¡#†qNô›Óq.ðÑSß],Ê‚‚éqȈ€àiN±.i½8ÔÈØ9)gÑC„…\Âa(øu¦ŒÇÚ §LÕ:¾ÒÔÛê]IR0æõN8ÏŒÛøB¿¿•]Lb—(b‡SR­Xq¦pRÓ Å´5Ï×@kâ̰U™]7ò]ä€xŠC®‘¢Œ¹œÏ8bó#O`»˜œêÙî `ÆAAý†²¥f“M(É2$ •% üF² ½½¦||ER9÷¸Õãã>©n`a+6bxIý‚…Ú¢ÛZîÝ眱rA7Q -Ä5ˆ°D@N †CØ[í §ŠÚ¯"îøaÛw]&^¦/×ÖõatÊ;]Î:™:oô]Jã yêàoðû|ǹ“µ¤3ΘqÔk·²þ¹Ù:ck«6ØÐóf0”î•OcoçPÖ¦£CÜídÜ‘ÁÑPp >ú‘”´á§Ã‰ÛWþ>ÈûêÝê5O­"ަޠd±ýl‚wSe® —€ÔkR|ÅôY¨ç„8áœåû†¦æˆƒfi‘­Ê›#ÉH¹óÍ$r% ©…F*¸ŽW¨ *b¹ÜκE×Ún'aú*L$0¨&ëû½¡Žœ·ƒ®Ã+Ù.Ñ6È Òtœ9rå0 €SãJ&˜·+ûÎì|ó…Ãò»0séEõ[8Õ[M9èÙŽšÅÏ(=Áò ¶Œ7V:åº,"*&¶ #×9¡¸xó& ‰³ßo±ZV´ˆK²¤uÎ5[¨=À«¢¹DÀ€fž)tšiµ¨Šå¨É5L!æ!½%šÚN+ѼHr›÷¦ÓGά¦—[ ˜8¸X¦PǨ)OŠð¶+³ F2Ð}PV치J{£ ŽÑwÜwÖ(÷|ºµa™XÒ@b„„â øV™ô}´ÅÌ”˜ì©]AH³¥KŒþ‡(hæ¶m#1ÙÞˆ•N[R‰1î!ØmEEc Á‘‰ÄaëÅ t€Å5…%/tsýjßmÌÏcvñä:¦E`1@|„j¢JqØ,ÀGr‰ƒÙ½1¸ZÚfwå>¡¯Ç†Ðõ¿æE)7HWn]”?@ «\z¿©™°)äßt© Q7{¹õ’YÊLE4TQVA`HL^¸Í{>vt†_»dEBEKÄ&7Zxk=hl£ `#.wÌ¢ô”¾3yÞvAø.Í“óÚAt]MŽŒä •VLÇópçëÛT¸}[V!ù¸‡5HÂ)ˆmº×¢r‚.–)S’җþÖÖëPÑù—Dh˜8)ˆn`2ùÔ cÕ·]cç„ï!ß)YôŒ’=û!üT%c›»L¤X€põÕSU]!<ò&: Ì›†Á“&ÛÏj²iò€­lçðJÍ¡·QlîÑÓ'Q¸8MËQ §ÃÅUYY}®·Ù`­¤+Œíæ2iâkä-rפšrêEâ7œœp²ŒŒ(‚ióq{(ídÈú9¹aÂFûMâ54Îâ ^årê=¸ž)ùp«cÅñ®7 »%À0'%%Îp!ü¹ñª{p¬¨ºUºz“—’S’>VGáµJi¾¥Ì¢“2EGâÊe7Ó7|¤@ŸM«\Lri7AƒR P!pqãS)Ç00ài>Wø›vÂ>füîd1& ]ýÃY_wxXÊ”<¯öÊ‚?äÏüÅR*Þ5Ÿý©K” €GÆáÃßúQÒ;N¸Ñ"’%› `È(;`4EìÄN@:|@>=*ÁÚ/´Ü…q!fÙ¬HâLHeÑ0©ŸOÅ$ÀÅyžNË©ü[pe}9?õ]z‰ÙǼ$hÄU„sŒ ­#ì¡ÌÿcF´;›jç$ŠÜr86<ª>µ¦Ú ÓöêÍÀÙ¡±€(œÓ·ÅŸ(Ô‰IÆÈE-üdòêˆïöGãaû…7Ù¤aÎå›]W-Ÿ<Þö‰<{…öIÆ;‡÷ÕåãDß´U MB‰D×UkÕ¯ùŒ¼ [ÁÆ*Ú(ÜBébp˜ûÕ ç#F¦9‡L™ «G¡n7²Ct¡=Æ7MÚ¦27þÍBöX›KºßYOðÍTç$AƒqÚ©¶3‚ŸV/bÆ8tëRÝœ"—»ok™Ër˜Sr¯( _,Ö»–Ý6›v†±yH>D ‘‡¡† Í:ø)5`‘‡ / z%YšçSd®Í^DV°dÀ"ýéªìÀºo´^Û?À€=w ^'¢I7í‰Ç±¹:ƒÒÍq¼´&[q[|ó “0‹eH=7Û4÷â­’¶¶xª©£.ÆßT®hãÈyÂëÕæßgö­’(,ܦÛÙ]Wq9–Ì¡G` ¿º«pDŸ½ïéÞâGÑ\9þR×N«ÏÑvP¸r¤ˆL#¶ÔîÒtÒÙ´¬†¸rìãƒå„N©ÂZœ±HèJ/¡3i˜G Q\¥õ€ÕsBÏÅf‰?‘c÷¢6–Ùò¶&’dR8Ó5 剂 t%^+}ùa+³ä¡Ð7¨·†RŸÉäAÂ5X?d³UÀ©ÜV’÷ ÒˆôüÁ^‚ÅŽ5°$Br˱vÎÕçÖ´`„|žÞð¯G­v «nG;íÈ;õü¡IOg-ùä÷Ѷ·š/¢åM€<(7Úµ‘VÑ‹•0Èd=CFçG#4Ža‡… uê%WZ%v.l¡ŒõTQÄÇšQ‘Ø¡)úX¨­bŘq²x¨K]ü”7h D‘3»3Q*¥âÚ»ôaPRÁaþœ‡ï[l·iÆöœ†:¤æT Q/º­V²Äº:ç°o¢mÒñ$& ×¾\^–k×ñÉ2“f¸$&L¼ z¸é¾x¨ÉiÇAþ%ЂHõù…V¥š‰øè"fxãš°òøæŒH4Dü S $ˆp«Æªˆw+ÏÑ8˜ÁŸwºíµ b 'ÎF¥%\‰€x€ÿJãl`ŽH µjjš—,Ò Ó) nùñ°QqДrgˆÙÊ:ªÉø£e æš¿Øk*Bö,Q¦Ú@J™.CǺ5•t©œˆª/?ïÌügÔ¥âÁ,¼(›§Ú†úè‚–h…¦dJaŒ‘L ›éG3D‹8åáCýIÿ`£¥û¦Pz‰xù¶ErþSc¼O`Ôã¤î/µT ÈÆK]•Õ.D%¬§àú––oÛH  ·Y5Ò0l%Ö‡qÎÍ•™  ù˜SR=‡dš¸9í+±fHnnBù(UP;:j@¿;$®ÆçmÄ5l`⮢Õ@sß¡ÕV§P½»ƒ²–!Ä nEªA¸ã ê£ ¹U€· g¯îDú* Q4Þæƒ¾ÙÚÒ3Æ~íbÕä˜xH_¯­¨ lÀé¼Iœ.þ#…?0ªœ4wºSLñFߘl瞸î`€1¶ïnUsIo ïA@ÇJ 6ŠwÎ_ã}}kîµÅjèÀÈFEºcv3>HK·}jì&·@a(•À #Žx¦<֬ѱprÎRšfŠ*ª!ÝXLöè[MÂ¥²Ùë2æ÷Éú„gÚ¤kq#T™ª‘ÓMÊÙúž"˜NšÝÜ\Ë ÑRñ„LPñã êE ÆsP­xÔÒäAÀ&©Ð @G­pIé*Ú»5j!$ð²(ŽÎ×3Å. Dƒ·[EÞ¦s€lšfȈÐeù ÂûdúhUk‚Ê—ºSga¹?ìÿªíL“µyd¬*"`­·Û›Rß³ÜÄ!È3ƒ4Ó1ÄÔ¥‚ñt¦•·¶Z29æ>K0:8Ü Jb¢®Yv–4ê’r‰>ƒY°¡ŒÎÁ/ö÷l¨ÄÝ©é=Êõ“…Ò`ìyÀvÇÏjbå¸'h\ JÂtJª ˜ŽwÀŽÁ]4Z)Í¢Pjˆ–O”³¸›¨{EZ.¯žZÛ[€t[ïßå÷JURFkÇUqj$]ïtA3:‚Æ-Yu× lšô¾ÊÔ¦ÕhæA'숙Sæ&;†‡º¼ç³tm‘×!ÁÃŽB8)BŠŒŒá¶®Ü–äi̬§ÍÉMÜLsûPÚÎÓt|M¼]~ܽÇÙf’v31F6N£&«Mºÿ°˜äsåU-y¼à[Ùï …ërúJBˆ*wõP ´'i™§7ö:?†òI?ñÀýzýA ѵ&eçg¾|}Ä⨈ÒÑ÷KË=;6ó=²Ô²‡ÖÄì=CÓ¦û299˜5Œ*"¢FâÀ [t;Of]^†½î²¦ÌÉJÙ°˜8³ìªBñ·þŸ¢cÁÎ/$Ä !誘M€ö G7²®™xE&_Ï»løV#p8KãŒ|éËSdÕ•P›Dàølù`yTIN=öõ)æÓÈ`u6îãp\¨R4sáõþõkbáf®ø„DJn´@ö°šƒÑXö¨¦W7"ŽLÍ5L?йíþÑZ‹§òÌ\]⌔3•@ª¥À¤56Ë[Q“Å,b|’›'dd §‘UÎ󋽂dÂ>U§Z®ÖÐrr61L§‰³Y?q"[Q›ÖÇü7éR?”B–}DÖ¨+_Ð iésïÈ ä í¢4ô¹pw`¤.\z¦ôàÜp’"9ÒPßýF²«¶TÉî 5+õúÖj¡…¸tv¬ªÿ+\+jC†9ÙRI÷¸ÕŸã>¨c§b7#üÉÿjhÄEÊ Ïõ¥sO*MB”pMsƶ31R =ŠPØB—*^Ö´DÃÓª¶{€Q!ÜëýØwj ë70¦Cs€®kÎ<׎¦Úö²Ê ¹T¢©Dp ô®Ý@l¥…¯îº3˜ TðÍnÔ+eûÕãçaN–8*—ú±áVVÉ·=%5¿ý@w©H²–²«™Ý×Dl÷–ߨjA5œ®_,8Ãlg4”ØL‚ؾîëiº‚£.ŒTwÈ2;_í~Ü@M5 ÌoÑEDÀ2 —=2À×·*š»äÑ=ç‘»lŽÑ±¢1²ö±€Nßµ¬–<²¦³‡@s¡`V©Yt­ëyG«~DÀøŽ*c¶Û¯J¼ìf  %瀶¨Ì £§îÊÅÂ_ÞŸü9¨}%–ºµ½@ÈûŠVûòµ¥I龈^zòÌ“r¦„Xß‚š_œåÍ®{R²–‡O¹…šeê|€v þ!Œj#vw‹´šÕl‰ˆÍl~ô"íæíW#rÅEÑ8ÊAP”Õõwš£%d…Ã=Ò¤qµŒ.A­){pÒÌ|û.XûˆçqÞ£Fó¹ï‰G,¬èðQâ w*t ³—.´û Gf]Ü{*o²ým³†BÙyÅ$³“‹\çÆ§Ýcx©Ó6ªJKiäk›¹ ž13Üçî‡ñ·åÁnN#xGz!—×(wDjóq* [ò/@@ÂöTk¹†K\ ÙTv‹°Ì]ÌPÍtÜÆ;[ç3ó•¦ÛŠSÐúŠºíkªöÓÍÈ6wØì´©…¬{y{¡Ñ¬õÛh4à‰8ÈÒ`üݺZ»ÞS¼4éu0X‚E­²‘¼»- tù‹;TL1¿gÑçÊ9·ßA=Ϥ°PÍÎSuÜ)•ÃúæTMYi—¤ ãëº;ZÀÐÙÙ, W3Ým"ýp'ب‹|z˜: 4¢)Y·’7d‘8Ü=PE.0Ï |>½t<*çœyc c=g¼õ Y£Û.Þ²ÌTpS0E‡Q7Ÿ×£,M£©ªº×rŸ0€ª½¡êS9i*Ut_GP2Á¬¨}$Mrh»t ™Îlùˆ eQ+Œâ¦ëY;FΑÇó*ŸHÞZú±äóꇶ{ﳞE8ÇþÁE`;›•á•\ÃËþ´dEdÐ2œ$öQsJ/(ã½2™Dá·{j’m’½”î ó]OâáÍÆ™¹Ûz­·4Š1§!rSÛWÝ¿ šöÊò*›€¡Ý øN_–ÜKüºåP¦ˆæª+5RåpÎÚ‰ ú2"²… ‡Ï4«bGê¡ã—‘ª¹~è`ët,“ExØ8Û/þ¯Í uÏi‹ÓÁÞ1Ž èãÀG©¦"S€tÿ+И´£Y7jÄʈÖÙ«B:Y¿œsw„èº`m©ícÔõ¶Ì”G òìQi)Y;pRï[ _ð…]êãùSM1ÈkƒÕô…òÍ.jB«Ž4ùåâ-=î‘Z)J&º6ó 8 ]¨o«Úyn_w¯*B%³ŽOwˆ ƒ§J7ŠWc ¨!¡£°@ÐFwJ¾Ÿ&– ëRÏÚq)ÙžÝâÇrXOP´¯«ž*MR¶Xîä2ƒŽ ÈÓunéÌ_£¶¶E°î*7/x}£U=KÒKRmƒ\`ÐíœÜ"r éŸA¬Oz7‚ܸ’qÛt3éÿeá”ÓÔÔ»µég1™p“dxåÜ2>TôÚvù-hmŒ;\x”oA®ÊzUÞJq‚›TOš‡ŠƒçGôÄÏTæŽ2#œS~÷s7:¹*ÁyÉýÈbähŒ$ó¶;eZêEŽíÁD¬C%<8³CÝntCÚˆ7!€çr¹ @.âmü)ïÕ ‚Ö‹@ce dGñºOó&j]ìîÄÁw¶up\«KÇ0T’mÓ4ï±jØívj›k™“'B‹ÕR8Ê™-hH ;€ôÌ‹À8¶ß†‚ -áÔÖRÑhdÂr¦!¿x(z\ånRF²7 {&R—À:UIÛ„*~!µ>SOhüYÊ0A FÔ©éMÄ ÍkrOÉ00¢dÏ·WÄž”¸i=ö½·(x—Bn#zfŠ:™ ­ï¥U¹"]}‹0@ Ãb¨>T9Š‚Õô2iÛá*‰v#’ô7®§»F±²Ý­Œ ¿ÇžA€RL”ÒÅ!tEi·t°èNšjzEIy7N øÔƨ­È±¥Mÿ¡Ö‰ëÛ¥Öå°;pæ$ĆïÕµB=ƒÔ}CbKtÖ›¦fP@ŽªQ€gqõÓ†ŸWéÊkuMyÄH@šiËÚç¦ë²ce n0¼³rÀ|DF•k—ÜNÐó 1Ëi-•Sògl¸ù({R*Öj¹› ™Ž°›Æ—ÒIÆ­[q­Õ+‰FàYD‡8.z BÚj¥ÔwˆdƒwsŸ2”çÑ–•$ÚÓhÚås5€ Ó¥TÙC«¬ZÆOpUÁƒòä*è1m[]ÓñÌ^Z`DõZû5Ú-;5yeˆ?jʪsˆnRýj™x—weµÑŽWIï;4“Iq/;á0j“+aÓd ŠH(B€tˆVW4`œÖkPDN(ª#Ÿ`ÖW9¹O´ÎÄUDŸ÷…_óŸUQ³´.úU—ˆ@¬¢&"g)‡ €…]öm»ž=ô¯±Î™úä‚ßéÅÉ[ß•d QpOå]XÂæ‡ýYÄ“çM¶ñçDçÂÈFObº5©¯SjYÙ-H ,HÜžŒ_­Zƒv°Ž9¶ãéë¢-£¡³vlN<ëI9%ÕÛ%õS?÷žõf?O~ýæ‡ýYÄ“çB&݃y["š"™ÊÄéÔâ@QU‚…©y»aV"TYœçáÆÔaûÍ ú³‰'γï4?êÌ~$Ÿ:Ðq.íÿC"†ðÛËÊ—[ƒOn¶LQæ'Q\nðªSm»ÌõG‹ÅªeÔ ÷¦ûï4?êÌ~$Ÿ:À¹¡ÿVcñ$ùЮâuÙÑø~qô(LÞ‰Jw¤·ƒ„=ÐÇ9 °‰ºbª÷V†^ÎÛµƒƒT8sUÈxÓ»÷šõf?OgÞhÕ˜üI>t x“uiπݾEèZä¹FéŽÎ>4åj‰ŒÁ·üF¥™é¼âPó;ýæ‡ÿ«1ø’|ë>óCïþlÇâIó¬ž%Ý¿€ßÈ­™Yº¹´&Ð9R`¡”Ç@µ qi¥ÀÎÒËFGpýpâ9IÔ=Tz žõf?O`\Ðÿ«1ø’|ëxø›vaÈ¿‘XtAç$¤ò'DîÅœƒ‡1+q€ç×7£—¬¬Šh„2žŒ¹ò)ÇûÍú³‰'γï4>ÿæÌ~$Ÿ: ÜK»8—[¿È­Yœ›ÿÀûºbH¬ «XÔ¿1ÄC¿DV[4ɺm‘:h&ó¦ .hÕ˜üI>uŸy¡ÿVcñ$ùПÞmÛ”4@Ü}ê°)Ú; ­4 §so½s]eq!nÿ€bu+ùˆ@)…ûÏú³‰'ΰ.hÕ˜üI>u–q:ìÃÌ oäVL '9IÓ}»ZBH.x…Îì1Ó!Gs-vdÍS^ᖸ歷@õÊ‚ ¦“#¯]z³÷žõf?O`\ÐÛÿš±ø’|ézÃÆKÅŽ°VÇHǸtÈ?ª/% $g!+Éë§²VªÞ—ÃV¶¥ ÌACÂ8…ô›DïÔåÕo)£8äHO‹ã SÅ÷šõf?OgÞhÕ˜üI>uë¿ï÷š·ÖT@Þg|Žõ[EEMåiJœÖ—Ü ¢$ÊXÅ ‘T@|1Â5”ÌÜ·,7ݹoóV?úE÷$þAõÖS*†÷UTé&|{“ž‡ºŠåá­±ÓÉ9•Ùy$ôê~ËÿÙpygame-1.9.1release/docs/tut/surfarray/scaleup.jpg0000644000175000017500000007521007670466467022216 0ustar vincentvincentÿØÿàJFIFÿÛC     ÿÛC   ÿÀ"ÿÄ ÿÄW !1A"Qa2#BRq3b‘¡±$CScr³ÁÑ sƒ“²ÒáðT‚’”¢£Â%'4DÃÓñ5dt´ÿÄ ÿÄ9!1A"Qaq¡#25%3±4B‘ÁCá$RSÿÚ ?H%9Ë0-pÚDV¼ˆQ "ú]‡ò*ôa L`á¥@Bð!êdÄÛóJ· zÕ»¬S¢`ÄÒç°(ÒÒXåœVbSË9©=¥Ñ¼É½ë¦Ž]²yŒB7sÓYdLä™ ˜ÆN;3W½Eí@L0Èirë,‡z[z3‡Z×S"üZÒFf f°² C&Ãd 'dÔÆH‚VìuíºZboaBÅó1ö¥˜6b¥‘$QÔ˹<á¬YR\9Ï9b=…†W»rz;ë}Ê‘Ÿbç¢Ú—W{ Y·¤aÑ,ĵH2èsz¥¡»É»Ý’'BUº:ìúàu]*é•F¨¡Ð aÜao°u,>^úOìf®5†[8X¾9§*»›ÚÜCÙ\ïÅ*ƒºK‘á¹²ÌK°Œ´aœ2DC‡ ‹uöÅÞîm9ÔBâÀeÉâ„’ä>âöšSˆ›¹´v– áƒ!ò¡–Ä­Þ´ÑÁ‘“ sÁTä#¦Rjœ>ðóh©ÚªË–|ƒ-ØÿxņXÄ©‘s–zzBí`¤  šK%ô¨« ¼û¿²Öf4R˜Ã¾5hxwG9Ú‘/”g¯ÚÄ—„×y|;Ðs ILÙe0—¿VQ®~Éž?z.ê‚”&J±9g) p ã:–„þ‡J¹ŽUe®’mgýÞèÝKC\$JÔL¥P#ö4ŒˆbP rŽójä1ÜÈ–SÏÝïi‡bÒ”„7úØÀ9@Žª-BÐ@‚—Buø¶ó‹À$ªÄ–!i‘t¦™ï»vÅÑP¬BF â  ŽYC²f;±9›Žˆ¤­!À„~»È§þÎÀÖñOîRñ)QE®c“3„†aPä#Ý–‹µ…Éñ3ŽêñòÓœKçKG‡§ Èà\Ä :¨:KNìjN${¿°à’ƒ†ôõóªkåVeË0ÐÛ2‡Ž(½¼,Pæ RœÏ)ÊiS¤¿cd¼ä² {£×÷_Dtñw$rRS úîo~̦ s)3²)´ë&ôo]mÌ)áÆ$íâU%4 ’©˜D|¥d5mîªñP‘ÛÜ7Ä1¥åúL7–ÒÂvä•Ô fˆþÀ`òþöŠðJÄžLêì®).j@% žƒîkõ¤°Çu$‰ëjYJZu3N Žöe]CPô}BB5HD:ˆBܱžXÜP5‚“²¢7we_êb,½ JšT7éO#²¡±+Þ•ôÂ`‰J›Y_ƒË”Ëìl,Å>™â8`L¿>m4Ïî ŠwOwc‹§ÿyžU…F朡„<¦èØyõ9òrò¯·êø’bå IND«’rðͯø°Þ ˆ06D”Í-&³JFžÕ‹¾(øº²–t†Ym.›¤41‰éCO͘í61pŠ)÷4ŒQTâZL¬¥ž’›J&Q¢­[ÍË9HrmuÀ&y»hÒAA8Õ”Ò˜JR²‰vÖ­´-‡·£Ì…ÖrÎc)Mªäz©Ä/¥DÞSi>Lþæì=‚$2E Ìms–’iXT%[<î“⾑\ðÏS˜€å1œæÉ28?„&×<†µ/îÖ$ísk:ºþSJeÌš<&:ˆ{þ¦ðbò›šr¯cáÍ<<:$ò¸ëœç?± oVó^"ðw—F´×¦­r14/f­pøýüVô …i†‡œ§óƒ OÚ`[&B7Và6ü•búLõh–8x@4¿_¨OÝö°Ê R øI—ó!TåH ¹´Ð&Ç Æu#ÓÊ¥ÄäzºdVB\éIr gNuRÔ6:Öí< $“{0¯Ðuwy#É9JIód2˜7c³‰£”…Äu/˜g*rúÆb ÐâIÓÑÜšO]ýíÓ‰–î¢I`2ÏMðõn%”7 "-ÎШ×Ãxð›@øëg ­áJ½ÂR)­ V™à~½X÷(”]T°ÖŠáIj€~h^  }©h£Cl #V±Î*ø|'JñW•S©1(r€u ­·»ÆÍ‘€ÃO ‚'òÓèJ®e—1 tD4ßnìT8D2{¥ÆÂæG±£$£uæq—cÎg5_RµyÅÁwwÅ Š^‰IgPrH®³du÷‹Ë^òrxg ™'IkDþüÅ&»Y.9^œ”*q˜$ÓÍ_y¶*>戛Á(n¨krZœ´J(¡3;LCQÄîÛŽà( $®RΙÓûæÔ{·½%èÁÌ÷{Ç¢U†ËLÌ`1K9Ð-o•9ÄsÜ2É”ŒÀ·„@³iÁ©ˆÒ*a™²«ö4ã២b¡Ãç<¹ô.slø%WJC¿»«eò㬹›œ²Ørû«&=Ûø ƒ¹þ†õVHãœ6ð&-'%4–cÍ3 ýÍJ‰ZU×TùRSJc—îjM¢¼´ÝŽb‘ZÎFRÓèµ1âÞ?D’)T#µE¼½›™$Ã<¶'%;i[—õFâÚœ$ˆc‚§9e=GÜÕkÊŽ»ÚB¸ 2R!ìöW„9Æ_É!Ø&N£ûšÂ…QT½!¨0é”ú÷b|5„ +*AåBÝuœtEÌDj¢Šy‡q?v¾¼ÀÝ匕Bs}ÂÑÖYÀ°×È‚Sȸs˰þö±ˆJ}Ú«êj¹bºJÖ•Pu-TºK°ð¼ím4kåÔÅ ´‹&2¯ûÚ†!)5âëa&ŒZh{¸ §‰ýƒPèÞÑëƒý ||•œ£!³QÙ+Ã:S9‡˜Ú‡ù+Y¡×¤ªIJ^a×0ïôZ6r¢ð¡DÇ™P—¿é´Š·ê31¡MÆ‘úÚ„?%ħQ­hV•o(³‰x$ÍœÂcÖ{³ -õ”t{8¬tÐÓ¢f½šë"Ó¦!Ήç3r†ªîÚ¯VYñÔ†(–  ¦Pý­R|ŽŽPU~æïîÃÄÑøjw7` Ž;GSmŠð{Lê¢îç¡L¦28Ï0 åÐX±å1jQ,0F©ËNíïk 0¢£äÄ6Â×Qè=XfMK’IdŒ>„BƒY‡g(ÙV)ªO9²!Õª÷µjÒ~zQR$¦î›a[Ï„¸8.:¡eèNþ‹V®õÂxöÀ¤"Ò"~a¤ÜÓLÒöeäl.ó 7M ‹·=nÀ¡gàjEž}ã̪ ƪL¡CCCѯË<"¨O4Ãiž³|M$9ÑJÒNr4„%9AøîÙ@ ¯³(Jyv1¼ðµ#üÇåÝc¬9Q(RZ§Ü»Êˆ¥Y®Y4©œÑ!ÄE9¾µC÷6›ÁÒT‘y æà.Z}Ô\`ÂT“D#ÎCÖBÒÐçdŠêî/‰zj˜Ô<Ó餆M¡†¼ÄÞzä‰eÍPrä!×<Á«×…kK ‰ñ¾CJ^ÈŽ¡Ý‹¼¡àÌvãùBÕ¼Ëkò‘Žà+(Kg)yL‡f¤¹ÂS!ÌuCÒ›P˜íñnSÄE¬szQ–Á–rn•žN²¥ '2›ØÝ)ÉEªª §ä§]bK»aóžtäO«O>[¨²„! §1äþëSVv#Òd&”Ï6—v9\RUE¢eÛv0_å uD\CÚ¾e ˆ|¨Ê]‡Oƒ ãñwسñÝœPÆx4¦•e.À:ˆK@´1ó½ªaMOHS®šåuwv)-ãây¾)ë{2¬¾©¤3 0LËÆ÷tJ°Ã±¾lŠÓvx„ãÞ‹ézÌsæ9v0õ”‰E&¾ABeÚsžAÛ³nGŸÁ72:¢2 Ï/ˆí]TT2 Œé»vÁ¸åÝÈsÙo¹EÊñH›BÐÓŠ%„A1K0Û6®CÔ;É~gºe9µ€ª*t”=>  ÒÕÂçHIM²w{Ï1mU懣|“Ÿ‹Èü¡×V)$§®óµ}‡©h­:) Xéž©óS)G·F6Þ ‡A(%r%!ÍÉ1Ϙ»‰½ì%²…w‚ÇÊðð¤€tå^CÓž¬QJõS‰Þôiz”ŽùêìÅä%·´½ÎrJmXÈFE7‚á˜{ÏÕ€Ö»0ð“Âb<èÔd;͈¹uлXe^Ü ‚öYrLÆöQ0…]z~°1 2wõü¾Î]GS0 8vâ‰ÖDðîQjÛ"õáÌqRºe3ÈY—f:0ø± ²ÞYòÓ¬ËØ;³Dä‚âÍéÔj_9ŽaW8†òȬ¾Z{ò¤Y#$2:s«LæP–ì¦[‹4娢‰éeJþRÖU'œå))K Vµ{d'Ñ>²²kÍäF…Yd\ÈZ”æ¤&9úBˆíÝ•ûÏ´êYûõ‚¬—|£ÃŸaR×€†ƒ»';©)Fß>¢ª7á{j×-Ÿ€úBSÄõ±f œ<äFo›O]Ç ÊÄ“Mò0® C9£HÚ J§`á‚î´15âoEšn´ÐjRކ h3€‚@™$L€›s¹¹Ž1°ò¬¶ŠÑÐÖÂ+k[–žPa×)fa®¥@®ß^¢>ßv«[^`Q·E KÁ.ç©E7. €?[gßàÝk*P ˆ ?nGW;]ySU‚Öø rF1„‡Ù›A¸K{ŽŸ)ÐùÔ¹9ªH@¹ÈòùÉäÞšÙHƒ”vŒI3Ö‚³ØÁ¡„½‡PèÞoñ'v‰[G’ 5QLÍžsM.¡ÙŸ«–€«fn~’á5Å‘rÎoÜz´•@÷ËJ¦zŽß¯†˜ð ž¶6ÅYÅ ¶Ï-§vEb CPÕÈ%²5hlTé¦n×1×)'_˜gÐ޹ÀzZ›àÃHßO%EAîÑâ-øCê¸=9@ÝCcvº=»Y»ïYŒ`ÐÒP»ôÏÚl"YS)ÈfQß» ­5š}|^·¡Å †E ƒ öÛbÏ'„žú©f'JÊÊdªzCPì Î×Ëæè^°u]Ñ·×[x+ö ØÓY±Óæ i0ÐÌpŠ/hí@¾ÓDÚ ƒ)C n 3k-"–…øA¦Y̰tmh[¡anç dsKž}Ço‹üÄ4tYS ‰ž\k~0ðyHO¯ÂM¨ƒ¾SŸ8jÐqKRŽ!H<æxtìÖ;?, EœóŸµîèÇœâÆ`$‚â`”ÎäB‹Uã1é˜RÔÝ4ìÒhR†Øe¡RÊyˆÏËÛ»AXHXÚ(¸‘BÖê]O9O”ÛLPb nò•é)Áõ¹MÙ+”TÁT“—”&?H£¿nŒhH‰»º-+yÎ{¶“„=Þ€2È@˜õÞØª°¼ ËvúŽÁÑsQ0ùmèš²yPL Ú☔¤ˆ€Ò96&BC&2ì¢ÁÑ1R£“1×6”)ÌP9g–Rnw)²÷¶è"–9@=m5Ù¹{ÃFV†’V.ˆ¨ò 'T´æ—V‹¶ö˜Ð'Ìo±©Ê½£Ðvµ¬bC»¦eN2D4³ïa¥·|ùYlCf yáýÌXtÜänš˜H<É:*~ðÜT2$ YN}:•¹w½¥Ž`4ç?w÷Znc\”xUuE4²™ºukR¯ÖRÏ!KÈe×Òõí>¬ .‘(|dP ¬PÐÛÆ}TÀ*(úܽþ‹BÚûý3 „¨ã¼åÓÝÑ­È^=Š:b’JR—û•¤´+(“±Ue%¾òع „BZŸ7 Bë²J )ò }ùF™T=G35Ð#%}x3òçÅ8y†R«*C@ËFëŠÙ¿“^j*T—Ù«°o>íUŽDÍÔå Ò˜Ja®àÝ6GchI¬‹{¸UÛax´±qwAlAõ¤®PÌ@%¤ØÅz¤q¶î–qTœ.½¥ó‰"¦ÿ¼~ ÍpÑg¶ÁåöuxziÚº“Tp”©e+ˆØ Z[þ=0WÃËàè˜tÌçde:­ìVF=Âen"Ο±.D—¥=uüR[V$‰© ŽÍg]ü,%$é„÷úBÒ üØËMš'þd„•{í”í£ dlì‚ö/éÒÁ¨£“º^%ð%QjSäÈ 32ñ¿ËQi(&õ@„ÃHz´Fè¿¢—…‚aèæÑ'ѽ»ûf îÎarÂD•ÓéUDÞÐŽâ,÷·ÐBcÇ*¯êÝ[pO€8†Ž0”8P´—‘k~8àAQž(â¦jæš EJ`‘ˆ]>æzíûüßü¾Bç–eÌf:‹\R9¡Ž®æãªP¤éžyåñ`åàGF*ü$£PÖsöìÎ\™´(¹õt^kú•VxÆ|XHLó[hÖh3‘hH´HÆœ‚zJm ‡ˆx˜º¹uÙ¥ÞÈš®ª”h ×VòÙ²!¹ÙMYd/w*ü¤9@B u®zŸ[ôh‡‡tpÌ+!‰)Lkûš=Kgs‘‘R‚þ‰GïÓ}Š®ú˜ÖÅ0éÊû;2‰,.]¶PÁƒQÑÀb»Œ¥)ù¿ki‘DÜŠa¦Fí²øòHq„C˜GÍ·ùÕª{HA@™ƒinÌIòï1tù%ì*¢ô¬@à]pçŸé5®yë£RnÉÈPszXCçi—ÀN v „Z êÁ‹´Êªê‘²í+WžÕˆ·(¨¥l\ üçêÔaÈ„…¯wJ¨¡jD9ýƒ·¶:Ï‹$ß²³ÑõLÕá^s¥„±±W®u¨‘3 Ô¡K¨} Ù¼ú³ðȵó[ƒ¼½åâXŠH…•)@% 3q‡k;¤ E=¸Ø„¤6NËö´Ÿ 6E7ÄPá3¼ÓNc•&X£¿~çÅæ¬ÂÇaKZËüVµŒ“¡ëû#U”³¶b‹›©iE:©,Äu1‡qŦÊYwn% Í¡Œ!pUíäÔ œ¦iê Ž¢Ñy.•Ýy*êFÈh`pÖ…¼c”¢#!ë&Œ~´ðøyDW_ Q Ã÷*“ĤJ6±ÝaFð®á)ŒŠz¼£ë&аü=Þ%é$g÷g8„¦ñŒïÔÅòŠ…I&pSYŸ#ró…Þð‘xNhT]±Ä=\Grï-ÕjÑ‘¼[¹(åßÁ7­ÙOº¯kícRØZR=Š‘<âh¾éæ0žlâ…ùЖ8é(>˜òà ò’‰OìêÁ48—µ¢dNóZƒ¾A,çù6­$ãk/š2TÑOǯžu$œ¹{Ò'ö74–¹c”9ý—z‡^ÑUÛß#%É•þk.ñZ¨pñðõ @«Ì·Ôß¾•¾B‚¬wCú •iÌIë>¢ÔÎ,,>ã,[¬!1Þ^1é1g%1r4SakÍ®[Cy@“òòÌGÖíÑžàlhj®;wn˜wJµ‹´I=EÊî²”‰´åõL;cP;ÂŽö¡ýSËN`¬³_Í­=ÑÅ’vtç}<é.š1@Á¡Åƒ·7¼ðdVxùB B Ë)ê_cì`¼öÁË‘:[MEl¸`ÎSCjœø ¨ì5(mºK_sîÙÇä6/ëš‘Øe?\ÅÚ}[ÏÍ‚µVEàèøj=z’>² *i‹woÅZ àzÐ+ˆ#óo%™Ž<¤O±CVíµŒ™¾”bºÉSFí²·j£Qøª¦D¸æ,¤IgʈFcnºÉ–ÎYb¦±0•άçøÃôêÀÛ²(ÚëXUž]ë+¼ù«I¨‡²Ì´Qt¡Æ &:†cÓ¯½†k>e™ÞL~[z•¦»Æ1è÷5&Ü^õ“»‚‘蟃_)'áÕ<ü»† _­¨üO^ú×_c 0õ(‰¿|ÀÈšJ¯1 ÊqÖL—]ýÖÆ/j$«Úêr ±^i&Y” _bY1yªYJܹ(Ú,Õ)PŒ¸§6ÆÕÝ=¿`ªû‚˜þ3 àÓÈGL5Y‹O ¶ð}ƒ=øÄ6S äžbu(ýLŒÆ8B)]„î‘.põp5Ì:«ïa}š´v‡ûj |¥ó‰I3W4Ä1ÊX“ÿ9¦¹Ç9!¥8®úF¾ÔÁ%C0=צç•åBK –Ù|MLdA ©@ªc4´Ž¶Þïr5H”Mýßu§O9‚™Bìn’ÙŽÎp'€"2Ó˜Ã÷vnUÞ\cÆTÍ`ðöJ–2²I6÷Æ{˜ ]ÿ¼[¼Á2VÈ¡,¾ffyʲLk>XJ%ü]Üb9m_^]qR=BDÓ Ì¨†°ÖÕMPœ¾šÞgÌS)Ã0Ÿy·1˜Ê}™z¼‘3` (¸ø{Mp¨uA“¯É#«Ú¼+´2i§ÀG9'‚îië½&ÜìÑ\;w¼û9ãéðïˆ|òSS3¨RçI@r$òn«ñ²Ž±Ëö''¤NŠ 1ÊjyL:2÷ÂÝ¢z„[…á¨fGÚj ½D–0jÔwgMº¯ã[ÊužšuþS]z'TïÉ¢Pòâ-Ò­*§Ä(ï)5=æ.®1ŒŠÕؤ>ñ±A“+ë‘fZL=縳 3cr¡ç7 ~æu1L3Hºeïo£Ñ@‚ §˜w×Fî{ˆàtJ<ã)ýsý­@~2¯Õ"îb™„bš÷-7صj¨'-R–òý7a¬*Q„_Þƒ!$Ì61G07`iKcDüKÉk«LåíÂň{ŠNé¨IQä,Çq±’[ =R´Îe3ºˆ†EPVìÍ»w0·Ï&zÄ”7æÿ°ÜÈsj}ªÎë´ÊŸj—o»Jåç€ó5–ĉs)K?>ÿDÍZ ´Õ¬v$…⦻08ZF,Kº>eª°÷ª¨†ÁѼãÔ-s²U“ðºhÛRXzžˆº!hXÅ,]W *“ºzáîÅNãÉJRVDÆì ΋ό=^%ìÄ=g[YhC { çXKçd É9»%AK:†£¬aÜGÚd¾Ò"œöߪeNŒåÕÜ¿V|\ˆìQû{‹3/r8´tV+Âúh%l²¸eà ­ò‹ÚMBLƒ-Ç«"÷ádÉcm‹Ênœ¨8a¬½sÔGÚgÈÁË)È:â½ÌR´é¬#š³Ë¤ˆˆ1+D®çªtx‡G ­ÆpßSSÍÃK’d»wH†³ÕrÆt¬©~îÍcˆ?Ûè˜IH†¹Îyƒ@ðõþlÑÌZjñ4ç=ìÝΓà~aÔdÒ;þ}•5•ÆI‰)1ã’*£å⸸²MÒºFzÔŠ;1nâ`ÈÃ,#€&«¡ÏeT–ýØ5Æ£¼¯Ñö¹øšùeå¥V6ܓߌ°0ÓÊ‘ ^]géTÝš7âCU…ð¹ŒuCœîªþR„³ÐtZ8¹€¡á\‹’þ’zõD½e£3Õ\V:•{*š¦ÈÉÎŸŠˆ€³jÚâÚ–©§YÀÉlÓ߀«ÃÅ…ˆ$o›ràrõÕxÛ·v˃,ÝC‘XòXq1 ÏÓ;ˆfšø;Þû µãš„‡ÂÒiNžg“¿N­hãìRZíÈeK7„çHÌršÎÿ N`ÄNr¤±Cš·;Ù¸BtL°x’´ÌæÃžc±–cv[8=TÆsŒMÊ\¥ÝfdÿcF7/õ.WgDãø$8ù¨‹KgÑ´µÜV ˆzf††ØC£Qnžæl]QÇ|<¦¦e”« +ÐÌP˜~ÎÐôö›¢"ª†¡0×!äÄÙ4¦6ž pÔÛh䙵“4nouÜ ƒf×{|IÙæ¹V ÞðË:*;C‰ã—Ë9™:|£ë& 9ýL¾Ú«Þ´W„¨: Õ”Ú%Ja=ZÙ›)ÓZ昂Fe޵žÜ×G·)Œð¥u ]8€ ^Bœ†aÑ›0Æý…M´uM«³·ºÀÊÌi|¿$@ŸÞ2Wx£´ÐxÛ™]W ¼ùPQõRêÕ†.–>ßÚˆ0F\|K†Ëã;—Ö§Ê"©D4eÊkIûº¨¾óâvª§ÒyY-ù¦ˆkËp†Y§ˆb+b=¯L‹IƒÊt͹e õaß ¶ú3SGl¥@±ØÕ¿¸+Cnínqù=#ÎjÉ5t!‡Bœ=‹;Ž·Bãv6]T,$ùänyž­ sHN;³ÎÙB)[…]õV¦uúrò1ìÙH°üªdEJ„¥©gÑŒ07r;AÅðFaê‡úÂÀR¸*ñt)O#]A—³—mÓy1¯¬ê(%ȧ6ZúåÀz²Ü®Ëp£rÂéB§Ç-DžÄ ¬ˆòöÝšïal2¯«-X()¥ËÏÌ]ûu6löª$wâ­R9RZe±Às˜n Ç"“³“±HRæIË1ÜÅ€oá·rU{Å+0:•ëºN…†_[|ó:Åד£kœþ DGêl’H¥6bÛ .îIi~\þª%/ÿ/Ÿæÿ²Û]› À-D%ù¿ì·~­Pµoë~ʪêÕe^w€å)ͬ6D‹ aÄQ78bK öMÕ«Á˜æ×«¨uñ¶ªYé‰ýƒ·µú׋ÿ²³ñ °Þ%Ü>Ûëò‰©ípy‹”Õ(›Öл°—†›~^:¤9èô"õ)šS¦’ªmŠ;Vv]ßán²œÌç×üY(¿û´ù:´nwRœDÿ'"¦@ÌÆˆŽ€Ôã jƒ˜Ÿzfó%®±³³²rTª`3¹²ë1ÓVQn‰À,>0®åò«å§3˜r*b#1fBÌÞDÔ¢S¹¾bOóG Ç©CÙ*(e§qÈá\ë6¨ »D ^»…-³.ÔÄ1H?LÁ¸Â…άüMA_Áwô‡éÕNÌg*Ä6ƒ“vÕ ÷0TMô”¥Yg·\¿¼Àä­Z!„Ðè†$½L›™_{ £7jlê‚%r˜­Š–zmXõg¸B°ÏŸìn³"Cd ÊQ]çoæ9LÊïmu ù#a)²×çxWruœâxH «GûŒü‰ :˜E˜‹œâ ÖÝ‚ˆ=—ÂEÉ*˜ž¹Ö#˜& ¡õõkí§°0«RêtЬ\Õœ7Ð ” ҹؕÜ>øçSb:‡•i)È€9 Ì:˜Aœ”WfNv;‚¡}M ª-Q";›ïމ£µÑÈôMåܦ6 jÕVI›@ mÙ‚Ö‰8¡)9–¬ãôJóÃU¿Nða BâjÕu–tˆbTeMê” )Cv Ú‹šâP*y@˜í/¤ÎÖaÃ!C¦lGÔ‘%^N{^¢«da”ÿ«–Íèœ$ÅQÅ1 3ûÅ{Ô…–yñRdTðåñ@ƒÔz³Ýfò„£žaWö…˜7ð2Õg¼*¦qôR‚ ôe‹¤LXËŠƒå>$¾E›qòFU¸Ã ¼Â:zo¹H´ñR÷^·u–Sôÿ)™á’2“ÕÃ@SMIáÈÒ•ì×’»›à!P ¤ÂŽIr°‚û8ÓÿyY'pà˜JM)@Ü3*ÈÐ$pI7ΆNÕÀ^e"-/‚h8}z+ÍßÃå¶$ÿ­Q¨\v&±bXN(x©fÚÝÃJ…5€t(a\ÿ­Ušwöá¹Sç…òb¯gº/‡¾LâqÓì¥_5,¥ÕT˜Í-CêaGŽæy°ÂRùhßó©3:ˆâv•`õ37ÚåoÉjÿA¼Qm£¥21<='âGF—ãaéX¥ƒz2ËT²tÌ)ÕT:v§Ì`Ž1{^î+aOHS9ȯ#Ѥ¸ŽãÖÒ-,@OÃg0 MTƒ·F”C¿5R\"r¨Ü> Q„¶ô?ûÂÍäêÊgï ”N&–çÂûflJ9{Ú8º Up´›ì‘¯ù\ÀR›0èÊǦ¹ÞÔ;‚§,a æ º—ß ³FôpI˜C0—ÞÈCÒ¥¶W”TÞF¢¯:¶ò£Ú^È1‹<YKÙ#ø‡t’†‰°Fq½Y, É YÁ¬ul'ugJ4Îryˆyê:3qrW7 Þ$‹ ’¬ Å0Ó›)kó Ó|1ÚÇç æîŠ~*󨻪¨îÔYíi9§j­é­eêb~HÅ{v!k/ùZZJnà2¾±‡¨ìÅ‹m\-í‹"OFÃyN{uPÝBƒŸ#‹Æ¡‰¢ðœÄ“Ü3™§°F¥ÂÜà/†cò`Ï!ë>¬ácööP½K6»síÆÎ:¡ƒ›4<ƒ! fQß6[w§‹og ­SùC ”ŠQÞ^ȵ–=]ƽ&Ä8Ó2ÈÖÍ=pÖm'ç…-ÈV™%†lÂs:mÁ„'Ì(Jv™^ˆöB’²È»˜'×Û0õi³1Åèâ&ýÍÊë™ñðÔh¥—o¯V”† P¨þuacnNJ ÇÌw˜å®ƒ¸Îe,ÃÞÛ$tPÆÉ,¿I· žr7(vnRÂ0ÌÆ—ÀXw3ÒBÂrEtŒŒz ZGÑïô[²C!ɱ| ?¤q>o9KÔl€y57Õ߬Lª~¨ýVUçxÔ {ºS™+NàpÊ`íE˜lÖ˽‹¡´. Œˆ}ƒÀ=[ÚÍmúãè­ Ý( Žx²ÒaÌvmääÑçâ$¢sLÓŸ7@Ÿ´‡g`ðDPœ§«9ô˜uk³¤=(TÌAœô ÿÎíD‹ZÂK“€˜é›“Õ-w•Àž‹8™òùò;àË“ EêÌ¡©×dõöev9ÕâÙuÄÉCqÓ Çw.Á¶ õoIãÇz$€ëßFÕrwŸE0ôÔA‹ü8—’¸§¸ÔDw/4œ/rר•ÁÝáã R¡Öc¨}¦ @8»zD@Ðünªczì {™üŠØè-©vUÓ—ŒDe2✛€ú¢€0zð¸)»¨áÕ49Óä…òšØ+û;` CãÙ‰TY¡xÉ ïA­®tXÊ@ÿ•C±—ùgíI<|Íøš6•o@6%»¨UIQ Xò”™R¼NmE†‚½Æao+9»ÑXa¤Œª1HeDu0í·vìáÆ÷ž‰$ µh©<>P d œ|¤Ï9j,Ñ®´ù-/Mº_Äâ¶š¬r{¦´d!žbÐv¶Î;Z8;ÓÈM5)Üv0Âm1¨³Øƒù ”Ù¶Âæ;*j¨‰•09$"ÉÄžn²óÝÞEJÞª²ó `kÛoAÎG·„Ö9ñ]‹9e-¥ïÕ‘N$¡d‡Û§³9T£ìI.ýÙº²Ö˜¯Wo\G CcLuüp‡F”¨ª  Èî¨~¨¡4—BÎÅ(\H¨’·Í:a .¿èÉ3…`ÌcÙ·AóÏý³2i§"×–ô¹#Óö"˜3{uB÷cœTÌØŸb‡fÝôpÕ4øVí’JÏ¢·†c eŸŒB”]a.oM÷¢ÌÈLa«/]:X$9Isí2,ƒm8©j–u«wÙ&䉘?’Ä‚yçðôï È q 4L´ÊsekÑx±Q7i×á°©.’©Wf§ÆKáœ&ë|`¦nc ‹Ue²¹(¦$s³&‘â¤^’vêádDÖ8wÓ·¤Y¬¼¦‚–&°'éCš¡ËÒ»ƒRxI8žÏ?”Ù”0åÛfijáŽS?†/äÆŽùGð˜L‡ðAVïâEŸÍþµ6#†­I½ð°ñ Í~´ŒÁ¦8˜gï`>‚QžÉwá>$GGKS­IzÈ‹ýìj½xiÒ¹»I$æsøiŒõ“Áuá½\;Æ'AœÃúY»¾ ]Dv¬€p*þ¼’iN&îhTàüTãæ–NT)#ï…Ìh—û 3zO$™2áXÒ¶DÏ—9ÿV³9‰f@húì19*âxzüÚßlÿ•Öúž#¹¥§ø²då ½wLRÖ®a9jº{Ùöz ~ƒ/½¤ŽW¬‰×JYÔ:þ#³°»Ôì&ÇŠCðapê2½MEÕ gñÿ;·J¯GxSFà†2Ǩtm±@žiý!1™åê¦í.qsú­R»ÄD2»å³n&‰d-Þ’D‹®ÀPÊ¡†SO³)¼|¸,›6¸§$Éâf3 Ìî ÝÆA3'‚#Ëÿв­ÇbBK 0'",†wbµôŒÓ“5@p¦ðUl’©‡™9Oâ¢Ìs]™|áÀh@sôsÿifa@ž»4Qp¨r½Z=ÁÖXIK§t!Pò—Z Òü+ß Ÿ°×r.ÑD1]FµU–TƒíkqnA>ã"Èyý4Z·Ã­”þ0Ø(¬“¬I…1ªRšª÷Œñ²z hUËÄ–âÒíï„àÙ+ao104.…B£p“iBÛZ»ËûêpÄ é—9‡ªmûVfÆ•аpØkºÕس G/KVâ>×VÝ•ƒV#jT´•ÚªF`3¨‡(úݘ›oâ…ŠFDQCìÿª]Ä:ƒ;7Ý™ûZ\-@#ÊiÕ Ï.Â×gI"—‘ F™õj\# “0TQÞrêÖôÓ ŒÂe seH›†åëÕoâ 'Ö5D>ò–žæˆy¬ ËII¤ §†ÉBÌ6´;³NŒÎ 5o«HP Æ´×û °L¦Úi¨ÄDßÍÿe¶©Ž­;¯*£ª0.Ò¯< a ½å›nͦ¼8C¶2a4ê§ñ*³Œ5ó ¶c /)¸Û÷T ˉ Ÿæ•ö·[Xç#ä­;¶H u\Ý¿‹ŽB‰Â@>P阈õêÁ ÏâVÉX%Λûö#ÐËÐ`¬Ⱦ°&!¡€Z ‹à|±Vþ \'×¹`š’Œ©Uµ ††Y-º›¡}½'Å–Ql“¦µ))§08U—ØjU;`%òë´Ùç¼N#ˆdž6k[z1"?÷a}Szugû(ö­6.ñì­­x!àÑ/cÎc€©% 7´PöE”¿Nêæt‰aÎT†I꯽†QŽ­E˜PÏèb’’•¤È4«§¼ÂãÁOít£õlŠP–0æ¸}€ÕØ¢†\ÅBsα÷HA¼É€_µçX ¤éÂL¾§†u»‰Úk¼/Ëpæs(öïãTõMZ ËYèù“*ºµ’ ‚™RZª¢%»Oü/Cßâ®V2Ì*ñWäYVzLjùäR¨Ê &pµE]=kNå$L¬º4Ÿ¾{y} Œ-ýçß9;ЀOÊo0£ª`:±–à.LöP+-/ƒäNs£ç 9”â0ÙnU±Ç EÒzª®ª0ÆÐrJ;¢Y"Y÷ûÛ#‡£0l-‘B€Ø[V$ö›‹š«*2)e/®_µ£¬»\' 'waÿI-âf W»tö@ “£?zI3w] tLf)bR9n ˆ²§{Vð­ùŠŸæRÓÕH=ÞË=×aeF0¹Næœé/—P8sÔR·B[j¤:†vÖÜ$”tÊR¸—²ŠÙȼå|ÔzǨrÎ’¤ V?ðûùFïÜ 9¨\Iôª~æêãŽîÅæÅ8FÝÆE†âV^¸Š @ÌMû‡¼%ÚÂ*èù >G%YŠÆ¿k%_#Œ¹½“×˃#¹óÿé2¡œû0¾ÿìʶŠÅ½$ë\”PNj'=D6(@BcnØ**A!† ˜°<Äðõh.Tm¸R>݇Âë¹]µ­}rŠ­€æÿG¤¤Æ¦„Ö SÌLþsµêÃÊöSâ >´„7ÒSÕ’ÛËá€"/ ¾ÁÕ¤FRB™Ï"‡˜ÊvaI®RÚ&˜ºø$®*>ÿm¤Ê;Ì~^2©ÕãD\ ¨#gê‰üf_3…¾ŠÃ,üãÄ:¹bãƒu•—#RŽ‚-|ᾬÆ$uKIÖœË0W¸õaÍÛp¼ðEÈ÷SSô4§‘ÃÌU=ÂÌ뛩‘) Yå®ÿâÍ‹Åŵ>–•/è )QlÅT·iì»å9Fq!,2½¢#εåÑT„vîÅ• !Œ9tdóŠvÈÑ!ˆѺNa-j*Fܡӫ$Û¡2Î÷Y\™oµÉϩݧ ÖUæ3ŒÄ%^p8*]Ä:tf¦oÜã—sƒFÒ©bàÈõå„ú¡°íSá¢ÃÅl)Uq“ÃÜë613¥Ueëhf·%œU2¤ÀPe3LM<ËôšIaòÆ «dÞbUøfTÄ·ŽE.õþ©Vw˜&»"|>½ á¸HrôŸ©QžÄ‡x›ê­ï†òo·û./¡<Æ@2ûÙ ·„ÿÄ—×Ëú’³ê¨M1õ™ ¾‚x;ň \´áËú’0Ö3øÄ">&³ÿ†Ãõ^¨CœÓ2%*£L§-÷‘:|™.s© vyŒ5võ…¤H *S-Mî#Ù¥Ì5T2pJ‡Ã:C)I»LU¬›ºu˜òG.í {Št'3å·¸Xxáu•¢²¢öö)€æ¯L¿Ár&ÜùÐÔFS{ÂÌ\BT¢ç›L½ý-Ç3£ª×)åÄU<:T˜„æò„òboòîËt€É8>Éxàëÿ'þGïY™a èÊÇo¢é€òúÿÏf˜£2Ì4hÆæ1Råyt3ƒìpª qJPCÿ‘&ìà$ž!¶©%M!7…§!Ë™àE¶¸˜DŠX'£bJs÷ª“Qø$‰<:Ä-" «†™ü5CH ¤ ˆ3ªÀ ø˜ëÜð˜çk' \‹ÂRdFæÊiËIµ^7RÐÛ˜x‡‡ å)€ôÐñzù2'0ÍáMúHÁðÐZ¯ÃÝžF×[—¨²ˆÖgz|:•SRJ”ÙL':wuä9Äv €—#‘Æ NËÁPEç-\ÙåÌ#¸VÒ+™”˜ÎbŒ›j'Mâ"©ê¤™mÙ¶]Jiœ)È%#O]vabfã’ƒqÉܵáh±×HÇÖšr÷‹Nº.R¬P8òŽ£/{h€€HÂYÞÜ*¨„4cÎ~ÆíZ*Aw XÆ1†e¬ø~~+¹”žôÏiþÆÉö!Œ89ÿk[î¢gwäÕ}.)B{Ëc†Ãîd©\\KGU§ž6…L|p$:6þDÕÇù¾jiõŸ.@?±®W²Ši[È€$Z èòœÿF§æ 4ûIª¬âï2ªz­…—iWÀ27F,pðZíÌ<³ü¦ßšU„àb¯ÛÃÎ%ü¦ÿšQ½°Öƒú$ÿ²´~l-n= ¹^¬ªbY!ø\†ažNÿZ[…ñw'’™Ö9þUY1Šk¼%ãØ)¹—"çó9JµR«S<¥Y@¹ÙRí¢k;>§UeˆY‚Â9˜ÏÕ3æk¶©§A]©íÕÌtüå<ݧ6LJ˜ˆL}í]²¶êjÝAg¬Bÿ6pÜÁ¹CÙ±È;æÑ»˜èÎ1…pᩦ«Œ=Ž¢ûsLHºU€ý#Ü-]VéìÚÊæ‡T#¾:ÿS\A@Ø[à0ÇFÛe‘¼‚–‚’c—0}”D&ÊC`æ:»áé˜zõêÒå ŒB†õÜÚQ8Ó¬-Uál4Ãèˆï-ƒ»k×!÷B4SR3Ó†ô[Æ8&#!G«8—¼´àÐqƒº©7•üÃ!å¤É5(€Ì«h^—È9¢g8±–6«ÈKNd)ÓÎaP0vÃÝ´fö¢ÇYE(Heˆó" <¦å¨³òK&]£¢~<ü¢½G©Mp6ËPÜ÷w•zî-C–Ž ûòÆ!«1hå9G@Î`Þ…Ý…øXêD$63éFsK¼g™÷1 ‹/Â3€CŒO”&óù\ué‹-qhø_AÓQG_òÏÑ“§U¯ØÎX.´ü±¥CxŽ-ϪôÚ@]íÝš}„¨lGwª&2')º€ê^­æœõþæïÎÏ$ü!ÓÎI—:’  ÐàÓ–*ûmÝÎ< šOv&®Ô!¸|ÂCªMªéC­-ñZW¸ˆ—ÆÄ£ÓI= HeÊ'·F93â–.O «i¥­·UNàŸ9uCRzwR¤”&¤Br0€êÑ¥„$äY±º˜ rÔ˜yÝæžyCš“{sfjÇßåž´¥*b¾ãªt(okz4aÕ[ß‹™ËU¯±jêZÖjNÉbŠ"`Ì$Ø‚$å1mKDâöIj¿Ô0uìÛJÄHµIè‹&lx8ÁOˆ¦nÜîÁJ¡ðn 2(‹T"÷¥‚Ôg—ü>Ø*N… ÁÂ┆EGXyŒ¿ «¹GÈtÿHÜsLì›×Kn¶°ùöDë¾7[ QÕÕJ¢•%¤CCGRhaeªêlãÕ¨´¦‹®‡ŠtuùÂÖ®¢¡ €„„:5ùíò:øuÕU)ŒŠK·F¼ÝÍíFnÅìP]?7Þ¢yC˜ aÔóg½¾–:^UXµMò®üó&`蚥x·´öyø…‰¹ø—œÑÅHµeÔ©†bÅK˵0ëW`œ#®hxr=bH•˜ÞUJMDÙ˜Pë„^<-øQ1œÕª“L圌%Œ%H--}ñä¬åžv… |b¹UA¤%®³Ã€ÊSê,ãsZ[ˆ¶Ë€’x$dÖ.Ûé…"Ž›ê˜‡Aö™ù€G£0ÔÞ]Ô©#Ï9ha À:2™|H]Á¬”T|vžž!Ñ•DQ3s”¦ ˜m&×@i_¾BŽë]Wî6ÁH8 ÖxBdqÁL9S%]õ›b²ØI2%AFR §».?Š›?| Àð1q—àÕ(§å æÂ)|©Ïã×R²Ï^e9ˆí&}ZáÁP˜æ’²{ˆÔ‚Q-&3›D9¢e–“÷ˆLuç§îl$/ÏbçI.Ý~ v…Y⸔ªLv jž½Ø‘%îÀEÎdw–Å-gaArUgW¼*åèðç ˆj"=X!ÄÒjîú!?¥]ëa¤©Y#v ÕŠö–Ô&“¹H±rF|Óæ!°+—yðˆ¤EBƒÜŠ2äÂ?BïOfæRÚÔ¾Æ Xð)8º~­ÖÚU ö”ˆic Ëôæ7¶3_¾ë5w­7þoæUê?@:4t{…È5éCIwxù:$iÍz­\À_(ªP ’ø°:Ððj onï>1?Êa¤MƒaTzýŒß¨´Š£æwRž×“Ú òËGe)Ä=ò¸Z'BáŠx„†x‡¤Å–i˜21 î×Þ ,*®pØâäå~¢A0õ¹67ì¢Ý· fŠ=‚ñǺˆ]]°¥<Œb+Ø¢Íq¬Ü4®.ä …òb4óLsÏV=KJ(Ù„ÎÔ—ùoµÎî íôUGôÌš#ΞÙg:z‡f#Ü]Ž%†»!µÇñº~9M¦!¡¤Ô[/ Äx‚ò’µÊªŠ;„´cÆXi@„Â8ùó\Ù{™Q£ Àî›B1Ôª¸=œ„)Èž!·¤ÓЗÕTv-)V\ùªÜZ \à 2È\Ûzå"‡9ÔÓ®ì~7mEHÇ[×}XÅÎ5vÈ%á|a2E5&BSîØ‚Â (ÈfÞ#°;º¬ðsO UºŒ‹ÊòOÍh“ѽVºNó$—G”5çýÍrr¶‰Ã€ô˜t4§-GIwa §µ ‘Bᚥ3åöÞMAZד ç*’”§Ëþ æÄ wT§MBáø’£¥­ž9iß–9ªLå/P thÁ˜ ‡PjmÝÅÂ.“òÕUóyÊ^Ðtì× L6jªÎnÒ•R5—‰€^yÍŠ|=–»rá/Î~©F‡ÔÅ®#n\%¯¤ýR­íŽ´âÉ:³1gw)­ D¹„À5_¯¯„øuà>)ƒ<|Ÿ<±ƒ+‰ !C̨$RŽÛ³TDS˜ôØ @Yˆ²ÔbV5ù*G#¢;šW™‘«®·×^øªë9xr%/OŠîm@Ê7·&Û…qjat” °’¿›îÞ–&‘WLÉ›ÖÑ´s–RÒº,´FRcMcŒ¨O9”áÐZ(¥wDé·êZÚGlä$ ׋8ºiÒ«¾)½ªÈfvÑAüCןüLÏZ뤱$`Øe>Þ)qÒ]LÙÀ®Â>Ï0ÿe~ÿO³u®œÊœ¯×7h½&d F8™´± xÀ ù4ôêŸf Ä­\bÓ¥)v¼1¼Ä…'¸áð€g7iÏÎb)Ø™¸ Ò âWw4pS,é ÄÒ˜ˆî#Ô[|„) @4j-åÞ¼6ï\ÊeÇs΄y‚rÏ0(††›3¤žz×íj²tV»f™¦3?÷%^q žrà CÌudÚ5Å- ˆ*>Þ:I3ôê—oµ¶ìß±—Óñ¥ý"'×¢]Ãêc?ÂjrDn¿´>_-ÎãÝ2–ÚíaVÕÔR|K˜}j–eØ È6ÙÝS¥Þ8ªŠGÇYIb)!,ä'Ê¡ØÍ±wן ·®fYÑI¾tän\̘”'å¹d3 d: '¾Y£''m%%²ºAp Ÿt=¼Ë±ƒÚ÷ªö*§))Qò˜”4² ‘Yû1´ö‘4!?ö¼ðË2–ªH'Ì îÞƒZçŸ xPã9SŸúÀÉÿ åâ·ó#±1 ~Y€éUÜ}ÂÎ[+œö¸;¡?a†’X¥„mqÎp©V¶ÅÚ»·]ܱ§Ogаƒ%'Hü¢ol5êÒVrÌÚ«Tá7D±Ýv’.ãÔ@u(±Ç•Õ WgK ÄK˜sMÜZõÃë®úHN¬LúzeBã0¤n@å3ôe·Ù¶>BÔ¥åˇ+Xü‘”Y †õ¤n½ìÔK?wq[CzÔ¨j%Ê&ÜÁѽ“Ü¿kEÃlô>ºë;¡BŠÓXÖaœ€@5ê,€Ë¼€;#襺Ÿ)œöü×=Õëî:cUbcD3­Y˜»žYÄ43U8¡±Î‹YÂĈJwÔf#:Ž‘zËNÌPµ—£±éŒ{ áêág¦àQö–+꿲Ûw1†¸¡„é뺪̆ HŽí”m©šq)è·¨¥²Û-o¡±Ñ]xAµ…‡Ãc®°p0ò”¦eŒ;5#ˆ»t¬f>”V­µ5 ™6åÔ:´åÄY¸4ú ~W‡Ú(O!•P£œÄ4Ì3½Y]/F"äׇ‡ž“š¬ù$²"J«ðS6Z½Ã¡(…v<3šÔB ~|ðÅRt§…^†9G0P=úÚ¯{×ówB›ÂKx—U'J”%*A9‡S3¥gÁ΂TÒ«)ëÌ-£mìŠV¾óTii–£¡Ên¡ìõf+.’¶b\xVŠmE-¬6~!R&˜å±vtƒqr/ U1¯Y¼½XÛ`¸Y*Î"¼mL3›ñ4ΜÌ‘\ö,]uÍCì¦wÓy–æ,ó8ykÐÒb—I"šc–[ Uu’S¶Jàé©cón8Ï·²C-ý“|º+`sZ•ùµ)(ê™g‰½±Õ½»ëOü XØ|a1šo’´¨bôg£"¼SÚGÌmÕCÖªâd`ó! @: 9üØ·÷¢…ƒÊU(¾Š¢çøBû€üYÓn|’ÄÝÝJ¯Ú– JçÃJ}9á¡ÐÇrC«Ê~"‰TZ„º˜@3÷2©\v%:°;–;É%[åBZ'†päU˜ Ã^ýŽN ĆÃYÕè熉ê,Ÿ?Òò›ßу×3Ãéí!IІžt¥®'œ£™T ±ªº¸èÙŒ ´öžžå0ŽåÞêš¼ZÜÞôME^WùAsJ|ˆ%·`(hO±¶Þ8tµ)8 Ñœù·.*]e®#:{<çuÀuG 0Ú¡Äwê-%„LåÍÙ™r^d.ô…bhü5¦l8ùrC!7…oîÁR»¸¿ø,9Ș.êk1ÔJol~¶'ÙN+ @îÖ•: Iæsžf)ìPfB-fÜ#I'¤k.^¹ƒp„:2ñxœ-àw¸¤!/Á寔<ÇWô…•)/aÞ—ð˜÷¿ g¥èýcþ®#}6®6þ©aO>Üò¥,4 u1uhÀŠÛ+öœKêiÈô¢iÈ)ÒCítfRà.|,œ<ï¯éÒú´¹jP8€Ì C¼8é³H.@4Hf9s”vèÜKyvÑÈCÑxrç[L®Úÿl,xO¾÷kLJ=9½:øhËŠâ ñk2 RȤïïkåí_eŸº×x‹-SÁþmÚ•¹ yŠCH›#\-ÇU€_\(©›Ð«‹ˆ ä쬶Å«–‰õúø¯-uÎ¥J=ÓO)Cʈû?“g/Ÿ²=ä¨X[ŸQXbo'8Âa8óHñ!‹7K˜úþ–¦+°Q#Rpö¶6zÍ­žYK ØÂ]–ˆYk$úëC p¢aYMøÅ‡Õ èRù„MSuAºËŽB§ºÎ™ô·É¢“¨^w€ÔÅÞKU¼‡ÿIú¥XBÅÞ¹mä?úOÕ*ÞÚk^,sþÊËCü§TD@Ú2‚q˜·Þ ËÈ´eïmäÁâ“/½¨”ïÚâ9+€nN.ž!઱å-„ZbÚ"•ŸtMÁÝy'‰È=J!¬ú´•—rswLÇUßð²Ê|ã½_ ƒ|QúœÕNŠqe1ŸA'f pz”­GŠ1ÝJD—ˆ¿ ù€ÞP˦sN” • Þz4>(e èˆ>¶²Õ®ðJ£àǨA”¶ ovJE™åòa$\YÚw¸¥p„,­IºbH)ólº±£‡»>K è"¨­ug=R[V ñ”½õ¨Ðiÿüè³t‡¬KÍÌaÄËOÆš·âCvöV7ÂÈg/Ç#¢²Gâ…„Cy?•:gñ0AêȪ§Œ_E¾MÉ3~÷9 ‰•)O膉³y}‹.‰Š:ú)_•O«ø.pv{½Cª þ”°C<æ‚ànÚìZÇv\R׊ c,‡g)¯»n,¥‡ŽÎ8¯™ÔñŒ¨U™åÊ*Fl//…«)yŽg¥R÷ZªS™gÉŠPRKã6*»$eDå¦uÖÒPÔO:4–ƒõ´‰ -*²yïÜ ò¶Ï¼DîvñÌàöj%ˆ(ΤDCJƒCƒ=n/yv)Ê<ƒ¿ÄYGã,å!#T‡0`ÏýÑh,1Žk<éYª7<òúfhÞûc Óø]],±Ë ù ZñÞŠédß•8H¡Dÿ¬(2åÁ 5Wëþ…ªLˆŽ-C–î‹Ë~Ìx¾‡w°±32ú)ÿZFpre¼µÞJ¦iSXÓ=Q\‡°­qI>'»Ì¨Ž3Û*Ñü 1ß•ïiÕ™Þ¹›­H;Ž’ìÅ[—uk „€1?Z£-üUÄK½UB©˜²¨%§ K÷3Ivî¥t²Ž)fP¯õ‡Ëë¸ <05‘Û Î²À™DÒ–òeZú8ƒxYìÐØ"˜iÌ¥ 5L`Èéå,÷c­íÆ•XȃÒ&’„äò ¦¡AêÊ=ÈY—kKmŒðÿÎìëç.a:“PAÔ‰Yè›3‹œœ¾!ê9íÑŠZsŒõ[¶2á­m¿{1ÞHßô*lm€áì€|XÙá~ÏÝò(EÞ>W|'”(Q f"_UAÈÁõ1ÖÎAÊê€>˜&@ýâZ£hžmATS.(Œ© €Uôèϳ CZª±­¨«”åÙ fQH‘^Ô&)òžbƒIöd†Þ b—Ç;¸L§Ã§àîYëîôºÈÀ f`È—òuTó[Vó)Ù_–oLÇCN:”3ÿnã¨R¡Cël]AëûÅ…œB[cYK$tÑ5/ÃOÊ¢sÔ4‹#ˆÍ6ÁÜ«ÅY\Ëm¿â_Ñ …y¼I¹YeUq‡¥ã,¦zŒIyGC&! ‹¯*×[÷³; ¶9”Ñ*.=D¡ìͯ1ÜLjDbêNå‡4d>–°Tº”å‘“ÐfÏ•±‹0ê“´- ’så¬çœÄGSõ)m‘BÍØåT]A­ë«ep߆ö ,¹Žã¶š.G»X—€q$ýI©\Ê jš !!ÇÞÎþÛïäJéžâN£„øJ<.óšé”ú”Á¢›‡¹¯.‹#QŒ4¤__!§]™"ãÞÛ+Áà‰­R)cVJr»œ3—PêËm`†2åAæ×L%‘.vÆ<Þ]®Ÿ¡óÆÈ?p.@%öFyœ]sw*i‡(NAŸQýìášË%±Ä}•*¼Îc1Ε£ÕŒ¯eswQSä!)ýrhÖåPjf-ÌÑv˜­VÁ;Ç©Ã%uÄbHBÐ2Ïà j2Üox0‚;Äôðd/‹§º„Øtû°ôïJ)x±Ó89|ÀüÚ<¹òG˜JQÔ¢9µâÉp®g¸Q#Q£ÏÐ`U)Áæ*²Ð~,«IgnéPøŽøg1PðtU€qf£*504ùhTÝ6¢êô‹â`¢f¨£ H{þæNí ‘¨ªP·¿” Yra‘=À52ƒÔ~¦ÜáÚöÞ ñDàÏÊMÍIÒ4‡£‘U8èQ˜ˆnÁUÚDl/Ó^!šéÅ5g~é¾ÊRлoM™}5Tʾ™Z‘ª$Ú—{ʉ,DHÓ†ëHÍØL€)’äö²†Gd³ð™ùRü!nòªx²ÿvXcUnéä–Vò]ÁäyQª¡÷¢ii?iŠ|¤E¯±#(Z€³Þ_úg†®qkbÂßTADBNxx#ú.ÈÕ©„u6í'ÉúlªMIV)®{Ç¿ý§¥)™²ËÅÅš™añc‰‰ÿ$¡¿ìc=ÒZ€µvIÉìM3ueùÇ@ö[Büìçñ‚Ä?&RÍP¢‘ŸçSžáÑ£ÚWj  ¶W¸Yy°¸ÇÎ@ÂÛàâó1îYX@©7ˆ<¤Z*ò¹½™iÜ~ 2ö²¾"Jäo–Y2³ÂÄxÎVåhAÆi¿SËú ,nŸ´Óĵ³v±4î¨òÅe„9åB‰ê_)·“H¡Ûš©m`.—É l½kXµåÞ‡wçu$° j‘*Ì@£©7fîí,#­³©º‘9,¬ÓùÎ!ëÆe×…û1˜Ê‘G‚M'IK=j*¥ØÁÐ6föœ'q(RýìʼUnw”ÓÑY¯l §¢ud­ê8V;W'ÐØ(—Öf²Ÿv‘4߉Dƒ1K zïXþƸ–a0¤ÕÊô1] +Ìÿ×jê·7¦Bó¼¹O6,ppÊ~©F€ÈE‹Ü4  Þ8¦4ƒÒmù¥[Ü mŸàsãä¦ÈIá8p‡ 'Xùµû[Yò$GƒHk(|6m˜£òbcJÀtåèÃhä\†«2øvj$@Ä»ª]§¢ÿÉ*´Äm¢îjp'*²Êa¶]‹z^Ñ.l|¶ºK£|’^,KÉ"„å›n¾(WR‡f-“!+ªª¶±«RetF¯*¡æ™‹vˆM'¬1¨9d-¦gÄÞ± 3 ²“m >¼ŠmLn(ü rG©(¼d$u­|2"bSâ1fiÎt¦‰ÎL^áÞ2œV¹£Î•u½U%·fω;6²îVx@+{r–Þu’ÔÀy°7…ë|H·“z7™R2Ò’ªaУ׫5¯P™£.j<7º²’µ±Èp k­,8ì!wE3*”Ì:ÈÀ=C£$–6Ò?\ç¡1&gZ±™s©3‘¿)ÑžâPÏ!a}îÜ»¥á:‚„ôüŠæiÌI<«Ð¬Ø¶Vü+ö»¢œõ¶š7Úa-?/oß(Ów×Ãe¯!ÅE!¾U¥ÜÒó»ZFðï¢ÏÝ}Ÿ]ýýïÓ¥N8jsLå(æ0€à-çËÿ²±”vuªŸ_ ûAêØC8zµq˜„žÝ0€|Êb$2Èe(üÛÌ"> ¬ÿÉw!?—å•g\â7ÇxêDË5Þeˆ3.T¢% ) zœ‘#»­ÈìÌZ‹uWLçwN'"fÅ]IT¬ŒHO,ª4²4˜‚¶²û<¹V|\œtV—Eéãc¤&^î¨_ÄÙ]®þ"ά9Z›8GsUâÔÅ”!fRáO0öbÇO%J¼=2ø*“ xPx3›ôyzfQÀß²ÀÎ0Ä9P׉Ó[ÙU¸Š ,׿çþî›9VM»ÁÈ@å ¥þвK{…ñDŒ|ÀØsÿw'îg–%L’åõ‹¾Ê“–dLóòC^#Œ…ß¿c/›˜ÿJ›xF‚–/hâüµ˜;õ"Ýû1CŠƒ¥b• `yO.Фվ AÑ;Pþ`™Éáe®øåe äÓñFBk\ßdÂ[X¿ÈÐtLe-úszVÖºËø¢kB¬,EtF• ‡-?*@Ü;·77½‡pTs7¤ÏúS‡NÍ#yaYgÇILÊQ/‚…¡Ñ¢ÃÅNî®{s-“0ÿõKŸöAÂÔ^;ËËö`çM!Íh® ‡@g¨—x’Àb¦9lçÿy‰w–µêÅZU0ÔÁ¥XÈ ¡ -‡Úfû‡‹Ì‹Dm2no*ÒCÎF¤›QؽšM…›™¨ÍÕòG;ÕîÕ;|†°  sôžš~¬‡^cŠ+Ê~#‡+¸aÐ\Æ^„³Öc¨‹9ÜKÛ8Dqáè§’e§aöRÙqu^Û[/Eé[AÈ'$ÇÝì°s–¶#”¡ed’T3Ëä”ýYGÁ‚;®9 êŸÀÆØÕ ü>ÞÄæ2Âýrm|ƒ¹ƒƒŠi2 ýâ?µ…ÜI©Eß¾yò~µ&©Æê‘uu®ÄÁes×hU_àõKð£fæ\ zz'–&ñýa‚7cÜ­3Âë¬zâ(î˜j`éÐ~ EþãáFmr¡Ê!á$:ú¯ Ímº³ÊæÎÒ"õMC§”ÅP7g«JÍÿN¨åL¢:¢ÿšIxLµæ{„¬l†Œ0—óÆïe¢nÅ}s:g )ý`Èe‡ˆ<ÝÅ¿L<Š»Î°È|ÉZUí3îì <:”Àj€tË»G7X|©ÃÇum´À\-.¤w%£ü¤*sÝ­è"ð§/…ª{ùú^ÛmÞÕ°Zôo e‚·RË™½ *Ì@£©7k'–h!v«Æ”&W½ôuîÛœ.ÝÿË¥"¯ôN’§?5EX£¡‚Ztg« ¤óJ†]§]6 4Mÿö™ °±ÉØË4ƒ™œµOý³Qö›~ÝZ”lœ áõaäNœ³ÜÅ €zµ€¡†@ûYSâ–ßx·ÄànÇäJx¡-f º—°è,ϦŒÖT÷VùY³Îø>‹­²Ñ'¥ÍZŠaU‡X@ŒÕ€üÁ„ÝÑTT)3Äçœü«-ß»Ĺ½ZÕ »ÌÑxá­¦3ßjNI+ÏÌŒ5>ø+ræ¨í_ꕈÎaѯ÷Dú.vÐK½Ø;{_­Î,3•f)‚SI¶"©A4ÌimîìÕ2¦´AA Jä-ÒŠ ¬)Ëú Ö§Av@H¨Gy÷¡NÌ)B¢¯>µ\ÜSu(ú_pS®­ i_rê]tÏF™ˆ®wu <Î]ykâ§ÄÀF­fìÊ1±±„œÖ“’Ušô*Å ˆÎkYÞ΃¡7,§-÷a½Ù=-‰¦š…¤sÌÕ?îbEàÅÒ… 9é˜ýÝØ ‡ÀZleÎÚ«ñéÜé}Ê}ód†õ.â%wqÓ?¢Ž<ÿ6¥EH¤(ä&ÔÌîÙtILÉ’'ªiûöø15öÆC"PCCbø§U<áQ‰TPyFa˜ìPÅ–§, $”¨Ü¥û:ÚG4¡ñ50ß‹9š‘óPÞ©@Ç–*„`Ê…öp­°Q%baË:ˆžD/ã Ìc{¥Ñ©¶Kˆ;Cd€]ÖS0ü])—ÚA1ö™›YfpqtJÃé¯cd" îÝÓÂ$!„@Cá6ÄE2޲Û6VÆæJ’Âd?ÿHñ5:Òñ!h­$TðÅV”ÍÓqL:2c-U8w=ªuõš&DCôN26¢³éÜÊñ'‚Jd ÙL'¬¥£K„Œ ôóâ)gíe•AÒ8þëáx¯ |DU"PÌ@3;XÞ*\‚T¢©R¹u=FæclT¤ 0•‰bÁ”VÍâkœÚ¡³Ûæ¦ø«{"6U$Œ32“¤}Ê%6¤p»Yòx)°Êl@3‘•­G¾Ûç5å.‚.é`»#T‚ªªžîBˆfFaør³†±Ö ä yó‡JUTCAÐÌæ¶Sº(C_ÕBâçÒàù)Ý–¥v,"ôž|OÑ«ú€–Œü¸ EԔ震¦bÉ'öcø­xн¥’r EÀwÔY„» ñ„Z9Hð¾Ù'Y(9µ1å˜@d»ÌyhÊ}xit¦£Ã+°N'먕˜w!CÑžªÇ¤ŽŒš¹Â¹Šíf£"CLëàÌ%ìf«q-yŽÖ¡ñ1BªÆ‘ Ì0jPÜŒ9]“Ó½ŽsH¥ü!â¼\Ö•úÒÓ£*Z s!ÝS3]ÖÅ_tyˆå¨­u¶cå Dšª¥YSœTµ!ÃIöc,a‘QD³§yû‡vêC”³.çòé–C¸ûú¶‘Õñ=K¿ÔÎ¥›0Í; ©¬ó §vç‹’!Ý‚R¨±òÌtécˆy2÷Å‚X €ä8“õÑb6ÿUKBuêçyvYˆöS.K\°ÎA?¤ð çÆ»™ôKå!Ë<Ä=Ú )ÿÁí ù^@Ü©ú9›_]äz‡FníM –LÃáŒjj ÏÒ[4§Äy*Žº/:¡Äô Í>0¬°À/mh™ÂF!*y§ónè—¨î=˜;´!h¬[‹ÅUžyKñ‡Ñ«ÜÃÌçôÒ–ù‹,Ê#‘Td5e&Ûph,óꥅ¯ãÂRNYÚTGQ©›+ ¼øœJ:q4dOTÕÙ8ŽE/`m«ã{#«ÔˆnAó »‹:,9¦®•ŽÀ8I…›¸ƒ¹D xëÔ©Ñ=rÈp³åsV!ÎjD•å!å–º ËíwèË¥ØÀ/ ñÓvEl*'0¤sD㸇²Î¥0YÈaÞu—ý`ÌgÕ‡kDcÓÕ¨©qfI䨸«ø=¼AŸ_€6š ªk# t9ÈÀžfíïi":•BÔÌ f(ðSF:©'\QÖ_{#|Tp‚Ú›[f‘ñð׊qIRiàÒD’ ÔTDÓ0›@ÊLùCšåÔCœuýí&cƒ¤,ˆ”B}çÍ6hÙ‚A;àx{ òÒùídÑHh¾aiË„Ë17°=zµë‡†^M³w‹EÃ%V"•kšj”2)Ê`‘ˆ}ŒüÚ{5{ˆª9b=†Å8l¤å£LBÒqB¤ñßšR×÷²hãøgt·Y|¬­°8ç oðgtÔ Ì¤œ¾#ñêÔkYi«F¢üàëõ‡f”´ö2(UñZ9rK§iêÂÅ_MŠŠEæ§]½YöèÆžvDÆÚ8¹êVñS+ʪ(¨Ê¹}ºXŠ(¬dN4˜7Ì{¶qgq#¨H´zÓžíI}~9Î(¿!P×®Zg |H Ï©ÝRŽt¤•Y¿k¢BóÅt‰‡GÈñ1ÌSå”<¤“*ØÍ¤¹Èòˆ¬ಬžŒóä À ígvè¿á ¦9rÐ9w›K[8/g—B.íâÊ4ÔZÔ%<åò``ê©ã‘¸)nÙu¨·Ê Nä ]âžD©Åðg óTu'™½”»ÖÄï¢ÌØùFEþa^²ö:Íi,‘¸å¼eMt¾&VÓÆ?¨©ëiÅ"ˆ§ /Pu9f_i>ãõ0žÄÔqñž–SØò© 4 €ss×62Ù^Ü“©øª|ÉxC¬³"Þákeåð—g-—MÖÏ»üœüí<%+QYÔr‰²: µêÇb³FÆBA«ñãU3^$À”Ý–·°ÛK #ëºÜƒ?TÞІåŒ·ñUmañå!î®kã(†%|†,§„!¨Ah5ø^½8r˜Áë!ôê–{©Ý¯×qÁ ~ øvÁ“Õ*W`pÕ%¦ ü}ìRšÐ ›ÌÊ\»k÷Ýíæ„·êQ£ƒUÍdniÙe“¡gš¹jT¼®„å 3^ã¶áQ‘ØõôÚ–Œ‹¦êTJƒ¹p˰LGpÚvÎYÇ0œh¯~aÒ}ÙÆNhQ³Ç@êUؼ'k,ÓÜ9Nb-Fzhp7og«&^ÏÛÇDÀióÖâ”–ÃÕœ¾'í…Ü]ÒïQGš|8HÙÒ²@m@ÅòŸvW8d°cš"¹u”óóTEK±€uŒ—p{[ .NÝ!ÕW(þ®SŠú9Ž­nmBVNòú±²N‡s”6öšÀBa=7eOŠ‹â^Éw4Š”ñBZÌ9u/Ü,£€ÔLÙ[ Gv‹k¥?›ec O7¯x‰;¯ÎE§ˆlƒDL! —Øgñ8‚PgRá¾Tæ#,æ9Œú‹¸\°? Ùµ#)Éáþ\³òÐuK¨@fÐÖð誤5%Ä6Ù€M¤¨ØYQ«”¬Ò<åOÝÃñâ E¦¾‹þ¯Ü×jgêý­G»D…4ßÄK)áïúmy(|§j±‹¬ªŸj¶âï(^w–®Ÿ{.5íkVè*ä^yk—"ñg¸<´1è:è¼ÐšÕe†˜ÊFî¨tk­†àòÐB#H=¬ÿ„š5OЦ3™L*=[Ø­Y¨­µÖ™© “.=”äÍYg†L>o²‹´pÔ_S5!oÜÕ7®'PÀ|òØ;÷fL8z|;¸ñæ ×ùÆà8~ˆ”ÂbÄgýùžºßR\Hj]ccþo²ÁÐ\¥™²({»·1˜È:;š¤¹g®áÙ‹·:D_©0kèSûªOü*Úh³ÈxÆþ íÙYê Ómõ.àµs­°´ú¦û*}ØØg»{*æw¥Ý=MX æS‡´©Xÿ{FêW7Pbí!濼ZѰf³2¹9ÁæS_XD2Â-{±‰|S>Nz½%­L( ¨>¨Yµ½•þ–ÍÇÑA¸$"˜{ûjÓ.)&.šçïmç ºv‰ž²<§èË”§ôšAÚÆ¿ PyÌ?6\þÖ= ƒ¨@9Ù?ý¾Ë'r¹”ÔÑ®Sží]´%áç(›˜e!—pkÑ kÌâ ΩeH~öƒŒØwèš%L¯4”'1 £¸}.Ì´sÊCYÙqýﲬ8pY˜ûO ‹D©j ¡¬MD‹¤åðîÄ·{$ô¢ gŠž :” 9ù¦NA j$~æ¢ñ@é¾H£¶;}>ÌSàjXÜ5¼”v“ZXaa{¦çè…Vº kDöS¦j‹œ†R–AîèÛ0’ÑЀ&ÃPgIå9æ3ɈN×E!(¿Ô¨à—›?ÓÉ»‘xª€w­=L2}õ°L·ToË›ÂO¨Ö¶iŸÄßeFu|@êäåOy¶”}áÚ.˜€ŒŒo(çË)Oß91÷  œG _Xغe^MªK…‹àV#3ûXé/m•¸è‚ÆÌÖàMöCÛ!F ·Ž0dgŸ˜:VÞ•£ñJ®d ˆa¦IÎSòn Ì„zä£OÎ^Õ÷ 0ò“ƒ,ÀuöjuŽáF.çkŒF¢¾(ªÂKÔԙŠlʯ¸s&hg{òBŸXY˦û)[€ºïäòÏ!F•W•%ª~S¨Qò˜} iˆƒñâK™Sò”5ú¥ûù±/Ï0ô_ Õ:©-D ¨šz´[µÛ?£2æ¢Ð(ÔØÚ Ë²Z²Mies¿½öUÔ‘êf–ÁKo:&A1Œ˜å¸5+ü‰)ñséèËýæÍ úRškûÆ‚ÿy”G+Np¸þs²ƒýï²é†»™Yœªa˜¿F}[f$÷„eŒsú2Kn²mçk0øD¥^C¸Pý­±‘gç,'gÊu" ó¢ÜMK;¸ ]·YÙs7ÙW¬ä9kKTÇKÄ"IHÕu(ûº6µ½ˆü’íJ&ˤ»—¯½ŠvFΣƒ`‰¿ UûF&! °òð®²1i×;¾ÐŸóD‹ÔÁш*þÞ¨Ý>´±F ÌÜýQõõwºƒZdžY¿ý6Ü áT9Œ_4³Ÿ¿»]œn:ï1V!P2˜O_¦Óî×7Mà§ÊiœË„Qž_¦ÁÇo¨'%¨”úÞÑ+¿½öT(»ðÃÐ]5I¥24û†ß=¨XŠ¥wHy‚{|câ· }PT#溎;}6вü6?ÁžNªïØà2äÁ)vÔ¬ (æW?Î6f·‰¾Ê²æä[<–X³S*}ÄIõj‚æy´ï颇)Ï>l‡@žòèÅ{QpV–>ö'J)€–Åðé`Þ°èÖ«s/veÀ@ïXë‡ã0À»›jÄ4%ð5vâÔj cc»Ý7?E eìë­’†…MG1œÌ#¸VÞ¤ï&ç¸KV²ïâ**'ªÀt 2‡ýMÚ€}LëÜ8eþóÚ ·eÍ\keyÜù¹ú*霤§—ÞÚ@@"Ô€Èð-è@Wÿ€?{GÜÄ ð'+Ô‹üÙz~“tê9ÃxjåÚÒ˃‰¾Ê&æð»áÊL2Œ¨€Ë!hKkÀ’d<€<-|³Ù‹6nó Aç|U”¦“P ~‚ÃËkt[Bú* õ†BùK†AسÔáÑø ÚÜòŽÓëK Qçr‚h‰ßŸþˆí×/ðk Ü)ãØ@þˆeÍ ëÒmr…ÜQГ¹¨?š/§Ý¶­ÑZ8…†{…Â_p¢ Q†¶cD•)‡”ÇÌCVæ;}@syI®ÖVi$˦ãè¼Ç½»Lónm¹S[Ä:»Ë” æH‚m€u.ìÝ]5Š%‹²îΔÍ`ª±ž¼çÜv3i]§ðwÚ+=hRˆ?Fk*s’~0ªd9uÆZƒ0©ðû!?ü”¥¯ O/ùŒÓºÚî5'lqð¬Nƒñ EÚéêªÀwn Û«R”€<¾­•õÜå €z²;gaï7•nHšãQUž!²Ù!–”û ú_G¶ÎðAÕÖ3‚ìJ« ‰ª˜CU@C2´uÙð#°ðg°4_ù抇Ã)¤Ç—ãÄ`fÕbª§‘œ”™®ü]Ó÷yDTµ9czpyUg[Xí2h|Ñ 91ž£Ðz±ŽÅå¸aE%RT ç9ÓéÑ©±^ ­[òÀ#ša¯àÉeÿ;³lÍÈ@ÈàEå‡9LÆl}¦tŠ öœµC£\XÃIó¹U7“"/É)òO9ì#û[|9½ía}»¸¯ÊO/^ VŸP KÚlFÀEÆ|ÒøûÍZõоVܤž2Óß*´ê„×'‰ÙiV+²ÊÄC¤ýiÚÌ! µbìFV"Î~´íhk­)õS¸þ;¹_ã!ݾ)Ç<Û„õå€ã”@9Øê¹fßLsͱ“}\ÛÉfóЕBy͸1æßL ÜI±fçt…Ë}ŸVâ–å¶°W5Vú±êÜ7ݵÀ[ÜVUæÜ„wn*n[n.=V@";¶"aâräm¿ªÍÄð¾ õoŠaæß7ÍŸ2µ“×+*‡«aÌØÜˆÉ¸d-¬p°»#ªÈ'žmöm‰so‡FÀ2¶ ÂÎb¶""Và£9͹ͰqÂÍä…È("ßL[È3Þ0°œ¾ Õ¾¬JßMðŒ›8 Y=Êæ¡ÜfÜ77-¥Ü.+ݲ¬GvÆ–àM˜Öƒˆê²Äól€â ØÓVÍð¦ÛÀ+ çõÊûz·Õˆµo›éIµ€V²ìðW5Ôßã›p7Í€°çuÊøN=[á8ËVâmð æÙ€µ¸ö+ 0†íÄÇ«b:¶SɶØ$åsXõnq ÕºêͲ6a6×ÕlHìpVUVÇÙ··2lǺäN Üæ͸âg6Ì¥h8ç’¹ë6øDe«|N`àÅ“k èq‘ÑÿÙpygame-1.9.1release/docs/tut/surfarray/scaledown.jpg0000644000175000017500000001116407670466467022537 0ustar vincentvincentÿØÿàJFIFÿÛC     ÿÛC   ÿÀ@d"ÿÄÿÄ8!1"Aq‘#2Qa3BCR¡$b‚±ðñÿÄ ÿÄ5!1A"Qa2qr‘¡±á4Bbñ²ÑðÿÚ ?W|(_Œ[¶åïA›F~µM®ˆíKe–á Fò’ yJ‚ŽAähñrà¥hµIS >@R UßkïØPxR±ìÎ~çHœ]Q­[ç|¥ùWäÅ‹LˆÃÅ£"K›Ò„ã>£ú%^øÕõfË Q-Èò:©uN¸RK3ê˜í¬÷Dv¬8‰8ÉÆœ/ï’ˉXŒ×峇8ff„¬qÅóHÇfšý1¶…sÁ,¸j›Or,çöä<—VµGŒ…À+ôàá8<`iȨî0Ó^2ŠA*Ü};R9Qýýµ‰–¾“Ò`Ôª¶Áü!_†Ù[RbÉ~+éXJ|‘â$à§ ‘ï­sõM¥6uVòÝ úí5·ª.¸’ÒZXi ,Ý*QÜvW!=ÁÐ ¥êÝ#e ‘Øí^uî}£S:L®6(sÿºíûQ-ÇvS¯'êÔÚœEȤHf1Ðë+Œ‡‡€Î2´¬¤ƒH@ì4º¤tî›^Mjœ÷ŠíÖü´ù{U!² |ºìHR‡nì3Yg_º–Üxô9¬É—>rÚYaJß:FV㉠)g@g¯%U>²tþÉší½"¤ìtÓ”–å8Äžb*ÕÈ/:„¥JÏ¹à“œk»™W©õ¡˜ÒâRT)Îç鎦š%'ÎÈ©8BÝ–áqA±´“ÀØ5òø¸ê¶Í¥¦ÚÀ‰>£D‡ÀÞaùY^3;Àü!KHVH#·cõ ©ŽšÑ#-ï72¥QJÅ. 1•>ü• ïZž0€BЉÇ#¾yK£­­Hyº]±A¬]ÕYZ§A~zá*‚‡’ã{N“ŸÜkÜ¢ŽRÀ]Vš}ÍÈ(Ù¹²œŸõG•#Û¸n™Ry-©M½¹k*JüBvàç±É<Üþºµïú¿Cze¯—:c•&\õ?TtúPðC{|ÃxBGrFN¨n^¥F½(Û4:eV«"mcQ©‹Bé–šõ»žá.-粎£éE·¦Üiz¾˜Ì!šEʾ20Ãñï;ÓbËy߈ºÛÚJŸi¶âÊ‚¥&`IQÇs´ã?—³#7W¡õZ*ÛOß\U––1·(÷ïìqôÕÌû†MzÉM¼k‚CT)Gé.Ìf:ÞDw|vÜAp ° ç®;§=*ÿ¹œmèÔ:…fmV3²[Sjr1JpîÕz€VÕq¤ù][I‹ æÈÛ¿z0°³’:¾gB#dcœm‚ùé^6ì¶W]éIÊÅ€†UÎ@PòÊúàŒÿãóè«Õ«Sï©Vµ‰L§¦´úZ‘SªÌþ[;J2”ò¥ìA#<ä¨ tþC°fôn,„©2ݦT7zTÒšŽ¶°{d% Á'=Æ]¦“Ö^¥lÚ ð©.粸Pqôêkt¹ÕJ29sгÕît®k‹Êâb¹îî= õô4vôNWKi’®Ëf¸­Rèò•Vzl0ãuwBœ§0•'Ã;Ê’œnÂB8%\7MëVU“aN‰Uj†ýÁ:Yu>ˆÈ}rÃj#;I±hûö„*¶mr˜†Êœ•OÚ¶Œá%µÀùë,?TºEÒ§|Ç–ðj5ùý¯R»öÝoÕ-aYàÂν'pN±¨/S‹ã7’2ë¿C’I„÷£VÐþ žå]uû‰Sz¢µ2”ùç a¸ÞHdž@@ É ïùiég[Ñ)‰B–_ž±º\‘ÝNÄ”Ÿñ?û { •2}I…Õ$¦¥6Š…%¥”´™­Ox*! ¤6[QÆ䤞úkÃwÈR‘~÷U„„ê$ãýhªÀ\‚Ó%4Ï;´²±fc’OSõ?T¼6<âpA #ýMzÏŠô*„¸ïiÕ¶±Ÿê ÿ±©¨=¨Y7ÚoÔÔ,¾Çórý¦ýMcî•ôþ_PlŠÓÙ G«S*ª$Ÿh9„:;G‚Aç'U+šà‰¶nn—ÖÔã§iD$GžÂ϶ÕŒû‘z|#,3EºqA¶ëk?%ài³rW™¯L§&2ÔˆW*ô©ç åXAòØjüK°‚󉮌ƒpGüEOÎâ½K‡mÝlØr7PÀO¶:@®ð¹o™;fÞ¡?fE„Ìú•U!Å @VÆÙIÀsjÉW¤pHÕd+AÚ‘.ų:M­[n¡úlÔ2û‘~õ+2u‹Þ•') ÊIï¯TéUª´¨e* ›ŽKïBe™/F[ÈpÀüÇ:/©\V%ñuY§ÔÔ Ô‡œTùÑ©ŽCD8^ Ò#8„¸´”¤nÛá¬ð,Ìp˜v†@œ½~¹õíO\÷«ª¾™£jn Àœ¡2q„ °åÆ[;žý¨TõŽê´+2mª›¢D‘i¿jE”˜¾3²ZØ m@áJKk$ƒ´푞kù@¾`Nf± —fÛ0[L‡Ú›(>™ËO¬4µ¤§Èãü«ÛÖhóýL›PýåÅ'ܘÔLjúxŠúêþ¯ÿêÍ*³´ÃœÕ_ÞGie”)Õx…G.J# í¯Z+͈ÅCïì3ʶjzüi·y#ÉÌТ ³69ˆ÷ß¡ïB5ŠõËÔYvÌÛaåWh´”ÖQ.¯8¸d•nŒ Û*p¤¤ÉÈì :%Ô+ÆÎ½Ú®]”†ö—ŽÐš“iJÌm¬ú°…-n+> ®6á]’ç5hõ«.Ål:Ý • (mñ c:ñ'䥓ûêòÞ³àÚ}s«•W¾n9U‹P©º]DWÝ‹âme¯å¡)'Œ'8ÈÏ'K1´²_».&q¾1¸¦öál¬xfÚ&2¸ç`¡°€†Àr=‡nÿ…^]{z—6¹nYü›¶ág1*S“!¡BWõ0VJœIÆä¤v' fˆ T)µJ5K¾[4²š‹VÔ§#èq¥%@¦_÷YJ”6 ótZÀ]¿HéÝŸO¸#Û1*±–üººÕ—PKjPmJ n-ÒwÀçÛþɬUiWmãjÕjª®&ˆ–ÜD×Pë{·¥M8RQ¼‚!\þC†kÛ‡ŒÝR€íž£|f‰4þÑíïAk™Vá“.W+ÌW×§s‘WT_ˆkF¦?ú“þp¥NlH*qõ/ mHÎÒ<-˜NãèÏbYýAêS6=9ššªqa©-¦B§È{îÛB‡ §hVâ F0 9çY“§Vd[F=«O„ý›Ô [{£q*T¦Êʇý),<™IùkÂÀ¨I»ß¤ ˆyz_Oâg©Á÷k˜ÆöZî0|6 $ÄàΕdÔZˆ’—{ç÷Ú‚­8Mu³–ÑóñYÕ³Ñ ’}¹pw­qE­›ž ±ãùÏ´D¿0”¨|D…î@ÙÁóÈšá²jè¯Ù´ ›m–››O!-«ºB›J€?]MC‹Ü›©IÜSUÝ«"¦£pªr¶¯˜ïY¿áÞ¬„¿:Žü¡<çšåkÚ…¨nÀ'ÿ}ôܬƟC¸ÞSÍ´¸¬0Zf;*ܧÞW ¥8ùóòýtaÓ„ê"ÝJ«Î–™í³%HRHB¶çŽ3'B©4j’g Òd:Ëe’âS† à¬ucŒžÚ²>,VÕ5»«ËQ”r0ztt?J~Gˆ<>W˜íþ-ÿT“¬ôt©LÜVí[ì+³ÂJ*+y³"äémÔ0RF‰9¨`ä`z§cub™IMjUrÖiÖ%6ÃT˜±,ÎJó¸­åem”÷Rr{ñ­sÐ2ÚKÎ+rq¸Žß¶ª+=-…YSAÉòËE*C#!`cwÏŸ‡~1çhÁ4[§øÛm¦Ãð-onSŒþ_^õ‹›éuzœS\f§A©^1êÒ+¯Ó}ÖZ[ `´¶›RÐ !²0 9ã’Åøw³æG£ÔîªÂZMBµR“2,fÔV˜é!-(…q»°œãîÇ<ê§Õu «ÍeųåÒóho{h<+i à‘óùh†MéÔØÑãFumÆŒÒa ‘†Ð€ÓêIÖèô'Ž@ê½:ö¤Ù¼]Ó.mžÚ{‚Uœ¹ò˜ŒÓ½dž«ô¾ô‡sßnÑ-ó\§ÞpãÇ5™M4˜n¦?€´¼ v„§xRAíïÙ™wG¦CéÜ;E+§AˆÜI®«û¨Ka­§ŸpŸÏOÇíXòZ(SÎzYSmØ£ÆÿÔŽ~§A®ô&šä'#ý©1!Õ:´¥^=¹Êè’¤®è¿7]ë>,è÷VÐÛË9" U|‡`NOmÎk®š=2Õ½é9°éë?b\t¶\Z–Ú0'ÁûÆ\ )‚RNN3¨ÝÛmY4Zõ6ã¥O«´ê¢K«Óä)ÚÌ…$±J ZÎJxV?qÉÖà£t†•F}ù È}É Å%#ÃoüÇÜþ~ú·þ‡áÉ yÔ-ÖËiZq–Éþ =ÿ}%I®ùÆ@'8ÎÔogüAéÖÂ2Ü"¯/9‰¹Êã$oµc^¤-êÃçO•ä%&­hª’·v'ù„¡‡cäŸK‹Oï]~S ÕkTûœÒbµZª½uQø_•J^pAÜêÂPÎ9öÖ˜¯ü/Ðî:…½"eZjš£>¹hŽ‚—ž#Zò3èõŒr®s®jG­&•yL¹?ˆªL—%·]IK{K-Œ!€1ÂG$žçq×ÓpõÜ÷i#(åQê7=‡Ý^4ÏxkNÐ.¬ã¸a,Í€9ʸÃ6qÕ†Øù¤¸ÛÔÈŽ2߄ʚBØãjHà~ÚšažF„KZý) Œì;êj=ÝøaIJÜI"B¸,Hó¯r}êÝ_[Ëq$ˆv,Hú_ÿÙpygame-1.9.1release/docs/tut/surfarray/redimg.jpg0000644000175000017500000001774007670466467022035 0ustar vincentvincentÿØÿàJFIFÿÛC     ÿÛC   ÿÀ€È"ÿÄÿÄ<!1"AQaq2‘¡±ÑBÁð#3Rbr$‚áñ5cÿÄ ÿÄ<!1AQ"aq±‘¡Ñ2ÁBRb‚#3Cr¢áðT²ñÿÚ ?ó%õ!p0ytˆççBº¡¸š„çE%ƒü7y$Õ%bÊ÷·”ããYsm\”°žÞÓUNžÖä÷PAÅwÿkoƒE4V—' ˆãOD¸®,¿T¹§~AѶ{©û幯VƒÒ´FAµcoÌd¦K'ˆv‘Mþ;oŒ¨r°ë?”«˜£{I!hãÌ}ª¯ï›JUorNÓùTFG’ºúÔXñÄ»<ÆRÊ7GIïåõ«];1éÖÕ-Ô!¦ÚPm°ØÆ@ßz¬“-RˆqVŽ7U¸‰ ÄC ·¢8$vžÚóê„dq3éÿÚù¥²Up j”í'ø‰$è}ªK+â±QßAmdâ*r˜ §ž*+¦;k’èêò@=´9N)ÍämL,Äsè)j[€Š‹B‡VTe!Cf<¹æ˜Ôz}¹Î¹>IuŠy`öÕkË\×ËÎîO y ܧ#¥I !8æ HKjl$ äPw®š½SɸL¡QAH€}HãðéTh¶/¥WKÔJ}£R$Z ýQ˜=HL()yþrG™§€ræøi¼†ó•+º®R„0ÚYm8BGgi©KyI‚8ûP]9—Ò¤¨KgófcÓ­:²eM[À`°ðh‚ƒ¿eCŒ¤¥µ}k…ÈPØoÝB”7`r§æVdÉVk·Öd»ÃùB”{ª<«Ò_ÕÑ_O°†Îypæ§ÚÄtÀ—Ⱥ¬yŠ”Û¶yåOuØR¶q=Õ¹”%jRzœñ¡ºË¶­4è>)*Qé´øg¥+„2n*$ñ%JÏ!ßS\}-7Ö=PrG}5{Žç O²JÒ¬GmUê €ƒ“‘ÂÓ|JÇiîý÷Ôô$º)Ü:<¼â„ õ“_bKz¯Y ÇS$†Ú¼Œl7=ü»ë¨þ¬²%¨­å³Ä¬…) Ãj¼:¹ÓzåGo’@¥LT&‚‚ÊðN(²¬Úÿ0™áŽ«ö{G~”ÍšRIWˆ¥ÌÁ" QZË™‘²°ëJJÐr›yΗe+…ä“@^ŒÞynP’¢¸uÁ?”ç?Ò‰'H\—‹aAÏ!A]µîž-ƒÃY–:éÔ4ä]©U"<Áƒž•*~ i í+<;u{j2¤»&*Ð<*ñ iL¦ EMGãpþuÔ¤O’¥ed#È­ˆi1áúÔ;›ç·ø’HˆHÀ§ôŸ^֨ך`¼M*nü•"äèQʇ3ÞiS£@lÌ×ËRn\ÆO½zŸP£¤¶)9ÆV‘ó¬²ü„Úâ½%é*m¤mœîO`ó­KQ«†ÔáîR~µ€kk‹—­@˜GÕ㌨ÓÏ?0*»ÑZ.’'&»'ñ*ù»…í—R<É<|†MW‹åææ–e;)Û%G$yó¦M‘µž'Ÿuåv’yÔð’”p »ƒ’ß,ÁŠìÇ?°SšI݈÷‰®gu T~زâ $ü‘ö¦Í†?4©Ôù(}ª]¶ïsÒn‡£>©ÊÙsqÓÌSN»p†3.Øûiþ¤¤â£Hº¦c*b;.8룄'†²…86¯ÄŸi5d¾öÜ– ™ôç=+d‡vnû<†r–GÏå øÕdùf|¦ÛohíÎÚLZM›Hµ j¶¤/dœœ|èAý\Õ•NÃr:åK(8øÒ»,…¸°È˜8ôëW¶£©›k;w5%l.$ªÛŒüö¢€ò]p¡*ð¨O8]“ê휬œPõŸZF\õ˜ëŠò†éÏ,QF›ü'g»º–JQŸ™­î4«y+”.ËPgX)EºÁ’wqÀAÈ&¬áÄLFøöˆí4ÿGBš›Z*Í,B†À“1@q{)ªàúE¸Â‘uŠÚ£-X.5±OÌæµ&É÷ÞÇÏ&¦»Ú]&Éófµ´Á!$¥'¡>ücᤑ¶i‰Žñ¬žòÏu|\¦SRT±êá=!XþœšÎîzÊí¨$8¸iDH€áX$X[[-õÀI©:ƹm¥´åK_å |Ï ÇéEHf[ÅN*RG>Yõ†º3-·óØ §Y¿ðçEK²¶,­<Ž{ÿꪑj~@.¾ú›xîŸÊ}ÔY6JÉZ‚zbf«õö•m[.’<@¨§o‘œOAšÑuè,ôJY(Ná'²†õr”4$¨åRä'Å#$üñP¡j) ´ÏD¥t²#¥~lœoPÔû¼v}njºõ›gšR<![™¶-¹¹d`üùý¨~£­7yhXa*%h01áÎÓºO ©ì¶a¶Ç$¤ jÍh—ª&Ki3F˜PInrOÚŸªõÙ·\X}Ä•«ˆ„íRRps¬Mq¶åÐ8¤+lˆÆGilQ4™lG*[ï\u|ÕÜ<«˜Mu‹‹ø:²Í‘m¼Çˆô‡$Exp€³žÙ}4èW@ä(#í-¢w+qVf¬Ý'P·¾lî’ׄ#Œ¦Š#ï¢ÇÄr#”ïà£úB–’ ¹œ l~¦¯¡É ôjÓ*QmÐ@ðRYNmÍoË#æj;))K¿ë4[Qt8呸èÖ¤ª;ku.© ­žÊ&îË àF^s¹³ç\ÝÜ_DÛ8SËá÷~È£+¥#[¸]-‚¡Ž©9$÷Ön:†½ÌôÆÆçSºUµ¤$Ü¢&'˙ΆáhÉ’tíÂ[Í©3d”©–NÇ„ŸéTÍÝÄVC2Xu¶HÇwlkjÈ¡­}31\9P(9ÿ¨6÷Å×68'qùr¦W²¨²´76nZA™¾%SÊ $õÄ i}+hXÈ HPÆ¡¹sXã Eqõ£Ÿûwì)û~ ƒÿæ*V‘¸þ«¤¬§ˆ8Ï ·Ù?¥>³…%"^[ —6¨¨˜yWZbÍ6éq7ØècÇJUÌñ·¾Š ¿Â̧W°G*홢Û9ÇYATgÆÑì=õÊÐ.O¢C ×Tê¥B>Xúu‹Z{! ¨©É3?¼£€G”F9E?dŠd$Êxe$å¿Æ®BJ’£ÈbºŽÈPKiÙ´*QŽHíÅ qÝÊš°¬¬»–BFzž¦°Z1–?¸ýiWZÀcPLÿ3õ4ªÁcü$ú ä TEûãù•îkÓ:©A6W‰8§'ßYãVt=•?ºsœwÖ“~JWo)XÊJÑ‘ï¬wXë7­³…¾AÙd•òG­Ÿ§‡Þ‚ÔôËt¤Å¹F,8¿a]Š©e!I)PÈ;]j­H_2#1R!Æ9é7<³ô¯”Hn(IX…"’ÈiºÕ»…Æ’@JˆãŒúÁÄó©aˆ»œ2®£j H>x?¥T2¬ß®ܲ­¿Ê§è˜ª¸\'-ÊáÃ$ý©«Ì?µ|†HÂ@)'·aúƒ^Cî'™ûWˆyZM£Çò!‘ñÝ÷Ò˜ºŒÛŸòZÒôFÒö㜈 ùmY묇™qµrX#5#N놗„a.”ÒI-©Éò5é•Ü1±¾ ÍÐu&4LÜÝÈmHÛ Dœ×Ý\ßC¯dŒç¤»:£íQ$ŒÆxw¡_CM—å]®Ò.“ѸàÂ[ÍÒ@b ¿Ô±ÀKBJBæåô:»« BÖµ ããçVzY³¥¤–‡R=àš§±œÛü–EX!?i²´¤$ñ8ÒºVÖ6´@ËIq\)öS°–žXÍ]úuºœsrÎå#ÔÁϨçš“mIKYï§%¸” ÌW)_« $vTE“:JYIÆOYT4 ÊÜxS©_tÈi9QÅbZµ\WùgûÏÔÒ§u³>­©§61ÕYyšUdÛ™e$tÅ:²Ju „«ˆZ½ÍzvûÃÎyq§ë^{Ö-n±vKßȑ¾Á°§Î½ }ÿç«üÓõ¬úíg‹w޶%4o9æx=•\hï‹rT¡ƒƒ]›ø‹¤¯WJi@-0¤Ï ƒäA¬á HR“Èë•6‡=¤%_䫇}¸?†ÜVÒyð89{ÇÚ«ÎŒ»Ëi¹4¢;wûSr^aYJýëžÓ5V|/Z“Ë$LÓ!!à€ªÉ÷”*4\ºêú¥Iäqy²Ë…rj òúgTž%`œ$oSXÜÊÊpYjæjZB¦g…/¸nRØR{°œ(’'ÌCÏ8¯¶ ÍÏK%A¸Èm[‘Ú=â¾êGQ7 Øì¼ÕÅ¥RFF9óíßõ¨é¾E*Ç\êáÚ¥! ¼±!*V0BRç|´Bºýër.rÌéÌ\nk32“‚Ò˜…tfPÂÔtlR£ŒŸ ˜y ­› ¹wX pà¾àBÊX‚@û×3lMEÔà!×:&G´}£°ûÖ{[QÁŒOéZRõÓi;’‚fbIŒgÍM~{Aé•'&ª£\—ueÉ…MÆAØ$gÄÔ…iö‰G Ô=lîO•w=q"Áq€P Nç=„ÖhØ0™$ý*+Æé_Þ=µ)N`ä(ŒÁáŠ;D¹MÛ¦®L¡&* jV Î{v+>éSc˜ë Zix_+ áÏgL›*KF+* ž¢Ê™rÊϪ¡$<¼ó5ݤµ»qÁ1.toV½vüµÜ¤îm!R¢IñI)Ï™éL¹:=Êdf‹ `°§pr^Y­º%â%ƈò^dŒ'³Â±xv’¼;0—]ÀäWÞŽ:Oõè ¨ËOÁÈI}Ï¢ê !æ÷$þO—ì~­u§^w. ÚHÀ€vã„qžy™­ \ǰŸ`ÍFÕ£1mr ZB’‚ ±œó¡M_­d5)ËE”„­¾«Ò“ßÚìÇ}0‰rd:ûÇšŠ»}õÞÀ«k®£çëMº·kPÏ{ebßz¬…(˜H<Ò0gÏ—Küóho-Fâ¨ñ!I9?õVbÉ(O7Iè p§ £·<¿~uPÓ·[BsZßdä¬äcËíL¦,ÉMzóKþÒ“„ý¨â’µ¤‚¡žpgåUk.Û[¼…¡— FB “´À…F@ä+Q´GËîLVë)(N{;êÊ;ŠeC»Åײciv8@vzœS)R†ÛÖÇiÜ j¶¼Zä6«‘D¨«VRŸ,PEX>²£ŽƒÎ:UŸoÚÝ2Ù-$nÈ Q *þ,ñô˜¦<êž$“ÛåPÕznØ¥à…/œ×R䥈q*ÏL ¡ý$mò ›Î¥‰lx´XõÉ À;:‡on^ð4É«ë ÓSÞ©À“ÔçdšÕR½v÷%üç\\üM*‡reJS¥°ÑXÏü»šTôÒv¶ÐW)_;ßÝ8ìÎâOÌ׫ï‡ù§ëA//‰d'¾oÀªÞ@Ü•§ë@’ßDrAX&ª»)1]óÚ…ì|=ÍIÚâÔGH±ã;ª‚Þ×N┥{Gc]<û“x¸Ôx;©Èè £—eBKi ñ5[¾únžAH„$|üë<–’u]ÏEJl”‚{³ŠiØ¿‰Þ­ð¢–P*ìÎÿaó©7ö•oÕŽ­Ë–B¼ô|鉬:V̘Êá’¸“ãÛM8IŠqëz¡®>ÚÓ;\%C™§êšÕÓ–÷aª†Ñcàà¼øÖU8·]np¢¦˜x„çÀ‘ö«ôzN¹¢hZñ,ŽèÏñÆ?Z¡·Åq”8ãÊâò¸–IÏ}@´eæûãdžgãMšþ¥¦êj¶þÎFQ;ŽÒ˜@N@œç Šî"€ÕVž!•¥DÿUö[æ^¬»¾Nx”GÌ}©¨äªag’S¼•\D!˵Ñc—J@øš!¶ïåýiE.Žë‘xŸ“qú×ÙÊuéLAa\ xî¾áD‘´¾ÖÒZ2$ŸeNoïÇ*¢¶ =«á{)A'>FŽíÍþ!q[‡ùM Œùì*Óªl¤À‰>tÏ X3z·]uKßµ3$ñãC>£ˆ¶Û[ÂÖéR€çÈ}ê¹÷“§W²Ÿ:´ô–²¹¶„œ©GñT7•bÞï‰ç[mFæ[œûÔ qAJð£÷@ø Ö§Yt­ÃRÇß“ê‘z‰@ÉPÎ?y¢‡àEÐZVsÑB„——TzÅG`}ÙÍYé(êU’ØÊAÏB“uRúUt¹hJC©ÈF‡×sr'Ã<<§$ivÚ.Šæ¨ÚI»Â‰’¤äŽB'•Z#b…«wë©Gå\´üË«ËnÜÈRQí:¾_:‘üÈFĵÕÇ–Õm .pѸKg/-ÃıÞyQgP…9¶MWÖ6È}ölTçv’&y“Œ &f¨S.T9)bàÇDW²V9˜öC.žä“ò§uûíq¦"0·ïTŽxåó¨Òò˜/çr9øW’w¥+ˆšøò «ïÚïÞæxð8=b*2­«NŒ…rFýÅ…{ÂqóOΚ2ÜçùG~´[¦íɹz5õ28”ÿHSþ\G‡æ(6ÈéTU2¼ñ´®wï5‹n••õBÊ~õºëOMª-¿…öR¨?í ѪùÓiV^yXL4ÎüñÈ|1CvÄ®JŸœöî¼N<ïéPGNí­ ©î3îíøb­¦>ˆ–S¶ÀãÙ[CA¢Bxý* ¯×|–ÔÿSy¨Ÿ€âh~yB±¿þšUÃÈ-–¶<ïã“JŠ'•,“^±ÔOt·þ•$üë.Rœ¸>¢²xA­+Xlw9N>5™X.,zÁiü¤äóªÏMÊ–A®ã훡Z“6Î*Sð™4ü…"+ƒËjå·Âá-âpÛÔ»¤XëN°wªÕ!SœjøhÝJ¢h…&ià-—JD@™5奯¤ƒ’çDâ7mg}û¼¨5×åY1nL- NÉt …ÿ×Xe)J@ê )×á6ê8^i'¹`[Z¿-ø%>Õÿ²H¾‹‹w;·y˜¯QåÈŒÖ:»äTŽª”³Ü”ýëãP\Sr[1UÍu]x°Zï0Œ²Ò’°xJ†Ê­‰¼J–d¦Cs³O5n’Û‰/$©dd‚9b XTíN¥²:@Ûx$wã|kO‡BŠÌQÊŽ*ƒDY#ÃjD¦Úám áJ‰ÉQ¢†PW•s'z|øqÍ©à S¯e4µZZw®þw V8O/•gÞ’R.¶…¨aœãÅÿ”=}W RÀ:Ø5–‰©-f<’QÃÖC©æ…P\F‰fâÙ—=RÙe@¥¾¿z—g|Èi!f yu¥ÞÑv[S]ûª·@R·1‰4e¦[õ;\b¼¥M²€3±Î(kTÆülHŒÎ:§³‹˜ùÕÝÖF€ÃJØì@àèUíÒ9ÐÖe+﹞暴޵w$B\Gµg–™ TWAC잓Ͼþäy^³ J¢»œõ{…_´£wRf2çªK%]ŠçûÍP³kÔ'†žÇ0~tƇà*J€êüñªbçL¹´PaÖÔ°2•$`pü¹I¨ñíªõƒ"KÊ’þr ¾´åÅX#üjQÒ:ŠC>®ĆR¡•xmúš‰øuæêŸTÇ[R°âÒR‘ã¿*Ì- ;·ƒ|**íŸaµ4-–’°bRIQ8ó3ëÊ´ßG¤¡:£€x{7â'í@wf?Õ²ÛÆ'®Ÿ3¿×4q ÆÞÓƒ†Âûüh?[oXJ‚ä¶8”G`'#?he™›‡%OÞž{BÕ1âg`ž¦6>ÕR™+ó©!>_½©¨pU¨/­DÇg¬çwè+¹ò„HÎ9ù¹'ÄÕÖ·9n´­â?#®N7°~¾úžµ–Û+çÀß*QµµEåâ-cÀŸj‘f¸±= RÏŸ.(5ë,Àž¬uæ)¹v9Í@þ *[ª=a¶ÔmJ°‹R•ÙËe êÈŽXôÅf‘ôÅÅ¸î­ØŽ)a%A)ÆIî ˆ>õ’dK‘mu/8¬H8*ô*œÖ°ó[¡#>´«}øu§_–‹,LFÜ“Ìã—*ó㾎µû›HrÚêb·ÖR‰Qîçî£+š»ôî¦D%4ÊS±QÖ£J¾»¬<êv”¯Þ°Óÿ4í9Òóo,’dÎÜòòðç]Eèêÿ.ñ%ÆmëSE]Rå½*ôNp¥SÚ„$$$c×ïK·ƒº=ÃËyO¹*$þï?é¯ÿÙpygame-1.9.1release/docs/tut/surfarray/imgarray.jpg0000644000175000017500000002745307670466467022403 0ustar vincentvincentÿØÿàJFIFÿÛC     ÿÛC   ÿÀ€È"ÿÄ ÿÄG!1AQ"aq2‘#$B¡ÁRr‚¢±%3b’²ÑðCá '56SÂÒÿÄ ÿÄ>!1AQq±"a¡ÁÑ25Bb‘#$Rrðáñ3S¢²ÒÿÚ ?S¶ˆnU·Õ‚Ÿdž¡‘h5úE¾-íý¶)ˆÿGWé9÷)í(‚•=ñ]~eØÅôÝTÏvÈ÷†Â0psÖ1¦¦‘ÿa²óLà%:>¤q­¾Ñx>f£Vô´Z_hy×Ú=Í.۸ſ~°¬û6êH%!G8#±ó×vëØó¨Ñ•&2ýþ ÓíP´œõŒŽÇñÏ>šóuÀ¬Ü´õG®SVqmäŽ;üõBÜz—CvܯçÒ‰ýr…µ‘ØϦ¨”;ÑTB‘Ø«)ÔURÕ£¦êÛ;ª‰Wuøôˆ™v(ŒÒštrI¶0 @ò¾‰qÕ/ õÔbD§ÓéO&$Âl£Ú¥´ ò£“ÀÎìuF­×"ωÚ ?Rª’SHq'¾F8=»­Ûz%¹M…nÁ(KSÒ냳ŽwRŽ<çB‰G†† õ:Tµ6I[ySA=]Á9ãÓZJ b’•”§­%^˜ Ë#R枘ò@#ŽUåùj>EAš4)‰‰)`€†âx^ã#ùhn 8MƒµõEoÞëÛô[g!±_ ÈŒó%„Åm9!$Ilá]YçÕs}vŽ5ß]~ïµ¥5îµ§ˆPRRæ~!œ`yê™[¬9\ª.¡<^^=›D dà}ï®úeZs)u¦¥»’RçÃÀç#óüôZ@9R¹P×+Ü£• ?¡'TœfX1£²¶t«ËžÎxÔÕcl×¼rmú>ëjÒ^mù*^NZJúÖ´£ÇÈg•}¹wÅaŠi[qŠúŸøRs““Ÿˆöè ¦"ÛÔÆ)æƒqØ@.”÷q3¯@ÈP”µg´_>‚¶\R•rݲªHl%’¡ìÛ>M¤a#åÛVZz–ÕƒÀ÷õïÛ×ùꎴ.:Ï8?…g?—z´Cð™E’¿mZ­ÔªòN –ã€dùòA?ÇFÆZ‰D§%KqbFo…(HÀ4¨øŽr³]]Ķg]Óœª:ÒóÀãæq¬ŠfΞ²ÐV´oeö_e"¥w<§¯€+\ŸÖ{¼±"¡c²’êOú§Q+‡¸>Ö+¶ÝuÚý°ÓS)S¾$t“Ï=9þÒpAî¤?¯ÛºÙø®Ýºª@ŽF}喗Б÷ÿ6 ·Äu*÷µeÛöí&uF§RG»¥’ÎJsÇ`I'é¥QÍÒ;ÉâÎ)žè6"åouqÔ”¬ŒdôÓ­;Veë tíZ=n˜Í:tA)}g>É?¼…ÙA_ÛUÎã7En+1O²£ÀVRë#×Éäù|õ3°;pæÛxm…mH}±r9Ǥa@–\YRý˜#¸Xú-5PöþUBÔ‘D™q\¸P†"+¥(QžI? ÛSu¹V|k3ª;‡øl$’®^ïFX³£Vk%†VuD=ðê>¹Q[Õ¤P 9×!J $rsßӱ΂{iâ “G½eÿIhs-Ê«ÍÅCÇ©¢áíÔHIN}qŒù¶.„¹)¨^U ,¾µ0ÇQÉÇï+zàwòÐÊÒé'"ˆŠâ½!$pô5|µmèöœ„!S {U$r¥yœë¡ÈŠVTîq ŽõøŸgÝYÖû­æÃ‹öÄûéP% „TqƒÜΩÔÿ›·UXßÖm± Ê—B ê`é[9óüJ Ç|Ž‹ô–[_•ëqjÓ>K š–‰@æq ÷ÓA1o¯¤%9#œàœçZ.©®Qè†SsCN0Oý9×ÉúdZ]}ùˆE!¶½ìÊG#Ø„©Â ºž=s¥6µ¼;±¿ÓeÔ­(±mÛYµ© !n8yj'ׯ’Û@­Ã_Zmrn–ã¶VGAFH›†Bž™"á‹IŽN[Û‚p{M¹Oø>åý'ƒW+ãÙ¡ÀI<ðž•Ú¾û\ÖÝ"©hÞVÓSî3Òi’#ƒìÖTpzÀ<Žät÷<<¹­¿ uzí!ʵz¶õ:¶èö±Ù`p»Œã·Ñ8Ç®›ž”®u$³7»³ÎFi¬séf½i’iS- ‡%õª4rTÛ+ÎGl|´ ñd;²¬×ÞYS·%q$“ÔÃAkV9þØoûÀS·z½M²/*EÎú§×h-4ëù*y+Xm=GÌ¥DžHƺè{7{n¥¹B™rÞ7Kd%øT¢‚¦£§(ÈJIƒ>ºóaž%«Ÿ*&dz7 ²ÔÄvò¤[¦5öÓiR[ ZôØ Ž”FŒ†ÀÆ;$hD¥^~!oÛªŒÅØ-ŠUô°Ymµ-*ZÒ8g„I>c0­·ÐØNs€‚—…º]z½Qª~œɯ)çÎÉ$ãçŒê nÃO)É9­Oµö‹¬ë{Qm á#Cƒ1Gk;h-ßu2Ju镊“‰rTù`{GŽ>ð0OÓß9çZhñÁ\¹ =J#áW¡PÎ2>ÇKe úæÊîÕÙ¨×fW­ºª=›-ÉQQeg„”‚ONã‚ËL$JØ©Èr: ŒùýãV4e¦JC¨ûµŽoÑ%[äª$‘…'Ÿç×)ζ ÊS‰O)q é>˜õü´<«ÔãSZË,ºœð‘„IVª­Qáíž§ÜÇYÏàïÆ~Z×eíû•·Ù©U:K@ûFÙq>yÈ*?O-*.ƒÐS;M• ­Ã„еYë[–ìE¸ž•¯©D}T¢5š–JBßK †’óú«Íb{Çâ21ýjó5Ž®Ø7 寝3H%·ÿÖáæòù†¬»1,Eñw3,þÓ)²¦”³’S”ýßôÕzÒŠfÜ4öHS¶RpGÆ5wÞû.MU _ô º<{:ƒòã\á\wà©'åƒå®¡oµ’ü¶›ø>f·NÇÜÛµ]™’ï uðëEmУN¸,Ý:šq5øêKc8ϨûŒ¾†Þ÷ÞÇÚ«6]©pG‘mÜ qbD¹Ô[x•  ’Bp0F;ó«Îßo%·¸öWsLMPøá<°—|Æq󘸬rïOûZ“r‡k@ëÿ˜s¬™rí…M¸ j¨Ù˜ûhÓr¡HàŽ~ãWk_pmÊóÉ]ä¥T= «bR³äGH9ôàêÇ[z%»Úƒpn[¥Ia¶ +YýãöÒÃpxT³*¥NAnE!Òr wz’ÑYþU Œ Åðþ¸óج˻mV2ˆúÔ}‚}R =ï‘Æ{KY½±'ä}µD]www´!O©!hO>þ…3ôÆ/©ÞJmÅ…tÊ|ÜãŒúinðͺ…ßU*H¬¦ ¤­åüJZʰ~d Y%Q×»”{–›R‘%™c¨%n’¦ÕÀR‚窟„ö¦\·í=ãÖã’…¨ù¨-ÀÓEÞRS JŽÝâÔæÐ²—À맸Ô÷‹Z,ytЇ°O½D’އ€Â’F}33Ö¼–ãmµ’ÄrÓô˜Ò–¬`©Km*$\/>(YlýYG÷eCþp?žŒ;NãÕ}¨³ZA" 'äÒGòÒ}ž*[†œ÷°Ènî‚‘Ž$‚~4²ñ'ÅFä;'ã}’•ÉÊ1þ^\ü@S›¨m-À…¶•–Ù'«È¥@ä|ø:¦PG¹xº½ØNB]a+=C’Û'¾tGÝæ=ãm.FúJ¿bpà|’OòÓÈ”\öŠ´v9){cœF?*Ç£é*£ÿÃõ×}²ÉEÖ²áàô> Gü¨H-søuR³öñBzG³XuÝXKWg›ÊOþ¯U+F>»»2#nO‚…%—×û€÷?o_,¯Ï–½¦·aBqUª˜øRÄ^QÕèUÛò訩ŽÙíª¬ YR½¤wwãèMMðérÝÛ={Þu¨.G».z“KPèsÙ6ïZòb 0”ž~ë®[CÅVÞ‡F¸hÕµh(LwìÀÏHÆHQ;iÕ¬8©ò“ì‡KLü(Hí¼ZQЭ’¸_ö=N¡ÈÎõOë ËÏRÉÆ_hôªǵ·+TµÈa^³§\ëάT*»UÚ4:‹)R”ÊJWÜ@?>t#ºüG;Bºê¶ý:ÔZ—•˜ª*øp Q I ÷Õïh6ÎÜ_QVa62~Iùh¶W§õwâú锤·6˜XSi ö*ä‡ÏPk|Vž’¶œëZkko³­ÖV'C_ –S“€y¤žµ·ÖÍÛ¼»‚«ÑÍ&‡EB›Óñ©Ì+§á8<u ¶ò£îñ.*¤ÀCPÀ(Ï9*ì>£ÓS±n$Z7d¹ô˜ªv‡Uk¦T…*<õåÎuÄý9uR­>ìÌ·L™ŠÒÜçä>ãå«„!–{&ë\&ȺKSÒŽTNI©}® ®ê+¯U˜Åel®F@PïÆmê‚=“8CGÓŒëÄ­–cÀŠÔ8È  yž3©V ¥8I8=û¥)o#=) ªí4è9V˜OHtwîÖ­f½%=.ÈHìsÏ?¾­f±5çK”ïW™¬mvüAÿîW™¤.Ì}nzkθm%dà$uŽtâÓvÝ»–ܨ€cä9R{ò®”í¦†ÄÝÇ·—ÌeNgÚèI>_-ü@x“¬[—\+À¤·P®-árO(a'$FN<#¾º—¾¥»› WD|Íl»sn̸͕'8ƧëR÷+?£ülUQÔ$ÓÚXÇ—êÿò=oö}âȯ6N¡<3þhk¶ÝÓuîEcr/Â:jQ¡ý6ð È)žù'V7s6¦ÙÕŠ–™˜¬§<¨« þIÉÓ]ÅÄʸçQR푎í›e3ÇŠ8:iP¶¡Xðÿ_mÅtˆQª-#Ém©Dÿ›V û]©ŽŒ»ê~¼ƒüõ³h- ½…µtù1_¼M‚òªå´RÚýD‘Ü$§òÔ_„Âöê[Y=MMX#Ó)FžoCùAÞ U{°p wÚ+“Å@ Ô¬I<%MTü#âAçòÓ¢€]l¥hÂ8Γ‰övÅAKS†G™øIþZyé°šv +|h PÏ–—ìúxâe5o=¿¬ž y jWë¡ЏHsc/&¹!¸Í¹”Ÿ0ê,÷ä$gÍZ1{î©X1£dÚQØ1Ÿ¾5?JW«YD+…|«¢Õ*Lr¼w<‘ÿƒRÕ'€l$žAÎp1ë®d@là„ž=²N¾EBîjÜX-¯¡µ¯õ¯H<ç:ZêÃháè®C& ã¯«Û+9ËÎóf¤+T´ÑëUI!IbK­‚œàágÔçY¬7xüFF­^f±åØ‘põ«ÌÒµ* Ü*YÂ}ñ¬ý:Ó«&äNF×x«z½Y?ìZÜd&‘”·†Ð‚3òR9ù(Wv¤uî%¾1Þk_õ8ÆÛз†ºUÁODøŠ!iêÊVÚ¼”…R~šêVùc‰3šhõGÌÖÖ±\Wi–ÜÆÆJj«£­b>Ô¨î ¡ÆÔ’>DkDÛz•SWT¨d¨v.²•¨Ððø*®R¥(Øwüº[JÊýÚp$ dþ41Ûºu šÞ#PT7 ªFZ’°æœë&®Äú¨½+N±½[\†x¥G9ëŒñÅn"*ƒif#= !#çé fïo?ô‰Y–JW«MÅÉùCi?ˆØœw=‡®‡WþÛ^Ãsiv=fëUb£-°ûá—ZŽÙ'¾O|$œ`yz郶¬›GehÌHn"ï䜸¿¿×È~ZF¸È‚°\^CH¾ÏiÖ=)*áÜêH¯Ÿéö­œ@ðç—1ƒ¯}0·~ïÚ¶\7UaN¤˜Ì,-Å@‘Ûï¥^»»Lî^âÓªW)‘O·!»û;l·íRÑî•/× À< cEº¯„:Òi¾éP’ÔvÖ£0¼®µºŸ žþúìÝÊ•dí•NØaPÑ!Lt3ç´ýÕ+ŽFI:ÆŽâK ­GáIö’=æëäÜV˜ì¤dsÆq3§ü÷Ñ—w\Ð,û®M~àë}誯%+WY9 îSÐŽG¯+–ßnK{ sÔ(ÓäE¬Ò'IÒä¡áJé88ê…Iàñ®[ž»]ƒáêØ£º•°Ó¯†UÉ -­N- û¥#è1¢[Âý¹#o}ÖŸ ·]Dp´LëWRÝÆpA8Á<|µ#¹ÈŽ–ß*©ý‰´]Vû³­jMk¯\çO}·[xh[½[·¨¬ÉýAfZ^P˜ž22NÕÀä“Û_¡V®àÐo;j5RÝ©1R¥¸KìÀpAe$`ppt–m§†Øì²ÝZøY©Ô”€”DyÌ¡”€|Î>ß^ú›ð—T¿½ŸB+‘nºÇ¼d¢¤2âTœ}ðµ'Ôôüµí®[ “8Èhí³´Ý”ÊoWR—§Q¦šS}#õùd¤~ÎÑïÆ1óƒôÔ.û]tj]‹2„䆛bc ЦVïHPX!däqë úx‰¹j÷„­³ÚŽ–eÅýER¼Î J‡âB‡§±W'9É Ãð¡¨Ë’nk‚£W«< — ¹ÙGÏâÉ?s¥2î,E<igv>éyBŸŽÞçAà=µ C¢î¾ÆÓ}ÖCEËlº¢ìgY!JHW8 ¤Ÿ^Ïc©ýž²n[›pÜ‹Ö2!&;%¸P §$s€W’Uå¨*¶Øî^Ö±ííKŽUÁJlª\•%)ù ’?åÁãQÔ†».;OúCWºjë] “!Z€dò@ïð“èÆ›Ñ&Þæ}cRI6=®”ɳ> m8éÜy Óq·4q&áuÊO[í°ähý@ü!XêPc<öÈ:±AyørRTOB“ƒ‚å¥2ßñe^¥lU4xíÔ¯ê/RYuÔ•% ©#JÈOÌòsç¹éÝm ¨S§ßÉ‹p[rž ¶ZB]ŽöJy ãLÆšRRN åUª,Ód´ëì¶JБҜ‡rWÄzR2¥(çž~™Ôۤş)ÄERTçe,¨ ¤wà×»’´ÌKN Øî…5Seu´¤å'üI ýñ¥«p·¢Þ±«H¦"†»®¾è ÷Uð¶n³ƒñäqßF:ï¬yÒ#eCˆ(ò™¨UÓr²ª©QQ–âÝÉ9î£ç¬Õ{l*¯×,:=BE8R^’ÑqP@ 0zÃγXªîsp|þµyšÅ÷Ä(]$… µiï4¢íÿæM»žmkþ±§°~Ö¡ÐJP“ÉçHžÒ ¹¸öê%S™ÿ|iÞ¸+LÐb%¶Ê}¢ 9êκ¥½â~Ó`~™­{ u%ÿбU‹6å—6k¥K‰ø:J²”ù§>Dœ ý¼Â§¼·t…HXD猟¾ºê•YuÖ\÷—Õî`õ{2xQ=ý5¢;ˆ(KM[H (¨Ïújƒ@ãPÓAGÊZ”²ÙÐs¥ën#*O‰ÁvcŠ“*”ÃN(ç JGð}õó}c»|nµ‹cºûŒS'>•H WOX* àúô¥@|Õ­2ß^Úø¢‘"zº`\ì‡ùàu«¯Z?Ì5pß ¸©Ý ¤ÜVÛ¾Æã¢:$FÇÌ õdgƒÈóÔ.J’ÍÐ-ß»ZZÈÛ·=†r5¿þ :ÌõòúQþ>ÑYÓmÁn½lÓ×F(öb0ŽÁ!_ñg9óÒÁáö:­;÷qlÆ_rM6‘R[q”á两só!)ÏÓRÍx­Ý(ʦ·ZnE ´™é£œ/Ù”žAç•cIlNÚL±(“fV/WêΙ£ÔB²N ó<’O©Ó•òTUÅAšŽnâËufôq Jœç#¡ý걸òP¯ÛX‡\n4¶ä¤àðáWOƒýu³oª ¸üLn•]d(ªB“œç~IÔ5ý!x¢´Ðé%¸ìužžãátÿÛ]žñ3r·:jRUQ)O¯ûÇ?í¦Õ N?Îtþ„¿#¹Gà“ô®¯·µdÖ¨–UI…*¬rüzJ’;ù MIÐ|=ZV=!™² 9\¯<¬°ôõ{…ÇÃß¶AÕz爊׋^+¤{#)Åõv-º®?†vtOé½ôóê?ìÚsaH ÏHP# ?º øw¤­=bÃaµ—Kް“ø‚ŠA'S¡?‰nJÛxŽ”¥š“iNF@JÓœ}HÔ–[ŽÙ-§ªAéòï2”ôÇ †zšƒðëcµgØ Ô¤áUš}îCËå]'”Œý9ú“ª­W{nÛò»2™·4Ä;!ꔜ(çË«gÈrO¦Š ¨íGû4ô­ÚNèà‚Zãùh}ármxôNu!K©H¨:”‚*Z‡N~ØmD-ÑÑ5÷xdƒWþÙÞdìŪ$;iàJ“©úuøšÑhï•ÉCºb[ûƒGM5sOLy¨BŽqÎ dŽAã##F;²@kUž!\V>ˆ:ø½ªÄ‘pö ¡2'1QýB›9XN xþñ#ò0nܵU¢÷Æê)Ž%G¶O³#DÜá´ÃÍöcéN{ ´s®Ö¹^šx»1¯tøRÊų&›áêÕ¾b¤;ú2딇F? V†zIùu3ñ 0»ŸOcr6nzâj—á¦[wÊ@Xûñ¾ºv>ÇjûðPå¶Sí$UU1QÆ? áõ¿ÎϦª^nUÖ¬T¹÷ÊCªŽ¶ÜîIÀ#äz‡ÛN·–¸Ü„sN*»ÉÈôË;§GAÇŽ¿,þÕ×·›­ïþ©ÕJ›ý,ÛUÀU‚álá´ýT’ÚF¡|5Ú’*¿¥ïÚÒ•»«S*Z2rF{x$è6-šÓ×¼ý­ˆ¥7K~°%¸’R ùt`ý@Ó=¸·4=¢Û'W)h°ÊcCgÕxÂ.çé¢.rK­¡†¹¯ÊŽØ«aJ•vž=F2ˆú|ÅíG›‘nÁ[j GJ“‘ê ÓYª¾Â"J6zÕ÷¾£%PË+îJ‰W?ž³Yfäßבܢ>&¹…´ïúMòkà}çuUvÂwèÛö‰/?îe6¯¸PÓDdK¹e$­A¤ŽÞ¿-)ÃN½[ˆ–S¥ÔtŒg'¨i¤Ú[Ò–ìäSêÝL8ž HÀ'þê~÷õ»GI:p|ÍjÖÝZ)O"kÝÓQj•KuêmI!#¤ãÛjÏj]©*¬ê‹m „|\s©«öÖ£Î)j,„;Ô¢z²29óÕ]èN\ïÓ­ #gÝcáR ÜžxÀí’5G¸@OhM¶ }Bß[ô !iš)Óa‚ä9du¬þê‡~“ÈúècDÞêæÔLþ‹î]*Ti¿VÕM´!ôŽì±ÿûŒé˧ә§@M„ŽÊB:€«×:éªÛpêq¥O9ÿ¦ÒêOØäi²M½©ˆÂÇ*›X¶šmòä„÷t>4¥U|Tذ£)q$?Q{ M0RIú«ç²¼LÓª5 P.¨Kµ¤‡X÷  lòœä qƒžÇËM-«´¶Š+QŸkÑà¯Ú <Í=¤)Ì‚Ÿ,ñ¡ÖöXÖîã_źÕ%AÖO¶p¸Ü¤qÛŒé”Ø£„“žúŸ'zwràBB§ŸÆ—Béx’‘T§¸dQ CR}蔓ÐR>|•}5Ñáþ· È¿¯›z³!¨“šVÚÞXOµJ<òP?}0”öí½¶£{¤K*$h >й Qò*=Ô~dê±¹S·{­i.éL¢ËmÏb§›QiñŽÁDþ!Ϙj?‘ÓkÐh[‚È™!en¨¤Aü4ðŸµÔj$*ÅÇ™§Dx´ËÎ+­o¸22N|³Û¾[“ÝSêK'«N1#ö-¥¡Ò˜/w%\æ9 ŒœŸ~¸¥SÅKj¼ÛY6Xöt´•6ÇÀòrÛ£øëÅ…I¶6»Ýú“×*KhHîN2®?-4{­±¶ööÙ†“Z[±”Á÷ˆ•ÇGxqØŒA ƒßäptµ|¸Íáë²ô•sR)/%È𽊒“ƒJ•2ç×oŸlS²þt/±ícv«,«b‘•9ÈøéLŽÎSÑmØ–Ê$…²ì*TvÇYéRVò<ÁóÐ[íÓº‘«4HÊÁÞY9J^I Aù¡ƒ÷Ñ.ú»=Õ£â;ž²JAŸQ–©Æ„¬t‚âˆ=jIÁ'ÈŸ.O}:•€ÚzU|ã†;aïg4ðߦ£n®ÓªþÉ\£l;ð©IŽÇÍ=Û×Z®oN¦ê™_zמWíìs€¯í$‚1ß¶»÷c[¿'9vQªظÙÅIÿÒxŒþ,`çñ ñÜ@Ûõí÷‰M›A7 H(œßHJñÆr3ù DäÛeF|»\úU÷hÛ+%ÞØ‹~зžÌ`óQó©}¿ðòŠ Î«Žä¬;rVBºÛuìá*þÑÉ$‘åä?ÒÓ¾Ïû®Ó\kÆféüÔóÐú«·»ûtDz¸ûÑè®CH~-!‡Óí#ºp’Fqž®OŒ¸êû«»–é³ÛÛº…=ù—>[Ki”àƒÕÔ°‘Æ{Ÿ–’.Û5o!×µ×_eH#m~ÍÆ¶ÉoIlpŸÔHÇ·ãLÇ„XéáæÖšëK{ÝøË®(œúŒ¥òNÝø­¸i˜öP.,Ëk8©Y_—ˆ8>ú=Yð*4[N‰gSæ6X¥Cn0‘Ô*Æ8É翞€;ù TÝø±è°ÝLŠü4‡ßu£Ãm…$+Ѐ•+è¡ë©,ä%ÈÊB»ª–Ù¹*…xalj¾!:äãµ`Ø4èW½F鲨mžß€'¹\'òÐnîiÝöߊ]£.ШªöÓ”“ð«uõ8GÜè­»—Û{ybÏ©•zèöQÐOâqCË¿ÛU/ –Œ«JÈz³! 5ªê½é×2´·ÏB}y«ê¯–£håÕ—ÜÔ'AW6óo·Ã¨c pñ+Ó|N´ËPšmŠrZg¤-iOOd f¹,’µÛq „©g¬’{ŸZÍfKÇâ2?½^f¹+vIûAñú•æilÛí‡ÜH—¤‹Vb£‡[y+POIFAÏ'¶9Ñ®£±w-Bbe*ˆónc ¡Hã¿—V™kWÿ¶)ãö6è”às®™íDÅí<”È”JF=_z楋Þ}É¢¦ƒ(Æ}¿ZTª[ozÓá{¼ nt—T1×Ô€?2®ˆö¦×T,ku1ãBv]Vf2ZBGOü)ävÑ›«ÈfN0‡‹3#óÞÍ(àK(¿Ö‡T»n¦ÒP\§¾‚;òœÿ®¥ëTI®Ó–†b8ëžÌ Ž|½un–³'ç¥Ø×Mx7¥sÿ²Ö†ëv¿ ¦Áy÷ÂrBBrœŒyî2ó½½¹º=éÏRd™/yNù´Ãç>zάñžtŸìfI±Ò†­ê]Øo±FŽ¿^¥X×[±½×ô‡P =E8éÉÿ‹¸ÉÕrëÚ›ÆT(ví&ß’ÔGÚoÀÖxRÎU“œ sòÓP8óÖŸ3£UjiZdÑIÞ…Í'=Š4ñúЦ%ƒ*Ý¡S­êM-æ©°Û¨”’㇕Û#9×t[^¦ÑOU=ßSœp~G:$ðë3‘žt&ím#‘5éÞ•Ìœ–‘ñúÕEÈ´Åû(¸è](#â<àc?=FW­J¥:Ê*‡Ùµy#­Ä´SÔ’|²qÛï¢QìN³'žN‚»Sk9*4b7©tAâìQñúÒçMÛ[•ù)“*).0(ãË×Ó\µíº¼k&c¦…!0²R§T¤ü)Î}yÿÛL°9ó×ÀHîuãv–4&Š;ѺTZFOÖ—ê¶å­T…9Titê3%õ”eÞyÆœ"Z±ÚŠÅ-Æ"2:PÚz@Ç—ž‰€¨ük9õÐE¡¡ùþª]8BC(Ç¿ëC‰V­Kà-SÝQÏ tð?=y¹mм{\~މ"TÇ”zÙOH(NNsŸå¢H'×Y“Ï:ôÚ?˜×¨Þ­Ñ â £>ÿ­.P¶Þá‹I¨H“Dšãᕼ†Z)+q@÷=´Øo…O®WnÛ¢ÕœÍb{¥-6âÛQm¼ç¿QùòNŸ`sž{kÎ ãHdìóZìŠÈÌSí‡}WkÁ9¸­­C—ÿB¿?wk`÷;s·™ vŒö­Z`öÎ<â› ¬d€:¹Ï û“¢æÓmÝôkòš­[ÏÓém7†Ôñ@ê=°'ŒgÓËM6Ió:ΣžçB‹³ñ¢¶BŽ}wßuòó1sd²Ž%xàxkBF­j¤OhÒ)’Bâú@H=γ—^ë^1aC¸©7—b2èó¡|…ã• å9ÁÏ]««I׊Nëîj8푯¥5|¸×cèSþ•qP©× &¨ó´Ù‚RBAmÁÂïœêt[¢¦éOUAßcœr~ƒwF— ½;­¹ƒ‚ê>~”H #¸×`ò0u‘r}BU1~UAöÝ#§©|§œßOçªÊõ×T¨ÙE0å» ¯t8¦‚z–G®{þZ î­ à¤ÑˆÝ]Ñg‡¶GÏÒˆ cÓ_À’{.”ÝʹX’˜Ò«2”á#ÀŽ}}½µ½¸·¤Ì„×d*J”Ò’Ÿ™9Ç·úëÆîÍ,h w]t¤ºŒJe€Q=¸×`ûioÿJW-¤**¬Ë¨ÑŸ8,,#-sÎ0œäh‰ï¨JŽÔ¦*Ž?áÔ‡ÒF==4whþé£?Ê»§PyøúQ0í®é<ñÛC‰WUKä TIÏ$tò?M|Ü·=^E®?£¥È‹1•·“ÒJÓ“ƒŒcéúkÓwhiÂkÔnªèµp‡‘Ÿ¥@Æ~ºà‚À<ér…¹ ªMB<šÜÖß,­”<ÐH[j €àã¸ï ¶ÃxŽÜ*…r»i]Tçë*iÇÚKçºGТ´†Nб®Ô ‘îÇ­>Øw+v¾Ì[”ÚyqqòiöÁ‡]ÒsØëó÷v·ós¶Çq)“WwÏvÕ©%ÆœKe1ÕŒOá_¨Ñsi·úùNÖ®'ê·[Ëix ôžùÆ3ïé¡EÚÒ›!'õßr7Ë4ÅÂ’ò8“ãƒá¥4ÜàMv„]5I^c¨©É(S‹é!@qÔ@íô×j¶“½»DWÖÂÙs)$ÓNú¤¤ÚœŒúØZ†RH? +óÚØuÖkqº]£¤ç=CM&ÒÙt¶§"¡Vê}ÅrTN@8ÏóÒá¶?¤¯Ú$LgΔÚ?2¡¦ˆÇ—mJ-ÉB‹DwöúëNoK´u\S[‰¶–¶J“ÈŸ~Ý4x.ÅŽ†ºTGNO>ºË½5Ë]úußDpü,Œ&C@àêävÈ:“tÓšªÒÝZ:œRˆPéνmX Dµ%R]Iqµ¿›žuG¸OhM¸ iõj#T¡(ï$/¤z}ó©5[’2"¤Tª ±ÿå”âZHüΗ›ë}±t!0…FlÀ[‡ž¥âQïÒ28m h›#\ÝyŸÖË«J“"Oí¦6²”0“ÈH?ݙΛ$܆Œ¬ó©µ‹f&ßß-ÁOAãMå«»6ŠëQ˜tQç/ÌešƒKRǨ+>¸ãC­ì¾mݹ¿‹•ªÔJ{¯¯%ÂTáO`zR Çnq¡=Wµ‹62›‰úsØù]iò¢ÙYÔ{+Ã5:P•:ꜻ¦AHiŠ*!¶Ç ÎIÏ vše7Øåà级ÉÝeÜ8#’’…kăëò¢õ=Ëorhßõ‰&O–[€²µ$úé?B5˜ÜÕÛ½©´—k&sÒ¥¸çœ¦›IuóžÅ@þÇ©¨ø[âJE.žÙb>•ð •$‚¡õà¤ãï©è¯kúù¸+1Ú™9©¥ ¡äå¥ú$ËKÞ¸ðÅûG1ÝPè¹7¿¹Šð HÏM3éF_ û¡F­B¬[‘§©êt·‹¬²âzÇ'c×ò{hð„9Õ0¢°zs¤’—V7‰ù°è¤Á>t´ØéA=yN>©?©Ók×ÑwÛ‚hÉ™e¤¨v?ÏN1$vÍ¥ÑÖ˜/vÕ[&9œ”†™®Ýmò·¶JÌ5jÒ’§ÏÃħÆrKÇžäà$žÙõ8Ú¾3Üzð€ÍÙeʶig’Üy¾r”‘“€V S‘’2AãÛ¤ñRµOÞm¬…,ù”µ8ÏÂòrOäüõÅ…5·ö»â:S×KkIìFrž?]7Ϲ©©Hc—ØöI»­–UÍK›ä<5¦jú´þ%ÒÇA%@ϰÇÓXŠŒ]Vz€q$…(àêG¯#¶Š»9=%‰l®I[ÎÍ¥GpuŽ¥)e OÔ’?M·þâ;W³[Œœ˜í唄©å”¨ äþzt*(ÄÕ|ãfCacñg=Ü ònÜå§F§›žãx•ÿ ’sø±“žGÊ1Çr5CoÐwÞ\E8nôÛÍ,ˆ-ô”£<ã'©Õ§†û4ëuweW÷ºåd™ ï̤¤’{ŸUw?—¶¼®o®ªêí™@zèžå«ÉÎ ¿²Ïnú‰É¹J’ùj"yu«îѱ¶KE± ¡s ÈÞ§éUõ]ÂßÛ^#Ô7ÙZrbCjì0Ÿ1’{«)ÀÎ3Ê“ÁçU—#uvŽÝ7ƒ{‰P¨?¡ràKun²¬:zVJT9ÇaôÖ¯oüC"½sªÜ¹(îÛu’®†Û{8R¿²rúzjwÙŠÚkÇîÝ_¢ÿ-$]ÊjCOi®¾úFØý›“m“>Þ¢àá%?”Ÿwηv|újÓ¢^4øm†*°Û’#à…Êsžpxíé þM• ~,zÔ6“¿1!‡ÚhpãAa)*÷$)Iû${i‡ð‹?âü<ÚÐl- aÏ#ø¾pë‰#çé|Ó¸ž+nž|Øæb5œÔœ£ÓÄ\?–¤³––ã)jîª[fã*má„1¢ø†H郜þ”GÝ˽±gÓ GÅty±ÖGáq#׷笗†ËºUÛd=Fµ Õ _ ëj8Z›ç¡^üS÷O×[¸7õ:eïQµ‚€›†ÞïøÂ»öù]îç]Øø¥ÝÑ²Õ ´¯&rR>T䎢~Ç üŽ£i¥–Ð+QW6ólè¸CXg*lð«ã|Ÿm,´[q€¥iëãçV»RèN¶ý9.²AikZ’SÈÁY#]¬Éxý£#ùÕæk’·e¼?™^f’ݤYoqíÕƒ‚™ÌœŸøÆë‚ŠÍz"\l'ÌY#8ÒC´Cÿ™6îN?}kþ±§°„PèÊ£Èç]RÞð?y°'ÔÖÁŒµ´’´Íª”™t&\ø–ðdôù„p’;ûëÂ;hK­€P$>çá¢åX3qÙsa:ñ-§äé Ê“ê¬zpNƒöóê€òÛq¢U`„‘Ž2=Ph< èhùHB’—›äyÒï-…îWŠ)秪°Èm GZpIÇ¿Zÿº5°ß Ç©Úé¤Û¶Û^uÇ[tGŽKy! îIÀÏ“鬶ÜITo‚ÔÆÕTÕ)ö›PÆPT•äA×ó}d;c|:ÃÓ ¾”È)OW@ $à{ô©D}S¨\”¥ë C¿†´µ‘Çm› ä›ýBu#˜éåëZ¼)nƒôeT†ä-W"]L— PÎæIã”ãYlNå̾è“aÖ,×é.˜ó¡ÒJ#$z#ÜhïwlèVพ¹éè£y‚H’€%_îã9ôÒÁáöB®Ë÷qo6Xr56¯R[‘’àä…8¥óõIÏßNWȱQ-*9»‹ÕÕëÐaÅ©HVsœž‡_ÖªïèègŦ·Aòä1Ðz{Ÿ•ÑÿmLðïˆ[•¹Ð’ Rš‰R}ÿÚ9ÿ}IÜxÈG‰m¬[Š-·&[qÊ’2yp§··Ïþ:ôÛêz­Ï¥HX )¥cÏÌ?¢´Ú¡ÇiÏ÷ΟØH·ä÷¨üÒ}jºç”Š/‹^S y/ÆSkêìB›u<-ìéÔ‹éæ?ÕµÂUž’¢F~¸ãA/¶MdV¨—­1›*’pü`:ŠÑ’{zŒ}YÐ|BÚWÅ!˜R§¹C¯2¬0Ìô–Æ{‡Ëß¶HÓÅ¡æ× F•_íõºLKóέzçkÛÆ àþZi¼«²”Ó‡§ô«w×.Ëp‚žd`|AÅm|;ÕV­ž±f0âüÄRã ,þ" ÏÜhOãâ#‘vÞ#ƒ¥Iz¤ÇZ““€Rµc?p5€²÷/pü6BE«o¢ÕŒ¥|$˜Ä¥ÆPTT@ 9' ï®+¢ƒâãa.˜VâäôÓ%ºt„úA+JqÏ éRAò~ú“²óo¶CjÎjz»4¥31²‘ž¢¡$ªµêÑÔ¶©9c£’HkòÐûÂÛZóíè7d꺑RPt½…œþX?ž®ü:ß ^4Ù8MF˜Ÿ„ÊøWHá'a¸:ÊÕvJí°ë³*[sSCQf^¦ÉÁBN}:²ÐðG¾¢é„û¼pI«ÿlìÒvžÕe´q¥)Ô}:|Wx½¥Dpù`­1ç?Qý‚[YN ¸ÿ„ú7·'íUh=òººc…C¾–N‡ŽÆÜ•˦%Á¸5„Ô—õG„ƒ”$ç<à@àp2tc»#‰6µYpÄçns}æû3œu§=…ÙÉÖ›\¡4pöƒ>ëó¬¾Çß Xž ¹ ¼¹¥LLsŸÄù}A¯ï¬qí¬—…Ûit[Uzi?WuRãÊA8$ýOQüôbæ“RðõjØÑTþ“ºå-Õgñ%d$§SÙÿ”i…Üúƒo³sÑùibb0|¨ÏœþZu¼»Æ–㣚±P­ÞADw¦^äÐ8ñ×èëK@¹«LÞó÷J"Tå-ŠÀˆá©P8éÑ÷#LöâÛ0÷wlDE%Òû)“ ïe”þ½ßYý¼Ú€ðõN¥ÔØêf犩Μ–ˇ-¯îPÕ/†»®E+ú^­,7Q¤:´²•«ñ£' g¸‘ôVˆ¹Æ-6‡Úæ*;b¯©™*U¦yöÉ'×Ò˜„\•ìõ«ñ}BJa†ÖÜ’žMvµ£-Ç·`¡°Ž•rµþ:íe›“œs^_z‰ùšæÓ±ökäÖü.,~Š4˜íIèÜK|ç´Ö¿ëp/È¡mÝ u[‚ ˆBÕ•-Åz% ¨ý´žíJB· €2ŸŒk?n´ëI¹Qº>*Þ ÖGú–‰ˆdá.e´,œ}T¾~‰]Nß,sNžˆúšØ¶+rîÒÛ†ÙÁYÅjZåVR…‡`Kª4œ£âgÎGà@#»«T©Þ]âOcn ´¥àô)K ~ªÎŒ)±)1# EŽØÂm!)è¼&Ü4ªbºeO‹G°uä§üN²jﯬûҴ몵Çg†Tƒž¸À<ÒîMìw6—|VmEQê1 >Yma© ‚{äwÁ#9>žÚ`í«ÚÑÞšðÒ[–…  $Œ8Ëïê?]mZrZ*¼µ3-…Œ’“ôöÐ3w¶cúº‡¯;%k¤Õ 9ÈñøC‰ˆØw¶‘®J',úC±ÈÙHË0•ÛÆ:©kŽ¥'‘Ó§Z¸kÂŒÕCâÌ¥3œˆêäýqŸç­õ&·k[ÕÖ­>DX²’ÙSPZî;öõõç“ÉÐ/kãv†.ØtJ{?²uÀ:]Yç8Js÷)WïžÉÓ6zE§N¡Vjµ+ú£!N9$¸ßáê §*íÉþ,8›T‡PU%Í*‡§níé)jÍ QÐGpÇ÷î«o72‰¹öI©>{ôi©“)¸Šêu KˆV;ŒÇ#Yº~úAFú\×»ŠŠ©UTå- º‚Ø$òGt_Q£.Ùì ш‰u6‘Y­¹…»*JzÂUëÒn}{[‡–ü´²ÓhíÒÒ/¼i²¥ÿuÐˇ$,rær5ï -WÅå ™4ß„§Év;‹P˜OBÚO¡O$©›¹M°/m²©Üì&ä%޶e³„9æ UŽç'ný µoHn5:”Â]P=2X@C‰>áC¿ç‘¥^»´¬í¦âÓ©·/ÄT-ÉŽþîã.yItöJWíÉàŽs¡ÁDi$2J>tŸi$^mQ^UŠʆÿÏQV·=»7ÃÕ±XuK}¦Ÿ+‚TBœBù%Cî1¢[Źo~*Ÿ0¹]\p„DèWRÆ2IÀ<ýtF¥Ú74û>ë_·Åßf#i€ÓÊJÖB3ž‚yvöárÛíµo~îz…f|x´jDˆÁª\d2$)#GGñ)\žu#¹ÇŽR—:&©ý‰»ÝPû°miNé¯Lg_…ovÓÄ”w™n“| Ó*I@R%¼ÞòHÈ*‡—Û¶®ü%ËUSÄïxP‚ãÛ­1ðä´’”<├~xB•î:¾ºî¶ÏP¶‚·oV™ý)AzZYO˜®P0FSÕÈäß_¡V®ßPlËj5*ݦ±M¥¶ K Æp Y$åDñÉÉ×¶¸Œ8L¨çô£¶ÎívK)²Ý@*F¼]NškK~úxv¹i„­ÌÚŽ—¥Êý½R‚ÎRâZŸ›«¹O9 “¬ ?ðil¹æ TifAJã–û¨z|Ø#óu Ë~,„ŸÝÝ=¸Æ>¤ð>ú¥ßkRT±fW\ŽÓŒCar”òÚê ¬¡ƒØž=´¦]µ‰GÁ­1ìîØ],ÈSÜÓ¸êºoDkzÿÛ {B¤’o›]“y|žÍcéƒÜ9Ò¼-ÿ µê®ÅQäÇÝ6ñb¢õY–XéHZPÒ”2¬4…}žÌì®ënýBþTZ·à©eÔdý‚®O @Θ½¹¬× ëRRºq‡$Çê'æ ÇRA'äÏkE—æIHP= NN9?®ŸÓ §T•’9Uj‹ÌØÍ:Ã.‡5 u¯íÉEf]§v‚Z¦2ˆí4ŽBJp‘ù% ~YÒÕ¸[/o_5¤TÑ\]©_hüs)ù]·XÈù€õ8尿Æ\Õòž• )*ÈÁ¶uDöÖ±xJqqR”¹ÝH) =ÏéùèÇZâöO:@Äœ(q9TÛaJ~‡aÑéò*"¬ôf‹jœ !óÔ~nruÚСi•Rˆ)1[X#”}5ÚÅWq‹ƒãó«ÌÖ/¾)Fé$¨ä•«_‰¤i¦1 qíÇåñ3™ó ö.$]ü@xk¬\w\+þÀ«7O®!ÙnHÂHȨƒŒŽAÛK¥˜Â%\ôÖ]l:Úä6 ÈPëiŦîCvû-·Q GÈJ‰<¥=¹Ï¶º›¾%Ë› WT}Ml{sŽ2C¬+…i:P&Ão=ú´&ç½![ÐÔ®…1•¸Fyá ñî­m¢x ±é1ýV©[®?ÝÕ¹ 2ƒï„¥9Îí©[âßo¬Ê¯‘J™"æ•ÝMR‘Ö†×ì\$$þYÖ.ŠMܽã®=›`±Hˆçá™RË®Ï «¡¾ÇóÖ}Hƒ³R åúø¾kpüMg77mð©~Ú• n³*m«p,´ä ‹êZé Î È8È#Gw—ã©+IRpAÁ Úû=sÜ·T§rkë­T!Ý¡ð[kœÀ p'ÔèÉ:c4èOH}Ä´Ë(+ZÔpÉ'P «Ì¾ø,~µ©vÛr¶[›¡À:€O!|3ÝK–ÂÊ~Ãܛޟ©-Ó¤‡Úm?ÙëRHûÑú ZSêÿéGÅmV®ñ/E¤ÄB#¥C„a Ç¿RÖ~úôðÏ Ý—5ÿu¼Ö!Ôdl-@à|ådûp 稛 #z7$2Ì¥´:{cÍPÿõ•LZÛ·.xþ•ElÚ—µ©m) $x š9Ý5ömkv¡U}%MDeN”Ž À$ÏA]¹Û]Ãñ Hzê•x½nS]qÄAµ •IIg#$’q­Çˆ—Ì}ž¸Tœd¶„óì\HÑ7Ã4fâlUš‚ž¤(wU®ßrtƒg"2ðRÝ©ÎõoSa¾ÌHΧ88Χ҂ar]6¦äV6Þñ”*3¡ ;hÿÅo@äòAJç¶Ö‡Ä ¢Í×¶u`¤&fS*Ç))É?ªr5Ÿ¹^þñ±U_H@OiÅûÿýÓD›ý+ΘOÈ­5Ü[L[†ÓQRí‘íçeÕÅ¢†NºcéCí »ê÷îÕÓãDy ɨL–éSh uNOrŸ×U~ íÔ·pzš²O¾Wl;¢áþ¾ã‰êcT]F8CjIÝևƒVÔÇ^ÚHu_n@ÿ-<ÞûAÞMU{°lÿˆ÷Цñx¯2Ø Ç' vpÉõ)ç§ž›5¦ ²€GÈ€2£•ŒvúéñPCÕ+7 SµÂ ù9ýtè –›*d‡Z'ñq¥û>x"}5o=y¿¬€y °’„Meh „ú}ýô5ßj³±öýeiBœE)ôåCž’Î}ù 5<'Ô>šx«š†ö2òwŒÛxHõ. sÏnF¤§Ù*T62âHç‘C ,%œ¡uG?W¬ÓÑXñmGuÏ)¶a­}Cè˪çõÖÛa˜1ö–ÜAÆL~®>ª'CTúµwÅ]F=³ý Ý-]&C¾RFZH?7üÃUõ³[’ÕãçZ«l°ÖÆÆAî@ÿÄÑÚ§=QkÔk–˜¶ßz—<1 ¤äôcæÏnJsŒú§F/>;JD¦TiÍmHìAÇå-¼—aØÕ8uÚ¼j¥j£1VˆÎõ¡ž”‘Ò ûý>ÚÙí}ÚÍá·¥’©‰°Ê²JšÎØœŸËSô¬{5”BxqÓʉÀžØ)À <{dŒ"­vÍn,æÑÖÚûVI žIÀμ-P¥G(ÏcÁ99¶©0 aG¹8ê=ÈǶ–º€â8‡:+˜ÁªJÕM5ŠÕFj@J_’ë€'8Y÷×j¾::|äãyÁýó®Ö¼~Ñ‘ŸãW™¬yvÜ$üjó4…ZRŒ†žúA*möÔFIùƶûßzI¿ê´ ‚Ù‰Q¨2 ø¶×8O²”~˜ºÂ[ýn ÿxkK³¯7sÒÇï1[)h,`„å Ãþ:êû^,KiÁσêktì}±»­Ù˜Îò'_´\Ûí›¶öþžÊ"Aiù©<×âÏ©Éì>ƒWûnZ ÿ[U¢ÁQì…¬uŸùG:º™Öýƒ[¨SFf±Jlã8÷?Éü´6ðDZ>êٲD‹’àC‹2"H¤¶É 8 …(”àäœwãY2ÜÊœqz Õ;Q´Ñö-¦âÂŽ2F{€¾&¦\*ìÊQSp\‘Wt®”“÷V?ÖB£?q|@.<(Òí+Uü—e¾…=>É$¼öÀã=Κ«_o­Ê ÉEÛ¥Sü°?hÄT!cÔž 3íÉÖŽ¶ÌKŠ#´öç°ä¶Š”ÃŒ> BÇ¡Áüõ-fÈÄ\/™÷ÕuÞ%Þî…0¥!\øGö~t²J¬/ií(öÕ6›"31HRÚ!N+‚¥¨Ž $ŸÓY? ï»S¹oڃáÇå%kIôQ[„陦?x6¥G–Ôj«m¬'ªSžçãÛKw†iÍÓîûú—P"=eU)l¯åQÂÖô'ùè»ÊŠ¡© QÛ¼B›ÚTùuø×x¡t5³õdŸãq”üàÿ–Œ;NÛÔ¨³Z€&@§êÒN€Þ-kQãíÒ)þz~*\”t2T œ’qíœižµã7'm¬—〖˜¤ÆŠ´ç%*CiIûäi>Ï!‚O}9ïaÐåÝ'<)üé\ Ÿñu{¾œ”´ÂPzŽNClŽ?<è»Ïü6Ú\ŽuþäàÈú¤,°#x¨Ü†¤ü’ ”Á(Ê1ýÞlü@T§í-Àµ¸” §«Ô©@`}{éŽä î@{ÅZ;¤³±Î/?º³ò¬õ¹HL‘*Mõ4óQ*KZ’8ÂÝu$z‘ïí©þcù;;GQOIZWßöŠçùjژ©ßü?]kÊX+£ºî·ÔIÿʤ‘ôÔ©B6~ÞWPòÖOЗÆ/ºGF;ÇÖ ›«)vìóƒ˜IÿØVoů6¥lÓk”ö òh²> ¤ áqô)Oåo¼?øˆ¢\²€ìÄ6·Â|¸Ž»ÒãK8²qžÄYT®Ú4 ì:Ém·>r¦X_ñÜ~~Þ¸:_ží{­nÍ„…QjgæKñxGW¹OoÓoµÝ4vOdÔÇlö)Wù ›`¬ )>ð<ñŽtÐÖT IòSO|ÈPí¼ZUÐ’¸Xóº][‘šé$¯Û ¯c¡M7Ä]ËhìõïfV§9"ì·ÜišMQG­Ï)Çz’{”ƒ”¨óómE´µ¦¶¶Å:ãeb 4q)9’HëEè¶â.ë²\ L¥5C¥5Õ*rÊ¥:Aõç:„ýERÓ_ÌGLi‰ÔƒÜcê!ôÐWo®k·f·;{W¬µ´….4‡GΗ0®Ÿ˜äòSÒRI‚4ZÛÊwÄD¸©s -L#<`§±ûŸ}XÌ-3Ú·Xòá E®Z™”0 pE Êl3|UaÉ@yÐÎ5jÔ䫌žÙÀ: íuyv©]¨¬F (aE< œ‘ÛŒú*%•y¬ámnq¥)s) ©ìõèy®Jº¡È/¹éãV»_, éíûW?ëV»Xšó­ÊGó«ÌÖ6»~Ðù•æi°ó¯C}ú¥4?¾5¨Ýªd­‘ßj]èã+4 Óa™+HÈC!*Iö8JV=ð}µÛ7~ü¡<×Ñ-¥cß a·QÇïz ÚF„üÚ{éê(éÊ’¡øV“è¡Üzë©{äi'´Òº£êkhYnZå·-³…$æ­™v%nœ•¡Mʉ%¼‚9JÒGój>£WWY±.iÖŒÅg)޵t}28úëhQwjZuTÛv§p[-eA‡XWZSÏdþ!ù>šÔCñgEŒ¿&µD©R$Œ!ÆÁÁõà–²)…:ÉcQZѽ¨Ù}«Š”\ð:žt®ÿ@7uÍòÝ»‹T¨G§á™u} ™Ç÷uE¸)VE«.à·jÓ©Õ:j>!/pUŽ{€?mhäø¹³Ùáˆõ K=’–’?ÅZ©\ÍÁñ@±A¶èNÐ-‡\ ™Uò£¤y8êÇöS’Or4ª8ºHyÃÜ U ®Ene»r8áZˆž¤­@pV8 ýAžš»2Ê…µ–­‰L*z о±5?ĵÝE_7ç¬çn^·è£Í£ÏVRAè'Üpx>¿MMÖÞ4XÏ}fuHp¨Âˆ)åáý)kÛO´šÅë/úË\™qÕYhª*Þ-n JбíœgÐèõ±uÕÆMBͨa…©ö:†?‰9'ß·®¾¢ÁF¬—Ù@mÔx÷ÿØÕ}rœ¶kH®Ào¢BT@àg¿¿s ¡-0(-ÉN+í '‹©ª=ëðá>ð»¼mÒ([-†×çäÉJA $¤“ŒÄuާø[ÜmŪÆÿI·<6èQ 0i‡©ocÓð¤'=²rFxeí[†=Ù­ @”ÐjRyJ½F5!ÉjNRî3¢þÌË‹ãR}¡N-]§ÆaP’é<Æt? ð‘@¦Nµ¥Ð†…Òká Tp<’•6Rü*ãÛSk[=»6]6Ò•ⵜZ—r âOñ!D`ûàtÝC’\ëé)Vã#×…Õ ÊÅòÃjrcC (öN2Gý¸×ÆmÐPàȯ­7I6·Ë‘Ü('¨¤¦¯±5ÉHª]וÊÔ ŒtŠdxäùh)9=dp:{I>±­¿•z!ÊMzˆõF¶Ðò£¼ÁâB» ã¿Ý9϶™k†:ž‡"ß‹VŽ?kÛ¹Àìuvå@[ð~7ú±QϘ†À Œò¦›žƒäÖžU$´×»KÎIiÜ•óëŸ~½iS§m z¥d^U{…@®×Â]i§òÊP°âz‡¡R€Ï ÓË•cÚk„)j~;˜Rϵï×ßL nu¶Œd ¥Á⎗A¯TiÐs¥9 å2âÙÁŒý3­*³uû^›=“Ô‰1à9Ïtè•KÏÃÕûuVX´ÅÏJ¬>—Ë͸ ¤%+Z‡ p²#ÛAmÑØuå7 ã©ö¾ïuƒojU¡…NiµVâ\Ry[‹OHöÇ·ë¡å^™¦ ä¼ê³ÊNRt¨¶PQLí8P‚‡Rhœ•¶µ¾¦I-)ç ö+V5Ú©³Ð¶í؈q]KGRIû)@kµ‰ï´dcøÕæk]°.1Ë^f’K>nªgÃ$|Ce9ëÓSH¾Ùe§²ªšp9ÒÓ´8ÿI–ÐÀ Ïd{´ý!ßYö÷‡».=ÈŸTªDa)=%G°'Û·}u3|#76äúšÙÖõ4_h9PëŸY¶©ê‘\©¬-@ÚׂxíôÕ= n*w ÛŠ¼[J÷tHNVîp>Ú—C¶å]Ñs_R¶ÿÚ7¼©Ç qßS·Vú™[ŠcDHƒ(òÛB:‘œ ÷Çž¨”7ÕTB—Û+ ÐV*·C‹$k–€ÄDÊ¥ÈN¡´ŽÙ9àvî4n·n—6Ã!LJOS­ŽÍ¹ÙI8íÎt¶ê¢ÌÛkª¯]fBéròÔPÉJÖë© Ô1Œä•>§¶‰['kÕìköjò#K…Vy3!|*”Kiq€ ¤§‘œÜè@p¨ðÐÒIhç¡Ò‹& ™mò'žSéúê¾E=šÌ)yŠ*`¶–ááËÚ7­Ñœ¡ÕOžKo#[¤Œ,dàýÿí©ôÊLç’ë­EvK))(oåäs“úþš"o Ýmk,;pÖäÄŽÚSÚJ'¨€òÀ* ÀÏ:¢ßÍÕjȯȳ­È)n=?-;%Âz”æy8ή€ž©W*âñ»„r¡ƒîK±ë«ÓBÜŒÒüpÌ‘œŒ|ø'E=à¦1W§:Žút'»kú/ÿשpjKzb¾&;ày­ŒŽy·ÕÕ[sU³ómúÒ|¶jÏ6Ì–•œ†T¿-K¿RN>ã8×Ã@¡+=šùô4s£¶„GXçð çõç~ßMHLW<ÀZ=*=‰çU×U[wtÊb m¥gÑd~šÒÀu³Ù Œr>¸ÿßÛKÒò3I‡q«ýº]Ûv±&®ÚÞ´!@(zw#¸ôÒåtϨî]ÔâjJL:S.žˆ,Œ{|žú5<•Òê ¸…±)ieæÒqÖ þŸÏßP®}¬CñoQšPKéTü³•Š0HôÆõÇçÛMªO´¥D•G-ƒËëA½Ý¸'(Óé4Ô.31ú[m ! ôîÏY­ã²»ZIHf|B“ü*#_py¹HÔëþ¶ì+ÞS/°¦RÌ‚…r’ cÔŒúúu­m¦¥Em©Tw寣ÛA¥ ­9M’¨î$÷RÉ´»¢v’C¶-ê¿„LUfà šqµA Â{ƒéÈ8ÆŒõMÑ´©”ÅÍ‘]ƒðý=@¡ä¨¨}N¢[t 5~ñ™¶·å"tԔ봩@¨iBN„©$üÇðG®xùoÁþÚÛ·†¤Á›Sm§R„´ô¥ùyÆ{;ðIÔQë r]ãB±š¼-{Í—k„"8ØX '»ßßŠÌø7‹&¹¸7õÝ•A¶êº²—J^YYVGü#¿±_ÓF+ž•2Ý«)÷c%ø½cælœ‘Ï?®5·¢ÐàЩq`Óâ·N§°€–Xe!@äœþº°’ß”„|CBTu‚…žÇŸòΤ¿f,6ÐU?&à©O­÷BŽHô¡L߇¼ ¸Š]k৤Ý%>£?úèX¶/ËvyK”¸ØÈ}—BÁôÆwfÑÓÒÓÑl¾:‚šWIO'ÛõÔ'hu;n”ì–§)l² ]YQõí q©³ƒ­È€µÚ2¯dÕ•Šü‰6¥=ÙMùRTŒºì«'#õ×kÚÑžgÛñ¤«’éZ‰Çûç]¬ewiÅ\$“øÕæk]Ysíïàį3_ÿÙpygame-1.9.1release/docs/tut/surfarray/allblack.jpg0000644000175000017500000000057407670466467022330 0ustar vincentvincentÿØÿàJFIFÿÛC     ÿÛC   ÿÀ€€"ÿÄ ÿÄÿÄÿÄÿÚ ?•@?ÿÙpygame-1.9.1release/docs/tut/intro/intro.html0000644000175000017500000004124607703420735021201 0ustar vincentvincent Pygame Intro

    Python Pygame Introduction


    by Pete Shinners

    pete@shinners.org



    This article is an introduction to the Pygame library for Python programmers. The original version appeared in the Py Zine, volume 1 issue 3. This version contains minor revisions, to create an all around better article. Pygame is a Python extension library that wraps the SDL library and it's helpers.


    HISTORY

    Pygame started in the summer of 2000. Being a C programmer of many years, I discovered both Python and SDL at about the same time. You are already familiar with Python, which was at version 1.5.2. You may need an introduction to SDL, which is the Simple Directmedia Library.  Created by Sam Lantinga, SDL is a cross-platform C library for controlling multimedia, comparable to DirectX. It has been used for hundreds commercial and open source games. I was impressed at how clean and straightforward both projects were and it wasn't long before I realized mixing Python and SDL was an interesting proposal.

    I discovered a small project already underway with exactly the same idea, PySDL. Created by Mark Baker, PySDL was a straightforward implementation of SDL as a Python extension. The interface was cleaner than a generic SWIG wrapping, but I felt it forced a "C style" of code. The sudden death of PySDL prompted me to take on a new project of my own.

    I wanted to put together a project that really took advantage of Python. My goal was to make it easy to do the simple things, and straightforward to do the difficult things. Pygame was started in October, 2000. Six months later Pygame version 1.0 was released.


    TASTE

    I find the best way to understand a new library is to jump straight into an example. In the early days of Pygame, I created a bouncing ball animation with 7 lines of code. Let's take a look at a friendlier version of that same thing. This should be simple enough to follow along, and a complete breakdown follows.

     1    import sys, pygame
     2    pygame.init()
     3
     4    size = width, height = 320, 240
     5    speed = [2, 2]
     6    black = 0, 0, 0
     7
     8    screen = pygame.display.set_mode(size)
     9
    10    ball = pygame.image.load("ball.bmp")
    11    ballrect = ball.get_rect()
    12
    13    while 1:
    14        for event in pygame.event.get():
    15            if event.type == pygame.QUIT: sys.exit()
    16
    17        ballrect = ballrect.move(speed)
    18        if ballrect.left < 0 or ballrect.right > width:
    19            speed[0] = -speed[0]
    20        if ballrect.top < 0 or ballrect.bottom > height:
    21            speed[1] = -speed[1]
    22
    23        screen.fill(black)
    24        screen.blit(ball, ballrect)
    25        pygame.display.flip()

    This is as simple as you can get for a bouncing animation. First we see importing and initializing Pygame is nothing noteworthy. The "import pygame" imports the package with all the available Pygame modules. The call to "pygame.init()" initializes each of these modules.

    On line 8 we create a graphical window with the call to "pygame.display.set_mode()". Pygame and SDL make this easy by defaulting to the best graphics modes for the graphics hardware. You can override the mode and SDL will compensate for anything the hardware cannot do. Pygame represents images as Surface objects. The "display.set_mode()" function creates a new Surface object that represents the actual displayed graphics. Any drawing you do to this Surface will become visible on the monitor.

    At line 10 we load our ball image. Pygame supports a variety of image formats through the SDL_image library, including JPG, PNG, TGA, and GIF. The "pygame.image.load()" function returns us a Surface with the ball data. The Surface will keep any colorkey or alpha transparency from the file. After loading the ball image we create a variable named ballrect. Pygame comes with a convenient utility object type named Rect, which represents a rectangular area. Later, in the animation part of the code, we will see what the Rect objects can do.

    At this point, line 13, our program is initialized and ready to run. Inside an infinite loop we check for user input, move the ball, and then draw the ball. If you are familiar with GUI programming, you have had experience with events and event loops. In Pygame this is no different, we check if a QUIT event has happened. If so we simply exit the program, Pygame will ensure everything is cleanly shutdown.

    It is time to update our position for the ball. Lines 17 to 21 move the ballrect variable by the current speed. If the ball has moved outside the screen, we reverse the speed in that direction. Not exactly Newtonian physics, but it is all we need.

    On line 23 we erase the the screen by filling it with a black RGB color. If you have never worked with animations this may seem strange. You may be asking "Why do we need to erase anything, why don't we just move the ball on the screen?" That is not quite the way computer animation works. Animation is nothing more than a series of single images, when displayed in sequence does a very good job of fooling the human eye into seeing motion. The screen is just a single image that the user sees. If we did not take the time to erase the ball from the screen, we would actually see a "trail" of the ball as we continuously draw the ball in its new positions.

    On line 24 we draw the ball image onto the screen. Drawing of images is handled by the "Surface.blit()" method. A blit basically means copying pixel colors from one image to another. We pass the blit method a source Surface to copy from, and a position to place the source onto the destination.

    The last thing we need to do is actually update the visible display. Pygame manages the display with a double buffer. When we are finished drawing we call the "pygame.display.flip()" method. This makes everything we have drawn on the screen Surface become visible. This buffering makes sure we only see completely drawn frames on the screen. Without it, the user would see the half completed parts of the screen as they are being created.

    That concludes this short introduction to Pygame. Pygame also has modules to do things like input handling for the keyboard, mouse, and joystick. It can mix audio and decode streaming music. With the Surfaces you can draw simple shapes, rotate, scale, the picture.  Even manipulate the pixels of an image in realtime as Numeric Python arrays. There is MPEG video playback, and audio CD support. Pygame also has the ability to act as a cross platform display layer for PyOpenGL. Most of the Pygame modules are written in C, few are actually done in Python.

    The Pygame website has full reference documentation for every Pygame function and tutorials for all ranges of users. The Pygame source comes with many examples of things like monkey punching and UFO shooting.


    PYTHON AND GAMING

    "Is Python suitable for gaming?" The answer is, "It depends on the game."

    Python is actually quite capable at running games. It will likely even surprise you how much is possible in under 30 milliseconds. Still, it is not hard to reach the ceiling once your game begins to get more complex. Any game running in realtime will be making full use of the computer.

    Over the past several years there has been an interesting trend in game development, the move towards higher level languages. Usually a game is split into two major parts. The game engine, which must be as fast as possible, and the game logic, which makes the engine actually do something. It wasn't long ago when the engine of game was written in assembly, with portions written in C. Nowadays, C has moved to the game engine, while often the game itself is written in higher level scripting languages. Games like Quake3 and Unreal run these scripts as portable bytecode.

    In early 2001, developer Rebel Act Studios finished their game, Severance: Blade of Darkness. Using their own custom 3D engine, the rest of the game is written with Python. The game is a bloody action 3rd person perspective fighter. You control medieval warriors into intricate decapitating combination attacks while exploring dungeons and castles. You can download third party addons for this game, and find they are nothing more than Python source files.

    More recently, Python has been used a variety of games like Freedom Force, and Humungous' Backyard Sports Series.

    Pygame and SDL serve as an excellent C engine for 2D games. Games will still find the largest part of their runtime is spent inside SDL handling the graphics. SDL can take advantage of graphics hardware acceleration. Enabling this can change a game from running around 40 frames per second to over 200 frames per second. When you see your Python game running at 200 frames per second, you realize that Python and games can work together.

    It is impressive how well both Python and SDL work on multiple platforms. For example, in May of 2001 I released my own full Pygame project, SolarWolf, an arcade style action game. One thing that has surprised me is that one year later there has been no need for any patches, bug fixes, or updates. The game was developed entirely on windows, but runs on Linux, Mac OSX, and many Unixes without any extra work on my end.

    Still, there are very clear limitations. The best way to manage hardware accelerated graphics is not always the way to get fastest results from software rendering. Hardware support is not available on all platforms. When a game gets more complex, it often must commit to one or the other. SDL has some other design limitations, things like full screen scrolling graphics can quickly bring your game down to unplayable speeds. While SDL is not suitable all types of games, remember companies like Loki have used SDL to run a wide variety of retail quality titles.

    Pygame is faily low level when it comes to writing games. You'll quickly find yourself needing to wrap common functions into your own game environment. The great thing abuot this is there is nothing inside pygame to get in your way. Your program is in full control of everything. The side effect of that is you will find yourself borrowing a lot of code to get a more advanced framework put together. You'll need a better understanding of what you are doing.


    CLOSING

    Developing games is very rewarding, there is something exciting about being able to see and interact with the code you've written. Pygame currently has almost 30 other projects using it. Several of them are ready to play now. You may be surprised to visit the Pygame website, and see what other users have been able to do with Python.

    One thing that has caught my attention is the amount of people coming to Python for the first time to try game development. I can see why games are a draw for new programmers, but it can be difficult since creating games requires a firmer understanding of the language. I've tried to support this group of users by writing many examples and Pygame tutorials for people new to these concepts.

    In the end, my advice is to keep it simple. I cannot stress this enough. If you are planning to create your first game, there is a  lot to learn. Even a simpler game will challenge your designs, and complex games don't necessarily mean fun games. When you understand Python, you can use Pygame to create a simple game in only one or two weeks. From there you'll need a surprising amount of time needed to add the polish to make that into a full presentable game.




    Pygame Modules Overview

    cdrom
    cursors
    display
    draw
    event
    font
    image
    joystick
    key
    mouse
    movie
    sndarray
    surfarray
    time
    transform
    manage cdrom devices and audio playback
    load cursor images, includes standard cursors
    control the display window or screen
    draw simple shapes onto a Surface
    manage events and the event queue
    create and render Truetype fonts
    save and load images
    manage joystick devices
    manage the keyboard
    manage the mouse
    playback of mpeg movies
    manipulate sounds with Numeric
    manipulate images with Numeric
    control timing
    scale, rotate, and flip images





    pygame-1.9.1release/docs/tut/intro/freedom.jpg0000644000175000017500000001561210770022306021267 0ustar vincentvincentÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ–È"ÿÄÿÄ9!1AQa"q2‘¡±Ñ#RbÁBáð$r3ÒñÿÄÿÄ-!1A"Q‘±2aqÁð$ÑáÿÚ ?Íÿ¤LºuÞ0+Ÿ2vqÛëþMdÈ;†íÞ½ÅÄXl+`äeúâ±™[mJQ ¼—sÛŸ­B*•`¯Øvž*m>þîÉM½¼Œ®ä(+Ô1Ç»>‚€¸½Êe\“íšêÄŽ•vÈ8éœtýªì~Ås]–vÖ^&[kµ[µœ³s’3“ïž+C}¡ZY!KkTRÜ&¨$ò­|Mey É,r©d-É ëÿ{š×ßL·Vaê3RŠ¥¹íìb4éu#l) ð® ,xqZ›»uK}®¤¹ÚF:Ž3U¯öH¼7s8¶n¡¹Á¸PÆA•%]¡r=øpj MF`È$i$Ï$œîãõÍG&5k²PÙZ) 0qš"+iãT¸x$Xœ’²¬GPCŒŠ7C‚ õ¨’âO.=ÄîÆyÆGoZØ4ÚoŸæbØÈCäª1'pÀÛø~õ›&hb^«ý•ñ_ìž™ÉúhóMR<“Žr:sõªR£í;³þî•­×ìÕïn­ôÔ’â(§*ŒªN@ÿôUu†/¯'ɅמK  }Oø«„A§Í+3²pª3šî/jKºKycP 9^ï=+e§øZÒÍCËüén‹ÿ5©Ô´ è4ûÔkóƒŠ#Y#9+ƒÎsŒãiÏû+ï”ì01ÇAQ3HË™$y äìN(Õ´ÔP«p Ÿ ý¨È¥Kˆ–XŸr7 㮽BªØÕ6“’Ý¢‰$-ÝWÆj:êWiÜ4I^˜|ê'm¢¡KO¯“W›,Ëþ:¨ý3‰¥†Óôæ±<£ùײºÆ9?Ž?:J±:®¡ñüx¾)¯ ­ZÆ’êðÙÓhëð“ùt•Xd {x¤–9xó°Ÿöç­buÙüýVsBƒßóšÛÊÅ"vU,ʤ…Ï¥yåÜSÃ!Æè矌c>õ82÷g7rŸî¥\Îs4‡ûëJ™Y躅”Úu©f¾ž%Ü|½¬ÎÓ ük3­Ý\ÝÇÍ"1F*\!³ëøUêxŽ}7Ã×Э¬Ez‹¬é–B:09㯿4ÒÚ¶£ ÙÎñ7 ä«°ÉÚxî0GÒ±x’ÈÛÖ¿OïEù]ôc’ ù#ןҦ†C¸U:ií¦´ÄÙ gÖ”6ä° pONs[좋åƒíÖËne ÆÀ£/¯$qóÏåR¾¿ª´/’Tã”,DÙ•‘®î ù÷«-OJ±¿Xu‰”+í8Å[v­Õ:e·ðê8¼O¨êÚ[:ijZï„°´Ê~Ïlæ*§VÒnt­AÖñR)]ˆò‘GÂÇ8àsÛã0é3E¡jPÜÚ1…£nH=«Þ5O Øxëöšà‹7ÞJ³©ãœZ“ß1-§g…ZØËskq4l¼ôΊö÷feÔ<¹!w%ž5uGÏ,»³³Ÿz Öï-•ìÃDI.íªéÓóJ0Wz¶&ŸM}ÿG¸>n¡;ˆe¶BFö`3´gQâ_j“M{¢Ap«§G)ˆ”U 2¡ÂÀ8Åc4øäi Æð¡ÈÆ1øÕäçÞ›MK–ž#H‚ÅvÈ­ÊÌVêm#@×¼<ÖóCe™tne qÎ2y9ôª-Â:ψ&lìßÊvÎà„_rjo¨Ïì‹vÝ©»Ó»€1аñN˜4 ti ¤óÚ¸Yîc'i.¹ ϦáUäàRž9BµvJj*«ØL@ ¦gšE‚ ZG;TZ’y‚©«Ÿ i¤çRœrr±éÜÔJÁu;“áûKm:ÖR'8–gÎ3ÏùÇà*óÃÓIu§½Ô¸Ì²1w×5‡Ö§}C^¸1ü[¤ò£ç®>ùóõ¯@´{[ +{U•?–8=N:ÒO’Ù¤¢—aÜw¯?Õïšþí¥ £jãÓ&¶·7Q›iDn<„/|{WžÜƒ4oÃÓ58QTнM:ƹ§;÷HGešU®ð6Ÿö]6}FA¶[–ò¢'²Ž§ñý)SdRÕ4é¬ô`UXI›™‡"E÷ùQWjÉ5€¸Tòcš2ʱɼ#ãá=:ÄÖ‚{8ç‰ãu#ÔÌèöH’ÝéW­%»BF CÿAúÕ{"{ñ`š¬ w en#†::ðJªHT.ÖÀçë[Ñ›ì†Ò'+ }ø#;O|Q6z%µ¡Ü¨ ž®ÜµNÈÑš‡E¹¼hŒÃÇÇ'ÞúÞ¡f¿ÓZïO’Öiâ?q£ŒOb>˜­è@ƒ…ÉôK¨__FGnЯ?Á-õ§Ép'Ìî“d’J÷:¼/j>[!œúã®zwüxúv¥ƒÆÀá1Ô€8´±¹½º1(z»}ß~½jê k-ÌÒ.å9 Þ¿Úµ(α8Z¤iˆ?ÃÝBã^mRÊåÚÂuÞY—w•žÃ?•`-/§Ñïn!ž7˜¢íÊàn õõõùf½«ÁÞ2·ñmŒº4û¢ÝHä-ñ7í^_ã êSy æ–-Ù$ œñéŒu­ß/„Ó~ÕÛ÷ÜŽ+N•$ù¾¾_ôÏj:„ú­Áw2,DäFÌ>§sB¼-ä:¦ÐHÁÜ¡†^µ2°cò§q•+œdb¹iVÅÝÙ‚âÎ!´ àç?÷4G¿zæ4D¨ k®õ'»±’3‚GÈÑßëZ µŠÙoî³²5€¹çЧ­/$Úàv —7Wr»Í<“+\3–w-œ(äü±ô©%| XHWj £“õ §±Ú¼±8Tå''¸‚tû7Õµ€dD¿è+azÉ ¨DQFÀŠ ãÓŠÓH›OѼ¸VêOŠB}}>”¤ð­ÐŠä0¶9ägñ¨0OÑ"Ç:[˜Ù *Äœg·®L@ ·QDsÆð˜?•A-Ä+2Æ’Ol⹚âEpz'û‹61Hmß!«<»!›çiâª57¶ºc‘ù¸ . ûƒŠâîò)~)nU6ŒuËëí@ä‹‹s$ìz0ùS—÷ðÅi p[L‰ lD~&•W¤7RGæ¯M§þ3J‹±ª p>þÓWAð£ysÝOýý+AAj°Ã>•uÀÌMÎ:ûcß4ªÉ†C)AédšÃiµÄKiò¨§ Nqdz³„ÛÚÇœ²Ž~"yúóRj„“ŠcŒôïšÿT¶Ó×ù¯™â5åíYKýRóR%XùPv_™ïHeΡâ(m³ š ¤oÇÀ¿½g¥’{É¼ë‰ ïÛåéD[HÐŒVõ`‡NœbD17¨â€@ÔeÒu§‰Š•`x¯s¼µ´ñç…|øÂ›¥^qÔœt¯m ‘¾Úu‘}ÿzØøÄ7: °Ü«ˆ…oOƯÅ;ô÷ÑNHÖæ'UÓ¦ÓonÓŒPƒŸ­{ñÂÑjVcV²Pw ¾ÞþõâsÀÐLQÈ㚎HW©pJ½™F3KØÓŽ>~☠c5Q1ÁïÚ¸fÀü©ÉÇ^(yd ¦”VžÓ ÍÉÔ&ËŒâ0{·¯Ò©ím¤Ô¯ÒÖ/÷OôŽæ¶Ö÷6ös !ˆ!Ns뚯.UŠ6ÉB:I™~.•Ou¡©6>à Ò2[­¿Úv<‘ÿ·p*G×ÀžÉ É ‘Ä<· @ì9ö¬¸¼ìy'§Ôº~<£3×v€Mæ•t#‘ƒšE3eÝ(ã(è}ÆjÝg¶¾ ªÄÁG?-Œ´cp9Î?Åm³= º:eÏR8ùБÈñ¶QÊŸPqV6zíÕ´ªÍ‡QëÁª£ƒÚŸ}:c4'NÀú Á+±×4ѧÎKŒaà Êxïø~ÖÒ›Ë&9ÚÜíšÀh¤šuìR# öâ¾±¹‡ÅžÆüM·œuµ¦¤µtù(i§GÍ×w6ìÂX˜ÔãŠñ[ÛÞh÷ÒG¯™àéóΖðdÉ![Ë+ÓìÒÝ9#–?ÔÝÍKáÿ =¥¬ú”èw;átäýp,\ätíTO £Étf¥À0*ƒÅ÷gК5?î¨ôêOδl¤vâ²ÚÒ¨x›N²ÆRæ¸ùžŸ‚ÕbÂçJµû“knx)Ýó<ŸÌšîà±BU±ô¡õ9%r€•îW¨ªøVN.?ºÜC4’“œ~Ï¥™÷8ãŸZ¦7 è’Å è.)+­ÅEl;cœG,dÆz0íJ´³øqŠà¤¿Òz|©SÔƒK(Çz|`zRàgž)›ê=Å09¦pü)ž@ëHc’G>ÇšM’§“Ÿ.8ïMÓâàæ¡9뜚pNÑÆsßÒˆ¶¹–Ø&R=A€€ žôÙ+ÐsÓƒ@ËË}f68v7õ/J*[[[ÈÃaO÷)æ³$©榆iblÆåO±íH,:}XÎè›ÌtïAylH=ø«;}gléï_Ú­¢‚-Da#ó¾Cš”Sn„Éü#~ö·Ñ|{$V_·×÷¯‹–J'Œ|kñ)äWŠèþ½KˆåXàHäO2§ùÍz}lj4 hñ¾¡wa@8œÊ~˜Ç^z Û•Ü"»Fm5'|1¨K­Yê·Zê‘Ao¸Ý$p?Åi®lÌ~µ¾‚A{q=¢J»HøØ¨<úyïRë’躆 ui4Û<œ¹h¼ÂÀåÿ>žÕ…¾µ®8m>Õ!€r'¸=~CüZj76eŽG©¬HÁê7úÔ w³6ó—z6àϼàÐ~ó.u;›»§}¡pØÓ§È~uèþ"ð}å–Š.¯%KˆÔùríHS’9ê?^+Îôà·šé¹*UãL6ÎU˜¹Ï¿ZÁž1TÓ7b”žÒF8à ŠìP¢¯¸"‹ÁÏzE±Yˈ¢‹gjW)¾"0ý˜”WB€+ÏŽ2’W¶j¾æÈJ®S¯R¸­ (a‚*…vô¢€ÆI-õ´€}¦u@s÷³J´W6c´(Ï­*6æxõàS€#ñäÔ uÜù“*öU&ºiâI$º6ŒeéRÔ{S¦Cq'ý«¥lÀœÐƒS³/´N¥m§ö¢ ·ÑyÈUÕPs´s¸Œv5(Á·De%cãâúRè@Œgé@ßÚmfŠy}Îôöù×k¨À-ãi$ àvœg¿lQ8ét875ižN?Ô°s‘÷»ñQC4R€Ë.åÎ3Œ~U0õÿUC`7aÈÏJXžq֜䃀)`œZ%+œö‰†vŒ«FÅ[Øâ…c“ŒšpGr0rOjiƒ5ºv¸2›ÀÒÎØÎ ùš?ĶjÖ£Ä:~Hö™ÏÂåyÆæ¬¾•ÚnÓ1® s×ÚˆÔ§©=ÚX^o4˜h˜ýÒ=½0ùVìRÕ ™âÕ4èµÓá¾.ÐXí’ÖÒUxäðËÃLä ö¯É á%ŽxdŠXƒ§•Œ7bx¯å]^Æbb”Me:'•$gáÀQð{Ï­m¤ñ–Ÿ£Ë^g—4 €[Cñ³0~3…88ïRu$—bŠqoØô¯éQßMoÆ~Ã#mŸ“€é^o¯èz^‹ªLšK …ãvà¸À5èºgŠ`ñ=¢[ g·–o½Jßô¡üQá: )®ceNäýê®q¸¨K‘Â~½KƒËúÒ ¢×@¦Ï5ˆØsÈç&Ÿ8§8Å6r(ªDqMúÒäuæ€"xwƒZU-*@y¤Ð\\]\,W#³g¨ÆqîqMe¥ùÚfµq4¤5¤qeJ œ±{VÛI‚îÛÃW7pÂ’Ç4Å…/Åžr#·zçH›Mðö­u7æÖ·9ÁÇ|a—œV¸äSZx_À¥’’fN{‹?()Ò-Cª€»£u,sñc5}p¶ÖözJü6‘McnÒ¼k‚2Ì qÔ€{Ô—–·WÓE0I½—/®ÕÀçœ ¤qœæ»ÔþÕi&’Ñ»Fñiñ‡PTÁ‰ʰ8"³ø²ôJOsO˜£’J1¨’é>UÏæÞyf¶VU_=¾J“ƒM¿Ÿ½VépX-ŒSê:D÷±K,ÑþgÂ9 r8çÖ´ñ¡ ÚK3} y›Ü»Í€2ÜúÐÖ^*‡HÑN˜½¼Î\¤Ê›øÜsŽëœ ü…^òFxÿ ½ÿÌø±¼r­{v´²‚}.]JŒ-öÿ-" ªÉëëõëšë’w}jÁ­®¬ü;*ÜÃä»j ÁIÇ”FN:ƒÇQUýÀŽõ^T•W±Û¶ÆPF~!¸sÍ>ã÷sÏ­,®z |“œ~UPÄ Î }§~‰çëIW8…YéVbIDÏ÷cž£ØWe¦KIí„Ø†ád@‹ÈS‘Ú•*ÎÑ7’n:[Ø‹ËXäEò?*-¦šAK!uŽ! d…ã§Î•*KeH'’süNÈXÙÀÀõ¡´.ÃthÄ’rÑ!ç9î)R¡«g(;‹ Àó sJZ ”¦ÞÛ·¨•ÁðOZT©ÙÛvÅœüéÇ$f•*íW{ªúœ ÔÛB°B± ÀQøšT© ú¼åî8^~uká v‹áM^Ô^iw®Rïqÿ®yr *Uí qŸ&úV¿&»%µ4\ß çWÛ¥jȶãîÅuâŸ&R3õa¡ÿí<9!ÖuK¦¿¸µS""G±ÔyoBM*Uäçö—•“„§³Û¯¯&ņ V‘æšÖ·/‰µ‰õyAE†<çËŒgçÉ'çUo® *Uí±B0‚ŒU$`m·lkkÛ›CÛLÉžÙàüÅiô¯‹Ù/õ§Cô¥J¬bF—±äW;Hû§èzR¥HbÄ…†0W­9¥J€jT©PÿÙpygame-1.9.1release/docs/tut/intro/blade.jpg0000644000175000017500000000510710770022306020713 0ustar vincentvincentÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ–È"ÿÄÿÄ: !1AQa"2q¡±Áá#BR‘Ñ$4br‚âðñÿÄÿÄ+1!q23A"±Ñð#BQ‘ñÿÚ ?ù¾£S’Q¡¹¿Þëò'Md«ö8Ýz¿Ìy0)dQk{»«¤¾føô7_²‡Ï#þ†xïîÝrV‘¬O»HäÔªRÓáåþoùŒy2®~^(¿wù‘ú¢Yùxâ¿×"%ÁrF-Æ¥/Míø9'ï.õõØcÄã¬þRæCõŒÓ©é?“þ¡žzÑŒu:8ÉEnO"?÷3‰¦ÓÊÿÂãŒ`êNskšúŽo•)MÃÉÁj¹FR\ª•òæn"ó:™—›ž:yˆ‰÷ÿŽ3ˬŒw=^ŽK¥,Ðþ§|ë~"¡Â€@0 H¤‚†H  (:XaNK•¾ÇcƒL¡æ®^ž†¸tñ¯¬û³Vs­5Û­òoÄ!¡К:9¢PRTïäÄ¢£tº»eˆšŽ×sÒh™EJ­'NÕ—B ‰€T€è@0èCHt:¡ÐCHbH¤ŠŠ†ÀШ¶„ÑDPš*…DB¢Ú@‡4ö:tÌ\åô­úQ‹Z+Ûu¤Û¦¢¢0äy ÛTÓ£CQçË3 ;V¹€DÐQT ¢¨( ¡Ðèt¡ÐètP’) Ht (¤Š@Z@4KF”&‚3h–Z% ¬èT[B "Ž6Hùv’ø_;9m Å5MZ1zò†é~2á¦ñ-É]®ho"ÍXâšo›íHz¨(ãUvÝ$»˜cÅ%+m§ìúwjø—mVÿЏAB* ²*ˆÃ¤Ý>}[6£µgpãhÔ¢‚‹¡Q¦SAEPè ¡Ðèt¡Ðèi*Ò(I !¤RA *€ hThÑ-D´iBh+&…F ¢ èTiBh =ÓÝ%ÉrHª4¡Q4»EB¢ˆ ¢ètPèªTšŒ\¤é#ŒõQÍ// º5ºK·²÷û‰3±.EãŠE$VI!ÑT4Š&‡E$4‚@Z@Ñ«ˆ¨©¶MÑ­ ÄdÑ4lâK‰• v‹hШ҃híª1r“I%m¾Æ”tÞ%Ô¬<7ÈR©ç{Uz.¿‚ù™´ñ·JÍ­áåñ2Z‰,:o3ä¤åMûö Ô`†lná5iŸ=Ç5¸>níÇÃ*_ª~+µ’_.‡Ÿ[ZÚ—§>*Ö±5v»GEQžLšÜ²ÁíÁYs.ïøcø¾Ç¦|<±qóá|CPñÇ,¼¨:œ£É/eêýû­>ƒ›,²c6©/á^Ç+bÇxâ£òI´‘XîVo:ÔtŠE퉦Ò/hè"RE$R‰DÐ@mDâkB¢£m6¡mØÐ¨ÙÄ—.ØíÓWÚ[EF»EAvâjõ8tX%›<¶Ár÷oÑŒë²ñJœ £*„Weïîvœ6MOpRýž¶+ß»<þ]V ¢¤åÙ¤xsd›OéôpaŠ×”öÏd´ù%Ìï|;Ä¡¢É“{Ž”Ô»AûýçÖxóåM÷£°Á—Lâ£sî¥Üå[M'pïjE㌽¤å-tž,qÓ®SËÎ^щÌdž±Ç8¨Â*’]Ž¿ÃÙ㛆,i¦ð½œ½;ßc·£èSÌr|¬›­¸ÿ†{Ci¦Ñí6ÆÙíF›F¢lè{M6iM¡D¥¨ª h¢mÓm¢ÚTÛ¢Úm´[B±¡Q³‰. dâ-¦»Ci[I’Û'Ñ+6ÚyŸO[¦Ç§Ë§Ï“7 ‘‹®}WóæfóÆ6Ý+ÊÜ] †§ˆqhã͸ÎNr’åË«:>%§ý‹ê°SŠŽY(¯kåöQè¼/šø¼ÑXá)Jßj¯Äàx¯S£Õño;N¨ÖIßÓôi}G‡ô÷=íõ9OÅãiÐÆ÷U›b–7‘ùŠRåQKÔãÇ*SéÈåcÏŠ2Pò¹¿Þ¾ç7W·ðt+I©­;Å ê›w¹×þ—iÂàZ9éxN(䃆I\åÕ_¯ÊŽËiôqVb‘ù­É3 öi¦ÐÚmÉžÑѦÐÚSlèti´j BˆÔMF¢hÚ›@ 6’œe'$å©>†Î.uì|×7 â™uy¤ñê2ê-)Æã¶¾®NýLÞÜf!Ó8¼LÌôú.Ò!(dŽèJ2]-;>süQ©O&=Te¶”n}}OKàý>³,ÐÌäðCጥ®Vï¯Zõ1&m¦í†+I·/çûz-¢Úm´[NÏ>ØíÓm¡°c´ë8ö,àšŸ=7uRýß¶ŽÚn¡)ÎJ0жßDŽ–Éâ ŠrŒñp¸»Œ_)j«ôß÷býiÓ|§¨x éá«âóÙÍbpnj)Ô’iÓ}‘Òë²KY¬ÍŸ´æÚK¢]—ÉR>­Å!¥àü]›x\ ×Á¹>KígÊåQ‚IµáWÒÉ3xéŽ,QOÔÞx£%Tqã:g'̸ô8=©p RÖðM6[nQŽÉ_[\ŽËiã¼ ¯‚ó´Rtæ÷ÇŸzçö}ǶÚ}<6çH—ÇÏN&í ¦»CiÕÇl¶i¦ÑíÙí’VÝ/s]§™ñ>‹gÅ·YKK)+†Ô—³î׺3yšÆâÇX½µ3§£Ú ’‹jßEê|Ùð>-–£-6®<þ–ù´—~G#OÁ8¶'‚Ze¨Å>u'¹ÅzÛ—OÈÄä˜ê?_ÙÚ0Dÿwéû¾‡@N—xiáNHäÌ—Å(Çj :¼²åP¨Òд((Ú-¨Š¸çÔâËQÑi2ìx»äšîý½ŽñA$’I%É$bmÓ/‰ÓÇÿhYe…ép¦ÒÉšÝw¥ùŸ<•¸õ<§êKézO¥ûÂ<â9VzxðãÜãüMò_Ë©Ñdø?Zåêbb8DûºRfrZ=·…òJ"и¶”²$þ§Ëñ>¹´õzO–^/]óÁí  ­â:6Ž€(t ÿÙpygame-1.9.1release/docs/tut/intro/ball.gif0000644000175000017500000001162710770022306020547 0ustar vincentvincentGIF89aooç÷„c÷sZÿÿÿ÷½¥çsZÿïï÷œ„ÞcRçkZç{cïŒsÞsZÿ¥ŒÆZJï½­ÎcRÿ÷ïÖÎÎçççÆcJï„kÆsc÷”{÷µœ÷Ƶ÷ÖÎÿçÞçï÷ç”{ÖÆ½Æç÷ÞœŒ­ÞïçÞÞsÆçç½µ„Îç)µç­Þ9µÞ΄sµcRÖÖÖÞççÞçÞ¥ÎÞ­œ­ÞsÆÞµRBœÖçÎçï¥ÎÖµ¥ÎÞçR­ÎÎÖÖÆÆÆœÆ{½Ö”ÎÞ9µç½„{J½çJ½Þ)œ½Æ½µ½”Œ½ÎÖÆµ­µ­¥Î­œ¥¥¥B¥ÎÆÆ½½½½”Î眵µ9”µÎ”Œ½µ­!œÆZ½Þµ½Æ­ÎÖ”½ÆZ½çkµÎç½”ŒÆÖ÷Ö­ÿÆkÿµBÿ­JÿµRÿÎŒ÷Æ{ï¥R÷­Rïµkï¥JïµslçœJÖµ”Þ”JƽœÎ”Bέ„Æ¥{ÎŒJÆŒ9œ¥¥Æœk­¥œ”””½”c½ŒZΔR½„9œ”„µ{9­”s­„Jœ„k¥s9”Œ”„„„”kBœk9”Œ{Œ„{{Œ””{kŒc9œ{ZkssŒsR{{{s„„¥„Zïνk½ÞçÖÆçÆ¥Þ¥ZŒµ½Þµ{ÎΥε„Þ¥c­½½­ÆÎ­¥Œ½œ{ÖœRÞ­{„{{ÖÖÎç­c”Œ„µµ”ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù ÿ,ooþÿ H° Áƒ*\Ȱ¡Ã‡#JœH±¢E‰hÜÈQãÅ + 0€@(Sª4™‘cÈ—0ŽYÀÀ¬Ü‰2Ah³¨Ä™3 (¸‰Á§4åé“e¤ŒjMˆu&ƒ7ÃÞ| A³;\íºµí¿®3<vA]§R›¢ÍI`-\·1á € °æÒ¥ûôiN:ý üQðL À>جx1ã £&l™òDËH4˜À¹õØÈNpÖ®]¨CQ#5ýP÷H 4'æ<Ö 4dÀÀÀìFÏí›(o…¾ oP}ssâ° þ`(€s ¶$ _}&„ëukß !pïs+(`@z¤†æÐFí!¥|µ'Áv Ì…_g 쇜T˜ $ Ý)ˆU¾UÝ‚P ™ƒ(*¶@ p`(@A€75À‡XmŸ‚vðÀß=H~õÆY'l €’8BÀE”y0"‰|pbŠFf©å |@Ÿl@X[xñ…[ T¦ †`Ÿ[rÆZƒ›­Æe6|É&}cŽiY\|áÅV"LÉæ‚#°V$–Y²6'—¬qùÀ°pè¡_úÆ‚nåÛ¥{Ziä¢FN©¤¦ÞÙ`,¬°Bþ–‚z¨†TœžY ¨A k›œ§‘ Ø9çj4«Ì¾ë¯µŽ©A®º¾T“Hù©ç¥$:l©vÒÙ`ƒÉÊPͦ +´_*†™œ¾dBšå]Æî tʹ™£?ö»o?&Û  )èCº·›Ïb ¼~d Ø"µ-´)\g¤v¢:n¹¡ÃÈ#œn ²n°E®b|åEóÂ&‰Ðf é° )¤Å E$m2Â8›cŒñEÒ0S\}ƒÊ`ªþ¶öèÆÞ™ì*‹DÐ`“¼ìÁC³eˆ¡ö/Od‚ ¼b5›+Tz¨¨öiþ²ýŽ‹µÀ ¨0„È:,6ØC3kFÚc¨]F½-%RІPwÝ•®œ¾zKÚñ£È†Ûõ†LLޏÉg Qj‹¹Do;=ÒÜ+´`v¼[ÚÁaþòÛ9À~«õ撼Ĩ£nx骗œC­ÃŽÆõÓîB¡ö‚º°«º›Í #ï/¹tòm*¹ë^,Á$ŸÎÄÍ;OEô$çÆõ׋ÁDo‹Ùo¼×*WYîUucÁ Œ'®í‹o~ãÛßVÓ"Œlyõ‹Býšw¿è¥A jPý‡ˆ¼ L•³·ˆ*g Ï׳®õìk:hž3ˆ:ú5o þ ÚA¨Øñ!osA C@æn)ÁÎ`x'‹‚«‘A±¢Ã 2! `tÂççÅåÝoˆDL£b¸`·c“åZàDfmŽx¦]À°XÃduMŠCè"¿È„$ò‹bÔá Q§ƒ5¨Q I¢ h@+9¶ê€,dÂ%¼b }*àZÏÞWÔõP‡I(¤!™Ê1Ö H`Ã#‰È†´Ñ5 AØDÇ:2‹6˜¢çŒ×¾c²X]ûã‰J'¬ò™Iˆ‚Ã8Æ6Ì„²\ˆ n‰‚Kù²Y7°Ò(ûfÌcùQ”Óbd`ÁæÑ/ ©„fŽ ÏVJ“ nþ`ƒ>Õ K~bó ‘$U@f‘­d®"›«¬íË  µ(äyítï,¤*çYÏŽ&!Ÿý”¥Hõ ‡€¶q< ›ÉF–ƒ K¡®Šâ(:Ad¢6” ¢@ŒõŒƒGW)‡‘òó þTCIâ¸q=(ZºÀæÒ°¬¥ 9Ý×5‡"ïï[§ÇÆŽÆaBªàÀ†7´UŸoÕ'@¸`P•&W0²ªŠd|åkpÂÑž©Ê¢=«hV)ZJÔÝÓ£tˆ,ZéÊ&!­I¨ƒ\Ýúξu©A°ª~UKW°Éž‰2™€³þa2»ÎÚÊàŽýiPÑ:‡ÈJ6²g½ìì‡Î¾µ³Èeh „ àU¦uþ—ƒ!ÈÖ}…UAV±›Xdª“?Ý(4ÏzVßš—sèmèp‡7à¹ðEîr à¹Eît­j„FÔ¡µÕî:‘§ÓÚŠUG@äPÏÚÛóž7yÀƒ„ñ ÷¾÷¶ƒA‚@‚àw©Ý/É`C‡X‹_}(EÁJQè4•â¥ç*ìàÓazÈ1…'<áë‰Á ”ð\t©ŽyÑ+l;ઓÉO¶­‹Í%^y ÕÆ6ÌåûÁ M˜^w „"„¸p9œîþ’G7ÛØºÏ-Ü”]ügB¶Áþ q^>øáÏzðƒ—è/3 íò+b«BÅ6õow+`ï‚·Ê3î-ž}ËçNâtD þìA”úϦFµ Qä€c^4_ÝWƒ‰“\õêEÖï&Xƒð *z¼ç=‡ƒXµ²—]êe ‚  `ýá3«vµ9øÀv<ÊPÖµ]çvøX³nšÓ¡uœÍngC{ ÒŽÁ˜¥ PXÛÞ çCC¹¾­=ຳÍ5)y¨A+óö¼|Ö3 aˆv·û‡0A¦pƒ)Œ¹Ì{µ·Æ¨íqE‹4Ôê(þ)šŒ6/šw&v¨é€‡³≘8œ;æ"`ò ¾gÎÐ7§<â4‹6lÀ×NIn;ׯ|Nv³]®ìC(bâ3¸ï˜«°Wƒ:Ñ…2t”¸RµµsI‹*03}Zðz[Ý«Fõ©~ˆEL¼N³¤úÍ_B‚XÓÙ‘¶¾µ7zîDdÙŸyå#bí¦N¼Ã%o8•´)­zâèÆ&q¶æã¨òàx]° mØFŸqÎ-êÄ«]ñÎ>#‚‚+À`¤Å‚^Y¨×Ý=ë…æÛ›Öoºžý l§T¤•܇ÓŸÝ(A`0…Çß–2›º¤-¼m‰Š;cŸ×€þ|2ú0žò7ƒ5æ²,‡ÃÌ“[Ò4|tajGj(Øn„°€Ñ€xW9 Bˆ)Y/˜76(À,G|ƒ÷L‘Õ…†‚D¨j‚+XäFw¥3ø+J¢Š‘"¤R*5õ7ÀƒaC!(xâ…V•ågCx‚ͶtégKÈ„õ„{R+S3߇÷')#…®roD÷EV¶V~Ex€Ëfê§„mtK;Pþ …a2J’(ÝñˆS¸1}S-Ô,|]ÈNPeÃÕ‡¤V€ç'‚ˆ†’Ä„ à+)ã†]žñˆa3]24È<À~—¥ Vh©–‚K—|ƒ¸~ô€ZPI—Ò~2ŽÐŠØŒÂ%PPÍbmФ‡«Tp€|àeˆx‚ø‹ÀXе$˜²ˆ„qŒ#‘ʸp0”"}Sµ…]D?Ï„‹×(aÛˆx‚°g‘†LHI¾BK2b蘎bá AR' P‰½du‡“‰e· È剼h„ˆ ŒH/9"öat% ‡"yã>hHwP\=V‘¨g¡¶þÁÈ„<`+ØbŽ]± ’ˆ$_ò=󃔘° ›Åž¸‹§{ön9“¸ÄÙRø;yÃ1z¢0ér0g–[…tÇå^9–jfÙlˆ“ 1“·G#“‚qu1 © °!p1²6™R)aºŠƒ€‘2É8P1Õ1ˆ!’Ž\¢¿"y³4&bÉYE‘¡˜–„Y˜¥x8Šti•WÙ/5@i‰Ac8ÍRm•™v‚Š÷iÞè™’´D’¹!鑎@ŒÞÔ•“©+p‘Ð? KKFÚY?Ʋ€ÀÌ*1ëF”„žÚ±!zë!YÚBà?(Û­r|Çæ .[ÎÇ„¶#I°½z'P/s£;òz²‘šœZYz¶1×a{W‚ @ty¨$jŒ²R‰hÓ?b`¬pvÀi€ðµ[I;Œ–ás‰  @§z1, ƒkD­ªnÅ{à[zV·¦{¶š·X­g;ªi+7+Ÿ@üó³ «\wëYGÛxÅ„(5 #Q•Œù¦à Ê0šû:¯S¸)+žu  ¹«–!BZLˆº3þQÃ;Ô&¨Ø É»¼°Ã¼^ú›pYœ"c†W¼ $Øy¥Ú± óš6…+¾´Äw qP^Ò‹¾1fwõ>:¢‰Å{;¯ bà$ĹûË n`Hå%À ¡¾cFq]Áê¸W¬ÝK7gð8Ž#B@KÁ@H¼R°¾=§Œ‘I5Üù½²Ó?!DDœ`Y-ÜB0fX •·sÞÑÅ›ŠŒ¿ákµDäQ€ 3ÆÂCüD¶RPlB+wÔ— š¹%¾ÖƒMœp m AVlHsÅ¡ÁX Û1¦ù%ãcÆþ;œ+„lŒ¨ƒ F'ÇR€ZPK€0{ÌÇ>˰b m<Tp:…lÈ 1 VàLL`H60#¬6’à”kH‚dHž¬ÑdH€•–p dðʦ =:ð¨ãµ|qàÉŒ ‘ ™ð„Ç<ÍÔ\ÍY;pygame-1.9.1release/docs/tut/chimp/chimpshot.gif0000644000175000017500000002546607670466467021637 0ustar vincentvincentGIF87aÔ<çxzw»½º=><"$"ÞàÝó}~“vY[X›šÝ±´¼”œoYcR>GöôøNPMJ48:/:ŠŒ‰K?K01/ÌÎ˪¬¨mol  ̤­¤†‘ zftaLU„zŒóÚÞáÌÏZMY:27f`vƒcdùûøcdbú@A”†“ƒ€³µ²×½Äæèå“•’~a[ÖØÕuixDFCóÊÌUWT·‹‰9:8ÄÆÃ”rsI9;,-+mjydKJ qWV‰ƒŽÄ›¤Øª¨µ…Š£¥¢\DCC5<±¹éÜÜSGSÁŽŽüîï¹³À䯯…fl“ ´­¹R<@ ›ªt^g«ˆ‰Æ½Å†€ÖËÐøëìŽx{¢€½™Ó¡¦Ž‰ˆðíòÒÆÆrtqb^]ñóïj]j—¢ lgf¡œ›YUTB25亽ɘ·²± ׫®')&œŠåãçÇÈÒÿ‰pucFLKFE;65Št}áÔÔ“nvÒÍÌü^\ÊÄí¦²˜–~_e4,1¯ª©I;B†ˆ…~€}ttìîê463bVb®°­Ç¡œ¿²³ZENV@D÷º¼_a^pki½»Ë £½Œ‘PLJŸ¡žBDA·“”‹hd•‰‰ì¹¾¢y|üþú±—ôöóÒÔÑfheãåâ“szâÝÛžuxÀ¿ץª­Š‹ÚÜÙP?AÃ’—£|…|\]ܨ§‘ŽÉËÈF8?íÕ×JLIlRRÙœD'$ûõôÈ»»;-4à®´¸¬¬udft\`gPTiröÞÛG79VHOOAGtORñ¾ÃîèçÍœ¡ªƒŒ­ ¡oW[§©¦êµ´žw€Œms ½“••~ˆµƒƒ´ŠWIP–˜•«‚…•ŽÙÓÒ§~¡•–¦’¶¸µfQZVBJ?;:É••’Œ‹éë謮«œ|ƒ¦¡ Z>D‹jkƒo}vxuÏÑÎHIGycl‘nj泸VXVöØÖ]_\kTX?A>æÈÆáãàÇÉÆZCG@8=,Ô<@þMH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç¡BŠI²¤É“dX¹²Z5–2X8I³¦Í›8M Ü–Á%öX Ê™‰ =9ØËÉt¤ +\ºì)õ¥€G“.Ey¢åº¦`ÆxâåJfÄÒ”Ã2mIѨÀ*Î,‡wXqTóÁᧉ®=¿ª YH*>¨ÆŒ!²°ËÉg`LØ0bÅ“ã|À9$çÏ C‹=šà ©>|¨¶:q Þ^úØñÀÄ919Ж“:&:Ûð|T;ü ”·¤fn÷ÎðûAðáŠwyÈ„¾‡«öæÀDà,áÕÀþtõë@{ |pAê€Ú&&œ @þŠ7¤À2c…‚átß§øâ¸ kD¹,\4sÉ%l¼‚ 6 PCM,¸R‹ôb„O¼ó϶ɛ6°S7%ôÔNǼiÕa¯tÓ\›vÑjïž4Í>ký2i«íT¥ROê¼ë¬3é§g?´ê%e-¼ÒIí(ÚEMí̶Ž)ðb‹_}Xf?Pàˆ0Âob €ƒmTRN;0θdÀÙZÑ/`÷XC=ê¡€U¬s[`&†0 j# †? ñÑÕB|Û¬6<ð…ÏQ›òž ±G;Äw9i_£”–½·ª{Çß y¦= 0vþ0\Ÿµæ«¸AÏxÑ£žÍ–>öngUk^ñn¦»ÏyJáêš85$ ŠKÑàÇ‘!tƒÀ ôá?Ü­ ÅÌLP€Rø€(„ ‹¾aÍØ‚(:G 'cþG$Œa5¢µâÏ€÷µ×•OzSD 'éµ…&´¢ñºv)T’“›!"ï%¶F™d•ÂkbØÐ÷ÉUªïx=´äÏvWÃ->­”¢|â$}×¾K*w£’amà?áØÃ –èGÊq „!i¨Úèœ r…Šó‹3TƒXx„²1n`#Ôø0ØáC#þÈg> A#ü£;´t.Z³õ­&°ì!înÇІ:ô¡¨D'JÑŠZô¢ͨF7ÊÑŽzôvúˆyN³hQ‰JløìbB€ƒr„³‚6d EÌh æ¢ÄX`¦Õ¨éMS“ÓöT&!0ÔÔdÀ§êFR02QÉM ÿq‰zLUˆE;zA”ÊÔ£B5!°x(à®R¬| À@öå õF¨8Õ)OS„T¸!5sØ+b‚j‰ˆ|‰ÇÞ±à RCÍ@&»3¸` –p‘Sc7d«RmØKþQŠR °Â ìQ{X ¸þŽjcN—hÂKN,x|°Œ*„Ãè@ E°À '°Â³lSÜ7¹Ë}@s…ó\å~$[ÕŒ%U5Öd€žyáY²ƒšjìfGfˆvtˆÚ¬W8Éy/Ô žê˜À êQVg”3ÄÃa°°ˆ˜€Ÿ›B¶•ozÂê¿ÂiïÌðèXf.†w=`à>ÕHhñ˜ ØæKªšCvjà c§_ÝV(ÒEÌ"ñPHqŽRÄà (Dþö’‰ ´A•h°€Ž "1ÿ½ÂM½  \¢±8Àç6 „G¸Ó§°ƒ< Hr‚ öU—ÈA ý,3ʃIãÒÕ¸t¦…³éVXAtø«KZ¡ÝÙuÒkeHP©Â±E²@csJªtm¾¦ôilàÚVtYµk\/чg³¦\F `”†|ÒTלìR•L})v®Ål[•Ø£lµÅMBfjÛG3O­PKœsà TpÓ ècb Ö2Ä€• ˆ# ª¹æ† ` ŸxƒÂ1Ç PôaÔ¸†(‚`0P€¢ùˆ„­ üSSÜ*Ptþ¹5ǃP¤8ëu0CʲmÒªªŒÝ²y ÌLZï•PÜ%ΗÃroi(äeú|é=ãeíä¨4öÐmÈKòMÛŠRÖœ7L``Aþ{|ÿà »ßäþÑ/7˜ xƒšÐÇKl6àÆ4rÐŽAä£Ú@F-Nç€^8€ÞˆâÓÈötÖ1êEEÈójµP—4;¡J¤GDÕ3|Ç&tØ3>ž7/$;W¤{˜4PNärÌÆ ’zA'DA‡l®Lª“KW;›ÔK¯ÓtHF7;#PÇ`n]pï`nx„|W,`v)ã#0€k Í`\ €  Ð% ãÐþà:`O#` ÿàH"³z:ç3hµr”„KWs#øÚõ†p‡r8‡tX‡vx‡x˜‡z¸‡|X×e7p‚þ5 ¿ñ‡þˆh/ ˆTu50ˆ8ˆ{p‚X‰h.€3°Õ°pPšoq•¨' ˆšp‰†µƒÈÁ‚8cÙqYR‡‚¸'§x©ˆ£ ï„¥  ‹pÃXŒÇ˜ŒËhÍhŒÈ¨Œª¸Põ*x£or@€ˆá5Ž·ÖàÁ^yÐÃ*…iàQ&°fÞÅtà^ð'fpó ¥ñ)²BŽ·cŽ"<ÀTÀùPcQcÕ°!Úò#psW  h° Ñ  À#¶* ÙP¡€à!i•ir’)ÉþVÀ’P‘Å’>!“4é’é†r(ÿ¹Áø±i€Ã¯‚”@˜˜R/!ˆ3‰.AOÉ_R™RƒèD •°`rà,@QAT¥{‚Ã"¤†1V_™bémàQ±Žb£€«â7Ýb)sY3²@`0V e€P™Y Ri^qTy"0€§R‰á¶a–º‘2–9•/1#0Pq!;Ré%> âgÿp]à€ 8pç r`ÑÀ .Pà «Y™ÐÐv "à‘þ—âû˜™Ã±"t°Tà©ãiå ç¹ëðyp˜€á,µ'.ÑÈò*­ÀÕ0Ñàq^ѶáRA Â#·ñúêz!íÕ©Q^žY ‰ Ý èØyps½¡ ôq ¡b8ÀŸ'2t)WË%ª ›·ñp"ãtàQ¢&àVÕ€– éDð^h‘*ª &PcPàÐÑê%Ð- á_R^eõ!à"Qá¯Òðè¥8"Lp"ÉÑ*ë°À ëpˆ` U@ b° àÞ`ùÖ/ …0 ‚Pª0þ`ýÐ%R¶¥|P0Ö p¯ ±Â@N S0Ià“öµU ùBˆ0N£ZªëªUæ]ph;EÏÒ]ÃÑ•"lê©Y¬Q €»¡CZ ½Ñ^÷õí%¤²ˆ_6v¬Ãa_P‡ ø!sÐ`&`Ž.Ñ¡À£)nY [¥*,æ.fѰ#:J_E—S ãv*œˆ5X æ7`Rry¢ðÁdöbR¡ 8†Á¬Õ`_øuJjàÞ•L0€"„*ÎBRA‰ àÑY:e] ¦ùŽP¥°TÊ…i0/pþ€ÆVð¤ à& œ¤`…Eé 1 ±Ý„'¥ }&…Îà Óðì`’`£Z@1 Ú©1p <À”áXðá`PÉ`{c`('’b!k¼{r3Ï–ðm"'»+B5!U,Ò†µ‚]ålA#lÊ&n,“«RÊ*½ô-ð:+Æm’’¸ÅBEA’¶Á¤.a‹RŠñP 'À+»ÓlºRù‰WE±¹B{¡ a €]P!q(gðž¡€F„g 8ŠCspŠð¾ ¾à oÐg  N0Á0 Îþ g’qQ஑ÀðaÖuC½"¾¢—á«»&3³”†‘û%xB Ø3Jws!¸t®ãB>Ä+pƒ,„"sDÇt¤y´ckTCnåæCWó¿/',Ûãs÷»Þâ,ü*ÀD¿'¸ºúç7•@ši €»Û€7pÛ ëPçpŽ`1[ÿ#b° ʰÊ«~f ΰA~‡ L; í’`†@È µÐxÆÆ4vû6 Q·XDy±¤IµyŒ‚·’rY„{¯·D¬ós…“D½¶€fˆ>"˜Á»DzlU¿g{½À¢4ÀM;Ç„D%„lþ¸Á8Gu ôt¸'KÏfÛ@D€0ˆp €enЦõ>þ³m0 ÷1š04  Ÿ°ÃMx A`9¯°œs Nà?àhµP †0£ód¨IüÅþÌ··Ã³‚Kc)^üK׳–÷=w,s¯—]¾${O$«EWyHƒÌ;6cuŒJ¶t¿år*TÌ%84õk{a|>¿×;Xñk‡›ðXÚô° ÞP `ð™m´8J)1àF,Û  @Ò¼«à„  ˜À WS°©þàq³xÅÑŒÆÄDÎ`!À±×ÅïK{ hz1‡D\<þÈØ=cÜt9çE$¸²·s­Tz>éÆÍ܆*Øzr¬3ˆ9¿×sKÒ<‚½$«&u»”v÷qàsÐ/Š–@Ž hðÏ÷Á 'à5av™0 Bà \p ¯°NÎ §Ð~‡t Q`Æàä0ø4šWy\$5‡‹V4dÆh<Í;yoQC§†ITLù[zºô¶âl='ÍlÇÒB³64 XÓ‹=ÔQÓØ!˜]<ŸÔ³€œ·ÆŽç¾©5gŒ,0¸vn€På`\–hGÕ·8ª±¡9y»0÷qÖe- B° Að Ùð 9@ ׉…„ ÿ`þ»@|½ÇÔF«©7€‚MC’­Dp;Ȫ§P¿Ä¿XƒÓTEê½Å1u¹7"œ ØßìJͬ:ãJ4z°’{]Àpz2ÔÁ-àk¸QgDÂC |pÛŠs VÐ=˜xÐдÚÿƒD ³,&ðÔf`ûÀG²p ”ÃJ0 }`HÐ0Pþó÷:`R0B½œLÁܾ¯Ä6×ÇØí¾}ìØ“Gà]ÌKDÚØmzZæË–gÌâýÌ×Ü=ú-k\³Ø—çäßvJE­–ÔVgÅ}lÙtìa€ ß ¨-G-‚€Û÷Á'V@i@]p]0Ç¥ÔŒÃþ3p,çà+ü  0£ð˜ÓwÖ fBËã  [è0ãóW ½P ) Àjƒß;.ÆJ—Eº†Ôù+Ò:ä&¸<hÄSP&ë`SLé\Dè³ÓÓCÚC$yLcµtÈdÈÝ5Ÿ$ôÓÄçÓµò?n`m@ ]i`ö°ÌðýsÃfP€0 èОand =í 90ÂPQ†#Ð ù„O#@øDáÄs:$k¬kkPÎÆßóéE>Ø=YððŸð ¿ð ßðï·ªñ?ñ_ññŸñŸÓ}Øñÿñ ò"?ò$?þˆ€9qò)ò _ð&°=ÕX>à–ððÕ Z ¤‘=Õó=u‘ï˜a@ŽÝ YM_5ÿAïC?"g"]bó ±ô©¡ó5!>Ð#£ñô©Áœc©Q ÁS0œÁõ>õ%#°ˆ1p^ÿlïö€÷œ1÷Øñös`÷Õ*×HRÊ¢Õ€)e€"•€ûŘŒ™&Àd{‘ZôZ^½1±ù]‡äÁ(Œ…_).‚` AëUY€»^‡Aø¨ðàá¤àù{ú!Ì(eP@P°‰4Öû/ñûÁ?üÅü¾þüÂOü`ü×åÌx˜*€?`¶1 „@Y0 0 ] ü dâ ‹`þi‘p°›0¡·À+ýé/dëßþïòOÿ¡_(‚G½˜±bœR­>0a¢LÀ<(H0"ÄöªU¼Q¤‰@ÕLÚƒ‡`ƒš2D¨¡Ã—/MÐP @†uG>€”¤Éj(U²tÉñDµ ˆ,ÕL¨pöl²@Þ-+4u˜… +¼sQSmÍ<ªqà ‡€y^2;ŠÈf(xY a‡ 0!JÀ„Í`Þr@…îÄ +•¬°ŒÆ{>â‰þ\Ú”H(¼Qõòõ 8”ÈŒ&€|ä° #Db”Yç(â늲CѶ[·kؾßνxíræË>‡]útêÐÿ¨"¿×Ø™’ò¡“ÐVćBgÒ‡› á3| ³Ã|S“aЫgï¾|¦ï3„J3vÒ¢9Z© ó|¨º‚€ %({8ðÁ‡tFŠ( ÕS"üp@Š˜"qo¨3a·ÞzÁè\ Š#’6ü¨Ã áqq) ÑH¢üHô!¾ùüðCL‚ËFÆ«Nºˆ˜¨¨šu ƒ(Ež3a¦| ÈC“®|À LzÏ<õ|0ÃÁ‡"ò‡wÚ€ +ì þ£‹3¶@4ðña< ȱ"ÖÉrË.+Ì`™Âq§ƒYŒÍ‰‚ëÄqQ$/&E’K1•qÓœ:ýÆ&OmR-1dµUW1Œ¢tŠ’([éã#và(]Çóâ-“xðBŽFôቶ>B3La«!ÖXd•u«B3\Ì.B¼ÈTAóÐq± ¢\ £ÕbêX £ùi¨Ëð‚B`;[mƒ ¥ŒŠ2pa¤‚\Œç£ Úð¢#…¨¤wã×¼z—…k\‰ŠöØ·’]ÖZÝ ó:¨Œ'<þy•50ã-{2u .Z`,“mäðâX÷"ªI >¦ã:“Üþˆ(BŸLH$ž¨/q¤0‰9.˜‚3Ì`„9ròˆbžÙ ‚P'•AÔiG’h„[â• D¦0IDD s‚¹«È¼»7òBoº+„ëï’/B¶šcœ¹ŸfÕÉV3þB'®F±SlbI ?g.OMðôˆD¯Põ`?±ÇL7® z‚Âj*ÙÈ܃Wƒ¨‘QÁ2Â@¸^9áºk0AöNM¯qÆv[ð3çD:þ£•3 χíO¹ ÌUG}t×ÕKó2Ô³<(f]„q‘ÜÂNÐÚ}€fì8XfØœå38ò€­™äZ!H?þ:ã<œ!7„à!@¤ÀQlÉ8C)€&Dìk°Y k8ȆJaDâqèÀàm$áè&B4¸*ˆC4I[„<á=J@ãg0ÅeUWœÎÉDrð|L(?ñ\5º@À€…G1^O5T¦4"B¯SãÛÚ8õ¸‘€fJ“Þ3 ÑÉT(žP£‹<Ç&A±X5B£ˆ@AdÌËîì¦'š r@ÞPeà¤Å(à±Àð"CIÞ aºï=^stÑë>!ѽ%}“òÁTAƺ]ÕqQ•ˆþ2ªœ¨VÊ{Þ"”†ç„è[’D„4ÙØÆM]JßµÂ×U±bËcd.SÑtÜBùåÀÙo×tíøŠr"îï~«ÔÚ.õv}ó ÷¼¿wÇ¿D—·Ý­Örµ™‰S»|¿ˆ®v×T9r†Í%þœüÃkô•¯‘ÿÅÌNþ\M‡·úéM`  €Ç Ðð‚¨‚ @0² ,¢9Ç ™÷°Ç –°¼á —È'´pŠ`#¢Â+l Ptþp…!q P€ «:c­w-Þ;Ff_±µ ©&+J{-ó¥?µ%¯Vm{›ôÚ^;ù+¼þ#<•Ьxk<üó¿úÓ7 ;L¸„ó»iC «K?ÿ#=sã1 ¤;në¿_𝋛;·‹6Ú1Ðk<´S<½S+@¢¿PH‡¸.€¨€s0<È<Àƒâ;Ë …~ñ?0AãS ³‡9¨åS€Kx ‚Bþº ‚QS‚l€u †(‚ðsr¨ à«cA—‚•4\«—2$û+³D»7œ6°£C œ6ö»Ã@)—L¼ú[œlÀ Äv£"ü‹@:¬¢°«Ã¿½ü»j»@q{¼ýûÃt¿#;É[Äk³Äiõ»6O,@AdC¿ûÃÉó/€¨ Ø.A… êxX0¾cM ‚6ð†](„ÅZBãk90e†5Xeh‚Q³† ¸„K0kà†o…T(dˆ0 ÐÀ1½cÄ5‰7êh@ÁTI;k[1¶€¿øªÄ´DTÄR´ÀúJÃIÅy,D}þìG1@È;=}”/ ìG}“@é@Å|$»|4ÄÀCÁj[·”²»d@jkG|¤Èß)EŒ‡™ƒ€À{€Dø…+M% 1ƒe…VÀì(ÆaP€ƒYPFiÊz…7h†idƒ-°ÆTH…>ˆoD†0 x‚?¼*†ÌJ·»¿é9ÀëÇ T)8äÈuôDU‰ÄùR•B4E üÄü¶ ËüÛÇJ„ăA…$À„¬ÈÀ›¼µ¬Cu,G„ôGC,ž}ÜKù+H Kq+3æ8<ð0>3ˆ‡€€0P„`†0ƒ.hƒYƒy¨,¾bä…:ˆIþÀƒs[P†5ø„zð…K6HÊ-ÀnHz†`Wˆ‚0rø‡2D(hK9lÌûãGÆqÈ5áHäD,"Dm3™TËG¼ËE<=ÅV¤"HE9Ì¿S„L¸ ÉìDÃŒ¯ì,ÈóÌK…¼6rÜCÆtË«¢È¿œÇˆœÈùãÇÁLÅyã›n€D`ʬ0ÀB("È„9(Æ 5>€ˆJPM0°4¸¡‚&P€U…ìÃkÈP †`˜ß$ ø‡1Ä. ¨…3Lû”Où4)ëìÄÔûÇ­ûÊ´ÜDœÎ7$Oô#Ì=KTþ<¤Ç@ôDé|þÌzDEFäOtdE€„Ë,ÅN†¼GüÏålÄ‘Rê<½E,ÍwÐLã[¸3„vb[€(M €1¢%p{°" O_à‚f`ƒWØ‚là†i †A€hð‡(0#p€H@­ ÏÆ<ÅYEë,(%R/E¼±œ¢z,K+ÒÃ"5ËæÔÒX ̱äOçÌ¢1-UP,Uÿ\U¿äÎJl•4”R‰DLÉ›ÃDäDàÙÎuœNMdOÄ¡¼ï|C~9ìpƒT£\JA"ظY¸S í†CŒˆ¹¨€3€]ið…(äÛ̆lø†Th'ȇ|èW0‚oþœJBð¢cÝÒŒCå´Uc<_UÇôÌ"TmëœR{lćëfÍUTe;üäΆÜCÿƒ•|‰Œ@úŒ¿ ÌUlXÀôÈ$-V¾ Õ‰ÌÀ…ýT&õÕæ„UçPDù“Lãã€LPBüIƒ6è@°Jè<B߉p@€bJixF!hsx…â¾vø¹`¿p¿h€Q@HƒÜQXeGŒÈ|؈µ8ÀëØfuËHDË]%D´-O@:UðäÈ+•Õå$ÖI,Ï&ýØç„À3eÙÃ{LGdVLEö›URÝÎl³KÅt+(MfH88 «1Ú.˜ƒþ à­bœ‡,xKˆ˜ì8 ªm!QDµl˜†S 'Ø¡ªÐC ƒ]ˆ?ôüÔ¼¿³“˺ŒXô|ÞWM•SäJ±ÜËw¼Rµ³NR…ØÔ‹ÄãmÜv,Ëa=UÀ<@ëM»‚‘XóLDÇß…lß=ÄÏ»eÃð¬OhEØ“5X™c†D8[(+xŸ0p e†9ØHPK>8ƒ˜‡ Ð9YX_X…fX*@Q;PÑq†qˆ„0‚0„F@Ü»ô ÄCGÈ4ÏôÒ%m[‡Anë1P]XZM^ …@åÅÀZ}ÈæpÄr;+­"š5E¼µG·dþN'iŽøcÈé<âË}ÎäEKð¢ÅVxð–ì_f@†Í„ÐŘ…€ƒ ]}HqP~À* °<¸C‚»„*œ×zm€ȇHˆ„(¨5xQC0¶¥âà Ö%.À‰Íϲ{Ǧ·—-L‡O!ʵKO½Ù±“dMÒ]UÁcÍÄŽ;†5V.5\ˆ=¾\+i}Ëü”åÇ=\+%å̶îÕA…;‡j¨€Ð8{¨{0šè7˜Ñ,Æ™u°Xx7À9Y¸!àjdƒlÈ'‡)Èmð0ä0‚Z T PÏ„DœÙö\Ö]þ–áŽeáÕgú5Ȯ˂U̱[_\^ïÖŽ}ÙHædCSIÏø|ĺeÎT†ÈÅTßôÕäySæÅ¿5ÔÇŃpeE D€0Ø„ €BÀ‡x@€R¨<ÅoÀ+à‡°„È€xÀ€5nFT6Ø>®m ódÞZ¨…8dÊ™dÈ…ä½ Ðñœß–X}®áR­ä“ŠÙ›Õb|4h,…D&5Á>HÉíN1åb'íçúõÞÈÕö”â[¾eiMÖ´g‡Îâü­‰2}â¹v õL˜½Yè‚xEXŠ4H æ¹xK@…ˆˆIHƒ÷X‚7ÀZ%ðìí+þ`rðCP5¨…J5cÛòUe{Ûá7Ä7íÓ¸~[ÂÅU”½Ç³Ž^\•^¸öÑÃ^è}bã¶ç/¥ÒÀÔk»ÕRW®ÒºÞRЦeSåJÝöG{ŽÏ†bì Ĉ€„hÆŽx°‡.€‡.˜e¶‡C°‡YÄSÈAƒP°‚iz€˜9[x…lnà†£„|(‚(0#€ðW Pð^PpÀ$çVXœ•jNÞ¼^ÍÞ÷mD%6Xí”@_ÅJ.¦â®,Ü–]a„½k™P0b­lÕPÎÙ°žÕ‹%¼é°â ïÛÛ^ÞhOyœáòÙ‡(†rpcì¸`Є˨€ÀCË„Ð7î‚~(„ PY €оl°o˜À…50p?ðPp±½ÊP¥êRö ½eKH¬ß7§a ;pygame-1.9.1release/docs/tut/chimp/ChimpLineByLine.html0000644000175000017500000006163210076165640022765 0ustar vincentvincent Pygame Tutorials - Line By Line Chimp Example

    Pygame Tutorials
    Line By Line Chimp

    by Pete Shinners
    pete@shinners.org

    Revision 2.2, June 17, 2004



    Introduction

    In the pygame examples there is a simple example named, "chimp". This example simulates a punchable monkey moving around a small screen with promises of riches and reward. The example itself is very simple, and a bit thin on errorchecking code. This example program demonstrates many of pygame's abilities, like creating a graphics window, loading images and sound files, rendering TTF text, and basic event and mouse handling.
     
    The program and images can be found inside the standard source distribution of pygame. For version 1.3 of pygame, this example was completely rewritten to add a couple more features and correct error checking. This about doubled the size of the original example, but now gives us much more to look at, as well as code the I can recommend reusing for your own projects.

    This tutorial will go through the code block by block. Explaining how the code works. There will also be mention of how the code could be improved and what errorchecking could help out.
     
    This is an exellent tutorial for people getting their first look at the pygame code. Once pygame is fully installed, you can find and run the chimp demo for yourself in the examples directory.

    (no, this is not a banner ad, its the screenshot)
    Chimp Screenshot
    Full Source


    Import Modules

    This is the code that imports all the needed modules into your program. It also checks for the availability of some of the optional pygame modules.

    import os, sys
    import pygame
    from pygame.locals import *
    
    if not pygame.font: print 'Warning, fonts disabled'
    if not pygame.mixer: print 'Warning, sound disabled'
    

    First, we import the standard "os" and "sys" python modules. These allow us to do things like create platform independent file paths.

    In the next line, we import the pygame package. When pygame is imported it imports all the modules belonging to pygame. Some pygame modules are optional, and if they aren't found, their value is set to "None".

    There is a special pygame module named "locals". This module contains a subset of pygame. The members of this module are commonly used constants and functions that have proven useful to put into your program's global namespace. This locals module includes functions like "Rect" to create a rectangle object, and many constants like "QUIT, HWSURFACE" that are used to interact with the rest of pygame. Importing the locals module into the global namespace like this is entirely optional. If you choose not to import it, all the members of locals are always available in the pygame module.

    Lastly, we decide to print a nice warning message if the font or sound modules in pygame are not available.

    Loading Resources

    Here we have two functions we can use to load images and sounds. We will look at each function individually in this section.

    def load_image(name, colorkey=None):
        fullname = os.path.join('data', name)
        try:
            image = pygame.image.load(fullname)
        except pygame.error, message:
            print 'Cannot load image:', name
            raise SystemExit, message
        image = image.convert()
        if colorkey is not None:
            if colorkey is -1:
                colorkey = image.get_at((0,0))
            image.set_colorkey(colorkey, RLEACCEL)
        return image, image.get_rect()
               

    This function takes the name of an image to load. It also optionally takes an argument it can use to set a colorkey for the image. A colorkey is used in graphics to represent a color of the image that is transparent.

    The first thing this function does is create a full pathname to the file. In this example all the resources are in a "data" subdirectory. By using the os.path.join function, a pathname will be created that works for whatever platform the game is running on.

    Next we load the image using the pygame.image.load function. We wrap this function in a try/except block, so if there is a problem loading the image, we can exit gracefully. After the image is loaded, we make an important call to the convert() function. This makes a new copy of a Surface and converts its color format and depth to match the display. This means blitting the image to the screen will happen as quickly as possible.

    Last, we set the colorkey for the image. If the user supplied an argument for the colorkey argument we use that value as the colorkey for the image. This would usually just be a color RGB value, like (255, 255, 255) for white. You can also pass a value of -1 as the colorkey. In this case the function will lookup the color at the topleft pixel of the image, and use that color for the colorkey.

    def load_sound(name):
        class NoneSound:
            def play(self): pass
        if not pygame.mixer:
            return NoneSound()
        fullname = os.path.join('data', name)
        try:
            sound = pygame.mixer.Sound(fullname)
        except pygame.error, message:
            print 'Cannot load sound:', wav
            raise SystemExit, message
        return sound

    Next is the function to load a sound file. The first thing this function does is check to see if the pygame.mixer module was imported correctly. If not, it returns a small class instance that has a dummy play method. This will act enough like a normal Sound object for this game to run without any extra error checking.

    This function is similar to the image loading function, but handles some different problems. First we create a full path to the sound image, and load the sound file inside a try/except block. Then we simply return the loaded Sound object.

    Game Object Classes

    Here we create two classes to represent the objects in our game. Almost all the logic for the game goes into these two classes. We will look over them one at a time here.

    class Fist(pygame.sprite.Sprite):
        """moves a clenched fist on the screen, following the mouse"""
        def __init__(self):
            pygame.sprite.Sprite.__init__(self) #call Sprite initializer
            self.image, self.rect = load_image('fist.bmp', -1)
            self.punching = 0
    
        def update(self):
            "move the fist based on the mouse position"
            pos = pygame.mouse.get_pos()
            self.rect.midtop = pos
            if self.punching:
                self.rect.move_ip(5, 10)
    
        def punch(self, target):
            "returns true if the fist collides with the target"
            if not self.punching:
                self.punching = 1
                hitbox = self.rect.inflate(-5, -5)
                return hitbox.colliderect(target.rect)
    
        def unpunch(self):
            "called to pull the fist back"
            self.punching = 0

    Here we create a class to represent the players fist. It is derived from the Sprite class included in the pygame.sprite module. The __init__ function is called when new instances of this class are created. The first thing we do is be sure to call the __init__ function for our base class. This allows the Sprite's __init__ function to prepare our object for use as a sprite. This game uses one of the sprite drawing Group classes. These classes can draw sprites that have an "image" and "rect" attribute. By simply changing these two attributes, the renderer will draw the current image at the current position.

    All sprites have an update() method. This function is typically called once per frame. It is where you should put code that moves and updates the variables for the sprite. The update() method for the fist moves the fist to the location of the mouse pointer. It also offsets the fist position slightly if the fist is in the "punching" state.

    The following two functions punch() and unpunch() change the punching state for the fist. The punch() method also returns a true value if the fist is colliding with the given target sprite.

    class Chimp(pygame.sprite.Sprite):
        """moves a monkey critter across the screen. it can spin the
           monkey when it is punched."""
        def __init__(self):
            pygame.sprite.Sprite.__init__(self) #call Sprite intializer
            self.image, self.rect = load_image('chimp.bmp', -1)
            screen = pygame.display.get_surface()
            self.area = screen.get_rect()
            self.rect.topleft = 10, 10
            self.move = 9
            self.dizzy = 0
    
        def update(self):
            "walk or spin, depending on the monkeys state"
            if self.dizzy:
                self._spin()
            else:
                self._walk()
    
        def _walk(self):
            "move the monkey across the screen, and turn at the ends"
            newpos = self.rect.move((self.move, 0))
            if not self.area.contains(newpos):
    	if self.rect.left < self.area.left or \
    		self.rect.right > self.area.right:
                self.move = -self.move
                newpos = self.rect.move((self.move, 0))
                self.image = pygame.transform.flip(self.image, 1, 0)
            self.rect = newpos
    
        def _spin(self):
            "spin the monkey image"
            center = self.rect.center
            self.dizzy += 12
            if self.dizzy >= 360:
                self.dizzy = 0
                self.image = self.original
            else:
                rotate = pygame.transform.rotate
                self.image = rotate(self.original, self.dizzy)
            self.rect = self.image.get_rect(center=center)
    
        def punched(self):
            "this will cause the monkey to start spinning"
            if not self.dizzy:
                self.dizzy = 1
                self.original = self.image

    The chimp class is doing a little more work than the fist, but nothing more complex. This class will move the chimp back and forth across the screen. When the monkey is punched, he will spin around to exciting effect. This class is also derived from the base Sprite class, and is initialized the same as the fist. While initializing, the class also sets the attribute "area" to be the size of the display screen.

    The update function for the chimp simply looks at the current "dizzy" state, which is true when the monkey is spinning from a punch. It calls either the _spin or _walk method. These functions are prefixed with an underscore. This is just a standard python idiom which suggests these methods should only be used by the Chimp class. We could go so far as to give them a double underscore, which would tell python to really try to make them private methods, but we don't need such protection. :)

    The walk method creates a new position for the monkey by moving the current rect by a given offset. If this new position crosses outside the display area of the screen, it reverses the movement offset. It also mirrors the image using the pygame.transform.flip function. This is a crude effect that makes the monkey look like he's turning the direction he is moving.

    The spin method is called when the monkey is currently "dizzy". The dizzy attribute is used to store the current amount of rotation. When the monkey has rotated all the way around (360 degrees) it resets the monkey image back to the original unrotated version. Before calling the transform.rotate function, you'll see the code makes a local reference to the function simply named "rotate". There is no need to do that for this example, it is just done here to keep the following line's length a little shorter. Note that when calling the rotate function, we are always rotating from the original monkey image. When rotating, there is a slight loss of quality. Repeatedly rotating the same image and the quality would get worse each time. Also, when rotating an image, the size of the image will actually change. This is because the corners of the image will be rotated out, making the image bigger. We make sure the center of the new image matches the center of the old image, so it rotates without moving.

    The last method is punched() which tells the sprite to enter its dizzy state. This will cause the image to start spinning. It also makes a copy of the current image named "original".

    Initialize Everything

    Before we can do much with pygame, we need to make sure its modules are initialized. In this case we will also open a simple graphics window. Now we are in the main() function of the program, which actually runs everything.

    pygame.init()
    screen = pygame.display.set_mode((468, 60))
    pygame.display.set_caption('Monkey Fever')
    pygame.mouse.set_visible(0)

    The first line to initialize pygame takes care of a bit of work for us. It checks through the imported pygame modules and attempts to initialize each one of them. It is possible to go back and check if modules failed to initialize, but we won't bother here. It is also possible to take a lot more control and initialize each specific module by hand. That type of control is generally not needed, but is available if you desire.

    Next we set up the display graphics mode. Note that the pygame.display module is used to control all the display settings. In this case we are asking for a simple skinny window. There is an entire separate tutorial on setting up the graphics mode, but if we really don't care, pygame will do a good job of getting us something that works. Pygame will pick the best color depth, since we haven't provided one.

    Last we set the window title and turn off the mouse cursor for our window. Very basic to do, and now we have a small black window ready to do our bidding. Usually the cursor defaults to visible, so there is no need to really set the state unless we want to hide it.


    Create The Background

    Our program is going to have text message in the background. It would be nice for us to create a single surface to represent the background and repeatedly use that. The first step is to create the surface.

    background = pygame.Surface(screen.get_size())
    background = background.convert()
    background.fill((250, 250, 250))

    This creates a new surface for us that is the same size as the display window. Note the extra call to convert() after creating the Surface. The convert with no arguments will make sure our background is the same format as the display window, which will give us the fastest results.

    We also fill the entire background with a solid white-ish color. Fill takes an RGB triplet as the color argument.


    Put Text On The Background, Centered

    Now that we have a background surface, lets get the text rendered to it. We only do this if we see the pygame.font module has imported properly. If not, we just skip this section.

    if pygame.font:
        font = pygame.font.Font(None, 36)
        text = font.render("Pummel The Chimp, And Win $$$", 1, (10, 10, 10))
        textpos = text.get_rect(centerx=background.get_width()/2)
        background.blit(text, textpos)

    As you see, there are a couple steps to getting this done. First we must create the font object and render it into a new surface. We then find the center of that new surface and blit (paste) it onto the background.

    The font is created with the font module's Font() constructor. Usually you will pass the name of a truetype font file to this function, but we can also pass None, which will use a default font. The Font constructor also needs to know the size of font we want to create.

    We then render that font into a new surface. The render function creates a new surface that is the appropriate size for our text. In this case we are also telling render to create antialiased text (for a nice smooth look) and to use a dark grey color.

    Next we need to find the centered position of the text on our display. We create a "Rect" object from the text dimensions, which allows us to easily assign it to the screen center.

    Finally we blit (blit is like a copy or paste) the text onto the background image.


    Display The Background While Setup Finishes

    We still have a black window on the screen. Lets show our background while we wait for the other resources to load.

    screen.blit(background, (0, 0))
    pygame.display.flip()

    This will blit our entire background onto the display window. The blit is self explanatory, but what about this flip routine?

    In pygame, changes to the display surface are not immediately visible. Normally, a display must be updated in areas that have changed for them to be visible to the user. With double buffered displays the display must be swapped (or flipped) for the changes to become visible. In this case the flip() function works nicely because it simply handles the entire window area and handles both singlebuffered and doublebufferes surfaces.


    Prepare Game Object

    Here we create all the objects that the game is going to need.

    whiff_sound = load_sound('whiff.wav')
    punch_sound = load_sound('punch.wav')
    chimp = Chimp()
    fist = Fist()
    allsprites = pygame.sprite.RenderPlain((fist, chimp))
    clock = pygame.time.Clock()

    First we load two sound effects using the load_sound function we defined above. Then we create an instance of each of our sprite classes. And lastly we create a sprite Group which will contain all our sprites.

    We actually use a special sprite group named RenderPlain. This sprite group can draw all the sprites it contains to the screen. It is called RenderPlain because there are actually more advanced Render groups. But for our game, we just need simple drawing. We create the group named "allsprites" by passing a list with all the sprites that should belong in the group. We could later on add or remove sprites from this group, but in this game we won't need to.

    The clock object we create will be used to help control our game's framerate. we will use it in the main loop of our game to make sure it doesn't run too fast.

    Main Loop

    Nothing much here, just an infinite loop.

    while 1:
        clock.tick(60)

    All games run in some sort of loop. The usual order of things is to check on the state of the computer and user input, move and update the state of all the objects, and then draw them to the screen. You'll see that this example is no different.

    We also make a call to our clock object, which will make sure our game doesn't run faster than 60 frames per second.


    Handle All Input Events

    This is an extremely simple case of working the event queue.

    for event in pygame.event.get():
        if event.type == QUIT:
            return
        elif event.type == KEYDOWN and event.key == K_ESCAPE:
            return
        elif event.type == MOUSEBUTTONDOWN:
            if fist.punch(chimp):
                punch_sound.play() #punch
                chimp.punched()
            else:
                whiff_sound.play() #miss
        elif event.type == MOUSEBUTTONUP:
            fist.unpunch()

    First we get all the available Events from pygame and loop through each of them. The first two tests see if the user has quit our game, or pressed the escape key. In these cases we just return from the main() function and the program cleanly ends.

    Next we just check to see if the mouse button was pressed or released. If the button was pressed, we ask the fist object if it has collided with the chimp. We play the appropriate sound effect, and if the monkey was hit, we tell him to start spinning (by calling his punched() method).


    Update the Sprites


    allsprites.update()

    Sprite groups have an update() method, which simply calls the update method for all the sprites it contains. Each of the objects will move around, depending on which state they are in. This is where the chimp will move one step side to side, or spin a little farther if he was recently punched.



    Draw The Entire Scene

    Now that all the objects are in the right place, time to draw them.

    screen.blit(background, (0, 0))
    allsprites.draw(screen)
    pygame.display.flip()

    The first blit call will draw the background onto the entire screen. This erases everything we saw from the previous frame (slightly inefficient, but good enough for this game). Next we call the draw() method of the sprite container. Since this sprite container is really an instance of the "DrawPlain" sprite group, it knows how to draw our sprites. Lastly, we flip() the contents of pygame's software double buffer to the screen. This makes everything we've drawn visible all at once.


    Game Over

    User has quit, time to clean up

    Cleaning up the running game in pygame is extremely simple. In fact since all variables are automatically destructed, we really don't have to do anything.

    pygame-1.9.1release/docs/tut/chimp/chimp.py.html0000644000175000017500000002470310736670674021552 0ustar vincentvincent ~/src/pygame/examples/chimp.py.html
    #/usr/bin/env python
    """
    This simple example is used for the line-by-line tutorial
    that comes with pygame. It is based on a 'popular' web banner.
    Note there are comments here, but for the full explanation, 
    follow along in the tutorial.
    """
    
    
    #Import Modules
    import os, pygame
    from pygame.locals import *
    
    if not pygame.font: print 'Warning, fonts disabled'
    if not pygame.mixer: print 'Warning, sound disabled'
    
    
    #functions to create our resources
    def load_image(name, colorkey=None):
        fullname = os.path.join('data', name)
        try:
            image = pygame.image.load(fullname)
        except pygame.error, message:
            print 'Cannot load image:', fullname
            raise SystemExit, message
        image = image.convert()
        if colorkey is not None:
            if colorkey is -1:
                colorkey = image.get_at((0,0))
            image.set_colorkey(colorkey, RLEACCEL)
        return image, image.get_rect()
    
    def load_sound(name):
        class NoneSound:
            def play(self): pass
        if not pygame.mixer or not pygame.mixer.get_init():
            return NoneSound()
        fullname = os.path.join('data', name)
        try:
            sound = pygame.mixer.Sound(fullname)
        except pygame.error, message:
            print 'Cannot load sound:', fullname
            raise SystemExit, message
        return sound
    
    
    #classes for our game objects
    class Fist(pygame.sprite.Sprite):
        """moves a clenched fist on the screen, following the mouse"""
        def __init__(self):
            pygame.sprite.Sprite.__init__(self) #call Sprite initializer
            self.image, self.rect = load_image('fist.bmp', -1)
            self.punching = 0
    
        def update(self):
            "move the fist based on the mouse position"
            pos = pygame.mouse.get_pos()
            self.rect.midtop = pos
            if self.punching:
                self.rect.move_ip(5, 10)
    
        def punch(self, target):
            "returns true if the fist collides with the target"
            if not self.punching:
                self.punching = 1
                hitbox = self.rect.inflate(-5, -5)
                return hitbox.colliderect(target.rect)
    
        def unpunch(self):
            "called to pull the fist back"
            self.punching = 0
    
    
    class Chimp(pygame.sprite.Sprite):
        """moves a monkey critter across the screen. it can spin the
           monkey when it is punched."""
        def __init__(self):
            pygame.sprite.Sprite.__init__(self) #call Sprite intializer
            self.image, self.rect = load_image('chimp.bmp', -1)
            screen = pygame.display.get_surface()
            self.area = screen.get_rect()
            self.rect.topleft = 10, 10
            self.move = 9
            self.dizzy = 0
    
        def update(self):
            "walk or spin, depending on the monkeys state"
            if self.dizzy:
                self._spin()
            else:
                self._walk()
    
        def _walk(self):
            "move the monkey across the screen, and turn at the ends"
            newpos = self.rect.move((self.move, 0))
            if self.rect.left < self.area.left or \
               self.rect.right > self.area.right:
                self.move = -self.move
                newpos = self.rect.move((self.move, 0))
                self.image = pygame.transform.flip(self.image, 1, 0)
            self.rect = newpos
    
        def _spin(self):
            "spin the monkey image"
            center = self.rect.center
            self.dizzy = self.dizzy + 12
            if self.dizzy >= 360:
                self.dizzy = 0
                self.image = self.original
            else:
                rotate = pygame.transform.rotate
                self.image = rotate(self.original, self.dizzy)
            self.rect = self.image.get_rect(center=center)
    
        def punched(self):
            "this will cause the monkey to start spinning"
            if not self.dizzy:
                self.dizzy = 1
                self.original = self.image
    
    
    def main():
        """this function is called when the program starts.
           it initializes everything it needs, then runs in
           a loop until the function returns."""
    #Initialize Everything
        pygame.init()
        screen = pygame.display.set_mode((468, 60))
        pygame.display.set_caption('Monkey Fever')
        pygame.mouse.set_visible(0)
    
    #Create The Backgound
        background = pygame.Surface(screen.get_size())
        background = background.convert()
        background.fill((250, 250, 250))
    
    #Put Text On The Background, Centered
        if pygame.font:
            font = pygame.font.Font(None, 36)
            text = font.render("Pummel The Chimp, And Win $$$", 1, (10, 10, 10))
            textpos = text.get_rect(centerx=background.get_width()/2)
            background.blit(text, textpos)
    
    #Display The Background
        screen.blit(background, (0, 0))
        pygame.display.flip()
    
    #Prepare Game Objects
        clock = pygame.time.Clock()
        whiff_sound = load_sound('whiff.wav')
        punch_sound = load_sound('punch.wav')
        chimp = Chimp()
        fist = Fist()
        allsprites = pygame.sprite.RenderPlain((fist, chimp))
    
    #Main Loop
        while 1:
            clock.tick(60)
    
        #Handle Input Events
            for event in pygame.event.get():
                if event.type == QUIT:
                    return
                elif event.type == KEYDOWN and event.key == K_ESCAPE:
                    return
                elif event.type == MOUSEBUTTONDOWN:
                    if fist.punch(chimp):
                        punch_sound.play() #punch
                        chimp.punched()
                    else:
                        whiff_sound.play() #miss
                elif event.type is MOUSEBUTTONUP:
                    fist.unpunch()
    
            allsprites.update()
    
        #Draw Everything
            screen.blit(background, (0, 0))
            allsprites.draw(screen)
            pygame.display.flip()
    
    #Game Over
    
    
    #this calls the 'main' function when this script is executed
    if __name__ == '__main__': main()
    
    pygame-1.9.1release/docs/tut/camera/yuv.jpg0000644000175000017500000004721111206577570020603 0ustar vincentvincentÿØÿàJFIFÿÛC  !"$"$ÿÛCÿÀð@"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ÝÔŸìö2¾qåÄHúâ¼ÌÄ3Ë ×yãiŒZ$ázÈëÇçý+ÏÜ6îA­²ˆ{’‘åqþ%<\(Úüªÿ{ÿ$M>ˆ„ò®ành y³6ªÚ[ˆ•c”e$z{Õ„-osÇ̧¨õ¯I¹s^ Æ4aÛ¯‘±ùs$Ñ «61ïéD••‘q·““Ó*mÂ?)‘ñ¦?˜L‘¼yüúÔ®kš:q³}_O?ø$D26Ó÷‚=«©Ðæ[«,çtc+ÏoOçå\ÐÉnˆßnÕ6vmoAÚyÀ=}Gåü« E'Vº=L‹&7~äôב¹p˜S’:Ò@K[©n¼ƒý*åìjeNU‡ù5JD¬™Àa= qB\Ñ>öptêÛåþ@›–L‡¥IŒ>xçÚ£·˜­òíŽjWáAÁ8«}´OÈ©© kvÀåFáõäÕŸÈͧFJâ>„U=ü«ÄLÿyáÿê¢kš‹G¿s§>OÓõ:‹~%>â°¼`». ˜d¤¡ã[hvȵOÅÏsf6à¢ä·8#§#éŠó)>Z©³ÞÌpM~g*Ì¢^^™â§‰|ÆÀÈÍÕ꿇~*ª«…Üì ^ g‚3Çó8*r0P† Æ^‹Il|nKÖW@û̈®¸Ãqê*}6åVu…á%NgcÓ’* â‘¢óº#z¶:zŒûН)h¤ Œ• …õêJN*HôéZ†%ò|;ÛñÓúF®¯qo=¾ñòÜ¡ Ás‘žN˜éïTÒÝå2ÈáäŒzñœÕ]ÈÓ–¨9#ëúæ·n®ï-t¡jmʾÝÄžC@¨iÓ´btº‘ÄóKk.Û¾ŸŽÿ3&`ËUdr1éSÈcŽ’¹É9ãü?*®»l§wžÕ-ÃÆûÙÛeG|qü¿Ï­ËFRm>¢Û£ÝÊÂY˜ùùŸ-Ï¿4—qÚúýô»²$SŒtêÈ÷¥¸¹y"Œ*yeAQ³y?Óúû‡©"CGÞ@ùÀã¯?ãÿצEpbVfÁ8<ûzÒ ™Ý¥`OÌç'õ¦ùQ™Hl:0úTô´ib)Í'NZùéýuül í²H×pyr~¸üêÝ…ÄVÒU‰€#%p?L賂$N ¥‚üÃ?SÅRóÒ)˜@dPn§i]Ê6±êNºÂ>oŠþmZ”nÇb„¬6Ï0—j¡ˆê ätí\´33+í‘À#<¶ÓÞ¶¢¼g°òÊ9#© ‘ŒŸJç•>]ŽúU”©{E¡~ktòUÙ·HÜ|ÕrÚ$‚>8_zç$²œÆ&¥Ï@üêo<‘±HŠ5w9è¬åÖäF²»º²ètjÁ†T‚=©Ž„°+·Á†Y2Ò#Ž «uÌôgKK ÐªŸu1ŸAN¢˜ÊI.}ÁÁ¥¸ŽCÇ×"µ[‹9Çä?­rJ͸uÎkwÇ2«êÂ>ñFúÿZÆ´´è3Ô ú¼¾¸tÚó?žøž«Äfõ=íKî²üÍ\,щ1"ŒÏëI ™ÑⲌ¯øTÑFð¡q׌0è~”³*ˆÞâ2HÇ?ýjÒöZ|ŽøÐ|¼ÒÞÚ¢½º4±´|o®•I"™! 3æ§QÿÖ§©V…§R±µ‡â9¦LùTš>¡¾aïO™ó B0†®ú~üÑ ’ p6ÉÔÙ#(x<ƒ•aS¸_‘¿Æ>‡5iŒýådÁǧZËÚê%ùÆàãóæµ”a¡ªÆ+Ðàãßÿ¯ZRzµÜóómÓUñgJ*}é5‹O¶ÙˆÃ"Cã#=?­Cc'§Dýö€~£ƒVî\¥‹ÈJ®ìgïÖ¼i§ iºgÓC’µs|-\ä’ÝÚG·Ë߻ “Ž ~M7¬¡•ç “ßúV†§©Þ:,qqŒ·±ßÿÕYR„™P–Rq€~éô5éSm«³åó O ã½¼Þ_/Ĺy4ÎWc·%·c··ÏçL˜%¼¡ãd•°Yr1Ï·CBÙ™“%Iäœ~TÖðÓ¡[Ñ$ÿ:’Ó¡¿"­ ßšk¿—‘wH´7¯"”ŠCróžÃ§éRI5Ç’¶î€·sg Œã“ì:ûTÞè´w8\ËL`|â¬x¹¢DÔ§šI\w#ó¬ï[”îO§ªÿ5׺±ÎÚæ8JáHNœ‡Ì(ûU€RNà1ži–ß/™»§r=éávÛÇ”x#¾k®ZŸ.éÝóßú¹n y'O,ùjy$€LsÓðÍZÓtøî¤*¯¤d·acƒMŠ 1h¶êÊ€0z çœÿJÐðõÅ¿–JÁ²FÎO\‘Ûjâ«9¨·±ôXL 8)jºô×·åÿÌ¿Ó@6ãÆŽúvéÚ©OåÄŠ%\Í·•lt<û}•j\]´FH¤‚(üɘ¹öëŸåÏ5‹,sM´¤D#g–ÇŽ¿ç5µ+¿ˆä­F›Šù__ëmÄY…,ÀƒÎ}jG Fcb¬=¹ü³š¨ÊwÊ_áÆ1ÅL…B© {ËÞ®p×C†Ž"4å{ièI®Sç Ï­ Íû¶RÄdàjf¹$„Œªd ìïÀíÒ£Õeß÷ʃ°Êö{t]*ºJ×Þ=BÆ" dqœçßšÐÓ¯Ì2àD»O]§š¤ M(ýáó7IR2zôüU©ä¶t8¶ÉüE™¿,VrièÑïåøªtaÉ}ýüBi®$%™7ÅŒê?ý€¢Ú ?=Dä3/E1žxúÔZ\(0™ez(àÿŸ¥Xh„-—2\pyþ¥a%m‡ujRRÝP¶åÈŒ ô"ŸY–ºœm¶9]Ã*ÊA¬Í+*«¦G®ãþÌàӱѦ®™j¢¸i?t7ù÷31šDÚzd`Õ{‰ãÛû˪Oñ'ô§;šXóÝ~S>·väðd }ùTÈd, £$ŽÕ]Ë“É9&¯hÌêîês‘‚ ×ÙÓ„¡IF=üÍ ,f1Î_i·ú—lçÌ~D‡å'!ðŸð©2c«ò ¹¦Þ["fX[1ñ‘ÝøT¤y±B¬y·Œ÷x~î{¯Å_äFTÀà®Z6àg¸ô¥*!qŒ´n?1éJ:_ ÔõSOá[ìòŸ—ŒîŸZRþ¼Ñ\‰ê¶éäûz]ÆÃ –ò0ØyV>½ëQ4lY{:¶ÖúT£pymØa‹¹úç$’<ˆ²|7¸õþ• ¶E©¸ò¾Ÿç·Ëò+7ûº{WMá럵ØXŸ18ÿ?çÒ¹± ³œ0Êôö«Eɵ½IIù$8oóþ{VxŠ~Ò›]Qݑ㞜þhÿ¯ëCzd )“Ú0séQÄg<|½­ •VE)}EPŒj®vÖÇé\T¦äЪÓTÝÿ¯ëü‰_¬Æj¶¢ƒÉvè@Èü*uØIQ·'Ó½ðx㚤ùZ2¯OÚBQîXÐ5ƒ þãèyÿÓ\ÉhÊ:•À¬ >Ùæ›æÛÈÏqÇõ®‚×î\ÈòÔgnQQTÃÇѯ¸á²¤ÇË‹/ëNE{‹¯;*¨'påŽ@ ý;T¼ÞËœ©.T¤ô«{™¢…·¸Èz1Ïaß vò¥ï#æhÔ«Qý^W×áýlIq$rºR¡WiLÿ“W,±û-ì‚ówr¼õìkB}Ý<;ÄjH’c<ƒþsYº˜xHW`€Ál‚¿ÃéžµÏÍšDõgNXIóV÷“þ¿ÑéÞíÜšvŸl³ÛJ® ð‚Lç§¡éëX·2]O² Á>QÓåü¨FIQ•&®1¸íÎOAÏéMp²0Ú<Ï·Jº+“¡ž'õšj4¥Ê¿ëð-[.yY³å³ aöäc¥*¸e —q c?˜ÁëLh¦6åA'($ Ø=*Ôp4Á1ʹ8ŒdsÓž~¢´rŽýÏ9sû'²ÕýÿÕ‹1Úm²7Hó@Œ˜“vA Ç·5^Î{t¶?¾‘ä ¸vSòŒôëü‡j¥<ó¹ $²ùj6… Âûp~•ÐZ6²o»FKžƒ­sÍ8|Wwì} )ûI~îI$º÷}¾×Cíng9v¹Áb¸öïþ¡cáû¿³•Ù;BŒ· ƒÞ›yoDšÞBÊFpxPsÈ}+jÛQo³FŠD²¿€N;Ò­V|«œ$hº’u·[u½úþ¿‰ÍÜÛKå(8ÚB8'^j ãó~VsÆü玸Òº]จ$K ŽçϽs3 ImJ~ów¾xç öª£UÍ\ãÆà£JMÅÝ>ß}¶!…/2{¨äŽüúQ"Ëæ—@8°r}¹ôý*ç(Ásžu *Î4m¿™NfžQG%Ž@éÍHbxf1º‚W‚¡º{WNº5¼d°1Ï_×5e4Û5mË©=qÞ¹&'ÒÑÈã¥}z™ÖºƒÃhD–»Jàe0Î{’j•¬"ögmÀÉ¿ä+zk(J²®c³¹c^§Ö¤µ´‚ iÎ1’sŠËÚÆ*ësÙŠ«Î¯k‘X:±VVÉ?t¯éÜV —ËC©#äwUú©©FïîÂnØf£Ús¿xÒ4ûÂâå U‡ÉAÐ2“úÓRâ8npÊ¥[®0ý+<ÝÏÒ+Jç˜úçTeº‘®ÑHR€½sÇ­vÆ—5ÅE8hßÞsƒšÖÐÒ9h 9||Ç‚=½ë#i=+RÕºí'œúŠúYj¹S±üוÝWækD\i$Šá#-È?Z[»·¯1œcý“éKûbícþ‘Ô¶õ☎йV—£)ïY¨Ýÿy~'Ô;J;èö×âKŸ><·úÕ?í_¨£eΣŽ:ŒR<,“©‰ù[¿ÓëR?ÍæKÛŽp8ÇÿZ•ÒZÃÅ7u?ŸŸŸõëÜaCqAĨ>\ÿë­>1Ÿß`3ùÔ÷Í0¶øÄ‰Ã©%°~˜?çÖ‡lâqƒ»‰g$îG»suÓþÕuÛVO,t#1·×·ô¨%PÉ€0?•[–‰Ž¹æ¢†É8äá¾¾µi«ÝjMj.îÿ×—õÓÐè4 “w§ù2s,|óýiò&ädc€Ãiþ†°tˆ´»V9À8jè%!›pádæÕ§ìê6¶gÝäøß­ágñGGú?ÐÏuuùòGB{ûUÈËãŸjhU“'çõ©âR0ªx÷¢sºÔôhÒwò(Û#YFh“9ú‘ç]%· kSBª9F8ÿ>•»lÙÃk“ù¢¤te±öU'O³¿ßÿ s¬-ý­?Êg˜O?Ö“Nš(—ɸ!v¾ñ PHã§Nôÿ!:®ß-[*$ž;vúUH(Æw¯8éëÛ×?JŸŠ Ðâ£R¯4·»ü_¢Ø³ªêp@'ÈݘÆF¿?Ÿ5FIÖåü¹O*¸F/¸cÒ¡¹_1ŸjE/»õî:Õ<»–)FT9“ÆyvÔ”ýÓž£Ò²¯xÀô²¾Ib”^ÏB͆.àó81‘ó#dçüšÛŠ8 EDô'z£¨Bdl—@›pwcéþ{W—)ºSë!‡†?ºŽ¡pmc™XC »7'r‚óÿõW9¨i³É$upÝóó7÷AèM(m1ÁE A™Ø~ŸË¥HÚ½ÚÂÈþKy÷sÜœ`u•ÙNƒ÷ORj¾iuVi¯>ÚýâYiÖ’ÉŸ%ǘ[éµHÇ w«Ú]‚‹æÊ±;Àôçñ¬èõ›¸-Ùn2 ‹˜¸#n{‚zþf©©Û|¬êŽß(`@`}yúu÷ëU*UîÎ5ÂS”9UÚÕéoKï×ó;—žVf•0½yÎ*/í2âtlvšãá7÷d*Ò·Þ%Î}Î}\´µ’ÚWk»sm×z©ŸÇ×ÓÒ±xX®§½K:©IFÉõ4äÔÅÀ nÛ<²Kw8ôý+N9„°‡l ÷X÷üëõKXíÊÛB¹,Jœœò8þU{q—V‘ãFeÝ”ÉöïÓ·š¡Ï¢VLo$o KçoÄéf»Hdòd¹xêÄ~•FéãšÙƒ’xóUÏ·¯§jççž#feAoÏx¨LÁØ.çM§†<ûùô«†ÚœU±ò³çI|ÿ¯ÐšI RYb,æŒú~èfY;s×ùÕy$Ù]¹¨9Ýýµ!uP!'®œû•»‚kCŠš’’wLæFs[ºh‰£tœŸ-S Žª{b²-˜‹ˆþUl7Fº¨¦Þo$pv³!êôõïVvV?É©{Òžþ_!±FcdS!Ô{:±…œ©rUÇB{ýjœ4m…<ÏTÀô9}h•7{¿¼ú:. YmØ|2˜%%—pÏ*ÃÓúÐùŽ]é‚§¦zR+g¨$õö?5bȲ)ÆqƒÔ{Ô]_Ïó6pm(ýÌiB…g„Æ:àÿwéŠ{íF,€˜\‘ŒôŸÖ€Í® ºíéÙ†7—‰ûãüóI¦÷ÛúÐN)+-ÿ'þLYÉ-±Ÿ*àcíÀÿ Œ¯Èe~1 ïŸZc_+Ê“3e°éúk1/– í‘}G¯ùö¨Ž› Pw»þ¿¯Å2¬˜-ôÀúŠÚÒçûE“ÀÙ2Eß=EeIC€CíûËZ:  {{™€%òqÆ?úõž!ÅÂìîÉ=´qœ‘ûIßÒ×ûÿ®¥¸Î$ÀnªxÉÁ^àúÔ+ƒÔ{TêHpÀ’Å=Oº£{j& <ËV díÏŸô«ºDžeŒ-è¸ü¸ªè7nLg=4²9mÏXßé\ÕUé5ØÖ›åÄ©2k濦gxÙBÜÃ)!w&3ô?ýzųu$±–nO®HÍt>9ì0ÉŽŒW?_ÿUr¶Ä¼î±ÎiB<ÔS`{ŠiܘŠ@1‚U³Ó?Ò— Ç'‡O^õ:1Æ×Óëòè5S3º#ÌŸë]…cS¥Ièò“Nþ•Î0€p­ÈÿdŠêü:»t¤$`³1Çãé^vbíGæ{Ü/Nøï%úŸÝèRÔTÁ>@ù\ Ž€r;V¾£n%ˆ¹5Ï£”v`ƒîxük <ÕZ~húœRtjù3F6ržÄc§ù÷¦[¯"ŽD øŽ*8ß*HÏÊr)·Gmżê:>ÓøñC…NzF}š'£ýK(ˆÏ£’¨XÆá°?/ë\zD"ºÚfò›fAcÃuÆ;ŸÊ»ML´šDáI.xöæ¸+É%¸m’J*ã%y?N)àÓåq<ìÞT©Uu$›m/Mù–RuØ £©\g5*¢±ß Àä.0{Nõ Àp§opFEX†XçR…@aÓ‚Mo8YÝ=G§îÏ~—ÿ2â$-:œíy2 ãê:zÖc)‰‰Üw«Žx«ÑnóBòÀ6ô=óÜTz‚'öÕAÉdR«¹uÇÿ|(c@É È9ð~´ùÞS2ùÓÑc2Îr1øV—MØÊ*:KáÛÏú†ŒKK©>Íå,…bfûžäc¯ÓùÕ¹mïîíìèMÅlôÿÚšÛU3ÄÃoº6.®þ¾üçÚ¢¼¸‹Ëh-Ñ!’Ln I.Ž+?yËEcéaBœhs9óFÛ|´üoÕyì¼Õ‰À 0:õ;Ô¯!Þ0C¸’èsóϽC$†7òñ»«ÅOi NÎ"uVE݇ʃíNNÎìñ(Tç~ÎKÿ_q³myj‰ä=Œ evíñïô«rI ªF×.ê±Rß>ÜšÄKÉFŸ ‰F×$ÈH$cž?:­u<ÒlD˜¶ÑŒ–Üqø×7Õîï²=ÇšB’j:½v·­ÖÏäiêšã]†E!bç =;f±ò dHY€ üÃÿ­PâMå€ÏMÄ{ÿ3s#<`w5ÓJ ÑØñªcç:ŽU5‘,±¹m¨ «6>Q)Z)o`ÊÄ}:u­Ÿ :Œ† v·ò5zâÁ¦¹iÖc8ÉÜÇå ?„ñYºö•š>‚_ÖiB¢×›½ô9´yŒAÕ¶ôPœ‘푚Œ².Ü“ŒŒœãÐÕíFkU¾ŒÙ¸˜ åÊ…Ü}øävÀ«ÒjÑÁ• ¤d2.ex¹ç$~¦å%kGsÌ«…Rn<ß]ý-ÿQµ‡íQ€eFìÝôçÖ­Ä“ÙÜ„•OÉ&Fäàý ¬£<£( œààsÛJ¹gy°'Îd.yáø SƒùXJ”ãË‘j]ÊtpI˲>î¤eHþb´¯ƒ ×;H*¡Yz6ggÙ¡HA©Ïn ™\ByFäöœ$åÌ™ùž–4T^Ùþçÿ:Jå0ð·O¨ô5?^–̹ ƒ÷†?ŸZuݬ*ø‚Pº1è}¨dÆ¿2¤ãÐäÿ…eÏÚPvg©Ë*mÆzÛ·¯õ ðøÚ…r¸åOLúÓ."Þ<È*w/œ“•,UÇhÈ÷éÁeµ–Br¥Q°AàñŒƒõ4¹œ^º?Á”঵Ö=û_A‘:&i+cüYÏ_Ë­Js·Ê| žÝ*±•f‹b WÜ ѱžžzTÈ_÷rg+ÀnãØÓ”[éò:°•–þ}ÿ¯ë¹"¯Xf8 Ðã¡ÿ W,Ë9܃ƒëI–Þbsò–ùOùíA?(‰Ç |­žœÿ*‡½Íd•´þ¼¿ÉÿIrAÁá—úŠë45+¤À¡þf¹?™,>qÔõÙiÀ >Üå/é^^híM%ÕŸM°ÿhœ»Gókü‰ÈÈÅsú´q[Ìd“!IŠè+ÆÄǦG">Ãæ€N{`×—„›Uî}VfÔ0ò¨Õùu(ÿhXÄf goÝ&£ºÔ-Õ‘g»€ æÑYÃÄÿ<ÓÚ#FÚ2`9¯ZÉ?3姘֜P\­“ÝÛ5å–EØéŒœ“Ú¸©îr3ŽƒŸo'š<µx9wcÈôíŸçUf`ð–`~ò±Ïëô«¡EF÷<ÌÃWjŠ6I[׿ù}ãÌ®O8Éëùš®ïÕR9Ú1šDòYÔ¬’3‘· ŠšÞ8ä`‹+“×@η’G„ù¥¤2xžG}Ë"³‚ãv:~5&¬¡Ì“î=ÿëÔÚ+¸Xî@lä‡ùp>£5nEi¬J;ð¹3þ–ÏC®œ*NRZ½o}4ðåM:6Ê fHôã§N)Ú›Jgx¼Â¹ã=xÿõQi°]Dì¼3`pG×§qOÕU~ÜûvõãÛÖþFôªJ4_6šþhŽ(ƒrY0SÀÏõïQLC~é*¼ôëO¹e†!r@ê wúÕY$wnK`ž…]NJµlì‹P8„:çÆvŒ÷È©/_ljιà¶ÒN;Ôvñ×ÌK·ð«»ïRZZOw(…É÷c.¼ÞrCjü×=\?¶Ÿî­{íþD<®mIJ€ Ÿ“½zuëLšRQ•±î½t'Iû4D×áú”_,•ëŸçŸåX³´#1¢•P:`‚O÷¿úÞôB¤f®…ŽÁËQsi}mÿ } eÛ=²Ä£knÀ,B)ÎI?皂ܲ˵· ýÕÉjar[s(õ÷ížGëN £<31çÏõ¦ì•‘p­ ÒS’³_ˆé¾_%2OÝ ñùÕwˆ…댞6çúgúUœ±ž¦Ì “œ7L3~”¡6Ž¥FÕÆåT™–B¨Ò£q]$wQK§F©%É`0Ä6Oá\ë.…*sÓ>=ëRÆæ+uXn …¡ÎRU%Y¹ö?§ÿ®Šé;4O+¯:WWÑþ' .=ï”ÆCh‚sm0‘sÕ[£{~«2$äZ£¤y% ˜$çבþ5RšGTç…ÏSíWdÕÞÇZ§%gGTô±ÒééwQ¿Û–(‹¼Aãè{jضÒ,LU¬ž|lrÆI7c··zãí¬îK• ¸Ý† zd•³£^Oj¾bD\wÇ|cŽ=*â­Mêá/‘ôy}uV ÚS·­÷¯^¦~’Ë&é|ØÖ6''‘…'ƒÚ–8¢iUQÊŒŒ‰OÆ­ZY²ÚÏ,RG3y{BFrÀs¦k5˜—`ã­{qGÈíýv?,qt)SU#{ëø?/ıy•»“z•,Å—¸#=½icT.½¹ÁCM†Rؾd'{{Ó⛥)• ÍœV¯HòÉ𔹓Ýÿ^CÞØ¶c2îÆù‡>þ¢ž“Ⱦb¸äîSÓ­WmÊÌç!³š°’$¨LàîÏúÅàþ>µ–ïUø›Si¿sÝo§B?²«86í¼Ê¼9ýjPèîÛ”'ïTW¼Ee÷¡þ4íì}*XZ)€3ŽßQ×ê?­Cz^÷_Š +’nåƒÿ!ç1… ŒägùŠPŒ¸Ü¹#üþ”ÚvJ¤® >Ý"§p;ã<ôþF³Ö×:¤Òþ¶õr –ÎGÝjì­[XTt£ô®4 íÜcÇ~ â»X×djž€ òsWxÄú®Wu§ê:¹ÏÈIŒw2ñùWG\ÏÄNŸ?1þ•çau£sÜÏ%(à*8ïoÕ‚yQÂ0ÊïÔ® §Ërœ¯– àžPSU|aMXEÌO‘œö?çé^䢯v~ymiCÙÅY"]Ü»Q»(ps듟j©:²¾°aÆn*ìI…ÞÁÐÔ ñõ ù‰Á;£/™÷¿âª2MšÕqtÒJßÖý øãb7‚F9©ž`«ˆÆÒzàUß*9àÐÂÜ‘ƒ×ÜñTž ê%Œ€:Œõ£Ú)JÌá­EÒ‚—Ù}­ˆÔ—ìǵji÷O#!URãŒtö¬Ò¥r¡0½G95bÐ<3‰•=ò¦õ½Œ°³tj%­¯©,24W  ]܆µZò[Ôq*¦æÜÉ«> 2qÆH¤0Ûœò8©zÉyªÔáR3ém¿Ù÷ÎIïW,í¥“;‘Ê',Tsôª©Ë>Æ%™±»=kQ|Ûhð§ð̪ÍUYYYnqa()ÞrÙq5É:s– Ýq€}óùToê_˜°ñ¹¶~\ È8©“÷Œ6¶ÇÁÜÄ~½¾µj/%·ºhI|»‚ÀäœsÓÐzf±ç·CÓ§JQQv×{ÿ_ÕÆD-îŸìóÜy8Ýó‘`8úŸzHÖ5Œ–—îŽ,ôéþMG©\î¸b%y”ovÎáëQÛ°ÿhµV?™ŠvSíG-ÑØñ<Õ.•Ú½Þ÷]÷éëêG9ÞXù€.OðàãÓšj(PdçûÄàóõ¥²;É4QO¸¤Šp3ôÅG3É:—jd±…ÉöíZrßc–<œÏYjöüá…! Ÿé½OlŽ™4øbó.` ÑŽ9<ðÿ*§½‘€D ?/nž•{Oìîé^„®à2=è•㣈N¢æÓ¿õ×ÓüÅÔ`tÄ[·8rÀ€½9ëVt‹óo0¶‘“ÊÏB‡æ9Á¡.b™ ]]M»| enG8ãë:áaI•":ö!Hþu6ç,_ër‹Dío=×f¯÷ùÐì5dx¢Ki_¼xúè+XÒÚÆçÊIÃŽØ[çÓúÕ]>âà±RǤõúOÿ^º {kǵÌË .v³Þ"¹ýú2÷¥t{¡\ñ,´»DjËöuëûûcPߨcSp°ÙEte$œH@ qÔðEY²Ó&{,±…1¹™NI?¨ÒÛźm…8õÿëÖ+Fž‹_ë©îrÊjÒÒÞ]|»ynF Ž„Uë[„¸cö´ª©bz?ãðëM{ŒQ²\¢´‹’‚æ8¥7pÛJþXd`P†ÎsÇÒ¾Š¥Z3Ž»ýÇä©W¦ôWI^Û­¯¯üÑÛÚÊK[Ü…n¢9F}éUäI#m®Œ‡ÐŒf ëÓñ«V×2ÆŽ7nP8V^¾†«’p÷“¿¯ù™*ŸÅz“þ¼‚9B#î†Ã ŒäLÓ•£xÂ'Èsœ1ãð?ãJ$´š2’ÆÐ·<|ÈÿJŒZHÎ,²†8ÀóSxÞò¼_õò6÷ôä÷—ãþ âÒ¡©`0Ëòåa“×øOøTHñÏ2à¨,rŒ=ý*O.#ó)*ÄlýiOÞÕýè^ÚR©¦¶èÿBv–H‡•")\}Üçñ‘ÄYámËц;{JjÈñ¦Érç…aÓéÿÖ¥°Û¢$7`"³µ—õ©¿µMîôû×õýX³¬’ªÆ6î` “êk±5Èiå^þÜ:í5r@àò:ŠëëÂÍœQöü,“§RK«_¨W/ñÿ¢Û¨ÎNâ?ñÚê+’ñü˜h€@F<û‘þÉ‚þ4Nþ#Ÿ.]Såù£”@©°{zU›hœ“iÀo½ŽOøÔ6±î†ݶ¯aô«„U·;·'\—ŸÆ½z¯[#âò¬7<}¤Ök_1¿¼vÜø¾elãºñQ´»†PnnTçåÀVeU+'B½©Š›æ÷L~]NʯߴK#ÏîÔ)#“ü?Lv§2~çDWîÎ@ô=éPE2F qmÄçsã=éBvÑ“ÉùSi\èT0óMI+¾ßðß×R9c‘B¼NJÿÝ’=Ž*³†Úp~oO_þ½\Œï¸y"—Ë!Ží«r.ÿ,ßfwÛ1DcŒ2ÈéÈíÓÖº!3æª`›¼ïxÞÛéýW ’ÒÙA+¨ ê׈”µ´2g <ûqL°Œå¡qºïÈôÇÐUDo´Œ•!³MÊÒVèt:W¥7'ºWõ_ð,cÛ†‚%ܬd“‘Ó!?úÿç­J×;d(Àí?Â1K'šîGŠÙI陇¦:ööª×r(•‚)^z÷5N*[œQ—Õô‹ôþ¿ÏäIç(À”3Å#ä© C·Þ .Ç{ƒÛšW2äF&Ð2QI {ÿ*QŠ:#WÚ¤¹I) òÝâhÃÇ•v Ôg‘Ó «z«ê2íPÒ`rÔ0zúzU) ïïfT”Ã9àòr°àvô¦ØM%¼Þd ÈW£ƒÒªIÊÏS¦§LyÓ·o-:g²’ÞêE–9ã‹ø|á°ýpzþáN’8äqnÁÁ$¹S‘Žxã𥽺šDÿJgœä—Pyö?€¨ãïW\‡#9<FF?,Vw“Õîv·ï8¥§Ÿo—Ëþˆœ‡Ó§µ:0 _ÔãTÇ7!—€F:rùúÔgòòᘧ§*3î3š—$÷ÜÅaä­Ê®»–u¬[OŠhç—í¶H¬xq×TšN³²M4‘5¹8peUqלg}ÍB®½sŽýniJûQ u!F?•MçÉÊ™ëÒ£IÕS¨´ÓEÕ®¿>¦˜Ó¢µ»Âü3)ÏÌ»{sÉ8ÅZ¸º¸{?Ú6ÜÆ0c‘F1íŽ+% I*zó‘úb¯©2Z*Ë3FJÿÀf³kTå©ìѧB?Á•–ö¾ž]nŸÞ¼øIÙm²Ö-æ¨,À/^Ƙu™çÚÅ”£uØJ•üHÿ9¬YQµUš>˜+éN1ÄñåØõ#ñéÔU{ QÕ"þ±VOÞWDÚ›†™c¨Ž5\ÓŠ‚xÛtlÊ}AÅH÷ÌìóC–n¥)ÒGj6,©‘Ÿ™3ü«Ù§/gÇõ?2¨ùê:‘—_OBUŸ| ÷1$Ø`¡ˆÁ{¥F~ÈÑ•_2&89?0úv4¦Ðb+ˆd;³·;OO­G-¥ÌC/‹žûr?1SbÛ³·áøÍÔ”Sq¾›ïø¯óì³0 IAþësùOÞ¡ Û”úHÅ•1´€XçÜãúT‰q*u“+ƒÁä~F­:žLÅFš}Q!˜ÉF$ç‚Ýqéž´â±H¥’A\þ?…D.#pH@>¨qÿÖ¡¢]ß#dçŒVN6{Yš:ui~b°šù†äcõSNSã»#±äíÆJçfyÁÊŸ¯jÇ  Hê¿áFúþD½íø?Ñš:lÚŒ"U 7e[9è ëø ê«™ðüyÔ£’92¡H#¡ûµÓWÏfo÷‹Ðý…áË„“þóüWãò^ö@1gõ?á]qÞ8ÿøÏs^G“X`ª££ˆiº˜'õG2Ð9*$›…ôäÕ²ñEnH;¹ÇÌ{Õvóc€ä'?LtL†2ecÆIèkוÞçÆáTiIÆ Wß¡0òš±cäs„çóªëp°‘ ˆ4C<…9Éüi'‘NJHcnƒVF”à´¿(öþtãNû†6´¨ÅNígù–¥l®Ð‹á€q‚1éO£a˜¤Œ?C’õúäþU mØ= ê{S ö«~k_bšÜñ^yRü·èËñ\:9I yyÃ"¿ŸÖ¢»‘ž=ÛþPÇjœnçùUEÏ<“ÅH¬AË.HèsÞ­SQw8–eSÙ¸·¿Ÿõ÷é×A>ð„üËžµ¿{$¶öM:·9gß®a7oéÓœ×Q|DºKŽ“î**´¤¯±×•{JÔjÆ7ºM¯ÄÄ·ˆ\Ne{‘‘Ëo<š±>Ÿ>w–ïéOŽ04 ¦Þ­€F àõëǽ6ÜI»ËšU`ÇÝŽýr1XÊRn÷=8*<Š5"Ûî¶¿ÈíôÛÙTF¤“€T‚?V-íç·FòÅŒä¦â§?]¿¦iVU(Ï ²lUÚyÈíŒ g˜2ÂÇ8Rzþf£žRÜôé`°ô,ávýàJ œ,a\TüÄþsQMqŒH¨Œò»Oòâ•£ŽáBDìeQŸ¼NáéÎ?•D²>ÇŠEÀåÃÒˆ­UrNïg³Z¯øqžZ¬ÀɆ¹ÀþU0%øŠ7ÙÿLÈ$~ÿ<ÔÁ+ÞÀg$þua$«îcÛßÛn<ÆJq¦ì­¯õ¹<…Š­ù¹ü©–÷ K ù¶S¯åIGÊG‚Ê7eÆ?Ïáï@‰‘70Ë“ƒÆGçV”mfiyI©Gæ.sœoÈ9$ŸëO2™-€=ÿ«£K#x)ÈÚ"¤XñŒ±$ ß6ܺIÊ>íì[µgeHÈúæœfùÏPIþè?çëU“rí ‚W²€OéHO˜âGc -÷Á9=»ÒP¹Ù 8ÙYýåå¹É#iÏ]ªxÜ rMÿ=‰dÎùô¨Bª¡Äe‘ÚäïQî‚ àŽ¤ob?N+5Ðõš|²jÞ×õØ—¾ Á©/LÛW8Uô¤k™Øå›·<ÓÍã³å£| ¯jÕNßüòæé¸¸ßðõó ,{ñв’È©Yp;cœÓÞHp›­"l®N2;û¥8Ifç&ÝÓýÇÿRäÞðüiÒåwS_ù\ÌÌŒ² óæßÎæ@X–¶Lc¢±ãJWOI±ºçÕV€¶¬ ‡Ç øÊðß•¯¿ô:×:vrOæŸæ,áÝ:t$7øSÄ ø+qÍÐ34Ç‚9XùwŒŒœ¥5­d;BT˜ÇFGæ)ÛÎ~tV?JlÜ€›Qð/=Éíõ©ÑoÁYˆÁà‚GëQÍ}[AJŸ+åI¯]ÈÐðÞ膓Ÿ¨®’°<4ÄÜÈ^0¡çã"·ëçóÝcô~°I÷l+ˆñ¹EÔË–ä \qŽ™®Þ¼óâ ŽuwAœ*Ž~ZYty«[Èˉq † M«ê¿&aO"„ ~n0*HI1€08ÈÍWWeR§%HäjXB±Äjsº{׺ã¡ùÄqNuyÖÏK ,«0 sÏ>ôÈØ<„HØ\úðiÒÂþhEžŠ}~½ª cd-ÐìààÓŠV#^mÚÞ꿌oÛšFÄ$ðA¦uäÅ8m`ÿÓ¥3Æg-- ñä2îËÜ”à‘,üÇ¿8_ñ¨FÑò÷Ï'Ö¦…ZBÊÀ‘G$<çr­®i‡’«.^UrXDѰ„˜ím dzdž•±4ñ˜b=á ×õ’ë%´sDY$HˆËƒ¿óÓò«ÎĈŠJ”äžAã½cZ7I£ì2ºP¦ÚmÞÝvìþZzªÒ `ò·nXñùUyc nZD UÆ Ç\úSî QOă+€;×ñ Ý3\"Ú¶P)ÝçÐâ±÷’AdªNÍ^ývÚ.©ôü+ï ›•vz"‘¦‰Ã|® ð›qúšeìQ]c$´d`/ãš®““÷’‘ŒÖµŒ•ÑÍSROgQ¯Óþf fnQX&$ç'Š}´“ùÏ;C`GqÞiº—È^WŒç`'ÜgŠ›VÓ…”ƒì÷1]»‰Œp8äçÚ—ºß/Vjèâ%Uë÷ºû¬µ#gA‘¹~\t?*R™«©<“œŸaQÉ+ÊÌêŽÅFâH Ǿ4ոœƒ´~´ý“[ññs³Zt}K"á£ÊmùÇN@þ]* ©ÙOîÁÛ·‚r>½zз2¸ßÁxÇj–W[¶BR8Hå€B7{õ§Ùìo*ʤo×b” ½Itã5:L§S&ï]ÜéIå„rè8 áH=¾´Éã–mÛ‡÷qƒZnÈ„¥Nžú–£ FÓÀÎ1úё؎Ã$ÿ…$k…#ŽÀçô«¬RÆB§¾MdÚ;)UOVõ!`w.YpFO$ ]ë8pàûu¨eIaÇîÙ€ÆIÍO€TŒ8Ám+_¡´+^z~F’XÝ3  0¥}Îóû¬}XC1,rxCüª0ÍŒd×£ûå¥×Ýÿø¹T£½×÷ÿÀ/›Iɱ‚FwZgÙ.D»LdsÏ#ІÀ“}yÁ4Žû¤,¤òsSjŸ-×ÝÿÒ5©¸sr½ûÿÀó-½ÓO."'!†1š•Ç”NÕÉ#xÿ†ÜŸŸè?_þµ*îc° ’p(µ[ÚëO/ø'BT¥ïr½|ÿà­Â’Y6ã¯Ì?Ƥ6— çò*¹I™ÎÔ~Oaš‘¢œdŸ#ƒòÔ¹O¬—õó4‡&©AÛ×þ"Û\p¸õ€þtá À@ú8ÿˆ[ܳî*z³REjØÃÍÏO›?ʳ•F¾Òû¿àšF-è þû~†÷†V_6v•‰Â€¿8nçü+n±ü2R`¬FGã[ó8çzÌý'"‡.?>¬+Î|sók×~Qø ×£W™xܱ×îXc!‡þ‚µ¶WügéþGƲ¶ ûËò‘ˆCu*A©âö–==…2'p Ú:Ž¢¦F$nÚ?àKÇ*B®õQœ¹Í;¶ŽIá¡[kñ*¢9m‚6,z`f¬Ä¯+%Ê"ž¨9…"\ÂñbH 'ý3r3øw¦yÌ?ws‚ç Çê*ÒîgM*Nôþvÿ+ƒLÄ»ÈÙî¶ ÷0ʧ!G§PEb½´ñ:³ËŽNEtg61Oêh©+-SÍV¼£5m/ø£ ï&ŠWPÀ†` 2·=qž¸Ç=+)Õ%«=¼¶*wq·—G§wשŸ§é²Og$ÈP„1$?­V’,·”“+ÉØ¦qøqZ²ÝO§ïµ†éš"N~éì1ÍfÈcŽO2' ì>ºTEɶþã|e TÚ6¼Óßä>=±ñ;8 èLbIâ!sÁ¦ùÏ1ùºÈsN·äòÑ à “ùzÕ$âÎâ¥u¥oÄÖŠ+W tX°Çʇš}µ¾œÏƒ<äà“…VRä‘SÀ–ÚNqÚ½)aÚM¹¿ÀùºUâÚnšÓ×üËÑËc›¢†RpFYùä{Sb–Ð Ù†Bñ¹Ï\Ô1ÛM(>\LßAV?³çX‰“ˈrìc%FË_VuAV’÷a¦½¿"7¾e@‘à ¹‚3L{Û†#Ë—ŒþU`򯀻×»÷rh­}67ÄVeÆ:Èçù ›Á¿v ü¿Ìç©N»þ%UÚ÷ü#r¯.„glÒrqÔ±›»ƒŸÞÊOÔóSE{–­½º ç"<ŸÖ˜'žIÀ ØÎpµj3W|© jÉ9¹_×Be¶Dö«dœ3qþsN yúp)?Ï^ÞÚU;ç+ÁûíÏåÖ¤O²®# ò¶rHùGøšË»ë÷Òšµå_W¯Ý£ü“à ¿e•Ð<Ìry8ükZ³¼:AÓÉ  Àü+F¾gÛ­+Ÿ©å1åÁS^A^aâ¡æë—Xc‘)ü¸¯O¯3×ñ&±t@Çï[?te®Ólð8ÅsaéÇÏô2Æèâ nòMD­! y*9>½jk‚ĬQõcÎ"‰”:¼l¹o˜c©õíÅév~{*NR÷VÃÅJボ@“9Þ½ ïA‰¶ï(ÛA«QÊ"áH 9.VØ~ÍÏI¶ˆÞ8Üyoo¥$d+ä`õÈ¥¸VbŒåzÀÁ#éQÊÊýV¦’’8Óœ'.}–×ó;ÂÊTu‘¨m¹éÚŒ ¥_ÐÒðMZV8+Wu%r{)f…³°¨ìk å[u$íã€5ÍùÓÕØ¢±IàzâºMïÒ–$äÿ3QRI%sÞÉù¦Ü{_òþ·9ËÎ._âàTdmQéRj ý®E=7b0qÓ×Óµjy®IVåHtd¸ÆH>ÕwKÔ屉¡eßo't#Ö¨)1ÉžZ™@ož\„#Ž?ýUŒe£G¥Äb(Ëš›÷¶î­Öþ_¡nhâÔ°¸X@þç€>½¹>•PEv qJ­€OôÇQíøqÍ:i^ á³ ‚xÛÛ öç§µ,— )LG „^‡#¯½ IiÐ÷+bpÓÒ¤m5kÛf´ókúû«3;HQŽÞqŽ¢–XfAó¡Ç÷‡çSí‚}Í6ó×'®;þ•%ôÖÉ# NæÀÞCùw¦ÛègEa¤Ú{;Ù¯×oÀ®–æa»YT·Qótè:ôÉ&›“v’'Ž•nvt×Oø&ó¶›JV)&fÎ7 `Õ’!ˆ»W“Tf˜Â佫úẻ½DÙÎvÊ(+ÔwõgšëâªO–‚·¢òî<ê.¬g q§zôªÆGbrÄŸz´mmba¾ëy‘ñùšF–Qä@ªIûÌwÒœ©¯áÇô £þ,µ^w‡êÈü™älLWÎ8üé~Îÿ{ \v^M6i¥rrG¥Ikisp ¬d/÷›U'(«Í¤¿®äû5)rÂ-¿ë·ùAÒ‘³V?Ò£iåvÚ™P{(ÅX6öÑž1€åPqùÒIvÙE…5ÆÞ¸÷52—¯æÍj'Úr·’ÿ Ø­&?4Ì"\_Ë­JŸf€~éL²yú~T‘ÄÃæ¼°ßÞäþT© Þ3¼ñ»«~”šrÝßÓDk P§k+?=_Ýýzv†iqfÉ#ñ«µSGÏödºíçš·_%ˆw«/Sõ¼ ¶šþêü‚¼³Z“þ'@633Ÿ­zy.ª]µ9™Fò<ñšíËcyHù^1¨¡N’}ßè6Èu}¸äñœš»m‹•ާ·ôªLždÛX.q‘Vn¤V+÷;qŒW£$Ùò˜X¸©O§õqªQClV žç"©]´ùy9Å(ãƒ[¥ÐðqˆÊÚhÉÅ΀:°éšµ¦>Ûø D³¯˜–Ý?¥7¤N:QSª¢Ý“}Šänù€.:šé<n¸Î)·V‘ÛÄ;¨fVì§‘Ó¨üCOÔP›¶C’øçŸ¥S TàŽyÆkF¶8jN1rç]]¼µ˜©bzšr‘³æ!¶–(£•”":în£5d9Ç?Ê•ÇFROÞZÿ™(¸ h°ícó»wéËò¨r»ÏŸzL g‘Þ˜ÿ^„ìwÊòŠ$ˆ2àŸ»Ï#Þ­‹Ð!y68ù†OÌU Ž}¨b2YT¨íßšRÜÚ•z”cx=Í{yÌP‰•Š‚>L†íÆCÒ­YÞ^¬ðÌ„ÌT2ÏLçtÆ;Ö R2à†8¿¤Á¦ê$ µk!²màã¸íë×Ò°ª£î´ô>£.Î*TQ§òæ·Îïòû‹gUW™Ùì·ßÚ²ý}:ƒÞ´´fŽô©6QM92¸GtýÝ-¦ºÛ¢òÖÝ6óv§o§¤ „¶Š#Ѫ’}AÅssǧ,èñݹåNúŽ+mü3*Þ¬±I±|Ä™É' ò=ûÔ—Z¼O‡MžSÀgIÔ®³§V”4æoîýNZô3ö˜Š‰ÊNÑóÑ|¿àcV‘°ªXžÀUÖ°ò‘æQû[ò¢[ñK¤K=HäŸÆª’g³1üsBujkð¯Çü„h½ç÷/óhÏm €Ã÷þôœþ”ƺšvq#“œ` jZÄÏ(Lu“O¬yX/ûG–üê9`ߺ¹Ÿø?ä7:¯ãv]—ù˜©npZw1©™cøS’dˆûç“ÿÖ¦EÓeÏÝævè*Th ÈLýöè>‚Šm-_d^‘J_çòþ—¨$NÃϸƉûÍô"9säÚÆQORO${žÂ™å< M4#Îry-ô"9“÷P/—ä“Ôû“XË™»t_rÿ2⤥e¢ü_ù/ëS°ÓPǧÀ„ƒˆÇ?…X¨íWm´Kè€~•%|Gy¶~¿‡%(Dz_W–ݸ•$t%˜·OùÅz‰ OA^e¬RÈÏÐ.HL`Ž}+ÐË­i7åúŸÅÕ%¸x+kÍÿ¶êS´v ³ @62O­#J¢1I¸‘ÐcK›M+„š6‰>g!€QžjV±Wù℺(ÉdåôÎkÓrŠzŸ9†NPäNïm÷ÿ€PpŠP#¹ªÒ °ÛÎx5¡{’ü:ã5Oäpëžõ¬ZµÑçâðí· t!õÇ=ŽiqÆsJFIäsëÞ §µh™ó¸Ø{ÚlJyíÈÏ'óšál6ÐÃ$3SÛ¦§].z0Œmt¯çå÷ÿŸÈT€Iö,eb˜ O\c?Ò–/-Øå¶ç#qŠÓ°·¶•ÕP|Ìœ*ƒÏ' ñÆ?ZŠ’åWg^„j´¢Ìˆ†Ù Àaߊš'ML(çwÞ§¬G.ø'eWù€Vm¦‘|Auåæö •¸Ì‘`ŸÆ¢xj®â¯å¡ôÎ#¢«½Wëÿîõ‘éyní ¦^ê¶h$Ø!þ%BÃô®$Þxv|ý£OšÝSä~¿áRÇa£Î…lõ·‡?Á6@þb±úœ#ñ]|¿ÊçD1ôg·çþv?ÿÙpygame-1.9.1release/docs/tut/camera/thresholded.jpg0000644000175000017500000005617611206577570022277 0ustar vincentvincentÿØÿàJFIFÿÛC  !"$"$ÿÛCÿÀð@"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?øïLŠ õ+X.¤ò ’dI_p]ªXrxé5_±^Imö‹{˜ýä½ ~¸¨àfMî“ùL‚Ap~R£ œçúèÒ#FÁX©%C|¬`ŒöïÏNÝ4Ú)Ò(FdYÐr¹Ç#8äGOÃŒŽh´QEQEQEQEQEÔxÅõh5M*3m#M²Å>T+ (p¤‚…±·ÁÏ¥rõkLÔ/t˵º°º–ÚeÇÌŒŒƒƒê2ŠOa5tzì1­ßÃÛk»‰¥60Û{;WDðeÑŒ­Ë±°A Ý+Ï“ öµÕRÿKÿCtÚÈ#m£p™‰È䜎Ã8®ÛQñ¥Õ–•­˜´ù'3ZÇn¦)‚å]—z©Ø¥„ÊPÀùdå 5çuÕ]™Ò®mÞ\ÝÉÛíïRyD\¬JvÇæF"f`ü—lì7ù‰`<Â13ˆ]Þ Çc:íb;8>Ù?Z•c‚KdX÷‹ Ò4…ÝV=A\gø¸~;ü sR§ž4áŽëdXÈLH­û¬>Áù[Ž@,@99­…{ãËü¯’1´Ç´ð~nJõ?7~GN1KHöóJ×1FñíÛÝ&O;pã©ÉÙ¦ÂëÉ#Ä’ª°&7'kzp}ˆ4Æ\²ˆ\Ø\G—™<1¼Ï/ïìÌ}ð»pijq†=ÂÕ |nª²9eÀ,NP䌼ÎF ï‚Æî$òÇŸ̨eR¤‚ @<ÁÆHϨêl²I+–Fv 98>€° Å(…g1¸‰Ø¢¹Sµ˜HÔn\ýG­>ñ­šášÒ)b€ãjK(‘‡储<ç°¨iŒÛÑ.ô½>¼–fœÅ5´­ÎÆa"ó˜`±%°qƒ•yus{r÷7—\ÎøÝ$®]›$òxRZÈ‘HYÓx(ëŽ:• ALñÁ-̱ËåyvÑA²0å–>aÆwÉöÀô­gr(§Ì".î»T’ÊîÀÜ1“À9÷8Ê(¢€ (¢€ (¢€ (¢€ (¢€ )ÅÜÆ±bŠKÏœdãÔà~B›@‰CʈÒ,jÌvÎÜà 4Ú( Š( Š( Š( Š( Š( §²¸{k„‘$å/äɱˆ óƒ88 Õ-«m”ñ'îÜfDÜ9SÆ0y=ìH9ȵ¨Ø^[Cç^,vò¬‚¶`#™0ŠUš<‚ÞÇ$òy¯gqöc#ÑÙ”ÞˆÁHulÊs÷qÆ:óÆAíµ}Vó\Ó¶½¨\é‚+X®4u+z„),äVlüߌm [q¬å+2$Úg LLþb† NrAÏ#Œ``wÏ#çäÅÄl¼ü S¹EJ)òÈÒ0f P¿*…ÀïÇ'©<žh†Y ™&†GŽXØ2:6HäGCT2ö£ma ²Ç—KYx¦RO›æcÊÎÕÁT<’ÌŽª{!û'˜gýñ“hˆ!áqËÓ©žœ`n}ôK(’Ê¥q±‘FÀ8Q•Àc´)-€I'Žæ$’DWT‘Õd]®Àap}F@?P)-„‚#beGeÚØ ÛNppzÁ#¸ã#­2Š)Œ*Ü0¢Ev&ò‹­º¼d:œÉÓ9ÚNFŽr£­J°’KfÒ(ìe‡iÊG( À ÎÖéÈÑÁÍ&&M•}6¦tÛh’æëi`–ò¤¡€BçiRCÀ$玼U{e¶o7í2Ë#&?. ûŸ°9aïÎ= tZ4žâ}(Z\j,ñ<Ð^¬¢Ú@Dhû;ÑWl¡˜îÏQÐg+½F+ eMVXÖ}¶ï Ü6éQSeÀ…½p3†Â»d¦ÙJq™ÄïbB±\ðHàûdýM2º}CÃpYY&¯¨êvÙ\ÜKéàÎ䣲’¡ÙsËÃn'•Ï^9ŠiÜq’–ÁES((¢Š(¢Š(¢Št… -YFC6NqÉè8ÎxíïÖ›N–I%•å•ÚI‹31Ébz’{šmQEQEQEQEQEQEQEvþð¥ÔöPëW©hlžÝ ÅqXy›pYä9—Ä3XÖ.³i§ÛêRÛN³IE†ÒG•cß·[‡Â•ÎJ“å°$|¤öZˆWWð«§ßß#ßGe.Ð]£šMªÍØüà*Œœäòcæo2GdWP‡]§* ÆAàž‡Ž£Üt&¹éóJR¿C(]ÉÜQZPSj°R Ù9è:‘Áäp8ÏQ@u²±`C’w(Èã#¨Ïç,«ú“{­êqéö(¦Gå™Î5Y`?úÃ$[·evhÝ·&Ó´SsªÉ§Üj}£"n2½Ôm'Ãm?x‚H° NÊøzÖãLÔ QÓ^çI·3£I¼\’C4›öä¨L QÀa“·'uíÂ?Ùš5Û˪é’^ÃfŽ+p "ˆÄ…FRÀ‚wÎw9k(%Y£‚ÃVO6ðG¤mÄHNQ€O˜@Îr6îçÆNJ陯\ÊéŒÔ 7’Ø‹u½¼qfLœ·ÌAäóÉñ¤®"æ…¥ VYcþÔÓl5 >Ù1Œ8ÎÈ㎾™ÁÛL»²Ù|ÖòÜÛ@ëö—H,/‘˜œºm2aÈëNÓn4†Õ¡ûU»ÛYK ûJÞ€™Sµ2/̧æ X+cœÞ³â­nÙ´‹˜L¶·³Üì†@IGšêLD©ùvžÆy⹪Uœ&•´fSœ£$­¹¡kš]¦ˆn­ô›¸¦¶Š9éF,ã¸m¿;ßæpUݰ”ÆÜ­eëÚ¬&ñö†ÞÑ4èRI•–à ʤ##e‹¨V$C&á'Û&ÖÓl‘X‹k3$F›Í??͵¤ùÜøÀÛ—cŒŽ4'ð¥ýżwpCeo5´‘ÜÚÏg>è¥RÏ–T!“œ6ìž•›qŒÝ÷#ÝRgµœ~&¸µ‚x¤·IÞ(<ÈÌâp[bss¹p@É_›h9óÙÜA{=”Ê‘Ï:È­"€ gpÎpOêxÈ®¦êÿUðç[Pº½†îYU”\glr)0]S$eåÎSŽÆ¨A¦ê:…¹™D‘5”÷¢VwffYpíó0S' ýŒÆz”žìÙ>¦}”d¶^\ú‚Au#Wx£Œ ‚¬Êr3ׄ~‹ÈËb„î²Lò$I³#BJ ' É'Ü“WwÜA§Á,–rÀ9Þê0cóA 8']{ŸÕ)Y]XÖ1´ .pHÉ<ž¿UGvÊ@d°™ƬYPŸ”€H§òÊ(ªT­6íå≋F¨¤.Ý˜Ç .8$ç9'¯5]°0“=ØKœE½ :e÷à+¼Œ|ļt`ÜRbe{¹Rk†–;h­‘±ˆ¢,Uxí¸“ïɨ«CMÒ®u Ÿ"Ò9n¿vN`Œ·Ïå3„çü¬?à'hl ²úÀÛK2‰W÷lNÙ0Žcùv>2UƒfàÓ—[ÖÅ*(¢˜ÂŠ( Š+cAÄ+a¨^è³^Åol®ÚÚr„›i X 788'›²vFTˆª‘‘*9uÉ PäŒ޼ÆFïOš6‰Â±BJ«|®`€G õç‘Ô º˜V1 I¹óŒ `g“œñ†1”QEQEQES£’H˜´nÈÅJ’§`¡Æ›@Q@Q@Q@Q@¾´‹VÕ!Òµ nLÜÓÎñ(&!÷;;C€ }ÐEm_Iº†kË«kIdÓcÖ;¨¡o!”9PU‰#À1úšw†wÉ|Ö¢+É£J¶—cna±9?(¾ÂX¶Fã$UÿX/ì¶’XÛÚÏ*´Ót39ÞÀ1 <¸Ôóˆã$ |Äàc&íR×3wæ2ìÒhåD³Š H8I$mÙðNSa%C_)ÆJàä;­.]Xðäöz@¾)kÚ$Ò.nNÉH%™T ÞÀd…ÁpRË’IÄÐ5A1K1 Ûê· ¹K6ºt…P¾[$†8,[|ª€Gpú}ް÷°”{Këb“Ķ÷ÉnÒ¦ä ¹CÃ`3``-e4äüÑ2\Ì›ÀZüž{ Ad³g›2Êa£(¥º‚¤`ýü¥Nîëà -ä·V3›{$/ [¢£0W IªŒä€[ï œ€+œ¿Ó´­/â&ð‹m2öØ0ò‰‚4tÁÛ¹YFrŠßVg /&ªYèëas7,‚{¸%‘üØ‘GÜé¸ “¹%NX°ÉŠ’‹×fÌçg¯s”ñÕä7~*ŽiåKËx­±…ŽÉÂî+ó ù²Ü¡@9\Œo­ŸEeƒì5(„QjéÄvÄ¡f@›‹ó|‘Ê  Äg8\f¸­cPŽøD©ko“¹wÃEæŽ0Ì«ü\òG<Îví…†¥®xrÃO‚)Ö8`‡ Ã+;̧wÄž½‡£–ÉyrèŒÇ‚(ÞËRÓ­¾Ðïe¶1cˆ!l,‡?1e†c$ tÌ» ¹…Ä^TÁÛÌO,&ÖÏ#hnl W¸ëOö’%’ýš5¢‘®‹þöRw(*»@À}ÙÜH# Ï/âý+F½Ö‰­µ!vðÄ&ºÏ›æùËKó” »ò ©geRY‹ !ŠMêˆdÏ1©®m§¶ò„éå™cª’3´ô$uŒõ„4QÁr-ÀE·H—mÄžj–~]‹*±…`Hå…N–W—šŠ°ßßJwIq俘Ó! êÁO·|Ã9<çÒ婵ÆY¬/$)Ü $mæ/Ú P¬øO—?0 °#çÂàdãq{EŸÃÚ=íä^ ±»o´AåÉilË$[YÒTdH0c-뻜 š‡ö†‡k§C<ˬK¿eyl­ÂÆTnÌCkeã Só}Ò¼ì1y¦ÒîI™žÙå–E70 ”‘@Wl¼¬¸ œÔ¹×‘ù‘§¬jðC¦Üèúdû-b¬K,ò4ƒ)+±š0\K(bc¨ÈU8ÝÊVÖ¬4—Ûk©}²ycs<76òFáø]Ûƒ¶çbZO½Œ©ÏPµ‹ZAhT„×—77— swq-ÄÏÒJå™°02O= ~ÙµLA¦E.ôŽ3²6‘c@©æHI$ÆùOLš¦ìŠØ§2ªJè²,ª¬@uÎzŒ€p}À4ÊžKôöµŠDoÞ˜ÑÝÕTó€Kn*¾â=ñÍkZiÞ!°G‡ûRV¸dTV´8wS¼) ‡záX”èJ‚s¶“’@ÝŒ*+£ñ :X¹i|ˆ¬–*4´¤K¬dÚŒ‰)àJí*r¬NK¯ô äÐ,XG§–?¼m„’\\y‚à»|ØÀS·’pàZUE§™<èæ¨«Ñiw ã<–ðKfÛe‚âeŠSÃgj±ˆÛ‚9#ƒTjÓL«Ü(¢ŠcX•<µ ’üäçqNçÛ ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š¹£ßɦß-Ä{ÈÁWûI¸=˜2œ2©ÁÅtÞðˆÕôÉ këöƒ±ÇkçDdB;Õöž$àöÏÝ×7 Í¾µg5Ј۬Ëç #.ÂpÙRxÏlús^»á]),üE®Í4Iô’+LÒÌË¿.@ù 9ès¹èU¡É|FÑÞßS¸¹‰¢K[Íò‰äŠ=¬ø.˼(dÝ UçvXî˜V=½þ±©é×My¤¶¥hÀ,·Ïk$òÛ»,¥åKmÉè9ôÍkCÒïÅÌw±(ááeŽXLƒËÆîêàÚÀ“Èç/ªhW~ÕâÕluhâóg8I£hcs¸2ÄÍɆÇ}‹Ø&U(¤÷3„ÓV{™wWz¼~[;™¼ûkqæÚL¢ExÝ^=§%AÆÉ\àbQÎ@Qèº$sjÞ¶¹ÕJ÷n³Mdor $(8B9câ-@Þîšå¼‹ˆöÛ¾šÑº,eCÀB…^É™Ÿ°ðf­¬·…Äö·0NöÐȉ Ù´„˜Ôm@T ‚ }ây9<…ªÐ÷n·.¢n79éqéú›Kí´ÖókxÒëΑcÛò†ã*íÆ{2à¶ ð̉câxâÛ½¢D&³`îì7a£Þv1?t rq ×¬µ¨ììo5=5­£ò…¼r¶ 7ïc€H :àš‡,‘\jwW–vÖ±²¡y£aœH÷{lcµ€ÎÈ5­íOWsO²tzCâ ˆ¬ïïÎq²{iBíXÏ•›¿Õ’QT‚T àóÔæ–³«&¨²Ç{ªÙÏgM"¤1žF2¯ËæJŠU› ’ƒPü˜k°×ü}ªkÓ_ßÛ¤–òµ±;näeW,‹.ÄXòNÔUÉ `î'²yûØé÷‘ÞOi‘.ò¿fHÚxí£V¥óÙŠ…ÆX©qÚ2¼ôœZ]Œàã+Xµ©?‡µd¿žÊÚíe†9n¦ºº—cÊÌÈåEeå݆Ðp§päVÈñ—fö7vº¯Ú¼°Ïu _g‚8üý­"„L6 eðq—ÊxfÊ; Ó °^ÀÊ)ánL¯ToU<ƒí‚_o,—vQXËpâ viO™*‰ÆDJÄ|Ù,J†ù¸ãåÍjé&–ºÈš;o¾âµ³Ò-í®uéž9n<†FÚ6`§™À|t18 \r¥œzŒÖº´·VÖñ‡a ¬EŒ30!YHÚ@ É'f2xjô?xB ­5/®…Οzì²sZ.öÊ ,ÜK–`>^6×ã ßéײJ4 ‹+{«Ÿ.ÅVA 20 ç{|§ïu €GI£('ìÓØˆJ)ò&rôøc’i’cy$v ˆƒ,Ä𩮆ßC°‰%†êæ[«Ù#†k­ÖH…ʳàb;GËÉ Çå­ #HºÒmŸÄºï†'šgrHcæsär0ÁŽv•d–†Žhæ“H¾{Å´!’Fqž6GrTmW µÎ¹œg'57‡lu+ÍR >ÊâK7Ô£W>b¬ˆr;% Rps€ ž‹¨é:½³éÙvÓlüèlí™ZãË1³LUvïÛòÇ´d ŒŠí|/¢iúe¼wZf”-äÅ&ˇ`èpAûÛ¶¸Wq×8Î+š¦-Å5%©”ë8«5©äPO…ªIk¬x{ý*ÚD9ŠêHeG]‡!aƒ´œüyRÜmé~7Õ4¨bµa†M t‰y,]Ù: 1ã;sÉÅñá¶}`H—·wWý¬ÏM´mAó³nUÂ0bX2’OÂöémZÕ'xàu $iò‰bÃxx‚N Éz ÛÙ*‘M­ýÔTÕÙ¹ªÎdµµ×¬¬¢Lo<Ò´ dpdA,xy0ÌüÜ®@Q³>…m«hƤßßéšÝ¶›ž[—†8¡Eܪª±Á˜+7(û‹Õ³^gáùotËkXC)ÓÜ‹+€ p†hwW(§æ\‘ÇLƒUåÓoæÓm5äßi”Ûǘ©Ú WÆœ2…•¤¥£{ PRÑ—|yg¤Ykû4IwYËoÊ›\y{Ð2Üœ‚?ícµ`VÅ…ï’‹e¨\ªÛ¢¬‘2YAvÊI,FÕä’»±’A^Z³%{$/º}ª_j»œ¹' çŽy膊͚GEb*sˆÂ¦ÆbÅ~pWž<Œcž:ŸL–ÑZSFU÷³ ò¹äpyàc<óÐzä6€ (¢€ (¢€ (¢€ (¢€ ’Ú î§X-¡’i[î¤jY~¨ë¤øqm¥Þx¢+=^8d‚xÚ4Y†\Œ¸êÇ2G\ƒ™K–-ŠNɳ›«öW¶o­.-e+¸$Ñ”b=p{pkªñ½Ö«§xµ.5jżÆU·…Cy,Í™âþU*•†0G´¼;ã}Zy"°Ön,íc»u/n,|Íì®6ñ½US1íÜ£‚ àå†N¬ùT’Óúò3s•®‘À[}¡\Ü[ùªÐbC$yÌ|€#§$sêEz¿…^ÏQŠGÖï‹s¾H"Ž9K¶šG92)eû¬2;jæ£smi¡Ý[YZA©Ào±Ÿl¨|ÛÌENíÇ;˜€ 8U°Øêwº?b׿µ‘?܆C URbeTBŒ§å+ÓdsËWÌ•ŒåS™_bõÖ„³+E>§ª] ˆ‰€¹¢§$†TØ ·Ý' y9"k; k«K+‹»iþа(idóâ<’Åwî2/,ÜnîG"²¥“Xþ×KHní¤œC$œÎcfŒ…¶e_— ‚rj®·¯Éi©ÁصŠåÌ‹ûˆÖ@AÇÌ#XÈ,,JðAÇ$eÍÙ\Ï–L†]+I¾ðô·ú¾±)·±•ÄköI$>a‘¼'̪UH ‚7«·Àj²—W¶°³]ÆLqÍçÄ!@ÜggÊp0 xÚf½¾nn´:î ­ev:to%«? 7¬±ª…N⣡Æz×2ƃªXÝOi—4Ü*!ÿYåXå‘Éæ çn+²1n-Å;4ox²McRÓ/äÖ-¯´ô²•^Ö*GŠMÎÁ‹IÈ$dml…ÆBš«xNÞÎ6²žÐÛ½ãÄ^îk«„ò-"3yl^60d;vïÉÞpÊjÖ­¨I'„ÿ±m¦ŒÉ²yöÒDþrÊo‹žC;JŒ*1à&ßÂo^æžãe‘ Þ¥ª[…‘Ì©yæÈXHwf%,Ê0¸,ª¸çgƚΩg¤¼º~¥„ÂF†(®‘¸;ã»p-É “ÓkW ûD¼·’5a‚&"EIäó'ŒðUÛ8É\‚UT|ÇŽ€wböÉ¿´ZÓfº–éBݾ %†8hS{‡b<ÍÅNF6wàÔK Ô–ž_ÕÉtbŸ1ÎøFÎòÇ\‘.`¹´v m M#¡ $Q‚v1Û!bpØ žwü[wÞ• wZ|‘î¹–îõÌÑÚ\*áL9ebyÛ€‡h!1’5,¼5e¬Cq“¯ÜÚ­Â+”Žb.bÚw XíG¼»æ8 Œ 0¬é<e¡é·š¶£¬ÅqkhäZï`<Ï,„%°²òä© Ä÷PÔÝHJ|ÍÙúký}á*‘rÕê`øwýö“Ãw¦þ9[Úycž@!‘6*»Ñ‹:ýÜ0Æ0µÓ_øÇT»š+Lvs€‰-Æå‚+iŠ|ÑÌ&ˆò¬’†G‘\dš^£0ž žÞÌQΚ{î¹S ‘[î®UÕ³‘ò`gœð«Çc¨ÚÝÜhé©Ç$±Ç´¨˜(bÊWËS´í {g ‹«J¼ž­tÿ‡fŽ*Z²ö¹§JöñëÓYÜiÉu,K%ÞɃÌÎÁ™Àæ þSã%²9Jô Sû2-COÒN©gc¡$¦þxØ4ö͈äV-æ>~R b2Ù]Šp’¬-æÉyh$Äq;}§=€q€ ã9q¦M­¥Ð¨;¢V¶¸L-iº dnFHR7e2=pFì#óÒ_êÃ_‘,–ÒÝ­Ô¦KxRÚæäÇËóA9eʃ~T: ­4ýAµ-6ëLkäšÞ-óE¹U%Èv$wl^Îà]—ŒµŸ 鶉 j3MW bu±* º¸,F `ä0Gš®%û_f£wÿ ýt3œýë[SÆuh¡‚þH ŒÇÆÜ¥Æ8Æ€)ü:Š«[¾)¾ÓuKÑ5´qÁ2ŽI#FH&2!Ë!*6íè0½2k ½ m¸«›Ç`¢Š*ÆQEQEQEQEQE¡áÝãYÒÔ]ÜþA‰d¤•ÚÜr3É@$YõÖü&™“ÅñÛ,{ÍÔDq·~}þæ?ŠŽÐl™»Ev§àûÍ~xdÔ/ã‚ÎÏ1ÛZÚDqåg=X€®GÊHRÕëŒTZ¯€ÞÚK >-Vi-â"º*Ünݲ Tàìó CRW:Ûï&ÊØM%ÌÂVG“¤ÀÁvbpH+ÈãtoÄZ®Ÿ-þ”Çc‰?Ý\ÛïŠêÚ`[)Ë“º†#<ó)Τ´Nß#Š2›z=wÅÚ…üÃnדËqeçbþm€€,oÛàÿà ’Eo|0D1 Ù.>Ì^! (Ùb@p¿9èÙFпñ†ˆ59Ñf[ûKÓmæ¬ö…ãU˜:óµ€k‡·qóY©¤išu­¨µž9e>f¬ I³—AåH˜€Ø]H%ò\gjkWMΟ$•Ÿõý~Fí^<¯CÐ×—,VòÚÉóJèv30R¿¼òaŽKGÊ0KYzV„Ö¼·Ò<2[‚#²£‡ŒeQ&Ó±w(fÃæ\ä)ªx2ñ–ÆuÄŸÊ[¦6îX;R0ÊçCàÀ9®’´ñN™ý¥£\]ZÎäG#Í®A;Nà$@$ã²tþ ŸSîúw2ìí¼Oi4zmÚI™s@³iŠÒ„`»eæl1ÇÌI¬/‰]<}º(&‚*E—SÞÈG( ‚px%ΟN·²¼·R'-+ÉóHCð[Ð.NÑŽŽI$ðßõñ¨ÆºŠ~Ün‘K¬ÎÈ »‚­Ã™#iàçŠÞŒää¿©MÊZÖ‰¿Áõo ‹P“O7aâݳFpÓ,­¹Œ äzp8ÄxÈ–àZ\ß%œo,n²<~bo ´RBmñ%à:vô«–¾ð•í®œ vöÅî$ÄxFÉ<|ÊçvÅbK?(L*‚m"¹ºšWžÆÙ­öȳ݈¹ 0Ô¸§Þ}}x·Ë™ é;ž™i­C}¬-µÁ¸Ž$"âXJFÇ 'ïpe[Žþ£/\ñºi)e•$×ÖçsÈàE(rJ°ÜF Áã9Å;QÕôØo¡Ô#[›ÛkcæËslÅ£G(Wî†ÀèN~aµIrGáë]nÿQ–h”[ª=Ü­“pÚÛ„oò"®ÂÌ€Ã$q\´©§ïIhŒak´lËq¤é>:zçê0]²ÈÖâHüÿ(îa1fa]±üÀ>N9´_ÄÚ&¡àÔÓäF†Îã·¹Ž{…ó™ Ayg ¨AeU=ð3ƒU¸x4¿·_ß Í1V5µŒºÃ±•‹Ä°´:]’£8+œãåKrÚ¯‡u1adÖºuð2™$û×gˆd&v’H@Y‡2‚ª6nÑSŒþ&÷¾ãŠRÕ”´{cE»´»Ó‘Ûí,¾K­ÁÁ Ám¤2\)«~%´x|I}é÷°E~û-šêÝÕÏΤ¿ÎØœ•!ŽîÀ”=?‡¼(–Z:Muyg'ïR[>vžÝÊp¥Ô—ó( –ÈÝòÓõ«í)õ–ðµÝÃêp[2Ê÷:ž«"‡™VL¡a¸€å0I8ͺ±s¼UËç¼´Eojqè–1G§øoT×K$orÎè”*áS>ß¿”麵5Ÿ¶±®-†›§™æ³›[íÉß8dH*îŠ<Õø•I´uOxze³ŠD–Â̈¢Ýrî͆ä!¸X ÿx{Z ¶~ÔA¶†7ÔnK(š$@@21LžPíÉÚXqšâ•Jr¼’¼¾çÐÁ¸KÞKRÍ…•î—*ø~úÚ+Ñ QÛ] Y¢`™S‡21gŒaW …PTnäW?¨iGLðõúøš×íT$ðÚÄ1µ‰-碳üÿ(ÌŠ -Ž›™{/¾£eåj:jÚ4Œ¾O’b?¾veÀäa›€xùLäWñö™u«ÛÃhoRÚV†vŽÑŸn“heCŒm œ€H'Œæ)Ôm«½ùéçý~dB¥š»ÑžQ©ês>¹º‚×Ϙyê©‚cu%C83+æ0I;k_SÑ`¹ð¿ö†ûn¬ãZO·6ë¥* ~êP |€•Á¶ªAR;-[BVµ¿‹CM%­•fŠõd´ *f=ÈªÑÆwª–G²£æ=sYØOâ+}:MËM’_º±þöÖWAæ)xŠG¿8ÜÁm­ò¶ÓÐñ+G-ù.ÿ#j¹O'³¹šÎò»wÙ4,‘¶Ã)È8<GzÑ—Ä:•ÈoíM@˜L(n“ÊR›r€œ+}ÖÜì¨9å³£ã-x{ZšÒÚâ‚9$…U·.ÀÅËžQˆ%<ðÅs“µ±DE*0ûÅä ʽQ›qïÁ±'º.R’Fé©j6eT•ÑdYUX€ëœ0õàû€i”Q[QEQEQEQEQEQE×ü+±’o& ³B‰k¹J»aÝž9 ;‘‚O°&¹ í>‹u²Õ®¯6%­±ŠW›íRBñ²¨*–'qÈëß8¨«ð2*?užƒxn´ý=äM^Xæa½® º¸X³€ªyÀÜÙÈb]›_½¸Š{ëûøt»sk#P±¼qÂͬsµŽÖ!K2õàÇU©Þ_êqË£ék öÏw¨N뺲»s÷pcÚ÷<Š‚ËKµÕ¬›ÄwßH íëqy¯åTÜd“h l3Ì`cï×5;SÕ˜Ár+³'Ã^#ŸJ£y¦0¤nÛnëy‹+³FwgpùÉ$ 0û‡ÐõÛû'‹O°Ó¡•Wí’‘jD *‹— çB—“†$€¬G0ÐÈ]­’XšFw‰·’dò R )9‰9#ì‹.á‰/’Ö/´ù±B³JÇQ”ß ªf2 S Ú¬¬všÒ¢IÞ;²æ’w[³ž3jVÄh‰uwq$s³C u0Ü,Œ£ Ê–ùW.¤ò Ö­¿‹¼Ïbðcç$6IÎp9KM¶:. l´Ç‚9w´?é¥`–/Þ6äpÌ!R¹9 °èk–µK¥w}¿¯é·Ì—[§ˆ'5Æ»«ØEpÊÆg2Ɉ÷ÆïWù‰n¸À"3:OÆÚ¾,0M¤GS±7adU§,YJ’Àœ>샓´sóbì2ø~ì==jhíbŽñì–à<&bfk A%Šàe· ýÜ/Å™4ooil÷Ç*]Ïi.ƒ”R"%[;Ëã:j¬:Q¨’Oþ5üÿàk”ŠWZŒ×>ÓôÅ[}^ýb7\ 8Hݱå º"j‚1ÆLv:Ž„¿hx4¸ZûcÉaqz ’$ÜJ”Ý&8Ã7ά/†Z]Τ—?eÖí¢1Âþ‡Y#—fÕY$‹€Äò~aÀ³d÷—Ói÷>¼ÔF¦-dtÔ#‘eXÓ<Í;+acu)€¤°è +tRtãÞïQ¹jâÍ>}BÇQµ»¶ñ Mc ¡ ¼·I£'.ÞË nr.Sx?|E©iÁn/tý#˶]Ö¤7 .¡ ûÏ/pÚøÌaŠrx"¹+;©<ªˆ%ÓeÕa†¸ŒÍöí!Xä#Æ @™=HN^{ßMâ+ÄÒ¬iSZ$5ÊÜ)1Bí»Íb[(1 ɉ 9Ýɹ©Zñïýkø:w’•®»“é¶Þ*Ñ59ÞëS‚6ki®ã•gYá`qƒš¿2}â»»“T¼Sã[êK ¬ÂÑã‰w²Ç,€e`2øùXtv`ñÍq·P$6Ã6Ó †38™^e'x\. F=Ï!†!žÞh §–ë#FѱÕ—zŽ½Ç¯¡®¸á çÏ$ŸÈèTÓwzš^ ñ¡®ùm© y%‰Uc•b ê ŒŽ “¸ç89Û´EKoÏælh‡–…ÎùU2¦â2}†Iì**êŒcËT’ÑQT0¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯Eøao§ÁáÝKT¿£ƒ{E8yXDP ûÈ8r|Â0AçëçU­á«…·¸–Y"Uœ§™NÅVù÷ýßÌqŒwQ^-Q^6:»ßZÚ[Ú¶•¦\Yº³½¹THÆ  o5K nÒH ±ÃÔ£ñ.¯fu}XÎúlK™q¦Í…ˆRª «°.ÃIŽknÊßÃúüi:G‡î㸖i¸i¦’ÚÀy$m¾_ –@zsKÄ«og¨XZéºeÜOdè,¥6M·ònRÁØyn üª6©lääÍsEÅ;%gçý[™FÉÙ-Lë}wÃ:´œÝi×Y@ŽR3À0e8<3 ƒÝ‡­tèÚ•öe«\êö×wñµµ¯™zÑJªX†pÌ„3²²óò’w)]økÅz¦-älwEãF¾hEÏîß+–Ú¥Œº“¹NN:­jÆÎÕnõiÞÊ8Ô¬÷Öˆˆ%“pÞN}ÂD#a,@%ŽBåSœ’V¿õýnLêjŽZOÅgu Úž¥s.”¾I»I$`…(ŒYˆ] îuVPݺ°õ‰_æÏ\’ÃT¼·º›ÜÈ¿!Ï”¸}À¼OÌe9?3o_ê·wÖÖzxÓuUŽ$Ì¥Ë4€%X`“žFã85ÃëuΕ%•ÒüéüAX£p޼ãqZÓ‹“÷™pMüLô=2Â;…ÄÐ[Ä7\FÈ®Ýö©rÐd÷èz´ÔW’6Øô‹Ë;ÂZm´ú=Ž›5ÛC#L#!“,Ü1,Ë•åwdª2H¬›ßIzÖ°ÙAuÔÉ\L€1s‘D•<ž3‚GpEKËRÎÏN· Ó¥ñó$„M$²MäkfPNåß’ ¨ ¸äMTÔ[J–&¹“O¸U´Í±ŽîVIeTPƒcÆõ.¬ÈÛ¶€~@TrB n¯sÁ}¥swGø<0´:Ü*.¡™Qˆ ŽT+o%qÀ¨;A,:H\ø“$¤.oqhQ·,ìèXü§¡V õ9 ÛUYŒà˜ã!†Nq¸î( [ð¾š5<ÒÜØ²Yʈ-ïK·‘TXFfª8\ü9«zYñ„¥»ÕntÁ²f– ¥‰ÝRpR±‚Î¥F6°ÇÚjψt?ßÜ5öŽ¿d³¼•…½Ô·ÐÅrDO‰1¿p }Ñ‚‰TKE³ëùÉlYï/Ï…?²ü1£ˆ]‹Ê¸îü…Ç •Žì´$(PA,FN殦Ö4y§OZµÍܪ3©Çöˆž!…•dumΘ1°“¸ŽÛþ³ÔÝ­—[×5m:kûë¨Õ`Ô–Þ¤d*A-!pTRʳ»—]šÊ+{eK9 $\yòDÈøYP´gÌÊýàø'ååNâx¥[Ù;YYõÿƒ¯ä`çÊídqÞ)¤Y¤:úÜ 7ìȲ^[¥ÊÃYšXð踒O2Np¡@Úí¸Š«â­&Kkxõ-C[›V·–P±<³‘1Éà Kåz;—hl68ßñ£6‡gq«M ÄæäY¤V“}á²D•±lF \wgjÙXZ¶¨Þ#Ôå’è4:$Q¤¦9$‰Ÿ*×K¸à*íl‡v³+§9Îj¢ÙïÛåçùŽ™ózš×3¬ÑÚÛÜ!³ûDZLCÉEÈ t%A‚ê`P ìðª r:æyiªK%¼[ øÝÌWö‘Z¬jÛ[ùŒÈ0@Úû× \dõþ&:g‡¼,¶þ‚).¥ H¨Ã*Œêÿ0c³Aû’sÅø‡[·¿Ò¤1YèÜÜÜy·OR½Ã»|ä«HDÉ T6w+òµk…s–±Zm².•÷G?yo%­ÃA+DθɊU‘yá”zö4í5îúi Ï;6Èãh`ìxcóÇkVëQXõVÕlà±KÙD2£ÀcH”1ÎSæt!Â>Õl¸Ã ívmWD¼—A›ÊAmnmYLq˹‰h$ù×<®zƒšïSr´ZÕÿOúüMîÞ†4QFöóJ×PÆñíÛÝ.O;pã©ÜG¶j–6LZ¤›VW\«H r$œ dòzdÕˆ…Ö±©´ß+\J¤™¯.0ª’v=NŒœgŠÕ»^ûR¢Š*†QEQEQEQEQE½áx®5(åÑbýâJâwyB)?,²TŽÀg88!°k®ð³ÜÙøOXžÝ¯â’@¬M¸(…c¸}ÝÛ²ÊI팜êß“MÉžÇKyiy௵5…휫y–ÚÄBþ^äÊà—b0ƒ<·ÌOO•AÙ‡P´–ÚÏ\··º–î;w’þÍóY·nÛ*…—nxù0?y²Äs>Õt¶³c©ÝOªÝ5²µÄw>[GA´!A$¡<ä•ÉÃq]F™©Y-´Ú­­ÄÐÁ±bó"x\€Wk0]§ ’Ty8\:p}wïÜå”{îW¼µ{#K’H^ËNÅö»9®ØÅ qÉÃ'Ìq€Áø!q‚Bºò——‰«j³-ƒF¾ÓŸÍ‘PK•‘B¶9ú>ñ=Nz/j÷Ç„/ŽŸb…“$‚E-ÅÁ–7)?tŽz«c8Ír×0xFÓ@i¬5Y Û»É Ì‚]Å2 ;¦’?µ¼«¸–'Á@¾Vò;œ(*¹Ç™º¸XŠ ʬт7*¶ÒGp¾ jé60^·œ±©Ž(ñt­*D"ÈØ²)y˜†#œ¥I%{‡"Fõæ­w¨ÆòÜ^[Þ^Ú—x­­AH0gVVuŒBHÛžvÍœW+¦ÆÒN‚Þyb½n–` Ë,(«rF+®–÷AÕobÕfÕoâ¸H]å·XËÊFÖÌKòùb099Ü·cšãåYc¹7Á‹ç0 Dì, ¦9tô#ªhÞÍZß×â8«+#oM™cÕuDñ»ºÔ#VØD„È“D[Î]Ì6… pÊN `.FõÅ”zÏö'¡ÓçeŠ7k%ÂIµU#yP Ø^I$V8®_Nµš#oµXé—'3Eq$ò,û6® ŽFTÈÚH8­õÑÊ+Ë8íü 2Hö°#ÿÕ¼¥‰/&ä#ä[—fÿO¹™Í#²Ô¾xfè<°Mqù,–ñâ52RB¨g+rÌIÀÜO4YøwR±¾,µÏµ›¶Œê±Þ€ò^B€Á9!@lñòçå'Ã×-§i²Í¨jÞ\¶E—L¸’6¸„pW,6’Hà)Õ{ ƒM¸¿¹’æÿ [¿c>ù'#;p£+/=v‚ÝǸ%í5NZ.öýmë¥Ì-.¬Ôñ5ž‘-ôV;ÞÆâ#¿OHm'qh¤õi ¼º;î<ðA(ª~'ŠÒËÃp¾»¦ÞêSYÈÑ÷žapíÍ.ÐBýѪrô'ukŸêz$1ÜëZ ݶ@ÒÎ ¹MêûX!;î Çy;Ÿq!žñÊÞÞùWûmneGD»a#Ü 1*‚¼I#-Ç5 ub”·KÏò·âR„•¼Œ]7Jñ®h/&»¸P“ù¦à;"Œ†LmehB;†ÈÆ!H;ÇZ]\i~!–W°Íö•Š m(d›ÌØ®÷Œ—#vìî]Âþ—c¥hZ · ­C R;ùe3ω% Ê2¿ÌÁ 2N¼‘VÎ8¼?w«ë—-ýär­©uº’Bd%r’;€± Ìc,ÌWXœ ƬDù[»Ûúþ¿ÊçÙ\°K©$júN}nb—M¶ÂFœƒéœŒô®Ç埇Õ4mcû2©CenUVC "œ¬ $nÉ|ÓÖ#¸¸Ú–%¯ÚÙ|»kȘ4R"ÈHä`Ë•]»NíÄàÓ|#$ßa}:êÚÂÅà‘‹Çl$+±¤˜ªÀ—#†Üð¹â„¥I)G£Õ_v„EÉ+®‡›"Ϥéú®½ý¯¦ÝM Vð: w ’“?0Y Æv¨&ÑêA5áÓ|aAßK(0¢Ý>-â #Æã–8ù›;ß’3»£ñžš/$F›RÆPâÚd"F’]ƒýÖÉ?(F<€ÄyÖˆmãÕíïõ˜íâgi¢Em¬÷üœò2¤d”Œ×zúd×·×vÚ´sGl.|ûÿ¶ƒ$,ÅÆ™PNxÆ:u å­îÉ]üÿÈÊvæ2%¼¸m îõn`B³AglÛf#r2gVWR<®K0 ´œ·s­M%½î{u, /ÊÌáTàM6Î\n·0a€ËÁƒêiörßZ\ÞMqg9iwJˆþc¹çÌ ¸3.Ä`Ø“ÔdW=i WºÓ.õ‹y`šY­H„¨i¤‰DnØRŠXœgƒœäb¹›„äÒWkòû…¢: bÆMcìãU·ÚBäIJ¡$°‚À°`FðyI0»Ž-Æ©o¤%½Ì³Ë.ƒˆ­íZÖ@ÊNrç†# ·°ÂœŽ@¬Ëxn㿉tǹš;æ s{ºk…‘vs¾L¢¬H Ÿ68 ‡o‰3¨êvú~“{¼-ɂ釙›Yw—»˜À$¸+Ð3‚ `¡Ï%=?/ò}¿!Y7c^ÊÞïÄzT«2<–æçÍ´¸·˜y­óäÈ»³åà–ÀÎå_—Œ´žµ÷2A “ˆ]̰Á&Ķ%Üì®p>vÎâ~êú 'ƒ¯.$°žÎ?±Þ5”Á­’8Ñ•˜ß»,>îùWœ‚I‹º ’ëZj]ÞBö›™&X£¹8+Œ©m¸È çiÏ¿5„êÎ<Ñ{'ýo¯äc)Zë¡!Ò#¹ÔaÔ.î|ý‘É Á…0í|çå`Hb‚3Œtâ™áÃnº\“i½ÃBÌMŒy<µc ±3’HÙ’X“Î0³Þiö:´Q^ÝÈ¿l\P–; Ry;‡SÎÝBK/ érO¥h·3ÚN%šalr±ÉÁ”ýÔ G ´qÍe5)Å(ÝÞÖÚÄ-t(èѵWÐûJÞÚÞxæ‚f˜ÓºH¾Ç“ÅÀ%U‚•P~]ÌX’sZz߇'M'JûMåüú¼ð*ÖH¥p‘*ÈÛí<å®ßá$“ÁÈ‚ãPo Ü¢G<ð¹KÇŽBÒÀYT.á°Ê6Þ£5·©ø’ù´m5ÂÜÏâ ¤šÎ8þb #«ÈJÆ\lc8FlŽEc)ÎñåÛñ%óim;¢Š+¸Ô(¢Š(¢Š(¢Š(¢Š(¢Š+Ò|5 Ùk~Ò"¸++<¤¨8‘VʱtcŽã$â¯6¯oø{k ÞÓí˜Ã:KþRFGÊ@Î:ßQÍaˆmE4c^N1V ­Þ;KÈíšH#¼¶hî. s´Orpª@äñÓ]á©/¢ñ\RÛÜ”‘äµÓ3«°Àaó_#¦ìgwA‘ì^#Øh¬ºjÙ[´;R7¸; rŽÇßÃèÞ’ö#¿gk €“«üò–L„\0ƦҸ`“ÉN¬aÌÌ©ÏFÛ$O­Î‰y*ÙIg-¾À¾UÉP͆PÛ~SŒôç#ÈÈ—Ãþ1Õµ8|Aé3-ͼÏ:¸‰Kn ηM¾¸´´]6âÞúf¼‡VÕa™|Ÿ³½‡—A‡V›ËU€§Œ•ßiz©hVÚ]¶³™˜C͹ž1‡# q Ä»‚à[œ¾xÓo‘¥Éð#Ë|IªøƒB×d¸’[x5 ½²ÈÑÁþ¬Æe„lßžFsŒÃ·_Gðõ®š“ÆdgûL­4ÒÌ‘¹,pü€éX?´«MVH£½Óá™.cäts1óI!ûn'g`Tü«ŒÕñ®½¥Y«h¾^­a$H¦)m” ^>]¿0ÊöDZôÍ)þñEGq7íH±âOø}WPѯb¹¸xÕóçE±%=UhÊõl9=O“Æå’ù”£ÿŸj’îw¹M4“K3ÞI,›ËÇ'ž˜ú~e´¹ŠÒ¹!d‚ve‰ÈáÊãv>™äí§IS^§L ¢‹Zl0¶w=ËíŠ7Gî–fÜ8;.æî’€ÕBYYZY]žGbÌÌrXž¤žæºOi/v×u¢Íl`/ÿV$‘Xœ`rÙíÐ+ ThZþS“Y ;|†rÅ “Ï\õ¢3Nn#O[¦§A¤X=Í‚K{{±cG™ƒå¥`ËÊü¥:6à2ŽI®ÇN‡JšïR}%î´éš( A.pIàŽ@ä µæ’ê÷²hñi%£‘rËRKn-»qœqŽ?ôÞñ„þm[€\Gnã`Éæ³!Þ*ØÎÀ'‹J£2ïø]”[GQ¡øËOÔeG›¢-ïÖwÝœm@ –Ç$÷Æ>öÞwÅÔõb{«sq1hƒ‰n0§ÈTªýݼa†[wjÕÑì¼=ý²‘][Ù‰#¸'nYZpÕÏbAë2yËV†·wmin–Ú\ÐEv|ëw{I'IFó&T¨l\¸àž€×/7$ïIYí¯âB²—ºpo>·áïG­Y<³îb<Ö;Nÿ™ö2¹ùϨ¹­kïéz¦‘s¨Í¦<…»ˆ©%¤P¹,ÓÂ‘Æ ®9ç HμÓßGàû;‹‰q#K R0̽Ô0Ý’W!€#<üÇ[þ‰,ôy4Åw—íS)šëÉŒ¬j•` €ŒeÆG8. Ÿ”ÕÔ(ʦ“ÓgÓ®Íéø²ºîjxZ#ð¬:®•c>§{ m4‚9¥>oÎ ÁFw0þd“OÓ{M"bPùÞJìŠ4*ˆ#F˜ô€2*iIáè'ºÓôAm¾sË-¼R‚ÈùŽÜ’ p0§âóÚ-£‘UvlùþŠ(¯ ;‚Š( Š( Š( Š( Š( ½ÇÁ7 éE¥ÞÍU“jðÊHÈyãExuzfƒ«\xfÏD°’;'Ó/cKsöfGåï»iÇõÚ½8åÅ©8{»˜×2±ßIQÉäÀ7ùHî@åÙ@=rBñÜíX^,ÒîxF¿ÚÞE’Iç2¼ë'ï·;nŒ)yX±àˆö™ Kqáùg¿Yã2 -Hù©.J㦲KdOþ™® ÍZm[T°Ó&o’ÖÞyï ‰ Ž3œÄrWxf*ü–]¼8àž¯{°‹Z–ô}7UÔtÍ$\aX^‰XJc\E{ŠùjÌD£žH ‡ù™ƒõ\ÝMk>ª(’_,\ªÇ•Ö8䑊ƌì± 2pIú ü+Ü%Õ´+”Ûöµuc7*ñ"»pË€ÛrsÈ8 Œ)Uí׉¼;%ä“é°êÃs‚öñ^ࣘÀíÎܰÈ OM½ŠÏh­mNŠuy´êq)m!Šœ¬PK)ˆJÇ Ú[ dàSÓ隊ThåxØ©db¤«„pG¸©n$…â‰b…Q€ýá¹< rÇ#ÙÀå˜t›j¶í:­Ô²Å ÎæŽ0ì8준y÷ÝælEZVºV²5´ŠÒæÞéвf#±¾C’ØvóÔœwÅLúºÜhsZ]nûH¤2Ek¹#°ˆt;²B—iÝ^ÛZÕí¬ã³¶Ôîà‚6fTŠR ŒôíÆqî}MMÛ¡«ø†þÿJÒôË-”0,nbÝ‹…VÚ© 66 ýàÜŒàY𥦫‰F©+ZÞBÓ]»ˆÀ†X‚³bx!›˸8+ÌK#Ë+K+³ÈìY™ŽKÔ“ÜÕÍ94³kw&¡5È™Sm´P¨ùœƒó1<@äî㡨•5Z:z —K"Q[QEQEQEQEQEÞéúë\M¡è­%¤°´+<÷–I"¨,¡YÄqᘻ÷µÁWI»ˆê’[‹›øïDÑE4­äÀYËF¡ÃrÛr mäüÀVu#̉’º='Åbõtû 9ímRæú+\²F˰¬€¯–ãnUÀÎNvàwá¢G“P}ÁÚ†¬¯ö†22\yvÉ€¾aÚ͸œd¾T¯ ©ÐÌÂ'ÞªIÉ\àgÁàr o‚©*““‘­)s6Q‚/5ðdŽ5ÜÎp$ ã©ëÐqž8«7°ÅöX'¶‡dJ‹’sæÊAfÀ €À’Ày–W°Ça-ÄÅüÔòQNX‘´ðxç ŒuÁ µoœKk$Ã1·`q*–óqŒÉÉ\»xI'½ÞæäwW/r°ULB%Ú0žç¶3Ôä’Kµ นd‚ßìãb†@À®G.ÀÆ:ä÷$“šŒŸ>wy8ËnrBm\òpŒ ž=…:òŠE0™Ú]Ñ<±yeÇBp ÜpOOž€hèš”VÀ÷B;¨—!Œ¹DË«GÉ®ÍÆA;sßÞ*6zÍ´Z)û ¤ Çqq,-Ù—,¨Ì¬W+†zmÛòí®FŽf†©¤D¨$'rÅ$·ËÔòsÁú玟I·qo=´vš…•ÅÒ‰ Mˆ£,€¦Öp¯[n ƒ©S‚àžzÖŒ”‰k[&§éiáO;UÓ`²cK9nc7#«*¾JVO™óØç ]‹w}{cöɬ–8$TòU$ Òc™2qòí(y¸n:g‰ÑãŠOO¢_Ež‘óÖÞ{¯64X‰,cg’Á·tÂù€ŒŽ=&àE ¢Åe5²mÌ6ʤÞ¹v‚3·iÈciéŽ<¬M”®õo_OÄæ«¡%­©òÝÜ0nª È" ¸º’ÑQˆQL¾ÕËìqÈÇÌÊO^â²5?ÞÛJ¾v”âæÔy¬©yVÅNP‘È8;‰¨Ë'ÚMsþ$ñT°Ï$“¥í¬Wnc&òãQŽ`»Š9}äX'+“YPÂɽ:™ªM²üú@Òu©µ)¼K:P›¯$wä°ã 2ãpÙŽä‚×Ón­µ S«y—ö¾lon-ÝT•t/– ´–“†àg r§æ:n·xWû*âþÖãNµGb“I"‹•E#jHFô%2ªÁŽËÛ±k½Ò/muYüËf¸,„¶gfb È>PF*@®rœzjaj¥yjü—OCiAÛSÐN²Ôm¦†XD°J›'ŠA†U`~òœ88#ƒÇÏøóX°6÷ºÖ¡µœüÓ‰^^òŠr™ˆ–†Ç^¼Äú½‡†¥¥Ã§G{e©ÄÞMÄ*¿¹mÀpÙ(ÆEÜy8àXóÝÁ®ø‚ç]¹Ýmol°É,9ûD¬‹²> ®s·;Ïñg È«¥‚WRÖÛ­·ÓÔP¤ï~†f·m§&©tº-Ó\ØDªÑÉ1 ìPx!I!‰à àÐYÕ®té&Ñä’+7Ù»¬³CÉ œÈ“+œðmçq8Îl‘"A‹q&wF¡·GƒÆì€9ê0O¾+Õ‚²µît¢*(§ÍE+ÄÅK#%X0Èô#‚=ÇCEPÿÙpygame-1.9.1release/docs/tut/camera/thresh.jpg0000644000175000017500000001037211206577570021253 0ustar vincentvincentÿØÿàJFIFÿÛC  !"$"$ÿÛCÿÀð@"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?øÊŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š*ÿ‡ô}K_ÕàÒ4‹o´Þϻʋz®íªXòÄ€ž´ÒmÙBŠö¿Œ®4HF±ánïìË´YcÌ– ·ÊSºr9aŒ’A%|R´­FteË$D*Fjñ (¢²,(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ë¿ ðœoaö=jë?nw™²Iåôb£äa÷}yæ¹ÙËáõÖ’øŸ]°Ž;©—e”s#¬öÀY7#( XÁ;Iè ÛTóÓŠú\¯/tãí§»Ùvþ¿#’½Kû¨²¯Øþ•ä?þèÚí©½ð”ºF¨Œem¦\‚ªBÈ*99È9Èõ‚IS! 0z×f# ŠÒW8”¥MÞ'ÀúÆ›£êwf§k%­å»ì–)*¨#ÁÁª•ö¿Ä‡ÞñΙ,7°Go¨ßPŽ0eˆŒàÕ““•'œ`à“ü}àOø*ûìúŦèo—yf·NÐä˜`ü¤ÆqŒóx¬è;­Wõ¹èѯšu9Š(¢¸ÂŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ½/àéüU«¦¥«XîÐ Ïš%2ÇöË")” Û]Fï˜cߥ`|>ð&±âÝbÎÙmo­4ëùÔ~ÆòB›U^å—o^§ð¯°4ë-:Ê;=6ÒÞÎÚ<ì†Â"ä’p$“ø×µ•eÞÚ^Ò¢÷Wãÿó1«S—D[\?­?ò4À=qùԘ⾞Lâb‚{ãò§lÐSYä~T«ÁÇéX»2™"°sT|K¢i^"ÑfÑõ‹O´ÙÏ·ÌMì™ÚÁ‡*A¨èjðÛœp)Ç,1šçœSÑ™ìî>,ü+Ö|uq{n’_è×˼Ýâ@YTr¢¤¹†kk‰-î"’¢r’G"•d`pAAíQ×”vQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@_Ð4G^Õ¡Ò´«´ÞO»Ëz®íªXòÄ€žµ^ÂÎïP»KK Yîî$ÎÈ¡Œ»¶Näð ü+ë_ƒþ‹Á~òî#·:µÇü~Í Žé&×}˜ÝŒa[ø×v,UKm»þº™Ô¨ †¾³ðo‡!Óbû<÷#wÚ/ÜDóüìË»“´6I®§ÈëJŠOÂŒsÖ¾Æ 4â¡8Ü®õ0E=@=1MÊM.㜠—#69N[)HçŒñÞ›€qÆ—v8c‘õ¬Û'Ðpàg'â× ˜¸#åà}iA8ëY¶&‰A rsô¡¾cÊæš¹#€i €Ö-cÌ~2|&Óüaš®˜©i¯„TYöC0 £÷ +B†Œ€ä•õ]/RÒnE¶«§]ØNT8Žæ‰Š’@8`2>Õ÷ÏQŒÿ*å¾!øCñ¶”–z´N­ n‚æ ,GŒí$ ‚: æb°qªù–ó:hâ9}ÙQ]wÄo‡Úÿ‚/Jê0y¶Jc¶½îKÆFFrŽÇѰH®F¼iÂTß,•™è&šº (¢ aEPEPEPEPEPEPEPEPEPEPEê¾Çâ»Ù5]rÞài6øÛDè—›„ŠvÈÆÆPN3èqZУ:ÓP†ìM¤®Îãötðö’’ø\µŽg]¶M'€‚êìÛÓr1­‚¬rö®Ö—· ïšû<=aéªq8e.gqê6÷É ôõZ#òM Ù9Å[‘›Ç Í8±§q<N޵›‘7¸õ<ýi@ÝÈ<у»“ùÐAëŒTóå}½OåJ0ÇÚ…Ú½iÃ`9¬Û%$€9õÍ.FM—õƒ= ‡!zJO~qõ¨É#µ&ìZ†…ÊR×t­;\Ó.4ÍVÒ;«K„Û,Oœør8 ŽAŽk㊚‰á¯Üiªú´*¢F|†^CFXŒg giåM{Ç‹GN3ø[Â×GíÜÇ{{Ç¿¬q‘ÿ-;þƒæû¿9×­ >E«]OC E]…Q^iÒQEQEQEQEQEQEQEQEQEQEõÇÂ/øSÄ=¶¦Ça£^®ÿø”ÆÁve¾O•Cäçhã<×Èõ=…åæŸv—–sÚ\Ç“A!G\‚r8$~5ׄÅË ;¥t÷"pçV>ðÁ¸¤œžkÄþ|i†üÛhž.qáÝÿ9$Š8_ï·ïÊ#À £Éô¯nÎy5ôÔ1P­h³ŽQqvbî .py¥^™#Ÿjk=?ZÑÈQùJzò:š‰A'=¿Z†Éh]§9¥àŒ(ϸ>ÔìƒÅg)Ä uþ ¨=søQµÍ8²s “Á#éJBŸ½“HI¯>ø§ñSEð1[5‡ûOT|ÿ¢Å:¨‹ïO,™WÊü§8íÖ¢UcÍ-ŠŒ\‘ß9 ÇÍŠñÏíôM:ïÃ:Üë®Iµ&–0SìˆB¶CË2¶Þ™' Ÿ$ñÆëftmcû>Þm¿¹±ŒE³û¯Ìƒ$düÝÈéÅpçWÌoZkævÓ¡mdQEyGHQEQEQEQEQEQEQEQEQEQEQEQEWªüø»7ƒ¬ÿ±õ‹iï´¥ÿqÅ{n]›¿s0êÃãÒ¼ªŠÒ•YÒ—4Y2Š’³>êðîµ¥øG‡VÒ.Íœû¼¹62îÚÅO ©ê+C§jø¯À>8×¼{5Æ‹,'ÛçÁ<[’]¡‚çaäðG¾zWÕþñ¾‰ã;s¤Ë"ÊŠky@ó"Wv Ÿ-Ž3œ`œdW¿…ÆÆ²³Ñÿ[u(¸j¶:Pb3KŽ1Hzgó¤溛¹ˆð¸à ps·SUò¼õö¦òOËÆ±“¯¹/'¿áB×Ä÷ S?ýjÅÈ› ųÐ~uð׎5­KÄ*¾Õu‹d¶¿•Õ'…#"„ÆÖ$ƒòò ëšúûâO´è'QÔXMq&VÒÍ[\8ìe›:’øçÅÝ÷ˆõû½kR1››§ â4ÚªT@äñÉ'šóñµSŠŠg^;³6Š(¯8ì (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ žÂòóO»KË ¹í.cÎÉ £®A 9?‚аE|&ø×÷Ùô_Hb»;¿âfïp¿ßoœ|¢<ª1œž¸¯pÊ•oí| ^‹ðƒâu÷‚îþÇ~ÓÞhr}ø.ðà9J— »o\z×¥C%îÔûÎz”/¬O­;Fißuq’EexwZÓ|A¤Ã«h×h²Ÿw—&ÆMÛX©á€#•=«G ~a]Ü÷9³Œ1Àž+3Ś准t ½wT.¶¶¨Äk¹Ø’TRÄp9äÍYÔoì´Û9/u«{KhñæM<r@cÀÉ ~5ò?ÅÿÜøó]ŽaÙ´Ë=Éex Îäm^ÀÀ<“Ë^·³^f”鹿"‡ÄŸêþ9׎£¨·•oVÒÑ”·CØz±ÀÜÝÈì—¢Šò›mÝÉ$¬‚Š(¤0¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š({Á-Ö|«®£¤O޾e¼ŒþLß+(ÞªÃv73Ð×Ó þ(h¾7ßjcþÊÔÓèÒÎæçyýÑ០™o”c=ú×ÈÔVÔ«ÊžÛΚ™é¿¾%ÉâýKû7Gšâß)÷Ù>Ør§{¦q´A“‚p<ÊŠ+9ÍÍÝ—¨« ¢Š*FQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÙpygame-1.9.1release/docs/tut/camera/rgb.jpg0000644000175000017500000007735011206577570020541 0ustar vincentvincentÿØÿàJFIFÿÛC  !"$"$ÿÛCÿÀð@"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ö__ ÂZ…àeŒYi²È¤œÛNßé__iègÉ»„–<ÜWÙµf¤Ö? 5ˆá ^úâ5 3ÆíÍú)¯ˆîRU‰÷Xʹ›=Àzp´´·‘Ÿ|w7*žtG;y}{×V«Τ$³ãl»§qÁúæ>]¦›o •úµ”«È¸åÞ =Çê+nÑäÐõ¼«y°·Ë÷¸’3чnÙúÖSŠg«IÉ$ŠZÍ¢Úêöú®œ»¢–m›{N;ä}ªKÝ9 ½žÞ¦Ü†pÎ~P«œóê0GרÕû?&Âä[\üö¥Ô†'=C/Ö¢¼k© ö!irжz’A8õÜý(od /S(-ݥȉ‰Y-ˆx›åç=ýùüë韄:Ü>%ðH³fh±]ðŒò#Î ÿÀ[+ôÛ_8Ûß5ÊênìŠÄË·“ÎÖ'¿'•t? ªŽ\–l«Ѐ½G·9® T©ì¢ÞéúßIÿŠF“©xrgX ]nÍáµ™A.¨‘†dTcò¨ÚÇ%1¸†ô8ælíäÔÛPºŠ µ•©yŒMÉ»‰'8*9ø3€y¬)õ+™/]åUiAmòmùH#†ÁQ½‘ýAãÐçºÖt¯ CáÄÓYn¯íüÓ+Ëò¼Y©ç®pGRqZB.¬¯Yè»/̯sÊ5°¥¼ŠTIŽ+·QŒzgóvöýžŽ ¹H ýÑ•PqÔäïã‚O5–M¿m’,%ˆU+‚Ž0qПJÐ7w0Aiw-ÂÆäåT®ó† .@ '.öާʹ¢&ìÛ±ƒ _êî··“®ÕÔ»ÆpqçàägŒâ´|W¤hZ O¥5+—“͆ê96íOºQ€8-ò°Û“Œg‚Yk6mSPÇ6ñ[˜¤‘aòWæ°ÍÉôÆ1Ôã­XXõmF#6wFÌ¡)±79Á8SŒ»`cœ8ÅeQÉ=ÉÑlSY¦Ô®"X•4ÃrëÛgÒ2àaŽW ª!<»Wœ1η‡"ÕnáY㸒HW $ *771Ç\zzŒÒÓ4¯+R’Þý-­·úEÀXÉçïøÎ23€:¶†x­dk”¹‘ðÇÉgEE‚¥äù<ø¥9ÆQÕÉé{Dß …ÓÚÖâ_1vC${‡ Œ†Ç+‘†õÀž©5œ7 ÷ÏL«¿a @Ïl¤OÖ³-¼]<“Çö¸c½‘%$K2neÈÁ9=8$^ù©.H¼¿x&­ãVýÛ¢áJÿãÓzW“:S‹º‰’›±¼ÿo½›ÎMU#†h‹t‰<Ár<ç‚AϱÔh—>?Ûmn ,Œ6)È9ß…§“íIs}áˆôÛT²ó¬f<À¸–0øRß7+Œç¹ç¥p×w#NÕå‚ÎKÀÏú9#P§œr@ÛÛ8#Žk‡r’´ímtþ¾óF¹RiÜõ»kûy.°„ªJŽv3ƒ“˜gŸ^˜êI J5{kg’×Ä$Ž¿.AAÆG pqúמx#Q{¸.wj2"ʦEÛ 1ÔV>Àtö®ÆóWa£•h7lqTfR§<ü£#?§5ÛGåQÓ¨õ_Ÿ‘ÑJ½Õ™wS·X¬b‰¤I'*r£æ>£ŽÙ8ÿõ Ô±¶K+s•‚[¦¾Ozó»ëË«xoRܘ[Ä!sêN=xç?Jع½(ÆÝb–ÒÖ±ÆP‘¼ƒ·j=ú»kº~GÌᯨ•[Jí¯zІhß1ùA6†ùÔä\c¿ù÷¨téDÑ–$åv@n:ùóúUÊõ)IÔŠ“GTd¤®DU!*cˆ’HS´vÏSíRÒžä}*)£ónLёʰÿë~5¦Û±òŸíŸ®Og¥ø{K¶Ñî%žæP§¨UÏæÕó¼ÓµÄl·î9潯ö¾Ô ºøÕ¬,¢‡©À'.ô1^KáÔ²“T¶[¦‘ÌåãPJ\w®‹ØT ÞèôTjšlwVö¢;È#+,@Ǿã¸éÆ}jM*7Õ-®4ñóOn» 9¸þZÒÒ¬fÒí¤Wæ%|©å]rNWô÷ê}^ÖÞ+KbÍ•<×T‘m1¶íÙú£‡ŠÎM7cÐI¨ÝlaèÐ˨ØÍ`OúD<9R ÓúÄw«×Q5斲ǼßÚnƒ—Œc‘þîGàG¥Z†ky´ËbܤWXŠpFÒO˜¸‘~¸9éÏÖ«jWFKk]NÌ(™%>rŽÌØçèÁOä}ªZЮfŸ™c’Îþ=LF†+àÑN¼‚ÐH÷Ò£žÕíä%&¢q$R¯æ~‡ð­‹…·o²N6—€qƒ,þF±ãY•^Âeýý»|½òäçFêÄ5g~Œú[ৈNJ| Ö «wh¸TÝ“´“ø>…jÍúMn†b»'±öëÀõ׉ü*ñ žñ¶£ü{ÈÞ]Ìc§<~£õTõ¯¤õûX.m ÔAY&NYNAã‚=ˆ?­qÕbVSL<„¨eýâƒÈÏ×ñ¥EY¢ ôÆöª6“s‚¯µ‰d°ÄÅ Dó-UÆr8$œ™ÁÈ$1SR5#k+ù™»&^ðÔ) ð\Ûé6Ð…·º³?Þ‹c+“Æ'Žzv•|ÌøX¢10ùÂ8àðn*ò¨oí§½Äz›‹Ã1gó‘‘T‘–Ú;H8 sÆ03Ѧµ§]¼lÃìN™gÌŽû‡M˜Éq“õ®j´*ºžÚ &‹„ù]ÑÓjgUfÅÕŠÍj‹ò#üêÇ· ðØ'°í×5SDÑlΨ°ês © Á˜nF)bô©³e9Õ-^¼$¼$©r#¯ù#Ч, §3I4—0ÛÆRDpªØ|ô'¯¯1]˜¼ÿJö¡^2ӹѫh_¨çg| ý?ÉËIâVwVÈÉïøT7s@"Äó",Œó— =¹êjgˆƒ…Óü‹½ÕÏÎÿŽÕ¾,xŽíœ÷®‘󜢊}¸QXžÓ.g¾i¢RÑÛ¦ùYFBq“éɬ‰î&žò[‰ i‹3žIÍv_ x/n®â îO-ƒ(epz‚Q]’qêo„„šJ'Wá}YM Ò®Ø¬LÞdr±Ï“'¿û'¡üÇ"´Ì‚ÆŠáXÆøI¡'®pHü?B*Ÿ‰tK[-þ™)–Ï+æ*œµ³û'8Ô`ûÝiîÇLŽL}°@6<Ȼ؄>àcoåß#'ÏF2[ýè­,FºSyìçÈBØ"D#æSî:ÏÒ‘íÓK¹B¹šÆíÞÍySžëÇâ«üä]6pÑÆŒX—h¤%†HëÀÆGÖ¬¶!˜èú„˜Œ… (ùpÇQ’AÇcžÔ&õÝ4› —º5ÜéöWm¼ìÐùÚÇO½†úJ¥s§ÜÉ<.Á£º‚_*aܨ ïŒãéŽÕe$¸ŠïSÑ®cxæyÛÈ7C¸6Üÿµ|zš’ãP¹¼·‚ï;n,€I¸Ç˜¼Çß)ü*åu©„o+£ImdeI‰òðyCŸçü+èÏž"ÿ„£Áo¦\I‹Û!å°Ïlñ¡ãèÉ_;-”Ixm&ˆÌ¶»;rU½øÁü t ü@Þñ}¦ ï‹KÆL¤ýâxúôúíô¬ª+«¢{3ß/íÖ;ã´ÆÑ!G$pTõÍW[X´ö,¡1UO~‡#¶<{ö®£VŠ'UºŒ+Á*˜9¾AÍsÄ–iÇ—æ¤û<¥zí9*r}øÿ óêFÆe«ßݘ¦‰Ã.ñ’zxþuã‹D:MÔà ꛔz•Ã?[¨mÙä…=Ì %A}ý½ª;ä[1’PFT†>œ`ÿZ"îŠeŸ„÷Ënó6Ñè¬Ôµwq¤—~žŽ$xYØTW‘ü»1j:ž‘,€Ì-ÁuÝœ4m´þúW¯è,~Ë*wÇùük¶“¼QÉV+SçM]Ö’Rm&á3æ+:¦ï\°!†:}xõ«’0ñ¢úœq[Ù*Ûù“»HL’È )V@FârW’¹8b®{Åú\šv³rñ¦×RÆG #• ÇqŽ{Öÿ†mµ-{S°‚e¿˜å%d.—Á@AÃm+dŽMx­AT»]tõÒn.g¿Ó ÚÃ'“u¦¬bœÕ\ã%wg<çsØp>#3iZ´w2¼B(#)ºåY$·Ëq‚@b= _Jéö5c;YöݸrÝô;¹§Ð|9¥Z_éqý¨›Q²Ü™%r É*pOÍAÈ åÞ-ñ6¯t–Âñ%h"hàBÈ3뵈vppx=1ŠK mïZHmucPê]ö3|Ê6/=[?w8àz`Ýžî+Û³j1%ÔVäy ,Àñœ¯@A;NqÏç^tùùÛ•šÑÙÊ»{-Fš[mZþpÚ\HŒ˜˜F]d¦Iàldñ×ЊµjòKqÇä]»Ìè2à…]Œ2HéÎEGâ Yìí ÚE*ÆÛaOL…ÑÔdŽ„‚3ŒÖׇô°x)umAš ^Xá²ÂŒ³‘’øã# 3œdô>ÂmÓrµ•Ž•+­6:½:Ê{O ÛëÃT¹¶ŠHšÞû2•r¤FÑ‘Ôa‘»œ.Fk?DÖôË=x”ÝÍt¾@‚yч’7îÚX±ÛÉ$lQœs퇩ë[4µûlÉoòÖ!!?“k€c Iê1Íz.…7‚lt+8Ì.×2y²ªÌ“’}09+‡9mbRNG­‹»Ùÿ´îïUÃyayÈ<¨àŒ<Àc’GMá‡ÚŒZ\÷·Ok(Û¬H|å0l.å ŒtÁ|MrÎÇìjV—RɤïM¿ºŒçˆ×pxAyçç×Ò4ŸÉ.“cmjëyt¿ñõ*ÆÌ0OE 1ŒŸ¦ziàâçiþaË+Èòi–דÙ}ž2ÞX‰Å¼êÅ@*N±Á;yÏLž: ͺ±ÔdÓà¶xn#T<*¶ó)%z.7Æ{rO¶ø¾mX·[ $°½¼»p€Á:‡V ç,{€Wyäôâ¼—Z†îmKQÐE£,Í+F¦4!ˆW%AŠ.ÝÎ9:€)VЦùÄT–Ç9¥Ü›`»Š6 †xá,ìä–<…éÆWèj}VÛSQ*…vuùfOΤýÒyÿG¦o±[”šK¨|Ð7q´ÿ¦zó]/ÂÏ ZêzÔrjSÃ’õo.×bùÛ·¨'v*SçvŽç3Þ†v kZµâY=½Ã´­½œeÀ<óÇŸ¦}ÍjiZ=õ–´lçó$xŽÉbI(AÁ^3ú~Uëöž·±j1¼;S.2§žA:t<úŠÖ·ðþ“orn!´D‘†òKBOnOU¯$Ó²:#…osÇX’ÛF‘nmã‚H¶Äâ'Ú#I\œ¸?ˆ=ôµ‡Q3Ã*M“¸¤À¨qÔ`mÉÇã9u­­Cú}Äw1!šÖ+|èíðŒGÞ ‚3ÇæyÍM¢hZv”¡­¡>À¹–Bå@ÏLœ§8ëEL¾U¹cRWHߨËE}bm¦Æ€´¬Å–@ò%6òƒ'×ß5ÖHQ­šÊb'”© ?^;õ¡T5ˆæeíâ…¥\áŸï/ùx>+oª{7MêZ¦¡©‘cyªÄeÄÇoT^Y= î@$’8ÇjÓóÖãÉq¿nFž½zóü«•:åý´³É?šØPÏg"(èNH9ÉèN>¿A‘yâ$’î’x磖h¤d©lŒHÏP1šðg‰’Š}Sû¿C?jµHø¤$ŒNÐÄ=+ÑþÛ[ÞD!ŽEŽåîBŸ9ÀGL»ß^±ëæ‹·AŸÆ½ÂÖÓéÚLp\ÛùH<ÀÅsæ#`ƒžãéÓ¿5öÐôð×sI;kÞ^YëÈYÉ1ÄÊ0AlG§N9¦k‹Wk‡2ÙI°'ý1`»|³éÀÈ=þµ5”çÄ0ˆfÜÚ¸RÑáy¸ERvŸöÀ^~‡± Šäéó43Df€ü“Àë÷ð~éˆ#ð5—7+òg¡È¤õø—âN³¶©he“-A_-4Þ÷eýGÒ¤0¶§m1©7qF|°2 _»îF2=F}ª6k-Zݬæg‰¥Ä7»î¶8 üzk·-ç ÝBÁ¾Ð\¢¦"N?Ù ž ÇÛqKúСubÚÞš M¶úÙI€“®7Ï÷‡8õÎ=*Ö’»›ûSj˱ǡJÑkÉ5;Œ½ÛÞ $fòdC%ŒÌT¶r¤ôýÓîéX÷pÇ-·–¨cÜ=r=9ü«§Ô´²I§Ü1G;d´vìÌ=²8ö8ª7»$W‘±ó·•pHèà}ïÇük>–cq÷®µ=ÏàŸˆ_Äþ:mヨØŒ‡¯çùµlÝ@·ÒA#IÂür§ø[ðþ•àÿ uû ø¢f.±Î¡<7ÓŸ§ÌOj÷Û¦ŠyD±’±] uö'Óñ®Z±±ŠM3™”OÚ\>>Õ½ÑÀVnwñœg§CŸZÞ·6ÄxVRXð6§0Cv­)ÃïÃ2c¯àœsZ–1ì1Ç&06åŽIZæŒlô5o¹ÇhÑ #âm¬ái}‘ Ý”¡ÿÇ‚ŸÄW°è\Jã³õëÌv œ/ÍùçðÚð˜ŠÃHšÒåA+p—1É'›òà…\¨ä÷9#rNbø³8‡Æ·6ò[[̆Ú9ؽ¸r‹’¹ç‚~OÓuª:vRxEºG E ‘ÌwVuä Çp`3×ãŒô¯+ZTë¶Ý‘àVrV×B×u»f·”µµÚé&L[[§•å)ÜÛÙœ!èFyù‡|× ªOu+˜®ÜK !Kií4v‚QXä|¹Î Äì_]]“0‘KÄ ˆˆÝHÆ>VbC)çqøqz汨]ÜEgä\Ï ¸ÜÁ7ÌU{go8ô¬V.´ªZi8„'©jÆ ¾–KµÂùdà ”£;düÛ°ÞR;ÀŽ£FÞe:Ž©w«±0[ºÄ"C*3ž\y.ØS¹xÀF dx©,­mmï`¿•®¦™ŠÅ$ Ë*øÛ¡Á,0qÓ®pu®£½¦ù!ûIhyæ¯,wnÀ-’ryãâ·”Ûvò5j1–§Sq®I©xc˸KxI<{Â(ä“ì§Šêü=¯iòx{mãGu,z{}–+¼˜¢ùG–Û`ž úœŒàd×™iöñMá9‘ÓÏÊ  :uÁíÏ­kXÜÇm5Å‘HL‘CŸ,3 É×=A888Çâ:¢ýŒ,z´Ò.øŠÈ¤1/ÚVTfÝæ<[IlBrÃ#º¯$pF vÿmíïbŽÈ]Ê÷óYší—"2Ù#qþÁpÿdWž^Êou¹VFiწ`“±G/'žÃÔœq^“ðb÷OþÝeÔEµûä‘…y ;Lyä0ã#ƒ„/Rwzv!|w74/‡òµØžVafNÉ`•Ø3.KaN<Ëtâ½ÆÎÇM–Þ {U‘úF¡$ð8«d¶àîsÒ¹ïé‰ywæÜÏÚs»ä*cÎpWœÄ»¶ß~=Jt£BYÖ £ª«6—g¨$öÚ]•åÕÄØg2 xäÎÕ#99%ON›I=+Ê|WàÝBMr{›¿= V¸-1šAÏ– ÙP0'ÎM\†/HÚÅåŠú7/îjòã§ IÏN•>·ãín )“IŠKg7›ƒÃ36 ¤àŽEpʵ:¯úüLe.m$Cáo Øj³Ú-õư—-:f9íZ˜ è£%Æ#'hÉÎ:V߃tEÿ„ÚúÚîÂU‡Oºf·‘È£ª.x$`ŽÝWƒÙåSâV¿£hÒ.« ­-ý¹}6V <¢FÁpw)ÝC1ùNz‚y˜¼E{5ÝÍÕñCq2,)26ÂFÆà{ bÄžãp«‹§ß—ü̥ɱôÍÝý¬5ÅÄh‘Œ±ÎqÈ=HªÓëZzYÉq ÌS„íGœöýkļ;§¬DMœÒËxÌßv¶UT;–ÚÐHç©ã<ÙhÚ}î¨ÞK©Ùå‡I˜F9a÷³÷yÀ³Q,£—,a±²¬å²:íqäOm¾8à•Ú]™'`ã[¶ž1[qÝÃqj."RÇ.Fßžßθy<[¢%³¦—lf’«åÍ9òä,xÎ[“€NJ¶1Ú¹ù7w–¯{}mk,°‡S-µFP:Œ¤ª°’p ˆâÕ7z“½ÿ¯ÕN©ÜõÍoO¶š[)õ­Ýb ½äPÇP¥:œ‘ƒÁãÚ¼ÇAœ®³dD0˶QòL›ÐŽàŽâ½‚H_EÔ“KRQŒRÍjß3"+vË(;O<€sŒ×Õ6}dØ–62Xj‘^FáãT’D¹‰p„$:«p~SèpHæ¶–µAO'—r¤v„}b¬yJÏ>Ÿt@ÜÌ u=G¿¡åÞÂjútþ´"ÕÌ(·¹¹i ¹Š6´¸~™U¹ôP§Ðj„!û,—×¢m1] 6àFñþ`úÕøôøE€Óoš5I§kps¶26äö[ BzS&‘Þu–hËHäÞAÐÈ™1÷Ïö!O5rÕjd“Â`]ȯ0fÚª¤âLq^ÏðÓ]]wÂ7:<ò3ßi8gLŒ7òϹ#µy=ý¢ZÈc‰–àždoŽ&ˆžF=Fëè+Ò>ørÍ\Ö) Îô‚6 W)´’è~÷áüñ«værhîl¤ÍÎÔ<ÅÛž¿®1Z–ÅÙ2 ²·öê§üúVf °åf'|gû½9ǧ V¤lë4l¬Åm tró´TñŒBÿ@–EBÙ„°¤aÇþƺ\ý¯Âúlû·Œœç;~\þ•F!ç$ÐHƒŽyç óJ«ð­Íµ†¡¤±¬/z!"k¢“÷‘MŽSö‰ŽH|O¥^Â$%£*8cõ$oýk'‘Kd%2™ÖDÚ.KŽ. †â9 ½Šêi  é7ÁX˜åx—“´–\òû™<:ä×”èRIpöÊ$”L™ŒI89ñžsÓ×<×aêjx˜ˆ>{£±ÕͽÀ6Bá-¢i /MÍ÷Ab ¿7>„ô'¥r#–ûBÖíeºvK¥Pö÷ ¸=7ž˜8Pxé»±Æ,kù¿Ñd"Œ”3œð ¼¶:‘Œçž‚«]­ÕÞ†,5|ÙmCKe¼'ï26ž@$ŽWƒÜ/½rѧf’Û±* ÚÆˆ4–¾– ÔÅÔÆÙSη#2úçN~nÄwÍrî÷²CÃà«ÆO|¨éqÇÓ[kRèÏ,“Í<¶ï¾F?3°=ýðIü=3Uu·¾¶åy 1 ㇀p R9ÆÝcÝ®ç8èÞž£”[³dºm°»ðž«¤ªá牕£##Ÿ÷j}<\Ïâ¹íÔ0ÍîîýæÒØü)¥ð¦™q£ùÐI,yÑ4ûa,FPü äI=½qÆ\‘Ob¾!Ö\ùOóÇlåŸc?æØ9á½+XÚv¾¦ª/•žkk[µŠö+†³óY^æ9Vsƒ³83“÷ªÍ­Õ²ß½Å—š€üÊ’ÈÎz3ÇB8ü3žµÂÙµ¢Úç‘6TÈ À9<ô탞yô¾Ôïô¶7ê°B³F¬žp އp@ãŽ:Õ4vZÊWÑåá/j£Bµ·°»²½»“Ì•£¹g_-6ü¨÷ÈÎ9õß­‰Ñ&¼¾‚æçU¸¹F’Û%„€H]ØhC´ÎXr3‘ÍxfãÃú»ÖuÉüÉ®–Ú8bi5ªå’5FãߨnyªÇÄF¥Ã{¦ê6-dŒ‹maóH³•nrâ70`§hQœõå†2¤ áun ¢ÛZlsú£ &â+Í%ÒÞúÐïýӠ݆e )$²ƒÎK`9œ ùµ½bâ]òIqpy¢fù•—#’Ø9èyü²%ÓìcÕíîKËh%\˜"UËdœÝr *¹-Àäe„PŒí|˜cÈ9c<ýî:zŠQ­%MÛb ±œÍ™Yd“äB[wi>à‘Ôgµt6Ky2Þ:âl‰d‰&l‚cnH òÄ÷ªvBÈÛ’þc}ýϳ#*@Á±-ÁÈç¯OPøAŒÒÍÕº%ðù Iª%—æ-žœû µ¥•I(ßr ¤åg¡[Eð¥ÿ…t+ÍFÙî…ÄX„h³ÎÕ˜îÎx^0x¬›jr\-íþ§0a‘¤A”6° ñó}>ã%Ú´Ö¼…“36ÂÉÏI‚=O^=|ÂîãEÖ|E{¨jZ…Ä2²<Ñ3«ÉìS°ãíÔ“ËÅRTß*›v:jrÁrų›IšhæÿHT-±O˜±ƒ‘Ó8Êöê1^û¶šj]XÚ6Œ×:Ž¥vŽnÚ+Çò°~UСË`H tï\¯‡õ,~müS%“n^Qº0øç-Œr#hïøÖoНlÍü3è÷w±ÊƒbîpF2NAÜHëîã\J¬¡+CwßS¹GV´7u›iìYáÖ¬cò e@cQ…r7m%8,xÆ1Œ‘Te‚ÇV¶q«».Ö‰™–<‘Éùrsœvçç5Ÿu¬kZ†o§Kª­Ó¬®çËÜÂ]GÊÒ·v@$gÝù+`³™U’ÞýâPbÂ)îܷ#v9#•ëÐôRn›»Ùÿ]N-Þ;–Òþ+¨¼‰ÙÛyÇdŽ€Ÿ\ûõÎ9®ÏÃúéÒtÛ½+RŠuòdeÍŒ0=†Y‰ÛŒtpkœ—Y²bŠ÷N •[s0Êq¹AÚªÙÇC¾ù IªÌ—º³F5ºuÚï—zpÌqü@sÍoh8óßQEÛ[ê|«à.æóZik%Ø‚&™Ö5Ëèp:œgK1bUÝHÜR1¸“ž¥AÛÉä¹ëI§_4ö+iu1ó#cäHýO‘Ïeô=½ÅE,wV7rU>T±·ÊãÔwã# ò*O²Ã5Õ¢Ú•[‰Ó{ÀØ Ë²ü™ÿw%{gŽ8ÛoÌÕF6¿OÅ'DÛqo~ˆ’ËÁxX£·§³äjWk(¡ŽåV[Ydgܼ‡û¸u>ÜðyäƒM’qyý¡osG$²2E#º>vœs·9ã·$ äú¼Ìz5{×ì×kü<¾e %Æ¥#ù1K·ÿ?xDÈ&”¶œnŸõ¨þ_ÌQ_I|·x>Z´‘ˆÚYæb¿I çñÛŸÆ®÷ÐâÄFѺ(x¶6Óõêä7ÞU\“޼z‘üªµ•Ìrq‹"äaÈ#¨5Üx«L[ËRBùÈ>„W–Ù\¼Í@Ë‘¹æç#OûµæV‹„‰¥>h…¤éý¡$ˆTœrHäsÿ}V~ŽÂÃâ%õ¸â+ëE”VC·ùdþ5­À–pbm뎼súŠ‹Ä ö}oCÕcáRäÂþ˜•vçð ~tÔí¨¤‹,$Ôþ™!G’K+„:œ|§ë÷æš*[ÞÛGtãOwµó£”Ìv6Jðû]˜!€^ƒ9ÇÖ¼v'ºø}«-³È“C 0(wñïòŠùÿ[Öõ=BÖ¯¯®%Á±toœÆF?€ äãiÇS\™šr”O.ºŠweÛ]Y|¨ÒV3Çs–ÃŒó×<ý?AW"³Ó¤‘­Ü°ÌçzDª3ž« ÇŒŒvúž"Å%¶oµÙÛ³.rÈSz¯qœñøVZë˦ßÀ«*.è¤*ÎOåÛ?‡JÊ7Jìóåfïk¥šëpJÎUîœÄñäÀäŒuÏßæW{)æ2Néqm>ÅØ0 ‘¸`úïÓµugM¿·Õ¾Ä²¬±,ësi'I £¬l§žW<œv9"³üaö;?Ë$Ñ9ŽfIK2Ž6˜üÊüƒß•Ó'­N¹{ð½Î‹Â׳]*+ÛÍ)pÈðyEdÁ8äñ»¶8Éžiëò}³G¾¸žB¢òhö¤€Œ*’qÇL`gßÖ¤ÐÚÃű[Øê1_A#;†€8ˆ¡°»€ÉÁÁ#ñÍ-˜"=¼Î×6îrÂPˆ©À8É'zñÏB{šÎ59)7÷û»úèVçB–âW’+ûk’¯hËÈ^å¾e*TŒp;ˆ8ÇX «xžÚØÜÄ é–@ùîl˜‘ŽÝ1MÒZâʶÁz‘Þ¬„+ùjã§ ÐŽNp{zܼԵ kˆ-õ „¹¸³Ž=÷ÖÓù¬êUZ%V#ï8È#‡¡zéüpË &P\”S‚3ۯ埡íT¹W™Š›‹±é~!ÓgŸìZ—†ìamKs4í·‚åÜî/½Áf*HzÉ-÷MtZÝî™áŵ¸Õ®¯ Û»í‚Dbº`¾ÝÄŽ£,ç®>•æWÞ2½›ÁzM­ªªÁxÌ×Ò02G‚FpIldvÏ:Ƶsv–pÛêd§–­4¦fÁlñ¸m·~y­#& ›×KXÙM%vŽ»Æ~>“Äbk}â+PX¤!²6Á`1’vç9#w<¥¼Ñµ«.¡4í •pÍåÁÆà9鑜‚GJç58î­o"žòCýÑ!Ü0¤õ ôÇ5Þ_9hå(ˆß! ‡eQÏ',N3ÏsÇ•J’­«dNr–·;-B-KÉšÞÆQ-µË…Ò2cuaÜ×Ú¥} ¤hÏ6èn#b²…µ(ªÁIÚÀn!ÇÞ‚{W¥ü y%´¸³d…D2ƒªC²œ|Ø8Œyç5Ð7…¢ºÕ[Užòæü3±.d1ÅdUlÄ1“Ç_~Øà…'9Eë~–¿Ì¸Ãž7GŽZ}´,¶©sjË€‘5º¬ÎIBè¾qÖ°.~Ò·i{Ã`HT#Kc’Û9öÈ⻟=‰ñ´Z&¡mz ‹aí·f!˜áÎÐ¥Ilp:ÝkH닦i0鶺=»¤Ö1¼½·ÜÑÈí&Z5çä%UGàWU Þ¤ÿ_ÔǓ޳f?„´çñ%²Á9Ž Î"HäIÚ ¶à~aÈì¿c¥Ü躑µ¸ˆ0¶»I#I`äÀ¬NÜ=À®‹Ý2Ýnm ‘²´Š³¶ÐÍÉVÚÜ:Œ’9=+©ðˆ®¢¹·[èÖtZT¸pÀtPFŽ¿*çß8Ær¨ž°cŠŠ>hð5–•{¥Êe¸šÒçÍ#{®øYp8!Få ÷Žzw¯@ñ"ͳHÐÉ[ÂK|©‚ŠþÐ9pþ€ÚhÉæ#$…·2°ÁÚz~ÕéZ”°G$#¸µy’ÚQº7Û±÷>õõÓ’Õ3ë¨ÒŸ,d™bÂúH„–¸Y-[¬2Œ®¼¿ÝaÙ‡"´¿³¥ŸL‚öÁ¥¹€ÈÊÑ’<ô*l÷Ç̼ŽyéOñ‰¦Û^ùZN  %¤Í÷$î‹!ëøÿßUBëíYÆ<È\Dee?)V22ÿ%¹\W½ª-Î3ÖKúûÉšó÷ÛùK$ ›š6bT±çp#¡Æ9•­cöŒÞXo’UÃ^/s€23Ü sÎ8Íãiª´CX”ÛÝ.íÈ›‹(ýâq»ŒaëS/ü?}y+î†Hmf1º«’¦0ÊÂ8úwÁ§k«-‚î2÷´ƒ#°-c5ÅܱÅs‘Æ&s9`ä=È~oÀú‹Ž¬ñ5•Ò¬Ryb%äìû§ÂqïŒäu9Á:¤Z•µ·¶H'3¬“"}ÉJ† T ùÊ89ã*þ—v× öK¦rÑ ±ÍŽPsò°î;zŽÜpV±\Ý>_ä\¢D“MÔ˜ €…A1±¿u=x<ŒM¸óEר$ââÝWË“8ÜF9î1ÊŸþ¶$L.¤±ºpÐË7î܃…É žvŸóÍ2åÕáŽÊè|깂lò€·CލqøHî ‹{ ­yºÿ_ˆÕ(€ìCå¹Ù<=ÁÆ(íý+郑4? ô”|çlœú5ð,WÍiç[IûÄau|Ä“Ã#?þ±ÔsÛ5õ?€cH¼¡¬hÈ¿Ùð7^P}ù­™ÇŒv†M¦”‚2 y¯‹4ëKPÍpåÈÁFÁÉ=p,þuéuå?´ÌxðM”ÊÛöœ[Û8À !¨Ž&7¦ßcÍöŽšrF{x§Âúk˜f¼h¤Œ…e1Ÿ§öàtæ¨øÄzç‡%†Þû{ & ªr œ®N8's^Y¥Z´ð¼AŠÂ-µ°WÜsÇéWÎwem,Ð#4_2…›ûÃ=þ‡kÁX—±É,ʧd{V¹¯è°ø"êþöò%µº´)µ$ ÌÎÈ÷ºñÛ<_8Üj1M§ù£#>Ð@ùBŒœƒ“Û'­i\kÏýŸieŸ}ÍÄ®¹\+ù±»#$p:w¯¯Xæ;ƒö™b|ѳÀÈ-ŸAØ~­l\TcìDêûD›Ü§;µ­»­¡¶ŽT|#ÙnÜnÎzç'Wíײϰ»®àEEà·|c¯&‘E´Íá'Ä«F2ãÐïV¬-m.ncµP•%•÷*…À'%·ŽÏÎ}jé·ÕÜÏ•»j^†KMÍÕ½ûÜyh±MÃ…V%:žÁ¸ç¸7ümÜéì’BÓFÐHx *·9#8 ³rîx¬È¼9¡2 zÞ)Ú@<©dX(-¹w{sŽÇ©­×´—…$²Ôæó'ÒîÞ3,Y°W;€åNàsŒκSN6¹´Ö%? Fx–ÞÝ„2}¦/2¨Ý3³©!>é ƒÎM^Öu Q'Ômc‘ãµkƒÍû÷$¥HÏ€:â±ô=0ézå•û+¬opb‰qòçîåNEÎ Á µ¡ãIm¡ñÐ…ÌÓ…8;²6Ž9¸÷®iÒ½>T¾ò]ãM•-ѤˆÈ<˜Ô)RìÛU‰ã¯ãw=ãsv&¸ûaß@íž+NÓŒ}¶Í³‘˜ã‘†ÈÛ¼‡†}8Ånx;—þ!Ž}=ÜÅ$S id“jG½önÉ,X2 €çsI{©GqÇWcÔ,.V56·3D"YŒ[B@ßÃ&{°S’8ªúg3›k¨™âäåú¥ÆI>Ã9ÿ8>Ë«xé>¼·¹ñDR‡öмd 0 UÙ±€Ên Àö‘ä:œ‘´OoihRÃ)ÒUw“±ÈøIP2ÝÎ)ÉÅ^Ë¿õrÝ$­'¡ÖJlu_ÅsÁ¤ÞZ¬Ž–Ѳ•?;¹À铜g­aøzÿµžG‚5F Á3ÉØ¤ðIÎNxô8Åf[Í(¸ó¤Š8Ñ·” ¹¥K.=rÞ ö­Øõ&[©.Í´©}Üô,O9õÇáXTŒ¢î™”ç‡Þ[]wI%·Pîa(ß!ÔòN0s޵\xyWO7ó29W¢)$Œ€Á9=~\;ó©ŒÂ$„1LBÆ…)ã•b9Î9ã=9¤ž+‰&{KY–:4®ÑžŠ v?7ÿ^¹+6ãî»2!;=Q—¦ßêvW>T7—qJŠy:HTãû¼ŽžãŠö­'^K¿Ø 95Iž0c–d?1ÈÎFnç z‚G‚/³Ç3Ki|gMöäÆp…°A]Äc¿@AÈ<×sáëÿì›°Ô-4õÓ§ÃèÇ'”ï(åUðÞŒŽ Ï$à¥y5)}ûÆN2Ðçõ+huIm…ÁĹ‚rÆO$ãñª|Í¥ê1Þ,bpÄï·¸Œ2J3ʸÎ=sÔÁÅOñqe®}§MŠE·RÍJ¿<›•28uÜ2Ýù»Šç¬aÖõ£Š)'¹bå„!‰Ä dñÀ€”àÝ·&¢\÷=£Àíàý{N¹–úÞ Ù]˜²å©9ýÛ`*ƒ·P3Žsß±·ðnš–¯e óÝÛÎÛå{™üÆL©R1•$dôàŽ@¯𦋯I<‘UbØe8‘#”È$`ŽxùqÎ+Òü¨é,¯-³Kl±<^|’¿Þ ÷~ñLŒ0ÁñŒŒWm*Цҫëgø?qµ9ôhù³á´–÷¦+m~¿³ŽÊiX;é²&o•ú¯#sÒ¦µ±²šöÞ;¦… ª%[¶h$d‰ÁP0=ksÃ~¹Ã:µöŸ}g©Êl¼˜íí2ò컘©”5qrÏ3ÝÈž[©@0A9ïÅ}T¯mO¨§Êçh;hnø‰d‹ÄhŠHk‰%ŒŸ™]K“•aÃzŠ-¦ŠY+ûcuÆÂ$)"{+C‘íPéwÒNÆá„¶®ã)&p‡?xwÜ`Õ‹g&¿[£Ãf$Vq<™hðzdxÿ=ë5vï§eË5rÕæˆzË¢ÜI©D&òŒf 'O›”î^û—ñ S[j—q‹»Iе­Ë0žBKdàu#¨Áâ²Áš)e¸”²L[qõϨ­«k›]JÝŸS¼òáMÜXW9ÎKŽÎ:á¿Ú§Ì“¶ÂP“þ%ø™/áø%ºFÑç7AØ4¶Î14Cv2F\ äsê;ÖÔV÷SÊf‰#šWÏžÏSÃzŽzõúã‘­è÷Zl±j—BâÝðEÄ?t÷Sõü ­-îÏSHΦÆÚå_›˜cÈ“á×±í¸~ õªjëC4íæ¿\›6¿g°³G»zä}>e=ùØýz#Å qî¸Ì‹r‘N8'ƒôê§ùàÔ²Iäƒo©DòÄ#y#RØ#å8dq‘‚@ädsœU5‘áM››)Yã;GB9ØÞ‡ë‚FiÅj.—ïý}äö¢Eò¦Ÿ;ã Á*·98ÉíŸÈçÞ¾ªðÄK†ô¸Qv¬vp¨q€«å(6HE浡\ØÜŽ¡íœþzŸ\XB-¬`·"P~iXâÆ;ÅWþÔú§öw‚tà"y —àü½±óù‘^½^5ûT!—ÃÚq<{•Ée;I€FwnÀã¯^ÃSâmõýªÛ[Ù¢Ëô³¡ †PPcƒß#ÞµŠ’¦Ú:šqR¹æwë1…¦Ý'"CÔ‚0*ßÐt{ÙL¡·¼6À<þR–p0Ñž9ôÎNeéPËwª HÕ¤iÔ$›W8$ç<ž¹k¾·š].×Ë·›hÂù“Ã[ƒÎ>cÎy?†ãš/Þ×cŽýJÖ–ºõõÜò?Úm¥…L“[=™¢Sòªªà“ûÀW —³"Å3[Ülxä›`b«’ŽìqÑ×tã=5´eÓÚæè]j3i¬÷ ,Ò˜B™ÕËe¾îYJ¨è7ž¡JœdŸ3a«ÚÆå²éþ'dÓu]Z;Míçnþ  @¿.NpÄôÝžÙÌÑeÓbÒKßÜš(‹D2pJ€W€:=1^îãQÕmd»,âÑä2Kæ2ÄŽËœ.O@íÓÓž¬½çc9F3»Cï&µûRÿiØyÐHÇ*o˜ƒå,ŽXó’ôÅ]Òí¦kè Ó¤k‹%ù6ÈNÿœUo-’z|§¿㥞{b‹kg ±`Ф󌯡ãߎµÕøWX½ðþ»§öêÚg•L©Ê•éÇE㓎”(Æ[ì$ì¬u÷Ç•6Žú¸[‹W"æ9íÝ!Óx$úèT¤pßøš}?UD»ŸÎÒä°‹ìë'ÍŽ2vîÈÕxnÜàXêir#›QÔo¡y§3ÎÅX¦;€ Ѹãx$L*µÔ–‰p ¤¸s‰Drl¼séÏ8æ°”#JntºšJV³‰ïÿ€4oé6Òi»4«”^AVm¨Øà¡#ýëÌ|_á[¿ jë§Z]Í,dïÄR¶ÐwŠFÑÈç¡5WÂz¾¯oæA¥\MÒJÚdHd”R ãƒÆNxÏQµ²×$²µ `º‰§am*óä-‚‚çŽAzæù¡VŸ$iÙ¯ëm ”•Nš–tæ†m";­ÂÎA:¯Ûd‰ämn:õÈ#økJ†k•MO¿žéäw)rûDT€_†^¼óèzŠ·cáûéug2K§Y¬^d²Á6ã$ `à¨#œd+¶·Ú[m# ƒÈè=÷ëWƒË§]©KD¾zyáe©ðÝÕÅ”†{yäã8GV(G¸"º]XµÖ'•¼Ejš„Âò¼¿rà ÁÉ%GÍšdþ²}2Òx5»ky¯!óÚùYX.Jƒ½A^Höõ§Â-®ØhÊÚ  –8ÓÌ·u˜,°ÚIÇÈ u¯£Œe}$ëQ”uÝwg¥è7ŒÓèúï•?Ìëg¨(VÝŽdû§¦9ÅdÜYÝYÌ"¹·– 8ù]pX}zî3YK0n8žÿJÝÒuFÆÖåRQqHÁ:‰bÉeu²:fã- P”=軯?óñmit^(æO-T$©¹C^}ŽÐã#š±iqkql°B±)3ü¤œ•±ÇNùÓ’÷AÔ,®£e.›1*ßh´ýäd€qº69xýÓøvªƒ@¼žâ4Ó¦Žþ)œ"<îqʰ ?,{ÐÓµ–¡Ì¹¯;¦_½»ºÓ­. y‘HV{d=GoJnq¦jÂ|½:ðä†cˆ%>ç¬gÓŽØk#R½º´Ö5^‰w2[ʧ'O¥[[”OoæE1bÈØXàŸ˜œŽÇ?Z¨SQ…RNm?ÈÞžöîÈ >îÞ'·òðb.Ï̬3ƒî9ÏJмÓÞk2àÏÊÌ›rBw/B½³Èú ¢··–P[«1EÛèHPAÎÓÔgŽTŠšÖå’Sqa,‘ÌA(ªpÈIÆïÇãÏJÑDWÓú×ÔÛÒí¡¾Ô¡†Ê? Ë2«D_8 Ê¿.zŽzŸ¯o««åÜEsã.íÌw-¨Á¹‘p®D«÷“±ã¨Àõ“_TUžv1ÚÈ+Ä¿jÉc]7E‰‹ùö† ‘åõüëÛkçÿÚ¶ëf£¤FÁ|¸­e˜œ6æ1ü5Ž!^›G›YÚ ñE¢ú)àŠPfrB'íøz×e è·÷áBSƒæ0lñžãÛ·5Ìx:ÚÞH¤½i•§y’(Š) 2>èõêG¶+Ò!Ž]+ÉЮ$¸kõÅmÓ1ÌyûÛ‚‚Жé_?^\š-Ï&I"ž¤š¹o>Úã$H ±K÷JÛžyÏáž+9.^!{!KHLÒÄQŠpÚ:®FqïÛŠ»¨»¬’̉C9òIBÛã~A-Æ3ŸL Ì·ŠîïQ‰€~þO¹å`à1àäv<óYBî:ÍTÒt«Ù7YÛÇoq"y#ÊÇÐe66p¶ßæ)oü)sýŠ!€Ì–÷3nYNÉÜ9ÎJñ‚*K;«+4’ÚÞA1y ?q†sŒà Ž@“Œ{ã5¦¢¯1~ê5,Fæà®J±û¼Œ zÑõ™ÂÖcNÛc©Á©À¨Ö²Êb4»Lî#`ÞcÀÉ‚Ëí1?r•Vld+1í9$ð®îðXjÞ%¸»ÒïVÂéfs<±Âî%V €@>¥$Œäðj^ÇL¶»‰uY­c–}¦+‹=à0Sƒò*ÄýwªªQKfoJܺ33Ä3É©x;IÕ:‹T˜‘ÉËÈ9Çýõ[-šîÃJ¸iÖ!±ó˜‘°¹à}=(ðý”4s>›{Ó28hÌŠz¡ÇyÈè*ï‹¥Ò¬¤{xšÚt¸óB€;ä€qß$WD•6wë(_Èóë§Ómà7¸¼½;”¯ßŽÛ'ø±ò—éì?Þ®‰5¥ŠùàŸs[MLj$zî8Ï=øïUõ=ÄÂk¦´ÒGèùÒǪ»sœ£(çÚ²5[èg¼šGðÙÝ$§''Ž€z:ÆmòÛ±ÉV ɶtvw+*8¸·Žß1Jœ¯¿J­uóK$ Ä¢1ÉÆ3ë‚NÔdb°£šáŠÆ—w Àò:ãüÓŸzÓ·³Ö¯žHãŠîíáPÒ¼vÎÒF„cpNÐr ŽN+ŽnQz3ž­ ÷Ö—Öm§4PÍeö»fhæ¸û³€Xew(ÂýÑøg<ÖÃ/k>&Ô>ÌI#Xˆ+æ.äJƒrp¡ÆG>£›«iMb—…íŒ1ÛLökçÉâΑ€v.AÂáÈ'$SðV¥{e~/ôù.¢’b³¤»vc$’8ükMÅ+mø›&¬»Eþ‰qc¬_E•ýŠòƒRŒÀøï• oÈè2FOQ¨C¥Ý´zm¶ `¹Gi˜˜0ÆbíAÎr29ÉÏhõ{»›‹&—Y3êW’y²¾o˜q”lñ¯~œ}b´·´ImïÔ”‘€åØ(VRWaàðWiÎ\gŠ—_Ýæg9+û¬ÊµÊ>G”]•¾fTòFÎyçi#<‘ÛƒW-âF’ÓÎ0ÊO=·\¿JÖ›n¼²ÛÀë ª¨_Ä£$¨8‘’F}¸ªpøtZ4—Bú±*€É·£n`qî =°(æê`ìÞ»›2¶ðÃø;LÔôÉä}[Ì·ÑM+"Fò„ …àŽNrA¡ðóÀñk7–·³Oo.žìÑ^@/"Æ ¼ª±\z†o éQYE¼W>Uº¡\.Öecƒ¹¸oÃߊ±§ê3[¬v:\pÂÊOš©ªàñÓ9#Ÿþ½eR¬Sæjÿ×ÌÚ3½®ÿøAn¼?«DÞñW7‘Iæ*²ˆ$Œ± I\ŽéšÚþÖ¹›[:œ×Mg­[¯c¨EÀ]¤áœž‡ž\ƒœ$ÕãÙ”mÖDrZF|sÎG·~sÛµtƒQ¶¿Ðã²¾ÖÄ-< Ñ‘S9Æ8à€|ò*V&R‹Š¯Øê…H§±¡'¥r¸ÒÒ‘œ¼£g\‡8ä‘ÅBºõƬð8¸yb“—)á䃒Àð ànSÆÉa.eû Ê`ݳÊwß‚2A ´’0xÉî}éö–2ŸO¶îUÝ&“aNxb§~¹ã¥[Æâ$­í6ùÃ>ÖÖ±å¾:»Ž}ZHÚHã³²‚…q´ìã÷cYšmÔör‰mf–鹩ÇÔU›^ÛQº–çP± ,Ç% ¡pGAO»‡FÊAw}j$‰dhÔgÝH<}+êegtϤ§?f­8þ¦¤Zš]è÷7; VXáŽGdBÁØü˃ü=ë>tЧ±’(Må”ÌUòäKÊÿ Üç¥J4èn4€¶zÎu'žÈÝåÈp¤doÆ~÷J­}¡kh}6ê%a€â2ÊGûË‘úÐù㺸/a&ìíø>ƒ©I½´–·±9*<™FáŒgålâ•þÔ¤S £qœ©sÒ’ëÍH,íŒf)7•ƒ ³•çþýŠšÛT»´;Zç|Aå†AÁÇÊÙqOݱQ•G}n‹sêsiZ•œw€Èv¼ËóPÐãæî8Ïjœ.•u\[^GfÑ„E¶Ÿ%ˆÛµ€Áû½ÀÇÕíKK¤ŽÝ9ùÛ-³yg'È9SÐqQ^ið5Æ-gá¶1v=:‘ZGUkÜ‹YÞÖd÷ ©i÷¥ =´Ï’N$‰Àô#ŒÜr=©±>Ÿ>݇ìn¸R®K¡ç®~ðǦëRí:Í»0¶ÞK”pñ1ÀleO½1­Äʦ‰ÙA2FN:s•'}1U4‹Uø¿Â9®|¤Ç sÇöƒ$2îÝ‘Èã ª¯ò¯¦+ç‚VJß4û»k½ÑÇ ¬‘U²" ät#$w5ô=]îy¸»]|áûU]4Þ2Òô…¶Y·éâNNHÌ’Ÿ…}^ûAÄŠmæ_/Í61ĦT;A2IÎG'‚xÿæÅË–“g™‰v¦x»h¢8àŸT ÷aN㸎ù'ÚY¦—¥iÓ2ÞGpÊ€Ò`¯rsÈÚ=²8æ¹éúÚ9g¹ˆÓkoK]¬G]­ÏR:Õ¯ª]ÇsöÙ%@ÙyʹP§9'‚HàÎ&¼ ɵ©æßSZÚ]>çF“jAºD9U·ù°xá‰Èßë\õ†·eỈìÛG{Í=ݤžxЙCò®2»€÷=ë^ôÙ, &zl]‹†Áãýœsõ®'ÄÓ^̪Âû÷ H .2}ñÖ²§(Éò% šÖìéV²½¶0ØXg´ˆ"å@ŒŸí*‚ÀÎIñ’qW4ûý;È‘!Õ­üjà£Ì A8,ؼt=«È¯®<§0¤kûÂ63Ž:õÏJθŒA4j¬Ü줞½9=¿Æº¾«¾…r£Ñ,üCu§ëïü‘­´ržK;T°ìÀ>ã³<_¬M}k-ÛjvíNLKs+rå”d…PÄ Ž¥½;æ¼þؘÖ6‘—,ØP¯o¬ ·BO%fhó·s|ªÞ¼cÓó­¥ANÞ^E/tÒðî³}§k–we-]Ô\FìBÈ?ÇÐú×§x²âûEðÄú¤Sy’ S–ã–UÝŽ›½ñ×ò¯†‰.Tȳ×n;×½ë–_Úž».ÞS•F\•U$F]ˆdcšê§%êκ5-}9ð¶’5ÍMîeÕ I#ijÉs!ËØëÍmj? W[á¿ ëÚT±¥ÅŲ/™™mâºò¥ÀfòÎv°fìävÎkJAE¡ºÓo§X­SbÛùŒ¯ÁG9#ÙÍVšâêù"ž÷Êx&IR9eáÂç+¹Ÿ qŒ ã 3\’¬Þ›·#Ö"ûis²­ÔIºH¤>cí…°8À¥T’Þ+8qwµ¸™s¶XŒL?à'ùV–©¤iÞ ³šn¤ÓjP1¹ÞdA’$ Ø`uæ±tÛûÛ;« µ]Š«$¾‹9ÆAàuSëG2”|ÃG¹–e¯áûL‘÷"mPObOzóØu5±A6Ø­Í ãÒ‰^= ‘»8ù°3ÁêT—{u§í1[ÛGy(PêÛÈã–nÜsÓ©ª\X &§“z€€(çî ã¿"±mÛ°žº×Ȇ?d…Œ¹s) Ä€Bü `žy qúÕ-3Wµšf¶ŽVYÂã[îG^qŽsíW`žX.Ý ½‰d|1>NHÁ# ýàzÖbÇqJ²4êÑ’®±GµØdqއÔ`úNinMâÜI~·(eVV„‡oªqŽ Œæ‰U÷lcÍ%¹ÙZê móÝI«“ )¸–Îp¹É''§uÆ*8î4ÝFmÒ=¡CQYŽFT–S´qÔZ« °°¶k³s,‚Ì×eAi‰SÔN{GÔÛ;8,îç¾¹–)°Øš8ã'ûÇçǧëŸ7Ì÷ìx”ˆëµ*ÙËgŽMâbªcng8Á©$ñÔ÷%ç†ÎfÆu²r>¸Í}ÊI]j½¬¬ÚüàM<±Çµ²AÁÇZÙ²¿¹·µ²Xo'ˆG$…vŸÇÔUÙoô÷ŽØË¡ØÌ^ Ò( %›©ô VëóÈ^MêØ-®‡aâSè)ÚÝA9u×Èm®µ¨Ír«=ÌwˆXy‚é¹ç–O9©â¾Ó&•æ›E· ©bwŒ Œg’GzSî"𕶦UdÖ<¸Ï;’#œ¨ÿ"›Ðž9%U¹ŒFTl–Ó9Ü1§i5kŠôï~V—õØšH<6·ί©[ ,ŽŽP2NGUíƒÓ½,z\W*-kLVœåVY#Éï‘ýMWŸK´Ôgsm¬Ù Œ U-µFOÝ t'¨.´ ¹Ý,î­'+"uSÇûØìRVv°9F×R?øam4?é÷QH4ûÀ¥X«Ä R0y ¼øÕ±pþa7–ÑJHÆvà“Ó’0sõ¨/´½}RÌÃmqåÅm°˜Žà wn ÿµ[‘xËhäƒQxÄlBHŒë= Õ²"ï­ÑÝ|KWñÌ‚ØL<«9«Àrƒ ñ޾ÿZ÷ºñOÙô»ø‚ö[«EŠå­_ç °•.T`uöõ¯k¦;ß8W|sû7ü'RÜÉpû¡µŽ?-YTr ‰ççÛ½ö¾Gý¨¯îâV£h’Ì"Xa;Q»˜×9ü;Wa* #ϯðŸ‰îÖ;í0A+N® ¸Œ¢9çzw†/d¸ÒÙU L• ƒpç$œóÎ1ôÍrÖWÒÄZÞ[¦ò¤Nc$¶áíèjö™ö´–´ŽBÁN"v\ú_¥xª•—+ÜóÔ{$×YMp­136æ ¸ÇNAÇå\­åûê7F9.JÀôSï€*ƼnÈb–+A6qQÉô-Ñ+*êÎâÂÝ–âHÙà!g°8cÜc¯Ôd{ÑN“‹æ—Ü+X[™ôï5 aY‰8=Wüš¥vlïÜd³Ù ù—؃þ5JæY.²V21È>´Ðß,{²Ê3ÇOnÕèBŸ^ ¬Ù¯hæ/=@Ù–ŒŸ-±Ç$ã¶jÅ®›d4“s–—þZaž8‰ãƒÎ|W9Š0bà9rKuvéÍt>µ]FX­íí..¥¼Œ‘ã Ï,[8ãýj’i\¥¿t×Ò"¸ÙÞC¤HöO(ŠO²Â¥Ô7sȤ/=ø5ëv³cH:}ü$gäÙïo/¶Xt§ÄWeÔt{=RÇNžÎæÆÀÇçÍip»cfÜـŸ#+ŽO5ÛéZ”7·ÎšXšÜ’TÌêÅA'8Œäן:Õ¶Ÿ‰Ó8µMÙ爴‹Bæ{¡}9¦"%âªàÚAÉË.yÁÀŬ:N–5>w½·Kƒou—í œgväå ÈÈëš§ioá©þÙâêÖ;U›xÏ<. S“ÕºúŒê>x%?ø?3’wµ¤g.»a·Ú`iÈ‘wF¡U3ÈÉÎ¥$º®•} Î ¹…¡¶òðûŽ3ó±äyàp=k Æzf›Õͽ‹­­ÐäÓä ’[‚¥±“Fs»¸íÍcézëIvN¡'ٔǷ|k€Ãý®8'šçtU¯9zØèô=gR3"Û[ML®žfæfR¹ÆHesÁ<Še¶¡¨Í­\XÛO$O9W!ðC0ž 'óZþÐãñ ãiqkÛ)åLïhUœ§'ìÉÇP3QüBðŒ¾ñ pi7qk3˜<æšÕ ùq3”]ä7•<çõTìÛk¡¤i¶¯h¬¶É Ss`¾f`ù˜Fd=ÃÑ=Æ2{óYþ\yh!¹„ɇ’yŠ3÷°Û“Ó95Íj—·ºÄ³\¬3È C#3(”ÇÀË•P¾çÞ¤ÒuË›=1, XÜG!‘$;ˆŒ« ò½xäŽjeNës'O]θ_Id0\ÅtÙTDU$+=:`g dåÈ5Ÿªk–1'Ù7]ÄÑïYRWP$ÆÀ…$‘ÛŸ©äU -wW½>bÅlb‡‡c*³ |ïãÉëéŒ^¿»¼Önã2ÁiŒë,ën¦LýæÉ,HÉ=3ÈéÚ°—7Ãt8Æû%ü†õo"ÜÒ) rKÏ¿~}khës½’t³!pc*{ÀÁÏ|ôÇNÒ!g¦挤•Ú ‰ƒ§c•ã¦Aê3QëÂPÆ+§—r…%a؇Žsõãòäá(¸ËbÔe½±{;ÃÛȪ¨ÌÊÑ»+®}yèjÌs H¼¦·ŒÄê~eù™û õ«I’8s •p>Elôõ•µi}m5´±ÇÆÌT“žxà‘ìqߟ¥S¢öKRV½KÍ©j˜ç‹Td{”bÉ)u8ç!†F~¢¡Š{8¤—Ïhå…ÈV‚ì1Óo#ü+T7aaCo!*AÞXã“÷p õížO=ªþ˜Ï| 2Z®p :ŽG±#ôâ±ä÷m×±¢Hå­ü+«Éq%ºE“. GÈO<úûpð†§ö‡ÿD ÇV™üóYZ|ì<ù:m¶“x9+€ZÌ0M˜ú‚kíT`õw>Í{e¥×Üv‰ ê"³Aj²2RÂT;ˆqÏ<æ˜t-T_Ô«îÃå— Ï~kð˜þ,ÒöQn‘˜Ð ?§ÜJÒ\<ñd ¶=3Ïõªœa¸éNª|©¯»þ Ô^xW\ŸUÔ[$ˆ³HæE6íÜyäð)±økSâ(|Ç•B ¸$r3÷½MfèâOô®Ÿ2¢±o÷·ìµ:#Ë0s3ry57‡™j5/k¯»þ v?jÐ;I4F!ù³*9Æ1œõâ¯K¡jRE ŠdT†ñœp}}ëX2[_Ïví­Äžc’6Æ[ ŸnµyôíZu{ „d;îÏqE£Ùž{s/ëæ]‹EÕ·îÄX2´¨¾ã©§¶—ª-äMñ A+vƒi'ýî8ªI¢êó\yì‘Àši•À÷>‚¦Ó|:ø?hÔì¥`ÆNyÚ*㾦r¨×ÚOÑÁ=‹ö{¶ÔÆ««Üjw/— G7 (Ã;èN>êױוþÏpÅ –ª°Ê’ªù ½AÀ~ÄŽkÕ+kÜò1?WÇ´’ Œ:à3˜ð°F rIûn0rÀ}ªåN;ØÏT¬È-l¼#µÌRësÌó @bµ!Tn¿'§­XÐô_\],oªÈÁÙ„JŠ6‚O\öÄD”;NOäk^Î;§Yº9"?›oe$üñø×Ò*ËD¢}Õ´nSgCg{ám&üO§é’3#§›5ÇÌ7)Àj;kí(®Üèp“?»ó&cónP;SU-4MVö&û-”Î8Á ŸJÔêi²>¥=ŠHPžp8’p9íWNOoÀ‰F„ů©—yâûè-½Ž›j n,–ªÌHÏRÙ=ë&çÅ:åá7²G²0§Ë7rNxÛò®‘ü=á +x&ÕüL÷K*–T³‰À8<¶;ç·jcê¾³¹Xôï 5Êl^òá²[Íoe©“I¿v7þ¼Ì3ÄZôVÒyZØ.ásç@8ö«zwü$:ÍÁvûuó1çïIókiþ#-4Vpi:U¬bL“š–ÁëÉÏ¥D—ú¥ö©‰çp_qH‰ÀÏqQ:‘}NˆS©l‘etKµ³ŽÞæH-åiYÙ$™‚…A9þ÷åS$zLHçTw*»BÚÂ[œq–m£òÍsz.{ɺդ‚Å61_´K‡$ôùÍúV¼w>â°‚KFebÎ눣è>¬Ãnµ£§k$eÎWmýǽþÏ"Ùü;©Ïk ±Æo|¯Þ°,ÅQyà ›§=ù¯M®àIà‡™mâ·Yo$`‘ƒŽŠ3’I'ޤ×}NË¡å×mÔw ø›ã>/>*x„«/œ·î9î¯ËÛÐ ûf¾-øžsñ_h•P¶¥>àÃqûì+“­;~-û¨âå‹ì¶® °G™½IíT`šx÷6éÜ}þ~b8ý3[¤sN!°±E/# w$ð1õ¨[N¾‚{Øï¢o8Iåʘ¹äG î=kÊnÖGÛ#:»Ç 2D¾[ÁfäŸlUi"Ö§ayeüœ˜Ëp$þ|š•íœD=­Ç”¤¶6/¶kvè³KR,Qņ#n|g#¯åD7&ï¡ÊÞêzŽ‹så±®n›8r¨<9çßüæÝ‡—½üö@‚Y8¯OJ«â½2}A¬.]mÑÕ<ÄR®ëîc·­7U¹¶Œ±”ž/ûGö¥äÆ<±<€ñÈÃuÍUÑA¾…­YrY‡ú¾€zã‘Ò¹§ÓgMfѧcuçÌ<·!ÃqŽI=ˆ®çÀÿ‡t‹VÓå¿Ñ¯²—v2«"”ÈùƒsŒòû£¯o>µ´[ Eþhç)!Œ2|êÄde}}AúVíµœÓ?Úîc—ɵu[µˆ¬l§ÝÈ?w©Ž:×5HÅ»¯ò=|ÏKJð·-Ä6:ÃiÛNæB Ž Fì}ãÓ.ØärpEsRøc[[ëMy$¸X%`Èça…“%‘s äWå;9â¨ëšÆŒð]hýÀ»ÌŒÛÏP -ò© • †Îø ¹ÎjMcÄ·: Óˆ·Ó#0ÐÉ#ƒ!nOÌ1Ï@3ÓhäŠóÕ)©^2ß¿ü7ähüôeYôæMbK[½¶­»kv( ¹êqŽ9«º¯†µ-2&k›tX· ̃<•~`ŒqÍCö“ª¼ÓÅg?Úá¥9b9'Nvó×$žEkøOź¦ŸezË©Ï ›bæ?œŠ¹ÎÇ Æ6§FSÀëÈ©:‰®fgʛՙÚk6/uká¶iÈ ¹˜†Pv ;€ K¾5GÃ1Ü—ÌLÆ5Æÿ—…ç×°÷®ãBÓ®×RD·’ã샔òîwÉjä€IÊ’»ÀsœW}áï‡ñÃæëk{Ç”ÊÎU‹ÈÊÀ®\Ÿ˜gž g95/Dµ§Í¢3¼©xJî=A¼ÍCH™Œ)0ÈÌ`âDÝ·8 †äúóòmÔõx¤°k1Rk¤F€³¡ CztôÇ¥y¯Ákk{KE/£K›Y–†;YCåYX ®ÜŒ-t^*¾°]Òiöëû3í àÊu*HÀã$ðy#¢g…NÕO¥þ]ޏAÁîs>1¼Ó5I@¸¶’Úå•7Ç 1"Ç$ó;÷'Ì5¸l–áƒHÜoØÃgÓ¯©Ít÷—ºOˆìüŸ²ÉezPª\[+*ç‚GŒã$œƒ× ìy ´–‰¡V”߀‡rÚc'ž¹¬©kok{ùêEiJÚ_cRùkY!/ó c\0Pã?QÏj‹Æö÷UŠ·˜²3ù’HÈPÚp?{®{VÔÓ ¤d¿!¾Hñ“îAéØ~UŸ}¹…gû-ÈFÿTÅ0'¡Ç#9ýk¹½68ùÍ[Ëßi|2C¦]jo(&“j€9üñY­ñP†Þkm.ËOÓãþL-Ž€“œã­`j°É4Ö°À%‘Öµ}rxié^×.â7W%…²ž[§òÔ~|×ÑBwÙ]:p†³wõdÿð•ëWpη•ÉžR¢6ŽBŠª3ž=…e4’3°iYÛ¹cšÝ—Að턉çëÒ^IüÑÚE…úoçŠeΡeo.™¤ÃŒäfo9Èã‘‘€ ™9?‰›R”°‡èR:^¯wåˆ,¥xaC‘… ’rIàu¤m"8nI¿¾Ž6Œó¹ó>‡ëOÕ®nç($¹–Nz3g¦Ðü7­êѽÄvÆqË\L|¸ÆO©þ•0q{ji>hë6‘b-CO´5­‘’R ß+ç$}ÕÇêMP»Ôu[™…½¼’"±ÿW íú`VÛi:ž K©I¨ÜF„´v˶3€IùÏó«^øŽêY-`Óá†Ê#ÅKaÎÓÙ›©=úõ5´bâû¹)l›~{ì¼3ª9óõI’Â-»˜Î~r ìƒæ?ˆQZV‘hz@ÆÖKëÇÏﮞю9÷&mbð.ýZo±¬¸ÀpL¤z…ësŠ|‡ÌX´["— ÁVR7ÎzýÞËøsïG8ù/»¿ä}/ð~;”ø{¦½âí¸”<Ž1ŒeÛvãv®º¹Ÿ…¨éðûFY>ø·ù¾mÜî9ç'5ÓVˆñë;Í…|GãYžOxàh×ÌÕn]]ºcÍnq޾ܯƒüY{uuãï³ÛÈ;¹‘Úd=z`Œcð®,7"±çãâŠÖ–÷s˶ó!·¹`zƒœvï]½ÕÅÙ¤ì#/4Qí2xàsþsX7+.§¨Å§ÛŽ0Så ’£ø¾œÒºmU ŠØ(Y;\†QÔ“Ó^¦¼×%k=Î~å'–;{i1Í,lJ¨‘÷(Qß©5Éø’mJD´- Ù ŒàÅ/ÞþÕÕ]I µÊæh£Šë,wÀË HÇ1\?‰K}JaÛˆT$zJ2ìNå«¶ºº‰$¸‘ž`¼±ãÛÿ­\ôÑ­Û„¥än9éI-ÝÄöÞDÛ˜'Ýøk:$·”!aÓnOJè§N[ßR’oKˆì‘Ja+òœñïKn ;ÛrÑE6ì³Je)… Ï9>ÕÑ|<ÕŸ4)dÒ Õ`¨ …É9˸;¾QœŽO9WZ»F°WV"ŸPY-cku,* ¨~‡§çðæ½‡á<‹7ÃåØì’F O#æ=ÅyÇÅ[müeð¼7&ÛRqå$¢5òÛs.ÄTà¡ù0Frâº)Öíir¥Ô>ÀP†ÎãǦ9õŒã«²Üç®’›,¥ÉžI¤ÞÞbpÙÁ«öZØ}¡@×}¦Q—CÔôÈlµí¤†¨<èü÷Ì^„€zŽx=ÇÐâÜBãÏ/ ØÁü¸$~ÏZiJéêlÅwh|;ˆ¶‘Ýfg3 pOÝ Œ.p¹<“´t³®ç‚)ÉU‘› ¸rlœ`þCéSÛ(tW38fAò;d½ öË…qØäç¨À;«™ßR]Iu,馿ßÌ»·‘B¹(Ÿ0Þ¤wã9®šÓÅïŠtŲÒ$Ž1µ. ¢™†à¡†@ GûÀœsÀ5r–‘³BŒÌrHÏ¡j;¨¥ŽI'hŒñåª|áxÈæ¥ÙèÊŒÙížÔÓNÑÓR‚òÖîHâeÙc—ohoâ_œžC1œéôOjÂêÇZIìÜ"W¹O)±XC0Ú¨2[N+çm&úxŠK®Bž6ç!O 1^›àíÁÞ,ºI®üTúô©#\B"Æv¨;•±³ßÇ?'B9®xà}¥OŠÆÔª_Ý=:ÃÇq½ÕÔØpJÎ ÊCcvdw9?0*ä:¹ùˆ=°3]?„uËO,j4ch#ùžòH–T\‘´À7°qžµâÚç„ïôÝ[FçP±ÓÌKñHÌjø†Œ¯p×<#s%¤è2Ú\[H›.c¾“+$|m(ʇiÆzpxÈ5×½³µ¤Ö¯dÿ's½=,Ê3Õ<¦øx4ðéPÀìE¼ &2 ’1‚r|u¯(ÖõÏý²ÊþÎò9£-ûØ «"«,FG=3ÎsÈôíu‚P·‹¡ÕôÈtÙl¥Yõ¥ôŽÞat ²¶ÓŒ~«ŒVÅ÷¿ Z½¬v^¾˜¨D–h/Ù„“ø ôkP¦â§ìÝþoîKþRŒdq¿¼)£ëš½âI.ôöA$ûËFm§ê¬r>\åpGPÝ+˜ÕÓS°Óíî»>2®™›lŒ?LƒÃ¯Z÷H,¯áðððæ™ ÜZÚÅŽ6ºx˜HNyÊ·x9ÆIè3\_‹|+âë . m#J·ž™äxD¿iXIÇExÇÞõÁÇ ž†¸ñ4jBÊ”t_Õ„èE«/wãk¿1çÓ--tÐʘPoltùlqÅR›]½½ÒÎêòYÙîZv Äó´üÍgéÚ&©ªL‘ÙÙÈéÔ¾0£êO­& hq¿¼“P¼ÿGµoô/þìAÔž½?è§õzzE]ýìȳŽ{«¢‘Fò¹8 ŠI?•t·>]: yµíF;9&ÙG™7^8Žy5ÿ‹f‚ÊM Æ %&W‡—nÀo<úÖ 7×*’y_êÅ BêÆ¥V¯÷WâmÜxƒIÓoézRË0äMwûÂ8È!~ïçš§q®jZ­ÅÀ½¹–}û@^ÙÎqŽ€qÚ™€îCªßEÌ“ _;ôèqÀüMNšŸÙ3•¶V9@iIÇRÝ»ôõ­Så]ˆåRz{Ϲ-Ò®WóEÔ¿gxÔy €¸Ç©ëô5„VÞ<É"Djù$úâ”gÊô"QKc—Õ×ì³@ŽäðÎÃ¥a;áZV8È5ÔÜD²+Â÷Æ=ϵsnKe€±Ïß…z;•AÖ¢i4O9Ö]†b¡¶|œ ž}FW§­ >W”ÑÆùYŸ~xqúÖÎ$×4Ûk5ê²Ë‰ýÔòÕÙÔgoÊ£k¿1=@®óáƒ<=ãë[ G’þ 4Ñçk3ùꨰîlc~ÿÉålWcz莿g}QÀ¬öWwÚtˆnâå|×R<ÄUbw&ä^ã9ôö‡Ñi?ð‹É‘%õÌ),Še¹‰#l“•!6Ò¹?6îÕæþ'‹IÓ|VÃÂ;›$.'¶mâéq€û[;KÊà’¥zOÂûÁ{¡Þ•Šd‚â"ÅwmCÀȨR¼Ž¨FQšæ<ûâÕ½®¹öGYVDƒäÉÎ9ÏONz¦ó6£¦Éog7ÓM–e–tUV,w·Ý?(l.síÈ7~/$_ð”ÆÆ7Ì…>ÓŽ ÿ>•ËØÏ¨éñ¥Å»ù±Å:ºØØãpèAéÈúRvS»9±ýáÔ[Û¾£o–fVèZ+esˆÙˆgIÆ Á=òp9©§´´Ž%û%ò\[¼ “Ëd NÆ<´dq»<ãš~¡©^x‚=VCg½,kl¶î®§ €.Io½ÔíëÅK*2c!Ê­Ë‚yëÞ¸+Ê1“ó9ªè×RžŸi"¬’:·'*¸ ÷«Úe´÷“KqÆ8d“{?ÝØ¥Ïc“…#¤t§è×¶÷7¾MÈÂDuÆÂþQ\aÆ}A89öâ¾€Ô¾-®„Þ.M.öÓ[¹•éúlÉ »îã÷g;£Üž3Áã5âZÏ‚µ¯ë‘X=­Í®¢Ñ§†p› Ûd$a¶°è#“‚ nèTPÕjnéÉ"öt–w*o•¾bF_ÜàF•kèZûÝÙ=­”ÎÓ6è\í³nÆI#GSžë¯øsà{ïh1j¶ž ¹žúÒCYßÅæ¤-Ã!Wî‘ØŒç#žó_ƒ·æh«#ÿÙpygame-1.9.1release/docs/tut/camera/mask.jpg0000644000175000017500000004453311206577570020717 0ustar vincentvincentÿØÿàJFIFÿÛC  !"$"$ÿÛCÿÀð@"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?óâ}i‡æ…ea•9´w¯ß&Îd…'Žâ°u·wYŒA‹ÆG¹Sý+|ž:×-­LQn0:•½‡jù$›X9G»KñES¡Ìö:Ï JGŒ·¯rÞ>•“ñ Ó­$ øšYß§}Gô«úŠšly\ã<îkÆ.Úv ºüŠüxÉVþµùö6å%üËò—üãpTù³%%üÏòf.š$]ç€BœgèkJÐD!A‡Îsž½}*†˜©+ÙÒ®ÜxnÇj´!áaœa²?#_W’è§/?Ðûܾ¢£YÔ~Ÿ/ëþÂ:|—Æe·WUêÇséXWº¼²å7[çï†7qÇùÍvSèWñ‚b’)‡¡;MeOm"6&ŠH~½ëÚ•´©}C©C&¤üÿ«£–Ôln£•¤‘W±à•N™ÆI<õëþ%Ýì du\ƒŸë[æÞ9›rl÷=?ÏçI-“Hªc1²ûŒ×^§%z2·ãÿòñ9Eüûco.yncƒ—=+¿8»^»mÏ‘z7ø[ð¿ÌêÇÚÓ‚E÷àÓÄ韙J¼+—X»¶tû7ž‘®w dWϦ>PG&µìâ'ˆŸ´[I¸¨6Fßq†}Ç5äâ8c_Z/•ÿ]Ï/–Q®¬ìýN§Oñͳ¨Ö\zÅ׿cøVͳxsU?¸»[y¯È{ö?C^röë»;­FñÛ‘ðÞ£ü:W‹W‡ó¹¨»ú;3æ1<;¶é·å·ÜÏN¹ðýì_4Çp¾Ÿtÿ…g˰6Ûˆ^/ªñù×'a­ë–}šâM£?.ìŽýÔ÷®®ÇÇù@š½Šsó úŸ§÷GZ)ñ7ù11¿ª³ûÖŸâ×ÀchtS^Z?¸p#±ü©Ë޵£ç…uR7ÞSØŸ,÷ìxìjY´ …­¦YÇ¡àþ}+ÙÃñ·Åî¿=¾õÿóÝxÅòÔN/ÍX̵;"5µÅ¹ÿH‚H‡«/ŸJ@?ýuêÆ¤*.h;¯"®ž¨U(à*5ãRòGZÊdHT=3O')ª}9Ea"-qÈGS×ÜT½:ž¾”À`‘ǵHªG®+𣹠©|¡J°è ké÷²>n|­Ø'ëYz‡ú¬ûúU‹MͤÜ( r€ã?íýkÍÏx7Ñþ«ü¬T©«÷$Ô­›~ôbX1’\q×ÜUWå'*z t«ºeÉ•M­ÎðÝQ±Ï~sUµسt†`íù×Í૸O‘ëĪM§ìäAs>nžç½Qv$äçéVf´# yîzuªJOSÆ=ëëp±|šž…$í©"œôöÍ9Ïþ”ÅbW€E(çŽk©"ÙÈÇrŽÜœj±¹>g ëÅc&C g>Ã5~Ûò=«ô*ø9CXKNÌý›œýÖi[âY==1Í,žAa§í;#C…'UXÑ¥Fc» +ÆSý¡ÓƒRxÈÚ?åKkƒq  ·‘þ©}+òN3¨Þ*”$¶S’ýM³zò† m­lÿ4¿&Ë !1‚ʹǩÿëW-â{Ÿ´ëL\¶9õùG¥uö ’ geâ<(ôÃü«„¿—7$ŒÛŽ21ÇA_9KØ/›ûíþGæL/^nÚ¥ùÿãÜÿ¼UÎñÀÿuëÑÓ r#Þ¸swìÚ _ájïÀ=¯«Éá͆׫åúC ‡J»—1FVÍ"–ŒîVeaÐŽ)Ê¤Ž  ð2ƒ þÏJô”|±/øq5uf][Õ"‰Q¦D§LǯSÍ+j}ÀÅæ”ˆq÷휡üŽEf²çÍšB£®N:kïËgÝ]~[œB÷Œy_•×äiµžqÿº›Â{%ÔxÿdžGù ÞÔQ Æ—QÿzÝăӵg’­:^'ó!‘‘‡tlé:«àýWù[õ°ÄÓþKÿ‰_ñVýH&ÑÊÉF™pj"1ÎMn {Ra¶æD¼OK„ŸÇ¯ëL7šEÆ~Ñ¥¼ ŠÚNü¿Æ«ž¬~:s¿çf5ˆÄCø”ïþÎÏó0dŒ?ß@ëéŠÎºÒ,&å òϪñ]¡’K›)¥™üôM¤~¿Z¨G­tEs+¯Äí¥Wš*QºõÐåçðûc6×û5gÜi·±s-¾ñê£5Ûmã¥1€úÖðœà¬™´kI_”îSèsMÚǦxî­]ÍŤq$(ßQYóè6lsä>EgRP¨¹jÅ5ý|ŒåÉ?‰’"#ä¯?ˆ?¥hÙk:µ”¡¬ïû¬Çç“Ú®]h×H”Ǧpk2Hd€‘,EUâ¼LOàk¾j~ëòÓþÍ[-£^6ÓÑfã«Ï»¨X¤‰ÝÔýzþ‚·-õ ê#åo³È}özþ«Í•XÁœzpTÓ”ªÉ¹áW'®î¿˜æ¼*¹; ùðó¿áÿùÜO ÁûÔoCÓ$Ҝֳ,«þ×óéU$ŽHÄÉîÃθ‹ JúÌæÚîhÏ÷KeÏ$ô­Û/]/¶ë0ÿdrzÿõ«5ãð®Ø˜]]V‡[)ÆQé̾çþFÒ…aÖŸÐcðª¶úÎ…v dÛ1õ;}ÕË¡ž7_öŽ?ZôhçøJÛ¾Wçþg5(»I5ê1Aë’?yOÔ Thë!dTàŒô©Ãô[M]îˆnT˜Hþ&¬èr)·ž6æ§Ÿ1Oô¨§ÆÌüé4& !=ºu®\ΗµËjG¶¡QsQfk8iA ¥ÇBI®_܉ôåÉÃ|ÜqÔô¬ï>9×å$0Êò*ÌRÊc̪õë_1€ÂN2„–©3ÑxuîÎû„…­°Güj°?)ÏOaššÜ¿Ž;Õf'wSÇ©Í}]%ºZ®Ðáž›WëœÐ îÉ$QÎ0Øæ†ô=Û[5ë&UÎNrG¸­ <“žG¯jέ; Çvð°5ú­„ýg.Ö¢F¤h• ª¤œrx¬íRE›Ä7H­÷pIàü£Ò¯JΡJ®@5ÉèM0P³<²1îIbz÷8&¿âßå}£ù¿øTQÃ(¾·ü?Ììô 1¼(«’Ù+ŽŠÞ¿Zãe(ó°z‘ŸJéì¦òdYY6Rsõ8é\ ‘•¾Q“ÙF xô!j~_ût¿àže‘ýíIm²üλÁ1…Ô *s’ÝÝ5è q‘\‚ÕÍì;£  ¿ø÷øW|3Šû ž°T߯þ”Ïf/ÜõÕŽR6œ¯=Ži¤ Ý@õwL²¸½—e³&ïF8Í>çGÕ¡Pf²P¹þUÖêCÁÉ_µ×äÿCšXºŸ³”Ò}®f•bä† Ç¶sCp«·×4÷ŒÆÅeI#>„F 0Ô÷®˜ÆßÓ_æÔ¯ªä/*?…*#H}iJž»r)xÛó)´|¿ÏòÔw"lg¦3Áý*E^ä…5eíϯ&©Jß×ùØ«¢²ÈÇûÖ̀ñ•SÍa¸ùÏ=+ÆÀE{c§ +Áر,TE@ü1ÜT}iöd$ÿ0<÷¢è~ðã­zþ6—ÆN±K2 œý}©RÀmÞg'ÝGù?­_Ðà ,Lë•‘>o¯µTšõ¶Ç5ñy¶:½,L©QÛú_š9½¬å7t<Åy<ÿoA#ùmù7ãXèwsEtöŸuh’;̎Ü7~•ÉŽ« œç'%/ò‰ Vž°­/¥ú_ñ2.´ ^9?½Ü=;VtðËıõ´Ãþj†EàÄãð4ÝZrødŸÌvebaÏÒ˜TôÆ? —±¦ã#І‚ä ¸>ôÖ©ŠŒT2:/àöê$´•Ù©ÅDø¥YM*å u_Wâ›öG'÷’¢ú…¿Â±årØóêç*ZJ¢~šþE^ôª—Ѵј“ybŠ×[{tå“§ú XÇØ`ˉÁ{h8MÚú>'‰`Ó_Ô£¢iWP¤ 8T(#ñ?ã[Æ 8,À}*ŽdÚ]˜ŸÆ‘n™—c¥C 4Õ8]¥ÿ|¥j•kK™³N;dp@—óœÑ=µø/À9çð©íæuçp­Ky’Pdõ§%ìÔ’[«ÞÒtÛ¾¨ÇÔ\™ãù€1÷zàgúÖ+’7d`ñ]>³nÊÈ®A#'¨*æn—¯'­×üÙèàª)ÁXH‰óPöõ©/qæ’"  ´†èG¥X¼møaž}«²:IOâE½!ˆš'S3nÒNzq‘éšË¸’(¥>xmÇøTúŸð«zlƒxÉ'mÏz_P·d® :Œvóyµ7 Z—uÿõ"šµk>¨óµŽZÛÓv‚0½z­dÛZ·-rXâ¿zÇÎÔÙû†IIsóêÉ7ö\æ`>PYrOÞG?øéü:×/§#CTíëùÕÿÛf4»™XÆ„üÛ7mÎÑÆ9Ô6ª§ ƒÓ¡lþ}ͪ©×«.òkÿI|SVRœ Õ’¿ÎöéêšùïÝ“Kd(›Ü3“´jçá\º…±¶æº@«j<™Zizžq¸ʰ-¢xÖ9dªÉŒãåluÁÇ8®Š­*JÝ’û•¿C䲸óQ•—Wòèz'€”‹iÀãþú®¬Ç¥sž ŒˆffûÙÁãеt€Zûüm…¤¿»ÉŒ›v¿eù4Ùtœu x§Ú(kd WEm-ý‘=F1à©bk|£¸÷¡Ý¹%zOy—™$ã c‘üè†Ú_uÁ DÃîÏ_ö«°Ñßm’ŸòMr1`ȸ(ÞØ®¶Ñ<¸zuïï^6o'´_-Ö¥ï0’@4yøäUF'=i¤÷¯êÑd‹¾~~õ .?‹õª,Ù<O0úÒxDÀ¼ÓcÓó \qŒþUGy=N(ÞAã÷©xD?b‹Í/sÒ˜ÒŒp¹õOÍ=sM–Så’MC TNZïwlu=ª¤òGî‘ÂsL¼¼Ý3El’§²÷æ–ÒÙU÷¹2Kýãý=+ëœã¥ØðólæŽM?z]¿Ï±ûDçžR}Ç?€«ÖöÐÀ¤…%û³u5$¶òœa±íÞ¥Š8ŸÆ¸jc©òÝ3á3 æ¾7ã•£Ùmÿ„­ Ýê¯Ùä$ކ¶eòÖ5S*¦=ê'žÝs¼’kʧšÕmòÆþ‡™ òèŒøm Á?ZtÑ8Œ}Þ:Uƒ{ |Áˆõ`*˜Êæ@ éÚ´†*¼ªÞq²ó4Œ¦ÝÚ*\Œ‚Iü*¹nÃÚ¥¾r÷¨¤N@ýkܧ/Ý)=ÙÝ…«qÿÖ«–ÒÍgHÈ#ó«3{zÂ{RFôN“G²@ô5Îëz|ÖÓPnˆúvéþ5§¼€N}óZJé(ò¤¡ìkÌ”\eÌŽJUe†Öǽïì*ìëû„`¹­=_B6äÍl EŽFy+20>ÊNHÅ¢vk¹ìƼ+%82B »ßÂDQÉóÀ{tŸ  ldUM^KÈs·#ž=+ÍΰŸ™§7-X³Îì£,à‚Gåþ½oZ£7{ŒúÖ-Ãç¯ëÖ·-Xc*1õé_±f²jœß2XES¿R‡î-ÿ±­m¤òfiKâ"te<²ôük2%%¹ÇBi]†–'+F?Õ—›èeÇPÀa刮íÿZy²»qIíøÖ¼q¤c TˆêYÖÇt5ð8/pñ^Ê­9B é&ÓÿÀ—Eèä|NÄ| lO²«MÂi6Ÿþº|œŒîɦžOÿ^žÙ‚#®i«ôµ;«£ôh´ÕÐÓU596Y;äŒcùŠ¹Ïµ`x·RµŠÅí’U{†Æ"A¹¸*{tãšOšJÑWf´œT“›²[¾‰yœ×…¡òô˜”«Îs“óÞµ€ýí¥j¦$0À¨P’3×êjËÜK(Ú%T_îŽ+¢²ÅÔMF6õ?ÅN­j²“ê÷'žâ5ûÍ–U{é\mŒõÇZoئ/TþÕM±ŒüãëY,-*q¼““ü>ã q]ÊDNǦ}ñPý’}ß;qZóÈBlEß5ÌÀ€åHœâŠxœJøaeèk³kDWKYWñ5;D`±b¸lžý©t~íKŸsPI%ÅÇQÀ즜°ø¬S\êÑ¿R”*IûÛO™Ñ€$þ4¨1ÁÈö«QÀÝH?F;b´£„Kdà±äçÛµlkJ]?›oò?q޽+.g…Úbl•ô®|ɪ˜{õG´±Q­âìÑæVY˜`o¡®ŠÕIQX6*IÜY²½ˆ®ŠÈp §S‚rzýW>ª©Ð”»#ú7'‹ÙÌøªÖkm|ÆÓ®Ñ±·”g1§øÒYFZB¥€>[’ØôSW£–&lädÐ ½e c®N~µHàŽŸ¥Im?–Ø`ÅM|?å8Œ×*•,?Å¥nö¾Ÿ×šGËñŽU_3Ë%J†²‹R·{_OÆëÍ#BŠln’ £PÏrŠ ¡ÜݱÐWà<“ŒÄýV•'ηM5Ëþ.ËÔü;“c±xŸ«R¤ùÖ馹ÅÛæR»Ûö‡ÛÓ?¯zn9æ¥ IçÜÓ@ç¥P`©<6+òE+½Ý•¯ó?¥0T^N‹wåI]õ²µÌ/êSišCËj¡ç8Ø Çñ.C\ ;ZÇÌÎ~ó1ÜÇêzšî|iqs£—µÍ–>‰ë–_éšâ<´ºd…·£g ¼Žµô™V"•:O›{žÔ¨¡J?aßïÿ€­oViéló[†~ÿýz¿`8 úÕ])1lªÅr?ÄÕè†$Nk ¸Ý%gÕŸV^ó±m0ŠIn>”2¶3üéØÄ`dS!À¹hãµÔ㯨×òÈÁÏãL+M¦”¨SÈ¢5RrGÚ±©#e ÕŠ.¸ÅJ˜Lc“€ÍÄs¥Xr›,ù¤p¸=UÖ¡ÉaÁ&“×$ÒSOqr“‰UO݆¸ÇL~UY›¶?JfBŽM¿B•4\7YõÅ s“Æ1TIÈÍ Ì9íUÊŠöHÕ†ä7šœ1Žë"9@ö«‘Ü+(šÂtšØÂ¥+= qüDÀÓ·Á'Ç‘ëUQ”ž§ò§4Y\íþµÅVšåš0qIž3¥¾eUdÉ9Ã08ïßvšý¤™²Ê3´çÓé\vFI ^>µé^ +›Hå”l÷#ú×Ûq¾!Ð˪Ê;ÙþLþ¡ÂU<^§”k÷×WNlnLB2 #ÌÎÜ ç¦Gûg¶ìa f…W$:¥Ë„—Ë]¸“ Uò;Äqì½hiªµÃo93Éôoð¯ÇhòÆ­$ºYþ>OŠªV–"¤ªÉ·Òý–Ÿq—­y³ÞÏs 2Æ›w¾Ü…ÈdöÍXð²Dú™3ec“yÇ1µeÝ<`Ée3ùrÃÕ3Zž”K« äHÀŒ ÊG` õ*Bõ£µÒüQ–St¡·{mÒúê¾VéßTzÝœj°*¨ÚoƦ8¦Ç€¸À§gŸé_§C¹V&â¤pEh'ˆut@ŸkÞ«Ð2)ÇéYs†rV?”Æ94ÖŽO0üø^ÊÀf°›¥Vʵ=|ìÿVML= Öö±OÕ&k¯Š5… ù°œz4è|W¨Ã!†ÒMØûÑ“Œ~5Šb•WæF'¹ hò%<ˆØý*¾§‚k቟öN_-éÇò:*Y.7\Ȉ…ñÂ.|œûÕ]BØD;àçó5söúWÅÕ¨œÛ]ΘÂ4×,’#?ç4Ç#56ãÓJcœV~Юb<~T„z›¡†?¥O´"<Þç°Í=— ÇëK°ãPæ‡ÌD~aÈ®Ŷ–¶zí±µ•mÌÛüÈ1íEÆDÆI÷¯DÙÛŠã¼Y`n5x§Ví÷m¡Üª?¥i‡§:µ-MkäaŒ^Ó V *MÅÙ;ÚýëUºé}öÉŸ’B é‘Vg_²E¾i#TÄÌ?:¢¼“†•!OöæüÏøP¶Vèwm2?g–?™®…’ã*¾iÏ•}ïðÿ3àðü7‰ªï^J+¶ïü¿Og ÃùQù¤â(@üë@+7ÐÖž²™x8pî9éÞµ%¼ŽÓoŸ6[þy Ë¾Jª•©7~‹©àc𜘧C›¶–Ý¿¹$‚B0r~¢ª˜ÀùssPµýüìHXíSør7?óÅU‘<ÇÝpïp{o< è+ÓÀåÙ•¯U¤¿Àõð|5š½V¢¾÷øiøš~GŠS< ¬èn&ƒ;]˜z1$Ô‡S/…eØ{’3ZTXš´Öúø¼—†wjñî‹\'ÌÍÍWiO8'ôŽD‡#-ïŒ ‰“œʽ ƒWláŒÜqŸ<ÏÒ˜®Å°A›éÅ7~¾ÕÚ¥hid¶&$Æ—qȦ¢•äü´àA'Œ×<ê5±Bm'îæ*xoΕIéÒŸÎy¹ªþ&‚ö-o²ù¨øC1\üëÜ}zõ¸Ç†Ç`'ÔWÓfží#úš{¥„JiÙk§^¶Û©‰â;u]]–K˜%}ÄŠ:íQŸ0¨ÉÏðî'Ú®hƒ}ȤfL±8·¨¬›6Pdnäaƒúœ çéZ:tðE6ó°§<úäw¯Î(EýaC²„OÎø“±¸Š•b­vû¾¯«Iúh´ÐÈp’D]5÷ñû Ž_óÆß~µ¡áˆ—푼nwóæîƒ·<þB±aULx$ÿzÕÐî%ò4N¬èê ƒÓ!ºŠõðÑsÇRŠþxþh#^Z|«D—^ûï¿áä{,cäëAúW-m­_: )þ%\ŠyÖ¯»ºcýÊý2œ%mf9&%ê­÷!Žî>”«”9ò±ÇÌ¤Šæ¿¶/ÈÊ>á(þÝÔÉȘgñ§:$ï?±q^_yÐ@r#Œ{ц_˜CÇsƒ\ßöΣždQž¹üiÇZ¾ã-Çüjý…Nß™K'Åv_y×ÚëWp¦ÔÇŠ·ˆä ‰­£'¾ p£[¼à¨Sþ4‡]¼(‹Ÿóë\3ɨÏzkïhrɱ—Þz^!µÏÏ ‹ôÁ«Pkºlœ™Y>ªkÌF½~¨íôäZCâ ¾²G·_ñ®YpÝw^üÑŒ²|GUøž°š…ŒŸvæ1õl:°¯ ƒ÷l­î5ãã_»ï{çüiá"»Oùgn~™Ö¹*p»û>õÿÍåžß‰ì9üé½^kɓŚŒm•ŸIZš/ê¨rL_‹f¸§ÃX¸ü2Oðÿ2³1 FSã¶k–ÕŽëÙ¸þB¹èþ jƒ–´·z†#úÖtþ+¹’FÚB2sþ²º²¬¯†¬åQinè™åõÔZ±ÓR0ãŽ+–>*Ÿþ|ãü$¤>,—8k%öÓÿ­^ÔéϱÊð×C¤x#s¹ƒõƒúTqà ö¿†ÿþµC§>Àðó[£ nýU]ÕOøV1ñ,_óì@ÿ|éQÿÂG 8XàõJNJÍ*mhÑÐAtÑ.Ç?'¯ùúÖ…ºù¤26Gl\tÚü,¥Z>V4 Jáïn)p›<ÅWÿq›§Ö¾C4rÀN<‹I_å·ùŸ!dð„]j:w_äuÒBÊ~鈦ùDžøÕ»Yã 6Œö©Dné¸=ë˜U¥¥EcãICIÄÅ»×­FaùÆãZITòÍIög~݃4ãšG¹+æeùxlí R23”`Ö’Y–8ëô§Ilž½;sMæP{Ö¢dˆÝG';rоÐ+n!…V{|¿•oG=McV2Üñ¹£“ípK2™[gÚ”‘Ž™O»Àü*Ž ¶Ÿfd°N3œàò;æ´o漑£ÈÒÎF'Ç©¨ –¿Š ›iî mÙ†ûÙ03òá8<žz ù…7£þ´þ´ì~Ã̱˜èFœÝ¤ìœÝ÷—['ß['}]®ìW´²¸‡ç¹tþ™ì ¨&µÂ²Z´±¢ÿªRN?é¡ìð}©–ÖÞHSŒ¢ªí^;%N}‰÷Å-Óìû†UEA×?Çÿ×®œ5W,Kœ´ÿ‡9³ÜƵñoä¿®¢XÜl©ÊÚ6ÚÜ›«=½Ý´¶¶ÝikµÒÛj—2éë¥Î¬ŽwCI×pëŒóî8õ¨ÚæùšIŠDÒÈrÎå9üùW9o<á›,à™C“H—ÌêÅžEe´3 $e˜‚pyÇ®;ã¥g,ï1‹³«/¼g_gˆ—ÞC¦æê\¶ ùT­§éÆã/û¹ÿ‘ì0Gq+Hñ–eÈFàŒ};0?4Üé±ì/7ŽŒqù‘XÏ:Ì/ok/¼ÃëØ‰íVoæÆÅ¥é²¤Ž‰#,jðÊ À=}jtÒmmm-¯„¼…Žƒ‚9©cÔtÕ…-Ó]¬ÁWp~oZ™5;vµŠÓEÝaÎIg\gîñœõôzßEû;Þ¸²xšÑQf.ü€ÃhïÏUyu¨Ô²}–]²ãÌiå±ÈÏ=©’k…˃ù“a7DïÇLòszå­ÄV^ûoÕß·ÿmøvwå©S[âmß»¿o?_ÀéôrËn#8ÜŒÊÜú1 ¬Tä;‚x5›¢Ü$¯t#y:0QÈúsP<Úwé[StžY™)E‰5Â.ª{Š­á“æ×®)gW\¤¯åIäàûÕò(.h;EY^'ŠO]帗Lùlˆ‰×ƒÊ¯°ª“C"J!¶ˆÉ#ç÷Bœ ñ¸dzñøÖüz$Þo Š[§Í×óGÄú°Ò$»ºÕ!ŽXØ(Xþvä¯Ó³ÖŠù~/8Ë]­Ú{í¢mî~åG˜S®ªÕM[wt½]úiØ‚Ú6Vq0– È”¨B8ì¸qí[ZM­§Ø®áž1dØ8<Ö%–$³Žhv:œþóbã®=k{NC®ýĹú1¬²èFµi©íoÕ‘óy¤››wëß]ûè2ÓK¶´g6ÓÞC»òåÛœzã´é4m>YZæXüù›ïI.o½×¥NŒ0A O 4åfŽ•ìýG ù3’xìT ©º•t¾ŸqÐô¹0íõÚIþdÔöúœƒå‡ëïJ$“ý3SC9þ"¤z—„ÃÛáG,ñŸçxÉô=;åˆÝ7ÓŽi­¥Û‹§Í1ìN#ÏæMJ5¯0˜í E?:K9WöÁÇãÐñZÍ`âµõó'Úâ¥$œì½;]þÓL²³ÌV)’âGŒ‰Cª#|ØéÆ*íÅŽ—ö)ݬí†Õ1Œq–¹¦Õu=Jò?² ò¢]±&ìãž@“žqíW/´û‰¡3jÌq”ÿWÕç‘Ó°¸å8¬=”5¾îÛ_O]4dÕ¥V©W^é½uÓKvïcžÖ‹ê}œ .Á÷F};Õ!8W1B]@ì«“V/axfó#–Îà(…‘²Ù¸q׆ÿ ŠÞä-¼†ãL²VØÑË"*óÎG˜søzóíîé¯õçcíð8:r¥kY-4½ßN¼©êö×T÷IjgMµ®AšÚµÓR}~BÃ×r’w½ÿ¯Ý:ámîÑ[Èrsµ]xÒ»›]:ÞCç]7žÃûØ :ŽƒŽ˜ü«Ì^i%Œ˜× 9ëÏ·á]~…~o4ðm’v–5"c$¤`gãéÇÔ{Šì‚^ÉTJí;?.ÌäÍ0ÓINÝÿ®‡^ÐAs–s\\EÁDq)ÇÎ6·>‡£ü5æ—ÚtÖó¤W€§Q$;IÈïÁ®ÚÎݧÆ'W1©Ý·<©;}ºä¡=qY~/ŽÖæÒÏ>âîõâ¹yÐ íØª{òWç­yØ•(Ô絯kþô×Èó²Ú®…fÔ¼¶vÑüÖŸq€±Û¼IµŠ~éÎJ³P¢æ¤cÜdT™ÛË؃èþ•,s¼QE>fy!†>†°qmh{³Rµ®]Ž8w™ß~T‚`N\¨îp¥V†WrÎï£ÏãSGI.Æ`£×†ýEc$×SšÝ‚ÇÏuód¬1ß%³ú×L„`ôzšç|7,q]E o÷¡,Ü“¾SӞخ‰‚Šûl-oi‡ƒò_†Ÿ¡óY…ÝvË(ír!Ùá’-ØhÞ¤œ~üj¶…¬6–ÉÜH=ÁÜjÞ• MRÔ°ÿ–É×ýáQÚ©TeÝ®Àãýã^f"£§ŠmuIýÍžd¤Õ×§êX I+}F ;̰SwÔŠØ0~DsKxIöªx¹5ª1{ ̯Ýtõjo”»¾áOqJÊGÞ'ÐÑgÔ{ž•‹®í m±ã6ºÆV†=£Ò69ýjµÜïq‰ZxÿÚD·n„r:UÛYÅျ¸^Ê¥‡Lõ~UZëβb¯HÍÑ#â0;úÕTÆâ1 9Ôrë«oó?x«Ç7Ë*òV¾—µ½l•ý ð[En¥a…#Rõé[ñªÇÇß·ûf¹[e¼’D[xD.sƒ–ßçäc(_Wwø#:ûÄZ‹·“in°‘Ôà—ì{ýaÖ³AžVß2]Ü7÷·1?¨ÿ8®’{;³Ì!£–*ƒŽ@ê~µRÜ«JRBSÜþ>˜ª§–ÔÄTtù¯%ºÖÿŽªU(Â?»‡®¥4žÖ*ïL’çwÈGSé§åVΡ¢Ifñÿ`¨rFùÛϽh_éH,Ôn¸ÉY2ONÿUÓbãÄ›sÕHÍ*x5Sš›œcË½ì¾æ®bêQ©tÞýÞÿy‰t׳©¶…æŠÐ€°cåñÏLc¯?ZzÙß¶žm[ímmÚ2äF9ÏLúóõ®‹S‚™~Ê­Ê€Ì_¡ÀíõÍ[Ó.Ï–Q!èÍ6ع9ZIè­¿ÿ¦u<â´)§ïkZïnÞžG#uszgyYæ?y‰í¯AV›Ã—º›ƒ!åvÆNk\B|ÿ0ŸÇ?¥\žæI¶$¬v ÀùiÖû&ï×oÀƾe^u9¯¾ÿ×SÛKòåÚd>XÜ÷õ«wšW—jÎP °•žEIr# ;HÊG{í%¬ÚÙ°êç’Ã9ý=«nL+£ rûéê¬õ^zÛò9*b*¶š#Ó4èb„Ï»L1´£ßý‰íNÓä¹¼•¡º¾Â¶Ü,ÅqÏ`8íUþ=$©g1«äÔqƒëî)ÏqD.læ…ߨ'뎿k)`ã)µÊöò~]¾F2„äܤ¯}›,n#Ÿì²Î°äÉHï×"«ÍšzJ×Å.áð 1ëõ¨!Õ#½F—Ê—x8ù—8íM‡SkÅhn I<³Æïý+Šº¥:\Ž÷[ÝßîÒý‹T§ªõÿ€G¤Kk3´eàm;€éך“@ó¬n2%Œ‘Ø’;§¯­Imd‘ É6ÐXæ<ð1‘Ü~4“J`¶´2¶îŒ­Œ~çó®EJÚAµsiIΛÖçKÙº™­…¼NÙj©'¦yç§™§j*óG·ž ÙPår ŒuÇ_ök¶)Yaf|ðcÆsôÿ=)Ñ^Ê·O5˜Uv½VIÏ#Ž©WÁAÂÊNþkKýúy;oÔZ—4:wï÷èVdhÐKÆ9T$¡œ”„N­÷WúVºøƒVXY`¸H‘I$4j:žyõ­m;ÅW)n²_A œ’ ì#¯OJæŽÅ|‡üyÕÅÓŽ‘RôzþG9™)gK ¸ÎHϽXþÙ¹D"=žäŒâºëÏN•èÊòô²¹ŒèÔ¿º®Wk¥n=MhZˆ$ÆX3ù"²"„ÎÌêèHÇGÇô©Ü)òÄ’¿²±"¢ž.š¦ãRÍùþ†³¡}#¹©©[ØÚ$F)v¨A‘Ó¿ãQiÓfbq¼Á`sÞ³$û1šFW¨,s×é`ž&ˆy{±Çò®l."xVåŸMVļ;ä´üΖóR³:|–žZ¼Œ±ÛÈ5•!~xä,O±ãòªÉp‹(Y$ Ï"&$ÌV|z•Â\2ì.Ÿ\YÓ­Z5%R´ž¬ÊލµS©[ÛŸ²µ±c±¾ðUÎyÈëPÀcV&,>öÐAöéYq_‘’‰“ßçɬûÛömE% Êïþ²8ÇÊ9çòο{QÞZ½np\ÜÉh–¯ð_?ë¡ÔÇ$3œ ‰aëÿ׫ m#ÀçÝŠÀ†æôðˆ@é€85³öëi4¹,¯gòÄ€ù°ÄoÈ#ò¬š‹¿.¬ä«Jp·*Ф5D‘æ‚Xß!CµsÓ'·¥Ksu¶Ù™^ÞGÇO¸¬$Òü©÷4¨ëŽ$çð©eo!ÿ{µ£îÊÿãUQ$Ò¦wO M¸û5ëçý|Ëú^ª— Æe(Àã*>¾µ±{0¹‰íÂt!°3À÷úÔVÂÑAX‰‘ Ï/Í,ïu`þ`T’ÜvnqþIªæj­Öˆ>¯Rëîf„“Fñ3L†ã¡õª:?ÛUœnÀÝòá¸}jÜR­å¸![øqïôöª¬&²¹X„ÿ¹~ªÍŽƒ¿ãYEKÞ„ž¯ô"ãÊéõÿ"k0݇–Y¦q´Ž@íÏÕjÎ ­íü¸§Œ–B¥O² ~zeóT“Sh˜‰íä=W‘PÓœyQ ž¬9Ñl5¼«¸ .OP¿Sßð«ÓÆ`--³«ž¾[`çñ>¦ž¶és‰([ø=>¢¢Ôle‘‘8GqžŸýz§8ó'³êT¥MÍYÚû’"HRæUû;œýÅøj¦Šu $ònŸlm×.3Üõ…^¾Òü¶I RÎv’w}x©©(Æ|úÔQ¥S’o_ëK”tøì­® æI;o\Ì{R_\ÞØn–xà–3Õ€ù¿Ï5¯wd“¢Ç´©_âêEK<[áÚíùí5UɧoS?¬)MMÆ÷ÜÉIíÕ%Fï¡›+Áî 9$·˜â `2Ÿ¼U¶çôªzìÚTEopžK°%[$g€xª°AhnWìWjç?w€z~õ´}åÎîŽèaù©¹»þ†ÝÒ›»´Ïð‡—§éÒš‘ÛÆÎ Åc$Ø?*ÍÖ-ïn.pŠXöÙ#Séa­æ_µÍ-»Ò¿|cÓó¨‚nOäfè¥EK™m²6´ÍVòÝŠi˜ÊÀŽýzzÖ™ñF ð4ÐêkFb©Ê3K¹‹o$Æ|¬Žã?Z¼³Ü2âG'Û­Ef‘ÊvÛ˜‘»ç?֬ŻPì{ÇòÅF"òz;ù'-QJö9§P<”QmgwA%MÁÏò«šµ¼âÙ­vr~aß§¥WÓä’ày2»€;°ãüñSKÞ¤ã}ž¢Œ—²ÒÖB-¼ªwÅp¤Ÿá'5 œCí.%™‡ª¡S[ §FÇ"Gsè£hýjͬ-v¾BÄe:sà µ4ÜyœV· ô¥' ú»m÷Øy£ æ5Çâ ª×M€$„I¸}àä0ö©Œ3[ĪÊÄv$`~dTrÌZ=£ržÿ6¥<²¼Q­;$W±Ê‡q*ÝÇoçI,;4ŽH>cš¯Èc¦Ïö€àþU`C4éòôô<þ\UÔ‹ŽÚ ÂÚÞÈ‹Nû`¬£ËÞe#¿½]$*H G8ÍeÜE<,$ à¡q«ÖÇ+‡ŽPÞÙ¥Y)Gšá(s{Ö¿¡Ÿ-µ¡u˜Kæa‹dUùAšwΖ¾b ‹ûU ,«*v«M±à2H²0ô'Jh§BZ·ƒÐl©m®&‘`Ëì1ü¢I¸ÝX™S×WgÖÁ¦Ê©1"óbŽ‘°Ï¯¯Z¿{,³@c\.zŒuäU ›ä(±†€Uky^µà”¨èädRqU=åºè©K-¾F”…ݲù2DÛOÝùÆÚ¾ªd‹{[éÆ$Q€‡É#ßð¬ûa&™x°ÜÚ)õ~OlõükOH¿»”›k“—^Œy=Ͻ]º‰î£òöǸs¸ŽGéíMUtŸ$Ñ\•ìf“º~cÖkyTH#d¡ä{psO´¸’mñNÊÎG9©âÒ®ù×8ôëì)Öº++Ìàœ*åçnö<©ÕƒM9\ȸ±I÷,…B2úqíRi~šÚ}ét@=3»ßÞºhmV"ÕvÏ8ëþ4÷PGÜb}2EtÓRå³{“ý£R0pƒÑ[Ú„>úç#½Zˆ*ämǾ4Fäp?:p1ÉíKÙÆ Cϔ܉#É»Èßfг¹9n‚>†¨àŸ¦* FS³ì^s‡¸f A]¸nXŒ α©5[/ ©¯ 5/Šm%åæü–ïÈeÍæÑ}qx’s‚ÈHüñôªã]ð£ Û«¹OöpGê+vÇF·i;·ÞaÔõÇ5|hÖ@¨ûB­fËùSùß|ø&Œ§ˆwòZ~'ÿÙpygame-1.9.1release/docs/tut/camera/hsv.jpg0000644000175000017500000010750111206577570020557 0ustar vincentvincentÿØÿàJFIFÿÛC  !"$"$ÿÛCÿÀð@"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ñ¥Sˆ¬ß(õsRø³I/º’õt‹Ï³aDÚ¦U[’0yLwü+kÁö7+´MAÑ-·31f•ÎH{WñSñ¿‰4{[EÓµ(ì¢ßæÛ@¥Ñ²ÊFY[ò¹û£o¿Z÷øÿêæô°ñ²äù›µ¹›ÙuvŠûüÏ¥Ça°Õ\ÔÔ¯¬£u~gßU§.©ßºZ3¦Ðü2—0¢Oy,a,7PüéËÆÜÈ?ìãÞŸ«iwZM¢Kr©qÀ–’ Qqc·$ã¶O­tV:^“ªh°[ÛèRÚÆ…Â+Ú"Fòˆ îÇðgßYt½f÷AkK¸"³[.Pi·¾öÉùUŽ8þŒž½G—ãš„9¢švºín»ÿOwÕšp–P²ùF…)7;{éÎV”Rmµ¤Røµ}[^ëÒ,ðZÜYi£p C6vŒÌ6¿å=3xúšæ5–s ­”4xåŽid'ò°_×=½…]û-ö» ÝéRß^G«Û…Ù§<‚ Û›q娼˜Q»æÆÞÜUtðäöY\ÍÕ‹ÚîWLÎñ.î,×xò~¢ºéÐ¥ Ô©6¹›¿*èÒÒÝÔ¶ÙÝìÏ'4©Ø .Œ%1vöì›´ã'f£v¹½éFÐIJ%cQÒ'Óî5}BÁ޶Pæ™!Ww8\¦äd×33.ÿ5$ÆNH\gÞ»=zÚÞãQ·Õíç±¾¶‹qaq0hp Ææ 0G¨ä¦¹V‹Q¼UžµƒËX±$`Îwª(ûÇ^ø¯c„ó:X,DUß$ôi½º%o.Ÿ$aÅØ*”1rIÙ%xÆÞÑ4åíë-—šrÑ1ÖräóôÇ,»|ÜC&}ñY¶ÎRO/##¸yˆ+¹NþµúEZ.•{wÓü™ð•ai\’MŒ¹È'¿& ?wÕ˜NŒ˜H?¥WêØÿ*Tì“]Œ¢ú nÍ» »å9µ‘v%òÁe_AŽZÕbÊüä7çU5Dg–FÀ …`8+’êù)ô–Ÿ§ëøRiLΉŽÓ‘š¹¤ŒÊw8Àì[µFÞøÆ?ÐЭí&ÔÑo]•ySÓƒ_IŸÒurªœ»ÆÏñWü.{ØÑ£>it:›·ŽöÉd,»F‹ž¾›½©Úe„ðÄ.5%Š$bUbÄã9è}׿z­#GH£ÆÖln?]¼kCO–í—÷×+,J?v„޹Áúó_”àá ?kð¯ëúòó7Æ×«*+‘Ú;ùüŠ76¶v—ŠÑÍ9€áƒ´g©õ5¹ªèkskó Èüž}H>ÇSÄÒE~#HmVFŒ1‘X2tàç?¡ïZ±Æ«áô’6e¼±Aýáêç#×¥oF¼°õ­¥ú®ÉìxØšó•:Sm§{k¯äŒ›o\ÙZ\Øàà±Á9ãP"ó\ôÈ>½éñ[ÜÁhËv°Aæ ÆC‡a޹QÓ·~ÿ…O§Û[ÙÉ-ÅË™p=» _—ɽušx%yÙÛå:¾”U«K‘S§i.¶zõVý~ëU+¸NËn­nßõÝÑ\Åmbî.|ÖP0ŠŒIÉì ­-.êæUUšV³ê~»«/QŽÚÝ]âXÐ?w¬Ý:×®zt«Ö‘‹x¡_³Ü•;€]Û‰ç¿5½(ò(Îi»ëÒݼ¿áõ¹¥hRmÛ}}=û‹WòÏ|fšg!>îÌs‘íô«FòW·û<¢Iãpå\óÁïOŠêßíuº ÂHÇ#=ji§„BÂ;sŒcÓ߀?Ȯ׈«*°’×kkøž4Ô•”á{m²·âEý§É/˜¶–â5ãïÈäŒqŠÄñlm¡šÝî­â^ªŠ¡NHèdþUÐ%Å¢@æíc†çyÌçç…?Qœ8˜Å4Xgê7ò>…N?zxµôK2…x:”åËn–¾Ÿ¢òØïXÙW¼¡+5Ó{ú˜vŒDìŽe‘×sÏJËÔ®Ìí´ƒÇûYôö®çûJÕ§hàºt'ø0<»Š–8íã…ÍÊyÄŽD¬G=ò2kzª…G)Ó³ÒÝí÷n¼¡¼,ÿ¯#ÍQаe8#½hD¸`‡ñý:UßC.ž\ŽT燧nÕ†ç=Áú WÐÇ“;0jÊE©.§ºvÝ"qFT'GqJ¯‚ªjŰ áb|ü,2*ÿ†´Z{­.‡k¦h°_i–¡r$h,V2ëvb^@£ãø*¿á‰}b 2ãA°Óâ¹Yò®¤ÀÚŒÇ ªþžµWÃV÷·¯&—e© :{®#sýÛ>cÔà×׎knÛÃ3é×Mi{©Øjºˆ_ß%Ìm#¾T‘“³iž3éë_ÈücŠúÎwˆ„§ÖÑZéd£~ßm»ùh~J­zR´gMsÔŒS”¢´÷_&Ò“”½ëFѵԵ!ºÞÕæ»’MJÿK˜®-­ö¸‹hÇÝcŸ™Ž~\tç5fM~îÃP¾ýI­¼¯)£·}¼e·~óhÀé–٠ܽ”:g‡õ™¦ÞIX­Ý§‘ðTãx$®2ǯ#ŽÕ±kyªKã8m&„¶• m²Ychñ~bà/-Óª¥BŠ©/y8¾é¸§¾·×·¥¯£<Üà †ÆÁà¡Yŧ J*3Ww²Š‹VP»Rv‹|îN<­^¼K«Ü\Áv÷I•0ì·mŠ€q'*þøéÐ×9©ÚKâ : l|=-½ä!„²y gÜ@)$·Ž¼žõ©â#Ýÿg‹«Øç$›X ¸Žl/™Ÿ™—¦FEEâ-,êvö·vΚ‡,£›yï‡Æ3רÅpS„h8;Úû>‹O+^ÿ+;ß©ÛÓþÔÃÖÃ8¹N–ñVR’“M¸ÝMÆÊÍYIµe6‘瓜º¼nŸ™Þ«ñì’0w}1š‡P†$¾•#ò<¾<± >Â1Î üÝ}}Ojeœ­yd¯à+öÜ£ó[~üŸ§F~4¬àùz­Ÿ¡q½œŽÔŽÇ8¦‘dB ô#4’$¢0Yx®¨MIœ—DR ¸lÊ~Í=¼i°“ÊäxÁÏÜ+/'vÅ>¬Œ¬H<F3úן™Ò~Ê5–ðwþ¿1=,ûàT¤>¢¦³›É]”0îN‡ØÒ]DbºÆN=ª{H¢–ý#|•lä½+î§ŠÂÍKá”o§cÛÂÔQ—7‘×èP%Ò} F`9ØKàää㞺կÝGehööÒ Ò@eÚ¡Áão#9#¶kZÿÁd;\ÚK$W–58ùÀ<¯'ŒÕ ÒncûMðK‰SïF>Vî:cÓ•~=©NãÈÛQÒíoÕ~={üŽHâ0Ø™ºñ»KKyôFÓ%Õ­ ¶ÇeÐèÍ'<ôϰ#ñ©tûo°ßG^HœoÍüdà°ìN8ô«–ú¼×Pý™íå†ÿ¦ ÎO$Œv«Ú–‘yrYÜ„Á9£Ø†0_j1jU¦Ýßä­ý[Ó­ÑÅV­XIƦ‘;z¿Èæ¯5K‹6sHm‰‡|ž:öÈèqV4YtõÆ|ÐA*<‘ÇZÄñÌÓË 7¦ßaÙ¹`qŽßJ“ÃÚh:ß»:̬6y’îç ü¸¯w¢9­Í£JÎîí§u¿n¶×Îýò¡MáÔ¦íͺ]o±C]šÖMt˜ÊJ„ ¤løEO¦Þ8âdw\mEÆáœ÷#ÜÖ¶µoö¼ -í\œ–°1´ÉÇJËÒ,„²\É Æ÷i ¹$ýtÏzùÚj2¥ÒËš=baR‚‹Z$·ýIíÍÓÄ&‘cŠ_Y0[Ò«êWÏ”–‹¦>SÐzÿœUÛO\Ú5Ù{iH;ZFù߃èk#\ƒT2Ÿ;w–8â™éÚ¾§,Àájâ[N*7¾ªþ›õùþEÑž­V¢Óôý7¿ÞiXÞØJD’ܨvã jÛN§§XÊÀH.]Ôÿ £dž€k&ÇE³¹ZîïÊ”1#„QÇ~·ÿZºØæ·°…­ì.­Cÿƒ`8õ+ÂÍ}-(6ïß§~‹O=v81Øg>JRo×k}Æ\±ì;‹É'¸ã5)€­L­›ñ¦Ï}nòÇ ¨I™òK7NLÇJ´šƒG }Šuf\† Oöâ¹hVnžšImÓï¥S–)Ç_Ãþ\ÞåÁvIW¦âù?—OÒ§y”˜æ…$ 2¨#¶1T¡ åÅÜ%dã>ÿ#Ò®Ü[ÌÐ/‘ Á‘÷üç^ýxÍv•ä¯qÔ:rI+|Õ¿=~E˜'¿»•bw´•NxrK~]jž¿¦yŠ"Žh¢sÖFtëò“ïÔV<šƒZ—x-nnp7H£ôm¹ýjh!ÕoÝHm‚ å߉Æ{WÕah΄SæQí{jý7üŒj`êQš«¤WËúüŠ—–"Þ&–ÝBÍÆe ¸Ï§¥Q’ãUžØÆ¡ä#«îÚ?…M®K•îÛ¨ ¹Oá^P¯=õý*!to†ÑÝÏLÉ׿ӱï^Ÿ°œ\jT7[½ºùëóûO 'ÉÍËwÝôünsWñʲ´J znÝéU3Oʺ]GD–2òC)¹aÙNžœÿž•BÚ(žs͹ zùQäŽýñ_KGJP拽¿­Ž¥(Ô\Ñ~¦E[ÓÖÙ¤hÙÉè}}«RïBòbóH‹êàù Õý*ÞË÷b;o0ç—fž½”ŒQWMÓr޾‡4ëB1¾çE¦ë"]->6Þå`f3G “÷ûˆaŒÛŒüß…m蚬Z|aWmo!U<¤,bw3F¥ðO®=ë]º¼°ñ|¶º²é¶‹·”ÆÒ‡-ß¼0Ã|Ù®=ªÓjZ…þ£œVö—·¯Ä@¡¾êäÈ>¸¯ãŠtÖc‹u%*77wª¿½wÓOUØï¡œäñÍi5*ª§2iÁEî›å{ÉÞRåqµ®“V:xdÏmª]¾¦¶K7”Ig܈€HB.z}ãœöé^yslmgT’{I/àÉhÒW=ÃŒòx?Z¾Úåü·Ž§I‘^,}­nm"‘£Èù9hÃ6{ ëüWáÛ]Jî{Ëi]eVÆâ]‘8PH]ÁyÁÎ>µö:•²ô°ø©_Óä­æšûÿé3lª|E*•0TíZ9ÊéN.S••ì“RÒÒ^ë¼dúÇN]zÿL–äkÖöpI‚­}!†#€ûöóèÇ9A5©Ó"œøwZÔ`¶»´ÿT‘É$ Ûs DlŒcåÎ9<˜ °ŽÆu-SRÚNï²éÆGhdxUeã!†çô“OÖ&´Òæš4Ñ„vØÂÚK3ùa˜ýö øÎxÎ;ŽkJ”Tîé-/îµe¯kõ]?Ug}r|Z£Êñöo–óG)ªmêÿwuÉï·Ëdåtã>»©iú¾£.…u5ä71í,(˜˜† ãhû¿\·Ô4òª¶÷ +go4l±‘ýݪ¬s÷ŽsÞ«K5ž³t—–ø·»·P¶:ß#«®WpÇ"—UÓ쥵ëdYíææH&ÒÖY °W<òz{ óÜ(Jš£$ãnõ[|×[]]#íq>Û Qã©¥QÝí§îÓÚüÿòï]•ÓårF>¼°‹«8­áÓ"oÄqXn–PÎG&qÏaÆzõ<€®$)€y ã$—¨4ù¡!eKe/2dñ˜Š±\ñŒç “Åpú¶Ÿ¦í>þMI!æWމ öž9$þGÖ¾‡„s9`1Š~î˪õ½­Õ[]S?6ãL:Ž–7ü9Þ\­¥$­í.gf›|±QŠôlŠKEÀàÕ˜œ•(÷ æ+:ÈùnTºŸ§Jз ,…ÂdvÍ~§Š£Rr~¿ð®Çæõ¢“d ¸b„1?Zu¾íâ6àƒÅIh *T±™@ {cp#Ž{T‰f°kòyËä°C· òdàŒZ“A¶)p²f´ˆ+:pzœuëÏóÍoFJK•饸½½mÿúZõéº|î+Ki¥µî»öC´»Û[ËX•- ¸@Á‰ÀžU\äÕ‹–™µ15Ý´¯hÄaW–¸©-?³J1ÛY·2DfèÄü¹œW;-æ¹o#$Q)ŒpQ†Ð{ÿ:÷0×ÄN¤ðíF1ÓÞ—¼õ¿»«K_éœT¨ª²—"¶ûþks©¶½´i<ë·Šp¬ˆW§Œ{~µŸy«èÑ+O3}ÖT*Wœöž3Þ¨Ù\BÐËos(Œ&0¾H ÙÉ<óŒqÞ°eÓA˜È7F‚¶M^U•àêJ£ÄIÆKDºz÷zïÐí¡”%UÁ·£ÚöMy;kꮎ®[ñt%ÂÉ*Œ3ä¯_|œp)#¾‚Ò"“^G4‡%˜°ÏQÈç·~Õ—á—ž)ŠÌæ\c*ÌG\÷$[Ú«—iRÑ €u#»:ò±ùt0r•ÞýºëÓú]õÒñUS§QP’ÑZéÿ}¼¶×™Ü4§—ë׿åS²2P>O=»Ô1ÅqW‰g,ª`z䎵[WÕ"´U̲ȩžQðyÇç^vR½HáðÑ÷ˆIÔ ïý|¿BõÅÅÞ eäE`õãëïL²Y#cåI6[FÁïè+½ñW1yV÷3Ƽd`*ñEܤVn©¢é“ÞÇwyi$±IàHU_‘×ƒŽ˜÷ÍjÑQp®Ÿ]VïÑß·g«ÕésØÍ2lˈUðí:‰F3Œ¤9¥ª“\–ö‘vzÇá·.©­RK›ËÝmí>Æ.vy¨}Í´l‹¨SŒdlõçš©âk‰¢ðíØ&;Ë 2%“å‹1´"†lž¹aŒzqZÃLŸÃדCoc}6Û|¨‘Õ‘09|¹ûÇ<*þ=kFo±ÈÑÂõGl_óšÎUéS®«E]{­kÑZÏ«N;=ôï©ëàð3Äe2ÁU›F¤œ¹tnNWvj1’Õ¶­g}“µ¸NSYV]Li“!!´&9®âĂόdrØôéWµC¨ëÁ­ ¹¼ŽꯧÜF²ƒ‚s…%±·º¯ãÖ«ÛÚéú‹ã¶{H/“nºÄŒ?w“ò©Çâ^=k?TºGšÎÚxà©ÌaHtyTÁúœïÄaœëókk]h¯£]ô·­½Í•iÐÈçƒÅ¸Sšœ¡$ç(¹û;;-,—¼¬®¢Ó_ V9Û˜e³ºdš -™yòåx¦síV"p¥dÀnüÒßX¾˜ÿb¸Þ—‹óMÛµ8Ȇ äz t梃·$ã½~£“cÖ;gyGGæº?Ðüò´'*rM5£OuäüÖÏg}[Iq¬¯ wãÜÖt±Ä’*=IÏò¥ÑAg`{`cŽ®ù|æ»0´e¾Œä…>W£'¸”M§¥Ë”áx< çú×7É^k~Ü©…#» Áºde^ƒédpöjQè¥¿ÅØ(¥&—©ÚøJE¸³XÚIr¤ã'rÞõg[³»GÙ¨do¼‘€¡»äàœãéëõªÿ§i׫HÄ“ÏW÷ÏzëEìѰ2d6‘˜ø+âñ/êXÚÞÍm'ùÝi¦ß¡×ŠÄÔUïÝv9ËMéd¶· œædÛÛ¯j殚§‡à†å–[“¹erBr8À9ïÞºm:òÜ^ˆîc‘•#$s÷²};ö©¼BÖ³hò[ØÛF>\~ì óXåFO#·OξG3Íg 2Åá1Šó|–Ö*>ôl×^Tºïu¯{\ñ”ªÉ(ï½÷ûôÓÐ’}X[FÉ%Œ±ÅŽœg¾zcõ®Xºó-uQz3u9#ÐRI£ ]M¬ñÈê[q?¦?úÕ§k¦Û—ÍÕ¼— 6¿†^+Z¼»ˆ…hË™¥wdÓ¿E«éÖ힥‡¡må}ïú>¿3ˆ·Šk‰ÂE{É­¤]½çÙeŠEnçhôÍw¶šfŸiÚ(¦Œu!v·§-Œwõ¦-Þ™!3éê|ÖPŠOц{×Ñ®(–"î6–×}Ÿõ©æTÌZº‚mwóý>㛇A†ÑH¼…̥ܺ¿%‡µbÍ ´sçbàÏ"1ÓÖº«m.þîüKvöð«w+#‘ØdõéÒ§búHmâšgšù¸îyíéúÐóϫߙûFÿ•è¾{}ߤ1|©Êú|ŽgûÐD.pªz <úUè´ë›e2µ„sÅÔmÛßîzétÝ"Ú÷G9†n ˆ‰Aíž1WníKÁ¶K·€aÝ»¨íŒzW™ˆâYɨIióOåoÏ[¢b”ùa·Ï𱟣Ã}¹’KyD2F²G‚'<6jüO,vÉØãŸð4–1o½_Ä>Ü„] dON3Òn—7/ I|À =8àz×ÎÔ«SÚ¾{5£o];nº|ºØó§Z5%%4­»vkóG˜ÞYx†)-ÞÒT¾ Êf!Ò>eNyîÜÐ×±jéžwÒjöw31Ä—×O0p¨Û†8Îð{Œšã70èÆEÏê^1Š¿h©æÅ¨D gqŒ°$däâ³'ºÒÏmÙÚË·÷~yulsóŒòxÏL××àpô©ÉòÞ×N×Ùìý|¼ŸŸÌUãO­eÞÊ1Šoš3¦âÝÓjQqoX¤Õœy›v¿«ßÉ'Ûí…­­äÃæ1ÜÃs³QŒ.S sÏ9ö®ËÁÚÑ×t¹ì6AiwÝ»ËJA%# Øq†>ý1\TZ…‰†6á"´±RÞSmV•‰³)*‘ÙNAǽkkºž™u=Åü0iw—w†¾I¼¸lÚ¬wØöÏjX¬#©ÐQ³ZÆ]µÑ;½S³ÒîÍi{Øú¼›6¯…ö™‚ÅsáæÛ”lî¥Ë'6¹cxÚMj£tù¹n[ñ<Ÿð‰‰¢´ŸìíyŽ¢T]€`„eÜÙÜ~é''еéPØÃ£K:¥£ƒö{ĸŠ$|ÌAFS×åázõõ¤†[/ÊeÓžKkè‰û@2 äaw Ž$ÀSOÇŽVt›N’KÍ!˜Â1å\µžãŸ,*‚I/^üÖðê¤U){³[ùJÖ_.ÛÝt=l^mO*©µú&éj|d4#·ât?– ÆIéYÚÌ&+¶ÉnOôzB»A wÅUÖ?—"ã ?¥va›†63þd×Íkþg^ø‹ÌÝøu,¯xÖÊ¥‘‡CÐpçКô™>Ðf.¯ Eƒ¹Dc?™÷¯+ø)‹\N˜ ä7Cò°õ÷¯F¸V{”{yå†EÈ NF2@ƒùWÀñ-EG9«ökæ—ê,Ê*u—M?¯ør¥ÜwRˆã˜ŒuÉ,284_ý’kXšâ[{Ɖ#–F.¼ŒÏLãŠ}Íå¿öŠ½Æ–ír¹Û$ldP ðúÀ{šÊ:ä°jÊ Œ¿f•bñl…ÀàŽ;ʾoÍZô®šÖÚ+Ý;Ù«þž„ÓŒÚM+[]Òû˜ïÝAé‚HPÆ[D¦6ÆêÀ–öðÊÚšŸ(` ¡Ž;çò^ôë׈k&Ñ’\6…u籫¿ˆmá[¥0ß$C.YHè àôäbÕ9ÍT§dåg«üºo£Ûækí©¹_D亽~]<žÇ)«]»jÅî‘¢o(†p˜íô…F÷qÛÙDâ"¨F °÷éúÕŸ-±´‚úHç,èñ‡Ë.²äã ûw¬ø#7"ÚÈ™Z2X–-ôü+Û¡ìiM¦’NëüÕ‘ìaÝ9Ãü+ô¹~¥¿ ¨‘ùÚ‘+6<ëë]zÛË4)l4ù˦~gU瞀ÔñÛ\Gj¨³Û¬|Œ$eÇSÔnç¿éS›}?SƒËY s,U«dg×#9ü³\sΤ_ÃÕ+Û·cç1x¸É&•­êíë·êpÚ¿…×sO{cyl€# õÀ9«þ²Ó£µ”\$Op y3î;¸Œ.{v­Í{§éâÐO¡Úä Y¸ÏÃ$þ_²;iosmf°ÝŒ" c AùƒdÜ Ÿr~ç¯[,u+NûZÒÙi¿]zÞÿ+6õ©Ž¯[ Í'Õj¿àúþ›™—3Ç|#¾°žKg?òÐÈT`{㿵jÉeböJŽ–ËŒíUfLséÇê+im¡»E¶»†IÌŠÁŽO]Þ›zàóT#†8b%圪òëäç‰v›“ŠZ¤Ÿâ»m¯ÜJÇJ³Wv”{7ýz™ðØZ@äZXÄbæ>ãíÛÖ¯Gm ˆñKýåÙ°€>¤ž”‘A*©–'Þ€ãr( 8õ®OÇèÌ`yrH9¥{NRñøe$Þ·w¿ã­þïÀêQž"¢Jz÷ÕÿÁü›ý#O“QA¨ÜÌ–ÌÍØH<«×Ú´´ý. _ÝY…‘7{—=ÆHóë\vƒ¥j·ÚqyoÌ1ÿ ¬Ï'øwcµv¢6Í!—r•o.Ü–'$ýÑœc§¸«ØÍÛÃráéVæŒtk¢·Ý{ÿ™Í‹ö‰¨óó[Gm—Ë¿p•æ´D!7?«ÇJ©ci©[Ç$©%¼QƒµŒ—߃d gõ·Ü…„38ùä G_^é×u…݈’Hb”‡ÜôàãñÿõW‡,]T×J5qX¼Z§N®î¤·[¾Š*ß4ìíÌš–®-Rº³žKÝ&s1ƒh˜ qnÈ]ýsŒãž•Þ\j:f½©É¥´<¸o$ÜnÀPI8Ç9Û5ÆI Ä"âÑUÌåv;“W(<ö=z×kk¨Í¯]ZßZÅäù{·<29SG%ÂØû¯Ž~ïSåfošq«èÖ’¿^Š_v5òÓõnÄÇ í0*¯¿ÏÊé8¶–­I¦þÍž©«§tzÅ=ÜÚ}ürÉ©K,û‡Ú¼¨Ù“hÉØˆ„·#Ž£ÖªkZ¢iW)&£-ñ‚bp-áˆFøp $u<œãŽ+¡h㺺ŠïÊO¶ÛŒ¨fMÃi#Ž+#Æ:3kVñ}ƒÉÞ›² vä®2œç¸Ç½qajP•XÆjÝéè×Núésí³li…Â×­ƒ©)TM:q»Ñix½}íyœ[WÙ94gx† M ÖÚe²ÉgóðÉm§{|æ9Æ+ƒño-½ÝÕËÜnÞ÷'h\së^“=­¤¬Ú®¿t^n"ó.¼@ûÛv¿Ÿ>Yãý2ÃJ×$‚Âb3öÛOî>E#æ$îÎIö¯³à jyšŒ[´a.š=–ý-}4×EÑ?Çý–¤«R…ÛKâ´¢÷æåÖüé=Ÿ*mëï1öGíPnÇÍØçêIƒmûØ#©æ±ô«±ŸÿõëtÆ^dÚWÕ÷9„%„Äkð½Æ14¶{ ôÞçÓ¹tãõ«Ž Àö¦Â G"nÇžÔ§^ÑOå’'£ü*2µ™KÃ2ϯT¹Ü0ÝÊkÙõ;S&—hÆÒò[¹’!l ªW$·l1Œ÷ô¯Ó&§ <|Øä{WÐVÚŠÇ§Ç Ò´§$DZˆNA9ú?R+á|CÄF†&XÆîI~_åò¿Ë,êsR¥*q½®qËÌÐ﹓&r¬Åp ÇP{So¬â¼·’œÆæ-µ‡MÙí¥]½¸‘ñJRA…Ú£gž„õ£dÁ ½Ô®ÎT‘‘œ‘€F=sÁ¯•ÃcXòÍ%=íÖÞ]>ÿÄ!7§3³ìºeì·ö6Ë Ìp‰¾IÓH÷È#ô®Þ9gº‹tl¾^3¸9Ëzœq\Õ…Ôë!w†9B¼làž:ÉÀã×§Ò¶<5ultd{….ñ¬¨¬[‚Ý89?w§¯5ê<Ô¡V*ÍJßøµûÓò×ÌêÅÆ* ­_–»•¼£ ,cÔZT8‘V,1*©o~?Îk?Áñ[O­Ç [Æ#Œçîƒ×æ>íï5ÞŠo"/ Hã0Š(éëNð šmÆ£r"¹S —A õõ×Òº¾±'•^M·w.îÝ»kò9ãˆ<½ùž‰mýXè&±¹¸ºkHí>Ïfå F:tà:ç£VŠèv¿ÚKx‘1™v€ÂM¬r\ ~5˜×ÐÏ|Íqc%£*€vèG~™Æ{Í>éŒ6ÿdŠD×8qn»Â Ü7p:õ«çéQQ²RpºW¶»ï­ûnŸ_‘áÕŽ'H^ÚÃõ¾ÅmKF´{Ï:X'»^ŒñJq“íÏöãõ©-SD7Ogb$·¸TSå6 ;nÈ$O\ÞÕZÏÃwº}ÿŸý¡´ÞyonG#*8V'üŠ· ê–÷ò\\]\\[íPd{v wwã¿¡¯¨ÄQ‡Õ[U½¢I%«IíekkmU´òìUIó{ª§5–›­{ZÍ~Egû”¸†in\6eßœ¾rAŽ2FDZ¬éD³m[‹·Ùƒ²'wàûn9Œÿž.E ½€\«—P²òGNAtõ§\ýž ©Í,K´à±Þ}1Ç8þ•ç`ês5N ɯ›Òÿ–¿-6;¢£u¬¿’ÿ#âÆydVw7vËÜ}ÔÁíŒó¯ÔÄ¿iŒE§ê q(ÆJ”XÁ8ãç\ç¯ã[:”e|±‡8‹ìí·î’rÏÖ§Ñâ‚нÃÚy7ÈÎUWÓ#¿qƒ_Lóºxx©ÅsN6¶‰-VÍ;7n÷·‘б EIêÖËÏÎú»žÐ&³A%ÃLYˆ»Õ•°OÔ[Eu ¬Á*Rx9ÇƧº•D»^WÞJf$Ê ^vÿãÝ u¼w++ «² ãŽøíé_+ŠÎªã*º˜…y7ò<ÊØ‰×¼¥mM(e·6“Ê`Ø@^@ª{Ãar1ׯ8ª²§—º©'c¨[ëk{(MEcû±qºSÏLœ–ãÅÀü«è?ÕÚ•©S«N\Üé>ÖI+o%çÑ/CšžÓ³„®ßùi»Fœ:Z¬²4ß¼8R¡†ž0 Á<ÿ“I+Eöt31ä!RÇSÒ²dðÞ¦Úi™í|«–ÆØe½@nQß’+›²ð¯ˆ]mÒóQºŽÜÁ!bì3ßjñØs\oN¬\¥ˆK“n·itQ¾ÿuúžµTj®y×Ztùy=NÎâÙ 0”¤jI($¡ ûVN¥¥ÜÌ}¡ÌiȈǰ<ñZ²hhlÄ7/qxW…÷ÉÈ÷þ¥Q’Îê¿…GªhúH·¶½K‚g¸xnbÃ0ä/sËsúW¹ŠåÓò×ú²ùúL0Ëpu¨f4ã_E6¥¯s™¤œ%«Õ·û¹FÏV—3¸ý>sk§±¼šo1ù!žÚY@<ìSµ9<Ÿ›õâ¦Ô › [M ÝÞÅ ¹T•Õ7`Œ†àgžƒœQkªI ÛÝMcx¹Ä襢lŸâpƒÉÏxJâÓX½Ùs6÷ Ëöx‘þË$ƒ’ûL{\`w!Ïlš‰ÁûÕj_•=×¥•Ֆ˼»¾‡« X|Ë O.ÁÔU¨Í%v¿yI&¤Õù¥(ûÝ7 {±‹méKS½¼»»í,êC8Dh°vå•NxûÇéÏXá¾µ-`–Êí"$¨¾´WXs’v˜·g¿Ð~>¹á)c‚-JÜJ”‰<É'‘×U»tô\{Žk"K‹,.‘w`Ö6«’¹&hsóü¼äàp¿ZÓ Œ¡^ 4Õ×]·Öÿ?OW¾¼ÓÂâ²ÜGûV!{I¥ÉZNmTNÍB¥íe¦²•ùl’Ò<Ч£jZLßhÒ­íî~Õÿ-ÌJûs÷]À ä{W_«gp^Ù^M ¾ï6Y-ÏÙGaæ3m> maóuô¯?¶Žy´Õ(í¤qû’öÑ*ɃóffÆ1ìO§è^Ó®m-EœÒÂyž#»íÏQ€~PqÏáK4§F+Ú?‹oT´Öý´³K}ôÛèx˜UÔ)^4-{´ß$Ÿ½Èœ]Ôe«¼šÑ«YµÎºõî‰póh÷š”p“·™U£r]Jñ×ù×–üJ‡ìúªAæê“2çt—g1¶UOîÏCïŠõK;kí f¸¿ßö¬f8,BµHßæ>ã,=zWxÒMGû~{}Já&–-¼DìÑ.UOʦxϽ}g‡t£õé¸=5õmm¢ê¶=þ&YàåSMÏ–6[E^II©É6ÕžÑ~HÇFÚk£Ñ|ûÄCºGþè=ëš®›ÀªkHdÊÀSìOzý‰mO:ö»‚¹ùž2µ§¦ëSX躑Ïú ‡è=M9t=J6IÁÄg©8Àý}ëÐÉ’Ñ·”H%‚9õôÿõÔÑÆ·Oç3< €qç§Ç^õøõ^*Æ:nðJ o¯ùýÇ̼MµkCÆïì®…ç•R< àSšô­N¾})ä–YQÆFÂA†9ú1Wu!ŠÅMäÊÃ8D$…<žÃ"´áðÕàÓe’ÓS†xŠ ©4!òcï)×¥x|Cij̩BM(¥§W}ué÷|õ4Åæ´Ý(ÁI-{_ô2.´×†ÅìÎÇpBQ÷SíUdˆØšágŽñ0Ù’rݸ9ã~­Þ¦¯& Í.Ê@H´7![=H ŽG·§­eëw⸶ӴËP g¹g'œq…qê{WÎáåZm%$õî­Ñ.«}ž—+ '4 ìÓó_£ý Û›+;˜ÌWw19„ e=FTAÆ}¿:‹Á^LIqÉ!¸ò1¸2¶G·®Á©Îð¹}:FNÝÙþ¿x þ²­bƒJ×3–xe]ÈÑ7QŽÙäàñù×½F5ªáêP¨švRWi­º­´oKùž•KJ›†«¶ß?êæÿŽ¥´8%S<±¾V6xJ7 ÎxëÁèzUÏ ÈŸðG¾'e »Qܳ`Œç?N+ Ä×Ú]ö—u-«ù~R!XÚTó , ¼SÓ§=ÅI᫆(EøÛ°Üxµ©MeÊ.ñjv·ªºþ¾ó‡êÊXhÁoÍ×ïè[Ö5¶‘DWnvªØÀÿ›LžpZöîrñ‘æ…eÀ#ªé±jÚ­ñÔ~ɵqÅÃJ@ÚGN¹ÎG#½u6±Z0žÒÚ•W—“ï±Áúãé^n/¦¾.¶ü¯ÓúЬeJT©û.UÍ×_Âý??#"ãU»l{‹‡Œ®TʱÜB“ž:õæ§Óê· ouus4hùŽ<€„žsËòxª®·w6¥xFØmaÇïD+Ä€7QÛÖ¯Ý_ÿdi’.ȼ•,KL2[œ€Jã#ß­zp…yÆxGßžËúZ¿Nz.*‘JœT!i¿M?œWvw³\4òÙÀ¨aœ9=z¨äc±üzUÍfÓ­–YgDŽEiœ!'؃þ+’¾ñNžì.í4›ˆÀ??’‘€£§”ò}¸öÅj;jºÌ"æíbWmÛ’V @¶çÕsÂÕcòªùuhº¾ì{6›ôÓó½öÚúo:a(¹{°ì÷ù™cK†÷ûI¯/B^À¬0U$’A‘ƒó*‘×Oõ­mBÁ¤ádHxv!và`ü¬ŸÊ« :;v lÄlÈÚ#íßqü‡ÐV“½Ôè¥ä(˜ Jíëèk•ቭú/çE뮚tµŽJÓ—D*w·ÆwàzãëÖ°¡¿Û¤u ¥·<ˆå‘EÔa‚î$ý9¯k&Åâ#‡©F¬ôš·]|–š]|ßG °Ò­ìæ§%ªïø#¡¼‚xZ4hJHyØÒà`ã3޵JK2Gq­»©äª)ÈqÁüëWK‡í0¥üуÛÅÜ’çFå}ëøÓo¤K8,±sæ¸\Ž8¸É=ã_<±ÎNJkÞWºéù³Žy§È·Ùÿ–ìâuÍrmðùVSMlćEœDxÆ0yîJç$×Ü $žiÆÁo-ÉÉÿyWõè÷Z{D«4ÁÂȪÊsÏÔv?•rºÏ‚`Õn–Hnbµ‹1#Ù#g¶ý3#Äexˆ¥‰£ÈÚÕë¯ù7Õ­{³è0XŒ4#ûèòùë¯ù|¾ò}2ÂËSŽh®gŠ3¸±+͸7aœçŽ8àkÉa¼‚]lÃyiDRÜ30qŒg¥\ñ 4i¾Ïáæ‘•Ã[Åö²$ˆíù¾^Kgv{àTZEåѳžmÍ{o>ßµ™ ‘ìÜàäsÓ‘ÈÇ=+áU9QÃEN:M&ž—×F“Wí׫ôgÕæ*Ye,sª•©T©ÌÚ”ù£ 8óMÙò«mejã{Á¶ãSƒVÔn.ón÷±¬Sò €Ì:/f?‡J»¯lŒ<ö#ø›Ì)'àãŸÏÐqÂüÜŽÜç¨÷rjR‹§Ñ/ܨ’'qnWǽ2G¯©ç²ð奈°ƒFÖfÑo.aÝövŽQ.íÌY°¤qŽç8í^Þ>¤hÓÙ4÷[½·kmµùÛCçøg ±Øõ9EÑÒ Þ6jZÂúÉÂIÉò¶œtß5ÝÍ^ùÚ@±êw:Q—î5Ê@ñŒâ7ħüH=1^©CiãÅcpn-×$òŒyàgå<Žr+Ýá±Ó´6Hngk8Ž>qu"*Ùá‹|œžÄg½x—‰­æµÖ® ¸P²®ÝÀD‘õP~ê£ð?­}w‡ƒ•u ’mw×ú™õYƒÄÒTêâ5“ÞÒ“Qoì«´¹]›^åß-›÷uÍ®£á™aâ4*›ö£1ù±ÑXúʹzë~²§Š"géƒÿ µ}_JQȱ.;òþ¨ø\Sµ ¿'ù²÷j¼¦6Œà¸ýÏÞ\õçPÇaç|Êóyr.ƪpŒgž‡òÍI,¤~í¦IX!y$ä~|š« ÃÌÏpðŸ6?ý`×óšÌ*N›§MYz\øêp´_&•‹CQŸN¹gÔп1Æ1TgŸM‡÷¶—3ØM¸y­nYcÝòž§¯©§_ Ô’JÞ‰~+§ååpyt¥º“ì´ÿýhvº†§¢w ¡CÈy)îÏ®1Œ`Ö:hk©\ùÚŒSO·3J8Â;ðyª7+ âl}·qUk§·àexÆá€? ÜþÜ7sClð4 c&àŒ`ᯃ«‚‚öqÒV÷ôÙ;u^{=\:µüÛé¶Ý~ÿ¸«qiuÄPC?›‡ð Gžç=9÷íí\gˆ4øì&‚è)TF*Øx`cùšì¦’K–ó¦È';¶ª{ÈüÍsºåÅõ˜µ°Š{¹Pʇv{çìzŸÎº²zµ0õ¢¥{?‹Ó]_Èô0üé§?ž‹ÏvQ×,­$¶¸¹ˆèÖ‚.XÏçùT> ·¼ÔÑm>Ós¦wÊó•?tdœ`šžÇQ¼:-Ü?ÙÓÝFcUÝQå:pyÆÏ4¾}“íMt×¼8òÝ&d•~¼ãïEJŽ·n ZÖzµ§¥ŸÝº:[¨°²¶ñÛgþV×¹êÚ¤6ªÑ[̪2¦>±ô8÷®cÅš¬vq´wŠYÕY’X+`†#„úöçÓ¦{«$Óá¼î«ù,KbË sØž™ï\·îµ43Ï –U;S ‚«ïÈÇLqž•ò¹.2›­^öOñíùoÜñ²ø¹Urª“ü|É,›Mf+»˜ã¸,?|êHîæÁò=½iê7žM+–ÔøUH!=ºŸS\ö¤,á·–Þåd¬BñõÜ8¹‹˜3pó^iël¬r±Y:Æ€wA$výké°™lñu¡iµfÝîµÓ£o¶ïdîz±Ëwí%Q¨­zké³·¦ÇP—>C¥Õ¶™þ÷Û‡—朜ägœúÕÝFW¶ʶ‹³’cbÁSÏSͰYôó-µ´Ö,À³¹à‘ÎþÝ:¹©É¥ZCö=ZXŸpÌj² sÈÉžq‘DZëE\lvái+§»v]l´ò{^ï©ÃRqö¼‹Vž»ßó¶žF…¤²¸&H¯£ïo”}F=ãKq“Hc’+„Ž,ð‘•+êO·åI ´Z˜†9/ì#o–C vˆ ‘‘Œ} ]²±³²ŒÛl˜Ì )‘ã2å1 ôäŽÜñ•jTâ§{ϵ¶óÿ†¹æNª¤ßuýV!–Òà[ªŒr¤yÑå%ܼ‚2:çñ¨u;©¬´“sjP²DD‹*Àz²‘ŸlðFGS[b†:K›[˜!ËÆcQÎ@àç¦HõÆ8®g_Ñ­õO& ‹†’[;c, €~‡8ý3QÇѯˆå¬ß"zÙjÕµVÚöÛ][hNp«Q9½í÷éßæoé·VwZµÄ&+¼¡~_Ÿä‚qœr}k‹ñ•õÆ o 7–кËöƒ–9'k`õî?Æ­éAiu´*¡£ÜCŽ$ ö玹í][Z1‰~Ð×03™v ž˜ãŠõ°¹„2üdkMsEêâݯÑ}Û«Ž –¿3\Ñm»=áúžS'u5džãT¾»´çí(QŽF=O?…uv¾#›YÑ%ž×G–'R®¿i‰X> éïÚ¯kZtæîßO–íÑFœóÉ ñížž•ÈϪئ°,´wÕ„HNÔ…‚ $gîåïÞ¾Îi%ˆÂPäœm)#µ´v²×®šï¹éB8|\S¥I'|¬»Ù-K:|úž½/~©(b9OÁö¦Öo%‰d»–{ˆó,oÏ#¡CPxV·‚ȵÂ<“¦ù„Dë’:|‰Ÿ×ü|ÇP¼¼¿—tó1_BOçõx®XçÎ׳ŠÒÖÙ/åÿ6—tެ.X§ÏnX­’ý?ÏO™è‰kg$B âW^»Ysüê­¶ƒ¥Ç-œ6ØŠYYƒlΩFÁ¤ÈÏÞ/nô\ÝMoyEsÜ3“kÄÑÎ .ÖçÜcµºóà ¼·PKf˸Ÿ>%u8ù³•ïÆ~mBš~꽬ݷ[;]kø“É3l«íeKÚÑMs¸5R7O^WkImÍmî¬ÒkdiZô\„X[ßX®>ÎÒù†ï›çòÜŸâc½S]gRÖ×2ØÅ>s7›k·Ñ9=@=:œÕ«R;ˤ¬ì c;a† ±ôÇðÇ×–ëùS¯u}4,‡U°{¨î œ+—1môNrqÔöü+Žœœ½éÃ]ý߯ɽô»{yÓÍò|ÊØ(·‡MÙÉ]Æm'g8¤šŽ®JZ'ªIOmªÝKlöVR_RûcòšD@ø3×ð¤”\Û¯Úà‰&\¥Gµ29ÂyA‰s×-åWo4ýHĺv£wjP©{—~O<‚IÆ=GQÖ‹‰ntËç¶Ô´Ø¤¸‡ï@³ù‚LŒŒ`üAøŠîi9'tÚÖ{ùú­V‰ž}l»K©áåE7tå s8¹h´åöVši©E4Š‘ÝZ߬bŽ+‹ŽvÄЉýðG¦ONÙ®Åþ¸ æƒj³ŸâeúÜäò¿mÙØè¾ ºf³Öo¥Ž5AslòH~\.×l:d©'“œc¥H/D™m&ÕH¤,"[™ Ù·–ùÈÏ$ÿAé^M\Ö­LD]¬w‹¾½|½Ïcônàì/¯G5*S•¹›…¢Óq¼æµÛå¿».eËËmNÉïuK8àMf¶„·–m¸9<’ñ¿#¸lsŒFÖž• RÚ}ªöÖìd”6ÆÛ3¶ËÉ>™ÇzêD¶Ú“º1òo¢9ˆ·é†e¸àqÒªYè¶úaØl-å‰?ÕL Ì«œçs’IÎp:`qÍk<Êo¦šé×ïë­šùŸAƒášÔ+S«J¯=•£)%Rµ—¹d“N)ÆQ{{«EÌex¾yt-6êî[û¶‰öy%-o'ؘŸão§¥x…Üò\Ü4òË$®øËÈå˜àc’y¯Õ´{gŽImÚ·“|2ÍŒmÜH$í<Œb¾z^•úŸ†îœ°õ¥ïénK[OÅwÓ¯õŠu'/qó$®÷M;Ù»]ó[DšµµI1kªønŠ5đʅÚßxœgcc§½rµØü7·’]A7(WŽ¿Ä=+Û㺊{õ·æ‡©èÔ»¶Œô›òH.OïAù¸<œ}jŽx‹°0#î¥Fî‚úYpÌ(E ’ø<ä ©mchå‰W~ï›Í%qÏûDÄWá¹N–’«=ëóßËõ>M·¼ˆþÓk $rÌ£1åqx#¡ÿëÒ‹fŽ)ZÝ]!a†Æ3ÓÓ¯9ÅKx©%ô¬#‰UÍóÝÛ84÷¾œD"†ß’6£ã޹<ÿ/zéiN\Ô×3{ÞÞ¾Ÿ~¾aÏ.EÉ×{³æÙ›—ËLErݺgj­æŸc+ Ï9­.P%AÃ|¡A*>÷|œwÏzèmífº—Ì716rq¿‘Éã×ô«Ž’ÙÝ[KjÞ\¦O•É9R1ÁÉ8÷Á®ªª“ƒ¦¥ikk=“½ôï£Û©ªÌ]¯&qúN¯§êÞe½ÚǼcklÂ2IºŽ®·MŽÎ;)‘ e€Ý ¡7d’@Î>žµ­YèÚµš5Ìý®AÒ>ŽÔžœg8úÖU…߈4‹ƒª]]À£c­Ü%\HàžsÔq_)ˆÃKtá%ödôÓM%×úܼBŽ"›å÷|›ü™Í4Wú•¤²[G$lÑïŒlÓ~•M^xD)6ò¿+¾Õá\óþ})þ7—JI!¸Óæû=Ìe’[s¡QÆ>ðÇBF=»×?áK¶¶×6£¸‘ˆØÊØ í=}«éã†xŒº´¥§:îšw‹³nÝ-g{í©Ù ^Û 4´æ×U®Ÿ×s¼ÖÖ×T¼™tËË$±¶!Jù®7¹^ªqÏ\w5j+6[HîíÌr#9|œ’1íÍc\E¦Û[^Ei ö¯:ÆxI1D{ó€:dçÔ~5·á;K‡Óâ{é⺈©&%D1u䓃_9:ŸS¤¹_º’{µn½uß[y²›¥FðnÉÛU«Óõó±}tëÛ¢ó"? ”ýÐ $ðqÓ½hhV±CªÆ-‘¤“r3÷I‘éôþµ’ áãFP¼–ëøV¼BÞ)$¹Ü£ŽUJ!àH|uÇ$ä}ìW%|S©[]=º¿¿çÓÔðñµ§áºkOë_ЊêÂÝþÏ™vHÏñ!R§¼ ñïøšæ¼P­¤Ê<û¹eX‚ÆO¸S¸“’k«µ¹6÷‰YÉvp»F rõ €œõ9àQñ=‚êvMopÀŸ›1FÜ`Œ皬²µ:úkw Úòz«/붆£z³su;þÒÍDFæe!z|Çõ««)É+k¦êÎ÷îÿº_ÛX:jX¼'·ŠVrœ’ßOi}¿kÑÓ®–D—:\×+ÜkicÉ;²¥Ï¶à:dU­DêS˜î\<É÷ŒŠ<Ó‘üGïœníÒªÁq$ôZžŸu¹âfTa‡ÆS®Gs]º‹Rºk}oT´{@FæK0Lþ\ÅØÀ{V.*Nt´²ïußK•É ²¬n\çF«i=`àû_šP’Q·ÚsåV³»°¾W½¾’⹸’<© r“Ǹ18pçùxàg¥hø›ÃWÒßÏ<,×3 oŶÝù}à£v>­j²Š'‚k[h5ÝãÎ1H³;ì$®*Ž9é^k«ðñ‹e-¾¡cswm …O%‹`y‡¹[éé\xºÕ)Tuéµ}4{ôëë}>lý'‡ß²êÏë4š|ó\ÉÆQæq‹ºŒ›JÖ|ÓW÷mïíò:D{½&F´Œ2ßÏo³±#Œ+W“Ÿ›9<ŒW Z V+pÒˆîçr+“L6!T$×lgœ›½+Pùp f4Ýøù>¼U–†k”Y´½vE·\ãË1ʯÎ>ó)èA¯7VUyT£gçw¿šÿCì2L,®­hP©)E¨µNQQk§ºÚ‹qÑYh–»¹\£ªËbK,Ìöq½¼µÎ@ÏþºùïðÅ{WŽ5KäðMÕÁ–)й³—ýh’=:ú׊žµû?‡8wO/©'»›_r_æ|ÿc=­z’ÑG›tþ'mÓËÿ…wß .ZÖå¦ÛSnݸô_…p‡²¸•óå¦Òv ÉaÉ<Éæ»ÆÊ1ÃO›ª·ÞÑÛI%»Z…‡M}ªÛÀŒ•Áõô9úTP›™ §ïF¤îQ»ðz8¡•DQ,¤°Ü¬Ò)Ø£$’zTQ$Æf´‰ÀÆpaÉä“ÉÅ~%ƒ®©AÒ§£ßVô]^îß%÷Ÿ&æ¬È­$ûà‘ Ö€œº‘郊™a–Á Ôä° æ’anà1ÁÁü{ÕÝ2ÎÂRÄÈ7¨dŒ±äç¯4—K¦¬åµKÞ6³ÌŠØsM÷·†Û·v§8Ö´õfš ´»Ò¬@‰ùšác98X[Ikw ä…Eù‰n>fãóâ–ei!.-¼¼‡ŽU*qŒ…À=æ=몆 †·#”½eunú-¼ÎNh¦”7òÛ¡^ÞQæyr^;¹ *Ç)L1õ-Ç¿áSé×zƒÆûMáPví–S&Оž”Ôky7C4I•€Fd ŒJœÿ©×M–Ðãi Ø,C¸g' 8÷ãëÇJ1æã8Úû=Ö›ö·gæ*“š’ß¹(¹¼šÕM¼‰s¼*e¶ôÈ;½}»ÔfEß$»åå8 ônƒ¨ôç>•síc)*oÉQ• On13W¬’øfHÞ( -“ÐAÎ}ÿúõÅõ˜ÐÒË_=ü¯o—ës†U5²K×ð¹VÎÖѧ qÚ+( ÎͰî:óš‡UÒæ·(¯ºd8ù•Ž9üªæ ÿdt—QQ R±Vc2 0県~4ù¯â–a ÅÈEòkë‚x'§O¦*cZ³©°Ö=z­4ÓÏó0jªJQÕ}ëäUK2bEóîª1ì lTm¥ÜÚÇ!Œd……@Ÿ_¨­H§ÒPy"Åã,C´G& ÀɨEíÂ`À¨"䥜·éúS¡R´ãx'o?øq µVÚŠ·©ÏßX±¹Šá# °¨Ž¾Â®š(Öi¶ÜŸîmé€p¸üúV”°-Þøžq;†_‘rO “Î1ŒzsØÇÄébÖ—M+Ì0*ìÈäç Ç¥z±ÆÊJ¶Ï½´å×_ø,D¥¦«ò)H-Ôî‚8Ñ-€Hôê?ǽ6t¸ySÈW’óî0GoZ–W˜\ ,Ä‘¶K •錜““ǵ[¼†æsºáa3¹Ä Œ| cõ5è¼M¥iFÝ›×ú靖ÔZýwG˜[˜g—t«*À:ÉaÏà óî)ºf¥wt-ÜqO,åb «Íž ôïŸN†¦ƒ¢è+{Åô¹;·µ¼QƒÐ„?'\v÷ëWnt¨ÖK›½,ͲlÏ•jª©ž9ûØÉÎ2ÇúWGFIÓoµ›^«{ùžÖáháªÆ•v¹¥f¹n1´“q絓WÛMnÚ4Ñ5‹ë«GQ–ȹM»àóð0rP(ÀíÞ­jº³Õä¿ðݤÓÚÌß!DÑ6Õ y Û¹Ý÷€ÁÎ3Ö±ÓAlö²\j—SXÌÒ•'/+mä,†?¼qÁ<ƪËg Z››Y¯M£c;Ê8ì¸õ'ø¿Â•=§zU}ÛZÖv¶žšè·o©ô*1ÂSŸÖ*‰J/™J¤*©KÞ»|²+R³qåOFÛ²fµó5šDÚ®Š¬T7–òBÐÈÙë‚~QÛ¢ôúæ³nlà¶š{h®¾Ö€¯•qœzžX¾}?ÈÒQŸYOìi¾Í'>[5›Hãå9ÈV9ïÑ{þ5¯¬h~${T¾¾u¹<üÑÙ•¹” öê8ô®Õ/aQF¤×ß×¥“Ó¾Ï]t=:Xlß6ÁÔösz‘–ŽNŒíJó›MÞéëvÉ©&ØûŸÏ6œöØ,Ä»†Ûà!àã?Ÿn•‰nÅÌj×ÐGw4=>ɪ*Î:#î Ž„gûU{x¯,a¶ó.¡4EñtFãÿ,á½rzôÏ­Ý+ÄššÀ5éúâàâŽÞ8¿„îùÆìñÃŽÝsXT•H~ñEM&ígfîí¥¼¿­o ¥)ÕÀ¼"§(¹J©v)¶í'ÓnܰÕèÚ\ÌØºñ’Ö±½ìSÛÉ&s5¹g=ö‚¯ZɶÔbFKK#çnÈPà|‘S­„p[Áwok —ŸÌWÆáO~Œ:°ïÈãž…JTª¶ùíRöMÙêµIÚÚ4­å}UÓFø‹WŒyåï-<ûÙíÓó5™Öí&džÒWAŒŒ“œŽ˜éšÐŠÞâ;ˆídù3Èün\ôùr:zÔº òFÐApmìàš%× ¼ç*Ü}°8#Žj{«_"ÙÞØÊ‰¹ƒo;Ô`äûŽ|íLÞ~ÓØM%ÛµöÝÚÖkm®xµ+Z\Ÿwõ¦ÍnìôÿµGk5Õ»Ü4˜xñ´€T2àuÏÔŽúÕ=v³¼2D²4¡F•‚mÛÓ°1ïOÖ/šÒHï^ÕeÞ­—ìÒ±'z“Øw¨4_Úk ú}î—qi?–ÆÕ§œç=pqò‘À?†+ÐXl},=c~åÕA‰çœJ…_l¤©]Izßúÿ‡Øç„=¤\iß™tþ™åºv¯a5’Mk³¨ÎZ8™™y#æ¹íœf­E©Ã8DX.‹g£A"ø^³k]>ú‘Æ#’Aæ§Ú>β2ý±ïôïWôRKIlḾû-§Ïç¬bQR»p§9'Ÿ”uïÖ½:õéB76ú¯{×´_é~‡Öe¸>ÅFœñ.¤œ-¼Uï%—½Ý¸Ù¶­fùËKËÆhíg²¸TBÆ#‰ òI<œ¢þÏ|š³wuD¶ºgAüò8?ˆWUªx¨ÙJ!ºy ·uo´-Ü8ž.>_•@É#»ñ»XRj—W—sa=å¬ Ô2í+ƒÂœAªÃã%V*n—*»û_ý¯™îg™o QÃ}iU©)©¨róBéF+V¹vZ+ß{­Ó3®¦1µ·oJa`C6@',çý£øt¥–êâòáN亀í™Ý$y6u‰-Æ0qøÔ𾫫ù"Üjw8”å±!,1Ž„ò¿†3EåüïjË>¡<‘‘–G˜•<ñMzTé©%']úÿö«©âÔÅðþµ)Æ¿½öyâ­Ñ+ò¶×/º´¾Í+8Ùo$‘àK)ÉLnò0ǃø†g•cŽÖçw8-nèÉƬ§‰Ä:M”z”±[ÁŽc>㟘ƒƒƒÒ¡’ÿNÔbµA{q{tw—Yf½r<±œôçÒ·¤ç§muûõÛúî)aò)Çýž•fÒM®hëv“Œ_³½ÕÚ¿+æµì¶.Xêwr%Ι¦I=Õ´%<È.íTmÎX~í÷ÎOx5•ªizE¥ìÚ§†ä¼SË7yؘÈ9fO—98«óëzþ¤Òù+y\b+thG>„òÝ3Ôãž•Ó7ˆµ;‡‘m<)~ cËyåDSÇ;°I^øÀl÷ÅrU©8®Oe¾þú‹ÒÝl·ò?CÈø~†*·µ¥õˆ{;ªn¤¡i)|0qvQó–®ÏFìr?5{fÐ’ØØOm5Þv+BnÆBrAþYëÚ¼¶»¿‹Z„÷×VpÝB°]Cæ¢BYSv¿19Ò¸Jý—ƒ0êŽOK»æo[ý§×®‰[ÈÛŠq¯™M)s(%úì›NÖÕI´Õ•ž–V õŸƒS&›o-ÔÞ`*r\qŠòjö¯‚1Ú½¼‰sõqǸ2géü«ä|a¨¡Å5tæ¿)œÙeõÛOÌíḴ“uº\­ÜEC_•‰#$~¬›ÛûW¹P$‡Îbש<àûcõö«úT45–ËÌ©*îùqƒ×«{ycšA ̈N3Â!8úõ÷ëÏü倥IûÜÎÿ×oòGÈáa =ÿ¯—ù ŸÂºUüŸhk˜Ð3•Y¢MŒ‡Ž=ªµ´º¶’ aÔ¡Oï.ÉW>çå?ýjº!™»=¹Bs°ºy•«Dò}¢Û",HIÀÇN=+Úpu#ÉZ\Ë¢¦ÏîüOJœÞ°ræ]šÿ†&²ñ^ƒ5Â5Ô¿f‘G"àÀÏ|ðà¬Gr¯¨™ã™Xw«zgŽ*®£{s=´O6›o:±Â<¸`HœúsÆ©éþ–+øn¦»‚Ù®¥Ú°[(@¸ùyÇ“Üz×°8ZPsœœ4jßÝd¬ Ñ…äôoNÿqÑê :%¿¹¼XlI³äì#é\Þ¡¬ÛÜû6Œ÷1.’ËjDnÄdðü0qל{U{½SŠüOi¬}®é·|·0 ¸+×<{ý*úêZµ¥ÒÜ^xoÍŒpÆÂBņ1ÂòõI©¡F-*SvþnO“NÎ_~½‰t×*nÍýß+i÷ß^ÃšËg§iöín¿½òåf•~e9ÛÉúðOL€|ÞæàOö¾a ÒÉ#iÝž‡ñê+¬hš¦Ÿ{H°Ü<‰¹.£¶tÏaŸ»ø×Ý.gE—yÞNX`òs_S°©[Vhrµg³ò}_}ŠÀQn2æV³_ÕîúžÇá-&1¤¦¡kq:G(Ò!%œpwzwÆ: Ùû%„ê¯;"“8'“ò‘Àäþ @%ÐÑ"F#9Pv‘Ô?*µ¯X<‰m,F¥T«ðå,+ãe™×«^îm4ÚNú¥ë¹âWÄ9U³–¯¯o™½q4.®fˆ•GdÚ²gîàŒœç—ÔÓ¥[WÔ>[Éf]Â5|Ö‚®8çåçý‘øºîÊËR),37DÈW<¶3ëÆ9ã=\tç ÒöÚÛÏÐnõ+x§’]&LcåÁ$–.@Ç]ǹº°¸)bp­Ò¿4>$—ÙnÍõøumõOW¦˜Bñ÷nšÞÝ–¿Ò5žÏmÊ^jT6þ["Ý”V¼pvžN}ºUѵî®f ¸7¼nHq6ð@# ´’pWÔ ¥?‡l^HUìKY*0Q#y‰)l§ƒÁn1É$ö™RÇNùçh:Ub“¨Ý“WÚ1üe¯W¶ŠËCãQÞ-§gÓD¯êÿ?Àµ¬i{š‘.—.‰Œ—+Ô¸;çòr¢eÞÓ`…_3–ã<óœõû•:ÅšZyþ\I‘Š\¡-¸Îr¼çç¥7O¶µO>ÞÝY"M‡Ù×q$þ9¯.¥YËÜ¿Ã~šZ÷ÑüöÛïfÞNŸ+{_§Ÿ¯žÃÆÞy®ÌÓ’ÓT/îù0ÝÓ‘úšsÙ(·ŽÐÎò²3;¶2ÀžpÎ*;í>ÌM<7æâ ×çŒgàŽp –Þk-.8¡‚Þy"‘ÂÆ¢]ÌåS¹²yÏ'<Šî£V½HGÙ6ÚéeÑ[{úéo;™NmÅr¶ûh»wý>fW‚õQ}u8W—Ë‹+‡ãžpHé÷p}9­K›†i¥ŠöhÙ›W\wã¡ãêj bêÎi&i ²¹"FîõÀÉ\.O ÙÇÈç‘\dž;„HÖºÄG&B¶Ä`Xcæ  ö¯¤Ër\FqRxŠtÓN«Í;+­õòÔ뎦.n­iø¯5Ü’ wA¾Õ^Õu;{y2úDl…† cåéïÞ¯M£Ãr¦ú; >L‚zv>Õ“g é ê2iíûÙÏ5ºÀ9À½sØÖ•ƒ_¤I ½»ÛCd òyÎ{ŸÎ½|Ë †ÃNØ:ŽÊÉóZþv²×µµ·sÓ©QEÞ„š¶Žöùÿ–Å ]K]·ÕTCN…‹9I HØŽë]º–WhnRÚY¤'¯AÓ¿J©¨Á W¸xÚFbQÈuÀã¾qÓOP¹/cv͵ÇPª¹úç¥yq¯•c*QÓeºþ¿c^p©Mrôº¾¿×ÈàNׯc7ÝÛÚ}˜ƒçA0b»²>f ¡sÐzÔZ›jш'šÝ£ƒ€¶¶Ã{nÇü´ÎÖüIÇ bº96òy_^:Uzâ(íU˜G·Né[îäŽG\sŒWylÏfZyZæ`>G™ÞB¼ó·Ìf=ø«P^=†„sŒÅ-Ûå÷®Œ6S((sVs³ÛT¯÷µm{_Ìòsoòìktã:Š‹»õ“WjI>®/KÅš¾ Ö…ÝÂÚé:”Ňhã ±€Áq×Õ¿ T:׊µ!©i?èp.J—¸ež,§1†!rTôÆAÉÍtÚFeçe<ˆbã§®*ž…§ø’ÆÆXð¶€$à’v†ãæÏ<M,l_5wNnÉs6ïÓmácì¥ÃÃQÂå\®¦<ÎNñ‹N-Jr¿y·Õ¶õºÕžgñ ÃPÓõd:•äwo0ùd‹œ*çvsêçµrõÕ|E½Óï5d’ÎiîŸ6I7?*±Iùz`ð3ï\­ApÚšÊè{Mù{[ðè|gGKR8'Nú4Ü–Êú½õ¿W»+Ú~ÝI§è¥Ú!²@ÊŒ$ÏÎ?õâÕëþfM3#m>Y@3Äóšø_iª¹moTåúi<$ úµúœNº…þò!$0ýÂ>€8$~«ƒÛEs}–Y%q†D€¾ÓÏ9ãu¬Ý6 $¶ž÷V‹zÇ÷U†ý@Ç_¥M/öL/Ðâ& „|4~H=¶Ž u…<ÔÃ^§¸¥d­¢Òöïå¥ô¿©ñÒ„#>XßM?ÿð.\K\Úݾ3áF!Ï\ó‘Á«7k§&›ö.d…&ùذ݆àÇn歙喆Œïà)˜眜cŒs\d0Köèã¸P]›æEewü9ïYáéOwV§/.©-öÿ5æe†ƒ®Ûœ­Ëª]K)Ƨå\,²Ú€Åm)ýèEÉ`G¹éǽijÍsio¾} Ý&î9æòá·¸Ú¥ž1Àë†Æ=søÕÉLQÍæ@‰'”w”nÝ’8ãýjmÁ‹Vµ6ÖÓ¬óZFÆÒeTñÔ}¹5\ÆòF‚+WŒ¶ #JÎ:wãŠò«â%^£œ•žÚi§OÀj<òæž’{­¾}õF?Œ¬tÛøîémZXHS#°ßŒöúesŸ^žžE·y"® ûÅŠŸÀW½éZ,?ku¸yg[—n‰rþcä÷ÜGå^?ñ*Ú /Ü%­™´Œ? ÉÇʧ¿Ö¿EàŒK«VXHIÙFë²Úúzí®Û­lv`*sNtSÙ'~ŸÕÏcð«7ü"v×*Ĭ0—‘N3&§óúg5¯bëq3Û •÷Ðà äóÏaÇçXÿ®f ÚI'–AQ†Éè=0jE¿Kt¹`“)0Û±¹ŽõÀÿ8àkFRÅU§­Ý¾ÿÐùêÔe9T¶é¿ëäH×O¦\hœÆ­€×n9ÚF?N¸æ£Õô”ºÔ于ÒÚW ¾^%u€IþÓŽ£rK;I-‘¤ÈX@˜îÂís»$ú}?ZÏž;Ëk{«]4=Ì)– ’ 'H`OÌÓ¿éeغôgÏFIIèï³M­ï§É!8¶¥gßoëþ kAº³´³ûÃ#$§&X‹žs’NñŒäcšµÅ’Û˵°]£ã,æ•Æî¤àœõùy¨´LjºuÃM·É “c†’p¤°9-Îy±Åg¶›{¬’µÕè¹–i HŠ$B1´n æ?™é^­z¸Jµ'©Æi«ÙÝ?ºûuÓNÝnHΤ¯+;÷êtòyx’|“òïu9Ç@÷?ãL2ÛG˯%Y²¼¨È'pÎ1Ïáï\óIwxí¦ëq;Gµ@܈ۉùz`(ÉäcìsÖK‹²Ô·E Ic k.?»É9û¤>ãûÖ4pXwY?uk8µ¥—Mnÿ®¹K Ëe9kåª{ll\ÝCu$š`ó$ 0/Ë´àáYé%½´¨&h”³íWl¹ ÊxÇ^3ÍSÖ¯tÔº[«;«yD°äî¹ 7•þ.øÏNÝfkë}»#†2„bÁYÁäa‚?ÕéeY"U#4œ`÷¾–{;ù_ú±ÓC ÜTlÔ_~û~} ­ÜÀ²iZ\3E¨Gi@O¼6‘Ï\Üô¯>¶Ó5]SU†ëX‚AnÄåí¤Æ>öÒH×ÝßÝØÙµ¼ nÒ>Ðñ‰¨ žF~œÕxoXKèîäÕìæPʲ®xç·¿>•û&EŠú–T¥;&”’zó4íÖîÚüžŒú\ªaš“K{7{¿ÇORûéºvž ÖSßLÇ£ÇvÎ#ï•è{Õ´—ú‘µò-¥‰¤ùw7’Isè*­=Úy¢ÎûÌåÆàÃvÞ‡*Àžzõ«+%²‰¦îa´ª@îNÞ¾ 8¯,KRiJúß¿¯©åßšÞÑ6üõ#¶šv´òıܹá’ç$g9è銳óAÝåD¥6²G–“ÜñÓ¡A ‘e± 3‘ó1l~‡Ú´4éæŠvŒÄ È@G#Óžkæ1cfáëÙÿÀ5­IY¸­7¶ß‡üÊa†úïQk;íbKt4ÑBtÏC–ô?J|VÚ,7Ì×v³ßÄÔ¤÷ ¥xù·).§ÛéV·[K,å™Wþ°ã#þRòýe¸O±‰®ÜçhEùz{§¯zú÷_R£…Òµ½Õnš¶Ö¿{Ø÷p9î>´ãK-ÂÂ3Nþå>gä½î}ôë{]»"ëB$²¶Ú|Vj£­¹Ú:瞧ס_|ô­IÛÉ–âO)º¡rTàçMsÒ]xŠ9Mœú Û,§‹—V$cŸ“ ½OZ»gyÌzÇÚ.âÇgû?bz&O§ñ³ŠU(Ï–õdµÑó7ç{Ú÷îÓ'0yÆ&§²Í1ªŸ*åjNW[û®Mÿä¶ÖÍô¼Ñ­n ¼Ô#ˆnÌ…T3Ž8Âägó§è-¨‹ä=´P6póL¨O^ŠH=G|~5¡F óÛ/Ù28Ky]#Nß*çŒÿ3XÂD-ojYÙ1‘8ã<žƒñ£ÙªÆmýöù%ú´y¸*xâcGFX—w¦±æÚÚE¹5¾Ü¯]KrZ<’ª]ê71Ù>BÉod“#v<—×ëWlßÂÚsb} Ýüβ^Ý4ª¸ôŒç°ôÍUkKûÝBåì HSe£9º™xÇÝS¸úñž ­ˆ¼1o ³jW¶ßjÍwqrFÏáå3œ| ôâ³ÅTŠ‚§Z£»Ú1i_n±j-üå®Èý ,És%YWJ–Œ¼Ô=¬»=$¥RÑüNÄî®lé>%»’U·}#Ìa·ªV3Á<«á×Ó¡ÉÉéUõk£©Ass.©µ½žÏ9m¥evæTRÝ¿ƒèkk[Ývä6Í\ž®¬Æ>ŸßbIè}pxâ­Z¶›ù©5ýíðælª‹èÛA ~ï\©èqŽ´¡•a¨IJ ßí»_¢¿G¥·[Xú aFtù)K™*•å5m=œbå­šj_¦œ®p^(K]RGÒd„Û9cG‘ö`¬ê ÉɬªÙñU๾0$sG'ä‰þ`*îØü5_Ñ9RkE;ü1ßW²ßÌùºñQ«$­¿Ee~¶ZÛ[è´í¥‚½ËÁöpÿÂ-i=È—dŠQBCÌO5á d׸ø"âÙ<%l«+­â#<*¯ÉmÇ·¡æ¿0ñrrŽ £ÖOoDxù¿7ÕÓ÷[|Í~’Õ`ò¥!7Ú¤îþèïÅbX«A"쉟º¬Ùþ}k§’ycÒf'Èyd„¼HÈÛŸÖ¨XZÏeŽx"W]Á‹€sÔZü‡.Ÿ%ßá¿^½ÿ¯‘áÐĸÑpvÿ2· r„-´S)#¡$úõÑé,$’ܼw/3•ó"M¬ƒdsÖ²¡…涊塹Îw |¿CÐã­uZlg’6±ˆ«Yž<å±òçÅ*à ôÏô¯–¯WÛÍ»íß¾šzØÆ–¤Üª9꿦ž¶ªj £^=ôvåšUI`MŒ§c÷‰íz,"–å¼É-î,ã JįŽpWœdŽÇ¯sø3Äs•D÷6í÷FhƒoP@=€ëžsŸjÂ×5H/ô›ëëH^ÊêÒ•'”bWPÀqžƒqÇÐ÷Î*ð”=¼£®Ò¾ºj’û¼®Ïf':qijôoîK²û¯cº]VÖÓMK)¥mò–pDLY°üž8b?^+ñNòO4XÁÍž‘ Ï?JÓÓ|Q«¦›)½¾·-Fà™0bÁ—;ˆ$äŽ9É®sÅ7¬Ïpð²+0ÜL ç€==«ôÁUËsjžÒÒ²i´ôwié¢ém5+/À¬<ªTßu§{§Ùt±é¿µ;» XɺîZÕ1ÉÜ °ÜÈ'^ØÎ/‰/ßA–B/šÂRFÄŠÝ][çyQž ðOZ£áŸZ¶’êÊÛìÓqþ®2Ñd–Q“’{u9äãÞ².+ˬ/-ãÔ…Íéµ–ÙÂOŽÜàZíìÝ9â¼ì߇ç‡ÂÁa©»Æ:¸Å¶Ûz­zzÛºÐñ1¸z”b£B-[µþ^ÕŒ¿øDíîtd“’ûåiGà­òþ`ûb­]²Ã%ÅŒ‘Ç2L¨ÙUvÉà›?¥;SÖìí¾UI!ع-۰ɬ”:¾±zðÞœ©Ïu ßÓ²çÛ¿¨¯™LMhóו º·eºzu~Šæ™^/Š3)JTdãNiÁÙF=bÖ©(Âö½›WêÕË÷v¶ y¯¦1úÖUž±w¨êÐYéÖm)ºÝäHà¬mµrß79èzTÖÚ^¦’×÷1çÍ#(å¸1ž8ä.1žk{íW6*dkù¡Nå$1¨üüª¹èSN0\ò}]Ò¿¦ïçËéÔÉà2LªqŽ*³¯;«ÆŸÃk«®vÕÛÕ{©®¼ßd£ý“u0›Ï½køÓ]µŒ±&zôs!Ç^±ÏÖ~¥zŸÙ#N·ÓôõŠ_¼ÑÄTŒ0n>b:çµC«ër$»°¶žø>ßßJßë1ÇÊXüøç8Î1Î*m)a‰&7ö±ß<˜òÄÀ\g? ŽßÅÎ3íZ%ˆ·5w¥þ§Þ“Jþ¶oÌö#™Nšt Ö„”®­yN2NÊÉ9´ö÷¤â»®¶´ÔiåÉ·Ž[d?¼’BD+×`W<ŽÇ¯_Jµ¥Eì°¿ˆg¼ÔBgr^]Æ‹s¨ï†ÏÉãª^ê‹_µ4“OÝÃn>ûUzqÉÀ­m+J¿ÙpúŒäZÎKk ¿š$Û¹ùK÷ÍN"Jœäùo¶÷~~jËdÙêð†xªÊm¨Á·:µ[z&½×î$šÛß”o))^Äw:Üú…æŸ>‘²[o3çXU–=ÃxœIœ€mÏ~µýÞ›e~ž$ñÀ¼º—?»‡tj¸?v™ ðFw7lJ—JÕnµ#u¦ÛÚ,¬ÛA1¿V÷-»¼T3Ig§\ØG6 5=I<ÏžÙFÄÈÏ˘å'*yÛé϶P§R5½Š*¶ÉûÒM7¬­î®ýÿ½¹÷\Nå«1U\ªÔšju#«©sB“—/Ãvœomo%Ëʼ×]¸ŽëU¸¸H|ûH_´ùøùGü´ÉÏôéÚ¨ÕÍje¸Ôæ&’e}¸y%21ÂËR!ýjG`áìðôákY%÷#ãkËž¬¥{Ý·}5»ßK-|•» Ÿxf½ƒá½ô¶V–Òm·³l$ž€O¿§ç^A%ÀéZ¯³ÓídÓ÷IlŒ¾dS ,Ç-¸ u¯Ì¼O„ëÓÃЊMKžú­KïÖÇ.7S„’Œn“×nÏ»]NîúÓ3”Ž HrdRB.x ¿_Z³¥ØD&K¤s†ÜŠ]‡Lõqßõ¬½WÅšu±žÁtÛËmGdAQªäÝåy׌óÒ«Úx«í_`¹y QÉYȉŽz`瞟¨¯ÇpØ\Ul*ŠŽk½ãmÕ¯§ÎÛú¿Žx,l©s¨YzßKo×ó:›yuk‰<¤p 9hÑTŽüõ÷­K‹ˆ(&’"$™~sÈ\óAï\îÏZ[ý–H+Ë–‘°sü]8=«oOšä\~öE” nÂóßž=ëæs,#riÅ._—åu®žw<šÐp–©+|¿+®Âø†=B- vÓ¡ó~c½Sœ”áŽ~½³\Öqòý«Pkˆ!ˆMÊ$.7Nê+­Žä½À²ò™ÄŽ•\Äç'Ôtô5•5½¯Ÿ+þéWr¢ #=‰Çjù—(Io­úö:ð5ùiºs]o~¶y洨﵉ ݉/eÙå«Lç^ð8Ý3Úµ^ÆçÔlí-c˜µ²³˸ ‚r2 Ú«\¥°ø‡n<-:+"Û¸1¼¸;ߌ*–íÜç•yâ]OG¹¿´XâS{*È­ ;Ð'ŒÀ=p=3_U…ËkfUã;ÖPM&ìôzôÙ%“ÖçÓÕ­V½vá³Qvz5¯åm­¾¦î…¦¹ÒæŠûNSw &(£<ÍøË1Éì£ØÓ׎øƒu4úÓM=¼0nÉQ›•€8ê>•Ûé±^øƒÃwM¨ê`\¼`‹•RŒv¾JàFÛÏnØëç>.±º²»K{¸¤ŽT_™X®àIÏcÓœŒ×ñ¯¦áCûJj¤—´WM+öZ«ÛFü®ºîŽlhV©QEê›Óî½¼¯å~çqðÒi†šÞyyôù$1¼;@‡ @é€ <`žAé[piÚU¤×?o–ˆmãXTI‚6äNÑÏ'oã\ï™Lš-Í¡”.$;#+¸’W9ã:ú‘]¦½áË]I$1‡’SE7—$œ€CÁèHÎ}+泜G°ÌëÒ›´\º.—OÓ×þË:”á]ÆrqO²þ¿¯BM/PÐôLB‰$™ån1³›Ûo#<=G¯;:.©©’Z@ðC¶$a‘ ÜWƒè1Ö°toèÑÛ”žÒT¹MÉ(k–pQ·p#ŽzWI<éÚs6ÕÕ8PIPXÆFOÌOZ嬨U»‚nMîö·N¯úÙwñ1’ÃÊMG™ÉËwk[ï/˽ RKƒ"? £ŒíÝŒõõý*½ûijÁ Jʲœ„FÃönqÓÆ²_SÖQ-ÒóEdÁe•W%Ög¶¸–[»½>‘8åØðÀêyã9ê+³,Ê'‹«R{­-¯—DÞ›´•Ìè`*T¨’km,Óüޛĝ%½ßŸ=ÍÛ‚àùvöåœü£8ÇÊ3î9ªm%µô:œwv–åd* ±²;®6‘÷¶çŽ8ïÞ¸‰~!˪OpÙÉmåci9AŽ 21ù†W×¹õ®ÓKÕ&Õ­›ìs4ZŠ3lŠ6É´±þƒü?P}+·ãrW8¨¥¥ž©Úû^×·›éécЭ—b0t êÅ-,öÛås¡’h®LsC##ÆpÅínüö5‰¨iöWìN£hla•ÁYħË<·Êq߀já´?iºI¸´Õ¬¥Y˳Àå9$ç=ÀÅgÙë–Ój¢ mRWÓÛih¯bÛåàg‚»²7g°¯z— cp—µŒ¡ËnY$äŸ][^—Ó¦v†K‰¤äãt–ÎÝ7ÒÍýÌŸSŽjò.&<ǵ6àŽ>ðoïzU½3Ä¿õ‚úÆ•9$ù’C»×ÓŸAÒ«kŸö‡‡vÜh¨V‰¢,ÌrW8Ï^£üŠË²°™eTÔ4ÒŠÜÐÁÁ#ƒôï_ƒÎpn’Ž.rŽ!{­ÆI7o+ký+ŸKK,¡ŠÃ:ø§%5£qjîÝtzz3 Ö<1ðûXÝ&ƒ®y37HD"`MqZ—€üQ§åŸJi£ìѲÈäMwº†<;5œŸÚñ¹\d2²ìäÿzñÔÒ§ƒ´‡}Þñ-Ź#8‚è0†sëùׯ„ãa³©9Yuœû¥ÿ¶³Æ¥˜G RT¡ZRŠë8ßñM?ÁžQ6ªÆ{¤^'ý°`?•ji¾ñ.§›NÓÂw)*ñ×®O z’iÿ4å+câ+{ØÇðθ'þsßµBÞ)ñn•'›¨øJÖF=f´À'ñ½Gë^§úßR¼?Ù}œ¥Óßý%Èÿ3iæøºŠØog'þ'ùK—ó?ÿÙpygame-1.9.1release/docs/tut/camera/green.jpg0000644000175000017500000002375311206577570021065 0ustar vincentvincentÿØÿàJFIFÿÛC  !"$"$ÿÛCÿÀð@"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?è袊þy?•Š* > m¬Ò ïn/d\æyÂ|’yª¼tàž¼Ó¶—¸ì­{“ÑE„A§ÚEcf–°=ÃÆ™Ážw™ÎI<»’ǯsÇN•=SmÉÝî9IɹIݰ¢Š)(¢Š(¢Š(¢Š(¢Š(ªšÎ¥i¤iwûÈ–¶é¾WHžB«Üí@NRqÀÉ<_%øÿâ7‰ç´p’ž .U'x·µöjþjÖô¶í#ƨ¢Šý4ýˆ(¢Š(¢ºß|;ñW‹¶Ë¦Øy6G?é·DÇñt8%ùR¿(88Î+F&–¥i(¥Õœø¬] %7V¼Ôbº·c’®óÃÿüw¬yý‘ýŸo6ïß_H"ÙŒýäæA’0>^àôæ½§Á|+ m¸Ô“ûvôg續Wï"äûŹPF+Òëá3N6Q|˜9/É]~?qù¦uâ"Œ½ž[÷”“ÿÉUÓûþãäŠ_&ð¾×:¤w³_¤†DŽ« L€Äå†_®§NxáëÚj_[^jú†íg¸2iû¥¼‘÷T1ÿ¼Áwã€ø%€ñjú¬‹ˆÄà)ÕÄüR»í¥Ý¿ |µ>Û†±X¬^YJ¾/ã•ÞÖÒîÚ$ºZÞZ…Q^¹î…Q@Q@Q@Q@xT…•ž£föz…¥½Ý´˜ß ñ‡FÁeOøTôWóÒn.ësùV2qjQvhƒO²³Ó¬ÒÏO´·´¶;!‚0ˆ¹$œ(àd’žŠ(mÉÝî““r“»aERQEQEQEQEQEQEQEËkÿü®Ü}§Rðõ£M½Ý¤‡t #1Ë1•.r3–ÏSêkŽÿ…àïú kß÷þ/þ5^µEzT3œ~<´ëI.×ÿ=_ ŸæxXòR¯$»^ëå}¾G‡ê³Õ›Þ;iþ(¸·¶8ÙöbW 僨<çøGãÖŸ¥~Ïzlw Ú¯‰nî¡ØB¥µ²ÀÁ²9,ÅÁÏî9ãŸm¢»_f®<¾Ûðþû\ôçnžÝÛÒ7ûíÄàü?ðÀš?ÿÙÚîýõô†]ùÏÞN#8åì^k¼¢Šò18ºø©sV›“ówû»/‰ÆËŸQÍù¶íéÛäQ^CûLø¢?Ã)áu†9¦ÕS{°œ·Xå””Á$1 Èû§®+\»<~&xo'÷.¯¦Ë_=òœ¶¦gŒ§…§¼žý—WºÙkkë¶çƒøçÄ3x«ÅwúüöñÛ=Ó©!$"ª„Q“ÔíQ“ÆNx+Š+÷ZT¡F§d•—¢?¥hÑ… q¥MZ1I%Ù-QE¡¨QEQEQEQE÷…Q_Ï'ò QEQEQEQEQEQEQEQEQEQEQEQEA¨^ÙéÖoy¨]ÛÚ[GóO D\Xð2H4œ–ãŒ\šŒUÛ)ø§\°ðÞw­êm µµ@Ï宿bHUP=K9Àç’5ñ¯ŠuËÿk÷zަћ«§ þZíUUÐ(œž9$ó]§Ç/kbÃN¹ŽmÍÃÛÓ¤é£ìº›w$ &—ç9laÔ‘´Ž9¬_‰Ÿußæá¤µÓ#pööÃ,M°)%‚©rHb tÜ@êsÇWê\?ÂðÁ%_“©Ñn£ÿϧNçí-Á”òô±8Ä¥Wt·Qÿ9.û.Š(¯±>ü(«}•æ£x–z}¥ÅÝ̙٠—vÀ$áG'øW¸x àNbšˆ’%û<WÆÌ¬Ì%1¹IR6’¹;‡ÍÌsl.]jò³èº¿Dy¶y‚ÊióâggÑ-ߢ<§Àþ Öüc~mtˆ£ØŽiå$G dv]ûA -†qŒàdWÒ^øWá_i m{¦Xk7­Ÿ:îêÔ6ÿ™Šá°LåÆp ®×O²³Ó¬ÒÏO´·´¶;!‚0ˆ¹$œ(àd’ó‹Ÿ-<$òiDqÞëˆê%I£qº•VË7¬0ñÉ$cóÌ^u˜gÕÖœcÙ?ÆO·á¶îÇåXî!Íx›°˜¸Ç{'Û¬¥ÛËkÛwcÍ>9x[À~qˆ÷Ú³¸cŽñ+EURK«&X0 ç$ç)òš±¨^Þj7y¨]Ü]ÜÉóO!wlXòp…W¯Ò2ü5L64êÍÎKvÏÖò¬\4«Tu$·“êÿËþêQEvžˆQEQEQEQEW[ðËÀºŽ5w¶¶“ìÖPcíwxWòw+”ù )l”Ç:š©ðëÂóxÇÅvúSIl’#¼· ”Bª¤å†G¶®I°úW×þÑôíHƒIÒmþÍeï.=ìûw1cËO$žµòœKÄ?Ù°ö4‹%òŠïæû/›ìþ'‹ø©eú¾ZÒWòŠïæû/›ÒÉߢŠ+òC𠢊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šó‹Ÿl<’išyŽï^(®±2oŠYÖᔂT±dô'Œõ`ðU±µ•1»Õß‘Ù—åøŒÂº¡‡äÿ7Ùy’|]ø™gàÛ3g§µ½Þ·'Ü„é ç(p˹•õÇ¥|Ëâ]Wñ&¨Úž·}%åÑ@›Ø £ UPާI=Iªš…íæ£x÷š…ÝÅÝ̘ß4òvÀe'øUzýƒ%Ȩet••çÖ]}eý3÷Îá¼6MEr¥*y[_EÙyuêQVôÝ/RÔŸËÓ´ë»×.m¼-!ÜU˜”v£œz+ƽ©IE^NÈúÎ04‘R½À?üIâdwoa½ÐÉ:³£ ‚®›Hr½r3^¯ðãàÞƒ¢YÅuâ+[}[Vçxw2[',Ô*»²¥s¼‘ŠôéÌÊ€ÁnûÔîTmÜ7€y ’rÈÎGÀgefé`wþgú/ÕýÝO˳ï,Ý ·}¹Þßöêý_ÝÔç¼àÂÚ}¬6V6íwQ¬·[id@ãÍÁ'k6Asµ¶çÒÑ^5ñs㮚’hþ¹Žêù‘Yµ]$йNÕ2ÈJäË‘É ñ¸l.37ÄÚ7”žíì¼Ûè¿á’>‚Ì3ì_,/9½ÛÙy·ÑÃ%ÐÓøÉñRÛÂñ\hz#yºÿ ìÑ–”0s‘‡b` ŽíÓk|Ës<×7\ÜÍ$ÓJåä’F,ÎÄä’O$“Îj:+õÌ£&¡•Ñ䧬žï«ÿ%Ù~oS÷\‡ Ãd´=-dþ)=ÛýeÓÍêQ]ÇÂ?µ¶YÞDÓ-]Võ¡‘VT¥wÝ©ù‡HïÅb©a(ʵWhÇëò=!›Å^+¿×ç·ŽÙîH‰ !T"Œž§jŒž2sÀé^&IžUÍjÔq¥ËN;;õíëm]žžwLùÎâJÙÝj®4yiGi7«}šÚöÕÙûº-n™‹EWÑŸZV¾Ÿáê6iy§ø{W»¶“;&‚ÊGFÁ á€ÁÁ~CP²¼Ó¯ÏP´¸´¹áž2޹Œ©ädÎ5©ÊN1’mt¹”+ÒœÜ#$Úé}JôQEhjQ_Güø[“gmâM~+„ÕŸlÖðx^ÏÆ«üÛÔ®U‡©Eyy¶mC+¡íjêÞË«åÝþ¶OÆÏ3Ì6M†öÕµoD–íÿ—wÓÖÉõ¿¼‚¼8 ž;s«\ÇôðJî’íw1à61…lpãÖ»J(¯Å1Xš˜ªÒ­UÞRw×e²ìçlf2¶6¼ñå'wýv[%ÑhQE`sQ@Q@Q@Q@Q@Q@wÅÏ'ƒ<)%ôÚNWT²·¸ ÂS¹wð¤$ç ´wü‘¨^Þj7y¨]Ü]ÜÉóO!wlXòp…};ûCøVOø1/l­®.u-6PÐEM#È’2« U?î¶pq³¶I¯–«õ> ¥‡X'RmKô^–×ÖýÚ¼;¡…Y|ªÓþ#mKºì—•µõ¿`¢¬iöWšâYéö—w2gd0F]Û“…œOá_Cü8ø#g£^E©øšêßS¹8³HƒÛr~më™8*G ‚;×½šg8l²Õž¯eÕÿ—«>›:Ïðy=>jò÷žÑ[¿òõzQðßᦷã'[…Xi›öµä’+'Ì€•Ñ„8l‚㎸ú{Â>Ñ<+`Öz-”p#»3¾Ðdp]™UŸ`»Š®âHÏZÚ¢¿+Î8ƒšJÒ÷aÒ+õ}_ô‘ø¦Å8Ìæ\²÷i­¢¿6ú¿ÁtH(¢¸ïŠÞ9´ðF€×Ë—S¸Fò+í•PÄ•C†Á#8À=Ç‘†ÃUÅUJò–ß×çÙ [^4(Fò“²_×E»}§-ñïâ?ü#Öoá½ãµÌGΞ°öJJ‘ÆÓó:–Æeứ¯šjÆ¡{y¨Þ=æ¡wqws&7Í<…ݰcÉÀ~^¿jɲšY^R†²zÉ÷äº/Õ³ú‡ò:96Q†²zÉ÷ä¶Kõm²Š+{ÁÖ|_«®¤Ãëæ\H¯äÃò³ ìªvçiÔ×¥Z´(ÁÔ¨ì–ìõë×§‡§*µeh­[aà ë>/Õ×NÒaõó.$WòaùY†öU;s´êkëÿ hvÑ!ÑôÅ‘,ày%vÜT<ŒûsÔ€Xœœ’O5SÁѼ!¤.¤Ãëæ\H©çMó3 ìª7cqÐW~Ѿ>—x?H¹“ÉÊj$mÌ n[%F |¼Œ׿xÌ]~&ÆÇ CÝ¥oÿ·?>‰yï«?Çã±ù].%Œ3w;Q€ÉêN99'’k±¢¶¡‰­‡nTfâßf×äta±˜Œ$œ¨Tpo¬[_‘“á h>³6º™oe}ò€—“‘¹ÎY±¸ã$ã8VµTT©:²s›m¾¯VgVµJÓu*IÊOvÝÛù…Tw3Ãmo%ÍÌÑà H^I$`ªŠI$ðæ¡+»#4›vDΧa£éwž§u­ºo–W<(þd“€ä’ä×Ç>ñ=ç‹üOs­Þ'•æa!€HYaFA?‰8À,XàgÖükø“'‹µìÝ[ˆtK}Ë÷Ù>Ør§{¦q´A“‚p<Ò¿Wá\‰à)¼EuûÉtì»z¾¿wsöþ á©e”ž+­Vkoå]½_^Ú.áE½à ë>/Õ×NÒaõó.$WòaùY†öU;s´êkêëV…:•’ÝŸo^½<=9U«+EjÛ/ü2ð.£ã]í­¤û5”û]ÞüÊå>BÊ[%1ÇN¦¾­ðdž´ Ù›] L·²¾ù@KÉ‚HÜç,ØÜq’qœ(ð¯‡t¯ éúf—ÈàˆEæ¿Í$€37ÌÝþgvÇ@XàÅkWãÙþW3ªãÕ5²ïæû¿Ë§Vÿâ~'­œVqƒq¢¶9w}»tÖíñ<]ÿƒ..m/-áÕ®1ŠH»Ë6ὂÿ²¤œŸ—;AÎ@?!×qñ›ÆãÊÖ·RM£Z9]=^B ªn›ˆfLÜŽ"¸zý†r¯ìüç^üõ~]—É~-ŸªðvHò¬½{EûÉûÒòí–ËuѶQ]çÁ¿Âs«Ü}¦çÈÓl¶ý¯Ë}³êû6eY~òsœqÒ½¬^*–Œ«UvŒO ÇchàpòÄWvŒwþ¼Þ‡kû5ø"Y/Æz„wdzY%B“dK»—–ãwñïõ´Û[Çmm pÃŽ8Ô*¢€©+ñ<Û3©™b¥^ztK²è¿ÏÎçó¶yœUÍñ’ÄÔVè—d¶_«óomž?j½RÚç\Ñô¨f·’[(¥y•$%ã2lÀaŒ/ù‰9ä´·‹Wyû@É\ÖÿíßÿI㮿]È(F†[F1þTÿð-_âÏÝøc >Q‡„zÅ?ü Þ‹ ï> x?þÏGöÝ;íš-®~ßûï/nèäòú0c—Q÷}9â¸:ú§ösÓ,->XßÛZÇÕûÊ÷RóJRWEÉô 89'©9æâlÆX ¥Š^ê}®ž¿rvó±ÇÆ9´ò̲S§ñMò§ÚéëºwI;>ö=Š(¯ÆOçШ'‚Y/-çKÛˆc‹vø!I²07¥†:¥}ò8©è¦‡8» ¢Š)(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+æßŽß_\¸¸ðƇ4gHö\O+­ác+•êÃ*Ä7^˜®Óã·ÄÔÐíî<1¡Í ÕäM—ÆÌfFÊá‹£0ʰ+×®+æÚý„r ±¸˜ÿ?ý*ßúOßÙŸªð/ m˜âáþÿô«é7ÿò°¢Š±§Ù^j7‰g§Ú\]ÜÉÁwlNrp?…~„ÚŠ»ØýVRQNRvHŸÃú>£¯êði:M¿ÚogÝåǽSvÕ,ybàÖ¾¼øàÍ+ÁºkZiëæJùYnv¼¨$‘㎠(®ì àt™ðƒÀ‰à–wõ;¤U½hdf‰ÊI)F]ÀvÈè>QÇR{Šü›‰¸ãê:_î£ÿ“>þ—Íô·áÜaÅ2Í*¼6ÚŒ_þû¿%Ñ|ßDŠñïÚ/ÇvÚv‘?„,_̾¾‹OåZÕ7! À|ÅÜ ä|§$Ã=§ÅOÛx+Ãßî·“Q—ä±¶‘ˆó_#'ªãÓ°È,+ä}gS¿Ö5KOSº’êòá÷Ë+žXÿ Àpp+£„²7Šª±u—¹§›_¢üôîtð7 ¼eeŽ®¿wîùÉ~‹ñzkª*QEú‘ûI¯àýóÅ#µÐ´ùm⹹߱§bmFs’=ö¯²¼?£éÚ‘“¤ÛýšÊ Þ\{ÙöîbÇ–$žI=k–ø;àDð>,W/º­Ûî¼–)£!Kyj™)Éã9cÉÇq_ñ>yý£_ÙÒ»†Þo¿è¼µëcð~2â?ílJ£Eþêyÿ7è¼®úØ*‡ˆ5;@Ò'Õµk³YA·Ì“c>ÝÌp “É¥_¯4ý£u:ËáÕÞ“sqåÞê;>ÉÆ>g—4Lü€sÉí^]…úÞ. ;I¤í½º¿’Ôù̧õìu,5¥$·µõ}vW~[³æŸkŽ¿«Ï«j×i½Ÿo™&ÅMÛT(á@€J¡EûÄ!EF*ÉléŠtáN VKD–ÉvA_eü/·ŠÓÀºu¼uÆù¸¶žÙàtÌ®yG’F\õåÎsžÀùÿö{ðŸü$>.:Ì6:n™ÿv÷K¿Ìó#‘S T©Ã.yÆ8ÆkêZüçóÎpÁÇxêý^ÊÝí¯Ìü›ÄlÖ*C ãï=zµ¢·{kèŠ(¯?0 Ô –æÍà‚öâÊFÆ'€!tÁ€êËÏNAëëÍOE磊Ìí`¢Š)(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š*;™’ÞÞIä °Ž6v ðª cì'µIE }AZúŸ ÜÏ5ÍÄ—73I4Ò¹y$‘‹3±9$“É$󚎺oˆž Õ|®?P_6ÞLµ¥Ú®tÇ£ Œ¯l÷ƒ§Ù^j7‰g§Ú\]ÜÉÁwlNrp?…~ÿGF­Vœ“ƒW¿K_qýE‡ÅP¯AW¥$àÕÓéoÒ߀iöWšâYéö—w2gd0F]Û“…œOá_G|ø[ÿß—¯ëñÄëŸ&ßñçþ±æG+&ô`y}kOáÃ(|}¨µ¥æ«*(Þ±‡ìPLNÊG@F*y €=¿7â>(–'› …~çWÕ÷KËóôßò>-ã9bù°x'j{9u—t»G¿GfQEx—í%ã›Hô¹¼cåÍu3¡Ô +ƒn«²T À [ ä€#$òùf_W0ÄÆ…>»¾Ë«ù~/N§ÆdùUl× 5.»½ìº·éê®ì·g˜ü]ñ¼¾5ñž .“oÿ0O#ŹI’¹ÎYsÉ?‡J⨢¿pÂá©áhÆ%hÅY]Þï»?£ðx:8*ÃÑVŒU—õÝîßW¨WѾÝhÿ 'ˆ¬cŠù‘_OC#‰mYüÄárÊËÁÉöœŠóÿ‚_çñN¯§«XnÐ!Ϙ&2Åöœ¬Š<¦P7mu¾a~•õ-|7缉àh=þ'úŸ–ÏÍøó‰]4òì4µkßk§÷o~¿iviuh(¢Šüäü”+çOÚ›\°¾×ôÍÙ¤k­1$k¬®L¢6U¹Ú¹=¾aÎrÑuñ¯Å=[ûs⹨‡·’6»h¢xQã÷hÀäç*ªr89ãŠúþ Âû\{ªþÂ{Óò¹÷¾`•|Í×{S‹kÕéù6s4QZþÐ/Vß'É’TûÙ;³œô÷¯Z¨4û+=:Í,ôûK{Khó²#‹’IÂŽI'ñ©ëðœË,v*¦"_iþ%òVGóNo˜K2ÆÕÅKí=<–ÉiÙYQ\GœQPO{g彜÷vñ\ÜîûËn‘oÆq g?™«ôU)É'ôe*“Œ\SÑïæQEI!_ ÜÏ5ÍÄ—73I4Ò¹y$‘‹3±9$“É$óšû²¼kâgÁ8u‹ÿí? Mi§M+5¤ª#¶U1ˆÓ*r¹ ƒ’ÄäcëøG6Ã`*ÔŽ!ÙNÖ}­ÎçÞp&y„Ë+U†)ò©ÚÏ¢µô~·ü+©øgà«ÿëÿÙöÍ%½¬h^êðE½`;r22Y†Îzž€ÖÞŸðcâÍâA>•oeg3ÏwDÀ'…›žœ×Óšúá÷ƒ4¯é ib¾eËD‰utWk\g`Hpd`:»A'h¯«Ï8›…õ…š•Gµ¬Òó}=~–>߉8Ç ‚¸àê)Õ–ÖjIy¾št]úXÖðþ§hDN“oök(7yqïgÛ¹‹X’y$õ«ôQ_“Îrœœ¤îÞìü:¥IÔ›œÝÛÕ·»}ØQE$j?lþϹþÎû?Û|¦û?ŸŸ/ÌÁÛ¿íÎ3Žq_ WÞç?ø?á¿\M¨Z¼šF§3—’xW|r±+’ñ’p*W%‰;«ë8[;Ã峜+­'mWK_~¶×§Ü}Ïq(©Rž%5ÛÞZÚ×Ýomz_Ó]>V¯ ÿeÿ <]߉ïì­]:®+*´±„óFSŒ $íê Úr1ŒØÐ>h–·nµ­ÝêH®Œ‘C·Rù•ùbAà|¥Hçžxöh!¶·ŽÚÚá†$ q¨UE81^Ÿq= Vá°ŽüÛ»5¦öW³×¯—©ìqwa±˜GƒÀ¶Ô¾)Y­7²½ž¯+­nIEWÀ—Q@¡w›ÝN—c"g9 pˆ ½‡zTôìí~ƒåvæ¶ERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETw3%½¼“È$)alì@áTÇØOj’Šú‚µõ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ‚ H¡¼¸ºG¸2\mÞwtFÔ$ª{í=NMOE4Úº]F¤Òi=ÏÿÙpygame-1.9.1release/docs/tut/camera/CameraIntro.html0000644000175000017500000002360511206577570022351 0ustar vincentvincent Pygame Tutorials - Camera Module Introduction

    Pygame Tutorials
    Camera Module Introduction

    by Nirav Patel
    nrp@eclecti.cc

    Revision 1.0, May 25th, 2009



    Pygame 1.9 comes with support for interfacing cameras, allowing you to capture still images, watch live streams, and do some simple computer vision. This tutorial will cover all of those use cases, providing code samples you can base your app or game on. You can refer to the reference documentation for the full API.

    Note: As of Pygame 1.9, the camera module offers native support for cameras that use v4l2 on Linux. There is support for other platforms via Videocapture or OpenCV, but this guide will focus on the native module. Most of the code will be valid for other platforms, but certain things like controls will not work. The module is also marked as EXPERIMENTAL, meaning the API could change in subsequent versions.

    Import and Init

        import pygame
        import pygame.camera
        from pygame.locals import *
    
        pygame.init()
        pygame.camera.init()
    
    As the camera module is optional, it needs to be imported and initialized manually as shown above.

    Capturing a Single Image

    Now we will go over the simplest case of opening a camera and capturing a frame as a surface. In the below example, we assume that there is a camera at /dev/video0 on the computer, and initialize it with a size of 640 by 480. The surface called image is whatever the camera was seeing when get_image() was called.
        cam = pygame.camera.Camera("/dev/video0",(640,480))
        cam.start()
        image = cam.get_image()
    

    Listing Connected Cameras

    You may be wondering, what if we don't know the exact path of the camera? We can ask the module to provide a list of cameras attached to the computer and initialize the first camera in the list.
        camlist = pygame.camera.list_cameras()
        if camlist:
            cam = pygame.caemra.Camera(camlist[0],(640,480))
    

    Using Camera Controls

    Most cameras support controls like flipping the image and changing brightness. set_controls() and get_controls() can be used at any point after using start().
        cam.set_controls(hflip = True, vflip = False)
        print camera.get_controls()
    

    Capturing a Live Stream

    The rest of this tutorial will be based around capturing a live stream of images. For this, we will be using the class below. As described, it will simply blit a constant stream of camera frames to the screen, effectively showing live video. It is basically what you would expect, looping get_image(), blitting to the display surface, and flipping it. For performance reasons, we will be supplying the camera with the same surface to use each time.
    class Capture(object):
        def __init__(self):
            self.size = (640,480)
            # create a display surface. standard pygame stuff
            self.display = pygame.display.set_mode(self.size, 0)
            
            # this is the same as what we saw before
            self.clist = pygame.camera.list_cameras()
            if not self.clist:
                raise ValueError("Sorry, no cameras detected.")
            self.cam = pygame.camera.Camera(self.clist[0], self.size)
            self.cam.start()
    
            # create a surface to capture to.  for performance purposes
            # bit depth is the same as that of the display surface.
            self.snapshot = pygame.surface.Surface(self.size, 0, self.display)
    
        def get_and_flip(self):
            # if you don't want to tie the framerate to the camera, you can check 
            # if the camera has an image ready.  note that while this works
            # on most cameras, some will never return true.
            if self.cam.query_image():
                self.snapshot = self.cam.get_image(self.snapshot)
    
            # blit it to the display surface.  simple!
            self.display.blit(self.snapshot, (0,0))
            pygame.display.flip()
    
        def main(self):
            going = True
            while going:
                events = pygame.event.get()
                for e in events:
                    if e.type == QUIT or (e.type == KEYDOWN and e.key == K_ESCAPE):
                        # close the camera safely
                        self.cam.stop()
                        going = False
    
                self.get_and_flip()
    
    Since get_image() is a blocking call that could take quite a bit of time on a slow camera, this example uses query_image() to see if the camera is ready. This allows you to separate the framerate of your game from that of your camera. It is also possible to have the camera capturing images in a separate thread, for approximately the same performance gain, if you find that your camera does not support the query_image() function correctly.

    Basic Computer Vision

    By using the camera, transform, and mask modules, pygame can do some basic computer vision.

    Colorspaces

    When initializing a camera, colorspace is an optional parameter, with 'RGB', 'YUV', and 'HSV' as the possible choices. YUV and HSV are both generally more useful for computer vision than RGB, and allow you to more easily threshold by color, something we will look at later in the tutorial.
        self.cam = pygame.camera.Camera(self.clist[0], self.size, "RGB")
        
        self.cam = pygame.camera.Camera(self.clist[0], self.size, "YUV")
        
        self.cam = pygame.camera.Camera(self.clist[0], self.size, "HSV")
        
    

    Thresholding

    Using the threshold() function from the transform module, one can do simple green screen like effects, or isolate specifically colored objects in a scene. In the below example, we threshold out just the green tree and make the rest of the image black. Check the reference documentation for details on the threshold function.
        self.thresholded = pygame.surface.Surface(self.size, 0, self.display)
        self.snapshot = self.cam.get_image(self.snapshot)
        pygame.transform.threshold(self.thresholded,self.snapshot,(0,255,0),(90,170,170),(0,0,0),2)
        
    
    Of course, this is only useful if you already know the exact color of the object you are looking for. To get around this and make thresholding usable in the real world, we need to add a calibration stage where we identify the color of an object and use it to threshold against. We will be using the average_color() function of the transform module to do this. Below is an example calibration function that you could loop until an event like a key press, and an image of what it would look like. The color inside the box will be the one that is used for the threshold. Note that we are using the HSV colorspace in the below images.
        def calibrate(self):
            # capture the image
            self.snapshot = self.cam.get_image(self.snapshot)
            # blit it to the display surface
            self.display.blit(self.snapshot, (0,0))
            # make a rect in the middle of the screen
            crect = pygame.draw.rect(self.display, (255,0,0), (145,105,30,30), 4)
            # get the average color of the area inside the rect
            self.ccolor = pygame.transform.average_color(self.snapshot, crect)
            # fill the upper left corner with that color
            self.display.fill(self.ccolor, (0,0,50,50))
            pygame.display.flip()
        
        pygame.transform.threshold(self.thresholded,self.snapshot,self.ccolor,(30,30,30),(0,0,0),2)
        
    
    You can use the same idea to do a simple green screen/blue screen, by first getting a background image and then thresholding against it. The below example just has the camera pointed at a blank white wall in HSV colorspace.
        def calibrate(self):
            # capture a bunch of background images
            bg = []
            for i in range(0,5):
              bg.append(self.cam.get_image(self.background))
            # average them down to one to get rid of some noise
            pygame.transform.average_surfaces(bg,self.background)
            # blit it to the display surface
            self.display.blit(self.background, (0,0))
            pygame.display.flip()
        
        pygame.transform.threshold(self.thresholded,self.snapshot,(0,255,0),(30,30,30),(0,0,0),1,self.background)
        
    

    Using the Mask Module

    The stuff above is great if you just want to display images, but with the mask module, you can also use a camera as an input device for a game. For example, going back to the example of thresholding out a specific object, we can find the position of that object and use it to control an on screen object.
        def get_and_flip(self):
            self.snapshot = self.cam.get_image(self.snapshot)
            # threshold against the color we got before
            mask = pygame.mask.from_threshold(self.snapshot, self.ccolor, (30, 30, 30))
            self.display.blit(self.snapshot,(0,0))
            # keep only the largest blob of that color
            connected = mask.connected_component()
            # make sure the blob is big enough that it isn't just noise
            if mask.count() > 100:
                # find the center of the blob
                coord = mask.centroid()
                # draw a circle with size variable on the size of the blob
                pygame.draw.circle(self.display, (0,255,0), coord, max(min(50,mask.count()/400),5))
            pygame.display.flip()
        
    
    This is just the most basic example. You can track multiple different colored blobs, find the outlines of objects, have collision detection between real life and in game objects, get the angle of an object to allow for even finer control, and more. Have fun! pygame-1.9.1release/docs/tut/camera/background.jpg0000644000175000017500000001650511206577570022101 0ustar vincentvincentÿØÿàJFIFÿÛC  !"$"$ÿÛCÿÀð@"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ñnæ˜Í‘Í3>‘ˆßZýîÇ´9‰õü©ŒsíC3ž)‡žÒ¤ rFx¨ÉANw'ÔTlà n¡͡Į3É57·ëI¿Ž¼Ôd·ñQc Lsž‡óâ˜í m¦“ϵ5·ãØÓ±Ÿ8¬@1L ÁüñJÇד󌛜Ÿ”ëÖ‚p>P}é?àT€Bh%ɽ‡g¾)ÊG±¦žxÍ;ñ¬ä$Ø3g·åGlãùR‘Ç'…G¸Ç…Eн˜ïÃoãKýêAÈȤ=:Òd=6gÚƒþí 94u¨f]./N¢•°z®)2Þ´dçïVMÌ*Žü ^sÇ/=H¥n{ÖRD¹]ê7'4§Þ—¨ÿëÑŽ3ÅfØ®…4‡æ= /=©Äqœ~F³cR¸÷Ö¤Qòçv)NHáR*ü¼?Êl¾qÉÈä`zæŒzt .7ìx©q¿&¹¤Ç~¢®q¸Ôð.Aîy¥PõÃ(Qóå˜þX®y2®¬H †ù‚ïÍK¸Œ£+¸ *Šxlpæ²nä6‰yýM8ß‘Q*™$géJ¬I3ú FMç4…¸ÇZ 9Àãޛߚû¦}5ßAȆ‘‰a€A¦¹ÈëÆ˜qÐçõ¡#)MŠG¨¦1œHÇ=ÿ @U—æò¦`ä±ÎsúÔe€$nÉ¥'j3ŒTàûQc'+è¿{>ئ3Óó8ëI¸Ÿo‹îvb‘“Ò˜Ç'j\Žƒ9¤,9ÝLÊRWHÛ‚ãCn#“ô¦¶1ßòÅØÒ±MèäŸÖŸ÷†0*gSÐNÈêZ¸Filô¸<íš\­ÎMfZˆ ô +ûqJ@‚M!cÔ©©Ÿp=…) qJõ¬Ù7bgŠ:õþt„àñúS€ï»šÍ“­ÅN>´SÍŒs@Žƒ5‹(ÇlSˆî@ü)˜§gŠÊD¤=ϧ½+ndfš ÷Ç×åfÛßšÅÜ}DÉcóqõ§ƒŽ¢‘È'8ý9v‘Ž£Û5”¶-1Yrr0=éêsÆÜÓr¼ŽÞôî©Jç_¡0^ 'æjEÈ•'·z‰ã§éN'?x Þý+žI‡0ð¹`Xäö㊓wÍÁ¿S’:€A@ œç-ß›DóÜ— ‚?• …”îG¥7Ÿoʃ Ï øÉÇ­#8ÈçÞœ}©¼ &ƒ Jì\ Ò3õ¥91HOŸÊ‚n!`8"€;ŒRšP>´˜¯pÀ<ñùÒc€ db—§J–KnâgŒäô¥¤$MCÅ£JHì+6ÊŒç¨Å4•›b9àÒÑÉè(æ²lvAϾ)ÊgáNR@ãšÎB×éøP8<Ò“qïù $ŽÕ‹ƒÁ0Ö¦c€£ñ¨ztäS‡8<{Ö2Ô–—Aç,ÜÓÇN ÔGsð¥•À®+)-ÓBUòH8 ŽÔߣOIOLŠç‘ ±B¹ ŸCR¯ÝÃ~†˜¬Ägn*E9ÉÚMa&C—A¥X ŽqNLw{ñMßó ‚O~1HYÔü‡hô"¥&ɽÉ)?2`ûSÁõ} G¹ˆù€?NiÊÙLö¤ãa^è®å@ç­B]1Ø4ó}GµDÊÀM}Â=ù7q»Ç=?k7·qÎ)g·éUsØ™ôâ›KøSh9§ R è(4 z .bÛ§œ­ð¤4·Ò‘7¸Ÿj\sÚ‚=ˆ¤o©J¸¸÷¢“?_Ê—ŸZ›ƒbtšZ(=ÅK`´zŠNþ´¹üi EÊ[׊éGJP3íY¶RCA8íùÐ0§“ÓúÖm’œú~”¼ûÒ´»y沓+ GaŠ@Ò…¥Æ?fØ^ãp;ãùR‚:tZNzƒúR¨9è+6;¡ùÂã#ò¤ë×ñ¤³ÿÖ©ÿÕYH›Ûagœ¦iûqÈëô ²7TéMÜAûØ›»&ìo½Å=2§ræ¢>ƒ=éÀc¶~µ„‘ ´„‘Ä F'$«Œdg?€4ö6íŠÁÃRlKÔýÕÍ#ïc™¦Æˆ~”9篿6³üzôÍ*’ƒ >ÔÏ0ôn°§†UãsãÜPGÁo½ƒíM$G-JÎÙ8Á¨›éϽ}’g·'Õ ÷{-0äó‘JF1ÈØÓw}ÖÎy>€H#­7¥9‰ò:ñK˜ÆKWq ÏÿªŒZ1ê ¥Áì1EÌœ„ü((úQ‚9æ‹‘{13žp3G~´­¢ä¶- ÎpiG¾(Ϩ©¸´cÜQKŸARØ„ühžÔ«×®)O¶*)l&(éÖ”qØPzVre'¦ƒëõ¥Hý('ž‡þ$ ‡!X`öÍ/áŠ{à})zVOQÜw'¦qíMÈÏ&—¡H@ÍfÄ݃åîM€ô4ìdqÎ‘ŠŽøÖwÄ7Pj@¤À})«‚ppEðk9;ˆ\ Ôþ”ƒ9íNê½rhÁaÁ Ž,zt¥Hçè):íÅ=HaØÖ2ÐÞ1ßéŠPBžyú j–Æ}qJ6†ËPÀx,xfãëHÇŽIúÐ0z(ëBØ5=Qìh# 3ëMF`Çx÷§¦Hç¯éP݃TWlîûÔÆnyìú©¤pIõ©ž¤ž„Y÷¥ëÀÍ)Ͻ4ÿ»TÙÍ)\2IïBàzR¥ÏSSr%!NìõâŽHÿõÑÐô4™9ïNæ.ì1éÍ'©£ñ`QqÇ#ùÑןʖŒÑqO­%.I¥àú­MÀ8ǸôÅ4­.9É›Ï#õ¥=y£· sPØî?ÞÍÝ~´dç#m!ÏrEfØàöëJõ Ùü¨=rk&Âà "ƒHÇ=³Hyã¨aqÜ÷æ“9=MŽƒŠ9'5 ‰°ÁÅúP¬Oœ“1ô§vç'܊Ͱ¤‚i.xoéI¼ã4të+6‹œpJþ ¹á³LÉ>˜úRäwÅfÀ~8à¡§ªA*ãL\¯##ëJ0s¦k1 ùT‘íK»æäcýêô?…HI'æû¿AYÉØ´…?ìôö4‰¹xÛǯZA‘ɇ¥1v‚ITŽÄıÎþT$‡9Ü@ô<Ô%³üdÐOqŒ{€?¥+ Þƒ›ßõ¤t4²e›#h¨‰oïƒ_T™Ó9j<àrOáQ’ éúÑúÒã?:1m $Ø AÅŽ˜£ò ÉÉ=Å(Ç¥'áG#¿áEÉnáŒúè#Å.8ôü(OÒ‹ƒÁ¢”Ò .!sJ2GqI×¥+€ãÉ÷úÒchæŽAéŠM€Oÿ®ÏN”u<Ósž‹šÍȨ9ê5½ÖŽx­('¿›ap ö¥Ï±¦ü¿Z0§·åPÅqyÇ›X ZQ¸v›`*©ÏÌHúÒ‘èÃ4ÜsÎÚ^œ…¬ÛOéB’z þ4­’8À¦pyÆ~• ŒŒñùÐ Ç_Ê™UýhéÈÖm€â8êGÖŽ§æ#ñŽ{þTâ>Sz‰0wçƒÅ*«‚@ GÌIô )ÁÆïʲ“)!Äc֔䌞ŸZh$t'š^ƒ†9úV-—°+ü¸ÏÍÌO‘õ¥vî)ŒÄ Šª³XÆæœd‚}é„úü§éŠEl@4µ‰änÅM0Ÿ¯éNbIêGáL<žIÏÒ¾2äÀõ4{ŠPTÔßÃ"•ÌØgÜÒŒzŠnGaKŸP?*.dÛaí€)~éÁâ€}~4:®@™ðqïAÎ;ÒcÚ”ãŒÒ‹ŽâfÏ¥¯§Ò’Ä;§F¤¢”ÿ»Š.+†r{Ð}É4œzÒw©l§dã€)¿ €§=ø c>¿!´ƒv=»àS£9Î1øÖrz(!yÍ5ŸqàÊ”ªž0}E"×€=«ÊNƒŸáä{ÒK°ä†ÇÒ›³¨>Ô§#†Sø Í•ïq9=4Ñóp=ñŠvÕ8Ƕ)ŒxÜ?AŠJF¾ƒ°Bg})Šò6šibXuǽ8’ÃÇ4]•¥{’9#¹¦q×?­:B;cëLãÒ¾™2¤¬ÄêiGÍ÷¥ê9¢æRØFÉô§(ÈÆiOj;? .fÒB89¥Ü; CÇ9Íú Ò¹}ñE=ÿZ3ì)ÜAƒíùÑŽi(”î!:)(\MŠ1Üâ“é@¥Ç½Kc¸éi9šSŒqš–ÀN ã4´è¬Û ØäÒ°Çqïš@GqO ¸gùšÍÈOÈhvÒ‘´ç#éJÄžãó¥ç¿…fØ'Ü.:Ч=ÿ#A >¸¡ƒr+&ÄÅÎ9ÛùšR|Î4»Hç~4àŽXYÉ’ŸQ ž}:SXñÇãN` ÁüñM ¡Æ Îã³pOsõ ê…#æäÒŽ£¡²À°ÇÌA>£àóƒõ¤ “’¦àã85•ÐÄ-Ãýi26óÏãO •û¼ý)¼çãڡɱ )ÒHÎE.NqÀúR3Üb’f±Mn0‚8Î ]£©8üM)#“¸äûÒG×€}ñO™–•Ù!ö Œuþ4¸ÏCíM-ž£5ô|Å=5¯ô µ'$ô?JP öü(lɦöÍ(ÐO¾hÔ\Å« ÐRdi¡&Ž(LL ãµ#¡¥ÜaIÞÄ÷¤úÐN{ OÒ‹‰ŠzRgéøÑÇÿ¬ÒƒíEɧøRö ç<GáÍ'!‡~€Ñž{ =ÍsÖ¡±‡¡¥àœ(4©ß(\ƒÏÒ³”†.Þy ~£êö¦næž0x8üë92GcŽ2 ŽTnúÐA“àŸjÎäØ]ÜsŒú ^ÙïùÒÙê9õñqœVmƒ2G$úSv‘É'éJ…‹|ÌÄzâ6x ±Ö²nÄ-ÄÜ1Ž 0†ÆUAü)èmÄ{RñŽNlÖm—°À}VšÊ7äð§äÇ?…4’F0ÿ¥CcB;¯ëJ÷G4ÖnÛÍ"ç–üC+QÇíš@vŽ£›i ã2ûóLËz~5›.*ûÁl(¦9ÀûÀ{š‘†rœ­0x ¹íN,Ñ!'¯ØqFw.>SïŠaWÝ«»ØÒ$l8qÁô¦Ín¼‹IþK“þ½1÷søSy=?÷Ó4z0È<þt‡=Å\QÅ;™M‹·ŽqIúÒŽ9Ûǽ#`‘ÇéG1‹Bw¥Å&sÿê¢ä‡|QÛ4dô£?;’ÖŒñÆ !Ͻ&ÞyÏåš.“éNúÓHÎ:S»óҕŨ1Á¢Œæ”G§ãI°BP?Uœp(#ECcØU ‚y4```~´ÐF=;ñPØ F:Ñœ”žôàyÁQùT6Hå Œ…$ýiÊ0¾”/ ÷H´îJçæöÜkɸÖñ·4ã¿JDb¿xÀÒõ¤þîxïHF'Ú—°£ÖŽa ?:1ƒÁ8¤“NÈçÞ—0€piÁôö¤8êiyíI±zÆ8Í.ÓÔñIÇ~”½8©¸îà þ~‚€Iî1ïJËÇô¬Ü„î)±€OÒ€uÁýh Þ<ý)Ê8?ÐñPäK’x ~¢¤Û‘ŽÿJiU2úŒÑÓ¡'Þ³mt!Ü@ƒø4õ\ôþB€7žÔ€ãŸÆ³rÅØzŒãÔ q#±PëÞŒ€¸ùqì9¬¥+’ÛNsÉöÅ#nÏ­5‡pÇò4 2@"¥± °`’ Å …Ü) …aaMÚ1–àzY¶Z¸Ó—Éö¤‚ìûÓöîŠP?#à÷À¨r4Wd_w¨8öæ¤ òŸ¥fØ7È#КpààƒøÓspAúÓöëߥCd½CƒÐœþ­¸œsÚ‘3´ð3íFÒTóõâ³l‡ 0Àà=T}Ö;©nrÙjUÁn˜•b@Ý:äýM’S#¾áK‘œd~&ø °=0x¬œ‡n£]¿AJq€2}é®q‘åò}éY™HÏoCPÛ5HFõ›ÏcšG ¸,$ÖâçÿZ‚þX N• –¨ľ\ ‰”îʃšV ¯Ì§ñéLÀ€9ì*:#¸¤:°8aŽÁ©²î¸PGñ´/ÝçÜŠF‡óK˜Ö+[Æ<ýáJ3»€Coþ½*ƒ·&$`;àRÃðvŽù<Ìê„l’¹#«)Èò̽IüªÃÎqùsQ±öö¯aT‘3²•QŠçÿTއ†,­øRŒu8ÿdb«ÚNÏB2£¶M7,Xü¿™§•ŒøSB¯@5J¡“бÎ4„gòÅH2NÇÒ›µ‰7éMMÈh^Ç·bi¼gúÓÊÕ—>šSŽ£ó¦¤Kòã·ó€Œò)[<| })p“Ǩ£˜CF Á8ì/¨¡˜gïôäÎsóG1/Q¸lg/¾)PËÉÏåCaÝ<{SâFcµAÁ¡ÎÊá¢Ü`[îþ§‘ýÌ~4ÚJ‚A¥²ç ý9¬Ü€$eO>€RaG$+{ÓˆÀùºÐìOCSÌ mô?JR@\ý)6O"•–ÎI÷ÇJ–ɺdœ!}©à0<Üâ‘g’¸¡Wyù~aôÅCd;vÈÀŸ­!,À|ØúS„C'qÛô¡@5fÙè0ãwò¡€$æœ3»$ûb‡è_n}ýU›ÆnF>Ý©@ÞÙÛ“ïG–È3GÓÿ­H13µ½ñY·Ø¥a_ 9r{74…#S¸¦> Jv2~}À¦•nÎôÉ›eÆÃ “†Ÿp)6³µr)ÇÌäcêM4rÍϸ¥³x¡™_ãzR¬{³±çšrÄÀg=pM=QÕ>ðÇךÎR6Z=Ž5ûÞ_N¹=i‰òâ#ý¦Í8&@à ÛÀS,?VMáï ™$‹; …ô4Õ;±µOr0Gä*e@ùo—>‹ÃƤ¶†iïÑýÓ'4œìŽ¥u³+ä¯c“èi¥”Œ‰GКRƒëž*0SÇ»k×SF 1N}ìzj‚vßÎüÍ“´LÒ¶åè}«R0¬Äœ€Aõ™õÉúÒnQÁ9¥àj”Œ¤šØUõ$þ›ˆldÿ:RG®>¦“~8 U)4#6OzGlx>ÔáŒç?JA†'8ZjZ’! W®Gµ(þ”˜Ú܃õÅ;·Ÿ¥7"nxQø €GÝÙ¤ë:ãõ¥‘¾l ñT˜\k0€:’6˜ëLãןö©é÷pF? %ªcT6OÝç°4âA Œ~ƒ zcëÅ((ÍŽ}qRårnÇŸ1†p>´ƒŒŒA‘€O°Å’GÊ@÷©&ì‘‹~”Á¸ñ’ à=3ŸÊ•S#ÛÖ¢è–Ú;É푊‘Ð z(~IÇÓü)ÄÙV5-“që¹óÉ\ѵ—å.HúSp„r3× R£8²o±(qVo¨õýz†@Û·>„ÔÃníѱb? I˜ä1õ³l¸7q7>ðÛÁÇŠ·H%Aë‚y¥ˆ`¹ õ6TôlE›z––¢îqò¢’¾¤Ô3`®Ý£ÐÔîÊË»?J…Î[ç,=: ”úšÆ=È™¸Ú#"…WkÇ 8§ ®T îF)É™U$þ”œ’v á1€sþ})ĬР¦[ß"‚À ] ëÁ§ïÚBí÷AXI4ÓvHk8lcrÿãÔÔœn>ÄS†ÒÌÅÊŽÇ!OåREâ[{cýÑY¶’;aM OûKÖ¬À£6ò}:ZNJ 8ïÇ58F<»‚=#õ¬e"ÒhÿÙpygame-1.9.1release/docs/tut/camera/average.jpg0000644000175000017500000005062111206577570021371 0ustar vincentvincentÿØÿàJFIFÿÛC  !"$"$ÿÛCÿÀð@"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?먢ŠûÊ (¢€ (¢€8¯ýµq€?‡?÷Ȭ©$ÚFõ?\ÕßJS_¹°_“§û‚±‹‰daSšðêͪ’õgç˜Ø´ÔÞ™)›që€;úÓ_É`ßïž?JI ì(AÈôÅDͱwmcôÅgí b¯±n"†ßøƒX>4–6ÕtP››lRçîŠÒ‰òªà÷ÃÖ/‹˜¦«£;Å#.]¬Ðgœ× ãCþÞÿÒYÙ—Ó_XWí/ý%’øå£þÈ‘XmÿGÛþ[5yÞ˜Ì"vEY8]ÇæçÚ½Æ@6‹)ýá_³ÇÃg?ë›Ö¸QuAÊ%AÝ~ë|¤÷×Òe2_ºõè}_Sr££ûkôéý/¼ìÒE”¿Ä>Y}3ÍIqÊ ±ôÜùÈWc*)•Sõ—somŽaOÀb¿N£6¬º£a³ÆÎ'.Í:6%³$ú Èþ•¼·K‚UtëÇ£ükm­­cåC)ÿxŸçPx ùäN+gFUj´Óþ¼ÏJŽ.ÎêM^F,±Ãsæ$ò}«ÌÆå¸8táÉÇÿZ©K¢X4n›=¿ÈWƒîûçõæ·fÓâ?sË#Ó%O銣q¦‘"ˆcš?V…Àüû× ø{*­½>_M?#iâUHòÍ).ÎÏó^{™¶Zt–ª˜Ô®U—;˜ ;³ž€¯©ÏµY²Ô¼K£I5ðÕÄÆ ¸„R¨ØcÓ=:úVË<ë,§ýœ7ò¦Ëu ¶­h÷N¾7Drªpr2:uæ¸gÁ¸økJª—ËõW…qA ÷9«Òøê(£–K"âKTÆnáŒÉÏ£íóׯè|Aá ð¥š(‰ÏU1ÿ/¥uaøÒ„þ8}ÏôvüÏ3‡Ç`åˉÃÊ?ôŠH{’G¾*@ÄðH5±Ÿ¤\‚mu9èEaýOcL}öŸ*â9n1ü³^­.#Ëêý»z¯ò¹ÄñtžGæŒåã ©S'¡§ÉewË@Å}WŸåQ  íbCz7½xª—îæŸ£Cº–±Ô˜žH¥€)ˆj@qü9§#68sÓúÒç š3øQÏaXHCv&²n¤jÑðyÏO÷kXð9V6±7‘ËÆFzý­pÉ>h÷LëÁZSq}S=Š(¯ÍÏ´ (¢€ (¢€<÷Æ·ˆnÀ 1³?ØZÂyœ ’)UøÖµN¼ÿÖ„‡Ü¡@÷¯œ¬ÿ{/V|..í/Ýþe¨ÛÍ}¼?Ú©(l)†«C!#'bg¹éK#†9`…OCŽ+ÝÎgIØ¡!2I>§“âéÄwº q݇pEjFÌ"ì$õ8¬º–¿—,È0xÕËUÞ¬þ÷þ“#¯/Šx˜¯)é,Œ¥c¢9u²c¯¿5Äè.‚çÉçã±®“Æs3Z2n'0¯LÏJå¼=½nÕˆa€ß{ýÓ_M–Ç–•y¯Ìú¾‡-?Y‘ílÙˆVuÓ*ÓH @çðÍf_KÇÆ¿R£O³ÃSh¥s&´˜èÔO #­TgçïW¥h{4ádLg9ÆïΑeaÆqøÕ9%Æyüé‚Cë[û3^SHLùüéûÑþò«{•¬å”f¥óܪ‚k±P‹“è'µ4ⱎäg÷`×@?Bh“G1Ã0õeâ½_ÂÖÚ¾\é\Ì7ä`lJF3œôý©5oèr±\ÒBê¹(d99ÛŽþ›å_+þ››¼Z·—§ù­V‡çßëÍו9©FÍ­“Û¾·¤ ì§™S©tÜ_Ýú•<î…IY4ûÚIÿ/–×Ì]²ÛJ~€0þu´HUzNá]ýφn§‚;ë}Iâlåàl•ÇŒÕvðêà…¸¸…‡Tp+*Ô°X«©ÓRûŸù™ÓÍ2ü\åÓ·£zwG¬‘'îvê@5rßVÖmx‚ãbžÃüûšÞ»ðÅÌŸvH$ƒ.Ü~UZ]ú5!¬¼Àz”#üs^&#‡2Êš¨8¿+¯ÔЏL¿ñ%¯êÄVþ2Ö¡Œ‰£ŽSزò,‘Z–Þ6…Ê‹›4,ß²`þD}+ k&ˆþö ÓÓzUY-£o˜K> yuxNžôk5ëý#˯ÂX:ªðþ¾ë¸×´BJÉ£¥_åÖ–ã’âTŒå¹ õÍyíã=½» •PÀ€r;~5Ùhr¼‘£ÞΙ'?í=,–¬=áëÔrM;vèïo¼ù|Ï&YzÝ»šëycø RßäšjîϿҟÔõ}„™à1r½@9üë7\%mÁ³žâ´±T5egµ!ùÍ^¯j‘¶¥Z7î{-Q_œŸtQEQEygŽd+âÛÕíû¾Õ­b4¤¹!ˆ'×­mxý¤(¼Úˆ@ÙÉl¸¾õ…'ÍÉ_ÈWË×¾—«üÏŽÄ¥íæüßæN±‰dÈ÷àS£‚rxè?Ò .1£ñïRïc`vîƒþ5Ÿ39YvÙŸ€Ñ®=YÉ®{Çmæj:*¦oáÇaè3úÖýŒŒP–çêëdzn4D¯òÍ‚[á}:W4Ÿïáÿoé2:2´Ö6>’ÿÒYKÅ뺅!¼‘Î?¼®sC]®Sc±Ž@ãî“]‰,..ãŠÒß,Ÿ,! œ8'®;W¡N|ýÈXg#º‘_I€•ð´Z{›ÿ#ê2XÔt’ÑÊÉôº¶—òººéuÜ÷­@“PÒ¢™˜ÂçwR0pÄp:öªzׄo`Í»/ýr9í]÷%-áxxGßÏÍ€>vÇj“WIíãó¾Ó{ÉíھϘâU[s|ñ.eG:q©¢“Vi>¾‡‚êÐ\<;‹2ã<ÔYí!®³^ºŠÛÅBâæC762OîDZ«£Qð|Öå~Úþw?~1ƒé÷”WÕÇR 7¤Úij¶Õ¢Gˆ1©S”¨JwI·í’<úI?Σ2ŒãÕ<:|¤âsýÙ?øé§é^‚ûQŽ´öRÙîÛ<þUÛÎ)£€õ(Á±ÐtãÞ¹eÑ{%Øý´?Ò¢†;Š¥Ï£:ÿ·0JÞÒv¿“ÿ†5-üQ%µƒÇh‚äbŶ† —-ò“žÇŠÛ¶ñ|l.ê—!'Ás:Üp ƒ€8‘ŠãÛFº 6Kƒ×qÌUy´½C–Ï÷Xñå‘`åÊÔµ]ìôÒ׺éenº_{ßçêä¹)5 ©6ﺿã¯CÕmük ŠþÒUò”G<„ÆUÏÞ8m¤€r9‡Ú·lüIotó‡ ~ó:íhš9:‚_”9àŠð 4F÷¯b¶ $Z’±íyí$Cü+’§ ÆMJ5c/TïÓªv[kd“ßG©äUàJu¡Qþ·T×nˆú|kɾìÂ~{`îÊ­üsõüjQ¦½¤Ïi ûL‘«°WyQ÷H¯¯›ôçÖBù %¨…ºª³¨8Ï`qÖº&ûW±“u¼¯wt”“ßûÙõ?xU¸gI¿~/kY¾›î­«é}—g_ÃüE8·Nªmtz_×s°Õt}fÄÞêš6±>˜Ž#ÌOáAÇdqç1ö˜^fî×ü±‘N ƒØšhç­.¦Aâ¾¶nçÀ±ÍÏaøsP^)6íÎ>µ:ð¿6? Šç&¹ÏáF\µPé»IÇ^){í ôÝnŠO梬'üD ¨©ô>TüMUÖmdºŠÞ@—%аùÖ4^Hž§§¨ük¥™‹D `SÌd}?…~5:Õåíêû÷ÓòGßñ&E‹ÊqR§NR•5o{^×w馾_º…ñgŠ\52ý›xÈÿÐiG‹¼SüZ’ u"ùý+œŒª¡pÝòÙ?ΧwuA²0?à'°xªÿÎþóäÞ&½þ7÷ ñ_ˆðJkàuýÔCÿe¡¼Yâf_Ýê)¸ÿÓ(øý+I]·Â#ô`)ÂGT\0$çîqIbkÿ;ûÈúÍuößÞ\Ôg»½¼77Ò´—}òp08€*¼§ËmQ×&£V.àˆ[ûÅúô¦àï ý5ÒnïSå'w©" 衳ß"¦Bç*Ì™íƒÿר­¼Ö ¡“¥øhçþ¨L¥”ØÛ¿}ÿ»ZzÝÏÈc–Êâdþò»qÓÔœVOɌހ¬JÄnê÷Ûß5¿¨¼0عº¸k]ÝÎóߨ×Ô­+»«»ÿ[ ŽvÇÍÉkÌôùùjxnmàñrËm,Ñcî+~â÷VPÖ4r%°¸T÷‰ýr+_Çw6¶šì,/w·ýbï_à_N}«Þþ;›‘Z‚Iž€Èrxÿi }I§ð®­À?^ʰ”«á)Êí;wkð:N©0·Òmåy»«F¤tÏP¡¯dð~‰‹§,qÆ‚C÷¶÷äãùÖwƒ4ìbûLñ¡¸n‡jåzŽ¡Gc]:¶ξK7ǼCöpo‘ww»þ¶9±ul½Œ$Úów,|’.ÇYOP{×)â $°¼ÚHH%ãå#ݶk¨ëÚ¦F{çÒ¼ZЏYóÓäy©ò;Ù?&®¿™uĺ6Ík³ªc+Û?ÂqUÞòùw´µP¸ÎÆuÇýô {ˆ|9c¬DKƱMü2Ïoð¯!ñ‡5Í"wU»,‡˜[§\zû|³2¥ŽVÑK¶¿¡ßC CýØBý¬×äìR’Äö7vþ‡z±?‡n-^ÖCóµéõó!Èþf¹ý@j×qˆïn ™{‘‡óÅV†ÆXH"?ëÊ·ø×­õjräìü¿àêkþ¯Ò’»§gå'úÔšLVI-¸ì`#õ ZðG¢\GÖñŸkŒÈšá­mï‘K¯HõÆáW yG²?½yÕp‹ìKúùU²j°þêGÒIþ Çmo£i³ ò®e$÷R*x`0ýÞ ¹ôxñür*áͰ{àÕØfx›÷wGî’•®Я†gS ™Røqÿ· Ÿã©ÓÅàZPL3ZIè< üÅC/„|E9Ó$÷Oõ¬û-KQ…³­tëæ–ζmüCât;—Vó}WŸÒ¸ç,l’‹õ¿èyµqyÅ'üZrÿdŸá¡“.‘ªÃŸ3L¼ëû–Àý*¥¾Ÿy1ŠÚÒI$¦{×cŒ|J¸%,åîõÅrþ8ñ&«q4Sµ²[șǖH;GòŸ¶ÆOÝqŠó¿èU Ç4«.NJwî¥u÷hÿ'VÓµ8#,ÖWÑ•¿Õ·Jóß¶Žx$D.Œ8c»z»Û­oWK/ö‚ÊÄ€sÜ×0k·Vä©Ý ¾wzûú×Îf5*ÓÄQ«Q-ôòküÏf½,lpµ#‹ŒSVjÏ}uÜëb.Fxá¸ðJàúTv®^`ëÐûÔ§Ö¾ÖLø9hì `HÃ#$Rœc$õ¡ŽØÈÝøT'i&$Î:ÓQšê6•£Š4la ,Š˜ôž}óOºžk˜ó$­$¯÷˜Ç>RH ÜŽÏN’GŠÅ<nHe¨Ï#q =ñÅsŽÒµ¼¢{˜ö°üÁ ×ãuj;òó_ñ¶¿ÓÑØýc‰#ŸeT’Äb9éÕr]ýoxÙ=ZVwI5¦Åûr…vÉUÃúÒ§ ÈГýxªð´‚#$g ;p<Ü2C†XÛþ3Ö¸Ýï¡ùÄ“l»!‰Ñ‡–Œg娢‰d9)·š&_Ö“|ê2Kc¾R›¹rn C“çSÒÐÊÏ¡$£hØÐ!§ÊiÉ– ˜ÆïQ×õ¨â’pÃý¢qŠ”BâBû¤ç®øÓæ¶à ¬rv*ŽýÈü©¬ÌœîЊv÷W*ÒOñ0Çõ§áV2ªAîMR®-‚€pxý+7Ä{×QÒ îÚZnUˆþô¤ŽæM‘êWµú%$ãŠi»+öÐðñkG2›’i9vÑüô<ãÆ’2ß[˜þÌI þ½A^ƒ×üô®Ÿáÿ†$|jŠŸáò£o¼ ý* / ˬëQIqñ’ÃÕOõé[Ç KH¨‹ÑW€+Ð̳%+IëÕþŸæ}åO±ÂB~ó_rÿ2hñŽ¿­;8¦zT€Ú¾VLàcçëORHȨÊöª8?ΰz™´‰b=*®£cm}l`¹ˆ0=ý9ÍNvæ¤eÎy¬Ô¥NJQvh„ÜZhñx;]Óf7]íÃCéç>èî}Írp¿‰Ão}Uó_G¼qÈ¥$Ue=C óÏøÒFkÝ>×s÷Dr¾ƒßÞ¾Ó)â8ÕµJWèíÿþ 2Œä£WGߣõ8+yõ¤̰%Ú¶þ V¶«¨¢ì0´cÐ_ëXì–ÖåÝ[궯þøç¯ëWìï ë¡|Ÿï ÿZ÷«AI_—úù\öåÉ|7ûÿCfHº$_7®ìÿ<ÕŸ´£¿6à¢çôªÛOžWPb?ÛJµ’ÇqšÇý3á^láíùÿ‘æU„ømÿ‘(krU û¯ÿ^¤O,rŸ¥B$ã#>áqRÆTŽ‹ŸÆ±”{Üà­÷&V*¿+{9ÒªË3%Ü’Oå—¦9«éúÕKì$”§#QXTÃÆ¤% jškïÐó14c*rVÝ2K9á]ɽд™/F>x*Ÿ=HÏLv®žDñkºÀʯ (ÜrضñùV†¸†ÓVØo¥ŠTRM«—.AQÉ~ü|ÕCÄŒmõiÂe]FqŽOþÍ_Ÿãaà•HF×oKߥÿC’†X¡Ô“S‡6íôZjßádtº[æØ#`:’cäÕ 03Áª{Š\[H¨ˆ&M’m9ù—8'ðÀü*èÇnkìrÌÁcðÄ%kî¼Öñ>2²÷¯Ü^ý?JB ê?RÀõ4ª ~µÖÝŒNcPŽ1m,,Ðçí ç–”gr–?€àU'}™Wå^¸“ùšêcÔ":lcPºÉ”ày’²a»FÞœu>õ‡®ÈÖ×R$b6 û ª ð>ò9Èõ¯Æ*))»ë«ë«ëÓN¬ýŽ8}sO4£%gÈœ{]YlÞé/'«ZY-ŒMÊî>‡ f­Í2.Á(ÏÌXæ©,ªÈV(Ðç°©4©-½Bçõ¬%vî~dã&ô."ü®Á˜°Ç–ÏÐb‚¥‡Î)ô º¡V/ó]÷ú¨ ÐUˆ§?-^6Çñ6súÖm´dÓŽ5 Þcç£ÉVí£™ `§bqùšÏrˆŸ0r;ŒÿõêKIbSûÈ¥#ЦGëšní](»]…Ä-3‘Qý½¾¾”ò…“¢zëPy6Šþp‹l§ïØÇ:TÈdfÿ[ŸÃΓ’_ “K ª`ü¥©Ïò¬«îÒ¤F<Ë(äçøSÖº*¾YSŽá:W=ãf‰íìÅÀùü×û9è›·u=1ŒUЕëCçÿ¤³Ðʠ勊NÚK(½=_O2oÆí5±’BÌKgÝõ®3IhÞé"”(Pzãší®#Ko*¨°H \u¡ û‰–H—£²ÇŽê ïï^ö_ðù?ý)žæV›¥/+~7éý~G¤øGÂ2ë6㵊T^¹ž­éô­OÀ:Ê© µÇžz«DÁ{w.;{V§ÂùÒßCšAÊÙ\nÇÌþâºÛ+`ŒóH«æ>7¾œWéU³\M9^3kúêi:ØÙæ‹¨Ô ö¾È‹DÓâÓlRÚ 9 c<“ýkD{u¡A&œÀq’x’¨äîÎùÍÎW{±'éN1Ö—8qK“Ž1X¹\ͱW©üi[hµ›d°Ð~4ýÄ&úÓWŸOÆ”6AYÈ–‡/L±çÒ‘ðFÈ=¨ ÇÐŽrqƱ‘69_xBÏV‹ÍX¶L:=z…yÜ•{ä\´–Àui3é^à@+Ó'ëYZækª@Rh†îÍù…{¹n{VŠöUdùz>¨ï¡¯û?hâ»èí÷žVÖ‹ì‘´²*÷ Ÿð«PÆÈßÿ|õéúž‡q¥ÜÊÆ>ǯùëM€•9F+ô¯­UH)BW]ÏQÒÄÊ7…{ÿÛ¨µo˜q½A÷«QÚÊ[!úËžæ;q¹™·zššÚMIÓ‰VÜáÉcüÅsÏ›£>3ÆO¯Z´uémQ¬®G"0GÔUMBÚámX´eGÔzÓíâ¹?n¸cèH§ÞÌa¯#“Ù›ŠÃž¢’JÎçËËŠ?*\ËÒß©FúK¹ó‚ò(wÛvúzWñ˜Ëh°?É®NbÈù’1×þ^Ÿo©iîŠ[F°fï½:þUÆ|A´¸ÕYšÏHŒ‚ߣr£×üó_%˜à¥J„”hò­6µ··äÙY67 S©ÊðZë'~…9n[û>"ŒœK»å Àa슷•IÇå\‹µÌKsôÞ(c,Œèy$g–è9Æ=k«¶‘dŒ:°Áô9¬øNN8IÓ}%“Kþ ϘagF•)½¦›Mv»_šdŒN6â.PiØã?¥ ½@ùkéÜ&æ,[‹y-ÂKhT%¸wõÏ©ӑߎj¦‚Î4‚úîÚûp!Ù/™Œ…ÁÆ3ß®+KÌÔïI€HÍp£1%à¸D0IãÛòÆk ûU¶Ô¢%àš]„›ye düÙ0zw'Ôc¥~A[ù\VÍíuæºi¿žÚ¤ÏéÌ÷0§”`å;¥&¹a̤•›\±Òé{—qž’i7z¯7–öÿµ·=9ïù •¤Rë+C¸èF?#šdî$›Yqœƒ$1O–ftC$K óðqúW ÝÏç÷»¤,¬Í+HñÆ€ãÇO­¡~3êG_¥NÖÆDfˆ+ÜGÇê3UÖIQ¼žXô þ€Ô)ßbRºÐ°ó“åhCx??•”m qÏDÁoÈÔn[ÈbaŒ“Œ>Ñž¾¸§YcÔ¶ñÜœåM;+™¸ÛTMor­³ÁýjÜLbŒyi˜ûÙš§$Å\çqnìǧè:k˜€Ê( z’þ”;³7'±j{€Ë˜Ö)pÌè+Å\«bßèþq™Â¸ »x_¼¸9üÇãZ‘܇Ífå„zÉ×ïLÉjKkæLß$HBË€¿|ätíÁëÚ´ š«;þOúüÎü²›ú²é.ßÊûÛüû]ØžY˓ӕÄYBdÖ %–`s°²ª9Âäñ’={×ov‚6†Ga†cÇSÐû ë>x([Û%õôkæsÆO<º÷öÇjú|®× ®·üÙôyN3•K(ÆÍ÷ëùíkù>§áÎ.•§fí•Ùº £Œ3ˆ®¿nz8ÇJQœpE},ê9;³¦¬ùæçk\p dš2G\У©8¡g¥bäd¸Ç4ò3ƒù×øOÃÒxž[ÙeÔ"effÌ._vI9ñú×Aÿ Ðã?Û_ù+ÿÙ×ÊáóÌv*š«G x½Ÿ:[;uGèyd™f"X\^gËR6ºö3vºOtí³G¹±È?dî¼ÿþ©Çü†òWÿ³¬ŸøRO ØÃ¨Ç©´²yê‹¶/,©Á`Àî<´ëç9†›«W h­ß<_èF …2,uxá°Ù§5Ih—±š»õnÈõœ€½M;jžŒk?ÃŽÒht³;;½¬LÌÌIbPd“ëZ ÁœW¹ ¾Ò k®§Àâhº§I½bÚû„$ƒÆ:^G|ý)g½â¼3§ZuªuØëÙÞ!öáXZ»;^m'!jÞ¸Õì´ÆKI"’i¤"Æ<“ÓŠæïîâšW’\ÓÊÉÀüϵxô±Õ©b•IÅòkgm>óä0XLTãíý›äèìCæ$úúÓ£¸uç&¥hQcÞ롪ã©Ç5õ¸\TqQ¼v:SL¶·óàÄ‚0A©bkf]¦ ¿CT‹dýîi SŸ­mõjM»E&R§ÛCTZoMÑÉŸlUw‰•°à©>¦’Êf3ÅhïYl sí\5°Î/BIÓvz£ˆ´Õ'&u†Òì¦ÒÂXUXdñ…K~Gì+&0`¬’2rÇñÉ­'°’-%¯bž}͘T?6Xœ:† JâÖT†ÞÆãn3åIæ°çŒàqÿÖ¯Ã'$ýådíñ/ÊýûÁ?\ÌrŽ#«XlTe-.“’•îÞªÎý<Ú³èR¸óî>mÆÁÝü*ÀòÇw æóŽ`}[8‰¦ùri®¶×BÞ7o½Y}œdn g<~4¶òÛŒÁ°gÚl{ò aRëNݬ|l<ðµ*ÐiÅê¶~££wŽ"Zy”Ÿî̵:àfÜ© ‘Ï~iV(Ù!V—8À üñJî&QXH¹ùY¿>¹¬”µ¹ÈÝÝÈ$kp‹I4ŸÝ|œ}9£;±¶9C÷P¤çOµHàlyÓŸD9_ëQ™mÕÉHQÓx$Ö¶‹ì6Z’Q™<Ø1Üò?ZZ )fãæÀü)±Ëæ lÉŽFïêjYåɈ‡8ÿ–gu³3·(‰q6¾d§×(~•™¬LŒ-RY® If9U?,˜ ÷°GN£ƒøV šSòa#ÿkóªÚ¶“>¥f‚6‡ÎŽ_’iK(‡;s…_½1Ût§Õ‹–ŸðÏúÿ‚{¶3W½%+oü’g¿Nô¹.¤m…Í´2Ü^5ž[Î`­¸§n÷Í{¶”ö¯dŸd(Ñs‚§#©þ¹¯ ™Œ¶±7˜@ó0#Þ‡Êþ„×Aá½VûO¾šêËS[›)vùVÈ‹±08a×,I?Jú<³O ƒ§š-uó¹õ\/“â3|-ZXuySiÛ«O›WéÊ’·Yz³×ñ‘ÔS¸Î+Âþ%Ó¼Ch&±œö[ƒÔއýÓ[dm d×Ò6Ó´Ž*”å rÈ_¦?:2£îŒð±¤lúÔ\„p_±S$õ?û=zRW‚~•ç¿zꞟ¹ÿÙëÐS%»b¾{†Ÿü%ÒùÿéLû_?ä¥ÄÿÛŸún"€ýUÈ|]#þËqŸù|^ßì=v$ãc5Çü] øjß×í‹ÿ =kžËþêúÿ%ü_£: ø¦´³ÿNqè´¸Vg†þ)­0îÿ—8»ÿ°+Cr}«§ ?ÜÃÑ~G…š¾Öÿ¿6< Pž¤šiÏn>¦²¦«¡Kž1V»oï×ó"¦&X‰9ÔzýÄ3©Ý¹xÒFIÁ?¥[Ki¶ñïS-£·¡Ï|×}:ܱ÷…íTU®AnŒŒ‘V#¯49“ž1Hã?•C¨¦÷3rR8é§°·‚;iî^xWwÍ dpN{¨QŽ;U;«‰ULÒ©CÆJ+6;wzÓ÷q¡{Ȉ–P :ÀÇÉÆ~éÈÎF3‘ôõ¬«·¨Ž8f*¿|íÝœôè}½+ùö¤J‰ÉßE÷_Õ¬~¹ÅK3­*s qƒå²¶öVÒZ·}VýûÞÚwWhè‚0£g摟©Å>f,¶ñ°‰{óúóŠ‚O´XÈ»®äNÊVXùü ÷ôëïQ mž!±œIÛyÈëë\Ê:'’%OÝwºnêÛÁÞúÀ·e|žkágÚqÌxT›íã´ÛùûÀœ··­Tû\qFâHâx¸Û¹öÔzÓ£û*?š¶‚ ÿÅ!Áãóͺ½ Üö.Cqãöi$×xþX¨ ,wg2#ìs‘èWâ+Q•½œ/J’;˜e¸g”N±œvã·5J.:Ø^Æ×m^fgË•©'?ž(y“±L>Ù$·ãQ…f$¤›ÝónZK6F#GS’ÿ–1üé«tF\«¡,oh‰–˜‡ìd~ ÿ*ÎÕgyá\)>D™ÚGp[!zÓúþp h+æàôýÞGãM—Nº¼Ž » ®­%8·b3orË·žÿJºrŒj)?ÇÓúZŸE¸iVÌéòÁÏâvM§nW{Z͵¿,nÞň®$¸Ó‘¾Ô“F.(L`|²zcÒªÛx‘îìŸìöwpÝŒ}é¢Q׳H9àtÿZ¹wtLD·µ1î¸@=É ì£Ö³fðæ–¨.¡ÕæŽûÒ6a†@玦»èÏ °°UôÕÛ¯^¶î}'TÍ¡SË­kG™^1jÍ9h­­Þß;h72i’¤ð=ý¶IÛÊÅ—¨ä„Ç9ȯYðw´ýAÖÓPš8®Ý. ïûÄõ ¥y ¹’‰!šÖÆí–IeÛÈÏÈÈ}}+ Ü\!lÚ«?LDŒ~G5ôU8žx¨Æ"½Ô’}mëÌά±.ŒUzqÝß•¾hÛGו_t–¬}^ °ÊGµ``ò_‡Ÿ"{=š«›]Ÿyg—rç© þÏP:׫Û\Ãq– QÔçî¶{âº(bá]^;­×Tsã0rÃN׿F¶k¦úýé3Ë<¯Zør[øõ.·ÈQv¢ ©]Ù Œk¨ÿ…‰¢ceÔ?ïÚñUÐÍ£i2»Ë&•bîä³3@¤±=I8¦ EóÓÿð?¼.]™a(ª4jÇ•^×]ÝÏ»Í8‡3|T±˜¼-Oi+^ÓIh’Óî0ÄMøöÔïÚñu‰ãOYx‡LƒO°µ¼óþÒ® ù¸a‚I9aÅwØš+4}??õìŸáOGÒ"‘d‹J°I†V[tHèAÇZœF 2ÄStªU+ÞÈËŸpÖ]ˆ†+ „©í î¯4Õüü‡øy$‹@Ó¢• n–±+« !Aµ¡ŒŒ‚GãQŽœäRî$q’>µìArEEt??ÄÕuëN«Ó™·÷»‹ócšðßßMâëåœ)[o/Êõ£þUêŠ73çâšúXËãÍUlÏ›ÄG O”8ž‡"½îÌpôqþÎ{ò·éª×ô8qµ905švÛçªÑyõôLÂb$~u£§…XTëž~´ûÍ-S\}E¦SÅ}þ&¼+(òì|L«*‘ÐÐVÝЊµƒŒ¶? ©Žù?…[Œ‘ƒ^^"Iž}O"óH#=öÓZlÆb«3 Ø>Æœ»˜gçBj/SS[vÈÈ-ø Scÿ£pêwÛøTìx&»!5-™¬ar¹ö¦´Ê½OåU ÎÕü)»‰=óëÚµ©J’ê[YÆzgð«PNpLV_Î9ÛÅK ˜ã%E9«¡N’hÙ’FÇQ‡M§ëYñÊŠ3¼“R Žáëž.Ç?²kcÎ†È®|ÍÖÊ£á¸Ê·+“ó’xÇJ}ƒÏ5ÒI77&ïŽ-úŽ2 °üÁ¬{ioþÔe)(n±ÙãÀ¼Í ë–ÓY¬­pÇœóó­í“Å~i> Î*7û„¿íèúu’þ¾ãö¬N¾'õ¥I«={­o­Ò»mÙ_]õ|ÎëMm=Ì’ÙÙ|*Ýd ·Ÿ˜ò{žhx._¿‚dcÙ¨9ªr¦© >P†(³üJ‰“Îy¨&k³'—p«ûzwìkªŸgRÚKüI¿Áže\—9º“…®ûYkÙ+$¼–‹¡¡ûÉe"Tœ¢õÛ´ùçV­ÒÅH 0B½7r–+>ä^ùÞZ/”Т1QÛ© Z_`Ä×’öù^ {ñ¹E9p&`—ï*S‡¬¿É3gÂøÉ·­´í¿Ré¸ÌÄx$ Ä9ü{ÔP82¿ÊêÇ/à+2KA³÷z„r/r'E?ú>+)-£ûBK”ê†V縻‰ü«Oõ+Ù¯EÛÚþH…ÃÕ"Ú©$¼ÿ­ ˜¤¹›2yìTw`>”é¯%òàe9êK†'ò™”3ÛmšK™»“&:öÊgõ«W:\Io#ÇfÍh!‰UçåÝ–^ý3XK†påj¸Ø/DßùŸÑùñVWµÓuþþÚ»hM=Ë+¨çF3üÅSÔ.ö\±ÂÛ–âTÌ­åJÿyã¡ÏN*[Xc[6²HIFÇÞÚG\ýÐõ®š•ÚÚGi2[>×ÜLR¶FO?Ášós ¿.ÁÁOŠUdžÜ®:w»mX &U‚ª§S•âÓ´[·2q—ÂÝ쟕ȯ¦’ 53®.¨ÎùdíëYí6ù7áY½JŒÿ*¹,VcOahD¦Ýñä“8É'¯©?…d«ä {f½þ¥BxÎ ´Þéy- 1Œç ìíu×ÓÈÕF`L‘Û'¥[·Ý+ˆÔîêy<Ô“ì:ÖHG€~µnä´W3+n¤‡ÏvÚOéï^î-Ñ¡EÊWé¢ß¡Z-/tÐSǼ{Áþ6Wòê{õÅ]Ñï/ô†2é³Ä’Ÿ¼2×ã=1ïšÅ‰g¹”µ¥£\IÇ–%?7¸¿ §Z}¤Qmy澎!!q+(\£$¼ð}kˆ.NU#¶÷vÿÉ_*ù¥ÓK—‡­S &á;6º«ùÛg½­²û®{'…¼[c­©†Rm¯ïBÿ‰=¤r½³^£á¯©ýÖµåÄÜ™~ös•ì=ëÎXºUê8Ñ_¯ËúüO§§MÕ¥5Ë'ouèÝöqOVŸmïò;áÖ”’V?F¬w!}sNɤäcaTäðpiÇ9xïL.ÁI%U{×âCek"èûîîÁh×+(AÉ Ôuí\¸š“§MÎmÿ[ö.ùÞ­%Ý»%êÈ~(øþÛeØ3NaûÉÛåÝ8 }zƒùW”xCSßv†+Œ3·$à9Îr~”—ÑßÞÍ-¼öÑIãl×Î99eê1ÐñèjMBÆò+£uqäÍq0¥ÏL.:`vÀ⸲¼./^8…Îow³òòKú¹¯Ç.úºÁáës½öV½¬ß5îíeʬ՞Ž÷¿¦ØÚý¡d zŠtÚ4yÎìŸzäVêîÂÑ6^\l9%UÁ=sëïZVRb´ÜÜË>9¼›TsßœŸÒ¾†µ\|/RÑNß>Çå2ÚÐnQž46E„Q-ŽÖôÅ[‡EÆS<úÖœï<ßiiw vŒÁôâ»B‘î/ÿëö¬ž?\Ó•ŸUæyXéVÃu»3¿áe2=3×üóU³"ÜU‹ì3]6«8òâŽþIÀúV=ÌÓB¤V‰"¼Å˜ãdù£$×mŽ 8ªóÕ³2M8…ÆXú Õ)-IÞ˜¢¯‹Ü9 ŽÃÔ€*hn —!Šýq^œ3îÕGóyç•Ü=ÊçÞŸn«S[ýªhß;džÒ(•±€v°ÎïJ—÷PÜGic§ì?4“ã<;õëD‘ßFŒ³E ¢V-õêâ¿—fU½i;÷wÿ7øŸ¢âsÚÓ©(Fm«+>gÓ®Š+Ëá]÷»u’8'Vk(¯—kK)@sÓ§äïÜç¯ø`›Ë81nì$fcß¹5bI,×jÈбçs«ß(5=ÕþŒä"ÈyÎCâ³u³Û}FÌ'ž²D„ŸœóÏÿª©h· ö­ ¼lª˜Ç˜9š-[kŸ³‘ [¹Üòž èy«úÞ")Ò‹²NëW÷éÔòåFÎI½VÄë®Ä×MØå9ƒÆãÉ«7W[µ”å:—s—5·ÿ3‹•RÅÁÊ]4oO¼õ·¸kÉÄÑÉ…=”j’0·B¤/®8Íy•…Ö¡kr4èØZnÉ $tϯëZÖ:¶².…ÙY¢ÇWolúý)sÓM_eù=["•6œ$šZ¯OËñ6¼Ðϸ 3ïW-ãʱê}«*ÞöÚGØ]Q»s‘Þµ ]Ñ~ì¯>ƒ¯5ìJ½9Ó÷Ë^Œ©­UŠW˜V;±ŸZ‚)‰|ÌûŠ}ÆK`åHõªÁTIŒ’~™¯R®™Ó¹KD¡C‹VlÕ9ng#ÙŽêl´©¦ÿÀk:T†àî‹'ØV8\KZÍ]\ª9¾$gï 71,}Ȧ’¤þíN}š­¼*§•Ü}ê´pîÿõâ½ÚX¸µs¶2[œ®£-ÅÄ ‹‰JàúúÖD0D.;ùZÙd'k·#žA[Ïc¥Û8’rÊVçùz­–Ò‰Ù/G“6Ð艀vôïëè+ã0Ø—€¡*t·zÞßðþ§Ùa±Tbš“qž©k{h—MívöZÙìKÓc=ó觨 Ñ®',"a´t'9«_Ùª°Ël'¦ÇÍ RFx=Gàj(õ94ù"‰¤H8|»©ïõ©¡œâý£ŒîrªÕš½)ó?5ù#ðëªæ[„ÈôZ©z-¬. Gùã¶æs —#¹õÑEtüô<0¬-BÄÜê#PŠx‘×;‹F@`Aò¢¦iZwR–šùkÓoëÈÏŠr®¾²ýÞ¿Òkó^¨O=ÇØÂã¹CƒúÕ}ED6\+y`€W¡ €sF…pæV†êÖ91ŽY~cÔ÷­y¶6L‹ž¥·cÖ¹':ªKšW&mѨ“ÿ3"Æêú[DiB9ÜÎy5wíÂGHÈ| VõëT “$¯ýœ#¸'\ÈÃiÇ8ýA­{4vˆ$¤FÿÄþU59Úæ“·–Úëªp´¢Ó¾¶íäÑ…d×1DVfŠ6ÁEvÜËëÈQü«FxoMƒ¤·d`f~:çÒ«ë§\N-Zä@àòc' #ÓÒ§ÓËÚÁåÈíqò €÷ë÷¿Ï§5ÎÞ·ØÖ¬Üßµq³nöµ¾ëiò*FékµÊF’ÿÄ›¿ÀÆG@=óZ‘I"Ä'·N¸ÆèO¹îMQñèX•ZØÉŒ¦ÓÛ<â“G/öa%¤›#=·{Ÿ^}jé«/mÖÿסu¥,D}½O‰ï~¿ð>¢xª5’Xng¶vnD‡;¸BóÒ¬XÚÇ4*ÖùÇ<Áëõ¨5æ½–$’ÚHÔ©9ÚÄúÜzÔºe¼³Fd¼Å»ŽåzýåCåt½îŸ¤#%‡Œž–ù•oí¯tûÂѧœ³ÿ¬‹o\3ë׊»¼Ÿ)®º†5Mî-¥¼I~Ò“ZžDŽù^ç­N|Ä-5¥ê3Ÿá<ƒøþ}i²­åž×û"ÝD¿x«GNÄc©ý*M!m$:Ö?÷¶ õœš’æþ¾f5%J΢_—üº¼·‰cûH¹ùÇ¡üªfxm@Ç’‡øÚRéLÕãºÓ`}B Re\ ÊÇ qøœþUsJ-{k«u·?Ä’&纜z ÁÎ Ÿ2~§$§GÚ/‚öv¾ï§õqë-ÅÃ,†ût|á’ ØíÔâ«]Ý}–P\\úhbùz{}EA­éÑé×1ÝXBR0q&Ž€ ©5¿p” "z·=þµŒ±4à”á·m?CžuéÓŒf•ÓòH¸²“Tµxb¸¶>ucÈíøU}.M_B¿Ž).Æàœù…—€ø¯JÔÑìÆî}¯û–ÚQqÈàçõ­ ›A2+\Œäq“øàâ…‰Ÿ´÷ü‚xÛóQ²p}ב§iz·Y3òÎå gü5cÛ>ø¤'‚;ÕM¶ì¥R&SßÏ銒ÌÇo _/ÔûÿzØ ^"U¡áÏ dÜ~âΣ+G…;ÉœšÌŠ]‡s6öéZ:”k>‘ÏZÊ10,¤àûWÒ`ù'FÄЂP³5 š9 ¸g¸šYm•WrdýEc#:Žß_²½š5æFdô¨«†©OZlr¤ã¬NÅWpy(ñm:ç+\cŽ} Oá—Žx8„ª!óÔŸZ—Pµ‚æÇ72[Iq(Ë`09<ãõ®wH¿nœ;4Cïe7p01Ï=q_7M:´åñ'÷öü¾¥„xœºÔÒºok_K7u{ìÖ»om»QC 9ÝêùôÇJ†[k — 2BrLÔB{_$;#8=È9þT}¦l²½àŸÂ°Œl|ú¥8»ê\¶XË¢ã8ÈÀ¬s.óѺ÷ÇJÏÖ ^8Ù)Hé°xÕVÖxìÛo–e?Þl®?_z•NU!}žâ ¤´—bæŸas b{…eì£çMŸY·µ¾ó+*ÿ|dƒÆzâ®ýºÞ9$a¶@T#v~l.kÛ÷“0—JIKB£òÈ«‚s“sÙ^†”£íy§UiòF´Úu½Ô¾jZ³†ìªÞ¡ììñG_á8'¨ª2 ;Ef’Eÿpð9úûÔz€[å…¤vhÓvð¯‡lã tô¬Zm+=éBU*AIû·ÝݯÀe¬ú„êb¾_!GG1’à«FÑ!û?˜n÷EçÜÖ6Ÿ›$ùÿé½O{ïëWÆ«…Œ[QÆ>U\w­+Û^]‹ÄR“»Žž[~7f5»¡‘K“iŸÝ´*Ï«O¯5ÔXHñ€E…§—Ûž?3\¬:…¹¾1Ê™ÀÏÆë{ÙᕾóާÇNêxmî=®¦fõpNjâÍ<˞ġÇéD—1·ú“3‘è¼SUcË}úãåQKb­¤•6Í@/N?¥ ·òÐ €wÎ)êB¥dŠPGRV„šáÁhŒaGnI¬ÝhAn?¬ÕqH‘Qê8îNjhXŠŸb9?UŽI$†N}#õ§ZÆIÞH#¾I$þ•”ñ="Œ'Rs.Æ[†DÊ÷Ûƒ­i[&áŸ(çYvÁã;šÁþß^ø­8îp¥°œùšç”q6Ðã­N¤¶-E Œ‰óŒ‚Ʋt-(Ù]Ï!l8'±ÏAW ÐYT1?ÄÜÿ:Hæ‘*ÊR?*Òžv|ÒÜTèUQ”z2ì°·—´l9êIÿ£¥Øý‚ 9Ú}WÜŸëëHåË…eçñÿ xQ"mv?@s[GN1µïq¬?,lÞŒšæ8e_*fivÇãO2àd* ±œUTˆ#üÌç=‰æ­"IÐ/½j¨R†‰ P„RB ]‡È؉çúSâS»çãÛ5*ÀT†gÀ?ÞZš"±ƒ‚‡=Šæ” ßÂsTª’÷QÂAÞO_SOž#ëƒê1Ng.2xõ?ኂï_s¨fSŽ‹ŠŸoì÷g?3z¶J²0/Ì}Î?­2UVo65ÙëÇ«§h“HºHGv|…ÓÒ¯Een€ E”ªÀÓéõ¬_ÒÂËM|Ž ¸ÚQvެãçƒd¥œœsIøÛn^Ù®ÆO O2³,¨“Á{ž}sº–•si)IQ”‡Ö¾Ï.Í(ãi¦ŸÞoCJ·º™Ï¬2[Þ¸T œ2²Œ`õý+‹½³}>æ[2ñ9ˆŒ:çž=z×cq;Ë&ó$Ž„“Yž#ö4ºWhÿåœàK€q¹ÿúÕò°œéÕMý­¯O×ï>ë#¯ìñ*5”´~½;ú6 b-¾Z§FIõ=ë¡þϽ¡’MœänášåÝÔ(Ì(Çï¨Sϧֺý/V˜Â$_0°ëòñÔÖø™òÞKC\ó*-V¢•žûhÿá‡>!OÞ³0ïºCŸÒˆ¾hWU†æ8§K¨^ ÅÖGSŒíªÐ†‘ƒ\HÊ;|Àç^|ª¾WyŸ6§U­eoB®©%½—ËÄsvÁÎz{ú÷6s#4+¾==ýjψ¢—x•J¼l@¼t¦ž³te6õ_?‘éѧJxIM½V¿ð¢âE™È<•{“øÔj×Álzñ«QÆÞc4GrŒaS­5¤%pªñØœúV?YšHò•TôHÂñ*\=°ýÂùH2[nñÎ?µ[ÃFYâò™åcüJ‘«×$óøø×E«<—a™Y“$( q‘œñíXºº»=ÓÆ˜Œy1…‚:ŠxZ’xy©-žOc‰‡Ôg§½²íë¾ÿ&µ}‘vkh '˜ÄuP@þY¦Å1ÌV;xÛ=q“úÕÅDòÉ Û‡L‚*’¹ƒïóõ¨J½DãÓî<õíj-[0µœÜ‹V–Qx‹;Wס8ëÍj­ËÍ!yR=ÇØ"þ@ð§ÝÛGq"»~QŠ–ÚKã nÕÒ°õeN)ô=™«±£n Nz¢,…Ž0Ävæ®8}YÇ:Rº)4;Ûz«èqåJmd$¸t?˜ÇåÅ\9Á%‡çÒ¥Žb쯯JÑa#ÕšrÆ(¡‹9ËHÃØ YŠÆ8Îs¸úa´^zçÞ¤hUºœ{`T°°ìbëA2¢A¾ã‚{óM*]°¿&:ã85¥'#ƒRù+Ô©_^m QC7ŠQØÍH˜œ©Éî«I mù“ߌU— ¡E+·åàB*jEÛC)b¥"¢Û`r8þî8¦=¹1j°PWwÔ“L}¸+&î{‚MrK™=Æ«Éõ"Gf§àÇ4øŽæàÿãÇ4Š…ŒŸz˜YÎü¤m»¿QýjXÇvg:ÑîM‘ƒ¹ÇN3W-Õf?êóŸE¦Zir0ýìgpõl Û²Št²ãoU@;ýO½pÖÌèRÝžN'ü.ì¥;H ®Ðz1W¡ÒT¾vîÏmàcõ­u":´VäÆÞvä~=ÅX‰o¯È‹'^wà¾ÞÕæTÎ+Uv¡ žEL]f¯¢^¦|:u¢3‘7 epKÓÒ´!Œ¢‘¾óêàööü i[é$‚iäËs÷>£úÕÈ'³„0‰@o~½ÿƲŽ]Æ¿Þ;/#Í«‰sÚòüŒë}*âhÏÚÝv ŸqÓð~8¬-Fc sÃ×üj®þ1Ï©ªo?™¤dz5}_Ô©ë$eÉ:Ÿеw¨Êù‚>¸ʳ.Êλd·è ¥‡;”dµU÷³©Qòã¶ã_]…ÁÒ¦­t©(ü*Ç”#™[Õ¥6«¿RšY°pbr@cŒÇÍuúu¹ŠÍ)[¾ây>”Û­:Ö[ƽgq3òÀ0 1ž•?ÎF Þ'ŸÒ³ÄÓ«ZŒckoÚç©™æ5sGžw{ɽ[~½~òX m+/–÷ÏÏùüi_åÃùjöSó~”ª7d<‘’zîP?¥)D=¿'ùô®hå³oVx~É'«qÃé“,h¦@3-Žr=3YZ™sfŒ\bByÜÇߦl #TË…Àï»ùR£,„l/Òºéeêœ%é'v\&áNÚ1 2dÙWyNY˜¹ÿJcM†ÀÇëÿÖ¤y0Å‹ õÀÍi 8ô&4ü‰Uí£,;ñÍW!PŸ)íŠa•ˆÂž;îÿëÒ+à&O±®ÊxU‘´bÉXÎyü3šÊcûÇ©Æ*«ÐG=xÏò¥2n]„‘úÖË sE‰ËFƒ¡>çšE^Š T-(ØýhVld½ñZ,8Òv»ÆAPÞ†ž7g1ì'Ù…DŽÑœîÏÖœ· œÇÿ­Dé$„ÛèK廨z±íŠ€}«9n’6$o &¥†[©¹ŽÎo®Ò+Ь”7fs润ŠH#v}Ï)|/‘׊ÍZ°1ÇÏ,vòHFû†lvŒäšâxÚqv¹É9G{šFPH/=9§Å“>ÅRsÛ½héK§Á fÓ®d>®BŽÿã[Ñ_¤n<«{+÷ÿÇòk*™¾’÷™ã×Ç8;F79ôÑu Ô~ä€;šdúL–äyó¢²=¿Æ¶åÔ®foštö ¤zzjlLá2±³1èHcÓëôõ¯Ä+ji³›ë¸Ž§>4©fù‘Y—ߥK„ZOž`€utq ¥‹sJCáAƒúoZŽé|öSûÀFy*8ý+Ìy†6»´U…õÊÍÚö+G¦Ú[ñ"ùã·¨ü‡ùÅX†ÞO4=¸Ž"?ƒÌ'?€Ó=jÆÞüîy屎þÔ¾w•Éd ßoÿª<¯ˆøÛ9¤ç.·ìWr¯— XÓœœàwôúUè|?¾67ÉŸFã¿·Ò©K;²çn=÷b‘n&à—$½^·y5š1p­ouØØH-,R8½s»ƇÔäƒÙÆ+,ݲõ9>˜ÍA%ïÊy#>‚¾› —aàµD,,¤ï-M+›íÀe²* .Q×ëÜe°¿ñ0Ýþ°Ÿ©¯jzq^éÖ°Š(ÒYÕñ´qìi«0eŒëT’UËΜg=ƒééUìí°½ž…Ã!9#nG¥BYˆÎGáÍC¹‚c$gÓ½!veÃ>Hì+HÆÃTìÿÙpygame-1.9.1release/test/util/build_page/upload_results/index.py0000644000175000017500000000332011057365076025030 0ustar vincentvincent#!/bin/sh """:" PYTHONPATH=/home/wazoocom/www/pygame/libs exec /home/wazoocom/bin/python $0 ${1+"$@"} """ ################################################################################ # Std Libs import os # User Libs from pywebsite import * from helpers import relative_to, ResultsZip import process_results ################################################################################ def prepare_results_dirs(d): archives_dir = os.path.join(d, 'archives') db_dir = os.path.join(d, 'db') for dir in (archives_dir, db_dir): if not os.path.exists(dir): os.makedirs(dir) ################################################################################ q = cgi.FieldStorage() if q.has_key('results_file'): rz = ResultsZip(q['results_file'].file) results_dir = relative_to(__file__, '../results/%s' % rz.platform_id) prepare_results_dirs(results_dir) if 'test_results_dict.txt' in rz.namelist(): db = ZDB(os.path.join(results_dir, 'db', '%s.fs' % rz.platform_id)) db.root[rz.latest_rev] = rz.eval('test_results_dict.txt') db.close() process_results.process_zip(rz, results_dir) rz.close() print '%s RESULTS UPLOAD SUCCESSFUL' % rz.platform_id.upper() else: print """ Testing
    Send this file:
    """ ################################################################################pygame-1.9.1release/test/util/build_page/upload_results/.htaccess0000644000175000017500000000041411057365076025146 0ustar vincentvincentOptions +FollowSymLinks +ExecCGI AddHandler cgi-script py AuthUserFile /home/wazoocom/secret/.htpasswd AuthGroupFile /dev/null AuthName "Contact the pygame mailing list for a password" AuthType Basic require valid-user DirectoryIndex index.py pygame-1.9.1release/test/util/build_page/results/results.css0000644000175000017500000000235111057365076024221 0ustar vincentvincentbody { margin:0; padding:0; } body h1, body p { margin:10px; } /* Contains the entire tabbed section */ .tabbed { } /* List of tabs */.tabbed ul.tabs { float: left; display: inline; width: 100%; margin: 0; padding: 0; /*background-color: #EEEEEE;*/ border-top:1px solid #006c03; border-bottom:1px solid #006c03; background:#DDDD44; } .tabbed ul.tabs li { list-style-type: none; float: left; margin: 0; padding: 0; } .tabbed ul.tabs li a { overflow: hidden; display: block; margin: 0 2px 0 0; padding: 10px 12px; } .tabbed ul.tabs li a:hover { } /* The current selected tab */ .tabbed ul.tabs li a.tab-current { border: 2px solid black; } /* The content shown when a tab is selected */ .tabbed div { float: left; display: block; width: 100%; padding: 10px; } /* Set the CSS to make sure the other tabs' content isn't shown other than the first .tabbed div.t2, .tabbed div.t3, .tabbed div.t4 { display: none; } */ /* Content for inside your tabs' divs */ .tabbed div ul { } .tabbed div p { } .tabbed div div { }pygame-1.9.1release/test/util/build_page/results/index.py0000644000175000017500000000255611057365076023476 0ustar vincentvincent#!/bin/sh """:" PYTHONPATH=/home/wazoocom/www/pygame/libs exec /home/wazoocom/bin/python $0 ${1+"$@"} """ from __future__ import with_statement import os from pywebsite import * from helpers import * def main(): q = cgi.FieldStorage() platform_id = q['platform_id'].value revision = q['revision'].value which_info = q.has_key('info') and q['info'].value.strip() or 'setup' results_zip = '%s_%s.zip' % (platform_id, revision) rz = ResultsZip('%s/archives/%s' % (platform_id, results_zip) ) tabs, tab_contents = rz.html(which_info) TEMPLATE = """ Build Info for %(platform_id)s

    %(results_zip)s

    builds

      %(tabs)s
    %(tab_contents)s
    """ print TEMPLATE % locals() try: main() except Exception, e: print 'woah woah!'pygame-1.9.1release/test/util/build_page/results/.htaccess0000644000175000017500000000014611057365076023604 0ustar vincentvincentRewriteEngine On RewriteRule ^([^/]+)/([0-9]+)(?:/(.*))?$ index.py?platform_id=$1&revision=$2&info=$3pygame-1.9.1release/test/util/build_page/libs/safe_eval.py0000644000175000017500000000441411057365076023537 0ustar vincentvincentimport compiler import unittest class Unsafe_Source_Error(Exception): def __init__(self,error,descr = None,node = None): self.error = error self.descr = descr self.node = node self.lineno = getattr(node,"lineno",None) def __repr__(self): return "Line %d. %s: %s" % (self.lineno, self.error, self.descr) __str__ = __repr__ class SafeEval(object): def visit(self, node,**kw): cls = node.__class__ meth = getattr(self,'visit'+cls.__name__,self.default) return meth(node, **kw) def default(self, node, **kw): for child in node.getChildNodes(): return self.visit(child, **kw) visitExpression = default def visitConst(self, node, **kw): return node.value def visitDict(self,node,**kw): return dict([(self.visit(k),self.visit(v)) for k,v in node.items]) def visitUnarySub(self, node, **kw): return -self.visit(node.getChildNodes()[0]) def visitTuple(self,node, **kw): return tuple(self.visit(i) for i in node.nodes) def visitList(self,node, **kw): return [self.visit(i) for i in node.nodes] class SafeEvalWithErrors(SafeEval): def default(self, node, **kw): raise Unsafe_Source_Error("Unsupported source construct", node.__class__,node) def visitName(self,node, **kw): if node.name == 'None': return None if node.name == 'True': return True if node.name == 'False': return False raise Unsafe_Source_Error("Strings must be quoted", node.name, node) # Add more specific errors if desired def safe_eval(source, fail_on_error = True): walker = fail_on_error and SafeEvalWithErrors() or SafeEval() try: ast = compiler.parse(source,"eval") except SyntaxError, err: raise try: return walker.visit(ast) except Unsafe_Source_Error, err: raise class SafeEvalTest(unittest.TestCase): def test_False(self): print safe_eval('True') if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/util/build_page/libs/process_results.py0000644000175000017500000000204711057365076025051 0ustar vincentvincentfrom __future__ import with_statement import os from pywebsite.escape import ehtml from helpers import relative_to, norm_le from build_client.helpers import create_zip def process_zip(rz, results_dir): ######################################################################## # Dump out results and installer for /index.php # installer_name = rz.installer txts = ('prebuilt', 'buildresults') for f in (f for f in txts if f in rz.namelist()): fname = relative_to(__file__, '../%s_%s.txt' % (f, rz.platform_id)) with open(fname, 'w') as fh: fh.write(rz.read(f)) if installer_name: with open(relative_to(__file__, '../%s' % installer_name), 'wb') as fh: fh.write(rz.read(installer_name)) ######################################################################## # Archive The Text # archive_zip = os.path.join ( results_dir, 'archives', '%s_%s.zip' % (rz.platform_id, rz.latest_rev) ) rz.archive_text(archive_zip)pygame-1.9.1release/test/util/build_page/libs/helpers.py0000644000175000017500000000432111057365076023251 0ustar vincentvincent################################################################################ import re import zipfile from os.path import normpath, join, dirname, abspath import safe_eval from build_client.helpers import create_zip from pywebsite.escape import ehtml def relative_to(f, rel): return normpath(join(abspath(dirname(f)), rel)).strip() def slug(s): s = s.strip().lower() s = re.sub('[^a-z0-9-]', '-', s) return re.sub('-+', '-', s) def norm_le(s): return re.sub('\r\n|\r', '\n', s) ################################################################################ class ResultsZip(zipfile.ZipFile): def __init__(self, *args, **kw): zipfile.ZipFile.__init__(self, *args, **kw) self.config = self.eval('config.txt') self.text_files = set(t for t in self.namelist() if t != self.installer) @property def installer(self): if 'prebuilt' in self.namelist(): return norm_le(self.read('prebuilt')).split('\n')[2].strip() def eval(self, key): data = norm_le(self.read(key)) return safe_eval.safe_eval(data) def __getattr__(self, attr): return self.config[attr] def archive_text(self, path): create_zip(path, **dict((k, self.read(k)) for k in self.text_files)) def html(self, the_main): all_tabs = [] slugs = [] for i, f in enumerate(sorted(self.text_files)): fslug = slug(f) all_tabs.append ( "
  • " "%(f)s
  • " % locals() ) if fslug == the_main: contents = ehtml(self.read(f), 'utf-8') contents = "
    %s
    " % (i, contents) return '\n'.join(all_tabs), contents ################################################################################ __all__ = ['relative_to', 'slug', 'ResultsZip'] ################################################################################ if __name__ == '__main__': rz = ResultsZip('results.zip') rz.printdir() print rz.platform_id rz.dump_file('bla.zip')pygame-1.9.1release/examples/macosx/aliens_app_example/English.lproj/aliens.icns0000644000175000017500000001610410021236243030043 0ustar vincentvincenticnsDich#HÀààààððààðþÿÿÀÿÿàÿÿðÿÿøÿÿÿþÿÿÿÿ€ÿÿÿÿÀÿÿÿÿðÿÿÿÿðÿÿÿÿø?ÿÿÿÿü?ÿÿÿÿüÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿüÿÿÿÿü?ÿÿÿÿü?ÿÿÿÿøÿÿÿÿðÿÿÿÿàÿÿÿÿ€ÿÿÿÿÿÿÿüÿÿðÿÿà?ÿà‡ààÀÀààààððààðþÿÿÀÿÿàÿÿðÿÿøÿÿÿþÿÿÿÿ€ÿÿÿÿÀÿÿÿÿðÿÿÿÿðÿÿÿÿø?ÿÿÿÿü?ÿÿÿÿüÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿüÿÿÿÿü?ÿÿÿÿü?ÿÿÿÿøÿÿÿÿðÿÿÿÿàÿÿÿÿ€ÿÿÿÿÿÿÿüÿÿðÿÿà?ÿà‡ààÀih32ì‘•ÛÛ¯W§GÀÝÒЧr¥AžïààÛÌ‹¥UÆõèßÝÐ¥U¹óá×ÒÁ~£ lçàØÔÕÓÅk-¢ ƒ²êØÕÑÐѲ@£8vÒÜÓÓÁo¦^Ôåר´y¥ N¼ÑÈÅ·{3 ([µ®º¹¦ ®¼®¯»@ œ mÁÑÉÅź¨£ª¹ÅÉнJ 1˜^̹¿ÀºŠŸ·º¹¿ÂÊ¢—Â]?–eʳ˜Ž‘–ŸœŽ“™œªµ¹ÃÀÍŠW“:‚»­›‰Ž˜ ƒ{‰™«³±«¥¬¹ÄÇ­. !88{\Jh¥Çµ¤ ™  °¥‹Š†ž˜§¯¬£œ²À¯aMjŠ#CÁÁÓØ¸}©¹§£¨‘z޳ÂÜຖœƒf{”¡›š´ŒqrŽn-‰$–Öýչ{ª¬®±›t{ ¼ÐåôÓž•ŸuLc ¯¡¦•k^ox]X‡'=г¯¹™Y–°¯´¦ue·½š³Ú§ƒ‹¢v^m’©°²ªu¡¸°›—¥C…'pÒ°Ç­:[«·±¶”nSW£¯†®Ó“k~€`ju—ª¯°°qµÀ¦¦œ°¢ƒ*ÿƒÈ¸5.gªª¯µŸxW;Gˆ€°ÎžtY!:au¢­¨µ¦=y¦®µ´µ·D‚+RwsxacX.5u§®²·§‡dKFnž‰Z<3Kv˜¨°›˜¯TË¢°Ç¶Èu+^qiZSQd5±¸°´Æ¦pjxshew°®¨œ”ˆ7"‚¼µ¦ªÎl€2„3AOHLIi?\›¼¯±´ ““”“—Ÿ¦¼»³—vw&1,F7]Œ“{j1[¡2SD'Cú¼¼¸ZV—®š„{”—𝏭ž£›P/I!B%(8^WqÊ2 $F´Äª›’¨´k”‹m% K nB8D>eA € ?-ž³…x\C. !w·½ÀµG€ €,q% 3%-3¦ÃÝàÚ×ÔÔÊÁÃ0 ,'  %O& ,'Jf`TX_fpcS;  7UC&)r0 &!  !€ &„ U8# ‚€ >j† me) ƒƒ  ‰p ˆ€€)Ž € ’€ ˜€ œƒ£ƒ¥„©í‘“ÛØªU§GÂßÕÓ£k¥AàÌÖÙ͉¥QÁðäàáÒ¥Q¸ïÞ×ξ}£ Y~¿ÇÌ»°¹«W$¢ l‘º°ºº²©“5£3`¥¬£¢“U¦Nª±¤¦Ša¥ F›£Ÿ—m,  O§«´¬™Žž·«¯´; œ iÁÒËÆ¹¥“•¢¸ÂÉÒµF˜YËÆ€Äºw–°¶º»¿Æœ]5–d˸§š››¢–…‰‘”—ž§®¦¿K“2w½®¢Š}}—zn‚––ˆš¢ ¢ª¢”u* 3!a\>a¥Ç³”yorž§‡‚‚Žhqr|‹™´Ä²bLf‹#7« ²Æ±{ª·”qpba‰´ÆÛãÁš›TP_q~š´ur}t4‰$‰²­ ºÃ}¥Ÿ€wrgz¡¼ÏäóØ£”žuJNh~•¥–pcimb\‡':Àž¦¶‘^’ Œ€~ph·¾—±×¨‡¢yYdkrŒ—ŸxžŸ’‹‡=…'g¸£±«Ga¤—Œ|mVT¤¯…¬Ñ’i€}Y^hkr~Ž©s¶¤Ž‚™’…(xºº´F?o¦”•„rZ?C|®Ë™u\"5[jspoŽ¢Hz™—›“¥I‚+\}‰ŠiGJvž†“|n_D?m›†T87F\fp|y“«^4!Б™´š»y+\€s‡ŒŒ†L58‰¨™yŸuYFG^cUGSur[]y’B#46‰¾®˜ŸËf€(jMV„‹jq.F{œ¢}†dWQPJOHDM…—|dcz3+/HdRqF/4($_( Fj&C]h{~o_§ŒŽ­¢(-F$4[O/@tIWb?qs9! T„0'   -zŠ{t“¡‘?   faL];9mjd?a«–c/%*$./'Zym|»Ç§ %zW5P] )aTK‰% 8…«*U@+,! ^rt‹ÃË§Š°9 ^A1@AS>JV^,=ÐA/&Z³¯X>G+'D4D…€ˆª±‘€°U Z4)+8%7$P6=„Ç«ºÍ–4)' !w¦Ž—ˆ‡|¯0/+-75!0/,.CF* ƒš•n&9%-% PªŸ„zŠŽ©n8(,:€,:7?H<%[naXSA&  )‚¹À¹P($2€,U#-CQ[*8<-`Wdhju‡“‰|x[5 95 ,-$I#)8H/.,2EJ=))BTT?' €  !&"O)ª:(7}A7;  (*1" ,  „ª=( %€  Gt" %†6\'  €   ‰^  † 5' €  ’ ™€ƒ«¦„©í‘“×Ò¨\¦J¾ÙÎͪ}¥AãÔØÚʉ ¤ZÈðçáÜ͇¤S¶ëâÔÇ»y£ 3GsºÀ¯ª£t:¢ ERXk~pSL<,£ 8FC?9211(3¤,QD99>@¤ *K`IAI`f? (U±±¯œ€qu޲«¬²B œoÁÏüª•€€‘¯ÀÄ̵L 0)˜dÆÀ¹¿¾³fˆ«·¸¸¾Æ£fI:5–eɳž•¡–„ˆŒ•¦°­¾Z.4$“+Cº® ˆzpr‘xl}Š{™ž¥«¨ž‚5Œ"P@nbFf©Å¶‘Šp^b—ª…€ƒŽ‹Zddj—¶Æ¹hXwLŠ#AVJX‡«±¸“ebU`‡·ÅÑÕ¶—„jTQ`vµ™‡}‡„Aˆ&,I24%`¯vŸ“nlhiw¡¼ËÜçÌ”b[Zl˜¥›ƒy{wyw?†'?€9 q{a‰”}iyyq„¶¾—­Ð£€Š¤ƒbc]_}ž›cB77<5…(BT?nIv ‹„|yf^§¯†¨Ékbdjfbn|¡v®D %cƒ)x¡©¹Unƒœ‹‹}zjJKz{¤¿n[%@jof^^}ž`N%$#,]O‚+k›¡¦{…„›w|ˆqshNIl’€VAAOYRRbmŒ¡{t]™½;'R!—zg‘‘¤£¤˜z†‚šœˆng™dMA>WZH=GnfGKmŒmgnni’²{N]±p9n„‚ ¦§‰dsˆž›mm}F4/-$#&ldRkphp`^YFs ’•}-Rat…˜–n{V458Czmnš‹jo€odr‡—¦ {fick.+P[bZglW.{h]„k`cr>'YKTmpy~‚r‹Ža=L€žrg^0 \zuYik)`£W)\hR¡1.'/e“U~yrj`baT_kB)$90M…nLVB7Ab[?*\ˆJH¤y,l\‡¥,!žyPR[md[ab\€j/ HH0iŒL\hjrQ G‚09‡{wPŸ5? K€±UO2U[VIGU^„c (3LA.@›]R^iL wz…e”–›s×J>'_µ²siFE\Yg_\k]q|873CN+2 qVK*]zs‚Q 6[›‰“†pª¿¥®ÈŸe`lWY`[XYdnlY~ƒB6'+_°ZT`^wzv…9 o—‘ˆ‚|ª°±˜hdgchm{ohe``fc¬yB9VW^fnggnt|v=€+53“—’‡{qxr`2 )88:Kìèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâ0 pçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ#RÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÄhca„øþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµiÂÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÒ·9úÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝ[(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾<9ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÕSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹Ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹nÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿç"›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ<ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿš¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþA@èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿWÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿdVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá ©ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇ,¾ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³ýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿsF½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚXRÎÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÊÇ8 cüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²"YÎÌáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá9*wz¨ÿÿÿí¥su~Þÿÿÿÿz ´õÍR¨øÿÿÿæ+Ta!Àüÿÿý41²Õ·5pygame-1.9.1release/test/util/build_page/libs/pywebsite/zdb.py0000644000175000017500000000076511057365076024411 0ustar vincentvincentfrom ZODB import DB, FileStorage import transaction class ZDB(object): def __init__(self, path): self.storage = FileStorage.FileStorage(path) self.db = DB(self.storage) self.connection = self.db.open() self.root = self.connection.root() def commit(self): transaction.commit() def close(self, commit=True): if commit: self.commit() self.connection.close() self.db.close() self.storage.close() __all__ = ['ZDB']pygame-1.9.1release/test/util/build_page/libs/pywebsite/helpers.py0000644000175000017500000000043511057365076025266 0ustar vincentvincent# coding: utf-8 ################################################################################ import pprint def pre_print(s): print '
    %s
    ' % pprint.pformat(s) __all__ = ['pre_print'] ################################################################################pygame-1.9.1release/test/util/build_page/libs/pywebsite/escape.py0000644000175000017500000000217411057365076025066 0ustar vincentvincent# coding: utf-8 ################################################################################ import re import htmlentitydefs _escape_re = re.compile(eval(r'u"[&<>\"]|[\u0080-\uffff]+"')) ################################################################################ def _escape_sub(match): try: entity_code = ord(match.group(0)) except Exception, e: print match.group(0) raise named_entitiy = htmlentitydefs.codepoint2name.get(entity_code) if named_entitiy: return '&%s;' % named_entitiy else: return '&#%d;' % entity_code ################################################################################ def escape(uni, codec=None): if codec: uni = uni.decode(codec) return _escape_re.sub(_escape_sub, uni) ehtml = escape __all__ = ['escape', 'ehtml'] ################################################################################ if __name__ == '__main__': print ehtml( '“Gross national happiness is more importantâ€', 'utf-8' ) print ehtml('&&', 'utf-8') ################################################################################pygame-1.9.1release/test/util/build_page/libs/pywebsite/__init__.py0000644000175000017500000000024311057365076025360 0ustar vincentvincent# coding: utf-8 # Std Libs import cgi print "Content-Type: text/html\n" import cgitb cgitb.enable() from escape import * from helpers import * from zdb import *pygame-1.9.1release/test/util/build_page/libs/build_client/upload_results.py0000644000175000017500000000131611057365076027312 0ustar vincentvincentimport multi_part import urllib2 import base64 def post_build(results_zip, url=None): print 'POSTING BUILD, PLEASE WAIT' auth = tuple(open('./config/auth.txt').read().split(':')) theurl = url or 'http://pygame-testify.net/upload_results/index.py' req = urllib2.Request(theurl) base64string = base64.encodestring('%s:%s' % auth)[:-1] authheader = "Basic %s" % base64string req.add_header("Authorization", authheader) opener = urllib2.build_opener(multi_part.MultipartPostHandler) params = { "results_file" : open(results_zip, "rb") } return opener.open(req, params).read() if __name__ == '__main__': print post_build ('output/build.zip')pygame-1.9.1release/test/util/build_page/libs/build_client/update_test.py0000644000175000017500000000542011057365076026566 0ustar vincentvincentimport unittest import os import update import config import helpers def mock_config(*args, **kw): if args: kw = args[0] update.config = config.config_obj(kw) def fixture(f): return open(os.path.join('test_fixtures', f)).read() class HelpersTest(unittest.TestCase): def test_create_zip(self): helpers.create_zip ( 'test.zip', * ('update_test.py', 'update.py' ), **{ 'run_tests__output.txt' : 'test', 'setup_py__output.txt' : 'test', 'build_config.txt' : 'test' } ) helpers.create_zip ('test.zip', 'update_test.py', 'update.py' ) helpers.create_zip ( 'test.zip', 'update_test.py', 'update.py', some_var = 'YEAH' ) class UpdateBuildsTest(unittest.TestCase): def setUp(self): reload(update) def test_can_mock_global_config_object(self): self.assertRaises(Exception, update.build) mock_config ( build_cmd = ['echo', 'mochachino'], src_path = '.', build_env = os.environ, ) update.build() def test_BUILD_SUCCESSFUL(self): ret_code, output = 0, fixture('BUILD_SUCCESSFUL') result, errors = update.parse_build_results(ret_code, output) self.assert_(result is update.BUILD_SUCCESSFUL) def test_BUILD_FAILED_UNPARSEABLE(self): build_output = 'arst' ret_code = 1 result, errors = update.parse_build_results(ret_code, build_output) self.assert_(result is update.BUILD_FAILED_UNPARSEABLE) def test_TESTS_PASSED(self): test_output = fixture('TESTS_PASSED') ret_code = 0 result, errors = update.parse_test_results(ret_code, test_output) self.assert_(result is update.TESTS_PASSED) def test_incomplete(self): self.fail('tests_are_incomplete') def test_BUILD_FAILED(self): pass # self.assert_(result is update.BUILD_FAILED) def test_BUILD_LINK_FAILED(self): pass # self.assert_(result is update.BUILD_LINK_FAILED) def test_BUILD_FAILED_EXCEPTION(self): pass # self.assert_(result is update.BUILD_FAILED_EXCEPTION) def test_BUILD_FAILED_UNKNOWN (self): pass # self.assert_(result is update.BUILD_FAILED_UNKNOWN) def test_TESTS_FAILED(self): pass # self.assert_(result is update.TESTS_FAILED) def test_TESTS_INVALID(self): pass # self.assert_(result is update.TESTS_INVALID) if __name__ == '__main__': unittest.main()pygame-1.9.1release/test/util/build_page/libs/build_client/update.py0000644000175000017500000002410611057365076025531 0ustar vincentvincent################################################################################ # Imports # StdLib import sys import os import re import cgi import cgitb import time import glob import shutil import traceback # User Libs import callproc import config import upload_results from regexes import * from helpers import * ################################################################################ # Results BUILD_FAILED = "Build FAILED, Tests not run" BUILD_LINK_FAILED = "Link FAILED, Tests not run" BUILD_FAILED_EXCEPTION = "Build FAILED, Exception" BUILD_FAILED_UNKNOWN = "Build FAILED, Unknown Errors" BUILD_FAILED_UNPARSEABLE = "Build FAILED, Unparseable Results" TESTS_PASSED = "Build Successful, Tests Passed" TESTS_FAILED = "Build Successful, Tests FAILED" TESTS_INVALID = "Build Successful, Invalid Test Results" BUILD_SUCCESSFUL = "Build Successful" ################################################################################ # Format Strings for errors # Any errors with these keys will have the corresponding values html escaped ESCAPE_KEYS = ('traceback', 'blame_line') FILE_INFO = "%(error_file)s:%(line)s last rev: %(revision)s:%(user)s" FORMATS = { TESTS_FAILED : FILE_INFO + ( '
    %(test)s' # '
    %(traceback)s
    ' ), BUILD_FAILED : FILE_INFO + ( '
    ERROR: %(message)s' ), "BUILD_WARNINGS" : FILE_INFO + ( '
    warning:%(message)s' '
    %(blame_line)s'), } def errors_by_file_4_web(errors_by_file, format, cb = None, join='
    '): format_string = FORMATS[format] web_friendly = [] for error_file, errors in errors_by_file.items(): for error in errors: error.update({'error_file': os.path.basename(error_file)}) if cb: cb(error) for k in ESCAPE_KEYS: if k in error: error[k] = cgi.escape(error[k]) web_friendly.append(format_string % error) return join.join(web_friendly).replace('\n', '
    ') ################################################################################ def svn_blame(error_file): return callproc.GetReturnCodeAndOutput ( ["svn", "blame", error_file], config.src_path, lineprintdiv = 100 ) def add_blame_to_errors_by_file( src_root, errors_by_file, line_func = None): if not line_func: line_func = lambda error: int(error['line']) for error_file, errors in errors_by_file.items(): print "blame for %s" % error_file ret_code, blame_output = svn_blame(error_file) if ret_code is 0: blame_lines = blame_output.split('\n') for error in errors: line = line_func(error) blame = SVN_BLAME_RE.search(blame_lines[line - 1]) error.update(blame.groupdict()) ################################################################################ def categorize_errors_by_file(errors, add_blame = 1): errors_by_file = {} [errors_by_file.setdefault(e['file'], []).append(e) for e in errors] if add_blame: add_blame_to_errors_by_file( config.src_path, errors_by_file ) return errors_by_file ################################################################################ def build_warnings_html(build_output): warnings = [w.groupdict() for w in BUILD_WARNINGS_RE.finditer(build_output)] if warnings: warnings_by_file = categorize_errors_by_file(warnings) return errors_by_file_4_web (warnings_by_file, "BUILD_WARNINGS") return "" ################################################################################ def test_errors(output): errors = [] for error in (e.groupdict() for e in ERROR_MATCHES_RE.finditer(output)): error.update(TRACEBACK_RE.search(error['traceback']).groupdict()) errors.append(error) return errors def parse_test_results(ret_code, output): failed_test = TESTS_FAILED_RE.search(output) errors = test_errors(output) if failed_test and errors: errors_by_file = categorize_errors_by_file(errors) web_friendly = errors_by_file_4_web(errors_by_file, TESTS_FAILED) return TESTS_FAILED, web_friendly elif ( (failed_test and not errors) or (ret_code and not failed_test) ): return TESTS_INVALID, output.replace("\n", "
    ") else: return TESTS_PASSED, '' ################################################################################ def parse_build_results(ret_code, output): # SUCCESS if ret_code is 0: return BUILD_SUCCESSFUL, '' # ERRORS errors = [e.groupdict() for e in BUILD_ERRORS_RE.finditer(output)] if errors: errors_by_file = categorize_errors_by_file (errors) web_friendly = errors_by_file_4_web(errors_by_file, BUILD_FAILED) return BUILD_FAILED, web_friendly # LINK ERRORS link_errors = [ "%(source_name)s:%(message)s
    " % s.groupdict() for s in LINK_ERRORS_RE.finditer(output) ] if link_errors: return BUILD_LINK_FAILED, ''.join(link_errors) # EXCEPTIONS exceptions = BUILD_TRACEBACK_RE.search(output) if exceptions: errors = exceptions.groupdict()['traceback'].replace("\n", "
    ") return BUILD_FAILED_EXCEPTION, errors # UNKNOWN ERRORS error_matches = re.findall(r"^error: ([^\r\n]+)", output, re.MULTILINE) if error_matches: errors = ''.join(["%s
    " % m for m in error_matches]) return BUILD_FAILED_UNKNOWN, errors # ELSE return BUILD_FAILED_UNPARSEABLE, output.replace("\n", "
    ") ################################################################################ def dumped(f): def dump(): dump.ret_code, dump.output = f() write_file_lines('%s_dump' % normp('output', f.__name__), [dump.output]) return dump.ret_code, dump.output dump.__name__ = f.__name__ return dump @dumped def configure_build(): return callproc.InteractiveGetReturnCodeAndOutput ( config.config_cmd, config.config_py_interaction, config.src_path, config.build_env ) @dumped def build(): return callproc.GetReturnCodeAndOutput ( config.build_cmd, config.src_path, config.build_env ) @dumped def install(): return callproc.ExecuteAssertSuccess ( config.install_cmd, config.src_path, config.install_env ) @dumped def run_tests(): return callproc.GetReturnCodeAndOutput ( config.tests_cmd, config.src_path, config.install_env ) ################################################################################ def prepare_installer( build_result): installer_dist_path = glob.glob ( normp(config.dist_path, config.package_mask))[0] installer_filename = "%s_%s" % ( config.platform_id, os.path.basename(installer_dist_path) ) if build_result is not TESTS_PASSED: installer_filename = "failed_tests_%s" % installer_filename output_installer_path = normp('./output', installer_filename) shutil.move(installer_dist_path, output_installer_path) write_file_lines ( config.prebuilts_filename, [config.latest_rev, time.strftime("%Y-%m-%d %H:%M"), installer_filename] ) def prepare_build_results( build_result, build_errors, build_warnings): write_file_lines ( config.buildresults_filename, [ config.latest_rev, time.strftime("%Y-%m-%d %H:%M"), build_result, build_errors, build_warnings] ) create_zip ( config.buildresults_zip, * glob.glob(normp('output', '*')) + config.buildresult_files ) file(config.last_rev_filename, "w").write(str(config.latest_rev)) def post_build(): print upload_results.post_build(config.buildresults_zip) ################################################################################ def prepare_build_env(): for d in (config.dist_path, normp("./output"), config.temp_install_path): clear_or_make_dirs(d) # DUMP CONFIG TO TEXT FILE write_file_lines(normp("./output/config.txt"), [str(config)]) ################################################################################ def update_build(): configure_build() build_result, build_errors = parse_build_results(*build()) build_warnings = build_warnings_html(build.output) if build_result is BUILD_SUCCESSFUL: install() build_result, build_errors = parse_test_results(*run_tests()) if config.make_package: prepare_installer(build_result) print '\n%s\n' % build_result prepare_build_results(build_result, build_errors, build_warnings) post_build() ################################################################################ # Debugging def debugging(f): def wrapped(): try: f() except: config_dump = getattr(config, 'htmlDump', '') config_dump = config_dump and config_dump() html_formatted_info = "%s
    %s" % ( cgitb.html(sys.exc_info()), config_dump ) dump_and_open_in_browser ( html_formatted_info ) # TODO: email breakage info to maintainer raise return wrapped ################################################################################ @debugging def main(): """ All configuration done before hand in config.py. + ini files Treat config as readonly from here on in. """ global config for config in config.get_configs(sys.argv[1:]): if config.previous_rev < config.latest_rev: prepare_build_env() update_build() else: print 'Revision already built for %s' % config.platform_id if __name__ == '__main__': main() ################################################################################pygame-1.9.1release/test/util/build_page/libs/build_client/regexes.py0000644000175000017500000001301011057365076025701 0ustar vincentvincent################################################################################ import re def Regex(string, test, flags=None): if flags: regex = re.compile(string, flags) else: regex = re.compile(string) assert regex.search(test) return regex ################################################################################ # ================================= # = UNIT TEST REGULAR EXPRESSIONS = # ================================= UNITTEST_ERRORS_TEST = r""" loading event_test .......F... ====================================================================== FAIL: EventModuleTest.test_set_blocked ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\PyGame\trunk\test\event_test.py", line 65, in test_set_blocked self.assertEquals(should_be_blocked, []) AssertionError: [] != [] ---------------------------------------------------------------------- Ran 11 tests in 0.511s FAILED (failures=1) """ ################################################################################ # ERROR_MATCHES_RE # # re.VERBOSE won't work with this particular expression string = ( r'^' r'(?P(?:ERROR|FAIL): [^\n]+)' r'\n+-+\n+' r'(?P(?:[^\n]+\n)+)' r'\n' ) ERROR_MATCHES_RE = Regex(string, UNITTEST_ERRORS_TEST, re.M) ################################################################################ # TRACEBACK_RE string = r'File "(?P[^"]+)", line (?P[0-9]+)' TRACEBACK_RE = Regex(string, UNITTEST_ERRORS_TEST, 0) ################################################################################ # TESTS_FAILED_RE TESTS_FAILED_RE = Regex ( "FAILED \([^\)]+=([0-9]+)\)", UNITTEST_ERRORS_TEST) ################################################################################ # ================================== # = SUBVERSION REGULAR EXPRESSIONS = # ================================== SVN_BLAME_TEST = r""" 1440 akalias shutil.move(installer_dist_path, installer_path) 1440 akalias 1440 akalias temp_install_path = os.path.join(os.getcwd(), "install_test") 1440 akalias if os.path.exists(temp_install_path): 1440 akalias cleardir(temp_install_path) """ ################################################################################ # SVN_BLAME_RE string = ( r'\s*' r'(?P[0-9]+)' r'\s+' r'(?P[^ ]+)' r'\s' r'(?P[^\r\n]*)' ) SVN_BLAME_RE = Regex(string, SVN_BLAME_TEST) ################################################################################ # ================================ # = SETUP.PY REGULAR EXPRESSIONS = # ================================ SETUP_PY_ERROR_TEST = r""" src/font.c:663: error: initializer element is not constant src/font.c:663: error: (near initialization for `font_builtins[3].ml_doc') src/font.c:663: error: initializer element is not constant src/font.c:663: error: (near initialization for `font_builtins[3]') src/font.c:665: error: `DOC_PYGAMEFONTGETDEFAULTFONT' undeclared here (not in a function) src/font.c:665: error: initializer element is not constant src/font.c:665: error: (near initialization for `font_builtins[4].ml_doc') src/font.c:665: error: initializer element is not constant src/font.c:665: error: (near initialization for `font_builtins[4]') src/font.c:666: error: initializer element is not constant src/font.c:666: error: (near initialization for `font_builtins[5]') """ SETUP_PY_WARNING_TEST = r""" c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined src/surface.c: In function `surf_set_at': src/surface.c:582: warning: unused variable `intobj' src/surface.c: In function `surf_get_bounding_rect': src/surface.c:1828: warning: suggest parentheses around && within || src/surface.c:1848: warning: suggest parentheses around && within || src/surface.c:1869: warning: suggest parentheses around && within || src/surface.c:1889: warning: suggest parentheses around && within || """ ################################################################################ # BUILD_WARNINGS_RE && BUILD_ERRORS_RE string = ( r"^(?P[^\(\s]+\.c)" r"(?:\(|:)" r"(?P[0-9]+)" r"(?:\)|:) ?:? %s:? " r"(?P[^\r\n]+)" r"[\r\n]" ) BUILD_WARNINGS_RE = Regex(string % 'warning',SETUP_PY_WARNING_TEST, re.MULTILINE) BUILD_ERRORS_RE = Regex(string % 'error', SETUP_PY_ERROR_TEST, re.MULTILINE) ################################################################################ # LINK_ERRORS_RE string = ( r"^(?P[^\(\s]+)" r"\.obj : error " r"(?P[^\r\n]+)" r"[\r\n]" ) # TODO: TEST LINK_ERRORS_RE = re.compile(string, re.MULTILINE) ################################################################################ # BUILD_TRACEBACK_RE string = ( r"^Traceback \\" r"(?Pmost recent call [a-z]+\\)" r":[\r\n]+" r"(?P.+[^\r\n]+Error:[^\r\n]+)" ) # TODO: TEST BUILD_TRACEBACK_RE = re.compile(string, re.MULTILINE | re.DOTALL) ################################################################################ __all__ = [a for a in dir() if a.endswith("_RE")] ################################################################################ if __name__ == '__main__': for attr in __all__: print "%s," % attr ################################################################################pygame-1.9.1release/test/util/build_page/libs/build_client/multi_part.py0000644000175000017500000000551311057365076026430 0ustar vincentvincentimport urllib import urllib2 import base64 import mimetools, mimetypes import os, stat from cStringIO import StringIO class Callable: def __init__(self, anycallable): self.__call__ = anycallable # Controls how sequences are uncoded. If true, elements may be given multiple values by # assigning a sequence. doseq = 1 class MultipartPostHandler(urllib2.BaseHandler): handler_order = urllib2.HTTPHandler.handler_order - 10 # needs to run first def http_request(self, request): data = request.get_data() if data is not None and type(data) != str: v_files = [] v_vars = [] try: for(key, value) in data.items(): if type(value) == file: v_files.append((key, value)) else: v_vars.append((key, value)) except TypeError: systype, value, traceback = sys.exc_info() raise TypeError, "not a valid non-string sequence or mapping object", traceback if len(v_files) == 0: data = urllib.urlencode(v_vars, doseq) else: boundary, data = self.multipart_encode(v_vars, v_files) contenttype = 'multipart/form-data; boundary=%s' % boundary if(request.has_header('Content-Type') and request.get_header('Content-Type').find('multipart/form-data') != 0): print "Replacing %s with %s" % (request.get_header('content-type'), 'multipart/form-data') request.add_unredirected_header('Content-Type', contenttype) request.add_data(data) return request def multipart_encode(vars, files, boundary = None, buf = None): if boundary is None: boundary = mimetools.choose_boundary() if buf is None: buf = StringIO() for(key, value) in vars: buf.write('--%s\r\n' % boundary) buf.write('Content-Disposition: form-data; name="%s"' % key) buf.write('\r\n\r\n' + value + '\r\n') for(key, fd) in files: file_size = os.fstat(fd.fileno())[stat.ST_SIZE] filename = fd.name.split('/')[-1] contenttype = mimetypes.guess_type(filename)[0] or 'application/octet-stream' buf.write('--%s\r\n' % boundary) buf.write('Content-Disposition: form-data; name="%s"; filename="%s"\r\n' % (key, filename)) buf.write('Content-Type: %s\r\n' % contenttype) # buffer += 'Content-Length: %s\r\n' % file_size fd.seek(0) buf.write('\r\n' + fd.read() + '\r\n') buf.write('--' + boundary + '--\r\n\r\n') buf = buf.getvalue() return boundary, buf multipart_encode = Callable(multipart_encode) https_request = http_requestpygame-1.9.1release/test/util/build_page/libs/build_client/mocks.py0000644000175000017500000000421211057365076025357 0ustar vincentvincent################################################################################ # Imports # StdLib import sys import optparse import os # User Libs import regexes import config import update from update_test import fixture, mock_config from helpers import normp ################################################################################ svn_blame = lambda x: (0, '\n'.join([regexes.SVN_BLAME_TEST.strip()] * 1500)) get_and_brand_latest_svn = lambda x: 0 old_get_platform = config.get_platform_and_previous_rev def get_platform_and_previous_rev(c, cfile): old_get_platform(c, cfile) c.previous_rev = -1 ################################################################################ def skip_svn(): update.svn_blame = svn_blame config.get_and_brand_latest_svn = get_and_brand_latest_svn def force_build(): config.get_platform_and_previous_rev = get_platform_and_previous_rev def run_tests(): mock_config ( tests_cmd = ['run_tests.py', 'sprite', '-s', '-F', '../../output/arstdhneoi.txt'], src_path = 'pygame/trunk', install_env = os.environ.copy(), ) update.run_tests() print update.run_tests.output ################################################################################ opt_parser = optparse.OptionParser() opt_parser.add_option('-c', '--config', action = 'store_true') opt_parser.add_option('-s', '--skip_svn', action = 'store_true') opt_parser.add_option('-f', '--force_build', action = 'store_true') opt_parser.add_option('-t', '--test', action = 'store_true') if __name__ == '__main__': options, args = opt_parser.parse_args() sys.argv = sys.argv[:1] + args if options.skip_svn: skip_svn() if options.force_build: force_build() if options.test: run_tests() else: # Swap out some slow components for quick debugging if options.config: config.main() else: update.main() ################################################################################pygame-1.9.1release/test/util/build_page/libs/build_client/helpers.py0000644000175000017500000000442611057365076025714 0ustar vincentvincent################################################################################ import re import os import sys import time import zipfile import webbrowser ################################################################################ def write_file_lines(filename, line_list): file_obj = file(filename, "w") file_obj.writelines(['%s\n' % s for s in line_list]) file_obj.close() def re_sub_file(file_path, match, replace): content = file(file_path, "r").read() content, count = re.subn(match, replace, content) assert(count > 0) output = file(file_path, "w") output.write(content) output.close() def assert_path_exists(path, description): if not os.path.exists(path): raise Exception("ERROR: can't find "+description+" at : "+path) def cleardir(path_to_clear): for root, dirs, files in os.walk(path_to_clear, topdown=False): for name in files: os.remove(os.path.join(root, name)) for name in dirs: os.rmdir(os.path.join(root, name)) def clear_or_make_dirs(dir): if os.path.exists(dir): cleardir(dir) else: os.makedirs(dir) def create_zip(zip_file, *files, **var): zip = zipfile.ZipFile(zip_file, 'w', compression = zipfile.ZIP_DEFLATED) for f in files: zip.write(f, os.path.basename(f)) for k, v in var.items(): zip.writestr(k, v) zip.close() def dump_and_open_in_browser(string): write_file_lines('temp.html', [string]) webbrowser.open('temp.html') def normp(*paths): return os.path.normpath(os.path.join(*paths)) ################################################################################ def write_stdout(out): sys.stdout.write(out) sys.stdout.flush() class ProgressIndicator(object): def __init__(self, report_every = 1): self.progress = 1 self.report_every = report_every def __call__(self): self.progress += 1 if self.progress % self.report_every == 0: write_stdout(".") def finish(self): write_stdout('\n') ################################################################################ if __name__ == '__main__': pass ################################################################################pygame-1.9.1release/test/util/build_page/libs/build_client/config.py0000644000175000017500000001533111057365076025514 0ustar vincentvincent################################################################################ # Imports # StdLib import os import sys import cgi import re import glob import ConfigParser import pprint import webbrowser # User Lib import callproc from helpers import * ################################################################################ defaults = dict ( ######################################################################## # Paths src_path = normp('./pygame/trunk'), ######################################################################## # Commands # config_cmd = [sys.executable, "config.py"], config_py_interaction = 'Y\nY\nY\n', build_cmd = [sys.executable, "setup.py", "build"], # install_cmd is extrapolated below in configure function tests_cmd = [sys.executable, "run_tests.py"], ######################################################################## # Environments build_env = os.environ.copy(), ######################################################################## # Make make_package = None, ) ################################################################################ class config_obj(object): def __init__(self, init=None): if init: self.__dict__.update(init) def __str__(self): return pprint.pformat(self.__dict__) __repr__ = __str__ def htmlDump(self, open_in_browser = False): html = ( "

    %s

    " "
    %s

    " % ( self.platform_id, cgi.escape(str(self)).replace('\n', '
    ') )) if open_in_browser: config_html_file = '%s_config.html' % self.platform_id config_html = file(config_html_file, 'w') config_html.write (html) config_html.close() webbrowser.open(config_html_file) return html def merge_dict(dest, indict): for key, val in indict.items(): if (key in dest and isinstance(dest[key], dict) and isinstance(val, dict)): merge_dict(dest[key], val) else: dest[key] = val def config_to_dict(config_file): config_data = ConfigParser.SafeConfigParser() config_data.read([config_file]) defaults = set(config_data.items('DEFAULT')) config = {'DEFAULT' : dict(defaults)} for sections in config_data.sections(): config[sections] = dict(set(config_data.items(sections)) - defaults) return config ################################################################################ def update_cmds_with_alternate_python(config): python = config['DEFAULT'].get('python_path') if python: for key in config: if key.endswith('_cmd'): config[key][0] = python def merge_defaults_and_objectify_config(config_file): config = defaults.copy() config_dict = config_to_dict(config_file) merge_dict(config, config_dict) config.update(config_dict['DEFAULT']) update_cmds_with_alternate_python(config) return config_obj(config) ################################################################################ def get_and_brand_latest_svn(src_path): if not os.path.exists(src_path): os.makedirs(src_path) rc, output = callproc.ExecuteAssertSuccess ( ["svn","co","svn://seul.org/svn/pygame/trunk", src_path] ) rev_match = re.search(r"(At)|(Checked out) revision ([0-9]+)\.", output) latest_rev = rev_match.group(3) callproc.ExecuteAssertSuccess(["svn","revert",src_path,"-R"]) version_source = normp(src_path, 'lib/version.py') re_sub_file( version_source, r"(ver\s*=\s*)'([0-9]+\.[0-9]+\.[0-9]+[^']*)'", r"\1'\2-svn"+latest_rev+"'") return int(latest_rev) def get_platform_and_previous_rev(config, config_file): config.platform_id = re.search ( r"build_([^.]+).ini", os.path.basename(config_file) ).group(1) config.last_rev_filename = normp( "./last_rev_%s.txt" % config.platform_id ) try: config.previous_rev = int(file(config.last_rev_filename, "r").read()) except: config.previous_rev = 0 ################################################################################ def extra_flags(flags): return [c for c in flags.split() if c] def configure(config_file): # READ INI FILE c = merge_defaults_and_objectify_config(config_file) # SUBVERSION get_platform_and_previous_rev(c, config_file) # Possibly updated between builds?? Here's a good spot? c.latest_rev = get_and_brand_latest_svn(c.src_path) # WORKING DIR c.working_dir = normp(os.path.dirname(__file__)) os.chdir(c.working_dir) # CONFIG.PY INTERACTION # ini files are parsed as raw strings c.config_py_interaction = c.config_py_interaction.replace('\\n','\n') # BUILD c.build_cmd += extra_flags(c.extra_build_flags) c.install_cmd = c.build_cmd[:] # INSTALLER if c.make_package: c.dist_path = os.path.join(c.src_path, 'dist') c.build_cmd += [c.make_package] # INSTALL / TEST CMDS / PATH c.temp_install_path = os.path.join(os.path.dirname(__file__),"install_test") c.temp_install_pythonpath = os.path.join ( c.temp_install_path, c.test_dir_subpath ) c.install_cmd += ['install', '--prefix', c.temp_install_path] c.tests_cmd += extra_flags(c.extra_test_flags) # INSTALL / TEST ENV test_env = {"PYTHONPATH" : c.temp_install_pythonpath} c.install_env = c.build_env.copy() #TODO rename to test_install_env c.install_env.update(test_env) # RESULTS c.prebuilts_filename = normp("./output/prebuilt") c.buildresults_filename = normp("./output/buildresults") c.buildresults_zip = normp("./output/build.zip") # FILES TO ADD TO RESULTS ZIP c.buildresult_files = [ normp('config', 'build_%s.ini' % c.platform_id), normp(c.src_path, 'Setup'), ] return c ################################################################################ def get_configs(args): search = "./config/build_%s.ini" % (args and args[0] or '*') config_file_list = glob.glob(search) for config_file in config_file_list: yield configure(config_file) def main(): for conf in get_configs(sys.argv[1:]): conf.htmlDump(open_in_browser = True) ################################################################################ if __name__ == '__main__': main() ################################################################################pygame-1.9.1release/test/util/build_page/libs/build_client/callproc.py0000644000175000017500000000463311057365076026051 0ustar vincentvincent################################################################################ # StdLib import subprocess import os import sys # User Libs from helpers import ProgressIndicator ################################################################################ def get_cmd_str(cmd): if isinstance(cmd, str): return cmd else: cmd = [c for c in cmd if c] if sys.platform == 'win32': cmd = subprocess.list2cmdline(cmd) else: cmd = ' '.join(cmd) return cmd def log_cmd(cmd, dir): print "executing:", cmd, 'from dir', os.path.abspath(dir or os.getcwd()) ################################################################################ def ExecuteAssertSuccess(cmd, *args, **keywords): retcode, output = GetReturnCodeAndOutput(cmd, *args, **keywords) if retcode != 0: cmd_line = get_cmd_str(cmd) raise Exception("calling: "+cmd_line+" failed with output:\n"+output) return retcode, output ################################################################################ def GetReturnCodeAndOutput(cmd, dir=None, env=None, bufsize=-1, lineprintdiv=1): cmd = get_cmd_str(cmd) log_cmd(cmd, dir) proc = subprocess.Popen ( cmd, cwd = dir, env = env, shell = True, bufsize = bufsize, stdout = subprocess.PIPE, stderr = subprocess.STDOUT, universal_newlines = 1, ) response = [] progress = ProgressIndicator(lineprintdiv) while proc.poll() is None: response += [proc.stdout.readline()] if response[-1] is "": break progress() progress.finish() return proc.wait(), ''.join(response) + proc.stdout.read() # needed ubuntu ################################################################################ def InteractiveGetReturnCodeAndOutput(cmd, input_string, dir=None, env=None, bufsize=-1): cmd = get_cmd_str(cmd) log_cmd(cmd, dir) proc = subprocess.Popen ( cmd, cwd = dir, env = env, shell = True, bufsize = bufsize, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.STDOUT, universal_newlines = 1 ) print "---------------" response = proc.communicate(input_string)[0] return proc.wait(), response ################################################################################pygame-1.9.1release/test/util/build_page/libs/build_client/__init__.py0000644000175000017500000000000011057365076025771 0ustar vincentvincentpygame-1.9.1release/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/keyedobjects.nib0000644000175000017500000002234210454550201033343 0ustar vincentvincentbplist00Ô Y$archiverX$versionT$topX$objects_NSKeyedArchiver† Ñ ]IB.objectdata€¯p +/3:=?CGagw~€…†‡‹Ž‘“—šžŸ¡¤¨«¬­¯²µ¶·¹¼ÀÃÄÅÇÊÍÑÒÔØÜàáâäçéêìïóôõöùüôýþ  #$%'*-./14789;>ABCEHLOPQSVYZ[]`bcdgjklmprstxz{|ƒ¥¨­®¯²³µ¸¹º½¾¿ÂÃÄÇÈÉÌÍÎÐÔÕ×Ù®ÚÜßàáâ宿êëìíîïðó®ôõ÷úûüÿ®   ® #®#$&)®*+-./2®23568:<gijhlnpqrstvwhixy{whp|}~€ƒ‡‰Šz‹ŒŽ‘r“”•—îïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCU$nullß  !"#$%&'()*[NSNamesKeys[NSFramework_NSObjectsValues]NSNamesValues]NSConnections]NSFontManagerVNSRootYNSNextOid_NSVisibleWindows]NSObjectsKeys]NSClassesKeysZNSOidsKeys\NSOidsValuesV$class_NSClassesValues€ê€€é€ë€ €€Ê€€ˆoÒ,-.[NSClassName€€Ò012YNS.string]NSApplication€Ò4567X$classesZ$classname£789_NSMutableStringXNSStringXNSObjectÒ45;<¢<9^NSCustomObjectÒ0>2_IBCocoaFrameworkÒ@ABZNS.objects €Ò45DE£EF9\NSMutableSetUNSSetÒ@H`¯IJKLMNOPQRSTUVWXYZ[\]^_€ €€€#€(€.€3€9€=€B€G€K€Q€V€[€`€e€j€p€u€y€~€‚€‡ÓbcdefWNSLabelXNSSource€€€ ØhijklmnopqrstuvVNSMenu]NSMnemonicLocWNSTitleYNSOnImageZNSKeyEquiv\NSMixedImage_NSKeyEquivModMask€ ÿÿÿ€ €€€€Ôjxyz{|}VNSName[NSMenuItems€Þ€á€Ÿ€ßXMinimizeQmÓ,‚ƒ„^NSResourceName€€€WNSImage_NSMenuCheckmarkÒ45ˆ‰£‰Š9_NSCustomResource_%NSCustomResourceÓ,Œƒ„€_NSMenuMixedStateÒ45¢9ZNSMenuItemÒ0’2_performMiniaturize:Ò45”•£•–9_NSNibControlConnector^NSNibConnectorÓbc˜e™€€Øhijklmnop›rœtuv€€_Bring All to FrontPÒ0 2_arrangeInFront:Óbc¢e£€"€Øhijklmn¥p¦r§tuv€€ €!Ójy©|ª€¸€¹XPrint...QpÒ0®2Vprint:Óbc°e±€'€$Øhijklmn¥p³r´tuv€%€&]Page Setup...QPÒ0¸2^runPageLayout:Óbcºe»€-€)Øhijklmn½p¾r¿tuv€*€+€,ÓjyÁ|Â€å€æ[Aliens HelpQ?Ò0Æ2YshowHelp:ÓbcÈeÉ€2€/ØhijklmnËpÌrœtuv€0€1ÔjxyÎÏ|ЀÀŀÄZClear MenuÒ0Ó2_clearRecentDocuments:ÔÕbc"Öe×]NSDestination€8€4ØhijklmnÙpÚrÛtuv€5€6€7ÔjxyÝÞ|߀¤€´€¦[Quit AliensQqÒ0ã2Zterminate:ÔÕbc"åeæ€<€:×hijklmÙpèrœtu€;\About AliensÒ0ë2_orderFrontStandardAboutPanel:ÔÕbc"íeî€A€>ØhijklmnÙpðrñtuò€?€@[Hide OthersQh_hideOtherApplications:ÔÕbc"÷eø€F€CØhijklmnÙpúrûtuv€D€E[Hide AliensUhide:ÔÕbc"ÿe€J€HØhijklmnÙprœtuv€IXShow All_unhideAllApplications:Óbce€P€LØhijklmn p r tuv€M€N€OÓjy |€Ò€ÓSCutQxÒ02Tcut:Óbce€U€RØhijklmn prtuv€S€TUPasteQvÒ02Vpaste:Óbce€Z€WØhijklmn p!r"tuv€X€YTRedoQZÒ0&2Uredo:Óbc(e)€_€\Øhijklmn p+r,tuv€]€^ZSelect AllQaÒ002ZselectAll:Óbc2e3€d€aØhijklmn p5r6tuv€b€cTUndoQzÒ0:2Uundo:Óbc<e=€i€fØhijklmn p?r@tuv€g€hTCopyQcÒ0D2Ucopy:ÓbcFeG€o€kØhijklmnIpJrKtuv€l€m€nÓjyM|N€Ù€Ú[Spelling...Q:Ò0R2_showGuessPanel:ÓbcTeU€t€qØhijklmnIpWrXtuv€r€s^Check SpellingQ;Ò0\2^checkSpelling:Óbc^e_€x€vØhijklmnIparœtuv€w_Check Spelling as You Type_toggleContinuousSpellChecking:Óbceef€}€zØhijklmn¥phrituv€{€|UCloseQw]performClose:Óbcneo€€Øhijklmn pqrœtuv€€VDeleteWdelete:ÔÕbcuvw"€ƒ€…€†Ò,-y€„_PygameAppDelegateXdelegateÒ45}~£~–9_NSNibOutletConnectorÒ45€£‚9^NSMutableArrayWNSArrayÒ@„¤¯=…†G‡ˆ‰Š‹ŒŽf×¥‘o’“UÙ±£”•–—_˜f)™É æš»îøo=›œË½IužŸ ™¡¢3£€‰€Š€œ€ €à€“€½€Ï€Î€«€ª€³€â€Æ€€–€À€²€®€Ô€Ö€É€€™€Õ€º€Ì€§€£€Û€µ€èÙhijklm¦n¥pœrœtu§v]NSIsSeparator Úhi©jklmnª p“«rœtuv¬YNSSubmenuXNSAction€‹€ŒTFind^submenuAction:Ójy°|±€Ž€Ò0­2Ò@´`¥›Š”œ‡Øhijklmn“p¶r·tuv€‘€’WFind...QfØhijklmn“p»r¼tuv€”€•YFind NextQgØhijklmn“pÀrÁtuv€—€˜]Find PreviousQdØhijklmn“pÅrÆtuv€š€›_Use Selection for FindQeØhijklmn“pÊrËtuv€€ž_Scroll to SelectionQjÒ45Ïh¢h9ÔjxyÑÒ|Ó€¡€ç€¢XMainMenuÒ@Ö`¥¡£Œ¢‘Úhi©jklmnªˆpÙÝrœtuvØ€¥VAliensÒ@Û`ªæ Ž–øîרhijklmnÙpÝrÞtuv€¨€©^Preferences...Q,Ùhijklm¦nÙpœrœtu§vÚhi©jklmnªÙp—ãrœtuv䀬€­XServicesÔjxyçè|逯€±€°Ò0å2Ò@A`__NSServicesMenuÙhijklm¦nÙpœrœtu§vÙhijklm¦nÙpœrœtu§v\_NSAppleMenuÚhi©jklmnªˆp¥ñrœtuvò€¶€·TFileÒ0ó2Ò@ö`«ž‹•…f’šŸ±£Øhijklmn¥pørùtuv€»€¼SNewQnØhijklmn¥pýrþtuv€¾€¿WOpen...QoÚhi©jklmnª¥pËrœtuv€Á€Â[Open RecentÒ02Ò@`¡É__NSRecentDocumentsMenuØhijklmn¥p r tuv€Ç€ÈTSaveQsØhijklmn¥prtuv€Ê€ËZSave As...QS×hijklm¥prœtu€ÍVRevertÙhijklm¦n¥pœrœtu§vÚhi©jklmnªˆp rœtuv€Ð€ÑTEditÒ02Ò@`«3˜=o)†™Ùhijklm¦n pœrœtu§vÙhijklm¦n pœrœtu§vÚhi©jklmnª pI!rœtuv"€×€ØXSpellingÒ@%`£GU_Úhi©jklmnªˆpo'rœtuv(€Ü€ÝVWindowÒ0)2Ò@,`£f‰™Ùhijklm¦nopœrœtu§v^_NSWindowsMenuÚhi©jklmnªˆp½0rœtuv1€ã€äTHelpÒ@4`¡»[_NSMainMenuÒ457‚¢‚9Ò@9¤¯=¥ I“"o“¥ˆ¥ÙÙ¥ÙÙ £ˆ ¥†I¡¥ ¥“¥ÙŽI o  ˌ٥½ÙÙ¢ ““•‘ ™"Ù¥¥Ùoˆˆ  ˆÒ@;¤¯-Œ½˜‡ž“’Ÿ3Uˆ£oI=×"‰Š‹ _œš†o…›G»)£u ‘™f±¥”Ò@=¤¯->?@ABCDEFGHIJKLMNOPQRQSTUVWXYZ[\]Q^Q_`abcdeQf€ì€í€î€ï€ð€ñ€ò€ó€ô€õ€ö€÷€ø€ù€ú€û€ü€ý€þ€ÿ    Ò0h2Q2[NSMenuItem1Ò0k2Q9Ò0m2Q3Ò0o2R10[NSMenuItem2[NSMenuItem8[NSMenuItem3Ò0Ô2Ò0u2Q6\NSMenuItem12[NSMenuItem4T1111Ò0z2\File's OwnerÒ0ž2\NSMenuItem11Ò0h2Ò02Q8[NSMenuItem7Ñ‚ Ò45„…£…†9VNSNullW%NSNullÒ0ˆ2Q7[NSMenuItem6\NSMenuItem10S121Ò02Q1\NSMenuItem13[NSMenuItem9Ò02Ò0’2Q5Ò@A¤Ò@A¤Ò@–¤¯U‡žN\_ø™“SŒu›šLfÉ•)V"G K¢œfTX¡½=_‘P†YæZ—’¥‹OQ™]”×Wo‰ˆo–Ž3£Iî ^U[…ŠŸJM£±˜URIË»ÙÒ@˜¤¯U™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìí !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn›R«ÀɆ¸Ÿ™£ÆšPWI~|¬²­»V¡¯•´8j¿ gJލµ–:¼‚KQH‹’Á¢ˆ³¤\ƒžS¹‘©Ã°¾O§p'zNMœ½˜%®}o9Ò45DE¢E9^NSIBObjectData#,1:LQVdfJP›§¹ÇÕãêô#.;BTVXZ\^`bdfhknqtw€ŒŽ™£±³¼ÅÐ×éòû !4=HIKT[hnw¨ª¬®°²´¶¸º¼¾ÀÂÄÆÈÊÌÎÐÒÔÖØåíöøúü$2:DO\prwy{}†—žª¬®°²»½ÊÙÛÝßçù 0=?R[`ktŠ“š²ÁÎÐÒóõ÷  (579Z\^`moqz|…Œ™›¾ÀÂÐÒÛê÷ùû   " / 1 3 ? A J T a c e † ˆ Š › Ÿ ¡ ¬ µ Í Þ ì î ð     ( * , . : < E P a c e ‚ „ ‘ š º Ë Í Ï ð ò ô ù   1 3 5 V X Z f l }  ¢ ¤ ­ Æ Ó Õ × ø ú ü þ     # 0 2 4 U W Y _ a j q ~ € ‚ £ ¥ § ¬ ® · ½ Ê Ì Î ï ñ ó þ  ! # % F H J O Q Z ` m o q ’ ” – › ¦ ¬ ¹ » ½ Þ à â ä ñ ó õ +-/PRTcen}ŠŒŽ¯±Îïüþ!#%+-;HJLmov~‘“•ž ´½ÆÍäíô ‘“•—™›Ÿ¡£¥§©«­¯±³µ·¹»½¿ÁÃÅÇÉËÍÏÑö.8ACEJYfhjs|‡¨ª¬´¶×ÙÛåç  =?AZ\}—™¢§¸º¼¾ÇÐÛ +LNP_a†¯±³¼ÍÏÑÓÜå÷ANwy{€‰’©ÊÌÎÒÔõ÷ù,.0<ENQj‹”–·¹»ÆÈåçî<>@ENWn“¸áãåî÷þ')+2;DKp¨ª¬±º½ÉÒ×à]fÃÌ)+-/13579;=?ACEGIKMOQTWZ]`cfilorux{~„‡Š™›§°²»½ÆÉÕáíöÿ(5>KT]_kps|ƒŠ’›©¶ºÃÅÒÞçðòû ºÃpsvy|‚…ˆ‹Ž‘”—𠣦©¬¯²µ¸»¾ÁÄÇÊÍÐÓÖÙÜßâåèëîñô÷úý  !$'*-0369<?BEHKNQTWZ]`cfiloqsuwy{}ƒ…‡‰‹‘“•—™›Ÿ¡£¥§©«­¯±³µ·¹»½¿ÁÃÅÇÉËÍÏÑÓÕ×ÙÛÝßáãåçéëíïñóõ÷ùûýÿ   "'F6././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootpygame-1.9.1release/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/JavaCompiling.plistpygame-1.9.1release/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/JavaCompiling.plis0000644000175000017500000000042610454550201033611 0ustar vincentvincent JavaSourceSubpath _MainMenu_EOArchive_English.java pygame-1.9.1release/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/info.nib0000644000175000017500000000106610454550201031623 0ustar vincentvincent IBDocumentLocation 269 494 356 240 0 0 1600 1002 IBEditorPositions 29 125 344 278 44 0 0 1600 1002 IBFramework Version 349.0 IBOpenObjects 29 IBSystem Version 7D24 pygame-1.9.1release/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/classes.nib0000644000175000017500000000046210454550201032324 0ustar vincentvincent{ IBClasses = ( {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { ACTIONS = {}; CLASS = PygameAppDelegate; LANGUAGE = ObjC; OUTLETS = {}; SUPERCLASS = NSObject; } ); IBVersion = 1; }././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootpygame-1.9.1release/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/_MainMenu_EOArchive_English.javapygame-1.9.1release/examples/macosx/aliens_app_example/English.lproj/MainMenu.nib/_MainMenu_EOArchiv0000644000175000017500000001324110454550201033507 0ustar vincentvincent// _MainMenu_EOArchive_English.java // Generated by EnterpriseObjects palette at Tuesday, March 2, 2004 8:45:51 PM America/New_York import com.webobjects.eoapplication.*; import com.webobjects.eocontrol.*; import com.webobjects.eointerface.*; import com.webobjects.eointerface.swing.*; import com.webobjects.foundation.*; import javax.swing.*; public class _MainMenu_EOArchive_English extends com.webobjects.eoapplication.EOArchive { PygameAppDelegate _pygameAppDelegate0; public _MainMenu_EOArchive_English(Object owner, NSDisposableRegistry registry) { super(owner, registry); } protected void _construct() { Object owner = _owner(); EOArchive._ObjectInstantiationDelegate delegate = (owner instanceof EOArchive._ObjectInstantiationDelegate) ? (EOArchive._ObjectInstantiationDelegate)owner : null; Object replacement; super._construct(); if ((delegate != null) && ((replacement = delegate.objectForOutletPath(this, "delegate")) != null)) { _pygameAppDelegate0 = (replacement == EOArchive._ObjectInstantiationDelegate.NullObject) ? null : (PygameAppDelegate)replacement; _replacedObjects.setObjectForKey(replacement, "_pygameAppDelegate0"); } else { _pygameAppDelegate0 = (PygameAppDelegate)_registered(new PygameAppDelegate(), "PygameAppDelegate"); } } protected void _awaken() { super._awaken(); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(_owner(), "unhideAllApplications", ), "")); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(_owner(), "hide", ), "")); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(_owner(), "hideOtherApplications", ), "")); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(_owner(), "orderFrontStandardAboutPanel", ), "")); if (_replacedObjects.objectForKey("_pygameAppDelegate0") == null) { _connect(_owner(), _pygameAppDelegate0, "delegate"); } .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(_owner(), "terminate", ), "")); } protected void _init() { super._init(); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "undo", ), "")); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "paste", ), "")); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "arrangeInFront", ), "")); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "copy", ), "")); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "showHelp", ), "")); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "clearRecentDocuments", ), "")); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "selectAll", ), "")); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "performMiniaturize", ), "")); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "toggleContinuousSpellChecking", ), "")); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "print", ), "")); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "cut", ), "")); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "runPageLayout", ), "")); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "checkSpelling", ), "")); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "delete", ), "")); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "redo", ), "")); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "performClose", ), "")); .addActionListener((com.webobjects.eointerface.swing.EOControlActionAdapter)_registered(new com.webobjects.eointerface.swing.EOControlActionAdapter(null, "showGuessPanel", ), "")); } } pygame-1.9.1release/test/util/build_page/libs/build_client/test_fixtures/TESTS_PASSED0000644000175000017500000000034711057365076030472 0ustar vincentvincentloading sprite_test ....................................................................................................... ---------------------------------------------------------------------- Ran 103 tests in 0.120s OK pygame-1.9.1release/test/util/build_page/libs/build_client/test_fixtures/TESTS_INVALID0000644000175000017500000000000011057365076030563 0ustar vincentvincentpygame-1.9.1release/test/util/build_page/libs/build_client/test_fixtures/TESTS_FAILED0000644000175000017500000000000011057365076030421 0ustar vincentvincentpygame-1.9.1release/test/util/build_page/libs/build_client/test_fixtures/BUILD_SUCCESSFUL0000644000175000017500000016050311057365076031130 0ustar vincentvincentWARNING, DLL for tiff library not found. running build running build_py creating build creating build\lib.win32-2.5 creating build\lib.win32-2.5\pygame copying lib\colordict.py -> build\lib.win32-2.5\pygame copying lib\cursors.py -> build\lib.win32-2.5\pygame copying lib\locals.py -> build\lib.win32-2.5\pygame copying lib\macosx.py -> build\lib.win32-2.5\pygame copying lib\mac_scrap.py -> build\lib.win32-2.5\pygame copying lib\pkgdata.py -> build\lib.win32-2.5\pygame copying lib\sndarray.py -> build\lib.win32-2.5\pygame copying lib\sprite.py -> build\lib.win32-2.5\pygame copying lib\surfarray.py -> build\lib.win32-2.5\pygame copying lib\sysfont.py -> build\lib.win32-2.5\pygame copying lib\version.py -> build\lib.win32-2.5\pygame copying lib\_numpysndarray.py -> build\lib.win32-2.5\pygame copying lib\_numpysurfarray.py -> build\lib.win32-2.5\pygame copying lib\__init__.py -> build\lib.win32-2.5\pygame creating build\lib.win32-2.5\pygame\gp2x copying lib\gp2x\constants.py -> build\lib.win32-2.5\pygame\gp2x copying lib\gp2x\locals.py -> build\lib.win32-2.5\pygame\gp2x copying lib\gp2x\__init__.py -> build\lib.win32-2.5\pygame\gp2x creating build\lib.win32-2.5\pygame\threads copying lib\threads\Py25Queue.py -> build\lib.win32-2.5\pygame\threads copying lib\threads\__init__.py -> build\lib.win32-2.5\pygame\threads running build_ext building 'pygame.imageext' extension creating build\temp.win32-2.5 creating build\temp.win32-2.5\Release creating build\temp.win32-2.5\Release\src c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -Ic:/msys/1.0/local/include/SDL -Ic:/msys/1.0/local/include -Ic:/msys/1.0/local/include -IC:\Python25\include -IC:\Python25\PC -c src/imageext.c -o build\temp.win32-2.5\Release\src\imageext.o In file included from C:/Python25/include/Python.h:8, from src/pygame.h:60, from src/imageext.c:31: C:/Python25/include/pyconfig.h:615:1: warning: "HAVE_STDDEF_H" redefined In file included from c:/msys/1.0/local/include/jpeglib.h:24, from src/imageext.c:30: c:/msys/1.0/local/include/jconfig.h:11:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/imageext.c:31: c:/msys/1.0/local/include/SDL/SDL_config.h:67:1: warning: "HAVE_STDLIB_H" redefined In file included from c:/msys/1.0/local/include/jpeglib.h:24, from src/imageext.c:30: c:/msys/1.0/local/include/jconfig.h:12:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/imageext.c:31: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/imageext.c:31: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/imageext.c:31: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition src/imageext.c: In function `opengltosdl': src/imageext.c:356: warning: unused variable `pyopengl' src/imageext.c:356: warning: unused variable `readpixels' src/imageext.c:357: warning: unused variable `typeflag' src/imageext.c:357: warning: unused variable `formatflag' writing build\temp.win32-2.5\Release\src\imageext.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\imageext.o build\temp.win32-2.5\Release\src\imageext.def -Lc:/msys/1.0/local/lib -Lc:/msys/1.0/local/lib -Lc:/msys/1.0/local/lib -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lSDL_image -lpng -ljpeg -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\imageext.pyd building 'pygame.font' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/font.c -o build\temp.win32-2.5\Release\src\font.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from c:/msys/1.0/local/include/SDL/SDL_ttf.h:33, from src/font.h:24, from src/font.c:28: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/font.h:23, from src/font.c:28: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from c:/msys/1.0/local/include/SDL/SDL_ttf.h:33, from src/font.h:24, from src/font.c:28: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\font.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\font.o build\temp.win32-2.5\Release\src\font.def -Lc:/msys/1.0/local/lib -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lSDL_ttf -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\font.pyd building 'pygame.mixer' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/mixer.c -o build\temp.win32-2.5\Release\src\mixer.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/mixer.c:27: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/mixer.c:27: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/mixer.c:27: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\mixer.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\mixer.o build\temp.win32-2.5\Release\src\mixer.def -Lc:/msys/1.0/local/lib -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lSDL_mixer -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\mixer.pyd building 'pygame.mixer_music' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/music.c -o build\temp.win32-2.5\Release\src\music.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/music.c:27: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/music.c:27: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/music.c:27: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\mixer_music.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\music.o build\temp.win32-2.5\Release\src\mixer_music.def -Lc:/msys/1.0/local/lib -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lSDL_mixer -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\mixer_music.pyd building 'pygame._numericsurfarray' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/_numericsurfarray.c -o build\temp.win32-2.5\Release\src\_numericsurfarray.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/_numericsurfarray.c:23: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/_numericsurfarray.c:23: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/_numericsurfarray.c:23: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\_numericsurfarray.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\_numericsurfarray.o build\temp.win32-2.5\Release\src\_numericsurfarray.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\_numericsurfarray.pyd building 'pygame._numericsndarray' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/_numericsndarray.c -o build\temp.win32-2.5\Release\src\_numericsndarray.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/_numericsndarray.c:23: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/_numericsndarray.c:23: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/_numericsndarray.c:23: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\_numericsndarray.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\_numericsndarray.o build\temp.win32-2.5\Release\src\_numericsndarray.def -Lc:/msys/1.0/local/lib -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lSDL_mixer -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\_numericsndarray.pyd building 'pygame.movie' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -Ic:/msys/1.0/local/include -Ic:/msys/1.0/local/include/smpeg -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/movie.c -o build\temp.win32-2.5\Release\src\movie.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/movie.c:26: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/movie.c:26: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/movie.c:26: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :4:1: warning: this is the location of the previous definition src/movie.c:356: warning: initialization from incompatible pointer type writing build\temp.win32-2.5\Release\src\movie.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\movie.o build\temp.win32-2.5\Release\src\movie.def -Lc:/msys/1.0/local/lib -Lc:/msys/1.0/local/lib -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lsmpeg -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\movie.pyd building 'pygame.scrap' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/scrap.c -o build\temp.win32-2.5\Release\src\scrap.o In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/scrap.c:27: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition In file included from src/scrap.c:63: src/scrap_win.c: In function `pygame_scrap_get': src/scrap_win.c:275: warning: 'src' might be used uninitialized in this function src/scrap.c: At top level: src/scrap.c:62: warning: '_cliptype' defined but not used writing build\temp.win32-2.5\Release\src\scrap.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\scrap.o build\temp.win32-2.5\Release\src\scrap.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -luser32 -lgdi32 -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\scrap.pyd building 'pygame.base' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/base.c -o build\temp.win32-2.5\Release\src\base.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/base.c:24: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/base.c:24: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/base.c:24: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\base.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\base.o build\temp.win32-2.5\Release\src\base.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\base.pyd building 'pygame.cdrom' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/cdrom.c -o build\temp.win32-2.5\Release\src\cdrom.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/cdrom.c:24: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/cdrom.c:24: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/cdrom.c:24: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\cdrom.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\cdrom.o build\temp.win32-2.5\Release\src\cdrom.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\cdrom.pyd building 'pygame.color' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/color.c -o build\temp.win32-2.5\Release\src\color.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/color.c:23: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/color.c:23: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/color.c:23: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\color.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\color.o build\temp.win32-2.5\Release\src\color.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\color.pyd building 'pygame.constants' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/constants.c -o build\temp.win32-2.5\Release\src\constants.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/constants.c:23: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/constants.c:23: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/constants.c:23: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\constants.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\constants.o build\temp.win32-2.5\Release\src\constants.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\constants.pyd building 'pygame.display' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/display.c -o build\temp.win32-2.5\Release\src\display.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/display.c:27: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/display.c:27: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/display.c:27: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\display.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\display.o build\temp.win32-2.5\Release\src\display.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\display.pyd building 'pygame.event' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/event.c -o build\temp.win32-2.5\Release\src\event.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/event.c:27: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/event.c:27: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/event.c:27: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\event.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\event.o build\temp.win32-2.5\Release\src\event.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\event.pyd building 'pygame.fastevent' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/fastevent.c -o build\temp.win32-2.5\Release\src\fastevent.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/fastevent.c:27: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/fastevent.c:27: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/fastevent.c:27: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/fastevents.c -o build\temp.win32-2.5\Release\src\fastevents.o In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/fastevents.c:30: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\fastevent.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\fastevent.o build\temp.win32-2.5\Release\src\fastevents.o build\temp.win32-2.5\Release\src\fastevent.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\fastevent.pyd building 'pygame.key' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/key.c -o build\temp.win32-2.5\Release\src\key.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/key.c:26: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/key.c:26: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/key.c:26: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\key.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\key.o build\temp.win32-2.5\Release\src\key.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\key.pyd building 'pygame.mouse' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/mouse.c -o build\temp.win32-2.5\Release\src\mouse.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/mouse.c:26: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/mouse.c:26: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/mouse.c:26: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\mouse.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\mouse.o build\temp.win32-2.5\Release\src\mouse.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\mouse.pyd building 'pygame.rect' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/rect.c -o build\temp.win32-2.5\Release\src\rect.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/rect.c:27: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/rect.c:27: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/rect.c:27: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition src/rect.c:888: warning: initialization from incompatible pointer type writing build\temp.win32-2.5\Release\src\rect.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\rect.o build\temp.win32-2.5\Release\src\rect.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\rect.pyd building 'pygame.rwobject' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/rwobject.c -o build\temp.win32-2.5\Release\src\rwobject.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/rwobject.c:28: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/rwobject.c:28: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/rwobject.c:28: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\rwobject.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\rwobject.o build\temp.win32-2.5\Release\src\rwobject.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\rwobject.pyd building 'pygame.surface' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/surface.c -o build\temp.win32-2.5\Release\src\surface.o In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/surface.h:27, from src/surface.c:26: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition src/surface.c: In function `surf_set_at': src/surface.c:582: warning: unused variable `intobj' src/surface.c: In function `surf_get_bounding_rect': src/surface.c:1828: warning: suggest parentheses around && within || src/surface.c:1848: warning: suggest parentheses around && within || src/surface.c:1869: warning: suggest parentheses around && within || src/surface.c:1889: warning: suggest parentheses around && within || src/surface.c: In function `surf_get_buffer': src/surface.c:1913: warning: unused variable `format' c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/alphablit.c -o build\temp.win32-2.5\Release\src\alphablit.o In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/surface.h:27, from src/alphablit.c:25: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition src/pygame.h:633: warning: 'PyGAME_C_API' defined but not used c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/surface_fill.c -o build\temp.win32-2.5\Release\src\surface_fill.o In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/surface.h:27, from src/surface_fill.c:20: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition src/pygame.h:633: warning: 'PyGAME_C_API' defined but not used writing build\temp.win32-2.5\Release\src\surface.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\surface.o build\temp.win32-2.5\Release\src\alphablit.o build\temp.win32-2.5\Release\src\surface_fill.o build\temp.win32-2.5\Release\src\surface.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\surface.pyd building 'pygame.surflock' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/surflock.c -o build\temp.win32-2.5\Release\src\surflock.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/surflock.c:28: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/surflock.c:28: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/surflock.c:28: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\surflock.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\surflock.o build\temp.win32-2.5\Release\src\surflock.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\surflock.pyd building 'pygame.time' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/time.c -o build\temp.win32-2.5\Release\src\time.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/time.c:23: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/time.c:23: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/time.c:23: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\time.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\time.o build\temp.win32-2.5\Release\src\time.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\time.pyd building 'pygame.joystick' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/joystick.c -o build\temp.win32-2.5\Release\src\joystick.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/joystick.c:24: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/joystick.c:24: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/joystick.c:24: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\joystick.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\joystick.o build\temp.win32-2.5\Release\src\joystick.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\joystick.pyd building 'pygame.draw' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/draw.c -o build\temp.win32-2.5\Release\src\draw.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/draw.c:26: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/draw.c:26: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/draw.c:26: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\draw.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\draw.o build\temp.win32-2.5\Release\src\draw.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\draw.pyd building 'pygame.image' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/image.c -o build\temp.win32-2.5\Release\src\image.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/image.c:27: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/image.c:27: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/image.c:27: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition src/image.c: In function `opengltosdl': src/image.c:89: warning: unused variable `pyopengl' src/image.c:89: warning: unused variable `readpixels' src/image.c:90: warning: unused variable `typeflag' src/image.c:90: warning: unused variable `formatflag' src/image.c: In function `image_save': src/image.c:223: warning: suggest explicit braces to avoid ambiguous `else' writing build\temp.win32-2.5\Release\src\image.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\image.o build\temp.win32-2.5\Release\src\image.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\image.pyd building 'pygame.overlay' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/overlay.c -o build\temp.win32-2.5\Release\src\overlay.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/overlay.c:27: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/overlay.c:26: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/overlay.c:27: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\overlay.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\overlay.o build\temp.win32-2.5\Release\src\overlay.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\overlay.pyd building 'pygame.transform' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/transform.c -o build\temp.win32-2.5\Release\src\transform.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/transform.c:27: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/transform.c:27: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/transform.c:27: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition src/transform.c: In function `filter_shrink_X_ONLYC': src/transform.c:974: warning: integer constant is too large for "long" type src/transform.c: In function `filter_shrink_X_MMX': src/transform.c:1015: warning: unused variable `x' src/transform.c:1015: warning: unused variable `y' src/transform.c: In function `filter_shrink_Y_ONLYC': src/transform.c:1185: warning: integer constant is too large for "long" type src/transform.c: In function `filter_shrink_Y_MMX': src/transform.c:1244: warning: unused variable `x' src/transform.c:1244: warning: unused variable `y' src/transform.c: In function `filter_expand_X_MMX': src/transform.c:1559: warning: integer constant is too large for "long" type src/transform.c:1526: warning: unused variable `xm1' src/transform.c:1491: warning: unused variable `dstdiff' src/transform.c: In function `filter_expand_Y_ONLYC': src/transform.c:1600: warning: unused variable `dstdiff' src/transform.c: In function `filter_expand_Y_MMX': src/transform.c:1623: warning: unused variable `dstdiff' src/transform.c:1624: warning: unused variable `x' src/transform.c: In function `get_threshold': src/transform.c:1964: warning: 'destpixels' might be used uninitialized in this function src/transform.c:1964: warning: 'pixels2' might be used uninitialized in this function src/transform.c:1968: warning: 'destformat' might be used uninitialized in this function src/transform.c:1968: warning: 'format2' might be used uninitialized in this function src/transform.c: In function `laplacian': src/transform.c:2492: warning: unused variable `total2' src/transform.c:2493: warning: unused variable `total3' src/transform.c:2506: warning: unused variable `format2' src/transform.c:2507: warning: unused variable `pixels2' src/transform.c: In function `surf_average_surfaces': src/transform.c:2845: warning: unused variable `surfobj' src/transform.c:2847: warning: 'newsurf' might be used uninitialized in this function c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/rotozoom.c -o build\temp.win32-2.5\Release\src\rotozoom.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/rotozoom.c:15: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/rotozoom.c:15: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/rotozoom.c:15: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/scale2x.c -o build\temp.win32-2.5\Release\src\scale2x.o In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/scale2x.c:35: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\transform.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\transform.o build\temp.win32-2.5\Release\src\rotozoom.o build\temp.win32-2.5\Release\src\scale2x.o build\temp.win32-2.5\Release\src\transform.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\transform.pyd building 'pygame.mask' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/mask.c -o build\temp.win32-2.5\Release\src\mask.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/mask.c:23: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/mask.c:23: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/mask.c:23: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/bitmask.c -o build\temp.win32-2.5\Release\src\bitmask.o src/bitmask.c: In function `bitcount': src/bitmask.c:314: warning: integer constant is too large for "long" type src/bitmask.c:314: warning: integer constant is too large for "long" type src/bitmask.c:315: warning: integer constant is too large for "long" type src/bitmask.c:315: warning: integer constant is too large for "long" type src/bitmask.c:316: warning: integer constant is too large for "long" type src/bitmask.c:319: warning: right shift count >= width of type writing build\temp.win32-2.5\Release\src\mask.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\mask.o build\temp.win32-2.5\Release\src\bitmask.o build\temp.win32-2.5\Release\src\mask.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\mask.pyd building 'pygame.bufferproxy' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/bufferproxy.c -o build\temp.win32-2.5\Release\src\bufferproxy.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/bufferproxy.c:23: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/bufferproxy.c:23: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/bufferproxy.c:23: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition src/pygame.h:633: warning: 'PyGAME_C_API' defined but not used writing build\temp.win32-2.5\Release\src\bufferproxy.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\bufferproxy.o build\temp.win32-2.5\Release\src\bufferproxy.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\bufferproxy.pyd building 'pygame.pixelarray' extension c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -D_GNU_SOURCE= -Dmain=DL_main -Ic:/msys/1.0/local/include/SDL -IC:\Python25\include -IC:\Python25\PC -c src/pixelarray.c -o build\temp.win32-2.5\Release\src\pixelarray.o In file included from c:/msys/1.0/local/include/SDL/SDL_stdinc.h:28, from c:/msys/1.0/local/include/SDL/SDL_main.h:26, from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/pixelarray.c:23: c:/msys/1.0/local/include/SDL/SDL_config.h:131:1: warning: "HAVE_SNPRINTF" redefined In file included from C:/Python25/include/Python.h:114, from src/pygame.h:60, from src/pixelarray.c:23: C:/Python25/include/pyerrors.h:320:1: warning: this is the location of the previous definition In file included from c:/msys/1.0/local/include/SDL/SDL.h:28, from src/pygame.h:68, from src/pixelarray.c:23: c:/msys/1.0/local/include/SDL/SDL_main.h:50:1: warning: "main" redefined :2:1: warning: this is the location of the previous definition writing build\temp.win32-2.5\Release\src\pixelarray.def c:\mingw\bin\gcc.exe -mno-cygwin -shared -mwindows -s build\temp.win32-2.5\Release\src\pixelarray.o build\temp.win32-2.5\Release\src\pixelarray.def -Lc:/msys/1.0/local/lib -LC:\Python25\libs -LC:\Python25\PCBuild -lmingw32 -lSDLmain -lSDL -lpython25 -lmsvcr71 -o build\lib.win32-2.5\pygame\pixelarray.pyd running install running install_lib copying build\lib.win32-2.5\pygame\base.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\bufferproxy.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\cdrom.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\color.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\constants.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\display.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\draw.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\event.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\fastevent.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\font.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\image.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\imageext.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\joystick.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\key.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\mask.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\mixer.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\mixer_music.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\mouse.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\movie.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\overlay.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\pixelarray.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\rect.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\rwobject.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\scrap.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\surface.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\surflock.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\time.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\transform.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\_numericsndarray.pyd -> C:\Python25\Lib\site-packages\pygame copying build\lib.win32-2.5\pygame\_numericsurfarray.pyd -> C:\Python25\Lib\site-packages\pygame running install_headers running install_data running install_egg_info Removing C:\Python25\Lib\site-packages\pygame-1.9.0pre-py2.5.egg-info Writing C:\Python25\Lib\site-packages\pygame-1.9.0pre-py2.5.egg-infopygame-1.9.1release/test/util/build_page/libs/build_client/test_fixtures/BUILD_LINK_FAILED0000644000175000017500000000000011057365076031173 0ustar vincentvincentpygame-1.9.1release/test/util/build_page/libs/build_client/test_fixtures/BUILD_FAILED_UNPARSEABLE0000644000175000017500000000000011057365076032177 0ustar vincentvincentpygame-1.9.1release/test/util/build_page/libs/build_client/test_fixtures/BUILD_FAILED_UNKNOWN0000644000175000017500000000000011057365076031575 0ustar vincentvincentpygame-1.9.1release/test/util/build_page/libs/build_client/test_fixtures/BUILD_FAILED_EXCEPTION0000644000175000017500000000000011057365076031774 0ustar vincentvincentpygame-1.9.1release/test/util/build_page/libs/build_client/test_fixtures/BUILD_FAILED0000644000175000017500000000000011057365076030356 0ustar vincentvincentpygame-1.9.1release/test/util/build_page/libs/build_client/config/build_py25_exe.template0000644000175000017500000000134511057365076031516 0ustar vincentvincent[DEFAULT] python_path=C:/Python25/python.exe ; Added to the default build_cmd (set in buildpage\config.py) extra_build_flags=--compiler=mingw32 ; Added to the default test_cmd (set in buildpage\config.py) extra_test_flags=-s -F ../../output/test_results_dict.txt ; Sent to trunk\config.py as answers to questions (Y|N) ; eg Y\nY\nY\n translates to Y, Enter, Y, Enter, Y, Enter config_py_interaction = N\nN\nY\nY\n ; Determines which installer setup.py will make make_package=bdist_wininst package_mask=*.exe ; TODO: test_dir_subpath=Lib/site-packages [build_env] ; Anything in this will (be merged with | overide) os.environ ; Can use string interpolation %(var)s from [DEFAULT] ; PYTHONPATH= ; PATH= ; TMP=pygame-1.9.1release/test/util/build_page/libs/build_client/config/build_config.template0000644000175000017500000000127711057365076031327 0ustar vincentvincent[DEFAULT] python_path=C:/Python25/python.exe ; Added to the default build_cmd (set in buildpage\config.py) extra_build_flags=--compiler=mingw32 ; Added to the default test_cmd (set in buildpage\config.py) extra_test_flags=-s ; Sent to trunk\config.py as answers to questions (Y|N) ; eg Y\nY\nY\n translates to Y, Enter, Y, Enter, Y, Enter config_py_interaction = N\nN\nY\nY\n ; Determines which installer setup.py will make make_package=bdist_wininst package_mask=*.exe ; TODO: test_dir_subpath=Lib/site-packages [build_env] ; Anything in this will (be merged with | overide) os.environ ; Can use string interpolation %(var)s from [DEFAULT] ; PYTHONPATH= ; PATH= ; TMP=pygame-1.9.1release/test/util/build_page/libs/build_client/config/auth.txt0000644000175000017500000000001111057365076026631 0ustar vincentvincentuser:pass