From 0bcc558ed52eaf4d868a3fc82b44f37f349efb8e Mon Sep 17 00:00:00 2001 From: Bachir Soussi Chiadmi Date: Wed, 21 Mar 2018 17:06:08 +0100 Subject: [PATCH] added missing module fixer and updated imagecache_actions --- .../all/modules/imagecache_actions/.gitignore | 1 - .../modules/imagecache_actions/CHANGELOG.txt | 142 +- .../all/modules/imagecache_actions/README.txt | 69 +- .../modules/imagecache_actions/ROADMAP.txt | 202 +-- .../autorotate/imagecache_autorotate.info | 11 +- .../autorotate/imagecache_autorotate.install | 28 +- .../autorotate/imagecache_autorotate.module | 279 ++-- .../autorotate/portrait-painting.jpg | Bin 0 -> 158540 bytes .../canvasactions/canvasactions.inc | 1311 ++++++++++++++--- .../imagecache_canvasactions.info | 25 +- .../imagecache_canvasactions.install | 27 - .../imagecache_canvasactions.module | 101 +- .../canvasactions/rounded_corners.inc | 14 +- .../cheap_dropshadow.imagecache_preset.inc | 39 +- .../keyword_positioning.imagecache_preset.inc | 1 - .../positioned_underlay.imagecache_preset.inc | 6 +- .../tests/rotate_alpha.imagecache_preset.inc | 8 +- .../rotate_alpha_gif.imagecache_preset.inc | 8 +- .../tests/rotate_scale.imagecache_preset.inc | 1 - .../rotate_scale_alpha.imagecache_preset.inc | 9 +- .../tests/rounded.imagecache_preset.inc | 6 +- .../tests/rounded_bl.imagecache_preset.inc | 6 +- .../rounded_flattened.imagecache_preset.inc | 1 - .../tests/watermark_100.imagecache_preset.inc | 1 - .../tests/watermark_50.imagecache_preset.inc | 1 - ...agecache_coloractions.htaccess_creator.inc | 66 + .../coloractions/imagecache_coloractions.info | 9 +- .../imagecache_coloractions.install | 31 +- .../imagecache_coloractions.module | 1071 ++++++++++++-- .../coloractions/transparency.inc | 167 ++- .../customactions/README.txt | 60 +- .../imagecache_customactions.info | 11 +- .../imagecache_customactions.install | 4 +- .../imagecache_customactions.module | 252 ++-- .../Apostrophic Labs License Komika).txt | 36 + .../image_effects_text/Blokletters-Balpen.ttf | Bin 0 -> 90740 bytes .../Blokletters-Potlood.ttf | Bin 0 -> 92008 bytes .../Blokletters-Viltstift.ttf | Bin 0 -> 87616 bytes ...ns Attribution Share 2.5 (Blokletters).txt | 24 + .../image_effects_text/Komika_display.ttf | Bin 0 -> 67724 bytes .../image_effects_text/OFL (Pacifico).txt | 93 ++ .../image_effects_text/Pacifico.ttf | Bin 0 -> 43632 bytes .../image_effects_text/README.txt | 107 +- .../image_effects_text/image_effects_text.inc | 540 ++++--- .../image_effects_text.info | 10 +- .../image_effects_text.install | 25 - .../image_effects_text.module | 37 +- .../image_effects_text_test/README.txt | 11 +- .../image_effects_text_test.features.inc | 483 ------ .../image_effects_text_test.info | 17 +- .../image_effects_text_test.module | 604 +++++++- .../image_effects_text_test/lhandw.ttf | Bin 62484 -> 0 bytes .../imagecache_actions/image_overlay.inc | 367 ++--- .../image_styles_admin/README.txt | 8 +- .../image_styles_admin/image_styles_admin.css | 52 + .../image_styles_admin/image_styles_admin.inc | 145 +- .../image_styles_admin.info | 8 +- .../image_styles_admin/image_styles_admin.js | 19 + .../image_styles_admin.module | 128 +- .../imagecache_Actions.install | 9 - .../imagecache_actions.info | 11 +- .../imagecache_actions.install | 16 + .../imagecache_actions.jquery.js | 32 +- .../imagecache_actions.module | 4 - .../imagecache_actions/imagefilter.inc | 174 ++- .../tests/corners_combo.imagecache_preset.inc | 1 - .../tests/default.imagecache_preset.inc | 1 - .../tests/imagecache_testsuite.info | 9 +- .../tests/imagecache_testsuite.module | 433 +++--- .../relative_canvas.imagecache_preset.inc | 1 - .../tests/scale.imagecache_preset.inc | 3 +- .../tests/scale_canvas.imagecache_preset.inc | 3 +- .../tests/scale_rotate.imagecache_preset.inc | 1 - .../imagecache_actions/utility-color.inc | 134 +- .../imagecache_actions/utility-form.inc | 38 +- .../modules/imagecache_actions/utility.inc | 388 +++-- .../modules/imagecache_actions/watermark.inc | 205 +-- .../module_missing_message_fixer/LICENSE.txt | 339 +++++ .../module_missing_message_fixer/README.txt | 53 + .../module_missing_message_fixer.admin.inc | 64 + .../module_missing_message_fixer.drush.inc | 130 ++ .../module_missing_message_fixer.info | 13 + .../module_missing_message_fixer.module | 159 ++ 83 files changed, 6386 insertions(+), 2517 deletions(-) delete mode 100644 sites/all/modules/imagecache_actions/.gitignore create mode 100644 sites/all/modules/imagecache_actions/autorotate/portrait-painting.jpg delete mode 100644 sites/all/modules/imagecache_actions/canvasactions/imagecache_canvasactions.install create mode 100644 sites/all/modules/imagecache_actions/coloractions/imagecache_coloractions.htaccess_creator.inc create mode 100644 sites/all/modules/imagecache_actions/image_effects_text/Apostrophic Labs License Komika).txt create mode 100644 sites/all/modules/imagecache_actions/image_effects_text/Blokletters-Balpen.ttf create mode 100644 sites/all/modules/imagecache_actions/image_effects_text/Blokletters-Potlood.ttf create mode 100644 sites/all/modules/imagecache_actions/image_effects_text/Blokletters-Viltstift.ttf create mode 100644 sites/all/modules/imagecache_actions/image_effects_text/Creative Commons Attribution Share 2.5 (Blokletters).txt create mode 100644 sites/all/modules/imagecache_actions/image_effects_text/Komika_display.ttf create mode 100644 sites/all/modules/imagecache_actions/image_effects_text/OFL (Pacifico).txt create mode 100644 sites/all/modules/imagecache_actions/image_effects_text/Pacifico.ttf delete mode 100644 sites/all/modules/imagecache_actions/image_effects_text/image_effects_text.install delete mode 100644 sites/all/modules/imagecache_actions/image_effects_text/image_effects_text_test/image_effects_text_test.features.inc delete mode 100644 sites/all/modules/imagecache_actions/image_effects_text/image_effects_text_test/lhandw.ttf create mode 100644 sites/all/modules/imagecache_actions/image_styles_admin/image_styles_admin.css create mode 100644 sites/all/modules/imagecache_actions/image_styles_admin/image_styles_admin.js delete mode 100644 sites/all/modules/imagecache_actions/imagecache_Actions.install create mode 100644 sites/all/modules/imagecache_actions/imagecache_actions.install create mode 100644 sites/all/modules/module_missing_message_fixer/LICENSE.txt create mode 100644 sites/all/modules/module_missing_message_fixer/README.txt create mode 100644 sites/all/modules/module_missing_message_fixer/includes/module_missing_message_fixer.admin.inc create mode 100644 sites/all/modules/module_missing_message_fixer/includes/module_missing_message_fixer.drush.inc create mode 100644 sites/all/modules/module_missing_message_fixer/module_missing_message_fixer.info create mode 100644 sites/all/modules/module_missing_message_fixer/module_missing_message_fixer.module diff --git a/sites/all/modules/imagecache_actions/.gitignore b/sites/all/modules/imagecache_actions/.gitignore deleted file mode 100644 index 1d45c0a..0000000 --- a/sites/all/modules/imagecache_actions/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.patch diff --git a/sites/all/modules/imagecache_actions/CHANGELOG.txt b/sites/all/modules/imagecache_actions/CHANGELOG.txt index 74ad35e..f1866f0 100644 --- a/sites/all/modules/imagecache_actions/CHANGELOG.txt +++ b/sites/all/modules/imagecache_actions/CHANGELOG.txt @@ -3,6 +3,140 @@ Imagecache Actions Imagecache Actions 7.x-1.x-dev ------------------------------ + +Imagecache Actions 7.x-1.9 +-------------------------- +- [#2760121] by lebster, fietserwin: Add a "Perspective" effect. +- [#2947014]: PHP 7.2 warning that each() has been deprecated. + +Imagecache Actions 7.x-1.8 +-------------------------- +- [#2917097]: PHP 7.1 Warning "A non-numeric value encountered". +- [#2905130] by bserem, fietserwin: Remove animation from moving images. +- [#2888678] by das-peter: ImageMagick: Add support for invert effect. +- [#1099300]: Notice: A non well formed numeric value encountered in + image_gd_definecanvas() (line 381 of canvasactions.inc). +- [#2719661] by SKAUGHT: Division by zero. +- [#2717789]: Prevent exif_read_data() warnings. +- Warning: Theme hook coloractions_invert_summary not found. +- [#2696225] by mnlund, fietserwin: Add support for multiply color blending. +- by fietserwin: image_styles_admin: sort image styles by label. +- [#2039379]: Add some better examples for using custom actions. +- Made more contextual information (image style and image effect) available in + the custom action and text image effects. +- [#2690337] by Ajithlal, fietserwin: Would like a feature for converting case + in text effect. + +Imagecache Actions 7.x-1.7 +-------------------------- +- [#2671526]: Fatal error on image style flush when image styles are defined in + Features. + +Imagecache Actions 7.x-1.6 +-------------------------- +- [#2664020]: IE fails to display images whose extension and Content-Type header + do not match the actual image type. +- [#1591484]: Underlay not working (on IM). +- [#2359523]: Follow up to improve help text. +- [#2615986] by hargobind: Effect summary in image_styles_admin.module. +- Notice: Undefined index: element in theme_coloractions_alpha_summary() (line + 98 of coloractions\transparency.inc). +- Removed superfluous theme entry 'imagecache_subroutine_summary' from + autorotate sub module. +- [#2080877] by heathdutton: Interlace / Progressive effect. +- [#760438] by fietserwin: Resize Overlay / Watermark for ImageMagick. +- [#760438] by raintonr, Ace Cooper, ttkaminski, thijsvdanker, fietserwin: + Resize Overlay / Watermark (GD only). +- [#768980] by idebr, fietserwin: Blur effect. +- [#2636314]: 'Import style' can fail on newline characters. +- [#2573225]: Resize by percentage not calculating other field. +- [#2447419]: Correct erroneous call to module_load_include in + imagecache_canvasactions.module. +- [#2416805]: Remove reference to non-existent imagecache_coloractions.install. +- [#2416805]: remove deprecated jquery attr() and replace with FAPI #states + (rounded corners UI form). +- [#2580805]: Coding standards corrections. + + +Imagecache Actions 7.x-1.5 2014-11-29 +------------------------------------- +- [#2366163]: autorotate sometimes doesn't work with ImageMagick. +- Text effect: small clean-up of hook_exit(). +- [#2379359]: image_imagemagick_overlay() passes a stream wrapper to convert. +- [#2359523]: Overlay: allow to define offsets from all sides. +- [#1717436]: Add effects: color level adjustment and desaturate while retaining + alpha. +- [#2278233]: Call to undefined function imagecache_actions_get_style_label(). +- [#2183721]: Duplicate/Export links just edit, they don't duplicate or export. + possible solution only. +- [#2176727]: New actions: scale / resize by percent. +- [#2190759]: hook_image_style_flush(): Prefer silent failure over clear failure. +- [#2166715]: Typo causes extra query every page load. +- [#2139091]: # sign before HEX in settings form breaks Define canvas action. +- [#2085967]: Remove .gitignore from version control. +- Text overlay: treat empty texts as normal situation. +- [#2003446]: Clean up or remove .install files, adapt .info files. +- [1854270-48]: Minor optimization for Posterize. +- Refactor: eliminate test warnings and errors. +- Refactor: standardize function and parameter naming, function order, doxygen + documentation and comments, remove spelling errors in doc and comments. + + +Imagecache Actions 7.x-1.4 2013-08-24 +------------------------------------- +- [#1778214]: Remove project from image_effects_text_test.info +- [#1854270]: Posterize action for file size/bandwidth saving on PNGs. +- [#2060173]: Support image labels (introduced by D7.23). +- Cleaned up the output of image style export. Id's and help texts are not used + on import, so don't have to be exported. +- Repaired farbtastic colorpicker. It seems the library invocation changed + sometime in history. Rebuilt the color picker form to use #attached libraries + and simpler inline script instead. REMOVED the theme function that is now + redundant as #attached is a better way than drupal_add_js. +- [#1152736]: Support tokens in text actions for images. +- [#2025631]: Imagecache Testsuite refers to non-existent permissions. +- Drupal.org went from http to https: changed all links in our documentation and + code. +- Added ImageEffects as other image effect providing module. + + +Imagecache Actions 7.x-1.3 2013-06-04 +------------------------------------- +- Removed some errors and warnings from the test suite code (but not all). +- [#2010560]: Fix spelling for "Update 7001". + + +Imagecache Actions 7.x-1.2 2013-06-01 +------------------------------------- +- [#1830130]: Allow file fields as referring entities in effects with context. +- [#1446160]: Integrate with media module: Title and Alt text. +- [#1591198]: Have dimensions calculations not ignore NULL's. +- Refactored canvas effects: added parameter types in documentation and + signatures. Standardized function documentation. Comments according to Drupal + coding standards. +- [#1999140]: Canvas effects using imagemagick might fail due to earlier + -gravity settings. +- Refactored the image_effects_text_test module to no longer depend on features. +- [#1998354]: Non-ASCII characters fail to display correctly on many systems + (when using Imagemagick). +- Further code enhancements (messages, comments) to autorotate. +- [#1930728]: Autorotate does not reset EXIF orientation tag. +- [#1990620] Many config form docs missing from the D7 upgrade. Converted all + legacy instances of #type=markup into #markup='content..' +- Removed deprecated functions imagecache_actions_entities_from_references() and + imagecache_actions_fields_from_filepath() (see [#1844298]). +- [#1983168]: Custom text via PHP causing EntityMalformedException ... +- Replaced lhandw.ttf font with some real free fonts that may also be + distributed for free. Changed all text effect tests accordingly. +- Better text effect defaults (translated sample text, text visible by default, + sample font file). +- [#1986304]: Strict warning: Only variables should be passed by reference ... +- [#1981490]: Wrong filename imagecache_Actions.install. +- [#1858760]: Unable to find the file 'lhandw.ttf'. Please check the path. + + +Imagecache Actions 7.x-1.1 2012-12-04 +------------------------------------- - [#1591198]: Image dimensions callbacks should handle unknown (NULL) dimensions as valid input. - [#464092]: Aspect Switcher -- Need to Flush Presets. Side-effect: now allows @@ -38,7 +172,7 @@ Incompatibilities: file. This may cause current styles to not being able to find specified files anymore. - Custom actions: custom snippets are now executed using the PHP filter module, - meaning that the image syle editor must have the 'Use PHP for settings' + meaning that the image style editor must have the 'Use PHP for settings' permission to be able to edit the custom action snippet. - Custom actions: information and variables that are available in your custom snippet have changed. See the README.txt of the custom actions module. @@ -54,6 +188,6 @@ coverage". Current and past maintainers for Imagecache Actions --------------------------------------------------- -- dman (http://drupal.org/user/33240) -- sidneyshan (http://drupal.org/user/652426) -- fietserwin (http://drupal.org/user/750928) +- dman (https://drupal.org/user/33240) +- sidneyshan (https://drupal.org/user/652426) +- fietserwin (https://drupal.org/user/750928) diff --git a/sites/all/modules/imagecache_actions/README.txt b/sites/all/modules/imagecache_actions/README.txt index 8a26e60..5cc9074 100644 --- a/sites/all/modules/imagecache_actions/README.txt +++ b/sites/all/modules/imagecache_actions/README.txt @@ -1,15 +1,30 @@ README for the Imagecache Actions Drupal module ----------------------------------------------- -Project page: http://drupal.org/project/imagecache_actions +Project page: https://drupal.org/project/imagecache_actions Current and past maintainers for Imagecache Actions: -- dman (http://drupal.org/user/33240) -- sidneyshan (http://drupal.org/user/652426) -- fietserwin (http://drupal.org/user/750928) +- dman (https://drupal.org/user/33240) +- sidneyshan (https://drupal.org/user/652426) +- fietserwin (https://drupal.org/user/750928) + + +Release notes for 7.x-1.x-dev +----------------------------- +- Clear all caches after updating. + + +Release notes for 7.x-1.4 +------------------------- +- This release supports image labels as introduced by Drupal 7.23. +- See CHANGELOG.txt for a full overview of changes. + Release notes for 7.x-1.1 ------------------------- +- If you use the module:// notation anywhere in an image effect, you must now + install the System Stream Wrapper module + (https://drupal.org/project/system_stream_wrapper). - Clear the cache after updating. @@ -57,27 +72,28 @@ The additional effects that Imagecache Actions provides include: - Text overlay: add e.g. a copyright notice to your image. - Color-shifting: colorize images. - Brighten/Darken. -- Alpha blending: use a grayscale image to define the transparency layer of an +- Alpha blending: use a gray scale image to define the transparency layer of an image. -- Canvas manipulation: resize the canvas and add a backgroundcolor or image. -- File Format switcher: if you need tranparency in JPGs, make them PNG. If your +- Canvas manipulation: resize the canvas and add a background color or image. +- File Format switcher: if you need transparency in JPGs, make them PNG. If your PNG thumbnails are 30K each, save them as JPGs. - Rounded corners. -- TODO: complete list, check short descrptions +- TODO: complete list, check short descriptions -These effects are grouped in submodules. Just enable the ones you want to use. -TODO: list submodules and their sets of effects. +These effects are grouped in sub-modules. Just enable the ones you want to use. +TODO: list sub-modules and their sets of effects. Imagecache Actions supports both the GD toolkit from Drupal core and the Imagemagick toolkit. However, please note that Imagemagick support is not yet complete. Please file an issue if you encounter problems in using Imagemagick. + What is imagecache_action not? ------------------------------ Imagecache Actions does not provide a new UI or new menu items. It hooks into the already existing image styles system (from Drupal core). See -http://drupal.org/documentation/modules/image for more information about working -with images. +https://drupal.org/documentation/modules/image for more information about +working with images. A note about the name of this module @@ -90,7 +106,7 @@ porting to D7, that name has not been changed (yet). Which toolkit to use? --------------------- -Personally, I (fieterwin) prefer the imagemagick toolkit: +Personally, I (fietserwin) prefer the imagemagick toolkit: - It is better in anti-aliasing. Try to rotate an image using both toolkits and you will see what I mean. - It does not execute in the PHP memory space, so is not restricted by the @@ -102,27 +118,36 @@ On the other hand: the GD toolkit is always available (in the correct version), whereas imagemagick is not always present on shared hosting or may be present in an antique version that might give problems. -Please also note that effects may give different results depending on the +Please note that effects may give different results depending on the toolkit used. +Please also note that a 3rd image toolkit exists: + Imagick (https://www.drupal.org/project/imagick) +This toolkit uses the Imagick extension and thus does not call the ImageMagick +binaries directly. However our module does not implement the toolkit specific +parts for the effects we provide for the Imagick toolkit, but the Imagick +toolkit comes with its own set of effects that partly covers our effects. So, +depending on the effects you require it may be a replacement for both our module +and the Imagemagick module or the core GD toolkit. Hard Dependencies ----------------- -- Drupal 7.x - Image module from Drupal core At least 1 of the available image toolkits: -- GD toolkit from Drupal core -- Imagemagick toolkit: http://drupal.org/project/imagemagick +- GD toolkit from Drupal core. +- Imagemagick toolkit: https://drupal.org/project/imagemagick. + Soft Dependencies ----------------- -- System stream wrapper (http://drupal.org/project/system_stream_wrapper) -- Remote stream wrapper (http://drupal.org/project/remote_stream_wrapper) +- System stream wrapper (https://drupal.org/project/system_stream_wrapper) +- Remote stream wrapper (https://drupal.org/project/remote_stream_wrapper) These modules provide additional stream wrappers. Especially the system stream wrapper is very handy as it provides, among others, a module:// and theme:// wrapper. + Installing ---------- As usual. @@ -175,7 +200,6 @@ be defined using either: - A relative (to the current directory, probably Drupal root) or absolute path. - Support ------- Via the issue queue of this project at Drupal.org. @@ -194,3 +218,8 @@ well). - Brightness values outside the -250 .. 250 range are accepted. - Check color fields that allow a transparency component or allow to be empty to specify fully transparent. + +Known problems: Imagemagick +--------------------------- +- Define canvas using offsets may bot work on older versions. We have an error + report for version 6.5.4.7 (2009-07) (https://drupal.org/node/888644). diff --git a/sites/all/modules/imagecache_actions/ROADMAP.txt b/sites/all/modules/imagecache_actions/ROADMAP.txt index eca5a64..544cff8 100644 --- a/sites/all/modules/imagecache_actions/ROADMAP.txt +++ b/sites/all/modules/imagecache_actions/ROADMAP.txt @@ -1,90 +1,112 @@ -Imagecache Actions roadmap --------------------------- - -This is a non-contractual roadmap for the D7 branch of the imagecache actions -module. Actual release dates and completed features will largely depend on -available time. So support is always welcome. Furthermore, critical bugs may -make us release more often, but that should only change the release number in -which certain features are planned, not the timeline. - - -Imagecache Actions 7.x-1.0 --------------------------- -Targeted release date: may 2012 - -- (DONE) Clean up D7 issue queue -- (DONE) Commit posted patches from the issue queue -- (DONE) Solve easy to solve bug reports -- Do some basic testing -- (DONE) Reintroduce the text action, currently living in a sandbox project at - http://drupal.org/node/1090312 -- (DONE) Update README.txt -- (DONE) Introduce CHANGELOG.txt -- (DONE) Add this ROADMAP.txt - - -Imagecache Actions 7.x-1.1 --------------------------- -Targeted release date: end 2012 - -Mainly a bug fix release -- (DONE) Solve remaining outstanding bug reports -- (ALMOST DONE) Keep D7 issue queue clean - - -Imagecache Actions 7.x-1.2 --------------------------- -Targeted release date: spring 2013 - -- Check help and documentation. a.o: hook_help, effect descriptions. -- Continue to keep the D7 issue queue clean. -- Improve Imagemagick support and/or document what effects are not working for - which toolkit (version). -- Check that all effects implement all of the effects API (especially the - dimensions callback). -- Add testing. The idea is to create a set of image styles that cover all - effects and can be used to visually check for regressions. - - Automated testing would be nice, but I am not sure that we can guarantee that - jpeg or png files are binary identical on each run across different computers. - But if the number of false positives is small, it would certainly be a useful - addition. - - -Imagecache Actions 7.x-1.3 --------------------------- -Targeted release date: ... - -- Look at outstanding feature requests -- Continue to keep the D7 issue queue clean -- Keep improving Imagemagick support, a.o: - - Try to get insight into what version of imagemagick is required by what - effect. - - Document which effects might produce different results. -- Refactor code - - Extract common form fields - - Extract common error handling - - (STARTED) Clean up comments, todo's, etc. - - (STARTED) Doxygen code documentation according to latest standards - - Increase the amount of lazy loaded code - - -Imagecache Actions 7.x-2.x --------------------------- -Targeted release date: ... - -- Can we refactor effects into auto loading class based plugins? What does - CTools offer in these? How do D8 core effects do this? -- If so, will it make implementing new effects much simpler? Because that is - what we should strive for. -- Should we rename the module to image_effects? -- If we manage to provide an easy to use plugin system, we should strive to - merge with other modules that provide effects: - - FiltersIE module (http://drupal.org/project/filtersie) - - Imagecache Effects: http://drupal.org/project/imagecache_effects (D6 only, - but are their effects more advanced then our counterparts or do they add new - effects?) - - Image watermark: http://drupal.org/project/watermark (D5 only, but is their - watermark effect more advanced?) - - ImageCache Scale-9 Actions: http://drupal.org/project/imagecache_scale9actions - - etc. +Imagecache Actions roadmap +-------------------------- + +This is a non-contractual roadmap for the D7 branch of the imagecache actions +module. Actual release dates and completed features will largely depend on +available time. So support is always welcome. Furthermore, critical bugs may +make us release more often, but that should only change the release number in +which certain features are planned, not the timeline. + + +Imagecache Actions 7.x-1.0 +-------------------------- +Targeted release date: may 2012 + +- (DONE) Clean up D7 issue queue +- (DONE) Commit posted patches from the issue queue +- (DONE) Solve easy to solve bug reports +- Do some basic testing +- (DONE) Reintroduce the text action, currently living in a sandbox project at + https://drupal.org/node/1090312 +- (DONE) Update README.txt +- (DONE) Introduce CHANGELOG.txt +- (DONE) Add this ROADMAP.txt + + +Imagecache Actions 7.x-1.1 +-------------------------- +Targeted release date: end 2012 + +Mainly a bug fix release +- (DONE) Solve remaining outstanding bug reports +- (ALMOST DONE) Keep D7 issue queue clean + + +Imagecache Actions 7.x-1.2 +-------------------------- +Targeted release date: spring 2013 + +- Check help and documentation. a.o: hook_help, effect descriptions. +- (DONE) Continue to keep the D7 issue queue clean. +- Improve Imagemagick support and/or document what effects are not working for + which toolkit (version). +- (ALMOST DONE) Check that all effects implement all of the effects API (especially the + dimensions callback). +- Add testing. The idea is to create a set of image styles that cover all + effects and can be used to visually check for regressions. + + Automated testing would be nice, but I am not sure that we can guarantee that + jpeg or png files are binary identical on each run across different computers. + But if the number of false positives is small, it would certainly be a useful + addition. + + +Imagecache Actions 7.x-1.3 +-------------------------- +Targeted release date: ... + +- Continue to keep the D7 issue queue clean. +- Check help and documentation. a.o: hook_help, effect descriptions. +- Improve Imagemagick support and/or document what effects are not working for + which toolkit (version). +- Add testing. The idea is to create a set of image styles that cover all + effects and can be used to visually check for regressions. + + Automated testing would be nice, but I am not sure that we can guarantee that + jpeg or png files are binary identical on each run across different computers. + But if the number of false positives is small, it would certainly be a useful + addition. +- Refactor code: + - Extract common form fields. + - Extract common error handling. + - (STARTED) Clean up comments, todo's, etc. + - (STARTED) Doxygen code documentation according to latest standards + - Increase the amount of lazy loaded code. + + +Imagecache Actions 7.x-1.5 +-------------------------- +Targeted release date: ... + +- Look at outstanding feature requests +- Continue to keep the D7 issue queue clean. +- Keep improving Imagemagick support, a.o: + - Try to get insight into what version of imagemagick is required by what + effect. + - Document which effects might produce different results. +- Continue refactoring code: + - Extract common form fields. + - Extract common error handling. + - (STARTED) Clean up comments, todo's, etc. + - (STARTED) Doxygen code documentation according to latest standards. + - Increase the amount of lazy loaded code. + + +Imagecache Actions 8.x-2.x +-------------------------- +Targeted release date: ... + +- Convert image effects into plugins (as [#1821854] does for core). +- This will make adding new effects much simpler, so we can easier add them. +- Should we rename the module to image_effects? +- We should strive to merge with other modules that provide image effects: + - FiltersIE module (https://drupal.org/project/filtersie) + - Imagecache Effects: https://drupal.org/project/imagecache_effects (D6 only, + but are their effects more advanced then our counterparts or do they add new + effects?) + - Image watermark: https://drupal.org/project/watermark (D5 only, but is their + watermark effect more advanced?) + - ImageCache Scale-9 Actions: https://drupal.org/project/imagecache_scale9actions + - ImageEffects: https://drupal.org/project/imageeffects (pixelate and flip). + - Imagick: https://www.drupal.org/project/imagick + - etc. diff --git a/sites/all/modules/imagecache_actions/autorotate/imagecache_autorotate.info b/sites/all/modules/imagecache_actions/autorotate/imagecache_autorotate.info index 65de451..5b5a913 100644 --- a/sites/all/modules/imagecache_actions/autorotate/imagecache_autorotate.info +++ b/sites/all/modules/imagecache_actions/autorotate/imagecache_autorotate.info @@ -1,16 +1,13 @@ name = Imagecache Autorotate -description = Autorotate image based on EXIF Orientation. +description = Provides an image effect to autorotate an image based on EXIF data. package = Media core = 7.x dependencies[] = image -files[] = imagecache_autorotate.install -files[] = imagecache_autorotate.module - -; Information added by drupal.org packaging script on 2012-12-04 -version = "7.x-1.1" +; Information added by Drupal.org packaging script on 2018-03-20 +version = "7.x-1.9" core = "7.x" project = "imagecache_actions" -datestamp = "1354653754" +datestamp = "1521550387" diff --git a/sites/all/modules/imagecache_actions/autorotate/imagecache_autorotate.install b/sites/all/modules/imagecache_actions/autorotate/imagecache_autorotate.install index 1f8c8f0..4e55856 100644 --- a/sites/all/modules/imagecache_actions/autorotate/imagecache_autorotate.install +++ b/sites/all/modules/imagecache_actions/autorotate/imagecache_autorotate.install @@ -1,13 +1,25 @@ 'EXIF extension', + 'value'=> $phase === 'runtime' ? $t('Disabled') : '', + 'description'=> $t('The autorotate image effect requires the exif extension to be enabled.'), + 'severity' => REQUIREMENT_ERROR, + ); } + else { + $result['imagecache_autorotate_exif_extension'] = array( + 'title'=> 'EXIF extension', + 'value'=> $t('Enabled'), + 'severity' => REQUIREMENT_OK, + ); + + } + return $result; } diff --git a/sites/all/modules/imagecache_actions/autorotate/imagecache_autorotate.module b/sites/all/modules/imagecache_actions/autorotate/imagecache_autorotate.module index 106faad..2889ca6 100644 --- a/sites/all/modules/imagecache_actions/autorotate/imagecache_autorotate.module +++ b/sites/all/modules/imagecache_actions/autorotate/imagecache_autorotate.module @@ -1,61 +1,71 @@ - - - 6 - - - - - */ - function imagecache_autorotate_image_effect_info() { $effects = array(); $effects['imagecache_autorotate'] = array( 'label' => t('Autorotate'), - 'help' => t('Add autorotate image based on EXIF Orientation.'), - 'effect callback' => 'imagecache_autorotate_image', + 'help' => t('Autorotate image based on EXIF orientation and reset that tag.'), + 'effect callback' => 'imagecache_autorotate_effect', 'dimensions callback' => 'imagecache_autorotate_dimensions', + 'form callback' => 'imagecache_autorotate_form', + 'summary theme' => 'imagecache_autorotate_summary', ); return $effects; } /** - * @todo: This form is no longer needed nor defined in the hook above. If this - * information still needs to be displayed it should probably be moved to help. + * Implements hook_theme(). + * + * Registers theme functions for the effect summaries. + */ +function imagecache_autorotate_theme() { + return array( + 'imagecache_autorotate_summary' => array( + 'variables' => array('data' => NULL), + ), + ); +} + +/** + * Builds the auto-rotate form. + * + * This effect has no options, only some help text, so the form is displayed + * anyway. */ function imagecache_autorotate_form() { $form = array(); $form['help'] = array( - '#type' => 'markup', - '#value' => "

- There are no user-configurable options for this process. -

- Certain cameras can embed orientation information into image + '#markup' => "

There are no user-configurable options for this process.

+

Certain cameras can embed orientation information into image files when they save them. This information is embedded in an EXIF tag and can be used to rotate images to their correct position for display. -

Not all cameras or images contain this information. - This process is only useful for those that do. -

- The expected/supported values are -
Tag: 0x0112 Orientation + This process is only useful for images that contain this information, + whereas for other images it is harmless. +

+

Although most modern browsers do support the orientation tag, the + information may get lost or become incorrect by other operations. + So, to support all browsers and prevent rotation errors, it is better to + start each image style with this effect. +

+

The expected/supported values are:
+ Tag: 0x0112 Orientation

-

- -EXIF Reference -

+

Wikipedia: Exchangeable image file format

", ); return $form; } /** - * Autorotate image based on EXIF Orientation tag. + * Implements theme_hook() for the autorotate effect summary. * - * See code at - * http://sylvana.net/jpegcrop/exif_orientation.html + * param array $variables + * An associative array containing: + * - data: The current configuration for this image effect. * - * and reference at - * http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html - * - * @todo: - * Add horizontal and vertical flips etc. - * Need to create sample set for tests. + * @return string + * The HTML for the summary of this image effect. + * @ingroup themeable */ -function imagecache_autorotate_image($image, $data) { - // Test to see if EXIF is supported for image type (e.g. not PNG). - if ($image->info['mime_type'] == 'image/jpeg') { - if (!function_exists('exif_read_data')) { - watchdog('image', 'The image %file could not be auto-rotated because the exif_read_data() function is not available in this PHP installation. You probably will have to enable the exif extension.', array('%file' => $image->source)); - return FALSE; - } - $exif = exif_read_data(drupal_realpath($image->source)); - if (isset($exif['Orientation'])) { - switch ($exif['Orientation']) { - case 3: - $degrees = 180; - break; - case 6: - $degrees = 90; - break; - case 8: - $degrees = 270; - break; - default: - $degrees = 0; - } - if ($degrees != 0) { - $org_width = $image->info['width']; - $org_height = $image->info['height']; - image_rotate($image, $degrees); - if (($degrees === 90 || $degrees === 270) && $image->info['width'] === $org_width) { - // The toolkit failed to alter the dimensions (imagemagick currently - // fails to do so). So we do it ourselves. - $image->info['width'] = $org_height; - $image->info['height'] = $org_width; - } - } - } +function theme_imagecache_autorotate_summary(/*array $variables*/) { + return 'image based on its EXIF data.'; +} + +/** + * Autorotate image based on EXIF Orientation tag. + */ +function imagecache_autorotate_effect(stdClass $image /*, $data*/) { + // Test to see if EXIF is supported by the current image type. + if (in_array($image->info['mime_type'], array('image/jpeg', 'image/tiff'))) { + // Hand over to toolkit. + return image_toolkit_invoke('imagecache_autorotate', $image); } - else if ($image->source === 'modules/image/sample.png' && !function_exists('exif_read_data')) { - // Issue a warning if we are in the admin screen and the exif extension is - // not enabled. - drupal_set_message(t('The exif_read_data() function is not available in this PHP installation. You probably will have to enable the exif extension.'), 'warning'); + else if ($image->source === 'modules/image/sample.png' && user_access('administer image styles')) { + if (!extension_loaded('exif')) { + // Issue a warning if we are in the admin screen and the exif extension is + // not enabled. + drupal_set_message(t('The autorotate image effect requires the exif extension to be enabled.'), 'warning'); + if ($image->toolkit === 'imagemagick') { + drupal_set_message(t('Though imagemagick will work without the exif extension, subsequent effects may fail as the image dimensions cannot be updated.'), 'warning'); + } + } } return TRUE; } /** - * Image dimensions callback; Auto-rotate. + * GD toolkit specific implementation of this image effect. + * + * @param stdClass $image + * + * @return bool + * true on success, false otherwise. + */ +function image_gd_imagecache_autorotate(stdClass $image) { + if (!function_exists('exif_read_data')) { + watchdog('imagecache_actions', 'Image %file could not be auto-rotated: !message', array('%file' => $image->source, '!message' => t('The exif_read_data() function is not available in this PHP installation. You probably have to enable the exif extension.'))); + return FALSE; + } + + // Read and check result. + $exif = @exif_read_data(drupal_realpath($image->source)); + if ($exif === FALSE && $image->extension === 'jpg') { + watchdog('imagecache_actions', 'Image %file could not be auto-rotated: !message', array('%file' => $image->source, '!message' => t('The exif_read_data() function returned FALSE.'))); + return FALSE; + } + + if (isset($exif['Orientation'])) { + // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html: + // 1 = Horizontal (normal) + // 2 = Mirror horizontal + // 3 = Rotate 180 + // 4 = Mirror vertical + // 5 = Mirror horizontal and rotate 270 CW + // 6 = Rotate 90 CW + // 7 = Mirror horizontal and rotate 90 CW + // 8 = Rotate 270 CW + // @todo: Add horizontal and vertical flips etc. + // imagecopy seems to be able to mirror, see conmments on + // http://php.net/manual/en/function.imagecopy.php + // @todo: Create sample set for tests. + switch ($exif['Orientation']) { + case 3: + $degrees = 180; + break; + case 6: + $degrees = 90; + break; + case 8: + $degrees = 270; + break; + default: + $degrees = 0; + } + if ($degrees != 0) { + return image_rotate($image, $degrees); + } + } + return TRUE; +} + +/** + * Imagemagick toolkit specific implementation of this image effect. + * + * @param stdClass $image + * An image object. + * + * @return bool + * true on success, false otherwise. + * + * @see http://www.imagemagick.org/script/command-line-options.php#auto-orient + */ +function image_imagemagick_imagecache_autorotate(stdClass $image) { + // Use the exif extension, if enabled, to figure out the new dimensions. + // Moreover (see [#2366163]): to prevent a bug in IM to incorrectly rotate the + // image when it should not, we only pass the auto-orient argument when the + // exif extension could detect the 'Orientation' tag. + if (function_exists('exif_read_data')) { + $exif = @exif_read_data(drupal_realpath($image->source)); + if (isset($exif['Orientation'])) { + switch ($exif['Orientation']) { + case 1: + // Normal orientation: no need to rotate or to change the dimensions. + break; + case 5: + case 6: + case 7: + case 8: + // 90 or 270 degrees rotation (+ optional mirror): swap dimensions. + $image->ops[] = '-auto-orient'; + $tmp = $image->info['width']; + $image->info['width'] = $image->info['height']; + $image->info['height'] = $tmp; + break; + default: + // All other orientations: pass the arguments, but the dimensions + // remain the same. + $image->ops[] = '-auto-orient'; + break; + } + } + elseif ($exif === FALSE && $image->extension === 'jpg') { + watchdog('imagecache_actions', 'Image %file could not be auto-rotated: !message', array('%file' => $image->source, '!message' => t('The exif_read_data() function returned FALSE.'))); + } + } + else { + // We do add the auto-orient argument to IM. IM will determine itself + // whether to rotate or not. + $image->ops[] = '-auto-orient'; + // However we cannot keep track of the dimensions anymore. + if ($image->info['width'] !== $image->info['height']) { + $image->info['width'] = $image->info['height'] = NULL;; + } + } + return TRUE; +} + +/** + * Image dimensions callback for this image effect. * * @param array $dimensions * An array with the dimensions (in pixels) to be modified. - * @param array $data - * An array of parameters for the autorotate effect (empty for this effect). -*/ -function imagecache_autorotate_dimensions(array &$dimensions, array $data) { + * param array $data + * An associative array containing the effect data. + */ +function imagecache_autorotate_dimensions(array &$dimensions/*, array $data*/) { // We can only know the resulting dimensions if both dimensions are equal. // Otherwise we need to inspect the image itself, which is not passed in here. - // (this callback was introduced to enhance performance by not accessing the + // (this callback was introduced to enhance performance by NOT accessing the // image file when rendering the width and height attributes of the html img // tag). if ($dimensions['width'] !== $dimensions['height']) { diff --git a/sites/all/modules/imagecache_actions/autorotate/portrait-painting.jpg b/sites/all/modules/imagecache_actions/autorotate/portrait-painting.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c6e4fdbe7124c755ddbff11a9bfee6c8f9d1ac9c GIT binary patch literal 158540 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

@*C z1&01Ak4b3$dLL2g7YR8>iGW7{sr4BD01EKW+P6e~L*XRa&73A}Q$V@UFrxjHc(>8&d+pc6+e^QNv3Ro57QWM(z+OhN08ENka35O!YknmD({@*1 z5qw#3H^bc~;yqscT(zdNrwfAvD(z-n+>OL;JaskCm{)Yvc@^8$OR?zX7zpBO)TdHb zOGdlv{{R5@&tY*8F}x_)+1H9%@lp z_%g>=@Z;LI*`DW2g<3hg4x5VS)Yk{sCne3y@7VUguo8T+O4j)N&QnV8H^ct`9DFm? zHEHIb!8*(=R>|~P$_thwJgWx6jye%lH1GH)wUqh|kBEFr<7s7=P>Bwi9l*qcar@33 zl2;uFBa@$M-i9rt(@N=UGt9^36)4O1cXxJ-dyx1W_ITGm7<@{)&~Nl>O+!SS87Go! zMF-{OFvMkjhH=e#&VhBMcvs^!-m74Zd8R@REfQcFKzfBLc95qB9Onar+ol+p)aF;a zO(`$szjMfRB(-YEtq-O2En7^{d}nvA*e&7{8Qo&jvBSjkELm|$7KYlZx-Y%U%WZmTQ~rH>;u}os`TX?RYhI%Q;JfD%lx%H z6yfY48fw)ZkIjEpJKx#U;U=1eA=fZ2q`7F8)i44|r0$8Bobm=h1Cfq>eP83B!}&fK z>Uu|sbX#E)=@N^mSIWtj-=8uw>%ni=*1F>)>N-=B>GDY_H)|_fzi+_#-@v{ezS1Jr zVAX8%abr43AvV5S&y{TBxd1C4ravEK(>!%$Vd6b5`u_k@DPwS}YjJIHd9a~jw{TA5 z9Fyys?43wg#`5yJR)*`nu2PGqhE0FVxqfDkg!M)EPw}=J80AT{tzuFe$UBrVz{x!_ zLa#aM7mjP-f7>_VrQgFJ+7|jaPus@6MaYuw?N~_@5rybBg^^n)KXeXj(8JPBF8aYe zdc7C>UzmbWuC%m(jH)16*7<89=*K6HePZXYfaBiA0=T9g7G5Z~O{ z++3t{+(|RS*9Jrm#FBP4SE=-`7dFhXxolzVww?K#O5TU5mtbgOrzbv^vQP0mi&)q7 zFCBP>-%f(+dpLC4mAXjnr1IjHWFV^)#?}FqP6)s{uZ@bcGD)UB^%xw(f?K%1tw zlV(Z`FUoQN0AK-t2NmbfiLtqKV+uT}+U+&pr^xSlP9G5|RF&@Z`;SV}G(Y%8rb!m^ z>R3#hW@&C2hzx%Br&IdZsaqpOJAlQ2W6AH2dil)XJjG`5kJgl1j?F7I<>)A3DdAu4 zuV=cs&gqx2cy9jyQnk31E$#9riR56TYjx!MFg48T-YV0)W#Idy(k|n>ys)`hHZM^k zHgWHe8yMi%J`(|r##Hv$YEqnIXEvAKO={HXSxKdHw!hPpTJZj?Qarqo$PlvR^vJEf zHtlsQ4IfaAfq59KbN%Sg^#k>;Int?3a!oYTwV$9io~hjUU;YXWrmgSn!*~k3TU6}Y z*cnTdUUSqOn*MXNy-jqlG9zgf(ti+@0Xgl1+wiZ}_$U5Ft$%%=DV=LwFE7=WC%eR47y zn~o<{d~bK+YlMn>i7kbcAqi>OR#E^^Is!&X;BFO-7t18uG^-wXwcPz>(tbE;{vh$M zhjbb2u0ORetUt6Rffp+TVRMFV*~ZXu*A?%6EBKYA+3Oat-A2f5tRDK}70WD8qisb! zIb(o5Nv~dYxKbA6J%M zNkK1#H}}~bMcvVcXzi_I4zVCaLC6^42O0h*PTCQ4oh`gIXxB(b?_`|(xe`c`vyA7q=N{Zwp<6(r zCc0a58e7<`V<2+!1}BfJ16wBLHvHe{jtRoherC`TEy(m8{=K zAj*BR<}_i!AjWq7IYIf?L*au4r+uhK;hZFfT<3#^$mi;7r)_(|erGK=%O=+9Z}K?* z0Qe^ud4FmR30XlKr*6GJbpHUIe_S3GU@anYODJEUuPZUqYtYLK_df7lvH`&Wk59^} z%L@f|`=DfyPg?SAcXPeF9wT+~mdMK!mM5ii*HRf+C?Fnt*6~XIW*%pk_?Hb6?f^DO z>0ipP#wp~}e`((l+yrR~>+2v3$>LQYanJLwLkVQrjZM-01OCc?88q*V-V3yn-OM_b zs)+9`2_VK#-EN$z9S_u3+7Jebwr%J-9@XX6gQrs4`JR;>6`0!?fHSsBD;$!0AEj|V zAozKw`030VrL zm`64qJduWvAgSsPwSG-_>%;n&{1f}*<-dvaNTj*&9<4D}fMknyCoKUzhw&jknCBey z;pCM|OKBKWmGpZ(8T*ysPZ-$v@544arj>FotZyJ$V3B)*I(re^b~V?s10w8A#MfUf zy-rzsx;~ql`+>J71Rl8bs+MsTmolytd-SD#T^Kmt%+oCsM8up9pD$`i)l$%e48WXn zdeXO1-&-CZ`$7CPxA>>kQo@VW~t*;-9sM49x<(0M!JI0x}kr#1CW z#-6v9(!l5>Nfd@sI4XO7wbMaf33(HZk1is1+WH?ae#SFhcz41Y=Yg+73A{0@%V`ev z#`{+$NE_%;kL6fDwB5b0fxl=kg&rc32qw3^)MU}_a~L6(boq1iDr-k)MJLkVnWnE5 z?)|m-ulOgcd{Ovk;oDCf{6EyshqU=q`%&!f0kcePnitwg$2fFf%-7}L{1jv02ZuC0 z4_i$SMY7VhnRUx4ZDfumj7c1@I{5?pxqEhOa5CQJv#myqTa$umJxig8#6~NUZ98eN znfPsS;)^XdOKVGlsT~MC z$T=L>6&W~AbuD*28t?snqsL%eW2eIeo&3+6bbpKR_%pnVdu1a+2)4QZ z0G5aoylyZE&(oY&sQiENhlzFF1^i~Zb-szD>sIM%=GsyWm~HCJr@lh~eGU&=^c5;q zF%&TsU!WR?#?K6R(@BX}TC!6chdz5S-@I};?UBzF?PBu!SgT6*Yp;DD`J8Z^qaIbU zCxd)1XQX&GZ6aIvwF`Krl1(tixhrhrCI(_KRY`1ecr}e>;yp9=bnxBf-Mz_mBWPedT(@yPF9 z&3WN!UYlvYt#s;gB~eSBJ9Igid@E((KLqHumKS%r2CsDhYlgFSjFjAVZ#lty3>*MG zE4Z-xTH$BZ=e<%mX~MBT@GNKbug~+W_O+#jrDsY?_iFE6$JgaqbtM?qsK0oLuWSwc z5u_nunkFp~L5-*U4|?r!!F9a-nqX=-szr)pZB zt*2{u@h_6|gk^qIM%_MB+o$JU9gpnkp~ro5dv7)MoRX4C+g+H|N%Yz?j(TRj%ocx% z$kTW$G}kPX)oIt%;KgBS;u7cEq1pT`(6iyF+IcP|xenAkwo@ih%2;p+U^2Z&KdpZ`diRY~c$WKag=?qVnFvcaS8)gj z?&O^H^{>@9UjtV!%hf8-<(D&hpD~+CHLBh(rsplHc$se5h|}#YOSV9b8FA`5^Z4ed zTWWTU8_j}9-9|UY{C-F9?_WiIPb-$l)_p@wxYE&<=165E7g-<;)BT`Me=qA=-W$+t zb?r*t*y|QnW?4WIT!|G^J;@4iIsGZNn5`wy{)B&MuiDdJ{{Vt{{>h#O_+z2n*{_eT zw1tyU)T~HhWd`H0DE{*U)Q&kLk}>?`YCb8t)NdrXyB}%2l16DJxc%XgiOFWq-Z?p} z+H%y^KI~LXT{~8d84^|AGmsT}4xg7bYr~p*>-z1blnjdVTqID58yI$A2Pg2N))POn zdtU-+KMA}oHmRt*R@(L5q8Z7MJI8Bom;e!+DL=e!ak>3~ubI9AXnN0&{wqhXYr1K+ z(luFPzj$Pm{Z5}~jU+-r&>e7onRdLE*88{0Po$C-Kky%+KhKBlFXA_g#1`;PZyXm}pHaJt5%Q$6u?o5L zRSpNR74sRCBRoYE`ZoUM{&qf#Dw9r2qp|Z3g;|lNk^)}$cbr2G0bUSi)Vzzw`v$om z5j;1x7go(Fmg@F&w1!fD<(jq~vDD;%e>!l5tGCiI*zB)6#oO&mQ`!74WHifbJut7E zH^dOIm69c?>987=1+@SCdkP!-K!M??t>ZvJ&j(ouxp6!>;j3NYs-H7cM&vz`&X5S ze&l7{Bh0cUrE;T(gn59fd zcWBuS1Nsry2N?#umnl_JU1Ig~N4I3)sxO)8iF6}o11ph_n0Ki)4Nl)ev5w~ARDvRh zd&v0OIqy+>EzBFdtbR~_*`E_E{vvp@!}fYy(i=-enS-!9UD=Rl9mX;;eQWHW*-Ky2 zu6`NY=h3FHVg1u~=DuWW}zI@9{pbvbd3CD$#}< zl&@Si8&!%{%0PcMo;NkIYOP~H)Y&ZsZ_5uPMW-) z$oap-Keqn>gfv+tTXTDUNASl8P~VFXe@gMaWBv*-t8fy>!{Eiv9(%m!@B{jq^Xq1@ zinS=YKIhS4xN@~mdbE^$mZt}(f5Ak2L2#vD()7qsgOFp9%YHkDr=@T|3qNc-uZOq# z+s9!H&}ui$cO)`1sE$Va!B02@`sWy~Pwgy3rFlUlk4`)}Mik{0CwVJ3^SSyB@YD9c z@V}0pJA20d#l3zNZX6UR{qc{~3i`e~fY$25K;Ynlt)35j*QbZYLcA{>`p2>I*z5&d z4EZOjdrP_C-wLm+ej5JK{xr6{)FZM@V#eE1wvJZXtYa+{%n9Q;F_J&p74ACc?NRXm z0K>PkTi$q@&`N+7@`-$B{m?~sEJZ9l6R9MTht+Wy$=;M4v`5DtHvP5yEAVUMW#+l1 zk>Xu9SkhowMWnknO$)fo5)KZ>9lwUWSL2`U{{Z3dk3Ji))1%NP(k|^aOKaZF6sX zZ9I;<3q>NyjP?Wqzwj#gFa8Q8;tQ|ZBjM!QuY#m051nfsq4u4zv<(YPS8h*IX6@-) zEPX1E+I&8~M-1}n)MM=4ul((A$ovQRmGC>q8b+mas%pAj{la;EWVbS=;k5q%%Rs}1 z1odH@cc{Dr;J*}WzAm%TblX<9zrSJR#W)cH!E>H_5ufQ^%rSIn({&rPQorGI$W$wH z*+t&xtS5%NPi>;=7q_O_($eJHPYP}_D=s+$A284IHSNC)J}daI;Xj1+i+de4XVbM* z^6u7X32nPbz#xJ?_xZ(m7|NJwNmiw^-F&zFPqNFaRI5YkxUIg-zJKrz>TezRTG!!K zu({A?)Vx;G5pPH<<6ukRbLx^>RpePw0{(7x+cDEAhWaxvT+=?iomW< zY#!D1uf=KX^q&Uk`u>XmvV!>xbHxNov6F$o1CBxGkE!Odoa@evqUPILrd3=eIyGS9 z6qK}Rv8Vh%hU?(wWVpSzNS`AM=0v}`a7X(*A9eIK`FZ~U z1q%4psn4$XZ%@*76t%InR(q>kDM%@DI4vL?XOoQc_p7=zr%N$vO7W=;Uu!pSy%U05 z^x9u#-rlD-@PFe4pN_Odhg{T=^@fdN9(0&vx8+g?9f06_*V4Wp)S6hNhEck7IM1r% zf-B}Tj6A7SsTr#z?+4_4h8mDDd{4Kt@mpKzajf?x z#1n6Ahz>YnMo$ER(!5+Y8RBXSW z%EHBB)4~?#+t%gz#{rjN{aHudv2t zIU1o(csxuf)^N4kzctqFYi4|;F&N)zIMsucZ}%Sg;y6>px()0Il0EE;Y9-DmB(^`2LUk>j70Ma$9 zcj2PHG5|ljB7^+%UTB&P?~8os-gdIktTi&mD9GJ$A#lKZDuzE(^sc-tqYOl(^|DPb zJ1_Gyn%yqv=ZE|i5+mTB4(NJ@op3a*Lhn<(N!s5rnUQwkiwqBxu^j&ZdcP0uoyC~-IXUF>U$F4SdbP5eGpi>juCLXfBbdcU6D1uHo3<%K9i@or$QwN> zD|q7ab_XSiJhOA3O8N`6slWmV&D?P!0l0yZdLF#~My-t+SS}YbDPzIIQcPy%uQl(8 zH8+y#^y*h^cX^Y{S-&&QLl$9?qcK9GAaRV7*E#&En-Qg@=+^g;vbgd?1AD8N|`4$?dOQoWFRpQyj^Pn}Ov{hUc0B=-bthB*Oo?2QtsVCycUswb}8&!3=enruF7|vHs3^Z zxpLJ@&qJvFjdiQa!^)k7qUK*J?40Ur4Xa?!aBiOUe6 z^hbxx$TC65@5OW4luAo(Y#8ow-3)JSPb=|p027?41oY!I{I&dIm_hqfc!k3Z z9d<1K9@{>0VAEbt_cmrKDEpO*lq`dFQL>TKKE` z8|k{Y!p%}mJubB`5yNg?%19+x*`*y6Dfw_tG70=^^Tem@|ShO-610}l#9QVP&ADN{YI#Rs#T^ZM3DWQyqw!yTo z)1l>`wjGy-J~((z+r*w2)$P~DnjjNdfPAO8h#a&zAY_hNf7&eGia6E`HxSzPE2B zr-x%2HL>}A(YQ2(dme-N*XO>q;~TAJ`dR0=mg;9ao=IdmWA*BK*Na;bJX=zdvgs4; z^1P~^1|8=9DIBHdpx$0YhZ!JoS>M_%6u&VANXb13#b)7loKI;+$Y=JZUwbz64b&0O z6^l2CqlpTvg#hKgUPo{7t>a2fS@k8Y3pQHC?yETaBRUnpSyBG!^{=pe5Bpa5%f$EfQ1gxZ#% z5s_wie7F@YL|}2mIR!2{{Zz?(WTD0QrOz0BW+HHMfi}mX8~F{S#~i8u16#B zuUYWt#QD=sI&i%WXC$IYU?c*>cJ;+)IyE4?k2b9o^=jwYI#0z3ekILqW25OX+i5y& zrt9l@ZZr0X_!1l(WMK3h{x$KJ$3KSB+xXh=QSipAKCh%(KqQWDEVEiK0F0h?f^m^s z!n3+hX8pz6O;0X{9yF@BJ#_cy=Y0>Jt#$jkq5@4$qsYvlU$$Cj6ktAw)?mo4jCACV(6*m(m zduy4ZWh-Sl56NK2e?n^_>Rnn3REkI@Yjlvh#U0M|LU<$tx1N=?DJAhXIVr7`(PvBX zV6c#+w)Zy5r!3M$agpvaE7UwY;;T(g=@#DZDP;$k#Gsx%s~lDx$=(X_eNJgqUu#Bw ziT=&s5j5MKRcv)8R9PbOJg_mG5LLT$E8F$vzK-!N{f~n_B5M$81Y79$&@A)rhBg6(tiALDQBO?jz!r&5Q( z^UbDMdCp*&PSU>wbgQg2MEW0T>i+;0Vb%1Q)hCis$_r9!}vWBd1~WR#fRJN>s0-YhR!I6Ov2aw`0sLJS*ajQ^(^_)3ub- zu4L0yrh?|%Z~=)2}I-q2eZ{KqPUla_37K*02` zte$I>yduMWQ}?is@l*5B_kHy|{{UlIRdeUj{gdF2_$cMCg#1F9KA++n%d0t7?)9yu zf<^gvYzHVo+_}NPAe>_(IUj|e61)p%;C*HreLq>Y*X`aRD4qml+uH;%;PIRcjz=~6 z4-CVTD5I|Fzr~+BnAzea&pZ1YBQ$}+u0h<#oOPx=OA*@Vc01!F9OwGiy?3)b`w>WH ziX~;qRXO<&-aWsaI?%P;=!W1bvE`WK9^Zv9X3gG@Z{`L2Rxp?h4(uPV*ZlfYku6YU zUa^-SGa$$((9wND);bl@E}KqEh&3B~k^SAk5HaX~DylTQ`&o>Oa)_ma0>3w2{8PBC zbI?8%{7Tlo4t!(Ld_kvP81LepNq9y}s~x0m_Z9tKYTgKg_Mq_;ei?0L;_&sHsV9je zgtEQQ0iw0t(*%Icj@w5Er%fj>Wi=hy&r?d#XXt;zTSd3l^)-gfTiDv$$8QF~v?x)X zfO=qx{zAWKj~QP0yW&2fHSMCo_RUC`;Yjg?Q^a{5suX@T&54XtvfY1?>gB3jlat&0 z-Ht=X*NLOZwt4_YKgyYM=TMgYr}>JYD+EKPN%@%mW&Z#=JZENYHF*L)0A!9OTyz~r z=BBfw7NvL8j6zC0zD7@ubp!tZ2=1M27zp8BRNCB@C2~I|HRw84mnHPdE?tu1O(G&d z85ofycJ}Jxy;?I;rxo45%=4!Q8kb!X{ERI&_5}E#*92`ZE3O#z3d|4ns=B?HvCuB% zietaYn8r5!)BCp1(}P@Cn5Q`QabKzE;NyEZ{{TPek1zPe0hRAAl|y1QoUvilNd3LR z{#B#lc&=^*&BRJbeJbpLgBSti&*TPcw*=H_M*jfH(m8Q0My%gzk-y@3XZ#Z~GCyg3 zB(W^Ymm9LU1LPy|{A>E#@Y~3ikb%c6b5`teVK$Y|zI@Loa13^lj2fkN zh@f(C2?P&%@*SMC=ypAIJR;>pA(}M9=LB@kVBDh?Wsz|B>_-*Sq>{0l)bfuLK*rtJ zu|bc!*A@J*{CUhjw10}(W7`+@#CcXc{{XB`dF{=0VD*#qGM=p;uzw5uPpD{mHM42A zGD6IQAuvN9LOa*5S$H$Ve-|#^Te9W>@|h+3pmCfJ=quzUQoTw0B<_!=QKwCFwW-MX z0aUS)Ap9P&^`#wulQ>6Iqqb&GFg@Z z_LcjcK*zih3iKve#>Q5$gJU8vTRXUfV}|YUAgQ zc!Y|>=yEIJUy9%GPwxx(nrUwQH+23L)E^|I2YgIV{WCvz{sKllDrI}=w^ViDakVf~ zQik1Q-1slzXYB9s2jJ9CbA6_+v82WKuWU0oLEN(Aa{fen*Um%YQMimk@8!hI0RZh8 z?d@FkFtDlc@7ViXCO(cX9@0HGU5&@L)g{r+p(dGm6^nGaHm7TUz_E`?=0CMsVps#y zAaFk#$x)P1=~1f+p9@aIZZ!cC6h|ogNgl(vu591WJc@#H6@foGgOwGkj=n~$qi=64 z^DHqt%EXPT0X+KGSEl$?Ah<1h;$El8Q`72wDyvCCJga_&Q@ha}KlZ9cY$CRdB8~#Z z&OaZ z+B$iOhG0W&J-?N0Sa@ptU)3$F^yu1anI!@hPOM4bWALu2#WaOAjl0QoG zoMA$)&9|}TV(8SV4p_}bJzsO>4~-wP-lySj1lf4WEuPxm=4SKs`6Af%4tSxxrA{_+CivALbwmCN)y!FO$Pi2xf z05*9UBh%|y@=7;vW2MDO9R{0lkuoE$9P%5keJg%BBSdl^4g5pXKGn%6H!j2WdJ=4w zbzd!sA#g}NJ!t;Uw!8#fS|qzk+RYg2+n&C(MM@Ipy}L7q5k)t#Za)c>Pd84zxUrlK z%8cekC$B@(@WpX{KKQfZ%Zq>Ponrd-{?Gku8b8$IkeTJzR~AOKFQs# zWWNK%8^nQJk?W`16YOeVmiJLaB?VHD{w` z8MJvM2qB#vPEJ&UFnteESy#Rrj%eAWmLPWJixJ5G03-FTg(nlvohV7}bN1Jg=@$uc zV|?&3zE((P_ZaD4YkV2_@2*=$6}16&(To(7@W22!eRJ0w=bu{P&2Ut4ls|g4Uu&?i zRp(BxBp#2U`c2?5;tNmgop)T)6Gwen88$~Zn6dzgB1jw2gMrQnA%;2=^ks&rZF4hQ zB+Apqf!Zwc6qC+9@P8`&=Q+x1;qglkNji;2`YxaF$5lK`Yf@FE?%nJ`;m|Fk)UAOb zMabB>{uTv?>zc^a^vLv|i57P<4aVxk#~%K6vYw;r4S3LYsU){?f0f5Kc5ldn&&P3K z6*6grV0!t3`DE8Q;+<|?6H4(qTg1{`PkR&)1soS>;{m;Z#!u3=!o%84UuPYE@FNMk zYJNk0+20c{eir;ok4?R^v)AojCy^UgwijPGk&;DHa8zXnLI}@pEAq;1Mq9XLW|)Zo z0J-D>IqEQZuiSE~-&nxWn~G1DTOT2ehb?(W%;Wz6vZc9qRge{5QI0eG@s71vXj3~l z5)#|8bHF@%dsm^%na9fd44+E8kOd)JWRh91PagG6wCj-zu?noC91-(+)pIVO;>oJBn`nThYBaNyE>(BG^@uT1!_JjLc>bh0Mz1-HiPn~;YZWm#_TL-TA? z^shS~B~Fb>uYOm`dYBrLR;Pb;wB&w!d}p#~b!F0(vv4Jj(nbxES%22K$M>XXHS|}7 zE`Gz{2tufY-QK%}$K6Fzpy#eWU~9;azfPUDYVYQK8oRG1`YRmHpLuNuiEM3SUonN>sEI&v0*H4<_6CNNOmJWzcSRt@_fv37o5^v(amadwV#aaqGBB_ zM1bUHkf$G+QC~)DHe*issT>HTpX`ft>Bu59{{RzRczZ=c9n<{R`Iur}l9K+kXNzCF z6L`MPSQMFdPb8RKq!TkJ80WFgdM3Z5jaAQ5Eu-Hb50rhV-H06J_0hQ~hQsN8~La0cI(JlBr&cRL@E;I|w(P~p1w_pFQg zk+)!i04K4t5fhUfFnl*AFySajtM=UWsjt-NIn-dFp>5UzN^VISe|Oi6!v?bojNWtyX(;I{{Unk+7nLrU8ThYR`JhiGK88HeT<|WMJ z3yVv*?(NUrF-RB@^%btp(r%Cup5P2|U65S%Y27`K4pDH@O3iMHw=N^XM1wX+9_O0lI?C zLnMlGlFA0q!`P2}*7c&Ao=U~}aY+}0 zY~qns^$CeyFpzAncH@dt(Ot|Zhy;%DLh3!DFaQ zmoc~s(lg^}00Kz^kC^ta82DkT+i2cDu(_H^Oa-=ll58NJhdg@o&1&V!)9B7R5_Kt6 zg55T*bsw~6fNcB?@f6FX$0T}n+$%IbWZTNW@%#PkjGF0w5PVD4{0$s8_BRu0^RhAt zqYS=kWU1uvz!BG+5nTAXZj$DY#TTOpHHx7hYpvF+x%Fp;^?w!oPruTyHF;;e(@oK6 z?q^}O3os4s$-u`?YVq%l-?QvGuCu9Y9ul_mG}u{9)w&J?<1ETOJ-dA?mXv1)?I!){ zzrw~8>QkXvLY|bOtuH5Y;eARWrj?NufCJ`22jl%}jQWC>COH})LCQ1kCy!d~jFm&x zwV#o@Z+#$zK5TFZIqH9>6|Zk_%@`RTV}X#PAdy(tr*~!0aCbL_%EJ)Y=Od0ApUSj! z?O-q-V-iRU$ijpdvnk7u66Y32AHzLGQ5lkVD1=WpIq0_LU&8C;?|`V zC-@k0T+bb}Pay~-7+}lk{{ZT)PVw3{ksw&G%rXK2$F+3EDIQ%``W}Vh--EihiESdD z@zTO48BsE2kKj2Sd*k`n(B2F9W;DAPbo*Fd=}VTDLx4%i=N$kYdt;w!@-f+kHy2J1 z-RmRKz+flM?Wfyg?0*kv8nxbua&+ls4;;U0o?XmVX)vIYPi?3a0oZo0p!C0jcQ$(D z8s~;Jlc6N`!DNU=Wl~5yjGy+ij)3!DIJlB|UMt(%+HR^tZ%+FeVlXhoLDP@AukN$d zbdL}Cj?=`p*0Ok??Iu8FB1;7Mg5gNx80(*|YrpZ0kxvqMStXOrxD&cF1=<*u=Z?dV zdhqj{_MUZ8oW8Fbbu8Pcp6bn6=x0L;@Upi%lD6HBAI4u2VAK3{Zu)hsy4}^itb*bj zGNho~y>sb^OAi1yUs zB(l3d7@B=-1gI}fOm#2ZEpJV57kDC!YcRcS_@MJdkBXn-D?#W@!dHRaG zH-@ydg%6isUb@H^vL`xmj3{RQMCBqbl4zeRdRXl#y+)o?jw!V zE)qoo?E^T${p5HgeLC}>*1a3xkL=Up{{Y$}#Yau>&X&`{U-y?%sYvbDo>}`~1IJz~ zSY5j>xXz@KSA7rYi}qjrm%KCkD!e`(({Gnr@t(A$Cc7gZVxZhn7qSC_N$PQ)!n?1H zTFLOFcQz5-?Y_N{?ckm$_xW(fH(bsKaErSDb#0(mwN0!w2}kWEsytc3Sc=h?M$f;# z9BENnO`&P_(a8>R0(`|Ntv`@p>zi8bO?@qK)9-*W<-)VF4 ziKkU?s^9D!k@+8L^D&rzZAr!H?(ggW01kRsTD+6H>m&H?)U=zs&xm&x_rn)9*7DrQ z9At(d@%1dg3iiE5f9&4|i+EY2c%w+8W8ARY`0^0fkBUm4EMw9q)nR4NImz{Ueg_@k z-89_z&sLWhiU>q%eR8CMkF108uC^2t>6fvrVpVIGMESn*Tl0D@t~7yLB7lEjdH%|Fb0 z{HM~tt#1u6{?Cl`P&gU>m4;%y_2_wcMC{MI31%Px#t+R^raEwbQ$Kkd-)B~J5;gi4l&1C>1}Lgk2CQgX(1trKo27y(!Z9^+8QYb?N#DE zhY}rH5TuXxP+H``E&+tsl1j2l#>FPYvi+R`6;P#hAtxSi$5Dde+=N1@S+` z?Lb{znWjVk04=9tp+l2ORd!eQVvkfBOyV8UZ(c2k{BHgFBYW z_4)(pCw|z-{C#^WMOLPp)itU+sOB@mR9xD@^z3~3uK0t;zXGIDu4$K=Tv-F{P?NR4 z;A%?#wd?){{kJtpipM4T+(f)=xs~G6f7@SQ)sjnnA{cadSP*3&JC4}gf1sxG2QPLp<(F1) z;qnx!H&R!JMcnxA(TJZjDUT8snbeJQl5o~bwX9;LLCl%>kJSv`qot1-eY%{F@OOJoby}z zK6_bgXDRZOE*9qJM!3`?v$#5Xzm+A*#LkLH;1zFjvxSGZZOe%iW2{R+F zKfJ+Br#(kO^saaI!|=9=;O`S!YI+sd+U>O{jMLk~#!+c0Jf`q)Pp|l5x_+<7xn9SS z3}l^nRbOg0myzo~uqLBngU8G|{e7tROP1YDF!kJVHC6PIO(W}Xjh1#7p9Op|t6Rr?aO~R) zO9W_;e1kbEpyZLpN#GOSsr)X`kHmk1n*FVrQQ{2=jrFe78>P2w31iPvtBt^VvGu91 z3pakn(ycG6sY`gvU%ykC@VATF`bfN)C5|9Lo+NXSJK%l>zNl}E)*cknCA9F1+{G-n z8S}32a~|9g^~ujYE5u*9ljptH!gb%pYm#4PW!nMi_%>{au+xl93Cp<5}SlE422y)#t*OatmPh6sm)dwx#nIo z@TTVv9t>lQVEn$7GcZv-A_fzX#Uu z!B-l^${8g;ypAU4Dm#7MOa$)`;{8a;zd@Rgs3ygHT^apDgwt`8*kB%0XxZz8{fwC$$~s8fNS zgpQwucr~g{v?o$}w!I`yZ7{6S}^U&-WK!5e}?{5JBJ*lk4=Y@GIC(jBzRVg;R zp*|S=7T5e6;#9G*@eD{JwrQNbkZ^_AjhO@!(>ddl(t+_dZ|pX))26gbyL*YRukUY| zq;Ubci6nOeY4oqC#b(%C{!n#j`!yE5q~pAnx*mNh5}_GdSL~ld@h9UJx$x7+ekYpe zP}MG>*5&^IkL%kk+{ZHkjlo+7Cm0(}IN)@zm16Nt&X20e7MFBovqvcxo=8~{dL5+v zx$D=A;=fac3Un#PoiBze$#ydr7MGl*Cw+{UatfTJn*9BPf>0Ov+ zxz)~0N^TCvx_lVbZS_AE`19g)^0aoob7>k4!>%^L5X|!o^aS_%`c<#li^N*D$Di5* zUez@XJIe5nhV0;$(eJH_JA=8PRnPFq#L7-N*&TIaC3q`*Q<2X}H8$SRiTZOUp(cgl z8%1;$+O5(T9e;HjH_tnNw8M|5rfaCtzA0$G2L2OxgT)uoyjnek4Jo*p@YiKV0*v&@ zzys9PVj}&MchRv>cc~TD$KkL16hA<=vG~nz;~DhD(e*D8=r)f&o(Rk`f?3d!)Pov= zz;l}X{{Xy_TP+^de7(kNuQ&j_fzIB0{{X5}_}94OJsWrN`GeT8FME@>yx zf0^AvN}FDCP5uMphTBp2X{y_p&Q6mHpl?Neqx7$hG|?=2Cc9}2ixi7w(qNOyEHVNy z{{R6T)L6%MZNU4?ok2{)r)pB zt}c;ha&XEU7|%+XF4o~P2vC27RL%*-SW)=3Jfq^j!rLEz=je4Ll37){4D*pd=259AH~wo;oUwxF=LrwxRTTq5;++sZ{5fv905~> zQI;m1DQ!|#WUN(86en7n_*L5Ob3YD0W$zvQK=1+A{4sHBtXYRCC7+w+$fOTOuK8NmvN%su0usM41}Kjcq5M4tufhjDAtq`)jM4Jtd}~cn9@?(O=}Y! z^*h2NxLYZFmR#<1$m#3b{{XFAwa1E8qgDrNzwqPp#%q!kR9_+V60aUq%0tD-%B$yX z$UiG^25Q@DJL3+|y@2FrsI5M(+qwl_EWFy=yfH}FbsPs~2Oq6x$2>|*s)Whalo8M4 zNmEw3(6=?*hW6$Kk=P6a(Mk3H06lBW^&M%Zy^#X6yk(DE4&TbUXw&B0;l)=_vP}C6 z_FcQR*YxiccxL-(j`L1tfhM_%2+Y7`Sy{$+=NJPWYv;WK#B+Q#@ujY*B8zFP?m=Sv zPSP6$e88@K`Sz}=*lH#t7+wSnc^QN)pSlJIrg+Hu z*MoR7$0Nc%9M^2cw)?$GC4pxR{;2`W4Wx6sj(b!}PEw2Pf`$%Jr!_aM<#+d+4@9c;~|t=~t}q z#KkfWz%%KQ$KlqyaMdFhWwSBHDAk8OH*`zk{{V(kc!yOp%#CGgaB;T;{RMs1@N>X% zYdYSOWOQqNOT*C0t$+50kbdoR@+eZFnT|7@j=2Y+=FD>%bR1_tdN9?l?BR|MYLvNj zl(fHN^hq>pQDAND?ULHu##BZLYyvTkYmWFws6(lEVmKCLl6XlE8oo-5oMd(w75Us_ zQxitBrxxtgowc&m+I1B9lOzI3fOXE+1wx#9@^MRktEl+Kz{qzzbGxWLg0A1|S;kM@ zi+U)#F58^1R{ah`#6J>_fvoG1*xNRtt4g~fgf`HqtM`fL87y(fKGpMo#I0`E;m_>- z;u&=>4n35X+Gw|y+G3K6sitKdkV!kSj+_DMUssV}XtftQ$~9b~<3*?MFJGVJabl`U zoL!@M+gI592=Tnu{xH|0xv}uNw8= zx!d2i&W?|9DNsmdE>2JK&;I~grqOzar6$rH*KlxOp&PNsr?q~#{{X=+JQ?CmLf6K> z*;>R}Ojq`)VD9Q!j?{>`$cHuDj!=fgu3FcLGI*U-Yii z#j%eNd{XgE;=X2kmVicogeg!Cet_3aDwnA5x{Cb;h@!bEN2|j4rM}go?Z9prD>43SUmjj0Ot(oeB9!>CD@WT5W&N zwfUOA@Ju1Q_L9MY}Y6ceroZ~gkn5E8-Hwm*o@pVJEvhoH- zKb2CvCMaZV<+hLp+VQko9lF^0^qFQPhQwo%bI(Ira{$pca#Vfe)Bgb1U2#^>$@WK` z_<~`vm;k+o2T@t8iGYRz>%n+0BKynX9AX@67X zf7@&JC-BF?{{V$IUN!K|{lK;}!<$$A;_Q%s8C$3w4>_;MO&`PyHSCZ{a#=%QFc{5r zQH`M5*Rky3vnkYRRMDqqbk{ocQM(`}p9{}WoSn*B%kEmSQ+C!-PW?VdnTy4_>wS)T&Rfrho;kF6$&PC~rFdQb>$1PgBA)Az z4o4WT&>#3HAB0lN#o8~5EcA)tk5;ipy5AnudyIU{V`E!%NHD}_4R-d#7#Z4YR5bG;zb0v_svilYpVky-K@6Jdh!Ii$wC{uLd=2|9cwb76dyQQ!wFX7h zWZKOE+H)Rp@~O`Pyj%8m_;umiyIoEEOAPbdOJ>25ZGyF_z+{)qIKal^z&Xc5T{LT| z*mYXl$;HRax>rW~7z>02?0L%xOU`YnnFS1ohos z*5~ZEcFgd{<`~_WZonr40Q1Kl%1&dSCZ8Ub&V7^@32eL8{!#fxi0f7fN zImccr=&+bvE-wxH-Bj1z(D|&-IjdHuvZ9)bdikHCUj;vDEphFvG(%x}>I#68+A^-v zcNgD|$}`S7iuz09$AawqL8ni5WS0#z1Ce>m@ zCRro7+FWhM6aYqZlahOZ+coL_3blsI!M2ZYZr1U-7f6`yBXP**jP>-dH;D0>9x{~b zVBsZFQqpTg-1wej0kPxkDpVPKc*|p^eZE+bhstx(UY~zE+!0hUwO|jP)~=FR9C2*)lOKi{=y6dwcWr{VSZ8Me?Q$Ns+qq z#t1c|X^`U3`0lSPWM3wEVqucZu0TC_{3+?IYEy|4X(F9>9j@z~{v(=>RM=USY-1Mk zO4(r8B$6|KlXx5LYpqJ4~UF})^_ z-d#V!-Wl;Woert4SPR%9yc1bk$eC6#k+IHt;Eeib)}`}qd}rcI{ZjqqO*$0wCU}^s zR2>v&p(l^WHR{^Zb$Z&!^4zZ#OQUyZm_DIyw=X=W%M#2MFvoE$=L)|3p1+-aHQ;?6 zJS%S6#nPtDtK_aiyr-Z8)B;UbA>JIFNW#VQbFYNvzu==@4wK?n?1!pdT3xlZ{*iSC zp#uP<7m2_i?(73G`hnM_e>agxZEt4?#!2mL@>s43k(A}WyPp;E^{L0&sdcgSxOUwK z=ly=A9}t-m&h7}GCK8Ya92O*<*!&f7ST~RxZFf|hljf(Eihy=$Hn9Hy$A3!ls@_v^ zU)IO52&k(*i~P$T4orMb(h5jQORR5p>GH?B)9LzF*1d3l;Ud*cH`In2|lf@-P%pzn62Mp$)?>SsX?5qvTf(+E9cRq zt;U_=I1JIO_PSN%o?L)sk(V92@mb*X!_<|pcAw^LkDcpNPx)H>j6e7$1MdBz^wLNG z+Rg{d+aIS|{;_;LAX^BPNGEPRa6ieeJjY6i;liyM_jHbY#R_tIaA}uN7PXWT0V;a8 zYVs6YcD{#ec1O?CKo&w6Y>ady51O*|Im^VVKtLOTj0Yjr zD!%XoAn0-F*P8KaT}`xljq75dCi+;zHbZ1F{#C6lk%;Ukb8tfsS{>S5$%Ex*n0Uv> zdT)Z+n)-dR@?(j4X+IC^(!MtFzr;;b$C`phfugo&!a$w*@BQYlBQV6eYuLkCJSi4%Pbv%qO;40o;wqAY>4F z9M_>jkFuv3HR^NXQf@O(MvM;;=$4))u$J2L);p_dQ)H0JnO7L-M}C$06Y=l%U)BBy zT}|Sj1&L?Tk-W>BB*}X~Iovz4kIZ|Fn)mWtbHdlz(4;075Vzt*q^jNi98IaVWO)qD}b>uFT4y5snKF>sa3hJ`>Gv`$Z_awUIQtIht>^ z!x)hmsXGQon7Pk5%YRzhoe4@wQ&(*BF&OC5=9Nh#tbK>A{?D)D&yNqUYaSqrThfwc zWVO9Ul*lpnSSX7Np2`Pqyyy0h;f96q&%_g2&#ZWE#WiHL7RhroA>&o*HmS&uC)+(T zO?S^Js~Q~7;_Cy#S@k-#`6Hwjibt{j#WALh@W)cn!v~K@)-LSVI45GtSwHc|U(&e$ z0Nb-vheFW48|xA($rXo=Y$SFpN0zy8Nh7yP@Zy?Fn?{zW&^ak$F1Bw^ne<=nQyYK6 z6QF7l4bNfXT{>@Y4ZfZ9Y(ap>e|lz{vxjpf&Su zmEv79;-|wYyf>?AL3~H1%)-^=$ui?4F7d}aj=g!WkhH1$dUV$^r9Nmb$?yGn9-3;K zgr%oEZ2a0hDld&z{{Rg&o4IthxzlbZve_y}2qVr;e735>N^{*xH{{Y1OL9Q)i zxp4Da%q}8jg?B504s+;#!oHs@%i|>RRlkcgl%$_+KO@e?Vih;+seCuv@jps@Gy7%u zXU6^r)jT!gjVeKHbso*oy0%FiHV!%*V2qK9@UMq@R-s`wv0*&_0P!lG!b@9Qw=BSn zHjGtM5J;vj1YE_UU%SYZxVc3__ZFrud~}OqcgO3Gexl_3&)h5jsPh^*1i|8 z^sX6TsZqvORT@rmv_5*+>s5WN8cTMUz4AXxd_Upc9@6snL9wz}r$I$JiYVWVv=`cfYZz#DIgsAe10x+bo?ARmn_phTY{v&Aq0`Rd- zXHd4&ZLrN9z5U{smLw%7j0}zJIUr*kk4o|Iw5RQ7hlFmq`C98~C;3@@=YBqoH zal3wx{tG;#;K#6(7EZ06SGZZwy@1~SW&=0*wW&=K{lKij`k()=&rE8DBK zx4oNFbo(un+o>r!06frp@Lwm~4@`97@K~(Bo{d;E>RXkro_{UODprL`v8zq#7kB-7 zpDupR{u7_U-ww5HPf*c@p{Y$1t-8x9j2TdkrBBVcjQeBXr+=n+Q$z7khB$2H(ix-u z{{Wq25cTP}XRlr>t2d*E`m`&{66ng_>~*x)qSb~5q}^G;Q|H&-f696vilT$TzYlI> zfEc4#_9)L%c+cxv-WReuM}{q9Bj#8aIUPy=0QJ}A)h9X7ZchBu-_d`;K7m;~C1V5P zwaB*c#l4!6Cb^U;T=nPw0M%Z>X9`(CX>Q{Y#)FSQ2mb(Cva23kH8=dyZ|<@&p0YR? zyltdu+H$Slr*Ca>dp7n~l|ukd7mWG^r|23o=w2JX7CVjY{lQg|PFc$xs7d@muBVsd zX;Jplr6opfB|C1H{4vbx({kkIS6ideyiRPQo#CDYmdj1k_iS)TX$b*7rzn3q{2~3W zziA6CL*pxWep`1-4-e+aL_tY;M-sn1i|35?uc_dwPZ5ljNo@sn>i+=Y&nq;SB^4j$ zXOr0cR`8|FqchEKkaM~tgZXB-y=USkm7>TEnM<{sKh$7WksWIuIBBRKy6>r~03&2J$M z0RWCac0ph3{{ZW!t?UV0hWAM}&loL?4B)PCGJDtbHU9tv==e`BguiBUs7D@db=%*x z%H1}_88M=tt8YI~#=0=-^%2jCe6-J{wM(o20E-_KFFY`fBz_$5jjR{CgR2qttEc&) zgFoC+hakgvorXqR(Lnt5O`X#Fn z%|8oo&Ica3AO#$p`&D8s2)eh@-s|ibNVg?R&r{0uY)aMnY4(toB3~J zvJO$^v_$>cb@gn9Bk=8CkUk!T)ZNJP;K?H7V>`eNA@=?eUn^d6b5`2N*3*ji7Dlg# zd_KBuoxQO>VV3?mUA;p@4gmHctA>#`U&}BdqigsTurZ7?Ha}IaIm42>eQy5%Gu4CV zjGt(JYyJtL@I^niynUxi+^WwkncPR-2LumJPv$EVS-O%PYB0nMU$e5Q>zNqmk5B7f zoKu%PpIaV%NAFXL=>cq@OWk`$a=u`TRgj!@QMqz+?~3$K+HMi3_=8`!hClV6XMaqe zF97~bE0Lz72|kJbhO&q6Qt$q3;rv@8X?iz>Ze@*vJ6y&YnCEEo4_|%N@=uL!8q35Q ztk9ez>6Zb5x7{W(agWBkaJUcKTBGffU_SEa zr{iAlr+A9a?{K%4DPt|1BWE9lc=K_L+*7@tsP)}BTK3bqqL*mb04dr*_3K_s@mu38 zJ`cB&!pJS=u2%@WVjTBA{(`Z@S6FI%^7#cCPOQ`y&7TzA%W@S4h3S;oXt@fh3^$*}caw8r3_xG<4FQ)NWhgN!}tMffk?L`uwV%P* zzAk(Q^6# zHT2T6gVOdqmG9B>i~P^0r2#C40p4gbAewWc&Ep@r;BHT zYpc2M8E_->pCK?h0oV?4>t9nmWb4v}IrLhdW)}k-B}r6{?_-i;^2UONQ_s=g)^Va+ysXNCR}=rDzCU&KaPbCVUM z2LOFrujOA;d@sB3=Yk-)he-zLOb?jXDvWw^Gk`$k@tXGNWt5?BYWbgIAoA(wEqAM+Ic#4t-Xv4a>)v941GxMYr3@Y98&Fx+^NYwDZn|eYMd!SB?Og^ znXgi%M%_s^bZ}~@Bq3W2JNF*7?Op}(^!ioWB$Dn<_#dhKYf7ogCp|aF?tX*(3izQ9 zg|8&qtM)6o1Ke#G`S1qst`rZ#x{vrM6ls0?DrQStX-PW$1$k%fh2ZG? zP2fKt$k9bL#NGy$XgtgwZQZ2r{`jvsu4%Ntt#XoEg>?-nZ8h7Ai&c;9D-`gws$7D3ZG)T+x%yW{sshe`IS%NYv%s|g+H@Zzl}AR zbld$-dpRy5nQeALubY_88X`gJK+obo9|HrL)xlurCmYFqm;H7}sfocty+~QvYMVWu z;rHyR;VZkli%nBizl!1;)q+?C)eZ>CkZ^I4oO9F>*1a?0Z^3;V;lGFU%fAm zu(daOc=E0wvspaQ(Gj*}Y>aS8Aalb0UsZV9Q`3B9@MFXJhMyuuB$FrEE|%1=wj(=1 z0DOy;3y=?9E9bLHwXtspm`Yl^bM)13`5kzAYLD*HyH8I-ElsW;NwS#1CBC5o2{XGP zKZvRN5_)@z^RJ8^9Gk@+Jn*lG4gK6-ZX(uivs?&#l#?iNAv|q-a6L~>{{TT+Qo5@} zMp2H7(XM3w05gWHVya7-+nZJS9Ix#U@g83b{6Dk0)Si7m#X5zj*{&^`QRYW1OccmU z@OK5=2*=(ZTHyZxWvTod@drrNEc{uhTU@DVg|ssO&Y+eO72V(F2aZNF_0p{g%L_bS z9{VPm-%t1kQL3clPD@qM`JRO*?9JgX2h9sv-fb;c~5zS89R?zy~|m(~WCpxaWEmBN?xEZ8Vkq z{zOKFH3-zZP2GLRxcCc1wEqBwk8N*xr=`#Km9c0Y#y}-YWCA*ZJNl7caUPcT`izmt zjTSu(fp5d0O1<-Tz=9_;(j41*EJ0%MF7Yqn8_|U`4jw_ z^#zQxqOaT>w?CD9)mbG%oIP9l{{X`thSz7Dc!J%v&x)E&sf%pUIc?K42}E||7Z7^1g~%Q0yf_S%P&jGj;Y2D@U#-qcm}+$&JffVto+t4)Kogkh>1la6*$TJz&9&`RF7Kx z1^AQT852{x)UPIr;7uzt+{JdX7h*}t87GoSXC@=2am% zdpT(1vEz%T*-wET!pPul3S1t&z5CW>=AAXHtiU@0IAxEZ$nGoaBPRDeX(YBY8u|>9 zZWIzeq&mIE!W32wx-x60`)Nd0?_)VhU zhA%1SSCTR^6%Qpha1Jr`JXb?=rH62j#VH)ClBOftKY}RxO8)-{i~LIP*TkQXHX}o6C%W+docev)U_vZ~$=aaxAS(=x z4t=Zh!@@>e$XX>}k`xj%0f5EiR9>FjzdHGNuOGhCSaqH^5=@|KWJO|^zDDdFsLe4&fSsy3Zh_h)ZqStvT=UOpKH7S z0OX}rsr&hVb!qprnbmcp;{O1I9u&BCQ7Y;Z#?JU47F9UMr_5{2EGC0n()@7^^_)rM z_ z@Cm@*wLm=d>?;E8*a86<{Hvw!p@*sFz9yA~Oc?JS4h?@TKeoIGe`rq_p;mNxp$@9J zBoP;W)zyVlp!`3xxOqI7A&n96KH$K{eSq)nUeubriySkggdrq} z1~?r-2kBo0ij7xM$-cXvV@WAfQs{Nid{xyJ)vZRgDT@c8!5+Nz9erz`6E2~4q6aNI zjCAYoj->n7HCokc`?V!>wkn-CQ*Fgs`=4t3EBHd571JWrFLud%<3Be(UU~fg0R2_# z4%n0DJ5X_->t9KNqNq|)wVzYUuUFetZ>K^T^9VbKIL}J>`$^UGf7y@Yh32cOUB{<* zYs4%2$)?CiE=Er{=o>wK&!u)oe9}={w_`e7tC}xnpWo2)?~cFlRG$d=JIu83wS=A| zy!E}Y_YQjC}KU1-lY4IdRL=E4aqCX zYkdr0)wMip!kz=yz9njHr}%$Jy4CL3k|VW+q%GS#cK5HRyl49X{7(2=@YHytSC+Wu zyijAiD5@h|5TNzzUhO3sO40kzoUbX@ca!-S7gv$a7C|c);|C|Fw`zO%rsB>=8 z;rop_oyYtmFw1iqDzTXs*yS+)04W86gPz&1h`(tsh}!4FZwu)fg@S7gFD%uM+8~M1 zB47zVaxwWyDmIi}+4u7@+LV(}oxSeoyPIL_N;0Vi?H-8uLeKVwO-gc_g{_puuo71O?#@($oYC$ z+)f@^$(|N&bYBmC&6hWN>=Ef6DxHKc1VlNQ2>=@xZ~*jTMtIIKU1x|JU-(Dx-%P!o zmrc~L;z+)4kQtMba-5RrnL3-w7ds zt(hL`09XaLkm0y)Nme)+9Yu0q34A*~i)E;IO>aYsM;AJCOuMkT&IlcF%l`n64l9oz zMlUCB51G-Q>S(IBUM;J0FZd@xsO$QL&bc0!H1JOi$~2bPD1^wJbL+Sgz#s0K<9}!$ zh_U#4_I$h3;w^8gzNrJ*7{MkkcNSC01a0f@OC{v1h4yL5J4Lv@wrxMc%EozwRAmMU5#&T=mfrH@93q_YfT4!vANSDXp|7VuXa4{bj|}TtwUx5Te-ze2dvL9i z=00(rIxgYI918RBS)6fomLjrBtf{pqtu;>PWqdn^ACeyoWS#w0i~j($zm9ZYgT4;X z?&Gi0|3e3$z?%4AfLOo}o{;9&Locdsg!01kUqD#jGuSv?lz ze+feRrn{ zDaT-I+O;_)PAlHFnl9!v@iePPni5X^3%Z4@num!r-8oLxflTrMd!7g7^BRWQ2|Pt> zav+hRmr=X&Rzw`E3Bl*L%BKg_tIVbDMNZdUSI++ck{qm+&%$r`Dlf!4uN3@5v9Qu? zZY{huV;7SJ(jgH}%fZ8RA$cECYx4rjSh&KYU9fD74E5mG?s*0tSUk3kDX)8$^7VS3 z8IGy#F%oNKq9m67ONjQFJkyd!Fmh_An>2Bl@Izqd4UMO_O7*tX<-04-BvLZ7IbuHk z;!l6q{{XK}i|o=nF=tgH7|t+%4z$zMjm!4Vkido)0OKV80PMM`7Uheo?nKT^A!n#{O^b2vVJhHT%W?00emP zxz#*7;_nO)a<>p%#~?Y%xMd^o+4|Q`8KqHN=EUnv{bBKy<%QOax_r$d*s+nWgal>5 z;B(mH1KT<7MRPW{w-9(D*)45R(kL2hdkBb)RTm-{MsO5${{X(TUZRDhq}BT#Pqfj& zZPc^je}@)+Cf2OHN32^d#;X(nL2E3&VnHb%yerUfc;Ajd#}&hTaQ&j&!ae};q42bc zsq2=_4xH~8AyVdir~$i`P|dV)z|X%fB3!CcdmXq{%_y$N;OB+iw7nBkl3S0qTuF5) zl0v+kkbwUH6ReJ<_9-YXKz3Q4A&k3IA^QS z$FavfDnd`J5W!}HUa@9St!=DITbvXAqrdzJ*J1J3PkYT*#mw=B5$V zletbmPu8@dKYFZJR{sD(>c>hK=^xdV{{Y~ZiROOL`eG1SO{Dl?)p$Ht^^KqglEN-? z#~H3n#a^PfW1k7LKK3Kga1VTDs9#D}-a#PA*iJ`(!n|bc?_;-f=Lwt3Vpl49cC7o! zipVfofdd1zbyIiL$?AE>h}m2*ZUE`H*YgegWJ(+MnDIEWaW=P+uHyjy z>kn=@uZnQ?@|`Q&o8f+E*HCIVi`kz?cp}En;yt*VN4~Va9$rc%!mAHbRPs1I#eG}w z!{JBvP4s$&>W@7JV?iKbIpFb{#}Aj*gxU})l z?IYp@nscdmlKOVcF|K4idH^^8dkXYuQKyDVQ}~|mu&C0Nc(%4%n^r%vzlgNWS5RLQ zqj-87H6q|o51A$haG4qF+=~66{f_?t;GDk;{6p}^N%20V73Yd&yH;gO$MTVOxn3hf z{>l5yYoprxYBH%w=^1jfimgv)RZ{BXbkEfv1o#g^_;IGkWua*nx>ctDCA2FZdv@x6 zwb{{R)+_@_&-k5ErC3wcsT zDgh$|fG~0oKu1n!_^#b}GUps}5jOaYQYxB#DEN&57p@zK4l zrS~dWNy7K&eoD_B_LFlpt;M;9;xNKkE*A`}4hrM31b6hUT^m`7_DI!~!rydcWd5Jw zUX3|joK+(2q4Y1q?-4z`rC5;}KDa$=?9T`5B4&*k=OZH(?NEHsK64ujRJrtbg)f8` zh`~t#v66ZU{Vn)GdbhS$7SfOs^G}u%3H!vU{ z(_%9QVW8Z?K^ehQBI6#|#c^L4G<`?J-?NpDpQA>%SJ%G|{HTzD?c#0ItU-Cn&?>sof>a z^i3P~K0UaPONL!e1i7~}c}1En!C$BZ9)$k@L+C|%9;@PgL*kCN;i*Qq1bSwhbd!CK zYejM}2w<((YXgF(BZ28(V;RuRXg)@@_?PC7jjKksQ;7GkW$>JrjJ#c@_`~Annc>d| z%-0td3HH4*HZC?vxS4Iff1qXQ$zXHFKCSqFsmbD99(!juU)mNkhm2gpvFs89lmq>d zxO3ckV!uAma=&EMD67G#ML(6&`~Ls~@A5oz#9!KJQpvx_%GZ7+=pGXA6naLz;zhXB zaXqWJB^%WVY<~*`5Q0hk%r(S##!nqi6z9}e7E71Q z8HKGHv2@{6;9kGvcV;!?N~Jzob2afD_lSNo=~~Pdmr~lxXM1CCv&1k6Y#vuUbqq&5 zbgbVWS=sz>_@||4x_+d#b`o6+i@W(8l^epZ%BQK?2g*3kdvjef%5fMu%22b4lW|M4 z*57%Y@pP)uQE%U}yYpZ057vJOcsEM;QSko&Rq%St_CRF`V{qhex^je!uo>XSK|hBT z%=|R7eRIOP){`yMJQANZVjnmUfB_zvBei*$3`I#%pEi??MBKcuVPYVaWS7A>*)PQ6 zmJ97}S(?{PnkcOw`#NzLVvoZDN8p=N&7_^ zt8E`IpHtApQK01(rCZeSZ(2`~d?) zJ?rk4TPWpai_f@eNX7we%ujG@hc)9Yc4O@!8&jm?WfiUO-M=o@9v>~GhK{<+xtFW> zowRQUU+aqARpz50g2e*-%n!v+kzx4 zqkbH6q--Z7o>YqF;ru-c*r?LP!=5vjDvs9D*ZFEzHgb&_IJ-1{1AIgAtlIXgbq4E2qceiN4MNFM^FvlDFK9^C{m9 z(*9?E#PlE8M^A#&!nr7>c^QKcazZI2b;lV-{Ojfqhcn5lU0oC`sU^ZL+;&9HfAQm0 zgp`$9yw7*1_3|eXtfS==bY3B~lF!7qujYAdn#ImW-$sMe+PeP$i}!7Fd#$54nv?0) z1&WRsEJqysX0EJMqeXPTLqUzFC_%Q-1gjcw>l^pSb^XK_j2jh8eEcH(s z-4y|6(`Dd#FeLQv^3ua;UZ<7+0QS?f62Emtuj}F&{{RHMJO2P^jXaPs_F2K({3iy# ztM3iAEFydY3TGJW{&QUUifXEUM-CHMv+ssdSg<$)oS#aiexvMCusi-!lj&YPz2CIu>%Em^r9a9O)r-mPH+J@z|Tw^j!&(8T^fGgQ;b%r=zUz|p(Xg1J|h0hTE)9H<*t`5k$)ac zH#Vb&J+rrh4lz`I2z*S{_3cVu4&KjmW3EEDDGZFhW(QG@4+FJ!&a~>`?Cz%xpLA6z zLbo(;duoqwwDHG?G<{6K+O6a*lF=C@Brxs>KA5f>_LBXgwaq8?ckwl=+=siFBZ4W_ zcCxFu5BaGh@vewAs$tr9g;byD{{R$u%1Wg=v68f)+WlAH&&$8rci?M$a`>sG=>Re{ z-N=cE8;Y-1WAp%@!oR9N1o%V1zp@8{+RIOhIOhww-PknOBz|0ba0m1Bak!XLl&3dn z$A2=X8N!7;Jw57cBl0iy&DJk|C29K3uVVwGw=$@8UzkRqj0QY)#y+OGU)j_4~szmV#_8QjAV|Yp}e=Z)NCZSnN~<-QjZx<9Z10+m-DU) zl1qKgwQbK5{fKWS@Ot>az&8$}JquASVHtdpZ7;X0DP>iZVDJ!!)WuaBKqG><9T>e47;Gn)_$K7YQ}I88~z5dh^YDm^nUOPoKxdT>7WO5|)NG0G7z= zdW!oHYV%omS_1==d;!O7*Hw7)t254_E=JnieO z1!jmha7pAIatGy6TMG)x)gqen9UN6kFPai*qtErfg8morD7_KD_A^`~1Le5^Sg>uu zNx&h7e-rCpK72|2oHdJWbuaX{R<~vzX^uUtSdYF_q4}^*Il(+}UPQ9jfUL1NM)Xgf zmq)kx9_>8VIQnl7i%IiamZ$Ri{pXQ*U*d(=hIJKNi%4y?sFWCHlLIFl9FA~vP567@ zUlV*#_?zM#Z&|;OL6%nYH1D$95~0Zek5C91&mT89ayA$PBJU!2P8=Nn01?kz*T|k5{hJeA_>rz?Hu|)> zaj}V}j66G$#)`x%_}D( zlhfs6!0(FmYGZ2EgsLqRY~8$@zvN|x!$HfFc}n(wB+>L5^c#I+L%w;WlGAh! zT)&!7IC62*JRW^$$KbJ8tQ)09JkDPN?W?_?q>S+OY0|HGblv{|UW6V8)okVXg?*|M z1<ic_3)Kr%T=j;_PYE}Co{(==9H>M`-!x z<<_i?4Ya=uS?PA*iEehqoOKw>wmyLVb@<$MioVj8za#8q?_&d2*Yx-CoKT~{*BWFY zEbYrKT35p44!BW_p1_*?H2(mCg8X}n#lIDs!nPM5Y0`9L5l1n6E6&3*xg81Jl_%Kx z*WGY_Us>Z}UZh%rh19#>{vYr>eA2XO(dE6{dZXZbsbjU;5UlP9%Od~@u72)#cn)xk z0q2rBXMta;G}_Slo1j;*Lcwmt*=%H?=Nx0}S0mBV;zl@7cmy%Q9sRo+UkOPm3oe&5 zYvvn0u>p|S_T!4ldsU5r^04{Zsu$k_w|Z&wAviS1=Fwrflqrm(5CagqbL-oll^WNfg$vb6A5 zhppDaKPL^Fk}_dY{7eB{pH@8ZO?2VcFTD0St0z0f9+mJX#qwYHKF`G3zLwfW)7dr5 z7V0Fx^y?Z*I-l0fO2 z^l8<6j;DKaqs)~gq^a~xw$G;i5q{3vN5idR3z#g9qvGvA7n@eRpUjpuAcoICgK0l1 zfq_r|0D_z9vS^>OWEyUnBqGZC@;F?w9J+&?kHinHd39o`JFc$m_AsBknorRmfSR6% zA=ND)k}aY*Qcb6}shN2{1Bi7gWMKj)6%>gG?XaSl6SOO z^%9Ni(p@zC@A@3(ryzd|+}t@}%RlZ$cJ&N@r|Ve0HMEY(KM^CoR@Y665=#@+N&f&E z>&u$9J~{=H7?_GmKNGe(iO+1F2>ab`a&2&7J7{|@?KuP=n zHG9N+b)OJh#8d^FMz>+d1g21bAy`edhow>OulX6q7oEC0erF@%ByBt4Qd%Ts+C4cK zmF!kV0RC0sKNFE{G|f_WVyz~ZAUWp*a7WjZ`PWt!(wyYF{{WKz03)v-2TGkdzK`{h zrT+i~zRZ8LHkgZmzh<8#bU!J_>0j06gO{*}18>SX#d2m+e$ge^^KhRFKK+t28kPqj z_dc~pP*8OFfjDi4f$NI#?9{Bz>z_H7^d|)Ko;j?W$3%#X5y=GOr%LODm5f@s(MXO4Xo}_h0H|m;Ub()9BBp{xs^*U-)lL@jM7t3DPU1 zz~y&=xPE#3tL2Z{M*7+Q3G186gK^|}TaQ!btA8MWDp+{i2}1kAyrR65w2m5y(#KY% z{M6I?osTsAg*;V#;ZGa?0BC9QELwoJlWe;IE4wOKXTAyN9qaaE;XlBAQ{vs()%B~1 zp|O#Pd7qcLJ@8L&bNE*dV@{?w9PsJdDP5k`dBY8djca?{sUz%P8+-uJ^*@8U*M;n? zqq7&5tiE;uB0w^XN#u~g8vL~VoWEw@2>#Z84{!937un5i;>`e?FFrXovPYA*j)j$h zU!WE3;NtcWI`d;C#dJd;ST5@h{Tvj~c(}MpCc4F+Gg6G` zPU}f@XXzioZ}=;NfVQ44(}nIvKGSYiHo)nX`={{5eIMd4_$r@(^nD}k7FL&+S2+1& zlVYepP){F)aaYMvSU_ zF1^g9FC`-esj{kEZ6)S;y;C2Q(NmWyJ@!w z(6o?BcChDw8g9#eVL4`7_#uXyYiQC;Qre51Ko_fnF}Q_(R~mR?osv z2{kM7S%uZ%jF%w%!SHayBoZ5E0TL>JLDYrOa zM;~|tjB%4*Tk!K&v%Bz3wyAlegqHXHA5fK-ZbBD952(;4op!=P#i+&>i0Kzf*C3uTn)2^D=P|{_F=EYhfrUopa4tkx; z$B|xPH^ZGbED|ZjjMsnUMmdj>D%V+ zqW=KQaipu_`6slm{%0ru00?A$2l$`i8yz6Ql>NJscKwsBu)!u9LsIaMr1CeC#)f4!sQIEBWJIl`XN zxA~56d`aUtEc3bx1@mMe@MLW5{Fib3YY)aAK3@;(GhHlxe8{5G#u3q^Y%{m~1xo(_ zD*PW2fR!wC@M}i~*W><2=$LxG)`V)lu}tuvi@Gj_@Y}-TeR^0e^}`&Bx|GF$j_O6q z<&f^$gB*MJujdcr=C7=4J~OyoYs8TFmS~e|URz1#BdHk}I2h~Djt*<}{ugzs<$Qj9=J7TU3MKpc9G;N<$|1!Kh81wQVX3$hO&%_6jz>GE(X;+ zW2Zw-)jUsgXD0b4hTt6FG($MYuX>h^6-JIlykU8ALPX4fj5g3SkWN3wnGcLLAlO&j zIYGK0`1)jf(HNw)2Ubkgw(*XtszFF5;Ncz+GJ5qG=a1!9Pl*FsnP<{fK;(ID%g#CE z=iZ+swM@Tn%&jDTfPT!swbjRgz8KHoZw2^nX7N_LepU4ca7acQPz--}lg|T_U%211 zkLd^mUCn8A=3m_)-5hS%1ZTMm&!8V#^G^Wkx&!=7@qBt6xVf;jxp8@} zGjVe;>VTebtM7sQ{YcfN&Y>QMm+We|%5r^AMDcIL`>zaqHooz~-vi;hXHj7G?#(W> zaM@2U9ekj~fCnr=Zh&Xzf7=)0uZ^|OhTjkLFB?Z`XRcj;r(M}VHkcH%6-F62DxpF5 zuR9l6P7;&pdmhFHi;Y-C9~s?STWY@&=ef5Vt)saK7|$MDLqCT=e+uKgIj7HQ;Hz8d zfCfZ)bDr+ui+(`S(~!bull=$v>C;F@`oVSSUyNxqm@ z$3D9&3XzpcRM(pbNkyygV;UF@-+}HYWClc58%R8W>T&v-@;{4~qCW-d)4&Ut)8%&? z@&cCtpTm#Nw#(h8Twa|7pdO%K5&*?mLPGQ zaacE!G29eox^(I*r9Oq=uFm4gAl;0OF`w+#LE zyo@TXy-(GT3YLSz_7WrIOkm@apKqmix*v@%Gz*f}lQd{@Sr5#vJxH(4{jamE+R>(c zk0P9TTG08AS^nDiLGh7%Z{eGLu@X(?jBIftAHJY>2L$7{D3;OqIljP6@JS$HjycNt1AiCQp17C zWgmts=YQHR{yUF>ntY){NhHy(eF)D#m-4RcGUuaJ$7o_={`Af)a`t(mzuKoS%`@7+ z;FLZHvGJe9YomW}_LyMPo?#QO0Pjq3->Kriq;O-mRa8L~V0^gX00*a~XyG4iI+6IL zyYwDoDLzPFMIDPvAh?;=IUscFn*4b9!yA6eAGZ&O{7+`jZQo(M{&h__#AJy{oM4Q=6Lw5JD~ZN zvHXt-)a@A|Vt_f_!P|q!{{X7F`SjPjm`xmHu6{v|qu1+QwIYn+E32I~g83R>lCP4v zc`&#kx&ir7X*qH?I8mH7?oM!e)8<_Xv$^U%3s7f5cLf}hPbcs{g?@v49*qQ%!~kO_ z1Oc2^rG#4^He)MneU)U4-j2rJp{FjR0C0CNCm-G) zTCEnnojQ9Pgj<_QGO|H3hE`sk549?>Q_<|g5|k%(x;*n#_&woo5Krb>M=pms!2bY6 ze~^3aKhTQjq4;0oofdN)hNEk%Tl3|kKbFLGAA5}ZX0wWPmA8q~ry85?Q@-(Dzu@Hy ztZ0*4pz7u`wEN_6e>&3B{v~O*&@xDdIM`sOG7f!5{{UL8Nljf4*DE~>!#*d5%F$!e z?jwdZ=>&LCJ+b-Mq4;OwG@cyP=AH;*Nt~~qRxqsJQ{Snmd+vP|qkKct zd|#zYr|MCp*3##EZO1K~oQ^@~sOG+5@yG1Z;-3QP%_qaXPy0trE@Ycd)FdV0$j()| zGVnMfaQEiCoNf}&oh#V-9H%msDSJ7)##(wD3+SFM_^qJH;ZGDJY1XscM=b2Oo7BnF zZs3qfZkRnswSCXwd#KmpKZb1Lj4D|~_UVPd0ZtTqfG|G_{NIYFhFLXbhDj$hnqBXy z_qZs@VxZ@{jnVSwh&8z{zi4j_+u7n&Rh}!1AG(GaOLK$Js`l+(%dgorwwpQ@V;O`? z0dcgcQaB)VJmUZX=qv3wLX@cF*jP(`OWW1A`kxELa_7fYYov<)DDgG_0EYZ0E~lYr zhfuhl*vliv%Ye$D42*(!?7Y_n;opgxb@r2F*LL?7Pi-N&y<3PFD@~2crLlm!j&ge^ zwR}!*!P2RU#Nt(D8k4Eb6!y3LKjeLWPns&2T2#`#qiKAP!oS-m;x3`_v*OLm#dYTC zR&3B)5x9AyC7M&7%*2p?yMfxiJ%0ge*3dJpy2`D=INg(9PnS}T4+&2UwB=v$=MF0M zYf7g^^f9h9WsI+x14is|fCw3?_WBl`B;h7`U{m)-JNl81xaPeC)s9xISUwojUUCie zh(|zT&m8`h3-~tHa$es2Feh_vjDw!P)`cXuCzQyOL1?m8;uecMvt(rBk9w&Ni2iO& zk;>WRv-QumJ*uyLP^?QHfp@*02*Y4u_OL%s>qJ^Er40W7>fERY1B1A8{(l;uG1$Dz zeG8X+Vn?b+(w0jdL6IIQn(r8pzl}AtQNWZzxyKo%^Fw0kA>^3_>)9`5qQ7E z)}|dJMnYBX<9-`)A9HXcEPm>obvUonT^r--MWJ75`VN-2H=0xtSl!;*$_#e5EC6U? zCxWpiNjU4YV+Oh*7Z#$G+c{-vUTx_UnDE5Q@c#h8m!1sp9O-l7t!mY-HC;;PLRU<; zY=bCv+Dl<3j7LBAAC>nr`k+#cvD9}+HR1L{_P}Al4CrT0|1eL zNjb?C@Nez?uEFAe+Y?om$n+#-ZoeAyLq)OnAbeNcXN;d_2z$nF?hLi)1wZ}FUaie?jqAZ8hDNp<>VSNuglqr z#mBx$ADwf49n?jqpQSq=HMQX~<2Wi1DFpsMt!+*UKGmG{W&76sPJ6@}gm7M6+!P*U zw^xAl&Ue5EucLl-?*1|hBHK#NrDD+SNsrWRoagf&txg_1(1Lrf^F}pONk1cqYs05} zFOo>gv6&@MeK1t@ubX^ntx0|GN_iz7Y_F%u9Igfd-c^U{Ge!an+RxYYJzVCa_7F>M zX8!;Zhx`)^q5Yz?-gg0OHs6;A?i~LBI{vRT85G#U0RZ4<0<+9)s;@)F!Y_57eyn55 zBp;M;aoVWr5gDxHKypfv$J74+)m}r<=yx`J-tvgS3^BF&*AIz~S8 zm|GuSn6I9^d80m|;C)|9l{UGybr{IW>JRcY>EPokZ8vqT(S=tTJEwDu{gSQ*t>7(A z#^sfaMT4tz*Mt14!G1exM%&?LpQX#XJE(OgiNWI`au4hL>+5o*8C1s5eH>)IU-0Lb zo9T_h)Lm|$%^#&d@JK%ov-p?A8j7N-$7LKLzus-%pUYpn6GF;KW9$h%53OlCMr{UU z*R{7~hCoDj1a9Q>^skeDZV!S3<6prG@o5j6tZB#X+IGQ`@*p`u{_^F1xS_QRGtZ|d z2`P3t@7N#XvixoMAq~CMtlHL*w%X{wSB#I{N%*MSpHwEk*qDX5QU@O6p{*pjH0WuF zT(w#?z!EDcI3t0c#=M8(x4_>I{B`iWnpcUmxOE6hpDsc$@Ui1^w^ctwSi+>CH7M?# z%xY7OMawOj@~^{B_$EKYPlx9AOS=~F1>Dh?)?G*|h=BxTC;(@kr#{%JKVmHh!@dgm zCF0F9#TtH`W$?D6bshBb+Q!+134Pr@?l*r*?^wE+s*j!Tvg}1HEjn0v#@Dr*Z2nDt zCwR&a9{f%5CbOs8eS*sW09Bsi)&MXfjih3$fxy5ZV!7xLGpg<65x0zF^gMob?n6r+ zEY-AI9^2pxWqg%D2i+UH_0Q}4tLmSI{xu#Q)mSRx4Wt6yoBZazOf0Qyo;Efd*F9@n z_@yP}WEWD$k%RtyYruR%@eS>+5u{d_%P2v#{nCBV*JvXyQK zRd2j=>w}NVwAWF1;RRa_(;lDaHJ3K`HE_`dpNSUs;#*?UM=W^Vk%NPr9Qtr;YSY9o zr%Sibb_a;}4^MivQY|JaQE_~yU!{CXSoL+VaLp);$Vg0rKgs_9IInThJVK5E^8f_o zWB7UgRdnXHIcn17ckX)bm#&B-Ea!6d_CEE-UEGJgmCyzm&PPliPiohjnC5Y4vlZi8 z>=A_{JmBX7wrw@jx0l*M&!tn2f>&D|rkUf5yHWy7NCO31ki+O{y0wpn{9qVrS~LPq zzH9@_Z2IMU{c8!+=J<4HMLF9^YIvuLJ`}!+8t*{9lIk@Cn|b(k_5^T#mBZ;iE4X`v zGci})f*Yvy82VC${~w{Ars^@K1y^>9i11 z3)^u$s)j9xke&v64^L|RbBVCF!{TT@m15HJc0X6jYkgzt)t^{2-=k;eSB5lOty9E8 z;5!yZC(TzmAmkB|>IwYo>o(PAmrpTHyJKb9xw*zi>0hqlu+hWesnU*|u}OT9`EDx{ zJVqj|Nqwm|_p|4Zhkh>9wC{}&Gz^WR+uy@usX*7D8R2;u8bnMSvJ<#+I9B74j-&ny z3*o(I;FrN$m^7A+tgkN+Ufcvb%xtAqfd`IPY4y!~#wMm8IFzZ>jnygM56ym?pIt)> zUnqqtiR(DpOV{<-{$ccA8Qp1j4I|Agi?e7_+ps(J_4KZu+v2^%vBwIDm;M5z9QFKh zOWCIGbjGVlwI`1wnU!RajlXypM^p68PalXaC6S~v+b{#2$VN}45~f$QOx+joUE0D- zHjdzufPuz+^Zt3MEc`&addy+9whUJzXz8Av{-32OQ@h-1NfOVm87sG?!K=A7!NTpmQ&B^6M z1Jx7)&7Qv~=uK$7?M&(^DCm73`$2qX)$hM)DLxl?A6kz4#2WSZx4G5O0CdQ=9K@x6 zx}lhmdY0&VeIse`;@jb#nc=Sh_-Nc6Ceek~tEjoy*GG0+B!3i)03dWhk4o>OdXsWm zC9%a?DwI@S?^b$0g1!_(XW;EyK{}+e4Ps}XP`oeY8A%w%M@0xW06GK5CcT@%{vNmR zy{?%PX-Jw>5IDAsZH*Wp$zz;h7pXpg_32$TZAzPx(pKNOj3X-3is;_Q$)6U#ZVQhT z>w3P0;ij8N)3n_*8@rf-#M4Mr;Q=3Y14z7esaY4)qu!j60>hwUAaB%K%zI@AELK z7ZJSv9D+E`;~b7RCjjh1r2c9@O7EuM)uGbzi~Nzy-Q8Jwuh;ZA{{RzeGJnE&mc~CU z+N8h&I)bVJ&!^1w=RuazaYDvryool(xC4RH@4r`sij!{@|<6P z>+(G##IOxJ;kS!rg|ZZ+Xux2AB#i;*-A;a$%;AH*=md*wsl{ zRld#shBAEhB>i9FQnk};wOfl^z7RqESr^Cw; zbs5eCocd#vMK~x^Qd|E3!4%t?gnA^;JJKzP@KQ-6+pW!vq((s;?{Ay`038GHuOjiC zt=ylpjqLXEuE^~{l!JnbNE!UdtHY?$tlH~u$nDHmJ`y+Y`jCIYF;tJ*KT2j+WJ_s= zazD6EdHM?eu5?0v#})?B(2C;BSMLuq3cc2TfpI1PI2}HMqi#^BJZJK+DMd+Nx!q&N z{AHmFOQUeSMIp)Q@|yEIt)?d+kjv2H9Q`Yznn_&6-80MlM&K-%C5Y>u=hDBL-`fZX zziSOly9Gh^eVc!W?)LTOy68T8zauGWDBrpIXW?m{ua`%Np&&@XWNpXjDS5W;xIIoTuhw0YLBPIO~#&`PgH^ko@7vqUQ%t8`!0k6B%Ng zlR4u)#QrtJ{BH4V{{R~PA!>S+j-CCJXFTF)tV!Rsihx@<87Bne-o1PuB?;87pYau$ z>0&UC7b2-rB zLP6Y~@r&XYf&4Fd0_ol+f)lHNp_(9L0ni@B zvUBX!t_~`7(&$ZEzRr}>`%1^+){`NKsAghSx*h@i>(HSlcv098_`n1BasL3;74&dC zN$PqBhV>C{j8qc1&gRGY&j!6GL)Qe-g3JI?HjUj)cF>yU{Et5o4Gxo2@jJmRVrC^| z%Bd;9IQ>4ghkr1*wqnGo2O*C*KGoXwTJ$&}2DR>0vDOz?u`7=-oU4c91abQR08v<8 z71p0kp6g7wo#!#IXe4ehr?^j1CbS#nmyyL?>QR5fW2W7PXk{a7lplNmNgtoD zrF&kT;-;E8VhtykAS=Pa8680#D|%CljGtSW)~4?p_B|8fZ^Wr}PYTU%cQVejInx=hRnq;13kpzKr&=U97Xf<~RAqLiHSdG1|1HR_Q*6C3-r_-5C2H6UYAm36=D1 zdJJtEm59n1gWT=oZ{%yLlf_Vif=NLgx#{np!n!HXnLC`-Ax=&YiW+vG@SgsCM^Al4pSth7BM4ILtjN{&e2o_RC4u{dI&W91zNYv;2ZhMr{Q89OQ4 znXU9bmoLtxf~2CA+;7YCJ(J;$k-gE9L^vd6o6|n^>RQE_wpERZ%ZwiU{{Z^y=w&Av zCD8f4UTetn{{Y!P_IA4QZ|zp{+=Xuo*eCXkhDGGg((wpy?iO9=*kh%AJO2O$1=lRT zFnm4nG6??BWod4z2L#9?aLvcR&0jT7E`}c!UQpUvznS%zjLxPn2SHDCl3sQ{md_A; z6wx*C*BWq^-7|xN;`!>mEr%%pr+i4EH&C{uXNk zBwMBwXYS;a_*W;Xco$NRQyh>g9mGB#IrXO`?Q^0vV)RU;d>?;o+scqJ@+p2gR4{md zQrbyfpyXt*1P~57nv4C$oYxjhYwa!(xm^Jtc#uYYb6Iy9)Ztreu~0Hf^d_q4cW8<| zQtDi}nn4)^24_6+>FJ7FEn@0Pi!H>Pz~~tN0Q#uVIhk(9#uxUt4n*Qj%a&GL=drJ| zz6pNcUN!g?@N>kT4A2Fwt-h^0NiF8n=0Zw^V5d0cM^Z95$7-daN=>~_uz%o|9|(0R zJ|=1&Kfa4)zMpRJ+q{Pa%_`#~K8RTV0KkQQsr*E56GJ2xng)?A-nFX4&2K#F5({MM z=E);)0Kp+gC$Kf$hpQSiT;A_waAG0tYpQFe=ZO4D{i3x00E71Sz8%svCh;br1(F+$ zN`3^5z-d1dmJ9vS*0>*xpR~R2$1e$ZTG{m2^j$vE0##t0n8;5LBXQA`F$1?fb6#dY z80ul0i|N1Mds$u!*BrO`j&;YVhbE1@#S9M)Gd8d%r&o)UPa~9)y%1@EXdv z&`fz0Kh%itzh5sxA(vDW=F;E6s7&< zlWNixd9@kuSvrCj3Zov|Pvu?Jys+t3dS#sJz2$^SH$8F@&*&IewAzee4$b}=o@F(9 za{lv= z;=;G>TzYap&M5Ax)14nSzxLxZ#BRUvs{B;TAtXs0YEKz0a0wawtBvq{uMdcHbyhDY z+vaI7+yGei9`)Z|)~OZI{)d-MxhF5~zs!tF9+}}7?ish6nXV6h2$4AY*M0FCai!VY zOvmSaAS$8GNyB6L{{T8vla(zxH~E`cbHP5bf0HsiIj%#j_yKIBfB5&exK#Oe;4?OT zy8i(BtIRd~`Cs;C@o-4d(ko;}#!l4^n9t%WDKFnk<@p=p<6&W}sRD+%l zJJ*uktd8W&ZC6cALc(Z4z+iEndG)WEbxT8QBgS*NNenZbVzz^_vNNdlJg>xT8a4q2 zM>!*k{%ZdKZ3H9st<;bW=zNB3jokdT+lE$?w_^#~>iy5tuL>dm0EA-Ays$_E?{scD z*XjQNgLTNSyf3E78!NKHigvefF^c&dyZG}>A4iRMryCpQLT*V>kb2M1MU3Fvm>v2|$EaE6!b*!t(h z{uk1|BWZ1?>$-Kep=#itD&`Q_`g$L6U!6Y{f8d(Xy~Nswfi<}_%Y`M@!tu)|&^YBs z)HQu312CQjeOw;#K1&^dhBiFQNv)rAjsD}C z{ktr5?;rRdK=_H_n}xi-&@R>HXnyySSP)NqE2^JhTE9cSANbPK;%|WTpAcC}CAPh` zNs*VF5;-4Gau3qJLU5E6sYzN;c4+$EXw{<%kath1-df!V;vk%J`Bw??8{)2k@Uu#N zPh8e5G>tuQ8f%%tbM2nLK~u>6Uqno#lyyHBe`>GzEUufU>DRhP!wYk$UXW1h7g6nw zCOmFL>c^f7V0#f?&X&8bUUrF(cxGN7*ad!BWA zzR~$2?wf4UTcZ@ql{-1<&N=;Ssj)&7w(JwYUJoPnJ!`f)oRT%IFK!jg5rvXHgKit{ zkVbz~#X3!5OMA4Dnq8sy6~;*&{{W$_RIL3BWgF?-?fgS^9;=~AYLbxbzbQR4*ZNkz zk$)w{j7S^IlrGc9ao)Fe8<)uEa7kJ8WorwQ2EQytcD#Tv1E=JB{VOlT8r;4g*KJ*w z5KhHd5x~dkNy|q18Ytb{$gA-(+<#&%$N>3l3W9T8{)2qlrjrch2X>85Ob>ccZZoi? zl&P!qJn!ON+?q_UHRy3`H+LFpg_xwpKh`N3Q;$q` z=kul4>py(8=&0#YwK=lG68dT7(QkM(ebZ*@iejQC`2N_~oVw81c|&oO}Ig z(yPr2znO+356L@6Zid_Vhyn@)VSsw$KJ~Y!c!oR0*m4+<7!m+s{J5>umfcQIX3?cO zta*6c1?n^0*Kgrx`$Pz!0>hOV>G{^2$q?1i?Q&eT=Y}sVB;ZXG1!0Wm2l?|~ozJB~ zVd5o;K5&u{08YHo0;12pz6yAit#n}#!mc*_$3Fi6*1g)}P&*yma1`(cYFu6J`iaWR zPKT!a2J!SB5nmAbtYVVt&6OLEmAS|BuO;}6t*U$@@vY2?B#3DDGT`%^A;%wub5^Cx z?I+zG*lNmN#yzF_pUwuO;@tyQpUjb@x0R2~B9Nv&xcB}-vF~j3Tbp-v)gBT?f7cLt z*UH9KVY|8d6_>lJ2YfVy0STlkrvR#2oC$vNr9YAr*>SCPhXuiMJ}pWa)hagSVm zD@9(S-5z~R6$b8^#$0%cd-EBeQ+GT96~+@Mt_Eu=aSVu6WlMrGb2ZT;+tQnpdXlL^ z3dqR2(Vp*i$AM6N&)yG|40FwAKZovSjmz9ZtTiuimJ_dXh zx$)P;jVDU-<1^jeBv6SQV6i+C=m%5ur71gEZuT^%O-1v|Wx4%L{5SYzrhGK;{g;Py zmd2eCSsmU`9_`5im}l=h79=R>J%xNF`*dr*B=C>LNAPZ=tIep{O>i#Cw9SY&AZ9?l z6;U>T2N?wQHPeoo!qI|Tqn|CN@mQCAr1d@?(q*{uB-hsxW=orwP^-5g1ca<=K8UV= zD)fI7%l7XK-6g9S+GsqhUqui5xW~8d)!*^2pT@~hp%^_EG-H32{{U0zFiq5*TF zP+b0X>fS2UV_kU>LXx&*p=ko)UP7av_gotHIh5Ti?%{vE9%NIDA7v-_So!YrQI>BH zYhk6{vRo+K#Bd7?o;}*PJ|o;4{{V|R_2tFF#<4^KXR`*t821A;IC?E}Rr0suzsT0C z?~0>MbV-fz9opM`EZ5yt3KLgsisk_d8sOYYoV3(kRaJ%$%v9qwh&UfA2ax+hy)Tn2JXhcn;+W_=ga-BuLCyYi(*I}e(!I} zy(~78YslrE>(u>K@TqH`23i+TfJ6Zp_WpI(_-Dm;z74qs%2HtH@VO*6_p4{5;`Tn0@Ylv&KT|P5aDKxtM)L{5KU(a5Bz!@S!`>fhZKqjoCtbGNUm)?< z=sNzD?<{m@LDY-YEsjNnlqy;3pHuTg<6nYxUl#l{)$jD|qgm{ETyR)tJbexc_OI4o z**oJB{BHf9{6DNbn>8rVTk2`kY|)H2=fi$AzD&Q_n|t#Sn8xvPUo+}kNETawOE;N< zK>q;iS3?4@jNysFBazK|kKJ}Ws%a?P`49Gp{jt6ld>^#C(>zV8L8@MCD?XKP7`S2& zW?qB0-XpDlHeVM$Kln>i_>9-y2k`CIiQ(zK^}P2X{(gB;&e4ol3`W&J)u+sLj ze(aX9JWS4=JWP3h(&~L1@Z;jd+P{YGts=daD@)sUf@2%>Mi?WWJJ-tEzwKG^Z}wx3 zPX*a{uIk@PiJEINsGmAB76dT_;Pa85zP0M+I9gQ_#B$#Iv(3u!RcN_ko6%~K&+C8i zQNN6O{e#*~<4d@rbPM~GNXg@#R02MtzEbfojdj0>H|FPB)$X-xtp5P4ySZr((C68NZ|b`McI)gW<#$5;!q?2qNxia_pKijYY@_!~eZ zgVwcPWJ)(`$4d^dk!dlqun(|wJ+b;yd_3_ivFXw?$nvW>!tTxh=RE%ao+-*!mCX4r znOj)#8{YVa##9?wPCilB@%<`q9P2RL*h3VI45hN0Pft_)sP>M}u}T(bSMda=!0wWj zl0z9AWjz%3`qRE2>qf^!5XmD*p^n8Q9i21&dsW7M@@yp!b)zHVHmEgw%Q(UE)RViM zeGk2QHJ+q2{VEuIgdLi7Na%k~YTtmoUva7E zaJ2GfKz8m2?_>O$>Wy}!yw;~Is3!-0k3uH#7nSi8%R8|~ixH-J`tW}rO7*1i3@p)y z${Y|dc{QaPv9nLPg?bWpYq5IYUWuFtqyfWY9-rq1wlx0$5udb`5&%a8ht4zJx|HJG z?s3kO+p+4JPmILKi7^D@x#yGXU5|!*e-DT6R9!|)B$639BcFb?weE5{O!jF$B+g#7 zy+_87_-{nIzSZv5&rgCq(#tWxLHIE5celG+W;jq*qeg&wDz{VSTSRXjYV zw(fRPp;DGA6r`-vS4ZS@wv? zzDsabM2a)lcNpo$KN_NZm1bv*FytJza%)6O+^y#zjZ{R8Nx{hKPtv23WG(Xm%DKTf z1o{*CR6DUZeM9Y94LKw!Dr2U?`8#c{Gdls;mr0@*qF zbN+f(JeRii+^l|48OI&ZYHe6|CwU^3M#T(4%Mj;Ye;W0*#5Q;qM; z&itOyRjX{F2LAv!+QMD#(!b~b0Jj{Liz;}(<7_wX2~=q= z3+?A_cE|JsYM=NOb{12&h;@BleZn)S+(&FlVS_yVhX zkgERxns#5;%<%6GY7uzb%G6_;r2UoBY4X#GtZ_c&#(7hod(x*DdG)-X`5DQ6;%~H3=dsyZ z9}Q{qAuo45?5j32jwMWS^dwhj@e1lm;fgUImXYWwg#(5gpSR&!)RdEgmhNBX7=13+ zNI%Gv!fs~poYBfWmwYgAGr<`@k4p0I6vZ{KfjnZxNsAK2z~GYGx}KdY8f%`Uk-dFm zchMVP@JzB-_KDJ%gOLQqN{$D}eLanTRyq?Ou|_~3Z3JM~25EIwdK_3iQ$IjMhET-v ze;iX))ZiA$BfqEguO&OPxsgnGY&hH0fmnK_s@~c>GA>orhEwlV)GT~q_>Qj1lK7$X7`!oB_2Kz$1 z(`5bqt;8rgd65zZI{p=x_Sa@D=SJWz6c!*4!n~HJN%Gp)Jt#^tT55M59r%HBq-hiB zQ(M7zrcSK0As8>XeB6rU{{UhwX7AwF#=UPwySrGtIjbm^7m`o}Gbb52#y2U(MSHnU zF+xt2T@zMJ;>OYDr6(P4(EYm7<%a6)x-e+=0vTI7tMMED3T^vx>mC{LMBfg)C3hy6 z@xrgHUc&oa?_8`ZM=QY$#2oSm9OvpVv{hQky_V<9*PEqJvp+ch0A`=qlgD4Re9eES zTZ;`7%-cS%dPq{=#1wUMJ-GEEzgc`G{{RF|@SU7-oqNT)o}~LgBF!VWU#C0GdKj$1 zQhv^wyIa1;9ULpFxuoow`&p3**C-5Mxo(*+vy>@xi;JbIXC4B9lJ_uKA0 z(@g&Wf+F~nQMQJ7e08Ug@dsSmIL`oq*QY0u`B47=@I!wY%AmK6bcMkG0G?9ve=mCZ z{{Zb39pZb>3pLnHJN^iH;|69~d}pL2M}o@?tbVw_#dKD`@Ix(OmL-(_H@m zHWc1r+CPXaEW4wT{hhzyk&p44;x~@GJ#*rDY%O#N{FJ7dGjV8k#BuyS6W?arU(;?Fe8eTej~>}@x#?QX@HL)!kOn>|$UIw+)Qfu!Q>XQyO$7`d49P!5IkYgWDO1*!icv?$&MXmO<@v{&e ztYQcM07LZcRc-vlU2j06| zttUg)-Ve0+=Gws(g9U3D$v^kVq}A8z51RWOjpeqTVP>;fc%IKwP;wLO(!$U95s%ih zH0^0MS5}JZ2JM!7bLm@CeJ*m&4)7~^GPM?tp)b;obUx<>ICHtL00jyUOo zpVqtMTT65}Dp9*Sdn;pqVlgo!sU!oOKc4S0$<%+jlcys`Fm%cJ?lE-Qm~Ru#_m%2JQzn)_~7@iH75N}T1uLF zGoEX^Nl?iv4>ad0BRvQ5=B#QLmT}6Z5Y6%qQAr-X#(gV9o~X&$tCXg@x42;D2?-79 zj2zW7cLbmE##I?4kb0B<0M`Cg`D}@~NhW|`EG9+(l0$ucD>uzlE#=0^jF#ja@z+0E z1eL{P6HH=dWh5MsPad>MW(IbnWl6^$*Yc-p>J|mlB8qTBl{>OY#s?iM>JQnI5Q4``x`5g$w{Azu`l$mb;(O5A1=bH|;s_o5K3H#C>LV zg)gSQnl_(ly;!#}XJOBlyb?R$4weW4DKEUrn;kG5-K8;a}aReQ>DX zoq9c?`#y={ZBEDlg5_;A;tqF^o>E|a6rcDNeAXrN)QXnyg`b=M0EfBtw4$j{No{}2 z{sKI^!zl32t==XHYlw8)c>v*(H37&y^R*A-Ua7BWHySU4P3^R0n$Fr=>9W1$C6s@_ zRy1G4Rv3u6;-eVtxBg51Y~zgmo*E8aTYr!I1LiM+7V>ER61&y+kuygmN*wSWS6H`u zaO{8JCb*qO<>t}#3)cao)OAUmFv%5x3Ia?Nok#j$}$Mgu0opbqTFdK^_TgW z)KvVZ+-VLcj$%kHo)R!| zk509n7i&pKeS$s&O)WqBRAg&i*+o{{Ysnun%SKIZduFHbr$)Fg1%g6c{KgTtzqjFE68_Tu7_<06b*1V^(wjMD$&rWpqPRVM z2+!qPyaajqp`+|oI+C5B^||z~!!L;%m&2>bW`<9+=`t`fzHBh!v+@V8d9x&5R+ zYmGt}oC$Tm5wtP0AGnVu)j0MXeiiHRrY+Z1DbIKwE_+EQ2}kX2e_lQc@P?W2tH640 zfumX_uAN~5!wM+J1G)7i@=vL*px(KW2tO$q;B~F#?_N)Lxt}jBlIVVF{{X>EqIdXl z;m1e$2Cgy=dCYJB0N1a}PZ0Qe@5Da>HAIdb@k18*c)<(1Xg`}ReLe*!hB$$beoSx@peM#m4Y=o~M^P2gZs?ulD z-*TM0f%zNDJ+L~{*^5Y607qU;O1;G$kB+}*Ul2{<5BMk##19S$0%_Wol)8tONBp)^ z7tQU&uin2>Ugl-EY_8=40Q%Qm9cixG{$s~$RX*`wk^?Kf!6k4C@)f}rt<)ZMoNQzBOof0r$R8-<>sPF07Z+kF(}d{N=2x;`ne-;9 z{{RH$_$}f)pwoB~z{F6Uv4>H+J#YR9&3 zvux_DI4a+zYbwEEAu<{i2a0o74V+>Qq`MKzH3W6%cx?v^W#vaD~RJ!lAz?Q%H4W{ zQ}xQxm7SVQ=%twW$gDbM!1weKm;lpk~S7nj4jCNav8O zaz&i5!UA`3j!%EBeH*3tKjBA+d?^a)=!N_1@N z4QSRn6~sEN=B1!q#IVnK7*+D8$I7gvWGiG~o`^VhGcGOd+Sq@CvP30e9d zCHNCZ@WuMbnx(Dbotttz5~_tv{{VEaC$E0>?9zM{_GaqnK`O4zzn=1EEq?^}PvoKe71sU0TNzcc9X3x32pH;Oc2E{EdSW%B`K1s4w| zAG*jS`I~n(+;mg)Jm#bO9bV~n0`7fo-|XvlmiH+XOj;n_A05=5Gsh>Iih2BL!g8xk zrw!N6+nmoLtx{=1aeU84eKFu4+0RGtZj)(wDnw%a;)(AHx=Q1wa&VxM22ZH3taM+3 zpAKi%v{QYg`4+b+<*^rxtLE+84+kJ{%a2p-To^3t8CtZRNi})38*OH;zXP)ql3^oG zG38fFSJk`fel}{~5qv{;<4+PnqX;0fwZE1tb(K&6fDpBQcPUkc-jJ}_~q3?Y3KR@+7Lq*nZ=9YWQ>zks* zo#e(`_dJ@zxV7-~QkN-rxb^+&;1l>B)x`azj+Uq*2(NT4Jy{Ku@~J;JnJ@=E`U)es z(WNe@Pm?75;c?d;ILA!U%Qe)VYAc~qSTtiJ?zXs6ctVl_0qveCTT0TISe2Sa>Z&9F z6WDRus?ub)O}zwjIgxRsuv?7G2H$GnrU25MRtEl z-?Kk}6T`j_)jV(Fy*g_T4fuaRc(mI&7Y+7N8N)JyK6zN=gVO+4=gx_uNb`$(DIVie zy|-xMk(BUdz${7r>|wt;jKY4(gz8&G9eq0f2ABxCl_3s}TY49+HDG*t>!*fDglnhR zGByH(gb$zhL2`XXbe=NQpzz;@bSn#8meJcJ*TBg5%k3f`$OyRl*Tz$=Dzc0ovY!6{ zB;V$JmLYO3RkT&U`y` zF-E?a#cafLjD=O>uMz&V)oyCgnqM6BUR=q)$mGP+<&8Klkk{`20D^qE;jJyaEAUo3 zc_klcyS`^U{ltbgbN>L35NpZY%cuBnOIV^SEHOmTsa%50#mOh@C+S}081vSvF7tne zpP|Jjtrh*n_}Q77lgOSRo>re^k!d$MV3-TJh+ch2HDcn)wBG{hkhQrk6U=4g^om9U z^DAD1T(qNaHe%(?UlP{aekNDOOIwXA;x2`30Z6R$t3+INQOP{|f+6@F;T)|FZ|2$XN%kE4Q;1g%oK*2NK^tkWR@pB z_4GHz`Q@_G^e~pC8b1wMsU%}>-p&thzokYZFY7du?%&`TcD;Ec%nQkI9XCGkm(f zg2Ox3hnqP&EnW{0{4wy}rEcOGt~A6;gvN0q0)@X4xv$BO*okfRkJ~H417Hz0v*xeM z(`z#f{c&9x4IiuGagA*C`|i&(IMq>)RVVqM*G<&%-2AHQhXnF^3XLa@=>vI)3J%TF z6}(l^l&+7-U-&6Uj$^&ld^h3fTXBT7?9NEQ&&Z#T->wJ2z6FZk_D1o3r7M9nwycq; zJ(mto=eP2&r-YRpk;km|`LpL~-mZHIbc0`k^*{U*Pg;Wa_FB>GUUBB>x7Sw88HZ0X zn0^>>UwPeXwqOM}aezA+1$@PCjo(A*XBW>TyP0p|Jw6uz-ogkU^Vog@syB(W*rexE zfdJ1J|JWqs4x|$MF|K zNhEWt+XcYuaHAZ3YpV?}-K)Olxahe~E-UP-{l<02#a|A_(HGY&(DS=DNI$K9WqcO+ zx1e}u_VM_!9GcCeTHjm8G&6~pYwapP-JBo3elN=BX6fZ)sx_ljXnzShsW!QUscksG&$M4=UfC>-y{GC7{TD<(E8T|Dq}H}YI|hW z(@|Epq12;BlZ=yENnG?V3I5T(1kvt%P2s5gQ)HHL%x`p?ve^+G+$cP9IQ?tHe`rtI z_et@0jbPODZBp5$g2U{$6ST^NzQ$P@M;QlkKgy~&N!7+eq~Ox_cAuU46H^lfN0muA zMqcUQ-VFVwY;Ei=G^>vgBS&%plYGMsx28$sBe#0`&*2~K+u^SW_-4Vo;qS*khaMF03Te~$lFjZVxrTYxY!Eh;%BddPhJDXU z<*$aT7{yY9v}CmMxvZy6&QhGy=8mt<#|Xa@{tzD=*~r(3x+X&2#`gpfl0hqj&IS$% zucrJr`$zl%(zLm3WxKIY+%gM#?mTh-00k)cXQxMg z+I8U7686xg#k{J~;rSqj3xGk!ILFeIFnEdkNYsbBQS0+oe~zHBG-;&cG@O4&q4Fnz zf8eIJeiuvo9YW??%S*^iCE~Y6A~G;R2k`lT&mC(=;s@>R;jf5Z3e$8o)@HPdJxOJ` zxO-Q3nKCk@^*n-4u6eIUIejWnQKuVP*7<02RK-TCZc^3me0}>ze$o0Kuknvwzwn*T z{RZOf&ua_B;gOj^ZZH5Fw_s<1UORpJRqEQjVkz&hiUrsd78_LH75W@kp#8z>^4wP;m&KP$8oJp@BN31SvBB&)74ClkzApS16W{vddc%H^Te z?X4A*%?jHtNM2P(&C?)cfAy=$p_9&zAy#c@tz*{2X0WRnB%RybvEqN)n?Uhrh(6st zwy2Q#$tpyaE71-><-M0bjcEAq_P@~nAnBTIjpm=Lq;_(d6(YBf_l<%VAh%9MYey;e zYL(i(H-B9jmLoHbS@S_Oxo!D>k;QnI_Nvl#tuEJ3w$iWd;E2q-{>-NdAW%*>ee46y zYns%4I%qQ5L*&?M(&J!LEC_HE40LY4(!Dx#IWF|Q+xy#psl!td8OrMFD%yG^ze1w? zY0%`0RYPT}F}Sx#kefLEMP76Fy5xSQv2Xr2+3OLF*4MV@45~iJhiEDnKYV|aS1N8% zQS2yUBN?ip_9Cm!{TzZ&#Ye{ptg zbps)WNaIrkdc+?!Wn%@_b3qWzsF8BT$Z2 zDdwrPMqihv4)0IrU5}5yXk8n}5k~11+zxD#*u?gsf~x1|$Zq^`?@F}?QnV`n04?+) zmMhu8$9tmhhQ2s>PfKfQE?ZLbqlQSq7MwQpVg2r(Hh&7`wLgqL9lO*uyNiUq+k0s= zVHVs4-y~&5a(V(m&t5A^blhqxot1@Jv??hj)!*~}UAcN*-pjU(!xN+v^Etoxd6$fAY~Z%jbc;yg+;NZ-XFYMxQfnE1;HiHT zBzacX@%N)LRY2fb@_^;vTi7j<4Bg8UT>K2lDkj)a{sr4V>U6gS2 zX!CL_b9`QBHEcy%(o&ndTOUmy+fUw*6O3H9+pFwNuxoSr*$tmXZuzBEo@F?jD$ zVtK;E4+lKrrP0H_g*;Vv)brmG_^aYCjrEgtsd$3_08qQYLo3D(cwoi%vC|-DW zZ7geg*MHNKUtc!t&& zJG{GVS5QekcpMt&B((Useh{{+;+JASh8cZ5an`VvOeOCpA6uhtY(v?xqrpEGbwZe* z#qMwkK1|=|JXQGq5&Txak|kyFm@R_8B)|{T=~+t=f!)d$^+V;v^yd6Tm-cY@p(XL2 zZ8ODQcS7#+smC}OBRzXonEjdlE6-++9gm4*X8E?8ryTy3D<6ScslcygikAGvgZm$z#kCqY+}ZVeCKu^GpMOQmi&6tqyGScczi%>f&Ty$^uvq-`kY4|+&8sn{kenI z)7#0G@HmF_Oxuh83De_eg~Rx8=Q#c5q^Ae)V^% zygg|?A;LX9@3^n*>d&GtkN72jiiupsqsF7A`HR01l@b0 zg&j_0KD>S3dYJJI2`i|}`uUgrmsh$j$NvBXpVp*vD{8t*lffnzAP>u~4No8Z5|3F( z<5R3@L!Xp=k-0T8;uv&;uq>*h>Wzzk_$5xOBNuIJO#mE!$D10{pZ*C)cI8<3j>0wy zM;dA8KZwOI^@l^O4!8dRf>GUo`@BtJ7#xrImlOQk(ykBqB{YCG?-X0@ z?gp9DJpTZDnxFNC+fw|0;0N|poA`^df59mtQV0Ac!529g(#Ie8_Z4UU9aC@Rus$o5 zm~u$4UVT4{ic;b&A1yz`f7xB<_!is#32COs6A$=FE(rrInnC%BR*$YJb5o{4X1!O=|u4+Et2l{HjU+0N|Q_6_61wsi<{alca37!H_p7{+<&QNR2XSHYkFxB8PwyLSHo zF-ALjQ1k3nos@qc^B4AAE$+u$f5A6=8xMTuws|lkCy)c=2!M*6!&F+_;+W5(16z(h{)`)?*9OSCzes}>{tH)hkSSmi^I;GXq^U?EQFkV_ilUj z>;8W#&RNzsZe*|IKkV8IxlT{mXTU|7;Uh6gnC4|=zr5BRk!1ks4jh~wqQ&2=vr>EEXnr}nlgPvZO#eMW-l zS%dZ^@CNo%qsaOD$L*4F_-49oGxi$zaeH_~`U}WL2RCwn4u9VIQvTJ&E#-faGQm-{ z$I$-(2ft*W0{kWMRlc>M=;q&0K*1&ZRFAYU!Qq&S`=3jb%7{BINgNCln$lQ_*0kpC z$b~4=R*r|>YaqrCUiqn&vyd{XMr$$);Y{PSFuGaPK6@mfsQ zI64dLmty^uejY;}Bk+Eh%sAZEYH{ycQU1%m1c`jb@NSM63=G((f5N!lVT+f$?Pd3x ztR)ZSM$NzM@8HWEG+q}KIR*E~~75@MVa+OBDCx24aC@zTB zUklmB3jLBW-kS#>jb4jFw}Ba!6j9gi4n1onFEY7OF5Bq#@u_A-3(ycK8fa3*kSNb? z2&R%zT7p+DUFnf3ro>R7W7zXi&0vU%r3;=<28lI$J%*5pr>c%e%gE(=b?-;^WLpoG za@qC&06vusC3g1cHmu0(blCt3&*mI-JqgdHUyi}u3V=@;JXCv2=nV<|oT18X0D*=g zru!=@ukMcGZ~+;>{{T6prx?9PktE5FnQ*IbmMF;q~6?cnQ>^l>UGELwFVA;+|%}m-WGJp>94=1i^ z(|+!vD1T(n8<@i3c_D!2tql@Z*u_;;`+ju_O>5A1u&tv@BdFjY`9kc@J@ZXX7?lSK zRA;pgqH+OKL~|mS`G;NyU&e!^B4cJx86Xcq?N+K?+pwPG2Th&f+(-;L0|$z5@c4BD za3tXI%@Oymm^E#P-$Qm#pn{`}5<&j}KT3e;PVCtu1E(jNg%>R@2#!q=wh&HFLNQ7G zjM1S~1QXAtP1I%PHZ`=VBVeoYFH!QI4OW{+-JFm}QR;KnwM|>zBF1ZJFNbAi35@gU z-k=&hj-;GzBR-$4M$gErSghJe^7#OfpXX7_qLy%XV4eq{HD1%1a*tFq`w7lLVo4;C z?dws#h~?a};9vsBpTeR|$3?H0o~0k`K7_Z)p5wpy6OY-RT_-7kH%1OY2d@;=?vp3};ZH-Jw8SBi znNBh>)AFi!*sFFkub5j#WZFp?IRmYEzO!mC;*r!cf-}hdD;Ym^+|m&|qD>WY>RFGs zU)H&6zYQSVaz6I}4wdCsN$VbmRBo9^`w|$~0;G2%J^IqVjIS|78_DD4Zl1Nt%$n1C z>}rts^kDNH;FUeU`qet<$dM3(1a&0;0H0dXMo(9`7Mn;!jE5NqrYb?EBzO#)hf~fm zL(@*6mB+n`w8Z&fp8Rq>DrofdVsNSs4_tHpb6L6HNAdz?(?-FyNIAg3>G)KiVMRQ~ zGNj|>scp;N7_Vd{akexFIs3T5t1YER67JZnPpBW~y;^+x^baICG}SBu;E*%xftq}J zXgdO^Bmh9g2`k#-ZsQuq%#R2@T<}50e;Rl8dD;L_2;>i1i9$);b=a%emMbJ6f=+ti z9{&J^2GAB5Qti*m-1Gi%L}}eO)K783(PLnCWP^+<;;oxc-5C@RxZ@}KeN94=Y3Z=u zgpUCSJGTRl8k#Lcg-ZfEU{yi$>$m{2RCQDU?cjmMO0fr(iBgBBKgzAEM*YF+!|aPJ zZ6P>42==6o)F~h?K=#fJB~IS=Ml!?nwknSoKC9 zcyrU7RDuyB?OsBRj(zdcsus7XnFHE0IKpN9dQ%q1ZsJ#HAE&)17Uj)t2ADib_aFkw z$AB@8J?a#+Q7bS~gq#EF1r+0EBG=iHHf$*;x9d?$2wo2Z9Q#(Yy7>cdau&0Vu-F{) zk;uVwWqpI8U+ju96$x%h{3-{wjxxX;jCCEw zYXq8Y5>_@MFu%LNz~is2B3qJ#5wwBO_N5e}?DW3GwoMhWz~l~diqf^Te=~A6c*z63 mTq5PW*i7^dG#nytoolkit); if ($mask) { // @todo: (sydneyshan) Consider best way to add offset support - I assume we @@ -83,21 +90,24 @@ function canvasactions_imagemask_image(&$image, $data = array()) { } /** - * Implements the image mask effect using the GD toolkit. + * GD toolkit specific implementation of the image mask effect. * - * $image object + * @param stdClass $image * Image object containing the GD image resource to operate on. - * $mask object + * @param stdClass $mask * An image object containing the image to use as mask. + * + * @return bool + * true on success, false otherwise. */ -function image_gd_imagemask($image, $mask) { +function image_gd_imagemask(stdClass $image, stdClass $mask) { $newPicture = imagecreatetruecolor($image->info['width'], $image->info['height']); imagesavealpha($newPicture, TRUE); imagealphablending($newPicture, TRUE); $transparent = imagecolorallocatealpha($newPicture, 0, 0, 0, 127); imagefill($newPicture, 0, 0, $transparent); - // Perform pixel-based alpha map application + // Perform pixel-based alpha map application. for ($x = 0; $x < $image->info['width']; $x++) { for ($y = 0; $y < $image->info['height']; $y++) { // Deal with images with mismatched sizes @@ -113,7 +123,7 @@ function image_gd_imagemask($image, $mask) { } } - // Copy back to original picture + // Copy back to original picture. imagedestroy($image->resource); $image->resource = $newPicture; @@ -122,30 +132,32 @@ function image_gd_imagemask($image, $mask) { /** - * Implements the image mask effect using the imagemagick toolkit. + * Imagemagick toolkit specific implementation of the image mask effect. * - * $image object - * Image object containing a.o. the image to operate on. - * $mask object + * @param stdClass $image + * Image object containing the image resource to operate on. + * @param stdClass $mask * An image object containing the image to use as mask. + * + * @return bool + * true on success, false otherwise. */ -function image_imagemagick_imagemask($image, $mask) { - $image->ops[] = escapeshellarg($mask->source) . ' -alpha Off -compose CopyOpacity -composite'; +function image_imagemagick_imagemask(stdClass $image, stdClass $mask) { + $image->ops[] = escapeshellarg($mask->source); + $image->ops[] = '-alpha Off -compose CopyOpacity -composite'; return TRUE; } -//////////////////////////////////////////////// - - /** - * Implementation of imagecache_hook_form() + * Image effect form callback for the define canvas effect. * - * Settings for preparing a canvas. + * @param array $data + * The current configuration for this image effect. * - * @param $data array of settings for this action - * @return a form definition + * @return array + * The form definition for this effect. */ -function canvasactions_definecanvas_form($data) { +function canvasactions_definecanvas_form(array $data) { module_load_include('inc', 'imagecache_actions', 'utility-color'); $defaults = array( 'RGB' => array( @@ -165,13 +177,12 @@ function canvasactions_definecanvas_form($data) { 'bottomdiff' => '', ), ); - $data = array_merge($defaults, (array) $data); + $data += $defaults; $form = array( 'RGB' => imagecache_rgb_form($data['RGB']), 'help' => array( - '#type' => 'markup', - '#value' => t('Enter no color value for transparent. This will have the effect of adding clear margins around the image.'), + '#markup' => t('Enter no color value for transparent. This will have the effect of adding clear margins around the image.'), '#prefix' => '

', '#suffix' => '

', ), @@ -188,8 +199,7 @@ function canvasactions_definecanvas_form($data) { '#collapsible' => TRUE, '#title' => 'Exact size', 'help' => array( - '#type' => 'markup', - '#value' => t('Set the canvas to a precise size, possibly cropping the image. Use to start with a known size.'), + '#markup' => t('Set the canvas to a precise size, possibly cropping the image. Use to start with a known size.'), '#prefix' => '

', '#suffix' => '

', ), @@ -218,8 +228,9 @@ function canvasactions_definecanvas_form($data) { '#collapsible' => TRUE, '#title' => t('Relative size'), 'help' => array( - '#type' => 'markup', - '#value' => '

' . t('Set the canvas to a relative size, based on the current image dimensions. Use to add simple borders or expand by a fixed amount. Negative values may crop the image.') . '

', + '#markup' => t('Set the canvas to a relative size, based on the current image dimensions. Use to add simple borders or expand by a fixed amount. Negative values may crop the image.'), + '#prefix' => '

', + '#suffix' => '

', ), 'leftdiff' => array( '#type' => 'textfield', @@ -258,10 +269,19 @@ function canvasactions_definecanvas_form($data) { return $form; } +/** @noinspection PhpDocMissingThrowsInspection */ /** - * Implementation of theme_hook() for imagecache_ui.module + * Implements theme_hook() for the define canvas effect summary. + * + * @param array $variables + * An associative array containing: + * - data: The current configuration for this image effect. + * + * @return string + * The HTML for the summary of this image effect. + * @ingroup themeable */ -function theme_canvasactions_definecanvas_summary($variables) { +function theme_canvasactions_definecanvas_summary(array $variables) { $data = $variables['data']; if ($data['exact']['width'] || $data['exact']['height']) { $w = !empty($data['exact']['width']) ? $data['exact']['width'] : '100%'; @@ -276,28 +296,22 @@ function theme_canvasactions_definecanvas_summary($variables) { $output .= ' top:' . $data['relative']['topdiff']; $output .= ' bottom:' . $data['relative']['bottomdiff']; } + /** @noinspection PhpUnhandledExceptionInspection */ $output .= theme('imagecacheactions_rgb', array('RGB' => $data['RGB'])); $output .= ($data['under']) ? t(" under image ") : t(" over image "); return $output; } /** - * Implementation of hook_image() + * Image effect callback for the define canvas effect. * - * Creates a solid background canvas + * @param stdClass $image + * @param array $data * - * Process the imagecache action on the passed image - * - * @param $image - * array defining an image file, including : - * - * $image- >source as the filename, - * - * $image->info array - * - * $image->resource handle on the image object + * @return boolean + * true on success, false otherwise. */ -function canvasactions_definecanvas_effect($image, $data) { +function canvasactions_definecanvas_effect(stdClass $image, array $data) { // May be given either exact or relative dimensions. if ($data['exact']['width'] || $data['exact']['height']) { // Allows only one dimension to be used if the other is unset. @@ -308,37 +322,126 @@ function canvasactions_definecanvas_effect($image, $data) { $data['exact']['height'] = $image->info['height']; } - $targetsize['width'] = imagecache_actions_percent_filter($data['exact']['width'], $image->info['width']); - $targetsize['height'] = imagecache_actions_percent_filter($data['exact']['height'], $image->info['height']); + $target_size['width'] = imagecache_actions_percent_filter($data['exact']['width'], $image->info['width']); + $target_size['height'] = imagecache_actions_percent_filter($data['exact']['height'], $image->info['height']); - $targetsize['left'] = image_filter_keyword($data['exact']['xpos'], $targetsize['width'], $image->info['width']); - $targetsize['top'] = image_filter_keyword($data['exact']['ypos'], $targetsize['height'], $image->info['height']); + $target_size['left'] = image_filter_keyword($data['exact']['xpos'], $target_size['width'], $image->info['width']); + $target_size['top'] = image_filter_keyword($data['exact']['ypos'], $target_size['height'], $image->info['height']); } else { - // calculate relative size - $targetsize['width'] = $image->info['width'] + $data['relative']['leftdiff'] + $data['relative']['rightdiff']; - $targetsize['height'] = $image->info['height'] + $data['relative']['topdiff'] + $data['relative']['bottomdiff']; - $targetsize['left'] = $data['relative']['leftdiff']; - $targetsize['top'] = $data['relative']['topdiff']; + // Calculate relative size. + $target_size['width'] = $image->info['width'] + ((int) $data['relative']['leftdiff']) + ((int) $data['relative']['rightdiff']); + $target_size['height'] = $image->info['height'] + ((int) $data['relative']['topdiff']) + ((int) $data['relative']['bottomdiff']); + $target_size['left'] = (int) $data['relative']['leftdiff']; + $target_size['top'] = (int) $data['relative']['topdiff']; } - // convert from hex (as it is stored in the UI) + // Convert from hex (as it is stored in the UI). if ($data['RGB']['HEX'] && $deduced = imagecache_actions_hex2rgba($data['RGB']['HEX'])) { $data['RGB'] = array_merge($data['RGB'], $deduced); } - // All the maths is done, now defer to the api toolkits; - $data['targetsize'] = $targetsize; + // All the math is done, now defer to the toolkit in use. + $data['targetsize'] = $target_size; $success = image_toolkit_invoke('definecanvas', $image, array($data)); if ($success) { - $image->info['width'] = $targetsize['width']; - $image->info['height'] = $targetsize['height']; + $image->info['width'] = $target_size['width']; + $image->info['height'] = $target_size['height']; } return $success; } +/** + * GD toolkit specific implementation of the define canvas effect. + * + * @param stdClass $image + * @param array $data + * The parameters for this effect. $data['targetsize'] is an array expected to + * contain a width, height and a left, top. + * + * @return bool + * true on success, false otherwise. + */ +function image_gd_definecanvas(stdClass $image, array $data) { + $target_size = $data['targetsize']; + $RGB = $data['RGB']; + + $newcanvas = imagecreatetruecolor($target_size['width'], $target_size['height']); + imagesavealpha($newcanvas, TRUE); + imagealphablending($newcanvas, FALSE); + imagesavealpha($image->resource, TRUE); + if ($RGB['HEX']) { + // Set color, allow it to define transparency, or assume opaque. + $background = imagecolorallocatealpha($newcanvas, $RGB['red'], $RGB['green'], $RGB['blue'], $RGB['alpha']); + } + else { + // No color, attempt transparency, assume white. + $background = imagecolorallocatealpha($newcanvas, 255, 255, 255, 127); + } + imagefilledrectangle($newcanvas, 0, 0, $target_size['width'], $target_size['height'], $background); + + if ($data['under']) { + $canvas_object = new stdClass(); + $canvas_object->resource = $newcanvas; + $canvas_object->info = array( + 'width' => $target_size['width'], + 'height' => $target_size['height'], + 'mime_type' => $image->info['mime_type'], + 'extension' => $image->info['extension'], + ); + $canvas_object->toolkit = $image->toolkit; + image_overlay($image, $canvas_object, $target_size['left'], $target_size['top'], 100, TRUE); + } + else { + $image->resource = $newcanvas; + } + return TRUE; +} + +/** + * Imagemagick toolkit specific implementation of the define canvas effect. + * + * @param stdClass $image + * @param array $data + * The parameters for this effect. $data['targetsize'] is an array expected to + * contain a width, height and a left, top. + * + * @return bool + * true on success, false otherwise. + * + * @see http://www.imagemagick.org/script/command-line-options.php#extent + */ +function image_imagemagick_definecanvas(stdClass $image, $data) { + // Reset any gravity settings from earlier effects. + $image->ops[] = '-gravity None'; + + $backgroundcolor = $data['RGB']['HEX'] != '' ? '#' . ltrim($data['RGB']['HEX'], '#') : 'None'; + $image->ops[] = '-background ' . escapeshellarg($backgroundcolor); + + $compose_operator = $data['under'] ? 'src-over' : 'dst-over'; + $image->ops[] = "-compose $compose_operator"; + + $target_size = $data['targetsize']; + $geometry = sprintf('%dx%d', $target_size['width'], $target_size['height']); + if ($target_size['left'] || $target_size['top']) { + $geometry .= sprintf('%+d%+d', -$target_size['left'], -$target_size['top']); + } + $image->ops[] = '-extent ' . escapeshellarg($geometry); + + return TRUE; +} + +/** + * Image dimensions callback for the define canvas effect. + * + * @param array $dimensions + * Dimensions to be modified - an associative array containing the items + * 'width' and 'height' (in pixels). + * @param array $data + * An associative array containing the effect data. + */ function canvasactions_definecanvas_dimensions(array &$dimensions, array $data) { // May be given either exact or relative dimensions. if ($data['exact']['width'] || $data['exact']['height']) { @@ -354,96 +457,27 @@ function canvasactions_definecanvas_dimensions(array &$dimensions, array $data) $dimensions['height'] = imagecache_actions_percent_filter($data['exact']['height'], $dimensions['height']); } else { - // calculate relative size - $dimensions['width'] = $dimensions['width'] + $data['relative']['leftdiff'] + $data['relative']['rightdiff']; - $dimensions['height'] = $dimensions['height'] + $data['relative']['topdiff'] + $data['relative']['bottomdiff']; + // Calculate relative sizes (only possible if we have the current size). + if ($dimensions['width'] !== NULL) { + $dimensions['width'] = $dimensions['width'] + (int) $data['relative']['leftdiff'] + (int) $data['relative']['rightdiff']; + } + if ($dimensions['height'] !== NULL) { + $dimensions['height'] = $dimensions['height'] + (int) $data['relative']['topdiff'] + (int) $data['relative']['bottomdiff']; + } } } -/** - * Draw a color (or transparency) behind an image - * - * $targetsize is an array expected to contain a width,height and a left,top - * offset. - */ -function image_gd_definecanvas($image, $data = array()) { - $targetsize = $data['targetsize']; - $RGB = $data['RGB']; - - $newcanvas = imagecreatetruecolor($targetsize['width'], $targetsize['height']); - imagesavealpha($newcanvas, TRUE); - imagealphablending($newcanvas, FALSE); - imagesavealpha($image->resource, TRUE); - if ($RGB['HEX']) { - // Set color, allow it to define transparency, or assume opaque. - $background = imagecolorallocatealpha($newcanvas, $RGB['red'], $RGB['green'], $RGB['blue'], $RGB['alpha']); - } - else { - // No color, attempt transparency, assume white - $background = imagecolorallocatealpha($newcanvas, 255, 255, 255, 127); - } - imagefilledrectangle($newcanvas, 0, 0, $targetsize['width'], $targetsize['height'], $background); - # imagealphablending($newcanvas, TRUE); - - if ($data['under']) { - $canvas_object = (object) array( - 'resource' => $newcanvas, - 'info' => array( - 'width' => $targetsize['width'], - 'height' => $targetsize['height'], - 'mime_type' => $image->info['mime_type'], - 'extension' => $image->info['extension'], - ), - 'toolkit' => $image->toolkit, - ); - image_overlay($image, $canvas_object, $targetsize['left'], $targetsize['top'], 100, TRUE); - } - else { - $image->resource = $newcanvas; - } - return TRUE; -} /** - * Draw a color (or transparency) behind an image - * $targetsize is an array expected to contain a width,height and a left,top - * offset. + * Image effect form callback for the underlay (background) effect. * - * See http://www.imagemagick.org/script/command-line-options.php#extent - * @todo: reset gravity? + * @param array $data + * The current configuration for this image effect. + * + * @return array + * The form definition for this effect. */ -function image_imagemagick_definecanvas($image, $data = array()) { - $backgroundcolor = $data['RGB']['HEX'] != '' ? '#' . $data['RGB']['HEX'] : 'None'; - $image->ops[] = '-background ' . escapeshellarg($backgroundcolor); - - $compose_operator = $data['under'] ? 'src-over' : 'dst-over'; - $image->ops[] = "-compose $compose_operator"; - - $targetsize = $data['targetsize']; - $geometry = sprintf('%dx%d', $targetsize['width'], $targetsize['height']); - if ($targetsize['left'] || $targetsize['top']) { - $geometry .= sprintf('%+d%+d', -$targetsize['left'], -$targetsize['top']); - } - $image->ops[] = "-extent $geometry"; - - return TRUE; -} - -//////////////////////////////////////////////// - -/** - * Place a given image under the current canvas - * - * Implementation of imagecache_hook_form() - * - * @param $data array of settings for this action - * @return a form definition - */ -function canvasactions_canvas2file_form($data) { -// if (image_get_toolkit() != 'gd') { -// drupal_set_message('Overlays are not currently supported by using imagemagick. This effect requires GD image toolkit only.', 'warning'); -// } - +function canvasactions_canvas2file_form(array $data) { $defaults = array( 'xpos' => '0', 'ypos' => '0', @@ -484,7 +518,15 @@ function canvasactions_canvas2file_form($data) { } /** - * Implementation of theme_hook() for imagecache_ui.module + * Implements theme_hook() for the underlay (background) effect summary. + * + * @param array $variables + * An associative array containing: + * - data: The current configuration for this image effect. + * + * @return string + * The HTML for the summary of this image effect. + * @ingroup themeable */ function theme_canvasactions_canvas2file_summary($variables) { $data = $variables['data']; @@ -493,17 +535,15 @@ function theme_canvasactions_canvas2file_summary($variables) { } /** - * Place the source image on the current background + * Image effect callback for the underlay (background) effect. * - * Implementation of hook_image() + * @param stdClass $image + * @param array $data * - * Note - this is currently incompatable with imagemagick, due to the way it - * addresses $image->resource directly - a gd only thing. - * - * @param $image - * @param $data + * @return boolean + * true on success, false otherwise. */ -function canvasactions_canvas2file_image(&$image, $data = array()) { +function canvasactions_canvas2file_effect(stdClass $image, array $data) { $underlay = imagecache_actions_image_load($data['path'], $image->toolkit); if ($underlay) { // To handle odd sizes, we will resize/crop the background image to the @@ -511,7 +551,7 @@ function canvasactions_canvas2file_image(&$image, $data = array()) { // imagecopymerge, and the watermark library both do not allow overlays to // be bigger than the target. - // Adjust size + // Adjust size. $crop_rules = array( 'xoffset' => 0, 'yoffset' => 0, @@ -527,7 +567,7 @@ function canvasactions_canvas2file_image(&$image, $data = array()) { // which will produce a 'cropped' image larger than the original. // In this case, we need to calculate the position of the bg image // in relation to the space it will occupy under the top layer - #$crop_rules['xoffset'] = $underlay->info['width'] - $image->info['width'] ; + //$crop_rules['xoffset'] = $underlay->info['width'] - $image->info['width'] ; $crop_rules['width'] = $image->info['width']; $crop_rules['height'] = $image->info['height']; @@ -549,14 +589,14 @@ function canvasactions_canvas2file_image(&$image, $data = array()) { // Crop both before processing to avoid unwanted processing. image_crop_effect($underlay, $crop_rules); - # BUG - this doesn't position either + // @todo: BUG - this doesn't position either // Actually this fails because imagecache_crop fills it with solid color when 'cropping' to a larger size. - #imagecache_crop_image($image, $crop_rules); - #dpm(get_defined_vars()); - // This func modifies the underlay image by ref, placing the current canvas on it + //imagecache_crop_image($image, $crop_rules); + //dpm(get_defined_vars()); + // This func modifies the underlay image by ref, placing the current canvas on it. if (image_overlay($image, $underlay, $data['xpos'], $data['ypos'], $data['alpha'], TRUE)) { - #$image->resource = $underlay->resource; - $image = $underlay; + //$image->resource = $underlay->resource; + //$image = $underlay; //@todo: this is a no-op. return TRUE; } } @@ -564,12 +604,12 @@ function canvasactions_canvas2file_image(&$image, $data = array()) { } /** - * Image dimensions callback; canvas2file (underlay/background). + * Image dimensions callback for the underlay (background) effect. * * @param array $dimensions * Dimensions to be modified - an associative array containing the items * 'width' and 'height' (in pixels). - * @param $data + * @param array $data * An associative array containing the effect data. */ function canvasactions_canvas2file_dimensions(array &$dimensions, array $data) { @@ -586,40 +626,50 @@ function canvasactions_canvas2file_dimensions(array &$dimensions, array $data) { $dimensions['height'] = $underlay->info['height']; break; case 'minimum': - $dimensions['width'] = isset($dimensions['width']) ? min($underlay->info['width'], $dimensions['width']) : NULL; - $dimensions['height'] = isset($dimensions['height']) ? min($underlay->info['height'], $dimensions['height']) : NULL; + if ($dimensions['width'] !== NULL) { + $dimensions['width'] = min($underlay->info['width'], $dimensions['width']); + } + if ($dimensions['height'] !== NULL) { + $dimensions['height'] = min($underlay->info['height'], $dimensions['height']); + } break; case 'maximum': - $dimensions['width'] = isset($dimensions['width']) ? max($underlay->info['width'], $dimensions['width']) : NULL; - $dimensions['height'] = isset($dimensions['height']) ? max($underlay->info['height'], $dimensions['height']) : NULL; - break; + if ($dimensions['width'] !== NULL) { + $dimensions['width'] = max($underlay->info['width'], $dimensions['width']); + } + if ($dimensions['height'] !== NULL) { + $dimensions['height'] = max($underlay->info['height'], $dimensions['height']); + } + break; } } } } + /** - * Place a given image on top of the current canvas + * Image effect form callback for the overlay (watermark) effect. * - * Implementation of imagecache_hook_form() + * @param array $data + * The current configuration for this image effect. * - * @param $data array of settings for this action - * @return a form definition + * @return array + * The form definition for this effect. */ -function canvasactions_file2canvas_form($data) { +function canvasactions_file2canvas_form(array $data) { $defaults = array( 'xpos' => '', 'ypos' => '', 'alpha' => '100', + 'scale' => '', 'path' => '', ); $data = array_merge($defaults, (array) $data); $form = array( 'help' => array( - '#type' => 'markup', - '#value' => t('Note that using a transparent overlay that is larger than the source image may result in unwanted results - a solid background.'), + '#markup' => t('Note that using a non transparent overlay that is larger than the source image may result in unwanted results - a solid background.'), ), ); $form += imagecache_actions_pos_form($data); @@ -627,8 +677,19 @@ function canvasactions_file2canvas_form($data) { '#type' => 'textfield', '#title' => t('opacity'), '#default_value' => $data['alpha'], + '#field_suffix' => t('%'), '#size' => 6, '#description' => t('Opacity: 0-100. Warning: Due to a limitation in the GD toolkit, using an opacity other than 100% requires the system to use an algorithm that\'s much slower than the built-in functions. If you want partial transparency, you are better to use an already-transparent png as the overlay source image.'), + '#element_validate' => array('imagecache_actions_validate_number_non_negative'), + ); + $form['scale'] = array( + '#type' => 'textfield', + '#title' => t('scale'), + '#default_value' => $data['scale'], + '#field_suffix' => t('%'), + '#size' => 6, + '#description' => t('Scales the overlay with respect to the source, thus not its own dimensions. Leave empty to use the original size of overlay image.'), + '#element_validate' => array('imagecache_actions_validate_number_positive'), ); $form['path'] = array( '#type' => 'textfield', @@ -641,25 +702,41 @@ function canvasactions_file2canvas_form($data) { } /** - * Implementation of theme_hook() for imagecache_ui.module + * Implements theme_hook() for the overlay (watermark) effect summary. + * + * @param array $variables + * An associative array containing: + * - data: The current configuration for this image effect. + * + * @return string + * The HTML for the summary of this image effect. + * @ingroup themeable */ -function theme_canvasactions_file2canvas_summary($variables) { +function theme_canvasactions_file2canvas_summary(array $variables) { $data = $variables['data']; - return '' . $data['path'] . ' x:' . $data['xpos'] . ', y:' . $data['ypos'] . ' alpha:' . (@$data['alpha'] ? $data['alpha'] : 100) . '%'; + return '' . $data['path'] . ', x:' . $data['xpos'] . ', y:' . $data['ypos'] . ', alpha:' . (!empty($data['alpha']) ? $data['alpha'] : 100) . '%' . ', scale:' . (!empty($data['scale']) ? $data['scale'].'%' : '-'); } /** - * Place the source image on the current background + * Image effect callback for the overlay (watermark) image effect. * - * Implementation of hook_image() + * @param stdClass $image + * @param array $data * - * - * @param $image - * @param $data + * @return boolean + * true on success, false otherwise. */ -function canvasactions_file2canvas_image($image, $data = array()) { +function canvasactions_file2canvas_effect(stdClass $image, array $data) { $overlay = imagecache_actions_image_load($data['path']); if ($overlay) { + if (!empty($data['scale']) && $data['scale'] > 0) { + // Scale the overlay with respect to the dimensions of the source being + // overlaid. To maintain the aspect ratio, only the width of the overlay + // is scaled like that, the height of the overlay follows the aspect + // ratio (that is why we use image_scale instead of image_resize). + $overlay_w = $image->info['width'] * $data['scale'] / 100; + image_scale($overlay, $overlay_w, NULL, TRUE); + } if (!isset($data['alpha'])) { $data['alpha'] = 100; } @@ -668,17 +745,15 @@ function canvasactions_file2canvas_image($image, $data = array()) { return FALSE; } -/////////////////////////////////////////////////////////////////// /** - * Place the source image on top of the current canvas + * Image effect form callback for the overlay: source image to canvas effect. * - * Implementation of imagecache_hook_form() + * @param array $data + * The current configuration for this image effect. * - * - * - * @param $data array of settings for this action - * @return a form definition + * @return array + * The form definition for this effect. */ function canvasactions_source2canvas_form($data) { $defaults = array( @@ -700,53 +775,64 @@ function canvasactions_source2canvas_form($data) { return $form; } - /** - * Implementation of theme_hook() for imagecache_ui.module + * Implements theme_hook() for the overlay: source img to canvas effect summary. + * + * @param array $variables + * An associative array containing: + * - data: The current configuration for this image effect. + * + * @return string + * The HTML for the summary of this image effect. + * @ingroup themeable */ -function theme_canvasactions_source2canvas_summary($variables) { +function theme_canvasactions_source2canvas_summary(array $variables) { $data = $variables['data']; return 'xpos:' . $data['xpos'] . ', ypos:' . $data['ypos'] . ' alpha:' . $data['alpha'] . '%'; } /** - * Place the source image on the current background + * Image effect callback for the overlay: source image to canvas effect. * - * Implementation of hook_image() + * @param stdClass $image + * @param array $data * - * - * @param $image - * @param $data + * @return boolean + * true on success, false otherwise. */ -function canvasactions_source2canvas_image($image, $data = array()) { +function canvasactions_source2canvas_effect(stdClass $image, array $data) { $overlay = image_load($image->source, $image->toolkit); return image_overlay($image, $overlay, $data['xpos'], $data['ypos'], $data['alpha']); } + /** - * Implements the image effect form callback for the aspect switcher effect. + * Image effect form callback for the aspect switcher effect. * * @param array $data - * Array of settings for this action + * The current configuration for this image effect. + * * @return array - * The form definition + * The form definition for this effect. */ -function canvasactions_aspect_form($data) { +function canvasactions_aspect_form(array $data) { $defaults = array( 'ratio_adjustment' => 1, - 'portrait' => NULL, - 'landscape' => NULL, + 'portrait' => '', + 'landscape' => '', ); $data = array_merge($defaults, (array) $data); $form = array( 'help' => array( - '#type' => 'markup', - '#value' => t('You must create the two presets to use before enabling this process.'), + '#markup' => t('You must create the two presets to use before enabling this process.'), ) ); - $styles = image_style_options(TRUE); + // The PASS_THROUGH parameter is new as of D7.23, and is added here to prevent + // image_style_options() from double-encoding the human-readable image style + // name, since the form API will already sanitize options in a select list. + $styles = image_style_options(TRUE, PASS_THROUGH); // @todo: remove the current style to prevent (immediate) recursion? $form['portrait'] = array( @@ -782,30 +868,39 @@ If n < 1 then blunt portraits will be treated as landscape. /** - * Implements the summary theme callback for the aspect switcher effect. + * Implements theme_hook() for the aspect switcher effect summary. * * @param array $variables + * An associative array containing: + * - data: The current configuration for this image effect. * * @return string + * The HTML for the summary of this image effect. + * @ingroup themeable */ -function theme_canvasactions_aspect_summary($variables) { +function theme_canvasactions_aspect_summary(array $variables) { $data = $variables['data']; - $ratio_adjustment = ''; + + $label = imagecache_actions_get_style_label($data['portrait']); + $output = t('Portrait size: %label', array('%label' => $label)); + $label = imagecache_actions_get_style_label($data['landscape']); + $output .= ', ' . t('Landscape size: %label', array('%label' => $label)); if ($data['ratio_adjustment'] != 1) { - $ratio_adjustment = " (switch at 1:{$data['ratio_adjustment']})"; + $output .= ', ' . t("(switch at 1:@ratio_adjustment)", array('@ratio_adjustment' => $data['ratio_adjustment'])); } - return 'Portrait size: ' . $data['portrait'] . '. Landscape size: ' . $data['landscape'] . '' . $ratio_adjustment; + return trim($output); } /** - * Implements the image effect callback for the aspect switcher effect. + * Image effect callback for the aspect switcher effect. * - * @param object $image + * @param stdClass $image * @param array $data * - * @return bool + * @return boolean + * true on success, false otherwise. */ -function canvasactions_aspect_image($image, $data = array()) { +function canvasactions_aspect_effect(stdClass $image, array $data) { $ratio_adjustment = isset($data['ratio_adjustment']) ? floatval( $data['ratio_adjustment']) : 1; $aspect = $image->info['width'] / $image->info['height']; @@ -821,7 +916,7 @@ function canvasactions_aspect_image($image, $data = array()) { if (empty($style)) { // Required preset has gone missing? - watchdog('imagecache_canvasactions', "When running 'aspect' action, I was unable to load sub-action %style_name. Either it's been deleted or the DB needs an update", array('%style_name' => $style_name), WATCHDOG_ERROR); + watchdog('imagecache_actions', "When running 'aspect' action, I was unable to load sub-action %style_name. Either it's been deleted or the DB needs an update", array('%style_name' => $style_name), WATCHDOG_ERROR); return FALSE; } @@ -833,7 +928,7 @@ function canvasactions_aspect_image($image, $data = array()) { } /** - * Implements the dimension callback for the aspect switcher effect. + * Image dimensions callback for the aspect switcher effect. * * @param array $dimensions * Dimensions to be modified - an associative array containing the items @@ -843,10 +938,756 @@ function canvasactions_aspect_image($image, $data = array()) { */ function canvasactions_aspect_dimensions(array &$dimensions, array $data) { if (empty($dimensions['width']) || empty($dimensions['height'])) { - return; + // We cannot know which preset would be executed and thus cannot know the + // resulting dimensions, unless both styles return the same dimensions: + $landscape_dimensions = $portrait_dimensions = $dimensions; + image_style_transform_dimensions($data['landscape'], $landscape_dimensions); + image_style_transform_dimensions($data['portrait'], $portrait_dimensions); + if ($landscape_dimensions == $portrait_dimensions) { + $dimensions = $landscape_dimensions; + } + else { + $dimensions['width'] = $dimensions['height'] = NULL; + } + } + else { + $ratio_adjustment = isset($data['ratio_adjustment']) ? floatval( $data['ratio_adjustment']) : 1; + $aspect = $dimensions['width'] / $dimensions['height']; + $style_name = (($aspect * $ratio_adjustment) > 1) ? $data['landscape'] : $data['portrait']; + image_style_transform_dimensions($style_name, $dimensions); } - $ratio_adjustment = isset($data['ratio_adjustment']) ? floatval( $data['ratio_adjustment']) : 1; - $aspect = $dimensions['width'] / $dimensions['height']; - $style_name = (($aspect * $ratio_adjustment) > 1) ? $data['landscape'] : $data['portrait']; - image_style_transform_dimensions($style_name, $dimensions); +} + +/** + * Image effect form callback for the resize percent effect. + * + * @param array $data + * The current configuration for this image effect. + * + * @return array + * The form definition for this effect. + */ +function canvasactions_resizepercent_form(array $data) { + $defaults = array( + 'width' => '', + 'height' => '', + ); + $data = array_merge($defaults, (array) $data); + + $form['#element_validate'] = array('image_effect_scale_validate'); + + $form['width'] = array( + '#type' => 'textfield', + '#title' => t('Width'), + '#default_value' => !empty($data['width']) ? (float) $data['width'] : '', + '#field_suffix' => ' ' . t('percent'), + '#required' => FALSE, + '#size' => 10, + '#element_validate' => array('canvasactions_resizepercent_validate'), + '#allow_negative' => FALSE, + ); + $form['height'] = array( + '#type' => 'textfield', + '#title' => t('Height'), + '#default_value' => !empty($data['height']) ? (float) $data['height'] : '', + '#field_suffix' => ' ' . t('percent'), + '#required' => FALSE, + '#size' => 10, + '#element_validate' => array('canvasactions_resizepercent_validate'), + '#allow_negative' => FALSE, + ); + + return $form; +} + +/** + * Element validate handler to ensure that a positive number is specified. + * + * @param array $element + * The form element to validate. + * @param array $form_state + * The form state. + */ +function canvasactions_resizepercent_validate($element, &$form_state) { + element_validate_number($element, $form_state); + if (!form_get_error($element)) { + if ($element['#value'] != '' && (float) $element['#value'] <= 0) { + form_error($element, t('!name must be a positive number.', array('!name' => $element['#title']))); + } + } +} +/** + * Calculate percent based on input, fallback if only one value is provided. + * + * @param array $data + * + * @return float[]|FALSE + */ +function _canvasactions_resizepercent_calculate_percent(array $data) { + // Fallback if only one value is provided. + if (empty($data['height'])) { + if (empty($data['width'])) { + return FALSE; + } + $data['height'] = $data['width']; + } + else if (empty($data['width'])) { + $data['width'] = $data['height']; + } + + // Get percentage values in decimal values. + $data['width'] = (float) $data['width'] / 100; + $data['height'] = (float) $data['height'] / 100; + + return $data; +} + +/** + * Implements theme_hook() for the resize percent effect summary. + * + * @param array $variables + * An associative array containing: + * - data: The current configuration for this image effect. + * + * @return string + * The HTML for the summary of this image effect. + * @ingroup themeable + */ +function theme_canvasactions_resizepercent_summary(array $variables) { + $data = _canvasactions_resizepercent_calculate_percent($variables['data']); + if (!$data) { + return t('Invalid effect data'); + } + if ($data['width'] != $data['height']) { + return t('@width%x@height%', array('@width' => 100 * $data['width'], '@height' => 100 * $data['height'])); + } + else { + return t('scale to @percent%', array('@percent' => (float) 100 * $data['height'])); + } +} + +/** + * Image effect callback for the resize percent effect. + * + * @param stdClass $image + * @param array $data + * + * @return boolean + * true on success, false otherwise. + */ +function canvasactions_resizepercent_effect(stdClass $image, array $data) { + $data = _canvasactions_resizepercent_calculate_percent($data); + + $data['width'] = (int) round($image->info['width'] * $data['width']); + $data['height'] = (int) round($image->info['height'] * $data['height']); + + return image_resize_effect($image, $data); +} + +/** + * Image dimensions callback for the resize percent effect. + * + * @param array $dimensions + * Dimensions to be modified - an associative array containing the items + * 'width' and 'height' (in pixels). + * @param array $data + * An associative array containing the effect data. + */ +function canvasactions_resizepercent_dimensions(array &$dimensions, array $data) { + $data = _canvasactions_resizepercent_calculate_percent($data); + + $dimensions['width'] = (int) round($dimensions['width'] * $data['width']); + $dimensions['height'] = (int) round($dimensions['height'] * $data['height']); +} + +/** + * Image effect form callback for the blur effect. + * + * @param array $data + * The current configuration for this image effect. + * + * @return array + * The form definition for this effect. + */ +function canvasactions_blur_form(array $data) { + $form['intensity'] = array( + '#type' => 'textfield', + '#title' => t('Blur intensity'), + '#description' => t('A higher intensity results in more blur. The larger the image, the larger value you need to get a really blurred image, think 50 to 100 for 600x400 images.'), + '#size' => 5, + '#default_value' => isset($data['intensity']) ? (int) $data['intensity'] : 2, + '#element_validate' => array('element_validate_integer_positive'), + ); + return $form; +} + +/** + * Implements theme_hook() for the underlay (background) effect summary. + * + * @param array $variables + * An associative array containing: + * - data: The current configuration for this image effect. + * + * @return string + * The HTML for the summary of this image effect. + * @ingroup themeable + */ +function theme_canvasactions_blur_summary($variables) { + return t('Intensity: @intensity', array('@intensity' => $variables['data']['intensity'])); +} + +/** + * Image effect callback for the resize percent effect. + * + * @param stdClass $image + * @param array $data + * + * @return boolean + * true on success, false otherwise. + */ +function canvasactions_blur_effect(stdClass $image, array $data) { + return image_toolkit_invoke('blur', $image, $data); +} + +/** + * GD toolkit specific implementation of the blur effect. + * + * @param stdClass $image + * @param int $intensity + * The number of times to apply the blur filter. + * + * @return boolean + * True on success, false otherwise. + */ +function image_gd_blur(stdClass $image, $intensity) { + $intensity = (int) $intensity; + $result = TRUE; + $i = 0; + while ($result && $i++ < $intensity) { + $result = imagefilter($image->resource, IMG_FILTER_GAUSSIAN_BLUR); + } + return $result; +} + +/** + * Imagemagick toolkit specific implementation of the blur effect. + * + * See http://www.imagemagick.org/Usage/blur/. + * + * @param stdClass $image + * @param int $intensity + * The "intensity" of the blur effect. + * + * @return boolean + * True on success, false otherwise. + */ +function image_imagemagick_blur(stdClass $image, $intensity) { + // To get similar results asd with the GD factor, we use a formula to alter + // the intensity into the sigma value that is passed to IM. + $sigma = 4.0 + 0.8 * $intensity; + $image->ops[] = '-blur ' . escapeshellarg(sprintf('0x%f', $sigma)); + return TRUE; +} + +/** + * Builds the interlace form. + * + * This effect has no options, only some help text, so the form is displayed + * anyway. + */ +function canvasactions_interlace_form() { + $form = array(); + $form['help'] = array( + '#markup' => '

There are no user-configurable options for this process.

+

This effect will save the derivative image in an interlace / progressive way + which might improve perceived performance, especially for large images. + File size and loading speed will not change, but the user will pretty quickly + see a "degraded" copy of the entire image instead of a clear copy of the upper + part of the image.

+

Wikipedia: Interlacing (bitmaps)

', + ); + return $form; +} + +/** + * Image effect callback for the Interlace / Progressive effect. + * + * @param stdClass $image + * @param array $data + * + * @return bool + * true on success, false otherwise. + */ +function canvasactions_interlace_effect(stdClass $image, array $data) { + return image_toolkit_invoke('interlace', $image, array($data)); +} + +/** + * GD toolkit specific implementation of the image interlace effect. + * + * @param stdClass $image + * Image object containing the GD image resource to operate on. + * param array $data + * The current configuration for this image effect. + * + * @return bool + * true on success, false otherwise. + */ +function image_gd_interlace($image/*, array $data*/) { + imageinterlace($image->resource, 1); + return TRUE; +} + +/** + * Imagemagick toolkit specific implementation of the image interlace effect. + * + * @param stdClass $image + * Image object containing the image resource to operate on. + * param array $data + * The current configuration for this image effect. + * + * @return bool + * true on success, false otherwise. + */ +function image_imagemagick_interlace($image/*, array $data*/) { + $image->ops[] = '-interlace Plane'; + return TRUE; +} + +/** + * Image effect form callback for the Perspective effect. + * + * @param array $data + * The current configuration for this image effect. + * + * @return array + * The form definition for this effect. + */ +function canvasactions_perspective_form(array $data) { + $defaults = array( + 'vanish' => 'right', + 'symmetry' => 'symmetrical', + 'distortion' => 14, + 'opposite_distortion' => 10, + ); + $data = array_merge($defaults, $data); + + $form['vanish'] = array( + '#type' => 'radios', + '#title' => t('Vanishing point'), + '#options' => array( + 'top' => t('Top'), + 'left' => t('Left'), + 'right' => t('Right'), + 'bottom' => t('Bottom'), + ), + '#theme' => 'canvasactions_perspective_anchor', + '#default_value' => $data['vanish'], + '#description' => t('The position of the vanishing point relative to the source image.'), + ); + + $form['symmetry'] = array( + '#type' => 'radios', + '#title' => t('Symmetry of image perspective'), + '#description' => t('If symmetrical, the perspective effect will be built symmetrically. If asymmetrical, you can set different distortion values for both sides. Mathematically speaking: symmetrical distortion results in an isosceles trapezoid, whereas asymmetrical distortion results in just an acute trapezoid.'), + '#default_value' => $data['symmetry'], + '#options' => array( + 'symmetrical' => t('Symmetrical perspective'), + 'asymmetrical' => t('Asymmetrical perspective'), + ), + ); + + $form['distortion'] = array( + '#type' => 'textfield', + '#title' => t('Distortion'), + '#field_suffix' => '%', + '#size' => 5, + '#default_value' => $data['distortion'], + '#element_validate' => array('canvasactions_perspective_distortion_validate'), + '#description' => t('How much the corner(s) (on the vanishing point side of the image) should move to the horizon (i.e. the line containing the vanishing point). With 0% you will have no perspective effect at all and the vanishing point will be infinitely far away. With a sum of 100%, the 2 corner(s) and the vanishing point will be the same, resulting in a triangle instead of a trapezoid. For a pleasing effect, you should choose (a) number(s) between 0 and 35%, especially with ImageMagick as that toolkit also adds some stretching within the image.'), + ); + + $form['opposite_distortion'] = array( + '#type' => 'textfield', + '#title' => t('Distortion for opposite side'), + '#states' => array( + 'visible' => array( + ':input[name="data[symmetry]"]' => array('value' => 'asymmetrical'), + ), + ), + '#field_suffix' => '%', + '#size' => 5, + '#default_value' => $data['opposite_distortion'], + '#element_validate' => array('canvasactions_perspective_distortion_validate'), + '#description' => t('How much the 2nd corner on the vanishing point side of the image should move to the horizon line containing the vanishing point.'), + ); + + $form['additional_help'] = array( + '#markup' => '

Some notes:

+
  • This effect adds a perspective effect to an image. + Normally, to get a realistic effect, the side that gets the perspective effect should be reduced in size. + However, this effect does not do so, as it is easy to add a (percentage) resize effect to the image style yourself. + A resize to 85% of the original size is a good start when experimenting.
  • +
  • CSS3 also defines 3D perspective transformations. + So you might get some of the results of ths effect with pure CSS as well.
', + ); + + return $form; +} + +/** + * Form element validation handler for distortion. + * + * @param array $element + * The form element to validate. + * @param array $form_state + * The form state. + */ +function canvasactions_perspective_distortion_validate($element, &$form_state) { + $symmetrical = $form_state['values']['data']['symmetry'] === 'symmetrical'; + $element_name = $element['#name']; + // Do not check opposite distortion if it is hidden in the UI. + if (!$symmetrical || $element_name === 'data[distortion]') { + $value = $element['#value']; + // Check value itself: a number between 0 and 100 (50 if symmetrical): + $max_value = $symmetrical ? 50 : 100; + if (!is_numeric($value) || $value < 0 || $value >= $max_value) { + if ($symmetrical) { + form_error($element, t('!name must be a value between 0 and 50.', array('!name' => $element['#title']))); + } + else { + form_error($element, t('!name must be a value between 0 and 100.',array('!name' => $element['#title']))); + } + } + // Sum of both distortion values should also be smaller then 100. + if (!$symmetrical) { + $other_value_name = $element_name === 'data[distortion]' ? 'opposite_distortion' : 'distortion'; + $other_value = $form_state['values']['data'][$other_value_name]; + if (is_numeric($other_value) && $value + $other_value >= 100) { + form_error($element, t('The sum of %name and %name2 must be lower then 100.', + array( + '%name' => $element['#title'], + '%name2' => $other_value_name === 'distortion' ? t('Distortion') : t('Distortion for opposite side'), + )) + ); + } + } + } +} + +/** + * Implements theme_hook() for the define perspective effect summary. + * + * @param array $variables + * An associative array containing: + * - data: The current configuration for this image effect. + * + * @return string + * The HTML for the summary of this image effect. + * @ingroup themeable + */ +function theme_canvasactions_perspective_summary(array $variables) { + $data = $variables['data']; + $output = array(); + + $output[] = t('%symmetry. Vanishing point: %vanish.', + array( + '%symmetry' => $data['symmetry'], + '%vanish' => $data['vanish'], + )); + + if ($data['symmetry'] == 'asymmetrical') { + switch ($data['vanish']) { + case 'top': + case 'bottom': + $output[] = t('Left distortion: %distortion, right distortion: %opposite_distortion.', + array( + '%distortion' => $data['distortion'] . '%', + '%opposite_distortion' => $data['opposite_distortion'] . '%', + )); + break; + + case 'right': + case 'left': + $output[] = t('Top distortion: %distortion, bottom distortion: %opposite_distortion.', + array( + '%distortion' => $data['distortion'] . '%', + '%opposite_distortion' => $data['opposite_distortion'] . '%', + )); + break; + } + } + else { + $output[] = t('Distortion: %distortion.', array('%distortion' => $data['distortion'] . '%')); + } + + return implode(' ', $output); +} + +/** + * Image effect callback for the Perspective effect. + * + * @param stdClass $image + * Image object containing the image to operate on. + * @param array $data + * The current configuration for this image effect, contains the keys: + * distortion, vanish, symmetry and opposite_distortion options. + * + * @return bool + * True on success, false otherwise. + */ +function canvasactions_perspective_effect(stdClass $image, array $data) { + if (!image_toolkit_invoke('perspective', $image, array($data))) { + watchdog('imagecache_canvasactions', 'Image perspective transform failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array( + '%toolkit' => $image->toolkit, + '%path' => $image->source, + '%mimetype' => $image->info['mime_type'], + '%dimensions' => $image->info['height'] . 'x' . $image->info['height'], + ), WATCHDOG_ERROR); + return FALSE; + } + + return TRUE; +} + +/** + * GD toolkit specific implementation of the image Perspective effect. + * + * @param stdClass $image + * Image object containing the image resource to operate on. + * @param array $data + * The current configuration for this image effect, contains the keys: + * distortion, vanish, symmetry and opposite_distortion options. + * + * @return bool + * True on success, false otherwise. + */ +function image_gd_perspective(stdClass $image, $data) { + $width = $image->info['width']; + $height = $image->info['height']; + $distortion = $data['distortion']; + $opposite_distortion = $data['symmetry'] === 'symmetrical' ? $distortion : $data['opposite_distortion']; + + // To reduce distortion, we work with a temporary hires version of the image. + // @todo: during processing we have 2 resources this size: this might crash on memory limits: warn and/or prevent. + $multiplier = 3; + $hires_width = $width * $multiplier; + $hires_height = $height * $multiplier; + $hires_source_image = imagecreatetruecolor($hires_width, $hires_height); + $transparent_white = imagecolorallocatealpha($hires_source_image, 255, 255, 255, 127); + imagealphablending($hires_source_image, FALSE); + imagefilledrectangle($hires_source_image, 0, 0, $hires_width, $hires_height, $transparent_white); + imagesavealpha($hires_source_image, TRUE); + imagecopyresized($hires_source_image, $image->resource, 0, 0, 0, 0, $hires_width, $hires_height, $width, $height); + imagedestroy($image->resource); + + // Creating a hires target canvas to apply the perspective effect on. + $hires_target_image = imagecreatetruecolor($hires_width, $hires_height); + $transparent_white = imagecolorallocatealpha($hires_target_image, 255, 255, 255, 127); + // We don't want to blend: the transparent background we set is only for the + // parts that do not get covered. + imagealphablending($hires_target_image, FALSE); + imagefilledrectangle($hires_target_image, 0, 0, $hires_width, $hires_height, $transparent_white); + + // Building perspective effect with help four point distortion methods. + // On each step found new distortion point by right triangle formula. + switch ($data['vanish']) { + case 'top': + $left = round($hires_width * $distortion / 100); + $right = round($hires_width - ($hires_width * (100 - $opposite_distortion) / 100)); + + $tg_beta_left = $left / $hires_height; + $tg_beta_right = $right / $hires_height; + + for ($y = 0; $y < $hires_height; $y++) { + $new_left = ($hires_height - $y) * $tg_beta_left; + $new_right = ($hires_height - $y) * $tg_beta_right; + $new_width = $hires_width - $new_left - $new_right; + imagecopyresampled($hires_target_image, $hires_source_image, + $new_left, $y, + 0, $y, + $new_width, 1, + $hires_width, 1); + } + break; + + case 'bottom': + $left = round($hires_width * $distortion / 100); + $right = round($hires_width - ($hires_width * (100 - $opposite_distortion) / 100)); + + $tg_beta_left = $left / $hires_height; + $tg_beta_right = $right / $hires_height; + + for ($y = $hires_height; $y > 0; $y--) { + $new_left = $y * $tg_beta_left; + $new_right = $y * $tg_beta_right; + $new_width = $hires_width - $new_left - $new_right; + imagecopyresampled($hires_target_image, $hires_source_image, + $new_left, $y, + 0, $y, + $new_width, 1, + $hires_width, 1); + } + break; + + case 'right': + $top = round($hires_height * $distortion / 100); + $bottom = round($hires_height - ($hires_height * (100 - $opposite_distortion) / 100)); + + $tg_beta_top = $top / $hires_width; + $tg_beta_bottom = $bottom / $hires_width; + + for ($x = $hires_width; $x > 0; $x--) { + $new_top = $x * $tg_beta_top; + $new_bottom = $x * $tg_beta_bottom; + $new_height = $hires_height - $new_top - $new_bottom; + imagecopyresampled($hires_target_image, $hires_source_image, + $x, $new_top, + $x, 0, + 1, $new_height, + 1, $hires_height); + } + break; + + case 'left': + $top = round($hires_height * $distortion / 100); + $bottom = round($hires_height - ($hires_height * (100 - $opposite_distortion) / 100)); + + $tg_beta_top = $top / $hires_width; + $tg_beta_bottom = $bottom / $hires_width; + + for ($x = 0; $x < $hires_width; $x++) { + $new_top = ($hires_width - $x) * $tg_beta_top; + $new_bottom = ($hires_width - $x) * $tg_beta_bottom; + $new_height = $hires_height - $new_top - $new_bottom; + imagecopyresampled($hires_target_image, $hires_source_image, + $x, $new_top, + $x, 0, + 1, $new_height, + 1, $hires_height); + } + break; + } + imagedestroy($hires_source_image); + imagealphablending($hires_target_image, FALSE); + imagesavealpha($hires_target_image, TRUE); + + // Return image with perspective effect to original size. + $target_image = imagecreatetruecolor($width, $height); + imagealphablending($target_image, FALSE); + imagecopyresampled($target_image, $hires_target_image, 0, 0, 0, 0, $width, $height, $hires_width, $hires_height); + imagedestroy($hires_target_image); + imagesavealpha($target_image, TRUE); + + $image->resource = $target_image; + + return TRUE; +} + +/** + * Imagemagick toolkit specific implementation of the image Perspective effect. + * + * @param stdClass $image + * Image object containing the image to operate on. + * @param array $data + * The current configuration for this image effect, contains the keys + * distortion, vanish, symmetry and opposite_distortion options. + * + * @return bool + * True on success, false otherwise. + */ +function image_imagemagick_perspective(stdClass $image, $data) { + $width = $image->info['width']; + $height = $image->info['height']; + $distortion = $data['distortion']; + $opposite_distortion = $data['symmetry'] === 'symmetrical' ? $distortion : $data['opposite_distortion']; + + switch ($data['vanish']) { + case 'top': + $left = round($width * $distortion / 100); + $right = round($width * (100 - $opposite_distortion) / 100); + $perspective_arg = "0,0,$left,0 0,$height,0,$height $width,0,$right,0 $width,$height,$width,$height"; + break; + + case 'right': + default: // Prevents warning about possibly undefined variable. + $top = round($height * $distortion / 100); + $bottom = round($height * (100 - $opposite_distortion) / 100); + $perspective_arg = "0,0,0,0 0,$height,0,$height $width,0,$width,$top $width,$height,$width,$bottom"; + break; + + case 'bottom': + $left = round($width * $distortion / 100); + $right = round($width * (100 - $opposite_distortion) / 100); + $perspective_arg = "0,0,0,0 0,$height,$left,$height $width,0,$width,0 $width,$height,$right,$height"; + break; + + case 'left': + $top = round($height * $distortion / 100); + $bottom = round($height * (100 - $opposite_distortion) / 100); + $perspective_arg = "0,0,0,$top 0,$height,0,$bottom $width,0,$width,0 $width,$height,$width,$height"; + break; + } + + $transparent_white = escapeshellarg('#ffffffff'); + $perspective = escapeshellarg($perspective_arg); + $image->ops[] = "-background $transparent_white -virtual-pixel background -distort Perspective $perspective"; + + return TRUE; +} + +/** @noinspection PhpDocMissingThrowsInspection */ +/** + * Implements theme_hook(). + * + * @param array $variables + * An associative array containing: + * - element: A render element containing radio buttons. + * + * @return string + * The HTML for a 3x3 grid of checkboxes for image anchors. + * @ingroup themeable + */ +function theme_canvasactions_perspective_anchor($variables) { + $element = $variables['element']; + + $rows = $row = $option = array(); + + $blank = array('#markup' => ''); + $blank = drupal_render($blank); + + /** @noinspection PhpUnhandledExceptionInspection */ + $image = array( + '#markup' => theme('image', array( + 'path' => drupal_get_path('module', 'image') . '/sample.png', + 'attributes' => array('width' => "40", 'height' => "40"), + )), + ); + $image = drupal_render($image); + + foreach (element_children($element) as $key) { + $element[$key]['#attributes']['title'] = $element[$key]['#title']; + unset($element[$key]['#title']); + $option[] = drupal_render($element[$key]); + } + + $row[] = $blank; + $row[] = $option[0]; + $row[] = $blank; + $rows[] = $row; + $row = array(); + + $row[] = $option[1]; + $row[] = $image; + $row[] = $option[2]; + $rows[] = $row; + $row = array(); + + $row[] = $blank; + $row[] = $option[3]; + $row[] = $blank; + $rows[] = $row; + + /** @noinspection PhpUnhandledExceptionInspection */ + return theme('table', array('header' => array(), 'rows' => $rows, 'attributes' => array('class' => array('image-anchor')))); } diff --git a/sites/all/modules/imagecache_actions/canvasactions/imagecache_canvasactions.info b/sites/all/modules/imagecache_actions/canvasactions/imagecache_canvasactions.info index f5b0f06..8fa7110 100644 --- a/sites/all/modules/imagecache_actions/canvasactions/imagecache_canvasactions.info +++ b/sites/all/modules/imagecache_actions/canvasactions/imagecache_canvasactions.info @@ -1,31 +1,14 @@ name = Imagecache Canvas Actions -description = Actions for manipulating image canvases layers, including watermark and background effect. Also an aspect switcher (portrait/landscape) +description = Provides image effects for manipulating image canvases: define canvas, image mask, watermark, underlay background image, rounded corners, composite source to image and resize by percent effect. Also provides an aspect switcher (portrait/landscape). package = Media core = 7.x dependencies[] = imagecache_actions dependencies[] = image -files[] = canvasactions.inc -files[] = imagecache_canvasactions.install -files[] = imagecache_canvasactions.module -files[] = rounded_corners.inc -files[] = tests/cheap_dropshadow.imagecache_preset.inc -files[] = tests/keyword_positioning.imagecache_preset.inc -files[] = tests/positioned_underlay.imagecache_preset.inc -files[] = tests/rotate_alpha.imagecache_preset.inc -files[] = tests/rotate_alpha_gif.imagecache_preset.inc -files[] = tests/rotate_scale.imagecache_preset.inc -files[] = tests/rotate_scale_alpha.imagecache_preset.inc -files[] = tests/rounded.imagecache_preset.inc -files[] = tests/rounded_bl.imagecache_preset.inc -files[] = tests/rounded_flattened.imagecache_preset.inc -files[] = tests/watermark_100.imagecache_preset.inc -files[] = tests/watermark_50.imagecache_preset.inc - -; Information added by drupal.org packaging script on 2012-12-04 -version = "7.x-1.1" +; Information added by Drupal.org packaging script on 2018-03-20 +version = "7.x-1.9" core = "7.x" project = "imagecache_actions" -datestamp = "1354653754" +datestamp = "1521550387" diff --git a/sites/all/modules/imagecache_actions/canvasactions/imagecache_canvasactions.install b/sites/all/modules/imagecache_actions/canvasactions/imagecache_canvasactions.install deleted file mode 100644 index d646578..0000000 --- a/sites/all/modules/imagecache_actions/canvasactions/imagecache_canvasactions.install +++ /dev/null @@ -1,27 +0,0 @@ - l(t('settings'), 'admin/config/media/image-styles')))); -} - -/** - * @todo Please document this function. - * @see http://drupal.org/node/1354 - */ -function imagecache_canvasactions_uninstall() { - if (function_exists('imagecache_action_definitions') ) { - imagecache_action_definitions(TRUE); - } - cache_clear_all('imagecache_actions', 'cache'); -} diff --git a/sites/all/modules/imagecache_actions/canvasactions/imagecache_canvasactions.module b/sites/all/modules/imagecache_actions/canvasactions/imagecache_canvasactions.module index ad282a8..fc2f591 100644 --- a/sites/all/modules/imagecache_actions/canvasactions/imagecache_canvasactions.module +++ b/sites/all/modules/imagecache_actions/canvasactions/imagecache_canvasactions.module @@ -5,7 +5,7 @@ * including "Watermark" * * Based on first draft of the code by Dimm (imagecache.module 5--1) - * http://drupal.org/node/184816 + * https://drupal.org/node/184816 * * Rewritten and ported to Imagecache actions API (imagecache.module 5--2) by * dman http://coders.co.nz/ @@ -39,21 +39,20 @@ * */ -// During devel, caching is pointless. Flush it -// imagecache_action_definitions(TRUE); - if (! function_exists('imagecache_actions_calculate_relative_position') ) { - module_load_include('inc', 'imagecache_canvasactions', 'utility'); + module_load_include('inc', 'imagecache_actions', 'utility'); } // @todo There doesn't seem to be a way to specify a file in hook_image_effect_info // so placing this here for the time being. module_load_include('inc', 'imagecache_canvasactions', 'canvasactions'); module_load_include('inc', 'imagecache_canvasactions', 'rounded_corners'); -// imageapi extensions -module_load_include('inc', 'imagcache_actions', 'image_overlay.inc'); - +/** + * Implements hook_image_effect_info(). + * + * Defines information about the supported effects. + */ function imagecache_canvasactions_image_effect_info() { $effects = array(); @@ -69,8 +68,8 @@ function imagecache_canvasactions_image_effect_info() { $effects['canvasactions_imagemask'] = array( 'label' => t('Image mask'), 'help' => t(' Choose the file image you wish to use as a mask, and apply it to the canvas.'), - 'effect callback' => 'canvasactions_imagemask_image', 'dimensions passthrough' => TRUE, + 'effect callback' => 'canvasactions_imagemask_effect', 'form callback' => 'canvasactions_imagemask_form', 'summary theme' => 'canvasactions_imagemask_summary', ); @@ -78,8 +77,8 @@ function imagecache_canvasactions_image_effect_info() { $effects['canvasactions_file2canvas'] = array( 'label' => t('Overlay (watermark)'), 'help' => t('Choose the file image you wish to use as an overlay, and position it in a layer on top of the canvas.'), - 'effect callback' => 'canvasactions_file2canvas_image', 'dimensions passthrough' => TRUE, + 'effect callback' => 'canvasactions_file2canvas_effect', 'form callback' => 'canvasactions_file2canvas_form', 'summary theme' => 'canvasactions_file2canvas_summary', ); @@ -87,7 +86,7 @@ function imagecache_canvasactions_image_effect_info() { $effects['canvasactions_canvas2file'] = array( 'label' => t('Underlay (background)'), 'help' => t('Choose the file image you wish to use as an background, and position the processed image on it.'), - 'effect callback' => 'canvasactions_canvas2file_image', + 'effect callback' => 'canvasactions_canvas2file_effect', 'dimensions callback' => 'canvasactions_canvas2file_dimensions', 'form callback' => 'canvasactions_canvas2file_form', 'summary theme' => 'canvasactions_canvas2file_summary', @@ -96,8 +95,8 @@ function imagecache_canvasactions_image_effect_info() { $effects['canvasactions_source2canvas'] = array( 'label' => t('Overlay: source image to canvas'), 'help' => t('Places the source image onto the canvas for compositing.'), - 'effect callback' => 'canvasactions_source2canvas_image', 'dimensions passthrough' => TRUE, + 'effect callback' => 'canvasactions_source2canvas_effect', 'form callback' => 'canvasactions_source2canvas_form', 'summary theme' => 'canvasactions_source2canvas_summary', ); @@ -105,8 +104,8 @@ function imagecache_canvasactions_image_effect_info() { $effects['canvasactions_roundedcorners'] = array( 'label' => t('Rounded Corners'), 'help' => t('This is true cropping, not overlays, so the result can be transparent.'), - 'effect callback' => 'canvasactions_roundedcorners_image', 'dimensions passthrough' => TRUE, + 'effect callback' => 'canvasactions_roundedcorners_effect', 'form callback' => 'canvasactions_roundedcorners_form', 'summary theme' => 'canvasactions_roundedcorners_summary', ); @@ -114,55 +113,105 @@ function imagecache_canvasactions_image_effect_info() { $effects['canvasactions_aspect'] = array( 'label' => t('Aspect switcher'), 'help' => t('Use different effects depending on whether the image is landscape of portrait shaped. This re-uses other preset definitions, and just chooses between them based on the rule.'), - 'effect callback' => 'canvasactions_aspect_image', + 'effect callback' => 'canvasactions_aspect_effect', 'dimensions callback' => 'canvasactions_aspect_dimensions', 'form callback' => 'canvasactions_aspect_form', 'summary theme' => 'canvasactions_aspect_summary', ); + $effects['canvasactions_resizepercent'] = array( + 'label' => t('Resize (percent)'), + 'help' => t('Resize the image based on percent. If only a single dimension is specified, the other dimension will be calculated.'), + 'effect callback' => 'canvasactions_resizepercent_effect', + 'dimensions callback' => 'canvasactions_resizepercent_dimensions', + 'form callback' => 'canvasactions_resizepercent_form', + 'summary theme' => 'canvasactions_resizepercent_summary', + ); + + $effects['canvasactions_blur'] = array( + 'label' => t('Blur'), + 'help' => t('Make the image become unclear.'), + 'effect callback' => 'canvasactions_blur_effect', + 'dimensions passthrough' => TRUE, + 'form callback' => 'canvasactions_blur_form', + 'summary theme' => 'canvasactions_blur_summary', + ); + + $effects['canvasactions_interlace'] = array( + 'label' => t('Interlace / Progressive'), + 'help' => t('Create interlaced PNG/GIF or progressive JPG.'), + 'effect callback' => 'canvasactions_interlace_effect', + 'dimensions passthrough' => TRUE, + 'form callback' => 'canvasactions_interlace_form', + ); + + $effects['canvasactions_perspective'] = array( + 'label' => t('Perspective transform'), + 'help' => t('Adds a perspective transformation to the image.'), + 'effect callback' => 'canvasactions_perspective_effect', + 'dimensions passthrough' => TRUE, + 'form callback' => 'canvasactions_perspective_form', + 'summary theme' => 'canvasactions_perspective_summary', + ); + return $effects; } - /** - * Need to register the theme functions we expect to use + * Implements hook_theme(). + * + * Registers theme functions for the effect summaries. */ function imagecache_canvasactions_theme() { - $util_dir = drupal_get_path('module', 'imagecache_actions'); return array( 'canvasactions_definecanvas_summary' => array( - 'file' => 'canvasactions.inc', 'variables' => array('data' => NULL), + 'file' => 'canvasactions.inc', ), 'canvasactions_imagemask_summary' => array( - 'file' => 'canvasactions.inc', 'arguments' => array('element' => NULL), + 'file' => 'canvasactions.inc', ), 'canvasactions_file2canvas_summary' => array( - 'file' => 'canvasactions.inc', 'variables' => array('data' => NULL), + 'file' => 'canvasactions.inc', ), 'canvasactions_source2canvas_summary' => array( - 'file' => 'canvasactions.inc', 'variables' => array('data' => NULL), + 'file' => 'canvasactions.inc', ), 'canvasactions_canvas2file_summary' => array( - 'file' => 'canvasactions.inc', 'variables' => array('data' => NULL), + 'file' => 'canvasactions.inc', ), 'canvasactions_roundedcorners_summary' => array( - 'file' => 'rounded_corners.inc', 'variables' => array('data' => NULL), + 'file' => 'canvasactions.inc', ), 'canvasactions_aspect_summary' => array( - 'file' => 'canvasactions.inc', 'variables' => array('data' => NULL), + 'file' => 'canvasactions.inc', + ), + 'canvasactions_resizepercent_summary' => array( + 'variables' => array('data' => NULL), + 'file' => 'canvasactions.inc', + ), + 'canvasactions_blur_summary' => array( + 'variables' => array('data' => NULL), + 'file' => 'canvasactions.inc', + ), + 'canvasactions_perspective_summary' => array( + 'variables' => array('data' => NULL), + 'file' => 'canvasactions.inc', + ), + 'canvasactions_perspective_anchor' => array( + 'render element' => 'element', ), ); } /** - * Implements hook_image_style_flush. + * Implements hook_image_style_flush(). * * This hook checks if the image style that is being flushed is used in an * aspect switcher effect. If so, the style that contains the aspect switcher @@ -171,7 +220,7 @@ function imagecache_canvasactions_theme() { * @param array $flushed_style * The image style that is being flushed. */ -function imagecache_canvasactions_image_style_flush($flushed_style) { +function imagecache_canvasactions_image_style_flush(/*array*/ $flushed_style) { $styles = image_styles(); foreach ($styles as $style) { if ($style['name'] !== $flushed_style['name']) { diff --git a/sites/all/modules/imagecache_actions/canvasactions/rounded_corners.inc b/sites/all/modules/imagecache_actions/canvasactions/rounded_corners.inc index 8cde4cb..770fd6e 100644 --- a/sites/all/modules/imagecache_actions/canvasactions/rounded_corners.inc +++ b/sites/all/modules/imagecache_actions/canvasactions/rounded_corners.inc @@ -60,6 +60,11 @@ function canvasactions_roundedcorners_form($action) { $form['independent_corners_set']['radii'] = array( '#type' => 'item', '#id' => 'independent-corners-set', + '#states' => array( + 'visible' => array( + ':input[name="data[independent_corners_set][independent_corners]"]' => array('checked' => TRUE), + ), + ), ); foreach ($corners as $attribute => $label) { $form['independent_corners_set']['radii'][$attribute] = array( @@ -79,8 +84,7 @@ function canvasactions_roundedcorners_form($action) { ); */ $form['notes'] = array( - '#type' => 'markup', - '#value' => t(' + '#markup' => t(' Note: the rounded corners effect uses true alpha transparency masking. This means that this effect will fail to be saved on jpegs unless you either