From e3b176a6e50b881bcd7587db636bbcd8199dec24 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Wed, 21 Dec 2011 14:00:52 +0100 Subject: [PATCH 01/63] Bump to version 3.5.3 --- lib/version.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/version.inc b/lib/version.inc index 890fb380d0..9a6acf9259 100644 --- a/lib/version.inc +++ b/lib/version.inc @@ -15,5 +15,5 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -define('GV_version', '3.5.2.0'); +define('GV_version', '3.5.3.0'); define('GV_version_name', 'Baobab'); From 2a3186c10f109897d8356a4a57bac95ec7e915c2 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Fri, 23 Dec 2011 17:18:00 +0100 Subject: [PATCH 02/63] Fix version numbers --- lib/Alchemy/Phrasea/Controller/Setup/Installer.php | 8 ++++---- lib/Alchemy/Phrasea/Controller/Setup/Upgrader.php | 6 +++--- lib/classes/appbox.class.php | 10 ++++++---- lib/classes/base.class.php | 11 +++++++---- www/admin/databases.php | 6 ++++-- 5 files changed, 24 insertions(+), 17 deletions(-) diff --git a/lib/Alchemy/Phrasea/Controller/Setup/Installer.php b/lib/Alchemy/Phrasea/Controller/Setup/Installer.php index 49c5f1675a..cf9f82a1c2 100644 --- a/lib/Alchemy/Phrasea/Controller/Setup/Installer.php +++ b/lib/Alchemy/Phrasea/Controller/Setup/Installer.php @@ -98,8 +98,8 @@ class Installer implements ControllerProviderInterface , array_merge($constraints_coll, array( 'locale' => Session_Handler::get_locale() , 'available_locales' => $app['available_languages'] - , 'version_number' => GV_version - , 'version_name' => GV_version_name + , 'version_number' => $app['Core']['Version']->getNumber() + , 'version_name' => $app['Core']['Version']->getName() , 'current_servername' => $request->getScheme() . '://' . $request->getHttpHost() . '/' )) ); @@ -131,8 +131,8 @@ class Installer implements ControllerProviderInterface 'locale' => \Session_Handler::get_locale() , 'available_locales' => $app['available_languages'] , 'available_templates' => \appbox::list_databox_templates() - , 'version_number' => GV_version - , 'version_name' => GV_version_name + , 'version_number' => $app['Core']['Version']->getNumber() + , 'version_name' => $app['Core']['Version']->getName() , 'warnings' => $warnings , 'current_servername' => $request->getScheme() . '://' . $request->getHttpHost() . '/' , 'discovered_binaries' => \setup::discover_binaries() diff --git a/lib/Alchemy/Phrasea/Controller/Setup/Upgrader.php b/lib/Alchemy/Phrasea/Controller/Setup/Upgrader.php index d68079202d..ca193f6eae 100644 --- a/lib/Alchemy/Phrasea/Controller/Setup/Upgrader.php +++ b/lib/Alchemy/Phrasea/Controller/Setup/Upgrader.php @@ -25,7 +25,6 @@ use Silex\ControllerCollection; * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ - class Upgrader implements ControllerProviderInterface { @@ -53,8 +52,9 @@ class Upgrader implements ControllerProviderInterface , 'upgrade_status' => $upgrade_status , 'available_locales' => $app['available_languages'] , 'bad_users' => \User_Adapter::get_wrong_email_users(\appbox::get_instance()) - , 'version_number' => GV_version - , 'version_name' => GV_version_name) + , 'version_number' => $app['Core']['Version']->getNumber() + , 'version_name' => $app['Core']['Version']->getName() + ) ); ini_set('display_errors', 'on'); diff --git a/lib/classes/appbox.class.php b/lib/classes/appbox.class.php index fe42b0516b..d024e3bf43 100644 --- a/lib/classes/appbox.class.php +++ b/lib/classes/appbox.class.php @@ -371,15 +371,17 @@ class appbox extends base protected function post_upgrade(Setup_Upgrade &$upgrader) { + $Core = bootstrap::getCore(); + $upgrader->add_steps(1 + count($this->get_databoxes())); - $this->apply_patches($this->get_version(), GV_version, true, $upgrader); - $this->setVersion(GV_version); + $this->apply_patches($this->get_version(), $Core->getVersion()->getNumber(), true, $upgrader); + $this->setVersion($Core->getVersion()->getNumber()); $upgrader->add_steps_complete(1); foreach ($this->get_databoxes() as $databox) { - $databox->apply_patches($databox->get_version(), GV_version, true, $upgrader); - $databox->setVersion(GV_version); + $databox->apply_patches($databox->get_version(), $Core->getVersion()->getNumber(), true, $upgrader); + $databox->setVersion($Core->getVersion()->getNumber()); $upgrader->add_steps_complete(1); } diff --git a/lib/classes/base.class.php b/lib/classes/base.class.php index 2aaab24e52..d1e6f0ff7a 100644 --- a/lib/classes/base.class.php +++ b/lib/classes/base.class.php @@ -257,9 +257,10 @@ abstract class base implements cache_cacheableInterface public function upgradeavailable() { + $Core = bootstrap::getCore(); if ($this->get_version()) - return version_compare(GV_version, $this->get_version(), '>'); + return version_compare($Core->getVersion()->getNumber(), $this->get_version(), '>'); else return true; @@ -338,10 +339,12 @@ abstract class base implements cache_cacheableInterface } $current_version = $this->get_version(); + $Core = bootstrap::getCore(); + $upgrader->set_current_message(sprintf(_('Applying patches on %s'), $this->get_dbname())); if ($apply_patches) { - $this->apply_patches($current_version, GV_version, false, $upgrader); + $this->apply_patches($current_version, $Core->getVersion()->getNumber(), false, $upgrader); } $upgrader->add_steps_complete(1); @@ -418,8 +421,8 @@ abstract class base implements cache_cacheableInterface $this->createTable($table); } - if (defined('GV_version')) - $this->setVersion(GV_version); + $Core = bootstrap::getCore(); + $this->setVersion($Core->getVersion()->getNumber()); return $this; } diff --git a/www/admin/databases.php b/www/admin/databases.php index 689562885c..c203b9f71e 100644 --- a/www/admin/databases.php +++ b/www/admin/databases.php @@ -25,6 +25,8 @@ $user_obj = User_Adapter::getInstance($usr_id, $appbox); $createBase = $mountBase = false; $error = array(); +$Core = bootstrap::getCore(); + phrasea::headers(); ?> @@ -300,13 +302,13 @@ if ($createBase || $mountBase) if ($upgrade_available) { ?> -
+
getVersion()->getNumber() ?>
-
+
getVersion()->getNumber() ?>
From 9afa0b02c07e025a8c150f977b16b01e98a8a2c0 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Fri, 23 Dec 2011 17:19:29 +0100 Subject: [PATCH 03/63] Fix version numbers --- bin/console | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/bin/console b/bin/console index 8a5fce126e..48c99a699c 100755 --- a/bin/console +++ b/bin/console @@ -27,7 +27,9 @@ require_once dirname(__FILE__) . '/../lib/classes/bootstrap.class.php'; try { - bootstrap::register_autoloads(); + \bootstrap::register_autoloads(); + + $Core = \bootstrap::getCore(); $app = new Application(" _____ _ _ _____ _____ ______ _ _ ______ _______ @@ -45,7 +47,8 @@ try This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions; type `about:license' for details.\n\n" - . ' KONSOLE KOMMANDER', GV_version . ' ' . GV_version_name); + . ' KONSOLE KOMMANDER', $Core->getVersion()->getName() + . ' ' . $Core->getVersion()->getNumber()); $app->add(new module_console_aboutAuthors('about:authors')); $app->add(new module_console_aboutLicense('about:license')); From 22c0fe82edb0f15a2fc32056cd5629f7db883390 Mon Sep 17 00:00:00 2001 From: Jonathan Schneider Date: Fri, 23 Dec 2011 18:34:45 +0100 Subject: [PATCH 04/63] Fix CI (again ...) --- hudson/build.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hudson/build.properties b/hudson/build.properties index 071a10ec8a..12294dcf26 100644 --- a/hudson/build.properties +++ b/hudson/build.properties @@ -2,4 +2,4 @@ dir.src=/tmp/jenkinsWorking-dev # test.ci -dir.dest=/home/sites_web/test-dev.ci.alchemyasp.com +dir.dest=/home/sites_web/test-dev.ci.alchemyasp.com/pv3 From 1fc83e6019ee84451c12a825ed28a13b6547c6b6 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Sat, 24 Dec 2011 03:08:30 +0100 Subject: [PATCH 05/63] Cleanup Helpers --- lib/Alchemy/Phrasea/Helper/Record/Bridge.php | 2 +- lib/Alchemy/Phrasea/Helper/Record/Edit.php | 46 +-- lib/Alchemy/Phrasea/Helper/Record/Feed.php | 14 +- lib/Alchemy/Phrasea/Helper/Record/Helper.php | 308 ++++++++++++++++++ .../Phrasea/Helper/Record/MoveCollection.php | 30 +- lib/Alchemy/Phrasea/Helper/Record/Tooltip.php | 2 +- 6 files changed, 357 insertions(+), 45 deletions(-) create mode 100644 lib/Alchemy/Phrasea/Helper/Record/Helper.php diff --git a/lib/Alchemy/Phrasea/Helper/Record/Bridge.php b/lib/Alchemy/Phrasea/Helper/Record/Bridge.php index a921d009aa..e69619bf75 100644 --- a/lib/Alchemy/Phrasea/Helper/Record/Bridge.php +++ b/lib/Alchemy/Phrasea/Helper/Record/Bridge.php @@ -12,7 +12,7 @@ namespace Alchemy\Phrasea\Helper\Record; -use Alchemy\Phrasea\Helper\RecordsAbstract as RecordHelper; +use Alchemy\Phrasea\Helper\Record\Helper as RecordHelper; /** * diff --git a/lib/Alchemy/Phrasea/Helper/Record/Edit.php b/lib/Alchemy/Phrasea/Helper/Record/Edit.php index 7327fa029a..2ae4a0ab11 100644 --- a/lib/Alchemy/Phrasea/Helper/Record/Edit.php +++ b/lib/Alchemy/Phrasea/Helper/Record/Edit.php @@ -8,13 +8,17 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ + namespace Alchemy\Phrasea\Helper\Record; - -use Alchemy\Phrasea\Helper\RecordsAbstract as RecordHelper; -use Symfony\Component\HttpFoundation\Request; +use Alchemy\Phrasea\Helper\Record\Helper as RecordHelper, + Symfony\Component\HttpFoundation\Request; /** + * Edit Record Helper + * This object handles /edit/ request and filters records that user can edit + * + * It prepares metadatas, databases structures. * * @package * @license http://opensource.org/licenses/gpl-3.0 GPLv3 @@ -64,16 +68,21 @@ class Edit extends RecordHelper * @var boolean */ protected $works_on_unique_sbas = true; + + /** + * + * @var type + */ protected $has_thesaurus = false; - - - public function __construct(Request $request) + /** + * + * @param \Alchemy\Phrasea\Core $core + * @return Edit + */ + public function __construct(\Alchemy\Phrasea\Core $core) { - $appbox = \appbox::get_instance(); - - parent::__construct($request); - + parent::__construct($core); if ($this->is_single_grouping()) { @@ -186,9 +195,7 @@ class Edit extends RecordHelper protected function generate_javascript_elements() { $_lst = array(); - $appbox = \appbox::get_instance(); - $session = $appbox->get_session(); - $user = \User_Adapter::getInstance($session->get_usr_id(), $appbox); + $user = $this->getCore()->getAuthenticatedUser(); $twig = new \supertwig(); foreach ($this->selection as $record) @@ -251,7 +258,7 @@ class Edit extends RecordHelper } catch (Exception $e) { - + } $_lst[$indice]['type'] = $record->get_type(); } @@ -282,7 +289,7 @@ class Edit extends RecordHelper $T_sgval['b' . $base_id] = array(); $collection = \collection::get_from_base_id($base_id); - + if ($sxe = simplexml_load_string($collection->get_prefs())) { $z = $sxe->xpath('/baseprefs/sugestedValues'); @@ -292,7 +299,7 @@ class Edit extends RecordHelper foreach ($z[0] as $ki => $vi) // les champs { - + $field = $databox->get_meta_structure()->get_element_by_name($ki); if (!$field) continue; // champ inconnu dans la structure ? @@ -323,9 +330,7 @@ class Edit extends RecordHelper protected function generate_javascript_status() { $_tstatbits = array(); - $appbox = \appbox::get_instance(); - $session = $appbox->get_session(); - $user = \User_Adapter::getInstance($session->get_usr_id(), $appbox); + $user = $this->getCore()->getAuthenticatedUser(); if ($user->ACL()->has_right('changestatus')) { @@ -457,12 +462,11 @@ class Edit extends RecordHelper } catch (Exception $e) { - + } } if (!is_array($request->get('mds'))) - return $this; $sbas_id = (int) $request->get('sbid'); diff --git a/lib/Alchemy/Phrasea/Helper/Record/Feed.php b/lib/Alchemy/Phrasea/Helper/Record/Feed.php index 5f6702d749..ae56596e6f 100644 --- a/lib/Alchemy/Phrasea/Helper/Record/Feed.php +++ b/lib/Alchemy/Phrasea/Helper/Record/Feed.php @@ -12,7 +12,7 @@ namespace Alchemy\Phrasea\Helper\Record; -use Alchemy\Phrasea\Helper\RecordsAbstract as RecordHelper; +use Alchemy\Phrasea\Helper\Record\Helper as RecordHelper; use Symfony\Component\HttpFoundation\Request; /** @@ -43,15 +43,13 @@ class Feed extends RecordHelper /** * - * @param Request $request - * @return RecordsFeed + * @param \Alchemy\Phrasea\Core $core + * @return Feed */ - public function __construct(Request $request) + public function __construct(\Alchemy\Phrasea\Core $core) { - $appbox = \appbox::get_instance(); - - parent::__construct($request); - + parent::__construct($core); + if ($this->is_single_grouping()) { $record = array_pop($this->selection->get_elements()); diff --git a/lib/Alchemy/Phrasea/Helper/Record/Helper.php b/lib/Alchemy/Phrasea/Helper/Record/Helper.php new file mode 100644 index 0000000000..3616f8592b --- /dev/null +++ b/lib/Alchemy/Phrasea/Helper/Record/Helper.php @@ -0,0 +1,308 @@ + + */ + protected $request; + protected $flatten_groupings = false; + + /** + * + * @var boolean + */ + protected $is_basket = false; + + /** + * + * @var \Entities\Basket + */ + protected $original_basket; + + /** + * + * @param \Alchemy\Phrasea\Core $core + * @return Helper + */ + public function __construct(\Alchemy\Phrasea\Core $core) + { + parent::__construct($core); + + $this->selection = new \set_selection(); + $appbox = \appbox::get_instance(); + $usr_id = $appbox->get_session()->get_usr_id(); + + if (trim($request->get('ssel')) !== '') + { + $em = $this->getCore()->getEntityManager(); + $repository = $em->getRepository('\Entities\Basket'); + + /* @var $$repository \Repositories\BasketRepository */ + $Basket = $repository->findUserBasket($request->get('ssel'), $this->getCore()->getAuthenticatedUser()); + + $this->selection->load_basket($Basket); + + $this->is_basket = true; + $this->original_basket = $Basket; + } + else + { + $this->selection->load_list(explode(";", $request->get('lst')), $this->flatten_groupings); + } + $this->elements_received = $this->selection->get_count(); + + $this->single_grouping = ($this->get_count_actionable() == 1 && + $this->get_count_actionable_groupings() == 1); + + $this->examinate_selection(); + + return $this; + } + + /** + * Tells if the original selection was a basket + * + * @return boolean + */ + public function is_basket() + { + return $this->is_basket; + } + + /** + * If the original selection was a basket, returns the basket object + * + * @return \Entities\Basket + */ + public function get_original_basket() + { + return $this->original_basket; + } + + protected function examinate_selection() + { + $this->selection->grep_authorized($this->required_rights, $this->required_sbas_rights); + + if ($this->works_on_unique_sbas === true) + { + $this->sbas_ids = $this->selection->get_distinct_sbas_ids(); + + $this->is_possible = count($this->sbas_ids) == 1; + + $this->has_many_sbas = count($this->sbas_ids) > 1; + + $this->sbas_id = $this->is_possible ? array_pop($this->sbas_ids) : false; + } + + return $this; + } + + /** + * Is action applies on single grouping + * + * @return + */ + public function is_single_grouping() + { + return $this->single_grouping; + } + + /** + * When action on a single grouping, returns the image of himself + * + * @return record_adapter + */ + public function get_grouping_head() + { + if (!$this->is_single_grouping()) + throw new Exception('Cannot use ' . __METHOD__ . ' here'); + foreach ($this->get_elements() as $record) + + return $record; + } + + /** + * Get elements for the action + * + * @return Array + */ + public function get_elements() + { + return $this->selection->get_elements(); + } + + /** + * Returns true if elements comes from many sbas + * + * @return boolean + */ + public function has_many_sbas() + { + return $this->has_many_sbas; + } + + /** + * Returns true if the action is possible with the current elements + * for the user + * + * @return boolean + */ + public function is_possible() + { + return $this->is_possible; + } + + /** + * Returns the number of elements on which the action can not be done + * + * @return int + */ + public function get_count_not_actionable() + { + return $this->get_count_element_received() - $this->get_count_actionable(); + } + + /** + * Returns the number of elements on which the action can be done + * + * @return int + */ + public function get_count_actionable() + { + return $this->selection->get_count(); + } + + /** + * Returns the number of groupings on which the action can be done + * + * @return int + */ + public function get_count_actionable_groupings() + { + return $this->selection->get_count_groupings(); + } + + /** + * Return the number of elements receveid when starting action + * + * @return int + */ + public function get_count_element_received() + { + return $this->elements_received; + } + + /** + * Return sbas_ids of the current selection + * + * @return int + */ + public function get_sbas_id() + { + return $this->sbas_id; + } + + /** + * Get the selection as a serialized string base_id"_"record_id + * + * @return string + */ + public function get_serialize_list() + { + if ($this->is_single_grouping()) + + return $this->get_grouping_head()->get_serialize_key(); + else + + return $this->selection->serialize_list(); + } + + public function grep_records(Closure $closure) + { + foreach ($this->selection->get_elements() as $record) + { + if (!$closure($record)) + $this->selection->remove_element($record); + } + + return $this; + } + +} \ No newline at end of file diff --git a/lib/Alchemy/Phrasea/Helper/Record/MoveCollection.php b/lib/Alchemy/Phrasea/Helper/Record/MoveCollection.php index 5d85ad5329..bb58038a27 100644 --- a/lib/Alchemy/Phrasea/Helper/Record/MoveCollection.php +++ b/lib/Alchemy/Phrasea/Helper/Record/MoveCollection.php @@ -11,8 +11,7 @@ namespace Alchemy\Phrasea\Helper\Record; - -use Alchemy\Phrasea\Helper\RecordsAbstract as RecordHelper; +use Alchemy\Phrasea\Helper\Record\Helper as RecordHelper; use Symfony\Component\HttpFoundation\Request; /** @@ -23,33 +22,37 @@ use Symfony\Component\HttpFoundation\Request; */ class MoveCollection extends RecordHelper { + /** * * @var Array */ protected $required_rights = array('candeleterecord'); + /** * * @var Array */ protected $available_destinations; + /** * */ protected $works_on_unique_sbas = true; /** - * Constructor * - * @return action_move + * @param \Alchemy\Phrasea\Core $core + * @return MoveCollection */ - public function __construct(Request $request) + public function __construct(\Alchemy\Phrasea\Core $core) { - parent::__construct($request); + parent::__construct($core); $this->evaluate_destinations(); return $this; } + /** * Check which collections can receive the documents * @@ -60,14 +63,13 @@ class MoveCollection extends RecordHelper $this->available_destinations = array(); if (!$this->is_possible) - return $this; - $appbox = \appbox::get_instance(); - $session = $appbox->get_session(); - $user = \User_Adapter::getInstance($session->get_usr_id(), $appbox); - - $this->available_destinations = array_keys($user->ACL()->get_granted_base(array('canaddrecord'), array($this->sbas_id))); + $this->available_destinations = array_keys( + $this->getCore()->getAuthenticatedUser()->ACL()->get_granted_base( + array('canaddrecord'), array($this->sbas_id) + ) + ); return $this; } @@ -95,8 +97,7 @@ class MoveCollection extends RecordHelper public function execute(Request $request) { $appbox = \appbox::get_instance(); - $session = $appbox->get_session(); - $user = \User_Adapter::getInstance($session->get_usr_id(), $appbox); + $user = $this->getCore()->getAuthenticatedUser(); $base_dest = $user->ACL()->has_right_on_base($request->get('base_id'), 'canaddrecord') ? @@ -130,4 +131,5 @@ class MoveCollection extends RecordHelper return $this; } + } diff --git a/lib/Alchemy/Phrasea/Helper/Record/Tooltip.php b/lib/Alchemy/Phrasea/Helper/Record/Tooltip.php index 7f586c0aeb..d43a749638 100644 --- a/lib/Alchemy/Phrasea/Helper/Record/Tooltip.php +++ b/lib/Alchemy/Phrasea/Helper/Record/Tooltip.php @@ -12,7 +12,7 @@ namespace Alchemy\Phrasea\Helper\Record; -use Alchemy\Phrasea\Helper\RecordsAbstract as RecordHelper; +use Alchemy\Phrasea\Helper\Record\Helper as RecordHelper; /** * From 70c762e93d1221f83bda1f4d614adef283f9cef1 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Sat, 24 Dec 2011 03:14:19 +0100 Subject: [PATCH 06/63] Cleanup Helpers --- lib/Alchemy/Phrasea/Helper/Helper.php | 6 +- lib/Alchemy/Phrasea/Helper/User/Edit.php | 65 ++++++++++------------ lib/Alchemy/Phrasea/Helper/User/Manage.php | 24 +++----- 3 files changed, 43 insertions(+), 52 deletions(-) diff --git a/lib/Alchemy/Phrasea/Helper/Helper.php b/lib/Alchemy/Phrasea/Helper/Helper.php index 09f38fb519..2953aa0afc 100644 --- a/lib/Alchemy/Phrasea/Helper/Helper.php +++ b/lib/Alchemy/Phrasea/Helper/Helper.php @@ -22,7 +22,11 @@ use Alchemy\Phrasea\Core; class Helper { - private $core; + /** + * + * @var Alchemy\Phrasea\Core\Kernel + */ + protected $core; /** * diff --git a/lib/Alchemy/Phrasea/Helper/User/Edit.php b/lib/Alchemy/Phrasea/Helper/User/Edit.php index 657b7d1f0e..1d776c0f02 100644 --- a/lib/Alchemy/Phrasea/Helper/User/Edit.php +++ b/lib/Alchemy/Phrasea/Helper/User/Edit.php @@ -19,11 +19,9 @@ use Symfony\Component\HttpFoundation\Request; * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -class Edit +class Edit extends \Alchemy\Phrasea\Helper\Helper { - protected $request; - /** * * @var array @@ -42,19 +40,11 @@ class Edit */ protected $base_id; - /** - * - * @param Symfony\Component\HttpFoundation\Request $request - * @return module_admin_route_users_edit - */ - public function __construct(Request $request) + public function __construct(\Alchemy\Phrasea\Core $core) { + parent::__construct($core); $this->users = explode(';', $request->get('users')); - $this->request = $request; - $appbox = \appbox::get_instance(); - $session = $appbox->get_session(); - $users = array(); foreach ($this->users as $usr_id) { @@ -83,23 +73,26 @@ class Edit protected function delete_user(\User_Adapter $user) { - $appbox = \appbox::get_instance(); - $session = $appbox->get_session(); + $master = $this->getCore()->getAuthenticatedUser(); - $list = array_keys(\User_Adapter::getInstance($session->get_usr_id(), $appbox)->ACL()->get_granted_base(array('canadmin'))); + $list = array_keys($master->ACL()->get_granted_base(array('canadmin'))); $user->ACL()->revoke_access_from_bases($list); + if ($user->ACL()->is_phantom()) + { $user->delete(); - + } + return $this; } public function get_users_rights() { + $user = $this->getCore()->getAuthenticatedUser(); $appbox = \appbox::get_instance(); - $session = $appbox->get_session(); - $list = array_keys(\User_Adapter::getInstance($session->get_usr_id(), $appbox)->ACL()->get_granted_base(array('canadmin'))); + + $list = array_keys($user->ACL()->get_granted_base(array('canadmin'))); $sql = "SELECT b.sbas_id, @@ -203,7 +196,7 @@ class Edit public function get_quotas() { - $this->base_id = (int) $this->request->get('base_id'); + $this->base_id = (int) $this->getCore()->getRequest()->get('base_id'); // $this->base_id = (int) $parm['base_id']; @@ -230,7 +223,7 @@ class Edit public function get_masks() { - $this->base_id = (int) $this->request->get('base_id'); + $this->base_id = (int) $this->getCore()->getRequest()->get('base_id'); $sql = "SELECT BIN(mask_and) AS mask_and, BIN(mask_xor) AS mask_xor FROM basusr @@ -334,7 +327,7 @@ class Edit public function get_time() { - $this->base_id = (int) $this->request->get('base_id'); + $this->base_id = (int) $this->getCore()->getRequest()->get('base_id'); $sql = "SELECT u.usr_id, time_limited, limited_from, limited_to FROM (usr u INNER JOIN basusr bu ON u.usr_id = bu.usr_id) @@ -586,13 +579,13 @@ class Edit public function apply_quotas() { - $this->base_id = (int) $this->request->get('base_id'); + $this->base_id = (int) $this->getCore()->getRequest()->get('base_id'); foreach ($this->users as $usr_id) { $user = \User_Adapter::getInstance($usr_id, \appbox::get_instance()); - if ($this->request->get('quota')) - $user->ACL()->set_quotas_on_base($this->base_id, $this->request->get('droits'), $this->request->get('restes')); + if ($this->getCore()->getRequest()->get('quota')) + $user->ACL()->set_quotas_on_base($this->base_id, $this->getCore()->getRequest()->get('droits'), $this->getCore()->getRequest()->get('restes')); else $user->ACL()->remove_quotas_on_base($this->base_id); } @@ -602,12 +595,13 @@ class Edit public function apply_masks() { - $this->base_id = (int) $this->request->get('base_id'); + $request = $this->getCore()->getRequest(); + $this->base_id = (int) $request->get('base_id'); - $vand_and = $this->request->get('vand_and'); - $vand_or = $this->request->get('vand_or'); - $vxor_and = $this->request->get('vxor_and'); - $vxor_or = $this->request->get('vxor_or'); + $vand_and = $request->get('vand_and'); + $vand_or = $request->get('vand_or'); + $vxor_and = $request->get('vxor_and'); + $vxor_or = $request->get('vxor_or'); if ($vand_and && $vand_or && $vxor_and && $vxor_or) { @@ -624,13 +618,14 @@ class Edit public function apply_time() { + $request = $this->getCore()->getRequest(); + + $this->base_id = (int) $request->get('base_id'); - $this->base_id = (int) $this->request->get('base_id'); + $dmin = $request->get('dmin') ? new \DateTime($request->get('dmin')) : null; + $dmax = $request->get('dmax') ? new \DateTime($request->get('dmax')) : null; - $dmin = $this->request->get('dmin') ? new \DateTime($this->request->get('dmin')) : null; - $dmax = $this->request->get('dmax') ? new \DateTime($this->request->get('dmax')) : null; - - $activate = $this->request->get('limit'); + $activate = $request->get('limit'); foreach ($this->users as $usr_id) { diff --git a/lib/Alchemy/Phrasea/Helper/User/Manage.php b/lib/Alchemy/Phrasea/Helper/User/Manage.php index 961727fbbb..3aeb02d016 100644 --- a/lib/Alchemy/Phrasea/Helper/User/Manage.php +++ b/lib/Alchemy/Phrasea/Helper/User/Manage.php @@ -19,10 +19,9 @@ use Symfony\Component\HttpFoundation\Request; * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -class Manage +class Manage extends \Alchemy\Phrasea\Helper\Helper { - protected $request; /** * * @var array @@ -39,18 +38,11 @@ class Manage */ protected $usr_id; - public function __construct(Request $request) - { - $this->request = $request; - - - return $this; - } - - public function search(Request $request) + public function search() { + $request = $this->getCore()->getRequest(); + $appbox = \appbox::get_instance(); - $session = $appbox->get_session(); $offset_start = (int) $request->get('offset_start'); $offset_start = $offset_start < 0 ? 0 : $offset_start; @@ -69,7 +61,7 @@ class Manage , 'offset_start' => $offset_start ); - $user = \User_Adapter::getInstance($session->get_usr_id(), $appbox); + $user = $this->getCore()->getAuthenticatedUser(); $query = new \User_Query($appbox); if (is_array($request->get('base_id'))) @@ -121,7 +113,7 @@ class Manage public function create_newuser() { - $email = $this->request->get('value'); + $email = $this->getCore()->getRequest()->get('value'); if(!\mail::validateEmail($email)) { @@ -153,7 +145,7 @@ class Manage public function create_template() { - $name = $this->request->get('value'); + $name = $this->getCore()->getRequest()->get('value'); if(trim($name) === '') { @@ -161,7 +153,7 @@ class Manage } $appbox = \appbox::get_instance(); - $user = \User_Adapter::getInstance($appbox->get_session()->get_usr_id(), $appbox); + $user = $this->getCore()->getAuthenticatedUser(); $created_user = \User_Adapter::create($appbox, $name, \random::generatePassword(16), null, false, false); $created_user->set_template($user); From 1319a01c0b7d226ae5acf32cfbd88148b44397c9 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Sat, 24 Dec 2011 03:15:19 +0100 Subject: [PATCH 07/63] Cleanup Helpers --- .../Phrasea/Controller/Admin/Users.php | 47 +++++---------- .../Phrasea/Controller/Prod/Basket.php | 59 ++++++++++++++++++- .../Phrasea/Controller/Prod/Bridge.php | 6 +- lib/Alchemy/Phrasea/Controller/Prod/Edit.php | 6 +- lib/Alchemy/Phrasea/Controller/Prod/Feed.php | 4 +- .../Controller/Prod/MoveCollection.php | 4 +- .../Phrasea/Controller/Prod/WorkZone.php | 3 +- 7 files changed, 83 insertions(+), 46 deletions(-) diff --git a/lib/Alchemy/Phrasea/Controller/Admin/Users.php b/lib/Alchemy/Phrasea/Controller/Admin/Users.php index 9ee68a3777..ff2c645e68 100644 --- a/lib/Alchemy/Phrasea/Controller/Admin/Users.php +++ b/lib/Alchemy/Phrasea/Controller/Admin/Users.php @@ -39,8 +39,7 @@ class Users implements ControllerProviderInterface $controllers->post('/rights/', function() use ($app) { - $request = $app['request']; - $rights = new UserHelper\Edit($request); + $rights = new UserHelper\Edit($app['Core']); $template = 'admin/editusers.twig'; $twig = new \supertwig(); @@ -55,8 +54,7 @@ class Users implements ControllerProviderInterface $controllers->get('/rights/', function() use ($app) { - $request = $app['request']; - $rights = new UserHelper\Edit($request); + $rights = new UserHelper\Edit($app['Core']); $template = 'admin/editusers.twig'; $twig = new \supertwig(); @@ -71,11 +69,7 @@ class Users implements ControllerProviderInterface $controllers->post('/delete/', function() use ($app) { - $request = $app['request']; - - - - $module = new UserHelper\Edit($request); + $module = new UserHelper\Edit($app['Core']); $module->delete_users(); return $app->redirect('/admin/users/search/'); @@ -88,8 +82,7 @@ class Users implements ControllerProviderInterface try { - $request = $app['request']; - $rights = new UserHelper\Edit($request); + $rights = new UserHelper\Edit($app['Core']); $rights->apply_rights(); $rights->apply_infos(); @@ -110,8 +103,7 @@ class Users implements ControllerProviderInterface $controllers->post('/rights/quotas/', function() use ($app) { - $request = $app['request']; - $rights = new UserHelper\Edit($request); + $rights = new UserHelper\Edit($app['Core']); $template = 'admin/editusers_quotas.twig'; $twig = new \supertwig(); @@ -125,8 +117,7 @@ class Users implements ControllerProviderInterface $controllers->post('/rights/quotas/apply/', function() use ($app) { - $request = $app['request']; - $rights = new UserHelper\Edit($request); + $rights = new UserHelper\Edit($app['Core']); $rights->apply_quotas(); return; @@ -135,8 +126,7 @@ class Users implements ControllerProviderInterface $controllers->post('/rights/time/', function() use ($app) { - $request = $app['request']; - $rights = new UserHelper\Edit($request); + $rights = new UserHelper\Edit($app['Core']); $template = 'admin/editusers_timelimit.twig'; $twig = new \supertwig(); @@ -150,8 +140,7 @@ class Users implements ControllerProviderInterface $controllers->post('/rights/time/apply/', function() use ($app) { - $request = $app['request']; - $rights = new UserHelper\Edit($request); + $rights = new UserHelper\Edit($app['Core']); $rights->apply_time(); return; @@ -160,8 +149,7 @@ class Users implements ControllerProviderInterface $controllers->post('/rights/masks/', function() use ($app) { - $request = $app['request']; - $rights = new UserHelper\Edit($request); + $rights = new UserHelper\Edit($app['Core']); $template = 'admin/editusers_masks.twig'; $twig = new \supertwig(); @@ -175,8 +163,7 @@ class Users implements ControllerProviderInterface $controllers->post('/rights/masks/apply/', function() use ($app) { - $request = $app['request']; - $rights = new UserHelper\Edit($request); + $rights = new UserHelper\Edit($app['Core']); $rights->apply_masks(); return; @@ -185,22 +172,20 @@ class Users implements ControllerProviderInterface $controllers->post('/search/', function() use ($app) { - $request = $app['request']; - $users = new UserHelper\Manage($request); + $users = new UserHelper\Manage($app['Core']); $template = 'admin/users.html'; $twig = new \supertwig(); $twig->addFilter(array('floor' => 'floor')); $twig->addFilter(array('getDate' => 'phraseadate::getDate')); - return $twig->render($template, $users->search($request)); + return $twig->render($template, $users->search()); } ); $controllers->get('/search/', function() use ($app) { - $request = $app['request']; - $users = new UserHelper\Manage($request); + $users = new UserHelper\Manage($app['Core']); $template = 'admin/users.html'; $twig = new \supertwig(); @@ -214,7 +199,7 @@ class Users implements ControllerProviderInterface $controllers->get('/typeahead/search/', function() use ($app, $appbox) { $request = $app['request']; - $user_query = new User_Query($appbox); + $user_query = new \User_Query($appbox); $user = User_Adapter::getInstance($appbox->get_session()->get_usr_id(), $appbox); $like_value = $request->get('term'); @@ -258,7 +243,7 @@ class Users implements ControllerProviderInterface try { $request = $app['request']; - $module = new UserHelper\Manage($request); + $module = new UserHelper\Manage($app['Core']); if ($request->get('template') == '1') { $user = $module->create_template(); @@ -285,7 +270,7 @@ class Users implements ControllerProviderInterface $controllers->post('/export/csv/', function() use ($appbox, $app) { $request = $app['request']; - $user_query = new \User_Query($appbox); + $user_query = new \User_Query($appbox, $app['Core']); $user = \User_Adapter::getInstance($appbox->get_session()->get_usr_id(), $appbox); $like_value = $request->get('like_value'); diff --git a/lib/Alchemy/Phrasea/Controller/Prod/Basket.php b/lib/Alchemy/Phrasea/Controller/Prod/Basket.php index a0e5716807..a27a292604 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/Basket.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/Basket.php @@ -136,7 +136,7 @@ class Basket implements ControllerProviderInterface }); $controllers->post( - '/{basket_id}/{basket_element_id}/delete/' + '/{basket_id}/delete/{basket_element_id}/' , function(Application $app, Request $request, $basket_id, $basket_element_id) { /* @var $em \Doctrine\ORM\EntityManager */ @@ -342,6 +342,61 @@ class Basket implements ControllerProviderInterface return new RedirectResponse('/'); } }); + + + + $controllers->post( + '/{basket_id}/stealElements/' + , function(Application $app, Request $request, $basket_id) + { + $em = $app['Core']->getEntityManager(); + + /* @var $em \Doctrine\ORM\EntityManager */ + $basket = $em->getRepository('\Entities\Basket') + ->findUserBasket($basket_id, $app['Core']->getAuthenticatedUser()); + + $user = $app['Core']->getAuthenticatedUser(); + /* @var $user \User_Adapter */ + + $n = 0; + + foreach ($request->get('elements') as $bask_element_id) + { + $basket_element = $em->getRepository('\Entities\BasketElement') + ->findUserElement($bask_element_id, $user); + + if(!$basket_element) + { + continue; + } + + $basket_element->setBasket($basket); + + $em->merge($basket_element); + + $n++; + } + + $em->merge($basket); + $em->flush(); + + $data = array( + 'success' => true + , 'message' => sprintf(_('%d records moved'), $n) + ); + + if ($request->getRequestFormat() == 'json') + { + + $datas = $app['Core']['Serializer']->serialize($data, 'json'); + + return new Response($datas, 200, array('Content-type' => 'application/json')); + } + else + { + return new RedirectResponse('/'); + } + }); $controllers->get('/create/', function(Application $app) { @@ -364,7 +419,7 @@ class Basket implements ControllerProviderInterface $twig = new \supertwig(); - $html = $twig->render('prod/basket.twig', array('basket' => $basket)); + $html = $twig->render('prod/WorkZone/Basket.html.twig', array('basket' => $basket)); return new Response($html); })->assert('basket_id', '\d+'); diff --git a/lib/Alchemy/Phrasea/Controller/Prod/Bridge.php b/lib/Alchemy/Phrasea/Controller/Prod/Bridge.php index ae536a6735..59abf99a55 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/Bridge.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/Bridge.php @@ -55,7 +55,7 @@ class Bridge implements ControllerProviderInterface $controllers->post('/manager/' , function() use ($app, $twig) { - $route = new RecordHelper\Bridge($app['request']); + $route = new RecordHelper\Bridge($app['Core']); $appbox = \appbox::get_instance(); $user = \User_Adapter::getInstance($appbox->get_session()->get_usr_id(), $appbox); @@ -420,7 +420,7 @@ class Bridge implements ControllerProviderInterface $account = \Bridge_Account::load_account($appbox, $request->get('account_id')); $app['require_connection']($account); - $route = new RecordHelper\Bridge($request); + $route = new RecordHelper\Bridge($app['Core']); $route->grep_records($account->get_api()->acceptable_records()); $params = array( @@ -447,7 +447,7 @@ class Bridge implements ControllerProviderInterface $account = \Bridge_Account::load_account($appbox, $request->get('account_id')); $app['require_connection']($account); - $route = new RecordHelper\Bridge($request); + $route = new RecordHelper\Bridge($app['Core']); $route->grep_records($account->get_api()->acceptable_records()); $connector = $account->get_api()->get_connector(); diff --git a/lib/Alchemy/Phrasea/Controller/Prod/Edit.php b/lib/Alchemy/Phrasea/Controller/Prod/Edit.php index f6f6539d00..8d91dec23b 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/Edit.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/Edit.php @@ -30,9 +30,7 @@ class Edit implements ControllerProviderInterface $controllers->post('/', function() use ($app) { - $request = $app['request']; - - $handler = new RecordHelper\Edit($request); + $handler = new RecordHelper\Edit($app['Core']); $handler->propose_editing(); @@ -48,7 +46,7 @@ class Edit implements ControllerProviderInterface $controllers->post('/apply/', function() use ($app) { $request = $app['request']; - $editing = new RecordHelper\Edit($request); + $editing = new RecordHelper\Edit($app['Core']); $editing->execute($request); $template = 'prod/actions/edit_default.twig'; diff --git a/lib/Alchemy/Phrasea/Controller/Prod/Feed.php b/lib/Alchemy/Phrasea/Controller/Prod/Feed.php index abbcb87436..ff3456643d 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/Feed.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/Feed.php @@ -43,7 +43,7 @@ class Feed implements ControllerProviderInterface $user = \User_Adapter::getInstance($appbox->get_session()->get_usr_id(), $appbox); $feeds = \Feed_Collection::load_all($appbox, $user); $request = $app['request']; - $publishing = new RecordHelper\Feed($request); + $publishing = new RecordHelper\Feed($app['Core']); $datas = $twig->render('prod/actions/publish/publish.html', array('publishing' => $publishing, 'feeds' => $feeds)); @@ -71,7 +71,7 @@ class Feed implements ControllerProviderInterface $entry = \Feed_Entry_Adapter::create($appbox, $feed, $publisher, $title, $subtitle, $author_name, $author_mail); - $publishing = new RecordHelper\Feed($request); + $publishing = new RecordHelper\Feed($app['Core']); foreach ($publishing->get_elements() as $record) { diff --git a/lib/Alchemy/Phrasea/Controller/Prod/MoveCollection.php b/lib/Alchemy/Phrasea/Controller/Prod/MoveCollection.php index 406756f730..d30eea7d57 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/MoveCollection.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/MoveCollection.php @@ -34,7 +34,7 @@ class MoveCollection implements ControllerProviderInterface $controllers->post('/', function() use ($app) { $request = $app['request']; - $move = new RecordHelper\MoveCollection($request); + $move = new RecordHelper\MoveCollection($app['Core']); $move->propose(); $template = 'prod/actions/collection_default.twig'; @@ -49,7 +49,7 @@ class MoveCollection implements ControllerProviderInterface $controllers->post('/apply/', function() use ($app) { $request = $app['request']; - $move = new RecordHelper\MoveCollection($request); + $move = new RecordHelper\MoveCollection($app['Core']); $move->execute($request); $template = 'prod/actions/collection_submit.twig'; diff --git a/lib/Alchemy/Phrasea/Controller/Prod/WorkZone.php b/lib/Alchemy/Phrasea/Controller/Prod/WorkZone.php index fdfbe5fecd..0dc38afd19 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/WorkZone.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/WorkZone.php @@ -46,9 +46,8 @@ class WorkZone implements ControllerProviderInterface , 'srt' => $app['request']->get('sort') ); - $twig->addFilter(array('get_collection_logo' => 'collection::getLogo')); - return new Response($twig->render('prod/baskets.html', $params)); + return new Response($twig->render('prod/WorkZone/WorkZone.html.twig', $params)); }); return $controllers; From ae5d083e257ff746a18f5bcb86406e4fdc146d36 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Sat, 24 Dec 2011 03:16:02 +0100 Subject: [PATCH 08/63] Add Phraseanet Core to apps --- lib/Alchemy/Phrasea/Application/Api.php | 4 +++- lib/Alchemy/Phrasea/Application/Lightbox.php | 2 ++ lib/Alchemy/Phrasea/Application/OAuth2.php | 2 ++ lib/Alchemy/Phrasea/Application/Overview.php | 2 ++ lib/Alchemy/Phrasea/Application/Setup.php | 2 ++ 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/Alchemy/Phrasea/Application/Api.php b/lib/Alchemy/Phrasea/Application/Api.php index 304a450bc7..bfd00f9ddf 100644 --- a/lib/Alchemy/Phrasea/Application/Api.php +++ b/lib/Alchemy/Phrasea/Application/Api.php @@ -32,6 +32,8 @@ return call_user_func(function() $app = new Silex\Application(); + $app["Core"] = bootstrap::getCore(); + $app["appbox"] = appbox::get_instance(); /** @@ -68,7 +70,7 @@ return call_user_func(function() */ $app['api'] = function () use ($app) { - return new API_V1_adapter(false, $app["appbox"]); + return new API_V1_adapter(false, $app["appbox"], $app["Core"]); }; diff --git a/lib/Alchemy/Phrasea/Application/Lightbox.php b/lib/Alchemy/Phrasea/Application/Lightbox.php index 23f5c1d2aa..a5fdf61f5d 100644 --- a/lib/Alchemy/Phrasea/Application/Lightbox.php +++ b/lib/Alchemy/Phrasea/Application/Lightbox.php @@ -29,6 +29,8 @@ return call_user_func( $session = $appbox->get_session(); $app = new Silex\Application(); + + $app['Core'] = bootstrap::getCore(); $app->get('/', function () use ($session, $appbox) { diff --git a/lib/Alchemy/Phrasea/Application/OAuth2.php b/lib/Alchemy/Phrasea/Application/OAuth2.php index 9aeab670d7..92a5c4174c 100644 --- a/lib/Alchemy/Phrasea/Application/OAuth2.php +++ b/lib/Alchemy/Phrasea/Application/OAuth2.php @@ -33,6 +33,8 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; return call_user_func(function() { $app = new Silex\Application(); + + $app['Core'] = bootstrap::getCore(); $app->register(new Silex\Provider\ValidatorServiceProvider(), array( 'validator.class_path' => __DIR__ . '/../../../../lib/vendor/symfony/src', diff --git a/lib/Alchemy/Phrasea/Application/Overview.php b/lib/Alchemy/Phrasea/Application/Overview.php index bca38e533d..33b3202bf9 100644 --- a/lib/Alchemy/Phrasea/Application/Overview.php +++ b/lib/Alchemy/Phrasea/Application/Overview.php @@ -29,6 +29,8 @@ return call_user_func( $session = $appbox->get_session(); $app = new Silex\Application(); + + $app['Core'] = bootstrap::getCore(); $deliver_content = function(Session_Handler $session, record_adapter $record, $subdef, $watermark, $stamp, $app) diff --git a/lib/Alchemy/Phrasea/Application/Setup.php b/lib/Alchemy/Phrasea/Application/Setup.php index 20470a1b9b..56a99be1a6 100644 --- a/lib/Alchemy/Phrasea/Application/Setup.php +++ b/lib/Alchemy/Phrasea/Application/Setup.php @@ -25,6 +25,8 @@ use Alchemy\Phrasea\Controller\Utils as ControllerUtils; return call_user_func(function() { $app = new Silex\Application(); + + $app['Core'] = bootstrap::getCore(); $app['install'] = false; $app['upgrade'] = false; From dae47e06af8647fa68035314470b8a4a9da0b6c9 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Sat, 24 Dec 2011 03:18:35 +0100 Subject: [PATCH 09/63] Enhancement Doctrine entitties --- .../Entities/ValidationParticipant.php | 158 +++++++++++++++--- lib/Doctrine/Entities/ValidationSession.php | 74 ++++++++ .../Repositories/BasketElementRepository.php | 49 ++++++ .../Repositories/BasketRepository.php | 38 ++++- 4 files changed, 287 insertions(+), 32 deletions(-) create mode 100644 lib/Doctrine/Repositories/BasketElementRepository.php diff --git a/lib/Doctrine/Entities/ValidationParticipant.php b/lib/Doctrine/Entities/ValidationParticipant.php index c588a8892a..e3d81aafbf 100644 --- a/lib/Doctrine/Entities/ValidationParticipant.php +++ b/lib/Doctrine/Entities/ValidationParticipant.php @@ -8,7 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ + namespace Entities; + /** * * @package @@ -28,19 +30,44 @@ class ValidationParticipant */ private $usr_id; - /** - * @var Entities\ValidationData - */ - private $datases; - /** * @var Entities\ValidationSession */ private $session; + /** + * @var datetime $reminded + */ + private $reminded = false; + + /** + * @var Entities\ValidationData + */ + private $datas; + + /** + * @var boolean $is_confirmed + */ + private $is_confirmed = false; + + /** + * @var boolean $can_agree + */ + private $can_agree = false; + + /** + * @var boolean $can_see_others + */ + private $can_see_others = false; + + /** + * @var boolean $is_aware + */ + private $is_aware = false; + public function __construct() { - $this->datases = new \Doctrine\Common\Collections\ArrayCollection(); + $this->datas = new \Doctrine\Common\Collections\ArrayCollection(); } /** @@ -76,21 +103,11 @@ class ValidationParticipant /** * Add datases * - * @param Entities\ValidationData $datases + * @param Entities\ValidationData $datas */ - public function addValidationData(\Entities\ValidationData $datases) + public function addValidationData(\Entities\ValidationData $datas) { - $this->datases[] = $datases; - } - - /** - * Get datases - * - * @return Doctrine\Common\Collections\Collection - */ - public function getDatases() - { - return $this->datases; + $this->datas[] = $datas; } /** @@ -113,12 +130,6 @@ class ValidationParticipant return $this->session; } - /** - * @var boolean $is_aware - */ - private $is_aware = false; - - /** * Set is_aware * @@ -144,10 +155,105 @@ class ValidationParticipant * @param \User_Adapter $user * @return ValidationParticipant */ - public function setParticipant(\User_Adapter $user) + public function setUser(\User_Adapter $user) { $this->usr_id = $user->get_id(); return $this; } + public function getUser() + { + return \User_Adapter::getInstance($this->getUsrId(), appbox::get_instance()); + } + + /** + * Set reminded + * + * @param datetime $reminded + */ + public function setReminded($reminded) + { + $this->reminded = $reminded; + } + + /** + * Get reminded + * + * @return datetime + */ + public function getReminded() + { + return $this->reminded; + } + + /** + * Get datas + * + * @return Doctrine\Common\Collections\Collection + */ + public function getDatas() + { + return $this->datas; + } + + /** + * Set is_confirmed + * + * @param boolean $isConfirmed + */ + public function setIsConfirmed($isConfirmed) + { + $this->is_confirmed = $isConfirmed; + } + + /** + * Get is_confirmed + * + * @return boolean + */ + public function getIsConfirmed() + { + return $this->is_confirmed; + } + + /** + * Set can_agree + * + * @param boolean $canAgree + */ + public function setCanAgree($canAgree) + { + $this->can_agree = $canAgree; + } + + /** + * Get can_agree + * + * @return boolean + */ + public function getCanAgree() + { + return $this->can_agree; + } + + /** + * Set can_see_others + * + * @param boolean $canSeeOthers + */ + public function setCanSeeOthers($canSeeOthers) + { + $this->can_see_others = $canSeeOthers; + } + + /** + * Get can_see_others + * + * @return boolean + */ + public function getCanSeeOthers() + { + return $this->can_see_others; + } + } \ No newline at end of file diff --git a/lib/Doctrine/Entities/ValidationSession.php b/lib/Doctrine/Entities/ValidationSession.php index 53ecd9e063..42d05e2767 100644 --- a/lib/Doctrine/Entities/ValidationSession.php +++ b/lib/Doctrine/Entities/ValidationSession.php @@ -265,6 +265,24 @@ class ValidationSession return $this->participants; } + /** + * Get a participant + * + * @return Entities\ValidationParticipant + */ + public function getParticipant(\User_Adapter $user) + { + foreach ($this->getParticipants() as $participant) + { + if ($participant->getUser()->get_id() == $user->get_id()) + { + return $participant; + } + } + + throw new \Exception_NotFound('Particpant not found'); + } + /** * @var integer $initiator */ @@ -295,6 +313,11 @@ class ValidationSession return $this->initiator_id; } + public function isInitiator(\User_Adapter $user) + { + return $this->getInitiatorId() == $user->get_id(); + } + public function setInitiator(\User_Adapter $user) { $this->initiator_id = $user->get_id(); @@ -309,4 +332,55 @@ class ValidationSession } } + public function isFinished() + { + if (is_null($this->getExpires())) + { + return null; + } + + $date_obj = new DateTime(); + + return $date_obj > $this->getExpires(); + } + + public function getValidationString(\User_Adapter $user) + { + + if ($this->isInitiator($user)) + { + if ($this->isFinished()) + { + return sprintf( + _('Vous aviez envoye cette demande a %d utilisateurs') + , (count($this->getParticipants()) - 1) + ); + } + else + { + return sprintf( + _('Vous avez envoye cette demande a %d utilisateurs') + , (count($this->getParticipants()) - 1) + ); + } + } + else + { + if ($this->getParticipant($user)->getCanSeeOthers()) + { + return sprintf( + _('Processus de validation recu de %s et concernant %d utilisateurs') + , $this->getInitiator()->get_display_name() + , (count($this->getParticipants()) - 1)); + } + else + { + return sprintf( + _('Processus de validation recu de %s') + , $this->getInitiator()->get_display_name() + ); + } + } + } + } \ No newline at end of file diff --git a/lib/Doctrine/Repositories/BasketElementRepository.php b/lib/Doctrine/Repositories/BasketElementRepository.php new file mode 100644 index 0000000000..c95d095765 --- /dev/null +++ b/lib/Doctrine/Repositories/BasketElementRepository.php @@ -0,0 +1,49 @@ + $user->get_id(), + 'element_id' => $element_id + ); + + $query = $this->_em->createQuery($dql); + $query->setParameters($params); + + return $query->getOneOrNullResult(); + } + + public function findElementsByRecord(\record_adapter $record) + { + $dql = 'SELECT e FROM Entities\BasketElement e + WHERE e.record_id = :record_id AND e.sbas_id = :sbas_id'; + + $params = array( + 'sbas_id' => $record->get_sbas_id(), + 'record_id' => $record_id->get_record_id() + ); + + $query = $this->_em->createQuery($dql); + $query->setParameters($params); + + return $query->getResult(); + } + +} \ No newline at end of file diff --git a/lib/Doctrine/Repositories/BasketRepository.php b/lib/Doctrine/Repositories/BasketRepository.php index 5ec96c8c0d..0bc3abb163 100644 --- a/lib/Doctrine/Repositories/BasketRepository.php +++ b/lib/Doctrine/Repositories/BasketRepository.php @@ -32,14 +32,13 @@ class BasketRepository extends EntityRepository { $dql = 'SELECT b FROM Entities\Basket b WHERE b.usr_id = :usr_id AND b.archived = false'; - + $query = $this->_em->createQuery($dql); $query->setParameters(array('usr_id' => $user->get_id())); return $query->getResult(); } - - + /** * Returns all baskets that are in validation session not expired and * where a specified user is participant (not owner) @@ -54,18 +53,27 @@ class BasketRepository extends EntityRepository JOIN s.participants p WHERE b.usr_id != ?1 AND p.usr_id = ?2 AND s.expires > CURRENT_TIMESTAMP()'; - + $query = $this->_em->createQuery($dql); $query->setParameters(array(1 => $user->get_id(), 2 => $user->get_id())); return $query->getResult(); } - + + /** + * Find a basket specified by his basket_id and his owner + * + * @throws \Exception_NotFound + * @throws \Exception_Forbidden + * @param type $basket_id + * @param \User_Adapter $user + * @return \Entities\Basket + */ public function findUserBasket($basket_id, \User_Adapter $user) { $basket = $this->find($basket_id); - /* @var $basket Entities\Basket */ + /* @var $basket \Entities\Basket */ if (null === $basket) { throw new \Exception_NotFound(_('Basket is not found')); @@ -79,4 +87,22 @@ class BasketRepository extends EntityRepository return $basket; } + public function findContainingRecord(\record_adapter $record) + { + + $dql = 'SELECT b FROM Entities\Basket b + JOIN b.elements e + WHERE e.record_id = :record_id AND e.sbas_id = e.sbas_id'; + + $params = array( + 'record_id' => $record->get_record_id(), + 'sbas_id' => $record->get_sbas_id() + ); + + $query = $this->_em->createQuery($dql); + $query->setParameters($params); + + return $query->getResult(); + } + } From 8b75d701563574688a37da6452688d107dd65c59 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Sat, 24 Dec 2011 03:19:43 +0100 Subject: [PATCH 10/63] Refactor basket_adapter --- lib/classes/API/V1/adapter.class.php | 222 +++++++++++++++++++-------- 1 file changed, 155 insertions(+), 67 deletions(-) diff --git a/lib/classes/API/V1/adapter.class.php b/lib/classes/API/V1/adapter.class.php index 75b9fe69ec..fe09fe2e3e 100644 --- a/lib/classes/API/V1/adapter.class.php +++ b/lib/classes/API/V1/adapter.class.php @@ -34,6 +34,13 @@ class API_V1_adapter extends API_V1_Abstract */ protected $appbox; + /** + * Phraseanet Core + * + * @var \Alchemy\Phrasea\Core + */ + protected $core; + /** * API constructor * @@ -41,9 +48,10 @@ class API_V1_adapter extends API_V1_Abstract * @param appbox $appbox Appbox object * @return API_V1_adapter */ - public function __construct($auth_token, appbox &$appbox) + public function __construct($auth_token, appbox &$appbox, Alchemy\Phrasea\Core $core) { $this->appbox = $appbox; + $this->core = $core; return $this; } @@ -332,7 +340,7 @@ class API_V1_adapter extends API_V1_Abstract $ret = array(); foreach ($containers as $basket) { - $ret[$basket->get_ssel_id()] = $this->list_basket($basket); + $ret[$basket->getId()] = $this->list_basket($basket); } $result->set_datas(array("baskets" => $ret)); @@ -549,7 +557,7 @@ class API_V1_adapter extends API_V1_Abstract */ public function add_record_tobasket(Request $request, $databox_id, $record_id) { - + } /** @@ -607,10 +615,18 @@ class API_V1_adapter extends API_V1_Abstract if (trim(strip_tags($name)) === '') throw new API_V1_exception_badrequest (); - $user = User_Adapter::getInstance($this->appbox->get_session()->get_usr_id(), $this->appbox); - $basket = basket_adapter::create($this->appbox, $name, $user); + $user = $this->core->getAuthenticatedUser(); + + $Basket = new \Entities\Basket(); + $Basket->setOwner($user); + $Basket->setName($name); + + $em = $this->core->getEntityManager(); + $em->persist($Basket); + $em->flush(); + $ret = array(); - $ret[$basket->get_ssel_id()] = $this->list_basket($basket); + $ret[$Basket->getId()] = $this->list_basket($Basket); $result->set_datas(array("basket" => $ret)); return $result; @@ -627,12 +643,15 @@ class API_V1_adapter extends API_V1_Abstract { $result = new API_V1_result($request, $this); - $basket = basket_adapter::getInstance( - $this->appbox - , $basket_id - , $this->appbox->get_session()->get_usr_id() - ); - $basket->delete(); + $em = $this->core->getEntityManager(); + $repository = $em->getRepository('\Entities\Basket'); + + + /* @var $repository \Repositories\BasketRepository */ + + $Basket = $repository->findUserBasket($basket_id, $this->core->getAuthenticatedUser()); + $em->remove($Basket); + $em->flush(); return $this->search_baskets($request); } @@ -647,21 +666,21 @@ class API_V1_adapter extends API_V1_Abstract public function get_basket(Request $request, $basket_id) { $result = new API_V1_result($request, $this); - try - { - $basket = basket_adapter::getInstance($this->appbox, $basket_id, $this->appbox->get_session()->get_usr_id()); - $result->set_datas( - array("basket_elements" => - array( - $basket->get_ssel_id() => $this->list_basket_content($basket) - ) - ) - ); - } - catch (Exception $e) - { - } + $em = $this->core->getEntityManager(); + $repository = $em->getRepository('\Entities\Basket'); + + /* @var $repository \Repositories\BasketRepository */ + + $Basket = $repository->findUserBasket($basket_id, $this->core->getAuthenticatedUser()); + + $result->set_datas( + array("basket_elements" => + array( + $Basket->getId() => $this->list_basket_content($Basket) + ) + ) + ); return $result; } @@ -669,16 +688,18 @@ class API_V1_adapter extends API_V1_Abstract /** * Retrieve elements of one basket * - * @param basket_adapter $basket + * @param \Entities\Basket $Basket * @return type */ - protected function list_basket_content(basket_adapter $basket) + protected function list_basket_content(\Entities\Basket $Basket) { - $ret = $this->list_basket($basket); + $ret = $this->list_basket($Basket); + $ret['basket_elements'] = array(); - foreach ($basket->get_elements() as $basket_element) + + foreach ($Basket->getElements() as $basket_element) { - $ret['basket_elements'][$basket_element->get_sselcont_id()] = $this->list_basket_element($basket_element); + $ret['basket_elements'][$basket_element->getId()] = $this->list_basket_element($basket_element); } return $ret; @@ -687,23 +708,46 @@ class API_V1_adapter extends API_V1_Abstract /** * Retrieve detailled informations about a basket element * - * @param basket_element_adapter $basket_element + * @param \Entities\BasketElement $basket_element * @return type */ - protected function list_basket_element(basket_element_adapter $basket_element) + protected function list_basket_element(\Entities\BasketElement $basket_element) { $ret = array( - 'basket_element_id' => $basket_element->get_sselcont_id() - , 'order' => $basket_element->get_order() - , 'record' => $this->list_record($basket_element->get_record()) - , 'validation_item' => $basket_element->is_validation_item() + 'basket_element_id' => $basket_element->getId() + , 'order' => $basket_element->getOrd() + , 'record' => $this->list_record($basket_element->getRecord()) + , 'validation_item' => !!$basket_element->getValidationDatas() ); - if ($basket_element->is_validation_item()) + if ($basket_element->getValidationDatas()) { - $ret['choices'] = $basket_element->get_choices(); - $ret['agreement'] = $basket_element->get_my_agreement(); - $ret['note'] = $basket_element->get_my_note(); + $choices = array(); + $agreement = $note = null; + + foreach ($basket_element->getValidationDatas() as $validation_datas) + { + $user = $validation_datas->getParticipant()->getUser(); + /* @var $validation_datas Entities\ValidationData */ + $choices[$user->get_id()] = array( + 'usr_id' => $user->get_id(), + 'usr_name' => $user->get_display_name(), + 'is_mine' => $user->get_id() == $this->core->getAuthenticatedUser()->get_id(), + 'agreement' => $validation_datas->getAgreement(), + 'updated_on' => $validation_datas->getUpdated()->format(DATE_ATOM), + 'note' => $validation_datas->getNote() + ); + + if($user->get_id() == $this->core->getAuthenticatedUser()->get_id()) + { + $agreement = $validation_datas->getAgreement(); + $note = $validation_datas->getNote(); + } + } + + $ret['choices'] = $choices(); + $ret['agreement'] = $agreement(); + $ret['note'] = $note(); } return $ret; @@ -721,12 +765,23 @@ class API_V1_adapter extends API_V1_Abstract $result = new API_V1_result($request, $this); $name = $request->get('name'); - $basket = basket_adapter::getInstance($this->appbox, $basket_id, $this->appbox->get_session()->get_usr_id()); - $basket->set_name($name); + + $em = $this->core->getEntityManager(); + $repository = $em->getRepository('\Entities\Basket'); + + + /* @var $repository \Repositories\BasketRepository */ + + $Basket = $repository->findUserBasket($basket_id, $this->core->getAuthenticatedUser()); + $Basket->setName($name); + + $em->merge($Basket); + $em->flush(); + $result->set_datas( array( "basket" => - array($basket->get_ssel_id() => $this->list_basket_content($basket) + array($Basket->getId() => $this->list_basket_content($Basket) ) ) ); @@ -746,12 +801,23 @@ class API_V1_adapter extends API_V1_Abstract $result = new API_V1_result($request, $this); $desc = $request->get('description'); - $basket = basket_adapter::getInstance($this->appbox, $basket_id, $this->appbox->get_session()->get_usr_id()); - $basket->set_description($desc); + + $em = $this->core->getEntityManager(); + $repository = $em->getRepository('\Entities\Basket'); + + + /* @var $repository \Repositories\BasketRepository */ + + $Basket = $repository->findUserBasket($basket_id, $this->core->getAuthenticatedUser()); + $Basket->setDescription($desc); + + $em->merge($Basket); + $em->flush(); + $result->set_datas( array( "basket" => - array($basket->get_ssel_id() => $this->list_basket_content($basket) + array($Basket->getId() => $this->list_basket_content($Basket) ) ) ); @@ -791,7 +857,7 @@ class API_V1_adapter extends API_V1_Abstract */ public function remove_publications(Request $request, $publication_id) { - + } /** @@ -919,7 +985,7 @@ class API_V1_adapter extends API_V1_Abstract */ public function search_users(Request $request) { - + } /** @@ -929,7 +995,7 @@ class API_V1_adapter extends API_V1_Abstract */ public function get_user_acces(Request $request, $usr_id) { - + } /** @@ -938,7 +1004,7 @@ class API_V1_adapter extends API_V1_Abstract */ public function add_user(Request $request) { - + } /** @@ -1032,7 +1098,6 @@ class API_V1_adapter extends API_V1_Abstract * @todo ajouter une option pour avoir les values serialisées * dans un cas multi */ - return array( 'meta_id' => $field->get_meta_id() , 'meta_structure_id' => $field->get_meta_struct_id() @@ -1044,30 +1109,53 @@ class API_V1_adapter extends API_V1_Abstract /** * Retirve information about one basket * - * @param basket_adapter $basket + * @param \Entities\Basket $basket * @return array */ - protected function list_basket(basket_adapter $basket) + protected function list_basket(\Entities\Basket $basket) { $ret = array( - 'created_on' => $basket->get_create_date()->format(DATE_ATOM) - , 'description' => $basket->get_description() - , 'name' => $basket->get_name() - , 'pusher_usr_id' => $basket->get_pusher() ? $basket->get_pusher()->get_id() : null - , 'ssel_id' => $basket->get_ssel_id() - , 'updated_on' => $basket->get_update_date()->format(DATE_ATOM) - , 'unread' => $basket->is_unread() + 'created_on' => $basket->getCreated()->format(DATE_ATOM) + , 'description' => $basket->getDescription() + , 'name' => $basket->getName() + , 'pusher_usr_id' => $basket->getPusherId() + , 'ssel_id' => $basket->getId() + , 'updated_on' => $basket->getUpdated()->format(DATE_ATOM) + , 'unread' => !$basket->getIsRead() ); - if ($basket->is_valid()) + if ($basket->getValidation()) { + $users = array(); + + foreach ($basket->getValidation()->getParticipants() as $participant) + { + /* @var $participant \Entities\ValidationParticipant */ + $user = $participant->getUser(); + + $users[$user->get_id()] = array( + 'usr_id' => $user->get_id(), + 'usr_name' => $user->get_display_name(), + 'confirmed' => $participant->getIsConfirmed(), + 'can_agree' => $participant->getCanAgree(), + 'can_see_others' => $participant->getCanSeeOthers() + ); + } + + $expires_on_atom = $basket->getValidation()->getExpires(); + + if ($expires_on_atom instanceof DateTime) + $expires_on_atom = $expires_on_atom->format(DATE_ATOM); + + $user = \User_Adapter::getInstance($this->appbox->get_session()->get_usr_id(), $this->appbox); + $ret = array_merge( array( - 'validation_users' => $basket->get_validating_users() - , 'validation_end_date' => ($basket->get_validation_end_date() instanceof DateTime ? $basket->get_validation_end_date()->format(DATE_ATOM) : null) - , 'validation_infos' => $basket->get_validation_infos() - , 'validation_confirmed' => $basket->is_confirmed() - , 'mine' => $basket->is_mine() + 'validation_users' => $users + , 'validation_end_date' => $expires_on_atom + , 'validation_infos' => $basket->getValidation()->getValidationString($user) + , 'validation_confirmed' => $basket->getValidation()->getParticipant($user)->getIsConfirmed() + , 'mine' => $basket->getValidation()->isInitiator($user) ) , $ret ); From 82fd62320bbb576a35c65f3c09c4721219099027 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Sat, 24 Dec 2011 03:21:19 +0100 Subject: [PATCH 11/63] Enhancement entities --- lib/conf.d/Doctrine/Entities.BasketElement.dcm.yml | 1 + lib/conf.d/Doctrine/Entities.ValidationData.dcm.yml | 2 +- .../Doctrine/Entities.ValidationParticipant.dcm.yml | 11 ++++++++++- .../Doctrine/Entities.ValidationSession.dcm.yml | 3 --- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/conf.d/Doctrine/Entities.BasketElement.dcm.yml b/lib/conf.d/Doctrine/Entities.BasketElement.dcm.yml index 8c07f0c891..1ec3141289 100644 --- a/lib/conf.d/Doctrine/Entities.BasketElement.dcm.yml +++ b/lib/conf.d/Doctrine/Entities.BasketElement.dcm.yml @@ -1,5 +1,6 @@ Entities\BasketElement: type: entity + repositoryClass: Repositories\BasketElementRepository table: BasketElements uniqueConstraints: unique_recordcle: diff --git a/lib/conf.d/Doctrine/Entities.ValidationData.dcm.yml b/lib/conf.d/Doctrine/Entities.ValidationData.dcm.yml index 019a2688ca..1752c81520 100644 --- a/lib/conf.d/Doctrine/Entities.ValidationData.dcm.yml +++ b/lib/conf.d/Doctrine/Entities.ValidationData.dcm.yml @@ -19,7 +19,7 @@ Entities\ValidationData: manyToOne: participant: targetEntity: ValidationParticipant - inversedBy: datases + inversedBy: datas joinColumn: name: participant_id referencedColumnName: id diff --git a/lib/conf.d/Doctrine/Entities.ValidationParticipant.dcm.yml b/lib/conf.d/Doctrine/Entities.ValidationParticipant.dcm.yml index f5a499051d..cc0038ecf4 100644 --- a/lib/conf.d/Doctrine/Entities.ValidationParticipant.dcm.yml +++ b/lib/conf.d/Doctrine/Entities.ValidationParticipant.dcm.yml @@ -12,8 +12,17 @@ Entities\ValidationParticipant: type: integer is_aware: type: boolean + is_confirmed: + type: boolean + can_agree: + type: boolean + can_see_others: + type: boolean + reminded: + type: datetime + nullable: true; oneToMany: - datases: + datas: targetEntity: ValidationData mappedBy: participant cascade: ["ALL"] diff --git a/lib/conf.d/Doctrine/Entities.ValidationSession.dcm.yml b/lib/conf.d/Doctrine/Entities.ValidationSession.dcm.yml index 38c677fe58..e61be84eb8 100644 --- a/lib/conf.d/Doctrine/Entities.ValidationSession.dcm.yml +++ b/lib/conf.d/Doctrine/Entities.ValidationSession.dcm.yml @@ -21,9 +21,6 @@ Entities\ValidationSession: on: update expires: type: datetime - reminded: - type: datetime - nullable: true; oneToOne: basket: targetEntity: Basket From 0a218b6607e9c55c5d024a172b1d0f1f50d322c4 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 10:47:17 +0100 Subject: [PATCH 12/63] Production JS --- www/prod/jquery.Alerts.js | 50 +++ www/prod/jquery.Phraseanet.js | 7 + www/prod/jquery.Prod.js | 33 ++ www/prod/jquery.Results.js | 22 ++ www/prod/jquery.WorkZone.js | 591 ++++++++++++++++++++++++++++++++++ 5 files changed, 703 insertions(+) create mode 100644 www/prod/jquery.Alerts.js create mode 100644 www/prod/jquery.Phraseanet.js create mode 100644 www/prod/jquery.Prod.js create mode 100644 www/prod/jquery.Results.js create mode 100644 www/prod/jquery.WorkZone.js diff --git a/www/prod/jquery.Alerts.js b/www/prod/jquery.Alerts.js new file mode 100644 index 0000000000..3b25facb9c --- /dev/null +++ b/www/prod/jquery.Alerts.js @@ -0,0 +1,50 @@ +var p4 = p4 || {}; + +(function(p4){ + + function create_dialog() + { + if($('#p4_alerts').length === 0) + { + $('body').append('
'); + } + + return $('#p4_alerts'); + } + + function alert(title, message) + { + var dialog = create_dialog(); + + var button = new Object(); + + button[language.annuler] = function(){ + dialog.dialog('close'); + }; + + dialog.attr('title',title) + .empty() + .append(message) + .dialog({ + + autoOpen:false, + closeOnEscape:true, + resizable:false, + draggable:false, + modal:true, + buttons : button, + draggable:false, + overlay: { + backgroundColor: '#000', + opacity: 0.7 + } + }).dialog('open'); + + return; + } + + p4.Alerts = alert; + + + return; +}(p4)) diff --git a/www/prod/jquery.Phraseanet.js b/www/prod/jquery.Phraseanet.js new file mode 100644 index 0000000000..188d3dd8bb --- /dev/null +++ b/www/prod/jquery.Phraseanet.js @@ -0,0 +1,7 @@ +var p4 = p4 || {}; + +(function(p4){ + + + +}(p4)); \ No newline at end of file diff --git a/www/prod/jquery.Prod.js b/www/prod/jquery.Prod.js new file mode 100644 index 0000000000..0447771527 --- /dev/null +++ b/www/prod/jquery.Prod.js @@ -0,0 +1,33 @@ +(function(){ + + $(document).ready(function(){ + + $('a.dialog').live('click', function(event){ + + var $this = $(this); + + $.ajax({ + type: "GET", + url: $this.attr('href'), + dataType: 'html', + beforeSend:function(){ + + }, + success: function(data){ + $('#DIALOG').attr('title', $this.attr('title')) + .empty() + .append(data) + .dialog() + .dialog('open'); + return; + } + }); + + return false; + }); + + + + }); + +}()) \ No newline at end of file diff --git a/www/prod/jquery.Results.js b/www/prod/jquery.Results.js new file mode 100644 index 0000000000..7510b09d8b --- /dev/null +++ b/www/prod/jquery.Results.js @@ -0,0 +1,22 @@ +var p4 = p4 || {}; + +(function(p4, window){ + + p4.Results = { + 'Selection':new Selectable({ + selector : '.IMGT', + container:$('#answers'), + selectStart:function(event, selection){ + $('#answercontextwrap table:visible').hide(); + }, + selectStop:function(event, selection){ + viewNbSelect(); + }, + callbackSelection:function(element){ + return $(element).attr('id').split('_').slice(1,3).join('_'); + } + }) + }; + + return; +}(p4, window)) diff --git a/www/prod/jquery.WorkZone.js b/www/prod/jquery.WorkZone.js new file mode 100644 index 0000000000..78e1dd9f1e --- /dev/null +++ b/www/prod/jquery.WorkZone.js @@ -0,0 +1,591 @@ +var p4 = p4 || {}; + +(function(p4){ + + + + + + function refreshBaskets(baskId, sort, scrolltobottom) + { + var active = $('#baskets .SSTT.ui-state-active'); + if(baskId == 'current' && active.length>0) + baskId = active.attr('id').split('_').slice(1,2).pop(); + sort = ($.inArray(sort, ['date', 'name'])>=0) ? sort : ''; + + scrolltobottom = typeof scrolltobottom == 'undefined' ? false : scrolltobottom; + + $.ajax({ + type: "GET", + url: "/prod/WorkZone/", + data: { + type:'basket', + id:baskId, + sort:sort + }, + beforeSend:function(){ + $('#basketcontextwrap').remove(); + }, + success: function(data){ + + var cache = $("#idFrameC #baskets"); + $(".SSTT",cache).droppable('destroy'); + + $('.bloc',cache).droppable('destroy'); + cache.accordion('destroy') + + .empty() + .append(data); + + activeBaskets(); + $('.basketTips').tooltip({ + delay: 200 + }); + cache.disableSelection(); + + if(!scrolltobottom) + return; + + p4.next_bask_scroll = true; + return; + } + }); + } + + + + function setTemporaryPref(name,value) + { + + $.ajax({ + type: "POST", + url: "/prod/prodFeedBack.php", + data: { + action: "SAVETEMPPREF", + prop:name, + value:value + }, + success: function(data){ + return; + } + }); + } + + $("#baskets div.content select[name=valid_ord]").live('change',function(){ + + var active = $('#baskets .SSTT.ui-state-active'); + if(active.length==0) + return; + + getContent(active); + }); + + + + function WorkZoneElementRemover(el, confirm) + { + + if(confirm !== true && $(el).hasClass('groupings') && p4.reg_delete == true) + { + var buttons = {}; + + + buttons[language.valider] = function() { + $("#DIALOG-baskets").dialog('close').remove(); + WorkZoneElementRemover(el,true); + }; + + buttons[language.annuler] = function(){ + $("#DIALOG-baskets").dialog('close').remove(); + }; + + var texte = '

'+language.confirmRemoveReg+'

'+language.hideMessage+'
'; + $('body').append('
'); + $("#DIALOG-baskets").attr('title',language.removeTitle) + .empty() + .append(texte) + .dialog({ + + autoOpen:false, + closeOnEscape:true, + resizable:false, + draggable:false, + modal:true, + buttons:buttons, + draggable:false, + overlay: { + backgroundColor: '#000', + opacity: 0.7 + } + }).dialog('open'); + return; + } + + var id = $(el).attr('id').split('_').slice(2,4).join('_'); + + $.ajax({ + type: "POST", + url: $(el).attr('href'), + dataType:'json', + beforeSend : function(){ + $('.wrapCHIM_'+id).find('.CHIM').fadeOut(); + }, + success: function(data){ + + if(data.success) + { + humane.info(data.message); + p4.WorkZone.Selection.remove(id); + + $('.wrapCHIM_'+id).find('.CHIM').draggable('destroy'); + $('.wrapCHIM_'+id).remove(); + } + else + { + humane.error(data.message); + $('.wrapCHIM_'+id).find('.CHIM').fadeIn(); + } + return; + } + }); + return false; + } + + + function activeBaskets() + { + var cache = $("#idFrameC #baskets"); + + cache.accordion({ + active:'active', + autoHeight: false, + collapsible:true, + header:'div.header', + change:function(event,ui){ + + if(p4.next_bask_scroll) + { + p4.next_bask_scroll = false; + + var b_active = $('#baskets .SSTT.active'); + + if(!b_active.next().is(':visible')) + return; + + var t = $('#baskets .SSTT.active').position().top + b_active.next().height() -200; + + t = t < 0 ? 0 : t; + + $('#baskets .bloc').stop().animate({ + scrollTop:t + }); + } + + var uiactive = $(this).find('.ui-state-active'); + + if(uiactive.length === 0) + { + return; /* everything is closed */ + } + + var clicked = uiactive.attr('id').split('_').pop(); + var href = $('a', uiactive).attr('href'); + + uiactive.addClass('ui-state-focus active'); + + p4.WorkZone.Selection.empty(); + + getContent(uiactive); + + }, + changestart:function(event,ui){ + $('#basketcontextwrap .basketcontextmenu').hide(); + } + }); + $('.bloc',cache).droppable({ + accept:function(elem){ + if($(elem).hasClass('grouping') && !$(elem).hasClass('SSTT')) + return true; + return false; + }, + scope:'objects', + hoverClass:'groupDrop', + tolerance:'pointer', + drop:function(){ + fix(); + } + }); + + if($('.SSTT.active',cache).length>0) + { + var el = $('.SSTT.active',cache)[0]; + $(el).trigger('click'); + } + + + $(".SSTT, .content",cache) + .droppable({ + scope:'objects', + hoverClass:'baskDrop', + tolerance:'pointer', + accept:function(elem){ + if($(elem).hasClass('CHIM')) + { + if($(elem).closest('.content').prev()[0] == $(this)[0]) + { + return false; + } + } + if($(elem).hasClass('grouping') || $(elem).parent()[0]==$(this)[0]) + return false; + return true; + }, + drop:function(event,ui){ + dropOnBask(event,ui.draggable,$(this)); + } + }); + + if($('#basketcontextwrap').length == 0) + $('body').append('
'); + + $('.context-menu-item',cache).hover(function(){ + $(this).addClass('context-menu-item-hover'); + },function(){ + $(this).removeClass('context-menu-item-hover'); + }); + $.each($(".SSTT",cache),function(){ + var el = $(this); + $(this).find('.contextMenuTrigger').contextMenu('#'+$(this).attr('id')+' .contextMenu',{ + 'appendTo':'#basketcontextwrap', + openEvt:'click', + theme:'vista', + dropDown:true, + showTransition:'slideDown', + hideTransition:'hide', + shadow:false + }); + }); + + } + + + + function getContent(header) + { + if(window.console) + { + console.log('Reload content for ', header); + } + + $.ajax({ + type: "GET", + url: $('a', header).attr('href'), + dataType:'html', + beforeSend:function(){ + $('#tooltip').hide(); + header.next().addClass('loading'); + }, + success: function(data){ + header.removeClass('unread'); + + var dest = header.next(); + + dest.droppable('destroy').empty().removeClass('loading'); + + dest.append(data) + + $('a.WorkZoneElementRemover', dest) + .bind('mousedown', function(event){return false;}) + .bind('click', function(event){ + + return WorkZoneElementRemover($(this), false); + + }); + + dest.droppable({ + accept:function(elem){ + if($(elem).hasClass('CHIM')) + { + if($(elem).closest('.content')[0] == $(this)[0]) + { + return false; + } + } + if($(elem).hasClass('grouping') || $(elem).parent()[0]==$(this)[0]) + return false; + return true; + }, + hoverClass:'baskDrop', + scope:'objects', + drop:function(event, ui){ + dropOnBask(event,ui.draggable,$(this).prev()); + }, + tolerance:'pointer' + }); + + $('.noteTips, .captionRolloverTips', dest).tooltip(); + + dest.find('.CHIM').draggable({ + helper : function(){ + $('body').append('
'+ + '
'+ + p4.WorkZone.Selection.length() + '
'); + return $('#dragDropCursor'); + }, + scope:"objects", + distance : 20, + scroll : false, + refreshPositions:true, + cursorAt: { + top:10, + left:-20 + }, + start:function(event, ui){ + var baskets = $('#baskets'); + baskets.append('
'+ + '
'); + $('.bottom-scroller',baskets).bind('mousemove',function(){ + $('#baskets .bloc').scrollTop($('#baskets .bloc').scrollTop()+30); + }); + $('.top-scroller',baskets).bind('mousemove',function(){ + $('#baskets .bloc').scrollTop($('#baskets .bloc').scrollTop()-30); + }); + }, + stop:function(){ + $('#baskets').find('.top-scroller, .bottom-scroller') + .unbind() + .remove(); + }, + drag:function(event,ui){ + if(is_ctrl_key(event) || $(this).closest('.content').hasClass('grouping')) + $('#dragDropCursor div').empty().append('+ '+p4.WorkZone.Selection.length()); + else + $('#dragDropCursor div').empty().append(p4.WorkZone.Selection.length()); + + } + }); + answerSizer(); + return; + } + }); + } + + + + + + + + function dropOnBask(event,from,destKey) + { + var action = "", + from = $(from), dest_uri = '', lstbr = [], + sselcont = [], act = "ADD"; + + if(from.hasClass("CHIM")) + { + /* Element(s) come from an open object in the workzone */ + action = $(' #baskets .ui-state-active').hasClass('grouping') ? 'REG2' : 'CHU2'; + } + else + { + /* Element(s) come from result */ + action = 'IMGT2'; + } + + action += destKey.hasClass('grouping') ? 'REG' : 'CHU'; + + if(destKey.hasClass('content')) + { + /* I dropped on content */ + dest_uri = $('a', destKey.prev()).attr('href'); + } + else + { + /* I dropped on Title */ + dest_uri = $('a', destKey).attr('href'); + } + + if(window.console) + { + window.console.log('Requested action is ', action, ' and act on ', dest_uri); + } + + if(action=="IMGT2CHU" || action=="IMGT2REG") + { + if($(from).hasClass('.baskAdder')) + { + lstbr = [$(from).attr('id').split('_').slice(2,4).join('_')]; + } + else + { + lstbr = p4.Results.Selection.get(); + } + } + else + { + sselcont = $.map(p4.WorkZone.Selection.get(), function(n,i){ + return $('.CHIM_'+n, $('#baskets .content:visible')).attr('id').split('_').slice(1,2).pop(); + }); + lstbr = p4.WorkZone.Selection.get(); + } + + switch(action) + { + case "CHU2CHU" : + if(!is_ctrl_key(event)) + act = "MOV"; + break; + + case "IMGT2REG": + case "CHU2REG" : + case "REG2REG": + var sameSbas = true, + sbas_reg = destKey.attr('sbas'); + + for (var i=0; i0) + refreshBaskets(data.pop()); + } + }); + } + + $(document).ready(function(){ + activeBaskets(); + + p4.WorkZone = { + 'Selection':new Selectable({selector : '.CHIM', container:$('#baskets')}), + 'refresh':refreshBaskets, + 'reloadCurrent':function(){ + var sstt = $('#baskets .content:visible'); + if(sstt.length === 0) + return; + getContent(sstt.prev()); + } + }; + }); + + return; +}(p4)) From 7aa84488be72bbfe6a3f3fe9f4348416e2f1b971 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 10:47:47 +0100 Subject: [PATCH 13/63] Refactor basket_adapter --- templates/web/lightbox/IE6/agreement_box.twig | 34 +-- .../web/lightbox/IE6/basket_options.twig | 2 +- templates/web/lightbox/IE6/index.twig | 218 +++++++++--------- templates/web/lightbox/IE6/sc_container.twig | 20 +- .../web/lightbox/IE6/sc_options_box.twig | 12 +- templates/web/lightbox/IE6/validate.twig | 48 ++-- templates/web/lightbox/agreement_box.twig | 23 +- .../web/lightbox/basket_content_report.twig | 22 +- templates/web/lightbox/basket_options.twig | 2 +- templates/web/lightbox/feed.twig | 14 +- templates/web/lightbox/index.twig | 218 +++++++++--------- templates/web/lightbox/sc_note.twig | 54 +++-- templates/web/lightbox/sc_options_box.twig | 12 +- templates/web/lightbox/selector_box.twig | 6 +- templates/web/lightbox/validate.twig | 58 +++-- 15 files changed, 371 insertions(+), 372 deletions(-) diff --git a/templates/web/lightbox/IE6/agreement_box.twig b/templates/web/lightbox/IE6/agreement_box.twig index 9c2db96dfd..69f33af335 100644 --- a/templates/web/lightbox/IE6/agreement_box.twig +++ b/templates/web/lightbox/IE6/agreement_box.twig @@ -1,41 +1,49 @@ -{% if basket_element and basket_element.is_validation_item() %} +{% if basket_element and basket_element.getBasket().getValidation() %}
- +
{% trans 'VALIDATION' %}{% trans 'lightbox::recaptitulatif' %} + + {% trans 'lightbox::recaptitulatif' %} + +
- {% if basket.is_valid() %} -
{{basket.get_validation_infos}}
+ {% if basket.getValidation() %} +
+ {{ basket.getValidation().getValidationString(user) }} +
    - {% for choice in basket_element.get_choices() %} - {% if choice.agreement == 1 %} + {% for validation_data in basket_element.getValidationData() %} + {% if validation_data.getAgreement() == true %} {% set classuser = 'agree' %} - {% elseif choice.agreement == -1 %} - {% set classuser = 'disagree' %} - {% else %} + {% elseif validation_data.getAgreement() == false %} {% set classuser = '' %} + {% else %} + {% set classuser = 'disagree' %} {% endif %} -
  • {{choice.usr_name}}
  • +
  • + {{ validation_data.getParticipant().getUser().get_display_name }} +
  • {% endfor %}
{% endif %} - {% if basket_element and basket_element.is_validation_item() %} + {% if basket_element and basket_element.getBasket().getValidation() %}
diff --git a/templates/web/lightbox/IE6/basket_options.twig b/templates/web/lightbox/IE6/basket_options.twig index ef3212b290..543147f8da 100644 --- a/templates/web/lightbox/IE6/basket_options.twig +++ b/templates/web/lightbox/IE6/basket_options.twig @@ -1,4 +1,4 @@ -{% if basket.is_valid() %} +{% if basket.getValidation() %} - {% for key,baskets in baskets_collection.get_baskets() %} - {% if key == 'baskets' %} - {% for item in baskets %} - {% if item.is_valid() %} - {% set basket_length = item.get_elements()|length%} - - - - {% endif %} - {% endfor %} - {% endif %} + {% for basket in baskets_collection.get_baskets() %} + {% if basket.getValidation() %} + {% set basket_length = basket.getElements().count() %} + + + + {% endif %} {% endfor %} - {% for key,baskets in baskets_collection.get_baskets() %} - {% if key == 'baskets' or key == 'recept' %} - {% for item in baskets %} - {% if item.is_valid() == false %} - {% set basket_length = item.get_elements()|length%} - - - - {% endif %} - {% endfor %} - {% endif %} + {% for basket in baskets_collection %} + {% if basket.getValidation() is null %} + {% set basket_length = basket.getElements().count() %} + + + + {% endif %} {% endfor %}
-
+
{% trans 'validation:: OUI' %}
-
+
{% trans 'validation:: NON' %}
-
- - - - - - - - -
- {% if basket_length > 0%} - {{thumbnail.format(item.get_first_element.get_record().get_thumbnail, 170, 170, '', session, true)}} - {% endif %} - - -
- - - - - - - - - - - -
-

- {{item.get_name()}} -

- {% if item.is_validation_finished %} - {% trans '(validation) session terminee' %} - {% elseif item.is_confirmed %} - {% trans '(validation) envoyee' %} - {% else %} - {% trans '(validation) a envoyer' %} - {% endif %} -
- {% set basket_length = item.get_elements()|length%} - ({% trans %}{{basket_length}} documents{% endtrans %}) -
-
{{item.get_description()}}
-
{{item.get_validation_infos}}
-
-
-
- -
-
+
+ + + + + + + + +
+ {% if basket_length > 0%} + {{thumbnail.format(basket.getELements().first().getRecord().get_thumbnail, 170, 170, '', session, true)}} + {% endif %} + + +
+ + + + + + + + + + + +
+

+ {{basket.getName()}} +

+ {% if basket.getValidation().isFinished() %} + {% trans '(validation) session terminee' %} + {% elseif basket.getValidation().getParticipant(user).getIsConfirmed() %} + {% trans '(validation) envoyee' %} + {% else %} + {% trans '(validation) a envoyer' %} + {% endif %} +
+ ({% trans %}{{basket_length}} documents{% endtrans %}) +
+
{{ basket.getDescription() }}
+
{{ basket.getValidation.getValidationString(user) }}
+
+
+
+ +
+
@@ -100,59 +95,54 @@ {% trans 'Voici vos paniers' %}
-
- - - - - - - - -
- {% if basket_length > 0%} - {{thumbnail.format(item.get_first_element.get_record().get_thumbnail, 170, 170, '', session, true)}} - {% endif %} - - -
- - - - - - - - - - - -
-

- {{item.get_name()}} -

-
- {% set basket_length = item.get_elements()|length%} - ({% trans %}{{basket_length}} documents{% endtrans %}) -
-
{{item.get_description()}}
-
-
-
- -
-
+
+ + + + + + + + +
+ {% if basket_length > 0%} + {{thumbnail.format(basket.getElements().first().getRecord().get_thumbnail, 170, 170, '', session, true)}} + {% endif %} + + +
+ + + + + + + + + + + +
+

+ {{basket.getName()}} +

+
+ ({% trans %}{{basket_length}} documents{% endtrans %}) +
+
{{basket.getDescription()}}
+
+
+
+ +
+
diff --git a/templates/web/lightbox/IE6/sc_container.twig b/templates/web/lightbox/IE6/sc_container.twig index 05e791c83e..fba6725f15 100644 --- a/templates/web/lightbox/IE6/sc_container.twig +++ b/templates/web/lightbox/IE6/sc_container.twig @@ -1,24 +1,24 @@ {% block basket %}
- {% for element in basket.get_elements() %} + {% for element in basket.getElements() %}
- - diff --git a/templates/web/lightbox/IE6/sc_options_box.twig b/templates/web/lightbox/IE6/sc_options_box.twig index 50023759d5..ff4197a9de 100644 --- a/templates/web/lightbox/IE6/sc_options_box.twig +++ b/templates/web/lightbox/IE6/sc_options_box.twig @@ -22,13 +22,19 @@
- +
| - {% if basket_element.is_validation_item() %} + {% if basket_element.getBasket().getValidation() %} {% endif %} {% endif %} diff --git a/templates/web/lightbox/IE6/validate.twig b/templates/web/lightbox/IE6/validate.twig index c929ca9dd7..f12637827b 100644 --- a/templates/web/lightbox/IE6/validate.twig +++ b/templates/web/lightbox/IE6/validate.twig @@ -16,7 +16,7 @@ {% endblock %} {% block content %} - {% set basket_element = basket.get_first_element%} + {% set basket_element = basket.getElements().first() %}
@@ -27,11 +27,11 @@ -
{% if basket_element %}{{basket_element.get_order()}}{% endif %}
+
{% if basket_element %}{{basket_element.getOrd()}}{% endif %}
-
- {% if basket_element %}{{basket_element.get_record().get_title}}{% endif %} +
+ {% if basket_element %}{{basket_element.getRecord().get_title}}{% endif %}
@@ -44,7 +44,7 @@
{% if basket_element %} - {% set bask_prev = basket_element.get_record().get_preview() %} + {% set bask_prev = basket_element.getRecord().get_preview() %} {{thumbnail.format(bask_prev,bask_prev.get_width(),bask_prev.get_height(),'',session, false)}} {% endif %} {% include 'lightbox/selector_box.twig' %} @@ -60,8 +60,8 @@
-
- {% if basket_element %}{{basket_element.get_record().get_title}}{% endif %} +
+ {% if basket_element %}{{basket_element.getRecord().get_title}}{% endif %}
@@ -82,7 +82,7 @@ {% trans 'notice'%} - {% if basket.is_valid() %} + {% if basket.getValidation() %} {% trans 'Validation'%} @@ -92,16 +92,16 @@
-
+
{% if basket_element %} - {{caption.format_caption(basket_element.get_record())}} + {{caption.format_caption(basket_element.getRecord())}} {% endif %}
- {% if basket.is_valid() %} + {% if basket.getValidation() %}
{% include 'lightbox/IE6/agreement_box.twig' %}
@@ -127,27 +127,19 @@ diff --git a/templates/web/lightbox/agreement_box.twig b/templates/web/lightbox/agreement_box.twig index cb0cdd6a05..b5f7c72ab6 100644 --- a/templates/web/lightbox/agreement_box.twig +++ b/templates/web/lightbox/agreement_box.twig @@ -8,32 +8,33 @@ - {% if basket.is_valid() %} -
{{basket.get_validation_infos}}
+ {% if basket.getValidation() %} +
{{ basket.getValidation().getValidationString(user) }}
    - {% for choice in basket_element.get_choices() %} - {% if choice.agreement == 1 %} + {% for choice in basket_element.getValidationDatas() %} + {% if choice.getAgreement() == true %} {% set classuser = 'agree' %} - {% elseif choice.agreement == -1 %} - {% set classuser = 'disagree' %} - {% else %} + {% elseif choice.getAgreement() == null %} {% set classuser = '' %} + {% else %} + {% set classuser = 'disagree' %} {% endif %} -
  • {{choice.usr_name}}
  • + {% set participant = choice.getParticipant().getUser() %} +
  • {{participant.get_display_name()}}
  • {% endfor %}
{% endif %}
-{% if basket_element and basket_element.is_validation_item() %} +{% if basket_element and basket_element.getBasket().getValidation() %}
-
+
{% trans 'validation:: OUI' %}
-
+
{% trans 'validation:: NON' %}
diff --git a/templates/web/lightbox/basket_content_report.twig b/templates/web/lightbox/basket_content_report.twig index 59f9d28079..9acbfb4af1 100644 --- a/templates/web/lightbox/basket_content_report.twig +++ b/templates/web/lightbox/basket_content_report.twig @@ -2,17 +2,17 @@ {% import 'common/thumbnail.html' as thumbnail %}
- {% for basket_element in basket.get_elements() %} - {% set record = basket_element.get_record() %} - + {% for basket_element in basket.getElements() %} + {% set record = basket_element.getRecord() %} +
- {% for key,baskets in baskets_collection.get_baskets() %} - {% if key == 'baskets' %} - {% for item in baskets %} - {% if item.is_valid() %} - {% set basket_length = item.get_elements()|length%} - - - - {% endif %} - {% endfor %} - {% endif %} + {% for basket in baskets_collection %} + {% if basket.getValidation() %} + {% set basket_length = basket.getElements().count() %} + + + + {% endif %} {% endfor %} - {% for key,baskets in baskets_collection.get_baskets() %} - {% if key == 'baskets' or key == 'recept' %} - {% for item in baskets %} - {% if item.is_valid() == false %} - {% set basket_length = item.get_elements()|length%} - - - - {% endif %} - {% endfor %} - {% endif %} + {% for basket in baskets_collection %} + {% if basket.getValidation is null %} + {% set basket_length = basket.getElements().count() %} + + + + {% endif %} {% endfor %}
-
- {{basket_element.get_order()}} + {{basket_element.getOrd()}}
{{thumbnail.format(record.get_thumbnail(),165, 125, '', session, true)}}
@@ -20,22 +20,22 @@
- {% for choice in basket_element.get_choices()%} + {% for validationDatas in basket_element.getValidationDatas()%}
- {% if choice.agreement == 1 %} + {% if validationDatas.getAgreement() == true %} {% set imguser = '' %} {% set styleuser = '' %} - {% elseif choice.agreement == -1 %} + {% elseif validationDatas.getAgreement() == false %} {% set imguser = '' %} {% set styleuser = '' %} {% else %} {% set imguser = '' %} {% set styleuser = 'margin-left:18px;' %} {% endif %} - {{imguser|raw}} {{choice.usr_name}} - {% if choice.note != '' %} - : {{choice.note|nl2br}} + {{imguser|raw}} {{validationDatas.getParticipant().getUser().get_display_name()}} + {% if validationDatas.getNote() != '' %} + : {{validationDatas.getNote()|nl2br}} {% endif %}
diff --git a/templates/web/lightbox/basket_options.twig b/templates/web/lightbox/basket_options.twig index 34b8492981..2409f03bf0 100644 --- a/templates/web/lightbox/basket_options.twig +++ b/templates/web/lightbox/basket_options.twig @@ -1,4 +1,4 @@ -{% if basket.is_valid() %} +{% if basket.getValidation() %}
-
{% if first_item %}{{first_item.get_ord()}}{% endif %}
+
{% if first_item %}{{first_item.getOrd()}}{% endif %}
-
- {% if first_item %}{{first_item.get_record().get_title|raw}}{% endif %} +
+ {% if first_item %}{{first_item.getRecord().get_title|raw}}{% endif %}
@@ -45,7 +45,7 @@
{% if first_item %} - {% set bask_prev = first_item.get_record().get_preview() %} + {% set bask_prev = first_item.getRecord().get_preview() %} {{thumbnail.format(bask_prev,bask_prev.get_width(),bask_prev.get_height(),'',session, false)}} {% endif %} {% include 'lightbox/selector_box.twig' %} @@ -61,8 +61,8 @@
-
- {% if first_item %}{{first_item.get_record().get_title}}{% endif %} +
+ {% if first_item %}{{first_item.getRecord().get_title}}{% endif %}
@@ -83,7 +83,7 @@
{% if first_item %} - {{caption.format_caption(first_item.get_record())}} + {{caption.format_caption(first_item.getRecord())}} {% endif %}
diff --git a/templates/web/lightbox/index.twig b/templates/web/lightbox/index.twig index 03b28347c4..4262491a3c 100644 --- a/templates/web/lightbox/index.twig +++ b/templates/web/lightbox/index.twig @@ -31,67 +31,62 @@
-
- - - - - - - - -
- {% if basket_length > 0%} - {{thumbnail.format(item.get_first_element.get_record().get_thumbnail, 170, 170, '', session, true)}} - {% endif %} - - -
- - - - - - - - - - - -
-

- {{item.get_name()|raw}} -

- {% if item.is_validation_finished %} - {% trans '(validation) session terminee' %} - {% elseif item.is_confirmed %} - {% trans '(validation) envoyee' %} - {% else %} - {% trans '(validation) a envoyer' %} - {% endif %} -
- {% set basket_length = item.get_elements()|length%} - ({% trans %}{{basket_length}} documents{% endtrans %}) -
-
{{item.get_description()}}
-
{{item.get_validation_infos}}
-
-
-
- -
-
+
+ + + + + + + + +
+ {% if basket_length > 0%} + {{thumbnail.format(basket.getElements().first().get_record().get_thumbnail, 170, 170, '', session, true)}} + {% endif %} + + +
+ + + + + + + + + + + +
+

+ {{basket.getName()|raw}} +

+ {% if basket.getValidation().isFinished() %} + {% trans '(validation) session terminee' %} + {% elseif basket.getValidation().getParticipant(user).getIsConfirmed() %} + {% trans '(validation) envoyee' %} + {% else %} + {% trans '(validation) a envoyer' %} + {% endif %} +
+ ({% trans %}{{basket_length}} documents{% endtrans %}) +
+
{{ basket.getDescription() }}
+
{{ basket.getValidation().getValidationString(user) }}
+
+
+
+ +
+
@@ -101,59 +96,54 @@ {% trans 'Voici vos paniers' %}
-
- - - - - - - - -
- {% if basket_length > 0%} - {{thumbnail.format(item.get_first_element.get_record().get_thumbnail, 170, 170, '', session, true)}} - {% endif %} - - -
- - - - - - - - - - - -
-

- {{item.get_name()|raw}} -

-
- {% set basket_length = item.get_elements()|length%} - ({% trans %}{{basket_length}} documents{% endtrans %}) -
-
{{item.get_description()}}
-
-
-
- -
-
+
+ + + + + + + + +
+ {% if basket_length > 0%} + {{thumbnail.format(basket.getElements().first().get_record().get_thumbnail, 170, 170, '', session, true)}} + {% endif %} + + +
+ + + + + + + + + + + +
+

+ {{ basket.getName()|raw}} +

+
+ ({% trans %}{{basket_length}} documents{% endtrans %}) +
+
{{ basket.getDescription() }}
+
+
+
+ +
+
diff --git a/templates/web/lightbox/sc_note.twig b/templates/web/lightbox/sc_note.twig index 6d0a83bbf5..5422735c84 100644 --- a/templates/web/lightbox/sc_note.twig +++ b/templates/web/lightbox/sc_note.twig @@ -1,25 +1,33 @@ -{% if basket_element and basket_element.is_validation_item() %} -
-
-
-
-

{% trans 'validation:: votre note' %}

-
- {% for user, datas in basket_element.get_choices() %} - {% if datas.note != '' %} -
- {{datas.usr_name}} : {{datas.note|nl2br}} -
- {% endif %} - {% endfor %} - -
- -
- - -
-
-
+{% if basket_element and basket_element?getBasket().getValidation() %} +
+
+
+
+

{% trans 'validation:: votre note' %}

+
+
+ {% for validationDatas in basket_element.getValidationDatas() %} + {% if validationDatas.getNote() != '' %} +
+ + {{validationDatas.getParticipant().getUser().get_display_name()}} + : {{ validationDatas.getNote()|nl2br }} +
+ {% endif %} + {% endfor %} + +
+ +
+ + +
+
+
+
{% endif %} diff --git a/templates/web/lightbox/sc_options_box.twig b/templates/web/lightbox/sc_options_box.twig index d38f60c567..b5a31dbe45 100644 --- a/templates/web/lightbox/sc_options_box.twig +++ b/templates/web/lightbox/sc_options_box.twig @@ -22,13 +22,19 @@
- +
| - {% if basket_element.is_validation_item() %} + {% if basket_element.getBasket().getValidation() %} {% endif %} {% endif %} diff --git a/templates/web/lightbox/selector_box.twig b/templates/web/lightbox/selector_box.twig index 98237fd343..4b73b747ee 100644 --- a/templates/web/lightbox/selector_box.twig +++ b/templates/web/lightbox/selector_box.twig @@ -1,8 +1,8 @@ -{% if basket_element and basket_element.is_validation_item() %} +{% if basket_element and basket_element.getBasket().getValidation() %} {% endif %} diff --git a/templates/web/lightbox/validate.twig b/templates/web/lightbox/validate.twig index 897585b2c1..e1afc796d9 100644 --- a/templates/web/lightbox/validate.twig +++ b/templates/web/lightbox/validate.twig @@ -18,7 +18,7 @@ {% block content %} - {% set basket_element = basket.get_first_element%} + {% set basket_element = basket.getElements().first() %}
@@ -29,11 +29,17 @@ -
{% if basket_element %}{{basket_element.get_order()}}{% endif %}
+
+ {% if basket_element %} + {{basket_element.getOrd()}} + {% endif %} +
-
- {% if basket_element %}{{basket_element.get_record().get_title|raw}}{% endif %} +
+ {% if basket_element %} + {{basket_element.getRecord().get_title}} + {% endif %}
@@ -46,7 +52,7 @@
{% if basket_element %} - {% set bask_prev = basket_element.get_record().get_preview() %} + {% set bask_prev = basket_element.getRecord().get_preview() %} {{thumbnail.format(bask_prev,bask_prev.get_width(),bask_prev.get_height(),'',session, false)}} {% endif %} {% include 'lightbox/selector_box.twig' %} @@ -62,8 +68,8 @@
-
- {% if basket_element %}{{basket_element.get_record().get_title}}{% endif %} +
+ {% if basket_element %}{{basket_element.getRecord().get_title}}{% endif %}
@@ -84,16 +90,16 @@ {% endif %} {% trans 'notice'%}
-
+
{% if basket_element %} - {{caption.format_caption(basket_element.get_record())}} + {{caption.format_caption(basket_element.getRecord())}} {% endif %}
- {% if basket.is_valid() %} + {% if basket.getValidation() %}
{% include 'lightbox/agreement_box.twig' %} @@ -121,27 +127,19 @@ {% endif %} @@ -168,13 +166,13 @@
- {% if basket.is_valid() %} + {% if basket.getValidation() %} {% endif %} {% endblock %} From d42201986a43bb8386229e02ddb5f0306ca5e4f3 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 10:47:56 +0100 Subject: [PATCH 14/63] Refactor basket_adapter --- templates/mobile/lightbox/basket_element.twig | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/templates/mobile/lightbox/basket_element.twig b/templates/mobile/lightbox/basket_element.twig index 9a870f8b6e..a982e7b254 100644 --- a/templates/mobile/lightbox/basket_element.twig +++ b/templates/mobile/lightbox/basket_element.twig @@ -11,28 +11,30 @@ {% endblock %} {% block content %} - {% set record = basket_element.get_record() %} + {% set record = basket_element.getRecord() %}
- Back -

{{basket_element.get_order()}} - {{record.get_title()}}

+ Back +

{{basket_element.getOrd()}} - {{record.get_title()}}

Home
{{ thumbnail.format100percent(record.get_preview(),'',session, record.get_thumbnail()) }} - {% if basket_element.is_validation_item() %} + {% if basket_element.getBasket().getValidation() %}
- - + + - - + +
-
    +
      {% include 'lightbox/sc_note.twig' %}
From d10aa10424ecb181fba070cc46288ca447500ddd Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 10:48:44 +0100 Subject: [PATCH 15/63] Refactor basket_adapter --- templates/web/prod/Baskets/Create.html.twig | 4 +- templates/web/prod/Baskets/Update.html.twig | 2 +- templates/web/prod/Story/Create.html.twig | 4 +- templates/web/prod/WorkZone/Basket.html.twig | 72 +++++ templates/web/prod/WorkZone/Element.html.twig | 43 --- templates/web/prod/WorkZone/Macros.twig | 270 ++++++++++++++++++ templates/web/prod/WorkZone/Story.html.twig | 4 +- .../web/prod/WorkZone/WorkZone.html.twig | 2 + templates/web/prod/index.html | 12 +- templates/web/prod/preview/appears_in.html | 6 +- 10 files changed, 357 insertions(+), 62 deletions(-) create mode 100644 templates/web/prod/WorkZone/Basket.html.twig delete mode 100644 templates/web/prod/WorkZone/Element.html.twig create mode 100644 templates/web/prod/WorkZone/Macros.twig create mode 100644 templates/web/prod/WorkZone/WorkZone.html.twig diff --git a/templates/web/prod/Baskets/Create.html.twig b/templates/web/prod/Baskets/Create.html.twig index 0a72f908a4..938d687997 100644 --- a/templates/web/prod/Baskets/Create.html.twig +++ b/templates/web/prod/Baskets/Create.html.twig @@ -13,7 +13,7 @@ - Date: Mon, 26 Dec 2011 12:09:34 +0100 Subject: [PATCH 19/63] Add Prod JS --- www/prod/jquery.Search.js | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 www/prod/jquery.Search.js diff --git a/www/prod/jquery.Search.js b/www/prod/jquery.Search.js new file mode 100644 index 0000000000..3089378655 --- /dev/null +++ b/www/prod/jquery.Search.js @@ -0,0 +1,6 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + + From d90998ac121505d111a43f4dde6fdf8b1f5f9e20 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 12:09:58 +0100 Subject: [PATCH 20/63] Menage --- .../Phrasea/Helper/RecordsAbstract.php | 328 ------------------ www/prod/jquery.dialogs.js | 37 -- www/prod/newtemporary.php | 262 -------------- 3 files changed, 627 deletions(-) delete mode 100644 lib/Alchemy/Phrasea/Helper/RecordsAbstract.php delete mode 100644 www/prod/jquery.dialogs.js delete mode 100644 www/prod/newtemporary.php diff --git a/lib/Alchemy/Phrasea/Helper/RecordsAbstract.php b/lib/Alchemy/Phrasea/Helper/RecordsAbstract.php deleted file mode 100644 index 6d8d9a9976..0000000000 --- a/lib/Alchemy/Phrasea/Helper/RecordsAbstract.php +++ /dev/null @@ -1,328 +0,0 @@ - - */ - protected $request; - protected $flatten_groupings = false; - - /** - * - * @var boolean - */ - protected $is_basket = false; - - /** - * - * @var basket_adapter - */ - protected $original_basket; - - - /** - * - * @return action_move - */ - public function __construct(Request $request) - { - $this->request = $request; - $this->selection = new \set_selection(); - $appbox = \appbox::get_instance(); - $usr_id = $appbox->get_session()->get_usr_id(); - - if (trim($request->get('ssel')) !== '') - { - $basket = \basket_adapter::getInstance($appbox, $request->get('ssel'), $usr_id); - - if ($basket->is_grouping() && $this->flatten_groupings === true) - { - foreach ($basket->get_elements() as $basket_element) - { - /* @var $basket_element basket_element_adapter */ - $this->selection->add_element($basket_element->get_record()); - } - } - elseif($basket->is_grouping()) - { - $grouping = new record_adapter($basket->get_sbas_id(), $basket->get_record_id()); - $this->selection->add_element($grouping); - } - else - { - $this->selection->load_basket($basket); - $this->is_basket = true; - } - $this->original_basket = $basket; - } - else - { - $this->selection->load_list(explode(";", $request->get('lst')), $this->flatten_groupings); - } - $this->elements_received = $this->selection->get_count(); - - $this->single_grouping = ($this->get_count_actionable() == 1 && - $this->get_count_actionable_groupings() == 1); - - $this->examinate_selection(); - - return $this; - } - - /** - * Tells if the original selection was a basket - * - * @return boolean - */ - public function is_basket() - { - return $this->is_basket; - } - - /** - * If the original selection was a basket, returns the basket object - * - * @return basket_adapter - */ - public function get_original_basket() - { - return $this->original_basket; - } - - protected function examinate_selection() - { - $this->selection->grep_authorized($this->required_rights, $this->required_sbas_rights); - - if ($this->works_on_unique_sbas === true) - { - $this->sbas_ids = $this->selection->get_distinct_sbas_ids(); - - $this->is_possible = count($this->sbas_ids) == 1; - - $this->has_many_sbas = count($this->sbas_ids) > 1; - - $this->sbas_id = $this->is_possible ? array_pop($this->sbas_ids) : false; - } - - return $this; - } - - /** - * Is action applies on single grouping - * - * @return - */ - public function is_single_grouping() - { - return $this->single_grouping; - } - - /** - * When action on a single grouping, returns the image of himself - * - * @return record_adapter - */ - public function get_grouping_head() - { - if (!$this->is_single_grouping()) - throw new Exception('Cannot use ' . __METHOD__ . ' here'); - foreach ($this->get_elements() as $record) - - return $record; - } - - /** - * Get elements for the action - * - * @return Array - */ - public function get_elements() - { - return $this->selection->get_elements(); - } - - /** - * Returns true if elements comes from many sbas - * - * @return boolean - */ - public function has_many_sbas() - { - return $this->has_many_sbas; - } - - /** - * Returns true if the action is possible with the current elements - * for the user - * - * @return boolean - */ - public function is_possible() - { - return $this->is_possible; - } - - /** - * Returns the number of elements on which the action can not be done - * - * @return int - */ - public function get_count_not_actionable() - { - return $this->get_count_element_received() - $this->get_count_actionable(); - } - - /** - * Returns the number of elements on which the action can be done - * - * @return int - */ - public function get_count_actionable() - { - return $this->selection->get_count(); - } - - /** - * Returns the number of groupings on which the action can be done - * - * @return int - */ - public function get_count_actionable_groupings() - { - return $this->selection->get_count_groupings(); - } - - /** - * Return the number of elements receveid when starting action - * - * @return int - */ - public function get_count_element_received() - { - return $this->elements_received; - } - - /** - * Return sbas_ids of the current selection - * - * @return int - */ - public function get_sbas_id() - { - return $this->sbas_id; - } - - /** - * Get the selection as a serialized string base_id"_"record_id - * - * @return string - */ - public function get_serialize_list() - { - if ($this->is_single_grouping()) - - return $this->get_grouping_head()->get_serialize_key(); - else - - return $this->selection->serialize_list(); - } - - public function get_request() - { - return $this->request; - } - - public function set_request($request) - { - $this->request = $request; - } - - public function grep_records(Closure $closure) - { - foreach ($this->selection->get_elements() as $record) - { - if (!$closure($record)) - $this->selection->remove_element($record); - } - - return $this; - } - -} \ No newline at end of file diff --git a/www/prod/jquery.dialogs.js b/www/prod/jquery.dialogs.js deleted file mode 100644 index 71447007c9..0000000000 --- a/www/prod/jquery.dialogs.js +++ /dev/null @@ -1,37 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - - -$(document).ready(function(){ - - $('a.dialog').live('click', function(event){ - - var $this = $(this); - - $.ajax({ - type: "GET", - url: $this.attr('href'), - dataType: 'html', - beforeSend:function(){ - - }, - success: function(data){ - - $('#DIALOG').attr('title', $this.attr('title')) - .empty() - .append(data) - .dialog() - .dialog('open'); - - - - return; - } - }); - - return false; - }); - -}); \ No newline at end of file diff --git a/www/prod/newtemporary.php b/www/prod/newtemporary.php deleted file mode 100644 index de019ca238..0000000000 --- a/www/prod/newtemporary.php +++ /dev/null @@ -1,262 +0,0 @@ -get_session(); -phrasea::headers(); - -$usr_id = $session->get_usr_id(); -$user = User_Adapter::getInstance($usr_id, $appbox); -$request = http_request::getInstance(); - -if ($request->has_post_datas()) -{ - $parm = $request->get_parms('name', 'type', 'desc', 'lst', 'coll'); - - if (trim($parm['name']) != '') - { - if (is_null($parm['type']) || $parm['type'] == "CHU") - { - try - { - $basket = basket_adapter::create($appbox, $parm['name'], $user, $parm['desc']); - - if (trim($parm['lst']) != '') - { - $basket->push_list($parm['lst'], false); - } - echo ""; - exit(); - } - catch (Exception $e) - { - - } - } - elseif ($parm['type'] == "REG") - { - try - { - $basket = basket_adapter::create($appbox, $parm['name'], $user, $parm['desc'], null, $parm['coll']); - if ($parm['lst'] != '') - $basket->push_list($parm['lst'], false); - echo ""; - exit(); - } - catch (Exception $e) - { -?> - - - -ACL(); -$html = array(); - -$list = $ACL->get_granted_base(array('canaddrecord')); -$current_sbas_id = false; -foreach ($list as $base_id=>$collection) -{ - $sbas_id = $collection->get_databox()->get_sbas_id(); - if (!isset($html[$sbas_id])) - $html[$sbas_id] = ''; - $html[$sbas_id] .= ''; -} - -$menu = ''; -foreach ($html as $sbas_id => $sbas) - $menu .= '' . $sbas . ''; - -$parm = $request->get_parms('type'); -?> - - - <?php echo _('action:: nouveau panier') ?> - - - - - - - - - -
-
-
    -
  • -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- : -
-
- value="CHU"> -
- - value="REG"> - -
- - - -
- - - - - - - - - - - - -
 :
 :
-
-
- - -
-
-
-
- - - From ae51a396cdab7684a1e5247af88af618e66e80c3 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 12:11:23 +0100 Subject: [PATCH 21/63] Refactor basket_adapter --- lib/Alchemy/Phrasea/Application/Lightbox.php | 101 ++++++++++++------ .../Phrasea/Controller/Prod/Bridge.php | 4 +- 2 files changed, 70 insertions(+), 35 deletions(-) diff --git a/lib/Alchemy/Phrasea/Application/Lightbox.php b/lib/Alchemy/Phrasea/Application/Lightbox.php index a5fdf61f5d..e17e5639f2 100644 --- a/lib/Alchemy/Phrasea/Application/Lightbox.php +++ b/lib/Alchemy/Phrasea/Application/Lightbox.php @@ -20,7 +20,6 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ - return call_user_func( function() { @@ -29,20 +28,30 @@ return call_user_func( $session = $appbox->get_session(); $app = new Silex\Application(); - + $app['Core'] = bootstrap::getCore(); - $app->get('/', function () use ($session, $appbox) + $app->get('/', function (Silex\Application $app) use ($session, $appbox) { User_Adapter::updateClientInfos((6)); - $basket_collection = new basketCollection($appbox, $session->get_usr_id()); + + $em = $app['Core']->getEntityManager(); + $repository = $em->getRepository('\Entities\Basket'); + + /* @var $repository \Repositories\BasketRepository */ + $basket_collection = $repository->findActiveByUser( + $app['Core']->getAuthenticatedUser() + ); + $twig = new supertwig(); $twig->addFilter(array('nl2br' => 'nl2br')); $browser = Browser::getInstance(); $template = 'lightbox/index.twig'; if (!$browser->isNewGeneration() && !$browser->isMobile()) + { $template = 'lightbox/IE6/index.twig'; + } $output = $twig->render($template, array( 'baskets_collection' => $basket_collection, @@ -57,7 +66,7 @@ return call_user_func( } ); - $app->get('/ajax/NOTE_FORM/{sselcont_id}/', function($sselcont_id) use ($session, $appbox) + $app->get('/ajax/NOTE_FORM/{sselcont_id}/', function(Silex\Application $app, $sselcont_id) use ($session, $appbox) { $browser = Browser::getInstance(); if (!$browser->isMobile()) @@ -73,7 +82,7 @@ return call_user_func( } )->assert('sselcont_id', '\d+'); - $app->get('/ajax/LOAD_BASKET_ELEMENT/{sselcont_id}/', function($sselcont_id) + $app->get('/ajax/LOAD_BASKET_ELEMENT/{sselcont_id}/', function(Silex\Application $app, $sselcont_id) { $twig = new supertwig(); $twig->addFilter(array('nl2br' => 'nl2br', 'formatoctet' => 'p4string::format_octets')); @@ -109,19 +118,30 @@ return call_user_func( $appbox = appbox::get_instance(); $usr_id = $appbox->get_session()->get_usr_id(); - $basket_element = basket_element_adapter::getInstance($sselcont_id); - $basket = basket_adapter::getInstance($appbox, $basket_element->get_ssel_id(), $usr_id); + + $em = $app['Core']->getEntityManager(); + + $repository = $em->getRepository('\Entities\BasketElement'); + /* @var $repository \Repositories\BasketElementRepository */ + + $BasketElement = $repository->findUserElement( + $sselcont_id + , $app['Core']->getAuthenticatedUser() + ); + + + $Basket = $BasketElement->getBasket(); $ret = array(); - $ret['number'] = $basket_element->get_record()->get_number(); - $ret['title'] = $basket_element->get_record()->get_title(); + $ret['number'] = $BasketElement->getRecord()->get_number(); + $ret['title'] = $BasketElement->getRecord()->get_title(); - $ret['preview'] = $twig->render($template_preview, array('record' => $basket_element->get_record(), 'not_wrapped' => true)); - $ret['options_html'] = $twig->render($template_options, array('basket_element' => $basket_element)); - $ret['agreement_html'] = $twig->render($template_agreement, array('basket' => $basket, 'basket_element' => $basket_element)); - $ret['selector_html'] = $twig->render($template_selector, array('basket_element' => $basket_element)); - $ret['note_html'] = $twig->render($template_note, array('basket_element' => $basket_element)); - $ret['caption'] = $twig->render($template_caption, array('view' => 'preview', 'record' => $basket_element->get_record())); + $ret['preview'] = $twig->render($template_preview, array('record' => $BasketElement->getRecord(), 'not_wrapped' => true)); + $ret['options_html'] = $twig->render($template_options, array('basket_element' => $BasketElement)); + $ret['agreement_html'] = $twig->render($template_agreement, array('basket' => $Basket, 'basket_element' => $BasketElement)); + $ret['selector_html'] = $twig->render($template_selector, array('basket_element' => $BasketElement)); + $ret['note_html'] = $twig->render($template_note, array('basket_element' => $BasketElement)); + $ret['caption'] = $twig->render($template_caption, array('view' => 'preview', 'record' => $BasketElement->getRecord())); $output = p4string::jsonencode($ret); return new Response($output, 200, array('Content-Type' => 'application/json')); @@ -132,7 +152,7 @@ return call_user_func( - $app->get('/ajax/LOAD_FEED_ITEM/{entry_id}/{item_id}/', function($entry_id, $item_id) + $app->get('/ajax/LOAD_FEED_ITEM/{entry_id}/{item_id}/', function(Silex\Application $app, $entry_id, $item_id) { $twig = new supertwig(); $twig->addFilter(array('nl2br' => 'nl2br', 'formatoctet' => 'p4string::format_octets')); @@ -184,15 +204,25 @@ return call_user_func( } )->assert('entry_id', '\d+')->assert('item_id', '\d+'); - $app->get('/validate/{ssel_id}/', function ($ssel_id) use ($session, $appbox) + $app->get('/validate/{ssel_id}/', function (Silex\Application $app, $ssel_id) use ($session, $appbox) { User_Adapter::updateClientInfos((6)); $browser = Browser::getInstance(); - $basket_collection = new basketCollection($appbox, $session->get_usr_id()); - $basket = basket_adapter::getInstance($appbox, $ssel_id, $session->get_usr_id()); + $em = $app['Core']->getEntityManager(); + $repository = $em->getRepository('\Entities\Basket'); + + /* @var $repository \Repositories\BasketRepository */ + $basket_collection = $repository->findActiveByUser( + $app['Core']->getAuthenticatedUser() + ); + + $basket = $repository->findUserBasket( + $ssel_id + , $app['Core']->getAuthenticatedUser() + ); if ($basket->is_valid()) { @@ -222,20 +252,25 @@ return call_user_func( } )->assert('ssel_id', '\d+'); - $app->get('/compare/{ssel_id}/', function ($ssel_id) use ($session, $appbox) + $app->get('/compare/{ssel_id}/', function (Silex\Application $app, $ssel_id) use ($session, $appbox) { User_Adapter::updateClientInfos((6)); $browser = Browser::getInstance(); - $basket_collection = new basketCollection($appbox, $session->get_usr_id()); - $basket = basket_adapter::getInstance($appbox, $ssel_id, $session->get_usr_id()); + $em = $app['Core']->getEntityManager(); + $repository = $em->getRepository('\Entities\Basket'); - if ($basket->is_valid()) - { - $basket->get_first_element()->load_users_infos(); - } + /* @var $repository \Repositories\BasketRepository */ + $basket_collection = $repository->findActiveByUser( + $app['Core']->getAuthenticatedUser() + ); + + $basket = $repository->findUserBasket( + $ssel_id + , $app['Core']->getAuthenticatedUser() + ); $twig = new supertwig(); @@ -262,7 +297,7 @@ return call_user_func( - $app->get('/feeds/entry/{entry_id}/', function ($entry_id) use ($session, $appbox) + $app->get('/feeds/entry/{entry_id}/', function (Silex\Application $app, $entry_id) use ($session, $appbox) { User_Adapter::updateClientInfos((6)); @@ -295,7 +330,7 @@ return call_user_func( } )->assert('entry_id', '\d+'); - $app->get('/ajax/LOAD_REPORT/{ssel_id}/', function($ssel_id) use ($appbox, $app) + $app->get('/ajax/LOAD_REPORT/{ssel_id}/', function(Silex\Application $app, $ssel_id) use ($appbox, $app) { $twig = new supertwig(); $twig->addFilter(array('nl2br' => 'nl2br')); @@ -313,7 +348,7 @@ return call_user_func( } )->assert('ssel_id', '\d+'); - $app->post('/ajax/SET_NOTE/{sselcont_id}/', function ($sselcont_id) use ($app) + $app->post('/ajax/SET_NOTE/{sselcont_id}/', function (Silex\Application $app, $sselcont_id) { $output = array('error' => true, 'datas' => _('Erreur lors de l\'enregistrement des donnees')); try @@ -354,7 +389,7 @@ return call_user_func( } )->assert('sselcont_id', '\d+'); - $app->post('/ajax/SET_ELEMENT_AGREEMENT/{sselcont_id}/', function($sselcont_id) use ($app) + $app->post('/ajax/SET_ELEMENT_AGREEMENT/{sselcont_id}/', function(Silex\Application $app, $sselcont_id) { $request = $app['request']; $agreement = (int) $request->get('agreement'); @@ -364,7 +399,7 @@ return call_user_func( 'releasable' => false, 'datas' => _('Erreur lors de la mise a jour des donnes ') ); - + try { $appbox = appbox::get_instance(); @@ -390,7 +425,7 @@ return call_user_func( )->assert('sselcont_id', '\d+'); - $app->post('/ajax/SET_RELEASE/{ssel_id}/', function($ssel_id) use ($session, $appbox) + $app->post('/ajax/SET_RELEASE/{ssel_id}/', function(Silex\Application $app, $ssel_id) use ($session, $appbox) { $basket = basket_adapter::getInstance($appbox, $ssel_id, $appbox->get_session()->get_usr_id()); diff --git a/lib/Alchemy/Phrasea/Controller/Prod/Bridge.php b/lib/Alchemy/Phrasea/Controller/Prod/Bridge.php index 59abf99a55..bf91de5734 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/Bridge.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/Bridge.php @@ -45,9 +45,9 @@ class Bridge implements ControllerProviderInterface }; if (!$account->get_api()->get_connector()->is_configured()) - throw new \Bridge_Exception_ApiConnectorNotConfigured(); + throw new \Bridge_Exception_ApiConnectorNotConfigured("Bridge API Connector is not configured"); if (!$account->get_api()->get_connector()->is_connected()) - throw new \Bridge_Exception_ApiConnectorNotConnected (); + throw new \Bridge_Exception_ApiConnectorNotConnected ("Bridge API Connector is not connected"); return; }); From e3b2e7fdb9c64f519f49da8e82ae38c3dc443d9f Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 12:12:03 +0100 Subject: [PATCH 22/63] Add getUserValidationDatas method --- lib/Doctrine/Entities/BasketElement.php | 417 +++++++++++++----------- 1 file changed, 219 insertions(+), 198 deletions(-) diff --git a/lib/Doctrine/Entities/BasketElement.php b/lib/Doctrine/Entities/BasketElement.php index ed0db18c92..059b7e7adf 100644 --- a/lib/Doctrine/Entities/BasketElement.php +++ b/lib/Doctrine/Entities/BasketElement.php @@ -22,214 +22,235 @@ require_once __DIR__ . '/../../classes/record/adapter.class.php'; */ class BasketElement { - /** - * @var integer $id - */ - private $id; - /** - * @var integer $record_id - */ - private $record_id; + /** + * @var integer $id + */ + private $id; - /** - * @var integer $sbas_id - */ - private $sbas_id; + /** + * @var integer $record_id + */ + private $record_id; - /** - * @var integer $ord - */ - private $ord; + /** + * @var integer $sbas_id + */ + private $sbas_id; - /** - * @var datetime $created - */ - private $created; + /** + * @var integer $ord + */ + private $ord; - /** - * @var datetime $updated - */ - private $updated; + /** + * @var datetime $created + */ + private $created; - /** - * @var Entities\Basket - */ - private $basket; + /** + * @var datetime $updated + */ + private $updated; + /** + * @var Entities\Basket + */ + private $basket; - /** - * Get id - * - * @return integer - */ - public function getId() + /** + * Get id + * + * @return integer + */ + public function getId() + { + return $this->id; + } + + /** + * Set record_id + * + * @param integer $recordId + */ + public function setRecordId($recordId) + { + $this->record_id = $recordId; + } + + /** + * Get record_id + * + * @return integer + */ + public function getRecordId() + { + return $this->record_id; + } + + /** + * Set sbas_id + * + * @param integer $sbasId + */ + public function setSbasId($sbasId) + { + $this->sbas_id = $sbasId; + } + + /** + * Get sbas_id + * + * @return integer + */ + public function getSbasId() + { + return $this->sbas_id; + } + + /** + * Set ord + * + * @param integer $ord + */ + public function setOrd($ord) + { + $this->ord = $ord; + } + + /** + * Get ord + * + * @return integer + */ + public function getOrd() + { + return $this->ord; + } + + /** + * Set created + * + * @param datetime $created + */ + public function setCreated($created) + { + $this->created = $created; + } + + /** + * Get created + * + * @return datetime + */ + public function getCreated() + { + return $this->created; + } + + /** + * Set updated + * + * @param datetime $updated + */ + public function setUpdated($updated) + { + $this->updated = $updated; + } + + /** + * Get updated + * + * @return datetime + */ + public function getUpdated() + { + return $this->updated; + } + + /** + * Set basket + * + * @param Entities\Basket $basket + */ + public function setBasket(\Entities\Basket $basket) + { + $this->basket = $basket; + } + + /** + * Get basket + * + * @return Entities\Basket + */ + public function getBasket() + { + return $this->basket; + } + + public function getRecord() + { + return new \record_adapter($this->getSbasId(), $this->getRecordId(), $this->getOrd()); + } + + public function setRecord(\record_adapter $record) + { + $this->setRecordId($record->get_record_id()); + $this->setSbasId($record->get_sbas_id()); + } + + public function setLastInBasket() + { + $this->setOrd($this->getBasket()->getElements()->count() + 1); + } + + /** + * @var Entities\ValidationData + */ + private $validation_datas; + + public function __construct() + { + $this->validation_datas = new \Doctrine\Common\Collections\ArrayCollection(); + } + + /** + * Add validation_datas + * + * @param Entities\ValidationData $validationDatas + */ + public function addValidationData(\Entities\ValidationData $validationDatas) + { + $this->validation_datas[] = $validationDatas; + } + + /** + * Get validation_datas + * + * @return Doctrine\Common\Collections\Collection + */ + public function getValidationDatas() + { + return $this->validation_datas; + } + + /** + * + * @param \User_Adapter $user + * @return \Entities\ValidationData + */ + public function getUserValidationDatas(\User_Adapter $user) + { + foreach ($this->validation_datas as $validationData) { - return $this->id; + /* @var $validationData \Entities\ValidationData */ + if ($validationData->getParticipant()->getUser()->get_id() == $user->get_id()) + { + return $validationData; + } } - /** - * Set record_id - * - * @param integer $recordId - */ - public function setRecordId($recordId) - { - $this->record_id = $recordId; - } + throw new \Exception('There is no such participant'); + } - /** - * Get record_id - * - * @return integer - */ - public function getRecordId() - { - return $this->record_id; - } - - /** - * Set sbas_id - * - * @param integer $sbasId - */ - public function setSbasId($sbasId) - { - $this->sbas_id = $sbasId; - } - - /** - * Get sbas_id - * - * @return integer - */ - public function getSbasId() - { - return $this->sbas_id; - } - - /** - * Set ord - * - * @param integer $ord - */ - public function setOrd($ord) - { - $this->ord = $ord; - } - - /** - * Get ord - * - * @return integer - */ - public function getOrd() - { - return $this->ord; - } - - /** - * Set created - * - * @param datetime $created - */ - public function setCreated($created) - { - $this->created = $created; - } - - /** - * Get created - * - * @return datetime - */ - public function getCreated() - { - return $this->created; - } - - /** - * Set updated - * - * @param datetime $updated - */ - public function setUpdated($updated) - { - $this->updated = $updated; - } - - /** - * Get updated - * - * @return datetime - */ - public function getUpdated() - { - return $this->updated; - } - - /** - * Set basket - * - * @param Entities\Basket $basket - */ - public function setBasket(\Entities\Basket $basket) - { - $this->basket = $basket; - } - - /** - * Get basket - * - * @return Entities\Basket - */ - public function getBasket() - { - return $this->basket; - } - - public function getRecord() - { - return new \record_adapter($this->getSbasId(), $this->getRecordId(), $this->getOrd()); - } - - public function setRecord(\record_adapter $record) - { - $this->setRecordId($record->get_record_id()); - $this->setSbasId($record->get_sbas_id()); - } - - public function setLastInBasket() - { - $this->setOrd($this->getBasket()->getElements()->count() + 1); - } - /** - * @var Entities\ValidationData - */ - private $validation_datas; - - public function __construct() - { - $this->validation_datas = new \Doctrine\Common\Collections\ArrayCollection(); - } - - /** - * Add validation_datas - * - * @param Entities\ValidationData $validationDatas - */ - public function addValidationData(\Entities\ValidationData $validationDatas) - { - $this->validation_datas[] = $validationDatas; - } - - /** - * Get validation_datas - * - * @return Doctrine\Common\Collections\Collection - */ - public function getValidationDatas() - { - return $this->validation_datas; - } } \ No newline at end of file From 184087a62098583eb5ca74041367223184bb1b8c Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 12:12:21 +0100 Subject: [PATCH 23/63] Add ValidationParticipant::isReleasable method --- .../Entities/ValidationParticipant.php | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/lib/Doctrine/Entities/ValidationParticipant.php b/lib/Doctrine/Entities/ValidationParticipant.php index e3d81aafbf..654cac9a99 100644 --- a/lib/Doctrine/Entities/ValidationParticipant.php +++ b/lib/Doctrine/Entities/ValidationParticipant.php @@ -256,4 +256,24 @@ class ValidationParticipant return $this->can_see_others; } + public function isReleasable() + { + + if ($this->getIsConfirmed()) + { + return false; + } + + foreach ($this->getDatas() as $validation_data) + { + /* @var $validation_data \Entities\ValidationData */ + if ($validation_data->getAgreement() === null) + { + return false; + } + } + + return true; + } + } \ No newline at end of file From d50ac212b182695d8521b8cc9b7b49fe49a963d9 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 12:13:13 +0100 Subject: [PATCH 24/63] Add global filter to twig --- lib/classes/supertwig.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/classes/supertwig.class.php b/lib/classes/supertwig.class.php index 8c3ddc9c5c..9f69c4f461 100644 --- a/lib/classes/supertwig.class.php +++ b/lib/classes/supertwig.class.php @@ -111,6 +111,7 @@ class supertwig $this->addFilter(array('round' => 'round')); $this->addFilter(array('nl2br' => 'nl2br')); $this->addFilter(array('prettyString' => 'phraseadate::getPrettyString')); + $this->addFilter(array('get_collection_logo' => 'collection::getLogo')); } catch (Exception $e) { From e2ada543a05ea47e8a6967629a0d0d615a7b0ba2 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 12:13:32 +0100 Subject: [PATCH 25/63] bootstrap.php now returns PhraseaKernel --- lib/bootstrap.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/bootstrap.php b/lib/bootstrap.php index 08b4717058..36ad600b21 100644 --- a/lib/bootstrap.php +++ b/lib/bootstrap.php @@ -11,9 +11,10 @@ /** * - * @package + * @return \Alchemy\Phrasea\Core * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ require_once dirname(__FILE__) . '/classes/bootstrap.class.php'; -bootstrap::execute(); + +return bootstrap::execute(); From d28ec470880b5d37ed021240b8e12527d3251a29 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 12:14:18 +0100 Subject: [PATCH 26/63] Cleanup : removed unnecessary try catch --- lib/unitTest/Bridge/ApplicationTest.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/unitTest/Bridge/ApplicationTest.php b/lib/unitTest/Bridge/ApplicationTest.php index a71ccbb2e9..3dbd945714 100644 --- a/lib/unitTest/Bridge/ApplicationTest.php +++ b/lib/unitTest/Bridge/ApplicationTest.php @@ -172,11 +172,18 @@ class Bridge_Application extends PhraseanetWebTestCaseAuthenticatedAbstract public function testLogoutDeconnected() { + try + { $url = sprintf('/bridge/adapter/%d/logout/', self::$account->get_id()); $crawler = $this->client->request('GET', $url); $pageContent = $this->client->getResponse()->getContent(); $this->assertContains("/adapter/" . self::$account->get_id() . "/logout/", $pageContent); $this->deconnected($crawler, $pageContent); + } + catch(Exception $e) + { + exit($e); + } } public function testLogout() From 799be19f2ca1accff33339802909e7633108fa70 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 12:14:31 +0100 Subject: [PATCH 27/63] Refactor basket_adapter --- lib/unitTest/record/adapterTest.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/unitTest/record/adapterTest.php b/lib/unitTest/record/adapterTest.php index 3c7460e469..7be9f8593c 100644 --- a/lib/unitTest/record/adapterTest.php +++ b/lib/unitTest/record/adapterTest.php @@ -478,10 +478,9 @@ class record_adapterTest extends PhraseanetPHPUnitAuthenticatedAbstract $baskets = $baskets['baskets']; $basket = array_shift($baskets); - $this->assertInstanceOf('basket_adapter', $basket); + $this->assertInstanceOf('\Entities\Basket', $basket); $basket->push_element(self::$record_1, false, false); - self::$record_1->get_container_baskets(); $found = $sselcont_id = false; @@ -490,13 +489,13 @@ class record_adapterTest extends PhraseanetPHPUnitAuthenticatedAbstract foreach (self::$record_1->get_container_baskets() as $c_basket) { - if ($c_basket->get_ssel_id() == $basket->get_ssel_id()) + if ($c_basket->getId() == $basket->get_ssel_id()) { $found = true; - foreach ($c_basket->get_elements() as $b_el) + foreach ($c_basket->getElements() as $b_el) { - if ($b_el->get_record()->get_record_id() == $record_id && $b_el->get_record()->get_sbas_id() == $sbas_id) - $sselcont_id = $b_el->get_sselcont_id(); + if ($b_el->getRecord()->get_record_id() == $record_id && $b_el->getRecord()->get_sbas_id() == $sbas_id) + $sselcont_id = $b_el->getId(); } } } From f3d0450e5cce04182753fdfbf4fa977facc0bb73 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 12:14:52 +0100 Subject: [PATCH 28/63] Added Block Doc --- lib/unitTest/PhraseanetPHPUnitAbstract.class.inc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/unitTest/PhraseanetPHPUnitAbstract.class.inc b/lib/unitTest/PhraseanetPHPUnitAbstract.class.inc index c93138fac0..a117644d15 100644 --- a/lib/unitTest/PhraseanetPHPUnitAbstract.class.inc +++ b/lib/unitTest/PhraseanetPHPUnitAbstract.class.inc @@ -336,6 +336,10 @@ abstract class PhraseanetPHPUnitAbstract extends WebTestCase protected static $time_start; protected static $generated_subdefs = array(); + /** + * + * @var \Alchemy\Phrasea\Core + */ protected static $core; public static function setUpBeforeClass() From 21adc58dd332177739fae5219f30b7e256750d51 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 12:15:57 +0100 Subject: [PATCH 29/63] Refactor basket_adapter --- www/include/download.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/www/include/download.php b/www/include/download.php index 405a7634d4..59ccfce6b8 100644 --- a/www/include/download.php +++ b/www/include/download.php @@ -15,7 +15,9 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +/* @var $Core \Alchemy\Phrasea\Core */ +$Core = require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; + $appbox = appbox::get_instance(); $session = $appbox->get_session(); @@ -40,8 +42,13 @@ $exportname = "Export_" . date("Y-n-d") . '_' . mt_rand(100, 999); if ($parm["ssttid"] != "") { - $basket = basket_adapter::getInstance($appbox, $parm['ssttid'], $session->get_usr_id()); - $exportname = str_replace(' ', '_', $basket->get_name()) . "_" . date("Y-n-d"); + $em = $Core->getEntityManager(); + $repository = $em->getRepository('\Entities\Basket'); + + /* @var $repository \Repositories\BasketRepository */ + + $Basket = $repository->findUserBasket($Core->getRequest()->get('ssttid'), $Core->getAuthenticatedUser()); + $exportname = str_replace(' ', '_', $basket->getName()) . "_" . date("Y-n-d"); } $list['export_name'] = $exportname . '.zip'; From f61a96996ad6016b00ad9f21ab5e4ea4e40907e1 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 12:16:20 +0100 Subject: [PATCH 30/63] Prod JS --- www/include/js/jquery.Selection.js | 196 ++++++++++++++++++ www/include/js/tests/jquery.Selection.js.html | 58 ++++++ www/include/minify/groupsConfig.php | 5 + 3 files changed, 259 insertions(+) create mode 100644 www/include/js/jquery.Selection.js create mode 100644 www/include/js/tests/jquery.Selection.js.html diff --git a/www/include/js/jquery.Selection.js b/www/include/js/jquery.Selection.js new file mode 100644 index 0000000000..efbf2b15de --- /dev/null +++ b/www/include/js/jquery.Selection.js @@ -0,0 +1,196 @@ +/* + * Selection Object + * + * + */ + +(function( window ) { + + var Selectable = function(options) { + + var defaults = { + allow_multiple : false, + container : window.document, + selector : '*', + callbackSelection : null, + selectStart : null, + selectStop : null + }, + options = (typeof options == 'object') ? options : {}; + + this.options = jQuery.extend(defaults, options); + this.datas = new Array(); + + var $container = jQuery(this.options.container), + $this = this; + + if(jQuery($container).hasClass('selectionnable')) + { + /* this container is already selectionnable */ + + return; + } + + jQuery($container).addClass('selectionnable'); + + jQuery(this.options.selector, $container) + .live('mousedown', function(event){ + + if(typeof $this.options.selectStart === 'function') + { + $this.options.selectStart(jQuery.extend(jQuery.Event('selectStart'), event), $this); + } + + var $that = jQuery(this); + + var k = get_value($that, $this); + + if(is_shift_key(event) && jQuery('.last_selected', $container).filter($this.options.selector).length != 0) + { + var lst = jQuery($this.options.selector, $container); + + var index1 = jQuery.inArray( jQuery('.last_selected', $container).filter($this.options.selector)[0], lst ); + var index2 = jQuery.inArray( $that[0], lst ); + + if(index2= 0; + }, + get : function(){ + + return this.datas; + }, + empty : function(){ + this.datas = new Array(); + + return this; + }, + length : function(){ + + return this.datas.length; + }, + size : function(){ + + return this.datas.length; + }, + serialize : function(separator){ + + separator = separator || ';'; + + return this.datas.join(separator); + }, + selectAll : function(separator){ + var $this = this; + + jQuery(this.optionsthis.options.selector, $container).not('.selected').filter(':visible').each(function(){ + $this.push(get_value(this, $this)); + $(this).addClass('selected'); + }); + + return this; + } + }; + +console.log('SELECTABALE to be declare'); + + window.Selectable = Selectable; +console.log('SELECTABALE declared'); +})(window); \ No newline at end of file diff --git a/www/include/js/tests/jquery.Selection.js.html b/www/include/js/tests/jquery.Selection.js.html new file mode 100644 index 0000000000..28971ba315 --- /dev/null +++ b/www/include/js/tests/jquery.Selection.js.html @@ -0,0 +1,58 @@ + + + + + + + + + + + + +

QUnit example

+

+
+

+
    +
    test markup, will be hidden
    + + diff --git a/www/include/minify/groupsConfig.php b/www/include/minify/groupsConfig.php index 90fcc35247..a241d13375 100644 --- a/www/include/minify/groupsConfig.php +++ b/www/include/minify/groupsConfig.php @@ -79,7 +79,12 @@ $groups = array( , '//login/geonames.js' , '//include/jslibs/jquery.form.2.49.js' , '//include/jslibs/jquery.vertical.buttonset.js' + , '//include/js/jquery.Selection.js' + , '//prod/jquery.Prod.js' + , '//prod/jquery.Results.js' , '//prod/page0.js' + , '//prod/jquery.WorkZone.js' + , '//prod/jquery.Alerts.js' , '//prod/publicator.js' , '//prod/jquery.order.js' , '//include/jslibs/jquery.sprintf.1.0.3.js' From 23457654ea96ed3b62077dc8ba7ac485eb27900e Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 12:16:50 +0100 Subject: [PATCH 31/63] Add qunit --- www/include/vendor/qunit | 1 + 1 file changed, 1 insertion(+) create mode 160000 www/include/vendor/qunit diff --git a/www/include/vendor/qunit b/www/include/vendor/qunit new file mode 160000 index 0000000000..0712230bb2 --- /dev/null +++ b/www/include/vendor/qunit @@ -0,0 +1 @@ +Subproject commit 0712230bb203c262211649b32bd712ec7df5f857 From 193020712f6902b867c58dadb9dc1b9f194ef49c Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 12:16:59 +0100 Subject: [PATCH 32/63] Add qunit --- .gitmodules | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitmodules b/.gitmodules index 4337ee5ac0..3d9c349027 100644 --- a/.gitmodules +++ b/.gitmodules @@ -63,3 +63,6 @@ url = https://github.com/wavded/humane-js.git +[submodule "www/include/vendor/qunit"] + path = www/include/vendor/qunit + url = git://github.com/jquery/qunit.git From cf71abc2856a52e9554e9823105f320e8d1f5299 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 12:19:35 +0100 Subject: [PATCH 33/63] Basket skins --- www/skins/prod/000000/prodcolor.css | 12 ++++++++++++ www/skins/prod/959595/prodcolor.css | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/www/skins/prod/000000/prodcolor.css b/www/skins/prod/000000/prodcolor.css index 144abe0db9..110ee7d87f 100644 --- a/www/skins/prod/000000/prodcolor.css +++ b/www/skins/prod/000000/prodcolor.css @@ -263,6 +263,18 @@ span.ww_winTitle{ padding:0; min-height:120px; } +.ui-accordion-icons .ui-accordion-header a +{ + padding:2px 25px; +} +.ui-state-active .ui-icon +{ + background-image: url("/include/jslibs/jquery-ui-1.8.12/css/dark-hive/images/ui-icons_cccccc_256x240.png"); +} +#baskets .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { + color:#FFFFFF; + font-size:1em; +} .ui-accordion .ui-accordion-content.loading { background-image:url(/skins/icons/loader000.gif); diff --git a/www/skins/prod/959595/prodcolor.css b/www/skins/prod/959595/prodcolor.css index e6a3ca527a..116a2d8816 100644 --- a/www/skins/prod/959595/prodcolor.css +++ b/www/skins/prod/959595/prodcolor.css @@ -266,6 +266,18 @@ span.ww_winTitle{ padding:0; min-height:120px; } +.ui-accordion-icons .ui-accordion-header a +{ + padding:2px 25px; +} +.ui-state-active .ui-icon +{ + background-image: url("/include/jslibs/jquery-ui-1.8.12/css/ui-lightness/images/ui-icons_ffffff_256x240.png"); +} +#baskets .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { + color:#FFFFFF; + font-size:1em; +} .ui-accordion .ui-accordion-content.loading { background-image:url(/skins/icons/loaderd9d9d9.gif); From 4d84bc3f66f7a5532c56ffbce8260c67534e2997 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 12:19:58 +0100 Subject: [PATCH 34/63] Updated unitTests --- lib/unitTest/api/v1/api_v1_adapterTest.php | 33 ++++++++++++++++------ 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/lib/unitTest/api/v1/api_v1_adapterTest.php b/lib/unitTest/api/v1/api_v1_adapterTest.php index 400c84d55f..f457efa3c2 100644 --- a/lib/unitTest/api/v1/api_v1_adapterTest.php +++ b/lib/unitTest/api/v1/api_v1_adapterTest.php @@ -22,7 +22,7 @@ class API_V1_adapterTest extends PhraseanetPHPUnitAuthenticatedAbstract { parent::setUp(); $appbox = appbox::get_instance(); - $this->object = new API_V1_adapter(FALSE, $appbox); + $this->object = new API_V1_adapter(FALSE, $appbox, self::$core); } public function testGet_error_code() @@ -370,10 +370,16 @@ class API_V1_adapterTest extends PhraseanetPHPUnitAuthenticatedAbstract $appbox = appbox::get_instance(); $session = $appbox->get_session(); $usr_id = $session->get_usr_id(); + + $em = self::$core->getEntityManager(); + $repo = $em->getRepository('\Entities\Basket'); + + /* @var $repo \Repositories\BasketRepository */ + $repo->findUserBasket($ssel_id, self::$core->getAuthenticatedUser()); - $basket = basket_adapter::getInstance(appbox::get_instance(), $ssel_id, $usr_id); - $this->assertTrue($basket instanceof basket_adapter); - $basket->delete(); + $this->assertTrue($basket instanceof \Entities\Basket); + $em->remove($Basket); + $em->flush(); } public function testDelete_basket() @@ -381,8 +387,17 @@ class API_V1_adapterTest extends PhraseanetPHPUnitAuthenticatedAbstract $appbox = appbox::get_instance(); $usr_id = $appbox->get_session()->get_usr_id(); $user = User_Adapter::getInstance($usr_id, $appbox); - $basket = basket_adapter::create($appbox, 'test suppression', $user); - $ssel_id = $basket->get_ssel_id(); + + $em = self::$core->getEntityManager(); + + $Basket = new Entities\Basket(); + $Basket->setName('Delete test'); + $Basket->setOwner($user); + + $em->persist($Basket); + $em->flush(); + + $ssel_id = $basket->getId(); $request = new Request(array(), array(), array(), array(), array(), array('HTTP_Accept' => 'application/json')); $result = $this->object->delete_basket($request, $ssel_id); @@ -390,12 +405,14 @@ class API_V1_adapterTest extends PhraseanetPHPUnitAuthenticatedAbstract $this->assertEquals('application/json', $result->get_content_type()); $this->assertTrue(is_object(json_decode($result->format()))); + $repo = $em->getRepository('\Entities\Basket'); + try { - basket_adapter::getInstance($appbox, $ssel_id, $usr_id); + $repo->findUserBasket($ssel_id, $user); $this->fail('An exception should have been raised'); } - catch (Exception_Basket_NotFound $e) + catch (Exception_NotFound $e) { } From ead7c5193df068c062a7dcd4d1d92b97b4d316dd Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 13:02:06 +0100 Subject: [PATCH 35/63] Fix #108: Upgrade to v3.5 does not kill after upgrade --- .../task/period/upgradetov32.class.php | 37 ++++++++++--------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/lib/classes/task/period/upgradetov32.class.php b/lib/classes/task/period/upgradetov32.class.php index f61cd25c65..7d365b2a74 100644 --- a/lib/classes/task/period/upgradetov32.class.php +++ b/lib/classes/task/period/upgradetov32.class.php @@ -67,8 +67,8 @@ class task_period_upgradetov32 extends task_abstract if (!$this->sbas_id) { printf("sbas_id '" . $this->sbas_id . "' invalide\n"); - - return 'stopped'; + $this->return_value = self::RETURNSTATUS_STOPPED; + return; } try @@ -78,6 +78,8 @@ class task_period_upgradetov32 extends task_abstract } catch (Exception $e) { + $this->return_value = self::RETURNSTATUS_STOPPED; + return; } @@ -94,6 +96,7 @@ class task_period_upgradetov32 extends task_abstract catch (Exception $e) { printf("Please verify all your databox meta fields before migrating, It seems somes are wrong\n"); + $this->return_value = self::RETURNSTATUS_STOPPED; return 'stopped'; } @@ -194,7 +197,7 @@ class task_period_upgradetov32 extends task_abstract $sql = 'select record_id, coll_id, xml, BIN(status) as status FROM record - WHERE record_id NOT IN (select distinct record_id from technical_datas) + WHERE migrated="0" AND record_id NOT IN (select distinct record_id from technical_datas) LIMIT 0, 500'; $stmt = $connbas->prepare($sql); @@ -238,7 +241,7 @@ class task_period_upgradetov32 extends task_abstract } catch (Exception $e) { - + } } @@ -280,9 +283,6 @@ class task_period_upgradetov32 extends task_abstract { $record = new record_adapter($this->sbas_id, $row['record_id']); - -// $sbas_id = $this->sbas_id; - $metas = $databox->get_meta_structure(); $metadatas = array(); @@ -367,12 +367,16 @@ class task_period_upgradetov32 extends task_abstract $memory = memory_get_usage() >> 20; if ($n_done >= 5000) - - return task_abstract::RETURNSTATUS_TORESTART; + { + $this->return_value = task_abstract::RETURNSTATUS_TORESTART; + return; + } if ($memory > 100) - - return task_abstract::RETURNSTATUS_TORESTART; - } + { + $this->return_value = task_abstract::RETURNSTATUS_TORESTART; + return; + } + } catch (Exception $e) { @@ -393,8 +397,6 @@ class task_period_upgradetov32 extends task_abstract $conn = connection::getPDOConnection(); - $ret = 'stopped'; - printf("taskid %s ending." . PHP_EOL, $this->get_task_id()); sleep(1); printf("good bye world I was task upgrade to version 3.2" . PHP_EOL); @@ -406,11 +408,12 @@ class task_period_upgradetov32 extends task_abstract $stmt->closeCursor(); $this->setProgress(0, 0); - $ret = 'todelete'; - + + $this->return_value = self::RETURNSTATUS_TODELETE; + flush(); - return $ret; + return; } } From d74f3e203f6796d6dce3310a73e070a0999b575d Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 13:05:52 +0100 Subject: [PATCH 36/63] Fix #107 : add autoload to PHPShortener --- lib/classes/PHPShortener.class.php | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 lib/classes/PHPShortener.class.php diff --git a/lib/classes/PHPShortener.class.php b/lib/classes/PHPShortener.class.php new file mode 100644 index 0000000000..d0d62c8e4d --- /dev/null +++ b/lib/classes/PHPShortener.class.php @@ -0,0 +1,3 @@ + Date: Mon, 26 Dec 2011 13:09:02 +0100 Subject: [PATCH 37/63] Fix 113 : bad file name encoding --- www/skins/admin/fleche_verte.png | Bin 0 -> 437 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 www/skins/admin/fleche_verte.png diff --git a/www/skins/admin/fleche_verte.png b/www/skins/admin/fleche_verte.png new file mode 100644 index 0000000000000000000000000000000000000000..914623748c155dccd16eaf279722e4f18ed2cd8a GIT binary patch literal 437 zcmV;m0ZRUfP)*NRQ5eVZ&;7dtX-teP5{tcrse{-gB3(q0TH3)NF6q+AAc#eR zK_x6TNQ9|rENu-P%@uu4w6S`5%LXyP_!CUyA&|hI1vXH4e z;q(V1DBvbxe~*_L1}c<0ixcc&En%-hUxwC%@fQ}N|0GTmejOQJBn%&M8U2q!Mdj3I z3GoXy6Z%qUC+02-!+PKhqZMZIKkWZ1(vI`^hPRPZ7dpd+VoIpRHL8R5BOfL_6apH{ zhW8XjtY_H8vgb2{{f9CO*nURv3Z_JT{=*y0h0-c Date: Mon, 26 Dec 2011 13:10:08 +0100 Subject: [PATCH 38/63] Fix 113 : bad file name encoding --- www/skins/admin/flèche verte.png | Bin 437 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 www/skins/admin/flèche verte.png diff --git a/www/skins/admin/flèche verte.png b/www/skins/admin/flèche verte.png deleted file mode 100644 index 914623748c155dccd16eaf279722e4f18ed2cd8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 437 zcmV;m0ZRUfP)*NRQ5eVZ&;7dtX-teP5{tcrse{-gB3(q0TH3)NF6q+AAc#eR zK_x6TNQ9|rENu-P%@uu4w6S`5%LXyP_!CUyA&|hI1vXH4e z;q(V1DBvbxe~*_L1}c<0ixcc&En%-hUxwC%@fQ}N|0GTmejOQJBn%&M8U2q!Mdj3I z3GoXy6Z%qUC+02-!+PKhqZMZIKkWZ1(vI`^hPRPZ7dpd+VoIpRHL8R5BOfL_6apH{ zhW8XjtY_H8vgb2{{f9CO*nURv3Z_JT{=*y0h0-c Date: Mon, 26 Dec 2011 13:12:38 +0100 Subject: [PATCH 39/63] Fix 115: udnefined constant GV_captcha_public_key --- www/login/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/login/index.php b/www/login/index.php index e79c6d7902..26b17b9f24 100644 --- a/www/login/index.php +++ b/www/login/index.php @@ -125,7 +125,7 @@ if (!$registry->get('GV_maintenance')
    ' . _('login::captcha: recopier les mots ci dessous') . ' : -
    ' . recaptcha_get_html(GV_captcha_public_key) . '
    '; +
    ' . recaptcha_get_html($registry->get('GV_captcha_public_key')) . '
    '; } $public_feeds = Feed_Collection::load_public_feeds($appbox); From 8c687ec22293280b35e522d2ee14379e204931c7 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 14:12:28 +0100 Subject: [PATCH 40/63] Add header titles for admin user editing --- www/skins/lng/inclin-ar.png | Bin 0 -> 76956 bytes www/skins/lng/inclin-de.png | Bin 0 -> 83243 bytes www/skins/lng/inclin-en.png | Bin 0 -> 76956 bytes www/skins/lng/inclin-fr.png | Bin 0 -> 71642 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 www/skins/lng/inclin-ar.png create mode 100644 www/skins/lng/inclin-de.png create mode 100644 www/skins/lng/inclin-en.png create mode 100644 www/skins/lng/inclin-fr.png diff --git a/www/skins/lng/inclin-ar.png b/www/skins/lng/inclin-ar.png new file mode 100644 index 0000000000000000000000000000000000000000..3a95504d2111a0902bc2e7ed89fc1a1a5877daa1 GIT binary patch literal 76956 zcmZsD2{e>@`2SRrJ=qf~+1Ci!g-UkWjWvl0*|M)?NeCfiH`dS)M)pKWl8k7OeG5&J zBqIEuSNHcj|NlAvbLQS#w=na*&-Zyg+w;a4=xNYWu~VT?C|b=c7Y$LU!w;rQVw-ZpPX>%0nemx2m%!Wes zK0~3-Eu&DJ=YJh1<)RLVaBE&vHTM7fZ70mb$Sia(QKfYx_?sj9O_})KFV-D!Br@=cSPGwVFUussx>?EXoro3EudnE2pRl)^9U&jQYYvO# z1^KMVRSnIyd>~o)EPt-ERZp*E2wceV^O$;h0QGXMPbD!SflfC*%-^4_D}nP6>euhz zGfSm;#KFxYM~)n$i#~v=YTK2UaT|M*Q9aq zSZF9$v){^_ky%XC4m|O6^GCRPfl@@=@H~ob_MpJufZ25w(a>oYX&-!}@`7~hKTFLq&m9p^%Psw&0a zxwA1@m9c93BKWvvy<6vePx|Uq#8Gbc_?g_G@BJ5pKYsie9&zNT^Ne!zt7|lLbO%wt zzmLZ`I*o__Ih=;>j3J=QLc;H+CAkb*Jft8ZGu-X>FDVdl$4NjbYZbrRU?t9 z5vRP)u9IO8f>v5t!#4cFqJ2n2T$5+Xz)k;FoA)0+6kxFjW@l$J8`@G*QvBf!_q_9Y zQ6TQqq@_uLt9PHQl*5F48v^Wh7 z4QXneE+6BYt}f|+zdelW%TwvgUw?H}g(hKEiW+w^=$izGQlPQX?Y6UmV=V#a{)V=3 zJzV@)M6SJ=1v9YRkr0tk~=7?Qy@*$m-ktsQjY4x1FOhZG1nNg<3 zu2)(&OC7--J*oUYzix76hzGA6`0L4+d>;*sBN0T7uA2wZZR;ojw-*caA4=)7#u9QD`s6^QBqo3eQWf& zA_iAXYhvB>?$gXn!Izm!;Y761$G7ud0fepBF^m=LP1Lg~@h8sDyiGcjd0$^IS25!V z&hPtJS=q+wkLg!zoScU}7}3pEV!H27+hcZyuP5G&J?!o6J(Z%be2owY6`)}7y@u1D$$3lH_F?6s7<*?V)s-Oj;*?2a#Xebl`T zXMt(;Td`@`+uf!?tH2S+L_hIe{v4I4ymeod6n!$({M>9_R+f5Dkiy3$sR&|)r(eV4 zN~^~3-@koz)k*Mg^8MSpP9>D8)lOQs4-K`cC1jQ#MWfMY&z{X!cR`NLYeJy6H7~sIWxws54;Y&6h21;~gy%!%k=C5PbqfwaJ`K4tPE|F8= z-kUd#Z9TaY;$XdeunVD{UwF^|A@rb*itv5k&Mz9X};@eKt`gp->~ynFX!#XD&t7W9kka z&SwdI_~U+|p0{b?%wHcK9xhK{t)oKDfam6qYpBoB#HyB`RL@;UYQA>0Ky-7WY> z`;p8jqD>WRnX&Vy{VVdmxA!I$x(zPraI>Gd+gQVCx&1O#9M>bD<4UN}(Zuob@yFTO zugCo+8*}EgIFL*WYcRQ%ba=giu zc9FWh*STLeneu9(yMF^*N1xNy*4Ac567zz8Qp(HA!-0(Y!Xu9-7Q3w94@BEG`|3s$ zo4j!c$LR>4mwjj7r3z=>A$Dv!tbOUtylGqFg9%wAoX%DZU_fdj%l$=}T$pe;@p9oY zjxNn`qHwA<9L&N*<=CX8q){&Pp}<5J>w|C!KjbL*U|Kum_phD%wA%W&+P;ZuLguV2 z*}(&BG~|OrL)Y!?53c(EP2)L@jv{vC66NtW7L-_@+qY|xtNpP!Hgdmwk@resA^Cit zVdF2SypR%2%nlq$!EhqVV1Htfdh*4v1K;7DR=W&|>Bg(D(MXn#=jL)XjJxT^?;%YA znP*7r^YEb0I`2+=KO99sSA3y{sUvcm<^>~Gy33P-JmT4iE9#D`OtbwbB1{)mWcpY) zMb^0t*}J;xq!6}XBoTPN7W@^)*FM<9uj?Y z)+TuB?vb;~%9UllUiO&Q&+*OfteDo2ZC_obg@}jqb}3R}x9sp4>}8)urMS74k`1!?!kP6IbEKIou!!i5J5D)Df)iNw18fd2B&fP@{h&B zMCUKL!cj=2O)e4G2|-qqs|@nX&d1Qyy3~O|L94$8^j)0)%Hv=7Fes3_97DT9$uIQf z*|MO!W<7_OfAfar>hQI%{Y`Ew%(d}jg){%@qsp68oXDV! z7;9Zr}vu(ds!(oL2yEA)BR`Z1H+NX@1F#=wxH z5@xgiEAE?|=r|<;DB;yOzd`_AO()ygpQyd%LU=i}p}ry%?J zQ?*#cZsYqnd^$MXUis@q{n*)I6tZDwI$M-&HqsOOt@hqB>KG(VYo3RNAX|6}@WwNH%11+A-c*qil zhN4GCEE=rD;B}Gv7`#w+t%S&p*N(NPxe~AY`m&HmsMhh!wI4b8dU5ed3AWC-wz9HP zj3-5N*j46-;?aazJDDtM)7NHdYW&VHh==R=W3cN;PwE3K>Ya$RK7I^X05w8HLi^Q zroDZ*YM}g8m$PhkQtZbPyROxtEkafQ+?!m9hI7orpn8g4Adta~ih8&;==_Ilxroe6 zb`Or|d-uqD$8Luc^Fp@-5xn8S!B2@U9k>bYl&IZe*odb`pO=xD8Lqxw<0S(}IVOhE zbZ6N^c52mMD2?>mUIH+9c`j*jYK!g>0e>NyC@c;q5ysRPwx^dcxYrV!rrJVyzW!<+ zD$`))lcd`DjqR(pwuw4?hq8K2&pyOP>D?55(337+h{Nd)5Sjo@4^>*H(BjM(l3A$m zcp99_*5a9OpX;dC*4Bm_JkQt!ElXb_$YoP62a%eAF2tH=sZ=DBG=Ksp(@#W{HT|9XJ4*tEcBA#o87&Df*}}d ze!qV5kjVy)3w#B|D8pc(?eCZW@I?QjbDMSXW3`~hTXr&?Rw~< zRdJQ^%8PBW-z$^0Nmd$1hWsAm>2OCm?s68&r&yc^=W8Ka*nOmpQX4+tk$L@qJ8gXQC`0sx!s2o(?C>4|o31 z5xS`yzX?HVbcz-;ccYcq<6g(tv!1}C8muaL*RG1CUvG@IV!1%r0&3E3>E7zorRsv# zZfJ=Rf`g zi*z#xXZ6-_S*`kWK!2NE6_MCBNRGsCqTPp|sY>F>W7Q4YCXXg|ML@;Fq4!thf)j1h zRR!SX_cx1ASZR-1_NcA?8?_c597jqA;73tz1}g(+0@~Gqk>aMOc)P0v5Ge|vvH(+Zh;`_={y-W1K}nx`hLONIQK$6xSFY4WAe&s;2oCNUaBqe+xpU zjLMUDr!sVe$iL2Cp}?IC-Mj{4;%zvQr*t5rzC!d~kyIC@Wwb#5GC3}hL$2TngFseq z$C7uAUCNgyS9m&dH`Gi7;EdefYHtwbo z5)xu#b;=cM?7YKJIkM`Xjq`J?J+4=JZpH7&!2>)g-QijIC2w}X4efUHaB|^*L5mSf zr-mBdmSwlj%6-z&>aa@&YNrb z?t2H}M|mN?Gej`0R@K&$85hmWScMY`!-S>NS=32Dfi6YKzqX5%OJqY2pgCeLo|Tgm z6kZ4e-KT$alp0lYn=@7-xtoWE{7|-@ld4#enbqVMLN1c>x~-8oivNft$~<+845Z9xV4g zb4r)l{ntW=tU!iN2h_Y<{h5?*6iQ*|kq+O8qJE50yQ9|Pk}*?AC13@<6v5B4nKA_- z%C=l@OSBX@ZN%eQ>zv1Mycp33`gpQ^_%uCz4Ru~$Qf24YKxW{FPj`r@pI;u^rw&0W zz-@>74==iCb(Tj=NK5|l~U3xboRS^6o+a2uoU_m*HfA(C4^k8N0|e&{~w;<5(-&y}r&hR9}7h z@?}tsj*yeH;X~(B%@D4Dwz7H+P34BV3)OGRmr-h`iG1x#-r=*dvK(|53$H?xuCXyN z?k_L~5D9mDl9Lj5E`uh#{S>fZD>1Y77l1B@;9N!yEIFj=YCYjpOp8$B8mSZOXu61Gv8A@ zgML?h=q~E1sf%jL8!sspl|<-cH`x&Y3LG77@A~>W)Y##nBh&KswIfu&TWs{4RY_`n z6u3UF#L`oEayPd{G|sg9@U>FC977sh8K(Nhi`;qZehhv}_CV{**7H=tO|uHZ)^hzM zImk@zzzWV?XH`cq&QuJ4F5&$qB|1;;Ho3I4G>nd)NvF^vtv2FTVywV{`x5&FW0wD(g1x#F1jW(gGNuwVTe4I2|d5|WZY z#&h&aJ@#}PEs!LkCc=u{Zh>~Om z4N%_pJ2|MLk3xq5U5dZhJUIIN7SMyTrnl1`A{HE4#{-^x5=YbFq4oXP-U(*x8dzn#`xn7ehQ6tvqBoo_1v#5BXr_V*YhwtF(8UDkfEh@rwF;;X9B}8L*Yo-;< zaN;tGZ+7#vFhGZI1op3m1{}0`v4Rk|x4Yy2wX77_NZa3^J+eMujWsdWLZ-!x_zwFb z`#l?+TG5|B0gBt-YBxa`S-FDI4G=hBhPv^}C8awOBZct=k-6e&%7;E>9U4K zdK3|#PgRk;ga%+Ua;!e}$*@Y;uHy4sqxXPPTM*bAD2J`Z%qFZHF}Ov5Nw~lnri#KU=8F?me{MGv$lbU2e_<i~JDdE4gE#65h^B+(>SB1k(gC1W?_XVbe3W7u z=61k|YM5<|jEn)eVyz`m#8ts7__DA77wf^0ZJ0F+KJDiNm@@DJ;xp$Z2ePDicWF8! zbJl@7qsy1|_4{g6)W1BO;hK7>OHh%JIM6&!7twwPBNYoAf|wTfbMD0pW%z1Nt4Y0& zO#|QW9y;;^oFx>25C45>sU7SWzbPqjiWw%Xiy;~Hv{enkW0`2TEOJEg!QR@ z&Nt%vJioeNa;47_AN3>9*Vi=l%qu@hyqIaVEvPw#{pKt!C52vIlSi%@n!BAU)lRQ` zN2={pju;|+a&6nQ#5zc39Pvv()Tl<#b-@~zQ6_d)ml2+N@?KQZp!5R4!C#RsvFnx2 z$rT>BAG}-w^;!tIKm;#JT%7|G&IdC-IvVFU8B))KFOe&Q(Xr0Y(xKt}=QLT|h-=#M zRwHSl14hM%&jM8~$&OzLNKLjL>9-Yl zdzBo$bXr{PhzQi+Pn{hBN*VTe*YsQ_3bKbi^TP*qx_*P21veyHuXKjYnnc(FPs@0a z>*8>1lpZHYa1s|T{Ae1!M|aB~^d^gyLvqfDvRnCymlLhc%9-dZ%i(HWGW)udc(L4G zhK&Z4THapPz0JfuS#cS`=eym~9wNLc-LHjS#aRbocZa+#b>&cZ+CGYmvrHNL4nBo+ z&U?#cLgoyks4B_s?Av|QO9Wq%hV2x>MGc*xiZWMCKda1p#$4zZj6p;N?pt^@H^&3W z=)vW}nMQ3IT%F@`~l^+m%JYn$xzB6#UZKB2^!{XBk5 zjfA+2rj_bH&=|X$GFch*k$nrGg<2mZ2IO|Z;MCzup{sO1!l~e^GeG#fvT+U*0(z&e zItlSg=+Gd_SY9pmv9&$9FTpr*;m>9D0)c=xW=CBOU{#78G-@^QFz4oqX0%+c>5~8k z^s2f@+Dm2V)a3hsoE-C*-sU!kS z>}2Tj{Nb-yvyae=^Xq|ZyScP(vk@B`5_mK%Vu;B=GvuUzpfST+Fdei*mI&ykC(b(lH8Db{INlaA z%O{-KpqrBS+b3ZqL!Ng#*iSXHT{JKnT&Oj`9!8O;q;@c_N>_PDZ8)c%wHf5bD~Ig{ zbK$v;AMYmvfb|>ui2<)1`d4=LP%&D!@-hG*m#S7%{KrhHhAa4`1#fwa-P!d(L;{@F zJ4J6-Ei`|^v?BHRPr+*kKpPI&_dqfm7ozgl|7q|V+{a9HG(1whUfZwL50N_IV)CS| zu6CWQpu(AbJ$_7`1eEyQ7ES3uw{o=J6k|(?QEimhvkRwQdO2}gxmf*Yfo6%+QQ*37 zn#Jv_X<#;!$H+$ijO`wJ3DgRO`Njo z)6-#qkX}LPfy%S(E?>=b!!)kPT;#rFnFY!XG}B96TW<%|DR8Oe7lZ|&IkK@CIJ`E0 zYH#~j`92op(Q8U?i(8J`V?_D?!8h&{G$%T}6o$!#Q+I%}*U*}HetfJ~I=$*|KGU) z=Nnn}ecmYgKncou?MDM6&jZBni+VE-wS-a!uBN&+q4^{8XRkfK zL^oq;_SiJIk8hw$$03+u^)+J+R(f7mjl#OyX%57?Yor@NLCsICqKRQmUBJZv^#r62 zb@)e6y#mO+rc-EI02UlA9DRhc=*HVpAaslH@nb>RVP`}(1te*5mk4G-KZZ%M@0DXM z=xN69r|z+o19zAPC(oXM{+@KI{6ZbD|3AS`sfg1aFK1Vu*<5zENdW+sDr`oWn5d*c z-{v@y-g6i%gWQE<@t5IR56@gO@N491(@LS|MMU44antF|*v9ilouQH$4lA)^zfZwE zJM2n7Co)Kk1frHUc3bk{qtUo59`6DoH+~m#5QOpZc);w6|JknG7}2N0r6`TfF?yI} z!5KRD)^+)RaL>yz$p6=C3;**_9)k^i{rVY*Ym}(F+&y^rLi^X7U)!xHm?-t%?W~^M z^PK2=J-f>5X$?Fq_06y5C)_%lf5;9)gWtBQ9m#ewe4d?DU`$z28I`x})yR}{r$E;^ z+yH+-e}kKes(P-?;Ar2dg+0PZ_?q8Nn}W7A&*oQE1mK>SzYhLC3dw=Ar-@ohb&`P^ zoHxWZ2mHuf#;-)qVzJ6lU{BDb_XJ>Uz0!21`>8z#TWrJ)%b1{$Bp>i%Lcm0LYEesG zSXh{h^(kwqeT>aF{%1Tm%)36?HafL>$Klqub+8t{p=<|9Vr@b2K!H}pOG4`y<-M99ex!0mB1&ayt3^8y@MDF$* zmpuY>%A>F036ir(#1N~v%|%E6L=eG9e|XsbriRI5vN++^#Yy@HeU7#FyJll2;=SeL zAq@cDcXv4PrLLc2c~ObA!|HI39)Hb<2#|T8eLx`Kwy7?72r~TE2>QF)<@sx|Ux6J> zofj5PH?weg(;de2@NJMW5%I74l+k0RceHcf(6e9cyQg21q5Fb;ag+(C>H^No*i8cZ zJ&J1nSk#QUv+AO^Jj8&KbohYiq`hvMuR$Ruc9JIrZt1hExQqvWJry22tO||EQSbh`fD8bd}NqIECdG|F{6t z_a>4UJIR`rO;N*OZ1^=lv{{wpA^Sku zg?MG_fqmSa9~P1sIy65RS^z+R#8%FGS_|vLmvXmnAp(?4n5aAqf|OO=JX*tHI_03e z^lO~#eEask$g|UtMV;Y#tNqSXVLE*CTG2%9wj-J1ooiYW{<^na`BIXss>KyqK%RyO zM&c8t`=+|iK1)sG(Bx9t{3eBN(jo>HC%TG*@gL($IgE??V=4Co{n+Txd113Mr4%OX zwot$V-x{uC*S)eYiTdMM0D3-itRDqZwf2)kI``OV{KSipARC1&`wi*~?PFtZ_2QNd zS2~}nwWKXW2}vgBCdBOfI~lchCo^`sH;oeY3#>bl*vMH zgCbYgrwTI@3xl^3n`4c)WAj1Ld5VhxT;by*jmodAq*GT{e`YQMFV_y9GfjY$FEO`) z`1>^McMcWqfE^^!fXC_T>T17WMGrz#x36XcrQ++?uY|!tvgYy1Czqnoh$wM}gYG&6 z&1h+9U4uV;`osp{Jc^oi%0qUz%}`3!?0@!!vA}ok1#6@P${}sdlbt6I`IJ7~(zg?w8Z|{Tx zn!E--656t9g|zsvrz}T<$Miu+Rb92Vj)za;%Z_bqJkAmq)oX2-^8Z@WZv2>W0^!bV zS0eZ(2j#sN>GiT@51`oC*k0Q1&f7Z2Qc_^oNmXqLE5Qp2HOdv{T&EMRkGq|RkKTg= zu-#MN^9h9Jt~YOfD7399B+I^Ok2umlIA|;t?IX)^rPvV4?n!0kWfvFWr>4SsdCKvP zjg2jTn;!#of2q3?MI;hiOf7*VgJ#YWcevX8!Mxlr*S8^;K^2{Hba}7#M*#)iV_F-l z5nP*+k`f3*UMz5M4+1c91@uSv)^!%tEj7}_gw5a0E)^mV-UcMWT%{nk{d^ZUMpxWP zge3x4PL?8g^ZNQnNqZ*}yG9~;z^Ln%Fn0@j2p4F08R;(5zm^7&jKoX3b+}_`I`UG! zytCqSY=0rt*PN`PQF)-)(7Ms<@U2_7Hs{5|Vj!b2qoJ~uB!bcH)8$LK7Iy(#zEfT< z1n<`zXA1X>E&g)nzR`K^+&RGSkhV%)4}i~FZBD}y$Ln5OVmw8Tf|BxR9mxUc^SzQ$R-R>(ph)}D0_wE7sNZznM_K+@0O*_`R(xx>Q z?pJr;eGZWOcR#EtfXDHD!j~_Q0->jihBydvu=h+|Bp^68|Esz{%ahln%IhLw3&?)>@Xw>1b4XvDF4jFiNkGe_soV8Iw1*n_1p2}n$7N1 zHgwycFIma^QAUp+Q>wo51?A;bfO5ru97|AwQ3`D)rTY=hgLg@UL3Le>?xY6XczAIq z-2rjHl|#_$Z%qLlsD`D7fxyDTGQ1guQh*WQ>`Y~1V)8gM zQ_aPtVur_%0tfk<2=M#UB8i~9EGorz+Jk)~OjTKB)p)ReG~QK4m>OVlG&oi|y1LiK zn|x>m^{BWHiY*z50rtWWn6c+Cj37(ntQy=Lp`FQUcbOLu?Koq zlP~RYTVvGjEHbiue0)IQ{?^D!uKeriz;G#qM%~8cf8X{p(ZuNToeXWuGhq>7eXaQk zx&?rX)ych`$>EwC)HWgOCY_qa;J$^0h1sm{K-&PV_`&7t?eAO~nYUM3*66mjw{INT zFQEreLcZUIlaAo(2IV!=D@S$fParl!+vm$N*x4<99xVk?2E7!rdM-~sF$su8=%HvVY&bj&zHOs3{tCIAU z|B!(WFAf4JugRogT^X={KF2wG%O`i0*XMH|KSuSfK>#qB_Dp1EPEIGNrSD{HPpw6& zol2iL$v&%fKi@|z9m&q!2j-_qXaei6y#e%8l-*DoU~O;t11R8d0UH?!a)GTj-C_f3 zy88OpK{ba2aYDij#1&1v^%pZ3vNV|(TKT=KvhPB0xv)@O2LHja7K~Zm1?zI(q}j#R z?8u$|T>lwL4mq!j%x7P%DMGNmVXpD&*KAQ1RT9`^c0FmL{$RPi+a2*&wDI_!zpZ47SY67|I^XaxTB-=fCF353T!bKy1Td@)h z7Z8(7=I(k`@JM~CbfC(86Y)7Lp&AN=oW#Lv6O0fSV~a6%^nkR6x390gr{^)aOC6B(rO$E!R3v5SSPc`dzLV_ai-uzasvYuJ2Zdg$WVnj+V3;- z{}s&HgVa27Rv-r^0IqxZ(2Qnnww)GTqzEfIJzO5_aK4nA-Qk));CM4SU}+UOZC4QLgo@Qkmi*vgz;4AV&OJoC z-wFK4-vuQDOX1HF_(VTjgL@3)PbN!O68}4}wI@^jQMrL0UkbdDr&?CBZwv%p3tfd| zW6%7%EP-Cf+5%_Y>OX37gv?O!Iu!wL>m~2NOF9B#wl5yQW(J6e-`k+@HmZl~E)`yV zP606?NIN0GJc}H%iRF*sSbf7hgqTRLqwpUkN}q~+X%ulge&NrJ$y?KIFAQT6GX*8q z>G_?&KAlsrgLXqh-v8-SCyik7i=LIXJ!Rxl!*OF89~0tD?}>7djJa^?;fBa3@D=1z z87RoiJv4#PL2ma+Rn?KcwdAn2eWNM|@(OXC;Sj0!H!(x+eKl+A0Aq5vnhy zV{@o&R~p$bL0mQ4Kkv+*!4L>ucCj58t1YM_nFC@*#d6_UEzRy)n!1N8JuTf3iW$7ji1;L55jeBRh*5$Rxm#&fb{N;mybPuvvz1})!^dlsUe2 zG&qRcxwZWM?2`FUxmEuAL;VxTj5k(RR=QrlCUZH#9qL)ur!SvFjCxx|=5 z|Ci#>xz(iLO!J8LQ?Qc&(tY_YhCvS+G1GpR`ccHWg6RRG71#yu7Y9)ZFAe{>%qwlS zh74!nk4pzEJo+CQ;zTr{PhnhKUI9mVcI_28ge@WPP;w6@Kx;>&sG5+cD3Zg32}cSF z{Iv+(9i1I)pun=aecA?J7L{OVLWNF=X#rGNK zAS&fILTEA%?eyfBS@rL?O8IgEVsmgi6T4E(jCrLe8Q$|==FGxpFvxpYrR(yJw zeYdNtYmMf_0fd)>hYoBQ`~)69zX-DzCHS+z0U$H^TNd8X#nT zR#x`D%HEpF(4f^vkW2j)KcMev-6g*4rLvH8b_a&Qk^lTT!cc)86@UGb0IH?De5`x$ z?1{|A75I&^a>C^9@?_etW=cq3UXRi@x{P$l@5~M2e9UiiO*_YfdxP|c6K#LKMSR* z0fv9?cw5t7Hzl*v{+eFR{37h^4TF{hE!;theWYz=Y3Ukc!-(r;5f*jGsp7OE37L<& z9nLB#iQfDu!tZ}H`c=&-K5IaacOV!0|;%Y{(ujzh^>#SZRwiVOu^Ctq00fEC0=%h;9<5)}McNUI|9quDsNLl|Mr%+7U!Y}#wgQ}C%R;11!Eu5$i1tlu+TpBTM~J4ceen^s(cmpM9c%t* zNR8%C(fl^n$Oxbvs3@@E*Pw)h&+$FAD^nfs(Ns5PM3fP(~w+O);= z``8&)H1(SB>6S_yE^5S8OfLFiI>USkq}V{RNhZ<&o--#1aA|{OIp(&JEbR*<`S$JG zP=@yWwqV&u4As@uC7=I;teMQ7+yh-Sq<&&Hux`=U>$8&A90h{7VMi642-FUBO;1X@IX)|Q(3wfSo;&z?BQ$9_|j9D5XkU8 zwXCN@q<1pd4SSocY~_tFfzp@?DJ{Gd+Ga~^W%vr@NMm22hb%eRNr%^FwzXEslq{jn z-@i<$yo5k~pnvWA3WDpitBb8gLGL{|00f@j9)V~%La=Q!H1s};^`MFe4w#4=!Xxh{gR2(gczH-=ukfQ#oE zu{SWSu#*QP^6D{si4)m{i6HAI^Cjp$x_wh~e~B2B9t2kPj%^?)3pBz8|J4F+3~hcv zs4RqZPuuuUABNyj0SqKqJ%b$!Y^eb_TOpNk-4N2Gr#O|>`_7)VV{;A`yC9IPp_wbG zpwJUM^m-P^q39y%B2N9jlR;LtfdEglZIHXWyUq5s)|o)&fBLr}BRYMQ4+216O#WBV zbJpw<7~Idt!fYIF@^P_Yu6i~7^8I@nxMOgpA?UW|8wo4~B$B|uKnJs|a^@DJ8~V@` z{rt{XFfg0)1FbG8;WJ5G6O01Yf(0fi0@It*<~eW@?D3dew@i$eD)zfm|2qfCr&P8y zxC8m+<*}UcHRd8uf7+H0MiPtE__^8H+3o5_ubP-dWn>&THZv=%t78W4dc%Z=)rc3d zBvj9`U4;D#&?a4$)i=gT>uHLAt|t5ogT8^i9xGzs)nXH9>;ReIy&9OAMZDGE7cn@Yq*B`QCMP z35o&mDeWDl6G#(@yBUzHAV5uA5Z(Au2>*L~XEQo% z^9Zu%4dju2_gmktj*-pb$s0{)$s@aLYFca9u#W9$ijrY3DzT ztZu<_;UJM{4+17A<(|TZCML|J8@j=2G`PE2{3DDpWT4B#)ZvZahOnJKOw4ruFOc?P zaj~;Q0RVzMw@Zkj2Qrh&-&ZQezcLIz^AKLkpF8*J^DT;qhIwz;R)=;80#x-GRl{CZ z09qhx0Tf0$91D|Meb#|N075WtZZCYehQUw(%zZC#;pUIsmxqo{A!7K`shmJY=>A29 zWi7d;-to{YWp96>VTg%z4#D1T|WwH0=B z`MbVNbm<%@--i-~KY67fTdXfck)`6tJjgy?l)1V{cTHka<}A-o65H2B9}VB!5Z|2+OK$1gMR9&Pw zBFfwiC0;3pdjqmh={}X-gDoqIS$~~&qNTpBZn`6i8kuJW6R*9Qe0X(ep`t#2{>-+& zW$L~|bl2Q^@cABhd6|HXZ`WUg;o7P0#PrFFns1=}4R z9tK36C^iHF;W6;zY>r-GTbnJ*U)^FuV56H=dt2hjBOGLXzdh!8*6ztc2S^Z<$>bmM zsamJm}zkHdy6VQkFmM?k>_>{Hg*BtPua=O5+wh%k2jA)oiYdT%V04=KDB%WujJ2HKv@ z249=^5n(xmB5q^{KLX`h4f~J>CGtQYmeHQUyG!nK$M&W+HOYel?mFI-8lOH)tuzYY z3vQsbyRL40k&LW8CS>mIvA;`syMo)`7EW@5_OGoS=lCXc_6_Z~@n%+)oh5zgC1pLr z*0+(`hK1Z94?qr|@*ic(P#PBV;Y+$DK*o1-OSr2jF;_h6;Z}bF8i|+Bb?j8md)7gU z2|>H}4w6#=FL>}q&Sd5k=t%&0H}-<%bKZ1x9316Ay57en?|uh8iYg~ZMgq4lpbm%rl5~X! zY=Ge}sAYR`5s^7LdDft`B{o~`Bm>bAmaIUeRi)G5AUUr<$N$1nGEne$HopbbsoHyfTM8wtJCy`2mjVYL6AQJ@RZGZFYmS(E0i zVkt?A)em*bA1@G(39-!$stU+U!2kB;hq49s9=lR4`YL%`~GZ}{qf?nhRdWU zc%fq(m62fZb~_}SSin3Pn>}0JErv%6k5PJ3GRe;FnCxeYl-PDH8h)8iqY-r)f zinv~r;qzzJ9LvA`PCKg<)vD6pZWrU@SM0FQ^Lf@M)ytQc?hJBQgJ zTDl9~yDD|8e~%896SsG0xMPI%x@r1XHni`RLh&vxE*j9H4@H_3-_ zg2zRDXn#2&Ia7zh#dXJ6;drJN96TLsXJCAK6!K!3MECB-a}}XUPGx z0V3mxR{#vll_)L|&!k2VTd9{Leq=tH2-2eJz8ciHzwRtt3XlGvfGdQorFX7qZP!x` zX-H-i?Bz`z$hh)nC-k}A)xVZPmn{L4;RhcCnHkP-ACX(0^UrnCcy}i0icJENz=3>` zWCmb>G`0{}mxIh7Q5#+UdU@{O)#XOH;oV3`pO zdLU`n@MU#Hg?3$wVGJxwKnJ2hhmkBN4YT!+9K74okh=Tc?(DOUDsTB-odd-a(WA%E zRTj0EJ(VGsa*Qep7%?n@J-(a&Ot+%l4&(um=8tGv3@7-(6l7_NYp|CCTRQGaOkYZ1 z$qtlfuL^87c!4;18+jIZE$V_y9IH(R+=UU(SANY(*TSeHn7RJ7+xb!L16;b z_B;>o@qWxBPL*S^<&{w;#m*)I6`U;tJSrgjzyf-pS`4jtoXOjF(g)wqd%@7%{8SYh zwN4tE1tTOGR$Un%Q&)sg*EtE|uk_QECi6Hz+ulT?Hjt}%*;{z4WA{r``LD9x2kmw* zfxW{L9Ar#r>qkW^VvC^3q)tIn5^QH^mN*;^gzCq+xtIUt7aqUzEPIFeG4Yor6cw$A zAA$uz#67^YtU!(e6dAzxEb0+}j4M3gPxO30U(SRcSbW&lY`Ch zOe7+C^k;}tSI+DCCKo-wGYB{uHjCiFEz`*aG+Raar{`B=-bE1&D_&98`SYasNu%9h zOBOcZLgDF2X6HydNbZqHyl1=nGaX3PJbctiwl=Vw_`1cF)-2ZciO{hoqnD& zEtuYN8%%Hb!IMasefI1b3O;vaHE0_kx&c4B2G(?=6&+-65eAkgCCG|CB;R0jl@pSI zh_M@iDDv>M5<&Cq?CinF1F`1dFO^*qW}~T@iZhOpp#=Q|^fX@mY$&vK6NZDXTjCI= z+IUWXC2e&3`Nwtz-5TBv-r)?Ie z{UNgS@Q7DganwiM6Vediz9M7LvH}d31R9km2#m5E3E^4SrBqUz@1BYz_9?E>*aR-| zT5MoJ+Jxi>e0tc<4q*kY>#c(%Fk06XP?{5t+uOixfW$;iugkx}8vHMfBC(Gpg4Zi- zt?Onvxwzg`U++SJ((AQQWXarCK^xTh@E%$fZWc4y04yGZ&YV=YYSB%45(#_$PEJnD zC;X}`>k|SRMPPoY`xa5af-j*BEq@@L)hp6wP#cnc z76Dz}?(X8De`imMOXv%yHj9dg;JIz-tk=b?;E!UWu@#Q zrR-TrG8&Z1-s_W5R#t-|TZsmt%=5$MyLB zb6s5*pU?aKdY$KS9>?=c^&&BoSZo{g{Ad}y+kXAwvo4mDmiC93|BaApF+j&5C!XI8 z$_O0st=UHYC^-x;&9YxJ7oi}-bsiNJMU116Z5bW4fgYG!$)yXGRQma!5RKh1EI z7ge*BwRLTs7pz}U5abfoWi7v5Im|T_SGkbP{@4mowG6$SJ*+g$9?T;f^C!162SqrD zyFTB!<#dO_kulW|;^T*QQSV_!1wpkMf5i2l) zaFjxDfY_NiF+1`(6(_*PJ8w8^nVc?N+Ja-|*vjw5NVCa_k}&El{JdW7{}0DS z0#50CHR2f;O!IIFbUrU961MqLQrX?Tzn5`s#I0)A^gn0rI|@u{_3P-$a!Ou z4Cf$W;bGKXcl?TT}JB@PAv&DnK$>zQ~scEl%gEL2|bna+Xt&T@-_8A7W>Yln^m z@&!b$?V|A7;E-%Dw2eqE1~MSjmhmD&i$OL1aZ)1RKcAX63Xpt26Yez~5+C}tR(4aH z;O^YdKjW7>;;k*m{r&yh^Dn4z6c{&DBON3BD#Gc=BNiLPfVQK_u8MV zn9&VH(|aFH@0y51G`&R51fSfkLzoN{Jn5Uqjn6LaMAP$kuE@eGu9@l$L^8-6tqJ%W z2Da&)Z5q~T+vl@ksZXNszvQZ$o}R95WYl0PCzU4}NXc(}*~Z4Z#l~X!@qjiMCK9r? zlEQa}zZ?IL>L@lESZ#`*kUXefDQw@-;@CvT{q5XL#u?{_(b~b${W$ooN{^#t|8r6n zP9zLfTzq*oK>`y;1sZeAivxVdirNrf3)wLwNzU!Ni+POh)4gpA+I~RVt@*qBH|=uY z%BvO^x-l!HmJ5s=_{PMJra0bl@RRG2#pnv6Biyrf>0}7IoP-4X7taLSKe&@->jE+F z5yM#RAAy280j*Q(L z!1|7HHzU=}q2Hww_joK`ilk|7Ai0%wTQnG~k!1i(nyKGn{l|uj6Ga9-0zSs~ZgbR; zL5wdw%X{K4)N{$N_VEvs6z;OW(Q@@d)IDQQ>eAbpQq#|@QyOB$PdMa0dTe@D)s_Ch znxd=+EvJ!I@e?jNq7@80;x^Y6>=Hv$p8O$Svt9x2qe2HMw>cr4Cb`h_@gaO`N<5Ll zL87Ch6SI1ZHgHP1q8m`aj(EN7L=pm3r#_jtLuEdXbXiuKjmhbh6sN8dP5K&thcC7E z?04WfvpZBLz?mj)%1zS)Tj4S?y8Xi+AH#)L5heGwt#ay)947>?JeqG2{%QrEUX4ST zZ7=sacB}PtAbSOanhYoAQ1h8FL*B1KOizsteBl1yY0!qiey)l`lKm8yc1$8pWO-D? z@ei0uNMKqJ^}hBY%pyWnZKq{&hU3Ebdbgsk0j+B{;Ws-mhT|Ff0{)tm3Bo<`$ANEC z%F@_skRg)Ou6TlH)!B8%yVW;t+W{Y;U&?rp$&T|elBQ$c{T4wq#qhD!{-Go{gAX!< zrieV`l@CJV5$|pim>DCDuOdxR-tt+pV>s@Zaaw3?%%bFA?tJ(Xl^o2FD4~%Ezw)h; z94AY{%a>6)JKnV*NKJUcpr_^h6NhTOn_j95GQ;6U2 z?E@%|Z|=OHk@tWwU!xzXyGrwSv8_CNSh@^TP&`Otq6u@9s5fVgldApG-O1i{etYFS zwFg?++l1MB47`(tIUXvXE-*@)@`P8L5)(G36vXd3KRmLsCw?8iI}QGM-)F|#yI zt2&UvKc^hhT&tryvh*18nxB3LaH!z{%5N?lkkQdMSsW{ZkO5CHpeK+o?et2svsLZ4 z>QP$JcFC-h+mqfa5r-T za2FO4o;VAf%v77#avP>rJ?=9qI=d5Ns7^%GaW6INq+~x1zH#cui|gFUJcLe$?kY2W ztoZ8CqbawP&J*sCc>fV=y2j7;KzV$YMWz#Y8VC$EH4IyHT5CT@Zzr+%>D0N1pwNbP zgM^8a0nb;(#KJE74d;p#P^NZxcqyQ1;ABB);k1?(!^~d&h9)V{V=!I>f3xS62S{J& zI=a&gGFtr5p`aoCOGkzzgPv}M|5g&<6^IudZ=D@0R-v`9ixR+8=igkX_?cQ-s$LIkSZkH7|jTYwXWWW(#5xhlOB0p8>1Aa{M4cmS zU+oUX!-5grX>Xj>#GoF8m%k0D?$A@+z`X7gXSg2qAK7W96V;`+p0wedP7OYvUJt#;6YXhQsgtN3Ht0(N%gU~qrrqtFmO|M$ zlSyYN3Alh{%O=>mHBEqEaG9|rv_X@WrbR&HUekFkoB$zdR!i+jO7TM3qY?cy@rMHD z)*n)|JO+;Mkecp-B^zTMrrA4bzZ^3Q1eoS^i4iF!L0llr74SkwGi`i?UI7<9#NJV3 z5!3#kL>>hP(WsVxwI*ZWj(}4*Z*ViqNF?82n^M>(?0o6&|0YQMj%o>PjI)xw{Px&ns^gLx!UE699d=aQuR- z-?sklGPkL}OA~cJzoUzx8iuv?Exrua0+FJX&o)%9#};})EMRd-qhvfQ#0(+;Bnp@} zcES)EBs0AkMJ%47*E2H2d~S9X$y(D7dK$|Pbes%h6}ooouOTtRMSuAEPs56PstPGD zNEL2Slc8+jjm3e=%H>#W2u;QAVsVqT~#i z1QN#2SGv`~58!}shrU%weE&c(kRdJ+$tH8dn~Bfnjjbe3@f;NJk&%&kG=~odnpJH0 z@c_+HtDfOcX?2*yCqyDEm`f%Udx_f_MIYHYv>(CgF#~=>F8GXF??{K#p2HvzXf@0H z^UlsM#uG4+Mm?t*3$hES+w8Xp78mYVP>so&IDq3d+A`i?egIXJP#luxXnt?k4G4TG zms9XfB(>!Rf08Odc2LW_i?+*do0gtl5myh4+W27VtuS*QtT@VTEHbd;dW2x-wQcd1 zf*YUWY2818;_?n*F+!+<=md49wtVLQq!}o(a0d%6xv{ge zpF}@wYz&*=$IqW{O-D8Z_oe&q1L!}e6J|l|7X5v7*po`a`Dqq;;gNyW z*%J&fH>ynyOwX7o{xg1Nu#&Vm6njgxIV=lF9ch#J*Wnq$pjaXL07xM!kB2pn`niFWqugm|`l@t7E@*4YvTgMhQpqP1A^%}Bn zL{#8-i2a?9R_3Qq46_C@K9GQAF{iDL7#*%jRnsT6&YnH{Oiq`^-{+!4^OkP>s{Xr{ zhfn8u&%=!xD}CM6((-nI7R?Z@-HdmPs_8e6A9oV1_Gb}I0??6|Ev@C84xWeEhZxPQ zdx575!d*MAR{8sXm04w)E@ebDEjCE>0RLG_X<+pEI9R`Z99V)70$0$V^LI1{qqjQWGT%TNYU+(ulcWZ!6XH2$ zDanMrNdWmDX33^S!J~gg4$V(5Ekln(y!t6JBwAV_cKz4jE!oi&1!{Ri`WycM|J|8w zW5RA`r&!~yXh}7u`{fCLKQ-PIJm^9aid^*gAW>)d(Xd5CE1_Pshr1n`4b3`$Jj1Ix ze0v=cse`w?=OzvXFqx@L2*g0L0sA2ok1LL0Jw2dZRM9*)V|}}{1aw*(!?!~b)0)jN8I3g)k!;z&cD6J~n zBtN2Lw3(zdV#Xa~g>MQbG)0kcxT^9rDRAgH~9L*>`5IQG25RD^2AO zCl;Tpcob0p5M4Hrc)^{7o(x7j;%)BPB)iHN!lwWX^=-nihi{5Vf<$k>7OMW@uEv2E zxZ%wYP{QDP=S|}9qec|D6hSqQ@rw3baVTf5978#L@GjR~#V4$qj`(Kqm_*C2a;-8< zmeZ3P_eCn>`^QPn4u6}{`bM}#Vco#{-0Jk!>YzY+!IQsM8?#!r*4Ph^j+*|sGi>ZX zAzijBARvGUOJW?4*iA=`UW-p_!A%(XAQWKk@LusKd^EjIB`B5+TD(J(f1~6hYnEJl zT7P}Jv#Sr@p&G;!Ks22!oA9`-a{}m(yGZL%lW|2ZXFpl+0G=Jfi&rwAeZznQlo>pq zXC2J-H|MmZ@5_W5PWtCycuG+~@mf{sW2fM45U+J~s#Se7?W?l92^SDX$#7<&@FiY% zeIdfF4T&GMsJ~DU7rhZUDs4 z@W4-W#B>l!Xh;)1aJnrZ(~FF_exUBt>Ht<_m~HTN;eAp3xnJbInt(N97EdXUm5MQw zqO|02FNqsW&Ah*AfRDr6mB>S*P9>}^x9XK8tiut@E(4EPH@mIl_ecwqvrT`%6lm@0 z8nrW$KN+70vU0Wcmx_Crp*=c7nR5l=7*FXV?I&;r@s zGZDeg$LHHB(`bfu44J9S)B2oL0h{>`=+TrVK8fIn23Pt-<}AL*H?1yqEf*jKutxf0-|xL2<=DuvlRTv1D8o zHc>gh_rJ7Z0^+6z3Vz~#f$F^5t-g{r1}_uRGUf-i>jXTil5!enh3C0lDzo(=;bP$b zj6A|!7Gvj|vST-I-qfMX3fgt-1HGoOtgTEOFDc~m9R3L6%ydVd`EsYN=dmdAc)XXYegPy+j0FEa2G_J zD$(&kqz`cJaC%?7D2!tRR~4Mzgb?_hVNkd41&T5ci)uaM8U0a*q|;6O9)G^`9;+bm zsG!ljUmw{VeA(SSrn*0r4SjdG7A~)(ur>#Q>7k*awVa}4;2VkZ-wk&(#OYI+=X(Q)(_0OK2%I$Ezl*& z!lX$}q9XqlsZ4=+4a!vL2RIAyZXs=T;8EmSCe2)$g5lcqZ+E)`yv`fR64jsfF5}FC z>BKB-gQE9!?!byZatXLV$c%>FC^xRh&xbF;rRPqqxp&<_u=_zrSJxeA+Rauclz8QG zk{fX_6USalN%eXQP<*L;+t;g{3UN5AMfN&1-qR1xU!<`Uk@JKKsKrgme=Uc9H(`SO za?x251RN0XuD~qgeeRa`I|ol*Zf4912q2;RR=M-sgNG~sTKxw^e_x6K3o)1Nx&W&z z>}2z={D-m@7hMshjF>enoB1GJf28E!0*fSj=~z{wObK|TC?ips{D8es(7+=Bm4G#t zfGGZ2(mPw3Joz7}gQff`JMWiknOpUNIj?p=n|F$&X5R)FPv+3c;hWP{3~IfE zPc{+GF3YLpeYgE;`k`tIsX~9i5F&F|KJX3r27FHqR0ZHUwryI3d)904kEX6$plXw9?j1Jb|O2Whhlc?jooF?IdrB1FzRVoW;1aiq47t-%NuNRHsS+SrF`n%xH&KQ9 z1)Tolq9VQ4e3f~{7d%)Pb2#<`w;9XI{m&zzG1oB@Rdl`7bbYV5*I7)j5XlCXiWJL^ zMH^SV*VxzpxRAc8B~k?+?udeCa5*>SXcc||id#3y#n@~1JA+BiB|e9K$CuhthC`Gp zr`Ea+6Z=>NZt6@@MadOSnvLu2BEo14-;<|1q)-$*+1))cAF;7*V-Zq48F4ydlo~M0 zzHGCRdzXKqk>~^<@pC5@#`Gu%>pz|Dv?)w_^@;;81v&!Ub{LZSz4BL-wWV74;j~0g zHjcaMP&9@jbyO#n6p+2HO@}pNfkS(}@fyI3AEMZsJ9K6k$lrJl!-%IIm0Q{sSR>wC zD#|ZBb=XVGFk!HEdtuJwPXZD@g(2K_y9LRnO%$wF;tu6KHRb|ocw@&x& zHuQD4CD3|6O!z^3F3!Lp~0h zJAchAE!Vw@fYA(-EWbqYbvE`#cdc3;Ha-6M)FylHeYNj$umM;!TKt;PJS2u3vGFQHdw-SfVAm3OG^qs zgto6Bc~CJiFQ^#k`-DRz!hhX4?xcx5(G8|(gN22KU9LufuL9|ak5QmqOy&JHk$+jn ziEd%Hu4WQ{m?8vm?;|S%?srmtVP{S+%($G?-vvBYmB0aF*AG~1pH~w<_+Btmg&i0o zG-Q|3#}x;?YD{xWpL4GDt9f6(BRs|8?}iHrvjb|5ERX|lR-0BJEH&MF8shwxI|#`T zLaffjEtnVa%Q<$T{y}IE3%Dac{ z$PfnR_{?yw6QK<>9d$GBU0Qv?B~6$m6p_#Ie+%ra8fIjmDI)s`jboZ*rrvY@R)zWj zHRLbR&p3a7cv?StlVtJtKYwHp>GXxG#VedPi$746i=Oa~VbB_6hEEThseJIkA;6D+ znQb+Gc96|1%JPAoU7f1DqnZde+la#eFzP}VIQk(Th-9?fRv(bF?PLWT`D}1G4Bm$% zh;lPT@BAx7I{;`vT)xgh>b(RkyAd9uE!g4msFtsgB4z9gBBr*Ydp|fP4_f*5g*e<# zqF#wmZ^nDQe4J@&8h-X}q5qXVXY62Vv<9*{ z*A(Tn5_W^7b3f|SOq=7*=Dv$8)P-I9pPIgO`mqB=)vZ>9WQizc-;!qfbW|q~#QEy5 zoiRK&p%iWUX>4lxMvNJPA2A7SG4~i!PTh9})`!9fyeBra1r6j-~6eQ_~(V(dd_El(NbBwOZFPwPB2P z11cQ=x#+$L*jAJuk+KLQxmkIzybY+NvXu%~>1M}`;S;bx&1XmC3Ka+95%F`<;7cwmaMs{jASNm*eum*)v##ASuXBgsW6;Q|=}| zcH$vJszlncs4H!q&C>4FlzXs9yjR%g-3krG)4;NMUsqL~G>%ig*f-pbn@d?) zIaKDW60a^!pK+PEgjsAw;6fHt;k!B?a#IAx&=hgHVxM(QF}y{y8=f(ef`WqjZ*Jmv z5VmyTz;-gePLABIdx6*05vnVm*Gwq960j|95Cn6kV`;ztKQ_4V4l5N>Oe`zDlqLg`Rvl8IeD*hePDeu?D9<}5n%w;VsS`=_U)Um9jgl(7m zq-?d6`VqK_EA->o@|8Xo?J5m^L@!%uXlWAPJ5ChNcbC9z7rw3&KX< zD5H~)FAaS*ymxs5+!*HKpTp=x+XBx~JXBe6aRT<^E&Z!<;@R`(y3^8`tMsT;9$wyD zz{vjN)VN!;1kPh9hk|$`*+rsPXz?yM-OJLZ|i3X>e&a7v?l!utb@WqoNjSe$OxhLHz7^@jM;b1!bwSE(~l{gMyQ ztKMkUF2k$!h(C6cF>Pyh7UEPmFp2T`+h4w>CS-YLABk=k_+F?1F-dc~L#4GYDe&Sl zB!Z{#<907VtOYjL9+|a{uvP*tgskRudHBsn2}X{kh zH>AQprBHn8BYq*J))@3&$e;o(KmX?wNwx9BekV>xqnv{U6u3Xhc9N8sTqH|B(z!Cq)RI;^!p>$yQ?@_xe{yN?^Dj<<4LtY%5;RBBl=mD z{k=b0fv@gUYrej5hJ49DFX^T3|LiTm{PCJ{umH`CXdMdeBmLl6atF7KHGJv#g|!gd zwW53wN;hJ%5*|3J)o5|PB}be8W^1$AQD6h?S;SsH4fQ$Q@cpm`%cxl-mJ5h+(ezbM zh~40B4E%a2;+GKy4@e{Hl%F1$ONi(cRf%B?XCpA38PieNkcRT}(WWfDe0cVWJuH3y zF-f3GUQ-rsKbskEi|t?_NFR}|whf4pEDdhc;OD>RMy+G4v#ddsKcbW}k8B z=uOSxUp%vp5a@+!AWLMbiOeef7#j;Q$`T5F7TblPuRYx8)u|GEM>)NcOmi6qNK?*+ zy6#EbR(Lua0)Itp$nxdgQ1{zl7rU!`;GE4t$DV*p_MT`(gC^S~Ie9kP4iDC!p* z!>zj8oq1UMxnVrJcPjvT+B8|!S7`^RQl^*XJf5W7O&~an&#=+rK9(HOW>J>~9keV| zvjL1-tWo9`0H5KGbWqrECH0FDRKz>XLx-wWlbRl-)N}SNY<$rDO1X5f$z3m9p23mz zftc<$BIS{td?C)*UiiE>!m||w`Dd^o<5W)P*=@gUm@v~PGDCniAx(y41Uge}K{W76 zCp7V%DDNn!k7)E!SKvmq{KS`{_KOg9Frhd3)5lUL2RZE?E?fau>xj&zOC(N=R&!(J z(xV>aKNi^1U3BTI9|69_Mlv|Kpy5JjldkGpdg|o(V<_G$5Jort+pP#9&t~T93)Q_{Z zTZoLlc!I(-f8rivP|g1R`)^_=OT;X@&ztk^6K*{l61EhGT${cz80FyFq~zg*=A_$o zO!(0CwJw4aMdO+%)1q^v8=H5K*}CjG6K%0l3T*>zx^W$ypZq`OkhRR{kQ78-7U3T~kDY?TDfX8W-;cr80Dm|Hatf!CvUAmz{}V1_`m(uSUh?f%U)9T+ zmzxncnodSZjm#WoXUrSkp?OslChlGWz6D=R=>iw3HJq}#8IHBAE^!xb6n3$jK*z4W zdP1P!NqYu9ewgMh%2%4>ACYdWs|_IYgLVd5+Iznt1Oh7`9i+d9%@p}Vdl2w>cm{#< z@Yw8~?Chxh9_ny=4!ma~HV@*##+iZDgt|0YzE@R%@xcM6cwjv|fM0eY*tZK{Um|4H zwBzZxf(kNWfd1jIhqE*G08|(|yS}d5g9;^I1B&PD2l$W?C^sUI9iTp7Vsdx0&naPA`(5=ib}6SNBpL;s??weRtm zKM(5#VxWI@Dj(02?Zdr>M>p{6R&z}oQ*1jzTvn7a3+6$X;`bdq7&1P}$>!W7en@FD@J>9uJ(m0g#46_7Q!e2Z9nXu->gT!7?9tqB>DPwmF1pDv!Ldcpy&f1cgzy@v`8MmG>H zwKct+ib4{tT$;9@2k+W^6kv0ajOpEo#vtxYHi`AO{a6>PbL|*rhfD^QE`D)rg*4i} z3g2K#bR_l?3aoCne4oxS0Ye^Pe8vJx|NiT+w(Rr;;gcBAkC}@^U>)W8DaOVbLNkXI z6?0OjpIwwdP2;hBeoBM86;~NN@WQrPI<7m5s7QhVZq(I33bv`(rm*foqB8+DZQULX z`%=EP7bROuFF|XA`iE|WcvnAv&QE^8i6jG<-DPPa;q5P$u>BMsox+1stnWKWY4K3j8P^2#0YET_d(VuI8%I6#!}U zj0`(?@`v=O_C9zF&FNc7&$0+%J`E#yVa%X0Sk&5YmIzUtqO!TDq55G4rDsx65li{s z*&MiiG_PJt?83=Qfzl0NUenxjYmhsP&evT@o1(mu@6ka}%fiFjKF27B!ootp(gtO1JCg-caBUvny_>%#_sb8|u;gcZ`6C&mrKBcndE@t4 z2{S!^D50C^o~Zu;u|&MFs3R=~_K53UUg^o5f6 z0qO?BE8VaUQ1Q7f|DgzgK@}Yxngp|zz%z#OG|B5V%^S6S1-MiY-|@0jY}yp5bp_4* zm#Kai4g?Sy6W)OKVVe8wy*{o^c;|5cCe#yHmqLXX=#lX=La6Y?d%061vESBwE2nX2 zbxC@k?r!rvi3JDtN7NB-MRs3rnYOf#L%P_A@fn~JaWVG%Y3Kop4fndfzCLk6EnZ$r zF2e-TXWZu-45l;^m&81p{E+s35qI9<9ZwbG)AK-#$T%304%ZwRCYeN#U6-w~zMhem z?A_$ubg!1oQe6hpXMO$~Vm$9+2QE(&>BVzuA`a(!Aa>vVmg7b4~dBSVg z4XLJ=T_KyaW4Yan23Wm@R~atw<|4R&MZm9d2m-4GJFxxQN^CN(DHgB9v;`ynai;7L zR6R;0^(I%b!-wAq*eal{BPP_C{aWZW+0YUvUW)b!hXXNn4*8IQSGCvHWT`XQ zi}w?fEUd- zK6r+xuxACB5*|{Q?$9ZRg9+J%m06P&UwlTTQ*YVuxKAFtG>J<^KAxz8oq_-lAtt!* z_6D89mzcM{ka#|EG$AVU^$sjjIOmh1PhAU*T(4RzY*DrDK~xjzDPA6KVbyTzg8`@Z zjuq=~d34NWnhU+n#$LLx!?9wKXPQhmCSonb*R6V;C zX=!MBv8xGt2~$$!k)UE+#kf%U5<94NnM%D9>YAjv^M+i)1s&@K7ffA1tXW4dsgTw+ z_CiN<$GqQ{TyAt!H8OEh8^baNieElEkjcU&M9dXO6h>QAkBSd4TcOot z?u=maZq=;+{4^m2{~I5=U4JI+$Ky|u4-*PMS{b(9c=ibK6x*{72m_(s#tT6vk)eYe zdq;lO+j&=1m{<|@Eu#DnHUt&c8N-`I$ z^;+yy^+ zv08@BEdTLAl27X{k6#aYTx;(k0ksK2aQw=jq0H1-iC0qrdCa;|hrtOsU-ShDoc3h? z@v{TiV%yY27B@8YNl6qN(+A0=4)S9}nm=0UFk8)H(hFcOLS#TimoI-QH)0e}RaSl` zFk*`7lF+tdcxi2uE*E_v0#wX=pS`n_N3~f?b4sLYiqS3lFd1&(y0;_;xy+Ble#2#6P0(jsgm z>Tfy3Da{Un4O6C9Y*LQ9Q!CMBs356<>Q-Qf^T(_G*dME>$D45>P8}mXWUqDiJU4u% z{cfvPmcTt2g$cYH_F0ditI9ZVshF28`GY(b8g?DMOmJ;W|8x9ddpTaMg_&b3S5>Mf zG|!3doKHz2GVf^JU`@iG&S!APn~lW!_>0mjo|m9xCMxKc@|vNRJq()dWO&I~nz}CsSjJ z30ZFCZ_i4ds<1#>?~?`=9IH5+aIA)#Y&Z_jVCA<-`tn_ANX$Ufzy_544A*-HYa>AD zEFeouOk7782&zr*(_!x4YGN3OfFk3P9@r}-B_(_t9#G}fWi=mj9A%v0=mZ+8Vn1Vu z;oR}Y=go7u)qM>7O;W5h;q`Z_*#hL8Rqi9^kEME0)mI&UG64w7%;m>_%~RcC^6|u! z`$Ow>vSSW0PI|UY8Q4;eh5$R5J(m|Pyi`lS@XA=8uBoD$i0CFn=LjG7 zt=5!9{glrm!5$mZYKUqNC;6CID~O298x;@2MJ^VoF6g{#=gu&4loS`{!(VM!G={!4 zHZRDyeez*PGLIYYoJ7Xu#|TM4ksn*QFiS1rxi*xDg9!plu_ z7`E(>9GU~8@QwjE;$Qy7G|9NF)?D-BM1qYBPL%tsBW~Ne&8S`ucZkkyY54G=664v? z48BkZ=wFDHPCr$-q?Fh3TrF$bJQ0v<0mhf_!UP?%RKuv4}zD5`Cq=d3Y=95 znZ22>UU_z0$O^?-j3cA4>5gthwzTa3!9Dh3mFOq-f^MuUMbZUYPto{-(PkB1US14V zx6x3*h-lEo?c>)xr1xTObH74P8-XD#?*Th7+-+x(qGG>s+)&3dOVpV!c8AarGn;94 zi5L!@NPHkL)raJd@pJp4#-R`+d@djwxJ6eSZh~LiCJXF`0Tmn>FHw5R6NidmU4?ufxzu981~) zDO3f_bpsBZj8yom!u$Z|*3H=a@fu#I(FPA3w{SlhzPv^WtCkTnX#;vvh=PXGh7oL9 znAc#KEYr$4Z%mn3*kU70ndLj5*F2+j=@K^EAaVWPwH$R9jH8meem>)gUGb^cdv%YG zIUL&TTlOcv!;a$?Y@t9-+;>3-UG$Q0jg!+$6Fc6IL3NFyWUj{jwwic+`2bZRMhYly zQ1hI1N0=mf7<~dPM27=UV9%(b#U3mbmxx|y{O~~}vWoxs7;FlYp^LpPWyVfBE2|Z( z{i!;c%Hi!?+bRTKpcz0Nn2iy;YyNn8bypeKd<)JycTc_v8?~GaK!#UBHV1rBrGtDU z41po*DT8YAHzsH{9$aMSRyc#MWVERh`|T(#1rkAYCM?RhZVWYY_G4EV0m_tFSoVZ} z0RO)c>GXuiS8Oj&aZBN~y+!0&?}K+kp9mYivNzrfV0-TxiWCWzh6gu8>;nZ~+qX5; z-8{b|?@-uxcNQ!%tVE^S@z8T^v)V71LYfD z!v}m%_`}+%+Bg8As2cz(&0H_!eOcgHZt=cu_!=xt4QTE|o4{_AQpdQ?mwW*%DXt0c zzV4P_rNK76Jc%d1i&)FTT5!qQ+5m|@A^D4X`1lV8)@@KJkPT7h!4#cZ&UU?zOru!7 zW-m|u&xr|Q>ukm0xITvC(m(1jD8a-UD)-Tv=D?J$7oONscBrca$|eV)L;IxTW|o#^ zyH2nYzPN?2MPSzKfbDrrQG>RL)=wwPl5;~l5ANnO$b6k{XjJO_aQpsGmcF0n{56MS z9h^^LBhXB$p_Q=v^OV=nA!`L{!>V`(zDsF88-~%qp5vuN=xM46FYLUi64a#zvoRh2 zfn^e1-Q`_Y%fNKl_UXszV?YYn`DqNCn_M9#SP0**leHyt*&)2+869SKfrz~LQC>eci0sfyn})LR69P0E|oS_ zp6rK9npnPdng$OnK0ow%U-Z>AZ}KS1{YPznzKx)JxP7>I2waK{#KZlan)~rD_C@!j z2DRy1iPf9rIi=Hz9mkYxZ7afGhBgyMF-WWODhChzvJ2)$Qt_aK6%mMg8 z1Tp;LYcb2hBWo^_7!Zh5A5=k1qM7-quYdkLa;-!5AuF*jRL?x_iA#aLmn_w@sNL11Rs**w>X&EBS*0xAwErN+c zZU@w?&WYYn*$ki3(YYbUI!zkGVaUKQv5M`z=Li0y>k6*Y+kv!4Z1EykuoPJ+tTd|Q zl^UgPz8aX8<)1fr`j4-N*N;73@Y~WMY3Z}mCubavi4G0@BLL&-m09S$g*^_!@a?-c z`Y=8JWhg4)h1qT1^cPdqZ78yyQe}mGkoI+;eMtu%qB8(|I@{SA_@TKDA4#5&6X2z< z;nkFpzz>JC^30$Vzw)WWCQ7x!)<(Ry23neGWhd;HLByCJ?|73ii=6r7kIP6wOXb`rY+diPVdKIo14{R~KTsI<@K{@VqJYJJgF0?#hDHqYOTG*V zt~7c?6(FG!U62svPhn;y;~-lwk;B8oxsT-dM{4*v0@tIP$jL+sNwX-<>#)Pv1?7&? z;)=$~kpl}tdjCs+!!D~sYT3G9tqFz$dWobXq5w&+>9bY$qkPL`MuspXfX&c+uR~$B zSqgxaO8d287J)qW(J|UJ2@$)e)js=-wOtRWsS08A$-RBMANSmGm)RCQv@X4tUY+R5 z9jM=@Jte#Ae#58jaqI%~syli`94Uo#iej}ITBRRh3g7ub;4n?Zdm%2fJ#%HsNu-(kbI znCIcKB6|ATCK8Q_wI232?{Dij)yxYK-qJmC=0R|8Y`Ov!c|>Ku>v#RjNHbhdO@}c zM~zoD%0xr zqU(~+B2GyTS{29K= zR6AZC9{n84w3!=(mc>g+inuyjL?3+CTIDx)0M=fjXVA3}J{mA`O=>3Yd{jQah-d+G z=wo<-AgKt`k>JxWWAe})S?0Oy>+p*>W&w~PYrfOkH&miNAb!L|)1wJ-&fqxGxXA6@Elo?>kaGQJxUJ>oeXRSA9{s>IQ%5W{$@XTW+r>`o2%tB`&7~*2q~c zBj47yFx4-gD1Jl`1JCI#m!Zl-0OKyUR#G9b%9#AYe#8(q>Kt&$Jtyaf@fUJY;RT=8;%O&w4R@C`%#_;Hv>i}<8g<6WHkhe6$kk^h}Ep=S5&u zKxWl(g@MBx0gVx^`v^s&QCoxOc3AU}<*5m$IqnqXmbA}V@Qgp|K`c*)(*j2Uw5$wg zaq|?Q{AJ#o<_g_x!{5RLV*GoeHfTQ^R34bzl~nZ6dbp1cxMJ zQ&t6n1=*cs(>rhRJDXg}71T*oU}|grvx{$haOdWY$V-H4w=3$vCW0Z$;NajS9!2;c zler2+=3+wG^kM97J#~r}3?gd{$i&>&wbMEcM?84TfUT>~R8sJ|+}ZNv`ZM*3eTxzY zFG+e-`yHvf;o3xUS0M}k%9Ls!IvQYbhG6sc2S|{;!+Ma9TaGsH3+B2AUTY5jG^9d= zdUfDXfrSDd^L1cj_~AXnDT9n_v-Tg=+`GXGvFVcpZs@`VSe=M;KV_y|ZjRxGw~9um zQ@DA5GUfb`JI3B?xsE2*Dnna58TZd8)$EvscC;N%PQ=RV*jLz54Y&5($QhVF`d$wR z?C1B~Gbx|?3q75!SL(rk{-_HdVl>R-c#0$nn)WIN0(-SMl8TvA48HN<>47?+a|BW2 z)UT!0M#P@xk%r5--JJ-l!-oiE9z?T6OExQS&XTZeC&T1U)^>VJM%6w2#BR@}i!?Me zWG^VQt`n;ot`48HD{f5Nw-S1Fu}G7*;(b~vPa|hqbnQQGhM2zb#UFRdU3n=6O;e48 zC;51V*9F*evi+*irt_F5mgH&{&=c53ijgYWl*x%OiV4kn7Nk88 zLA~X0aErq?=9ey4*^4rxi@L~8Z_X;8&AR*z!7?Fgl7BoyPTSemJtzCa#`X!f!t~_> zHX95IBc4LM=vWa6v#d-$iKo)_iO=h=6Z84$>(85>IXztE#e2Ha$Sp;+x$nk1yF>X? z4;2#O@3n3}88$J1sWWDGjI(;1F6kO$msIIqzp&7K{Mw{doA~Une|E4a3|p}!T{Tw9 zw`AfKTTaLto!kG(64CE%B4-?aS)UTp-Y3pu#H- z@e{sQOyYlHxw^%V_RuPSi~$*UF+7dLI$U99D~6MoQn29H4YBX-?gHF?kJ0_vs_bDN z*kgL-#NbWeX}Ywj+E@zgdnYfXbvVq9_SoX<32yTJI3W=cJhy7bN5LCW&qP%yP0ynK za9e2%EmtmZ!M{q|+S>NQ&59=si|i-j80w$M1h(J)r0)TXIKee``Vj@__QbA%csKw$ z98YKCPcp}|{T31NqiH9X4)n2BnN_*uc7^=T*h$)O{anTaY>cq| zrf-~BZ2{$Gp~!1Vq6MZp2j0zQ2X|n6-5QL1p_Ufx?!n%AoCU`Ja9L?vaGt~6cO0)2 z3Nvsdfd|>}gP`*Traj$WN*$DjixTb0+#ihLEV~X#Naz&|IfDghxA1f$o`(>J0M2(! z?}lb-UrqQ1Klq2DUcj=9m*X?XPiv*6D>`TDS!wGlU;AEbn#)J!1llT;8Pg*h>pZfd zc*Cw$g7w|6X^?p3LKPX#zF#@@Gm$VOcxKHv(hae+L90paN^D>xqQl@GV8|lk@)r2I z7P$fAh)yC(pLa-%jEl|dOv`^v{?#fq3`-H>QJN5OyA0P-)Qp773d1}muS-~ahdD^s zrRxS+e3+;aJK$J1^^A@^4Gn!;=I|w#*!hE&6E|jFXYRfJYDiCdG^7wH9f0THUBN++ zaV{+60vrIznmpDiop)h7CDdmX@?5*b=Ze|a3= z!XE5EJr4Ir`zh)pg1)NDAL{F$&ABTofBnbw?ZYvmk2?dlG=!QroJ)NGLkn($hzp-Y z+(oM|o(Og4MLjV2hOQs=K=5kv3yCej1CeQiIYaAHlX~|5xCTT2Y%dsTM;;vrOQ;_) z($@nEx08N)SX)`~S(ly_IGUC`bSn2br*>jbQ`7F+G%ul{6 zDo@A}HC*vQ?D0M>`k=qVK?lYD5?vn5K~ZT}wjzOuF|^K|R?P&i8hZeOfL}{UUb_B& zrUPrRtX#i>O`xn;`U}ijW+0yjP&L3e7NXC;vnuaav6&Pxe1=B?w>-r0cJs97(M9_I z_Bvt(?SLfb?3z7cKbH*HBLEf`%UBtWzTlF)8j@&=XL--Vb0Qs#?Ivrgxz%O)#Z1CC zb;2kR`pjwsb1kB#*;fR2$Mfwc+GO8~khSL)0qj^hv1jY%XMUdC>0HECCyd5WE}fg# zd*n=bfiY3E`+SrB8;D*oB1Ozf1J5&cYu6t#G9n-iuVQ*|GX3y_F_KYsRbb~@!-Qcj z#{VVhH5u|&!ht=g>o`aFN=ca2qPxoLf7ar#Q*itIZ8^^89}Q`Cs~h%%u$QY(EWyO` z4tR3})fj606;%f<@(pVL?#54m$|mFo|DHoXJ<%+2d!6ERHd37+R?*{&MMv#i)}5Cv z3;R%t$9CBYEPP$Ji(Y8gSKgQt^{$=!s~z6}bu65-UGwhXEQks--#6sMqOw>~^!PoIZ{di9NsW&~8}+Hh0e zk-x)70iK)71f2uXMkkuExAI3a{bOGz80*2S-RfA1bQUbI4{5VXUcS_)JM(hOsKn{) z23R_lrGskT(4P|jS-y`fJ(R&Q_vmnCT-!BT=x&JY5_RX;-2r6vFlMCa9+9SN%^?!Q~f+jkRsM$~0?!`_jkNuf`Q!2AJgIPw&S%VXe^9 zp$zd>7FtGDai^L{A0GZa+rsv8E7Z2DVXKS0ryV5TtF2>f7+I5q6z5b$xeF5tUkLj@ zP+%Oj7XCoz``d@n16mDKya?>7rI85Y0I7cm}!#{O3ufRA34Xa`V^Zd zjv?emgnVoI)9d*e<1-6}ZZ~C|85Y<5X}HG+IhN(gof`JSt6)32l}S483MmvFh9aBr zv|>Py^XyUw^M)`gS4XR|QYxKh&7eJ!O`SiSaEZPrxViLLr$Ug@a5fSgIncb|oz`I~ z6-{*zI2iWQ#eeqSw!eRytMOiAFL!kugKKJ<+BbX?&@u!R?qazYpgNFS&@eoEoMxH7 z9jzN8yU>iznLYpVBU6QXc7mQq8v`=p{`gtGm4tN&@kp zFSUt+z(at-=Zh3SU)hQ@`qsQuL{!di2~|BQ`1MdLy=9h*9p?woE5|_ z>3wYZ^D(2@d41OM&l(GgZ@Sl#qi~Vn93W`)@S{OhL4+ifT;y`KW2SZ&9OJoogHabS z@5PPGJfCGQeQ1AyNNTKMZmC&H;0$%jAv}WW&|`pqDLkZg0$Do$rbQgP)v&Kw%qNzu z(TuQr!Z=3wQa<Mb}^!#(ip4&jEx`+&6{5Gj#3 z^^FUWi)L3O@$lVjtvL5=ILRVcfBG%b8y`P?^2YbG|3)mpb}*^pdxNjh;M7?RSP7eM z(@QAG!!M}GHHjcYZ)sDH)&bD^^`*lx?Ic7?w7KQwCLf>N1V5qwFsM5s(mfa)n;(eu zo_M}*3M2;+>4js6AKP*#F&BI=KY(`=$pfeXV(6}5M5d;Y#lwoj8zyR8NWmdr6(w!P zpnFDcCT%#5_HYg+D4QBE*J(?!ciW|Dk=VYDM~w!tsM$IJ|HlTdpKnQv^y%sz>AYj2SYY+=%XSWa*%QJo+SWe?+9(($d+fPr}#>7FwgKZ+w3hbzt*-CPZU%})PklXwwV2%WvA{>ZBDLBJ$cHMWw# zzOHYgDCh=gPKnCIYuORoyL${)56>Q|b~vq|>cgCaGt44>YgtQMuBLs?6%RnV2-ul@ z2xQ6LcVLv(Z{TYkK}Fyg?+dOXmZVfa!}(h8zyBRsbap`J<)@tAYGoqobP9I8pbtA> z7aG#mHPW=>wcp%r5PVMH#rg}M6BCw49>Z2~&a@+-6I7#qYgf?jyuU5}_(dx#_1R|8 z)%^f`-mMV4z{5q}*2R7vwk|aJs|#mgy|c#YxN3z`ts_{ASegRa6ZELO_y|C)({EDG zMyGlK6{PokO6Cd!X_wTsy94^zC#C*}I9Cz9eGH3vVJzd&wS%eXerkJl+2e6c30gl; zY+8gB;3lErSzZ$#eg4B9FDA}#zZfSh+9WiYJ<7{|X+7ey+9@9T)a3rnE7paZ{7ttN z{Dt*-JJFtIjW<62dqnQzyyl0xQy$6hTY#qe*xDMtDJx|zH>vyl(Rk6zx!B#j*;fvq z>GX-klw^rn=U@{4&)YQ^Aai7NFc<8wBUTi8)ZpA4TW6BF zX%`vcPy-Zl9X{4$v&~v{fsu!f`W?aI_B^?Xk~iP@I>+)2?=>hC{IfOS=`;Ni*L)~V z=Pb7HE?j$O6MEPa4vuONqnSK-YV1)lAv*^6GzMaQWqyM8JHtXhy@)W4l-pnY%q#ow zlT`6oQWF0?mO9BuJym7C`&vG2JTf14LD8e~WqdOhcB8fLI@|^CK14&*)>ZXxK#2=i z!2;wx#uK*oD@$R+I9#P-RqIv@DS!d2L~^l(&JaurN(%^Si&25JO!woI1dFWU`L4h3f3QBnK5|VfS~7eD zsNu&4QYhnHb5yaggp~%8i*Df^#XGG^=M|C8z-kW}jtg(kUt@RR~Z?ZQJQvzgfGdAvbS7BmzGrtS&>8( zDl1X4v!BpIWR=ly=oZJ>C;1cN1leGXH}r^|V$ZgN-Zwh&`2 zzsME8sW*^W=vO)ZEYR~%Z30%pk%`-loW1Jc`N2Zu2v9WBnhCg4rJb1!Ufih=fgPB>6p;;O;VXoI+Q6g5S8- ze{!HcRK?{5KfILd^%s=9dh5d#;v1zd@-953GNX?{s)~IYcr6Lw0tZFL0BeL*w#c_g zEON-V1oR)$m`jOLr5pH{xE;BbEK;QP(lXRZkSAv;BdRZjEv+=>+0#e>T-edV>VxLu zU*5oD+BY8D!XC8^0d}UoL3AVrg3(bN?`;LC~4^;~toCHq~jFt8L z@%pq-!s$Q9p=?<=G)FYd;pFW4qAK^K$IWzF5#?CZJ<)kZ=bLJj9RS$f*Fst<6l%sq zv^i)=?Z4`K7zGnIp){rTkQ*ye_k*8({&14EhiXJWwpr|Wz^gw!D6|uQFAa%7(RW#9 z6=0*r>&dkIa!I;FC!8gB#Es>D{&j_BI!0@Zg5A6au{byx|JSX)J#z0s+Y2&z=dYF! z-3GQ>RUOH1r0%JwCSG~WKvT`sdBMvMII}T*Z=;MAjv-7!&riG6=iS6KW-WQ|Y9C;n z4U<8_(XljSYBEHB5a~HcCzKCs{ER4#sd=cswod-P{blfwP+u2%CHU0&dIaO3hg?ld z3!u(0NJ*fF*?Da!!Qs)>aZ3$bG`>R#f*cz>V-jXO$nr;v>cfV+#@`B;(NXsZ<9Yp5 zvjFt)t(E9iChFo_$Qb|Amu` zsxExThKNe(!rX3pTz9{J{n8L+`@lkBs~h*A(vg#5Aa8>o;_h+vnFbe`!hm5 z5wAOIa+CMZyqrh=tA1Uc$?eQh)9&f-9lIt%+4OFPG=Df0QH>}oUjMC0Lz!_b)YpVe zuC7rh7@KT!rUWB09kk!=*WDL^w>9NHa?`8B<-^ux#-Lb;(BV`TY1xhZi#5%Qw* zT=4dM@D}=Sal;KNG|5<=*_PB^P*miwGsff6%91DHk-`EF`Ec`vm?`F^tT}NOI`lej zLpT$X`4x8J8AC{ty}Ji&fZySFp}LMd+|-H+i|r!t2H+v^^tm~7?z_goI(#Q#z$k*N zPtN9zX}u93^fU*<-&732Zztjva|Bxd(vI$J(QXfcZ4g&d<$SYy-15{viV7zDqkHcn z&JMW)cpZ;nZ-s*gvX94^$C!-sgro)qSwti7JD^thR;KdFeCE7FgPk}FywwjLJji~) zFm*)_D;Vat(4GjSC24I@OJhW{1QFbYX+IrOMo?D}Sz$Z*8s)$XCYCJ>_@oHk9;+p;sfwj}vrR%;?a)?na`ktaxRtG25NN7kPqv;X<6{+W||UjBl2T;k`khE1EF@H1T=AACMs-ZCoRvKVqS%qxmLlz4Bg zAW9c$eZdrKX8$Uf2t~U#+vQ;TtCa3w5K$0082#MfLS2EO;BkB&4vC!h zAmtsXfAS@9K zt9#imS@RS?4Ljrq>1BVu)Asw0*DGJ4Ac%-RU9u-F771MN*X%Kv*Ue5nir$AjMAC9ZvmMC8u4(J$uh11 z53hacA*z6T$6gE9L$6@mzw>Qy2hq2KsD5F3JZ*KgH+6Gt{TeKbo_<|C=B;caW%pjd z;Xjv+Reyc%z?YO|xk&*!yD*ZbNRD^G0~nqpf~W!zn|Co$sZ`Yn-Jn5Qq*qQ4}F7w9t0Ns z>7MaYXgoj|X<4y}>;evD7@JoFY4TI)T+B&Go-sdq*r&*)?$66CPE8+PO^^Aa>@k&sR(OPIe8W&)1o}KprBs`Xs zG4}}fF9rgvuMnXIy|T8RV+m2m9e`jR!fgWGAA}hBgUG3#1JCvJX}s~qKXV&#V*`f6 znECI1MrI^-duV$@pM{egb^dE~JRp9fEapsepP?XmQVxFO4PT)f(eU;zODF0XAyvLv z{mtz4soZW;GmgSo#giMz;9yY@)O!STDRx1Ws-jGFkJnr6z8tPU?}9ttuywV% z7TTGclM}39wL&XoU!^Ss%sa?3S~Is3bRG zp%xsmGYn%?C6dA(qJYXkx+w2%aNF2s*!~|o+$re8?C2SOG`G<^%|*h*HE7JRqop0%@Pz5sk(n-q>7q zK1w)B^O%7d)1($?{_?o>uM)^~dH>Mp98vxSz#~6RrtdMb&t8wtl*l|eZCOM5vdKP- zwsf;`#mNk*l$JWq4Z;lMOGRAgXumYv;vJ>t>nt+1PkvDF7EKp4U+OoQICZ3%v?kVS z%Zcy?E!c^z5y?JF6LpCP^rE}lBWJHUKimuD35E(_%2npOcb)%Jw|{v{S3|2Wm=D=P zC(D?HWMFwWWUf{aZH!QcYA~i0UPZ};o;H1zn%6d8MJvl~qFI*TeH@pQ#(g#cY(Q5} zNC?Z~B5^`jGRqNFtWWNAL+SU#tta2Pfc3KrZ1WusCkh1O4SdrnOa(D5J}}pRaeMk> z@z_Thk85F%UQLol6HEm=4m@MKLTp@e5zMTo&;Si>4?IDx>vVXTa6BQw#Exd#nT@5i zHIePIRI1>Zdj2e_Ms+jM;x6m@Y0u7klL9I)W^o4 z>{~o71bimxdd(j&Z5Eh36rK=&YAd;JN|hcA{x-Ng6CA(lJsA{qf?5!(q1oxvM%3gQ z&KHqC_(r!BYX~RlK73NV?m7`#iijtZjb!azZ&?C5(FcUfx#`_;Hv+GK$&`v}u=Oya zDnN(K%*+%xZMWJZ=p>t`PL(&J-n@sjc-UlAav)>+=ug>`#4svRFf^qqqm1 z&wnc~*htBqixSPJdu9E&>%SBH`@F>o{}U{1TZuQQ7@-ZH6tfv^_g=}QwsfH-*B=e5 zr7;%ya3se*pj|?QLeufc_%>TB=ik>6NP9zN;@(&-tReegb+MBs7B74+XHDpgNVd`m zMzIn^R~MostCj{OSmOuLT@hq2{fGTvTAnw)Z}cJm912<@dd~>CHVP|AQk3kk@hPp} zsCu^PoFK(Nol2V_0!iUq(cn`t>b;0+W zc>xF7gg-=`J*t(cQ;5y`{vF5vVsCaB?X5uDvSwef0kJVah94(ijm$8(lkhierwKTt z>6H2CO^d5+25y&sdQyOoaZ43Osh9bLi@hMK>wSrYo@dZ85-D?!QVt19pfS`M59r_^)y0EzO7B$rl-B0Wg-pyx58xo=q{QI?b*2c-)LRVZ!fNqgXS2(11l|2gs_ zHCc1Y;KOf3*#L+~%s9%g(w{%)AO@S!nS#5CMvJ9NSBT{p^8%` zWaA%qEp7p=gQ7Z(Iv3y+u`-#RgO2CFB@+)9y2+4K_EOJ(!O)z*Jkgl^Xj!tk-)^Tc z8}@1ZV!&Nm9`A^yBYLlaN@xF2_*Nu`-}yf$7MH_7Ra?Q%VRON*#Jb$2x}Z+>O=vwD z#@UD>2SlemTE3vB7VwiM?_abrk$+*u8D7T!s+5t0*>35h)pBe>$Z|uh2u3MYNR?1W-HkWwF86Sqa# z7Vj8Ue8*1Wj}EE$GQA6FDUht}LnjsbSv&TM1QM|tCBIbArgRf;O!@DgHJF11Lk*yC zOv=RHT3AQ}gjszrQB2S9JLdM)$;I!BGd2AaeCdcL561|Dd;sh8d$nkMR)Mo*(-z$v z!}n)yGm@$%8$|v^uk2yG4q&nQtZh$V(E6LyR{+E!Qx5an6i+7;NrVCMZYR;JxFeGoi0QM5 zXxn`d2p}J*8c(;N$cGnII#RSBH#c{@F`d=%4={&y>_fK6zJwDcGBMI$DAU3w9^CCp4oI}X z_=TYlV9yq=pz1Rw&X$gN?W0SSGvkQ;1Dy?NSy>x_MgPl7OMKZgh|-rU+Vof5vRJeB1CJH^w^rPi>ZJxq2N;lq-jmkks^dTZepj zU!?K79qe9eA9nMsp#vemIpFVviVnhRv-Ep_s2*&AN^cWl>gkZc=d^`^q4;X_w#S%) zQI!(+!_U&A zm{)+gqWn%w??TAV;4g_0W#R+fAo0x?If7W~(WAqP0S|0D-`qPN-}EO;Ckk8S?Mo4; ziLD<;a(&1Z(1h5%b(TzY4VDU%h%zu!l zp)Lj@T2b=>sL0?$;o2JPyqW{8g>fr3>Jkk;@Sp&^TxF~KCvGoT;G=3z9U(|2C?tr= z1EkgZRawbUP)v;Lv<3+iRJU)kX1ssvGjS+lL)`_!l>Yfw+(z9Wywg=Hqg6!dh4oqz z>`*)z8hA+_v7(6JlmU|F*)jRXycqJm=BVqd*uRN=Edn5 zH27W{j5VeD@>89heaTd~T%6h~R(UOVA0sRwKitZ#DEfJKCgUN@7Ot*@MBx6`7dht- ziOP*CKNCWF0jr}$h*p7zV+Cr&jTy*S$9uz%^Oj_%mg-kwS0C8}beSleCr7sj{&$Ip z`Dj$;6Z;JO=TxUi#kOzjUUa#heUWsDpD&&z-)QohJm!#+=`e$y#!dzN6{2Z@!c$l> zGXGN$n@;C+6f2+zo0?=w63JdmDXUZdR8&ya)F30O$kBiJ(&4TfM`iEVph(xHn`|7E zc~5b^tZMOyabL=#iEDCcmqGuuk~B4y`gSH3Y(8FgIO$!9j0_9HGOkDOjJaKRf$K;n z_GeTk+^FkUfw2PI@jt&X_E&g^5e-0;7KhbDqCPyiyuDXhoWlR-Q+swGOLd`$jg6@wCQ4Ra@JA(9_`}?K0!vEN&93*HmjK4O_OP zE}{5jNv59(>DH1Y*}mC28~hAtD}pZRG1)=y+OriS*Rj&F%L#7lfev zqG+!#E-j6n|K6HsC&h^E4x=;l=|%b5dyp=RR7U6b+MRm4zu1lG4QjmBsD>#yx<1#f z?b`gLJ+umvjtXli+Ej|veDlfbgMQUV#cl>xMn$~x@!#uQa$M&y1C82Ay+?@Iz#I5+ zwC>IvQ4qwe~WeyEZl1(^X*&gzHy3A z4-*|?D1Q9KJBBZ};7msMSNc=}xzEV3HSgF}Jbzq>&_fy`6>V=s`OLh3%F3y<((6hB z_2x%{?yF`gx)Up313mepY@UUlucHKMYc4j zcGe@UG;u`*34dKdnDU1-o94o@)g*rEWZPK@u#?!^I)ZAiBANJeeCUYlLM2^A8GLjf zMzBAPECkAjb#NwrSSNYk-1(9m65TL7$SYmoG(@$m_G}hVFwB&^0Ub&U@9(gTCj>18 z_Ud^_pgM-I>mPiAz<<<@Pjc>#`+i2%H@zm!E3H_xHpG#uVJ3k+pu^eQt)RnfKS!rC z!M&g5$VLzZbS?$YH^y=>D*uECNjMe+D-bTk)xf0#FvsM9*h9eAQpyqqz*2Oc=kieb zuLlSy+Gx@oQfxppi6b`7Ncv&S>giHJC-z#D>r4zp>j?wi9sRqaZZu>9a2mOtP%>xW zqzbuyTD(q_^;jXjpj`AKV2&FOfIEq0Og*v@zOx34`oW%IH zA3t$wbjB-Ap_zMU`*|s@t@}l|R;FgI$(Q7xLp&P{nwW?i6PbM#xq%v@<#B50IX*AY zALuT&#;k|%aUciyT8ZL|sqeo>M;jjwadC1om4>&kCoz{j%+GIlIJWL(suDTejzc@L z$66BcIU5NP-bG7fox(8MTm$9WwcdcT#a6p@=m5i){#aj|N% z9l%5d9~v>T)kuS5DG9)NiA#mQgTfewJiC1LA_z*LK=CUcSf?}SZA6C$5tkCH_x7o@ z%TQ+{$+Az6niANqR zCVWWXu&KH(9ZJG*l&JeX*Y*#Zp~J+DVmw9p^)Wdj+5wKhPnpM?yAc2cNj^dgP(+Cx zHRD-G1V{u-W5lTqsn><+A19Hr8>l14`68w}5EVW<5rVwB0ZkDED7PTL{srZ0T!wlq zw|nJ0KST_Wm#pw38j}<66K1N{n2c?TKQX=$&-VrnjJSAgZ>=Wncv20w)^8F=#XF4TNI@yl1=o&A1u zZMgA%llTua?RMi6Ux;f^t z{IM?}R-w6?r{0V3KsbGXW8Sbv{vy6+Kn+*8;odAU=25CAo^bEkv6D-pSg>8zH?LY^ zvxI;F!dP=p9~>hvjM7BcQV3$N@$&vFXSVjI~11c60S@&x=GWaQKRB&{+mCw#17JuTAG`s9G8hQ z&&lyHCztN4lXXX-=;zF z$Fx4_aMtcJ1E^w%B-%k$qIw5Uao(*CO5gT(Ja#<$rKMjly&h36LLt0`#H#Pt&$n(* z>_}5QiGIC^dzCILUItrJ=JBE65kz)v)k_GQq-14h!4SBtKTUt+7n^W}ARDqBU%h?1 zS(Ht?cbsk~hk-c)rzLkz1OLXnm@iHKj2cuZxY=04R8ul-R612HoZ$b&pk#b?uNVzk z!m|8rDv|QU&=sjGRt|U`!vMD1xET%ol=W_KOAVhzPrsA4c@ zls>IwQYF2HfAPGQ5GC7i5#ho%SZ)*L+0O)6%1zyUWv#!33|hj-${WO~=K0i(;D6Kh;VY#nFJpNHNO&U zUmI_H9vcbHrS0mpZbo?~gf;*>n`Cp0jAby#a{&Ze|i*jS6kHxA0==4dHssc-KV zZdI(o)?O$*FsdOF>uK4KUNM*ug8&Gfe znhjnS<^wrV>bsqXci(Arb3SzNU@#iIK}`wY>KLf`b)_t= zb2On!+JA)*?bh{=S)eHihpYX?kS~9s8YK2MlrsLGy5)`J*q1I|2VI<<&H63Q+$!T* zlgZ-=BeEv0!860UYvBDi_W1-Xeq*1C19q9Tma&JZn`vwc_b(Yvr9-CthN8~<2Rk3g zdotk`q`Hn?r|;;LNXwVw#d3^Ww;M)ZBO= zLhfU+#@o&>Ak!N3X79WbYvXxLJAh$4!+7j>um{}n$u&E5>ftkHC%M#8lRtzDZp>UR zp^;tuG{o1~l}(~NkK12qKd#=?7sqDRppUrn^uAMaX)@sii8u63J)CNOJlwL#fzhBq zG)mVDsXVEjquL7(V(CdA@|J+j0E@qh_Bi9t- zp~b5fUL;KR|(Y^#O#|o&Mmc|^E9RE^+be!3n7Ea6A+oPy`H4 z&0Q>WyI^R*FW#BRM8F5?Y5PEU1_;XciD!;_8Nf4;o;fDd4jMbw)1zdI&|Nh*Y?^;# zJ+Zu3!@*@-r3PFF$M~|ENoc$Ot*AmMT^e1%B*&QCq#f3H9$tsq3_J-iq@3M0NyLnN z+@C!Ti9MhUnpe2+cI-^e&Rc8AD-K|A-Yig>$D=X|u#jP=>>kF=U+?!VWfxri0DUyD zZ;+@^XEb>k9`XldN~7ykSxh2_&Ss?eugI-s$P%YMDsr#sj1$>qi^u8{f$2e5qJP>K z?-Z8QPb&$cXMXeuJWFaE#C;urd1tl>-M!{EcG#>fjf25jeGd^ZYT*H<1q=dLFh*-| zuA7cL${==NLb=)muOzaZK=ZOHy}6UA?7}x|Z*%1hh-T4=Hte1wm(o#2ZU6PdYL=*v z*SqOTgDf2$$Da4^Z&kP4($iOD2?J2#%yWu=Ee}Zkn*Mf5TwCj7 zuJMgk=J8C#N`c6oY`&>I=U&X~X#7ybRud-sJeHoUNrf6aXPbG|(d$t(6&~S6Yc!&Vac zc}*FF!voGq?<3Cgwf@Nzr2~k&9hdgqgs1SI(*qxGF3nfdA;iOn``(I5{dtD7I_5g! z=FCcy8PB@)mYYvL9v)>D+xBr@=UC(WYY$Ro=35Dw8a_{xOG)@uyH4H?-(~Hz&mgR3 zZ`rp~LXKitEwO)I;51O5duziPSG!eauW5;iFDOmS-LPU+`_A&>!Fw66$yWy{1t@PJUDzgw3v~PErYA>jE&9um+Y}0ZM=DSraa1e zK2e;a$Exy-`F4;SUk`;Ha5uEoULmRXC-&;BOy%^63`nZ9lERWbU8GFxYk|c>u1kY> z;V7BEu))T6GQ{foRezJ5nqaMb)BacOoT-ykv01+89r;haI5)sw77HTLPEXn>6)x^iK#{o-RcjK8o8W_myMi>-I zg;fw-26LMzY1Y(n3I1~YbXiNmht+n{gY%;wXhNh-aK1U~O?#-g$T4`C?xgHS%`T=& z{Nkc)jZu~iOIsN8DOji-U0q}Brwng&#OA*F8BXLuVuqn|lgW$CFrM!%dCAUtYp|ib z66K{=fbkL4>uL}t5}te_xJYQ>2nxmQi{XNro}Cpgscki=T3q%sZVB!`PG9-<`Bvn+c$d*!lerhC*Id&! z#gfgc-U1DDL^9KZ2X;?rjT&?q24d|lI^z=F~s2->M~QxdV1Ulnn-fmQFE3IVG*_~gJGo=wR$O35vj$l!1E*~wJ7Q5y-kmRVpZ4951a)@>!5 z@;$=@=dqLm739>nw0Ps352)(9n{;~TmRo#}BHq|oS)~Zy6&9#gF=KO*-0>-M_no?g zKE~J|nB1f!Rg$hjT>NfKhjN<;IY)}MI;{K_S9^jm3Sy;uV+R~(>iWAukHpKG09Y{I z18BxE3L_%+XXfoUdT=kGoeV}MR9ZqFIz)?oIvhtX)Ir9KW+IMaEavUkF4)-IoIeG< z^bmJe2YupqBp1H?pr@3yiHra$fzkcYl23arGkw*fmz2q&4^qWeyTwiW+>a8jR?_e6 zJMKHvhxQ=t;p*5Yp2hu$d5kqrDw~+kd;t_iGitX`1x*%28q|=&^ z5?7VBW?#Y1t68#P^<`p7G?rlezC;5@Vj`&esSXim3Uqyy=~P-jef4XTKFvwwJPm_Z zt@i=7*&u&d?)wUx;I>O|MW|_@cR!pIA@c`1%v;spB7I+CIO3;g)}pkH&Wv$@066RZ zdi5QeYh=%Lzw!F1kJVDD?5%-*th)e8frH>fHjyG`L-3phnqM(kG9A&*{{++lDlM1} z@Bmi-`E$O0{#dRaVgmBCQd*A;Ph8v4?&9j&UOw>`S~U1`cdV(*o>tC?)wEoDUXfOW z)(P+s#Ja{IyonT@oE<3H?H$@|MUrKUrzg|z`uhG1?BYZVEs|{xah(mOu`$u~xkkRE zbgXp&=pxauiXv~``PLglBZz&lfnE#0VUuFas$$gKD)cWz`V`cm5VBxpt`}7kar^~S zI~0~1tSXfbR0Ir|T9}&F37>`U0#SSg^QUt4+GoEocGs`BI&h57o2f)S^k{~wZjPON zo+5%yrV2QR?;uC=VUuuRA4OS+_(+IfrBXtJ8Pu9y@_;(^$ zCLD!XSoCGZ13L)`gXY25{^vbz#$6o{IRyg-{U~MDaPw#%y}hcwP=5D`2_j9p?8>j# zXbB^F)4Ak4)RBB%DR}>z`}#nOuk{PZwC_KF)?yQ&L1L&NN*m6st}OGV@Ohfh)jhrU zEAmtJovoJ~|GPVPFN#Rxz9vtlb#PRe^_6wxyvJ1EnUZ)X;J%Z)@)#+cs#L7!O;Xw(gHi4+`Qu9=0eryUg64U8+&=l>V3Pb&2w4@u%kEN)iR* zWwv6#D2|5hOl9v~Dyp;e^;O&21bw_WdgTPg33%L08E7RQ_GHhau_i2vry}}WySnNd zzC&lRq0?xu9;bmYh2J-QRzInh+G4}6Z-3cXN&j(3!Hy9eSNrVGBHQEqJ)d`a)l!GX zI$mCrRK_!qgS^L%^BQ;*W-J;kjKwNrDzER*{PsY^=lAsZe2c|cnf{BEu)6;LQH!>v zBWQ6w&Koyo`(u7;j^6F*{Vu+?Z#RtM;8g$r$!lvj{t}pHm9QD#(=2qrsv$v*ZY0_! z_@_sm?7SKKb4rp(0?W1b`wY^={1@f~0CZQI0@!{uEvKx7QfouOVl=n6{fe$&5 zCBk-K$yFptH>aB)(nW^rvF8os5Z5W4=6TIpbueXbm(X*oM@kS~MVoVVGb=&z5jL~P~b7Ey8Oj=1= zCYdJYw+63wP}c*dxN`OC<4PI87Z^zS`dolp0kF^aLcGcqzY_Z{JcykDs2OLSz4`%%6DgXb-lh{mR(M^hP5UedrsZCk~1D|&p z0{pfhBmHmBxL@$%@3L(e+KGlT?cZV0lY>$$6VJakhVlf1yG`zbataCzWj*5ETP*73 ztAjhXDNHl|%ZoAOQ*m(_jhc^4R$5iOpO~m`YPzYya$8uOHuiT7UKRqsMzVzb zE0=ZTBS($^(TP9Nn)QaaXP>!o?u|}}YC+_pYMa(eMpl-svEaTQ>OG}XkGwYoTAS42`SVOZM@yfApDW! z=4f&Jz$ANyhx-DI5z|XSE$Mia4=$Oamr}%_V(t1LI^56eZy>unuPWSYRBq34&R`Duy3;AWT zk)zJbhz_^MT}@lv@O5DSo_g4x?|M4IuX8<#{$TIOCDIcIHy9Xz*}-k&5@|N3d~(E> zCE(KF*st{1-&txSHpvB0{qQl}_RPtDAGT>Lm;SUI)R*APn)m};d4j9~&+!1p>buzR z-OyPZIS53+{kmr#pAlt*`L)mQ<&;Qvy+LA8_2nepO;AxdwTQI~Ah!O^)v84cOAx;hd2k&0aZfdrT}Ub&&=Ph$*)sRHA1sD?WL zft`O46M(|T<%80fbD}0x(`tpkA>e>m7%;4JN}(bhszVUt$YWd9m4v zlR}0Vnqbr>y1kGiX$s(Azn_m{N_M~1xjO4oCRkPamA|rn35&szm~`ngGOdZ!t>{r;RdabE zE8Lgi>fB&N{j#AI#6NN+eYrhk1&z)gYxSBMYR*sIRCmGC_AQuf?`XUqMEbr>xK9c?IV|(wibQLPNKSvjNtnL18#KqQfJc>I?$rkvNdpM|K!y0 z>Mxs77rANgJ&di?B>GO?g{qqAM;}I-M8uu|r@Qm&>sRadGMc}9H+Sm3(4Bn9?9|lS=He#En*KNiz>0{h)hMQsV7l9#LF$6-74PcU-wOSDCmlU7U&AhKD@#Ih@0OJv^^b0L_?4c9ysv! zW`|8@&C?;FC;t3pn^vx7^WqMEk&Guhu3mIdaZqs;>qv>hDS!Ve8*j#v8nA8<@+X`) z+R>e9lyW?eT7<`FDEHUg+L*QqGVfbR8*D)W%Xz~;}>kiF{6I>4q?(&T;fIni=;64T5R&+jb>Gy&_7lkw4e zPhf|h{6yf-;uC!SC`=3Abvs!+##6xg&mvcw7EGrR1R?+Md8_dN4u_# zHpVhqeL-}TLKsHe0SM6{rJIflE(&(M+8X|qF}eU03rGc#G=$c6B>rB-sp98$IQ4*l zJX@aqJh3oZ#NNZgMv_2OF};aI$Z|OZtriwZ-(`;H_HDRvU3k@``;*t2AQ)55j~OrX zCmXaV_e|za{y2<__S0W{X?QN6P^$%w4s{-+@de8Z%|I;x5cqUObZLl3;#u}!fNyA?tKA0ZOldrZpM_WmVp?5T*1 z1@ZBN^R3l=bjaC-vsMxgl={QjgncY{O3e27{njbSa`CO;pQ{gBzqUc@Ow!d}^X+va zw1qXPgm#RM7SR%xRs84 z1a##@1BoEZYpB9t6ZjE0Ff|XhgU>UG^=8Lh&sA>S6h-n55_1e#K|UUDv(QyHz&o9v>iY0@cV6Op={peKSn&i5r43yd6q*?5fQ82s8Aug zi86HXOw*tTa2C(ON|O5mAuX6dtf2_{!nUcJUjyB|#Tu>7E{H%C{uJ%xerR#=C|ODi+|}dk+JD!Y5Qzs@N7ZcPUgH?^)1b=<)XfQKK8uF* zGcLwR-?v5YT{Y1n&xS}@=2-BT^-La+nAZ{|HO6alaFiK9w9Y|^d%+`~$xJK0F+c^u zKp}+(L16+>1)dn=OZCL1lYrnfZ+6stEv>f`cCM&-`Z0saBI|lK7lA-Sg<6fM4Vd3{ zbI}B-T$H#VHoh-Omx$1X&QL@9ap{j==_Ye*C42UmDccePZJC#2%U*gAVTy5Ky=D4d$-0?g=3oBQE`eTWD1r(6B>|i zUaQDF1zqj?0FIw6Sw~YIpoaRryl|&OB_!`SKzBvF=y5Zzry}x1$HoejM?X>*;w^^D zdbV7*j8N^d++d%qk-@Y+A$qAno!$l2DZ+n`^ECdJ?EjQJ+W&rd52RS5R5uGSZ1GDFq!FL%DnTiCo;i0=XLKi@1? zPd=U__EhYXp)vb<5!&Lny4d$P;+2;5WBuc>N}LTc)J^GzvT&@sl>VUG7iIKjT6&G} znYSh;N*&^gxY>VCb|=U_9OD@3@edCJ(7@39ZB#EmyH|y8*tGR4m~bK@H`#y1QzNB+ zY90bD=o`?_5kjbm|1l1p<3$||3MgbEbR|?TQNCdpe(YxEz#KOslhHqVN~ynN2A1I#qo!+@{hp$x`@{aE?{6h)g!Re%W#9FH;1-ALi@I~`p8YHLrBmznl8@~q<9hZo_T#w!S-#;YQEK8da<`g%lLuekGN z33Eomybr17D-F(J5O7G5CUWO0zd+*RSLGifaOnUi^rz983V*#$>O=*c{}L}EVz32e zQoTfqv~As14Q~vW8}UKksoQ|Yn+nU8e7(~ANS2?>VyVz7)FN&$@;I+q>>e2j-d*B8 zPweP5E2|9d-C}F?$|_Got!t#c;4f~vb<>yxO*oXXs7vkN9{}N_$&ButMlcN=3EN#e zr9Y59eMw5bir+@|J}cQoi$ zMEaVZ6$@>fKpzAHg@>wdP*e5! z-)?XYR8kv^9GI{zHZyzt^yB(}wn&L70VF}gVe6UmdwPsEmlJZ3=g1khzj5$p2YxjC zhn_6&rw}UcTA)8mC=V0jdM_X%dQrsx6slAxXN$tJ61er`Vf9bfInTWUcehf ztK<6*VN!sLY< zOzhcNyIKgZEnX5c+kKOP2(~L(*a<5(->y;-%Kh#$m0D8+N3(rhG-Ph# zSJGYSt}c3X@U55-NYBlyv0dPs_G|*ULAt*IB+_y09C;O38Nk zTRjhFv^vBZN`#I?d;Csc}aL{6r(9bwuNOP}%j0DnTZ2EBZ*Y7?GtmgId{dV8G zP>eE2X*Y)qh~UIGlF`eUur4JPqa5W)3bW<@a8ED2kG228q;7?=ORN=?|M=mk;?2lO zPw{87+%PkfKu}CRc=8(VD-jmL*r>$kunQ2@AgHLDK9Isco=t=H@F}q8V2OV`qh*n4 z+b3~qBINTC?u1}&za3aVq8Z5b?g_ISUtdV8;kt;fa_nbNMO}LKxx1SVTkhSvcllaK zzrBTxQv`!LUS9NS1%+!F_yPdzhw`ielj0$OLsQrgd{0M zL+aDx7(V_^!@0|j{M+I(cvYEtB(llxdGj+J{fjyucD)A!>ft3#mP zLpsvbtII;)H0YCJ_&Gd?-q%g=9Ax}`jE`sC^)3s?itA1cWNnN6t6nv4yd-zn1?y@B zP&1~MGha^AsfF6d#X#_Z!2C@LG!3BX5i;-I6UnqVH(p0v2A|!^81P|LL-bv+&^>Rm zf2r-PA|;z9#aULEBqNZgjw5#=RmR`Y5%G@vCS#08)(qN`kB%|wjb!VKQ-<81p~UAQ z@Alov&K0-fHjt)x*sXH@+z9{t%d$je_@D>r_oCpXAMe&=?FlA1zQLqx zTUp78Gq0YLqJ$V2iTTGQl~J1oyXR3{F{&<{jnr;*7TkTG6NlI%`t_}>0G=60tElAa zHC)KGbhH|n@k-Emg~#yW*=U3JX{?mEi;@|9<#DK;@9(mcF5YtC1x-U?&e1rV`eSdb zZHn)WmFApoB?*^j)BVD$N~PaKjbs4Ti_dCo>W}ys9jSAKia2~=)wjEI^RRm9k}6qI zXk(GK1-pX#^U*TkXH4*wuum-Rb{=Etqq=lCEgae_ub}Tno6-EaVh1 z98CF?+T8uezUq7*Ncf0gXVTGBV{^ObC`YEpC zss&^7$O^1XL@Gd+Yc81_WLadj-W@|#qiX?~Y~L4f`p(|c?@6LcZ`cxuR1nmU!%7p8 z1a(oz@e(6jTE5nW;=0|0B`X)1J4axCL$pXJT{i-jWZg=ycM#t{_sXA5HLdVEJswuT zZLH;7gXFeH44y(MQbL69n4bpOeqo@hx;lTu9e?St#_;wAYP#TRoXXn0xcoC;v=^*R zqEba#KsJ3^gZxH}7Ebt$P-vs++_9{9=>-P|W8->t;dF1`z@e=$S~Y8^A}h?R!m@4A zV2$eL=B8XJ>nV^>!AA3;rv1lpGe7OsaLT<0&#lpK1n>R<#lK%S`22FQss=V~??8f= z3DKyLPRhc0v9>$YO$eI%%Z0jKi9Y@l*W`<6<;L+PH|7 z4U${!u?~cdVX<@B!A%!Lv}AX@yCyI0z5HI-TrFhdI$w79h5$bO%NXE~&dapm1%Yy- zBWpUOgKwFn=CZI=duBGRws$S`ZP%5uq+e57zfK{u<3r_fSH(;LvH2I>J{(AGtopub*5rV9-$rEi)+x?dMxozIk$)SR46 zviHwv@`V6@4|kpq=W~iMH!~A_=D>Oj;}P&+0yCYSo9hRk?)N@LqFpp$>wavola=F; zO~GY5G%s;>=iW}X_#!>LAA{2gManLo6S0GV1p8J8aVXJn)I|iB@-l^_%Q9SYu5T&K z_HVZnM&5UeJt}XhndWV2EnB-k675kJpS&;YdS_Fx#cK85&PYpv6%1F@x^BR*%BC;i>L- zCl!%dZ_>5PANZ-S3lrJ^b5?3&Zx(t#z97!BXhenVzx^C)HbP`D>(IK+tQc0T#7{Rw z*@*|uwR+&vVW5DRoy_MPR_4?$G8vQbylB3Q`KmTb)B;Kq^df15h2N+HTY+`TK?y>AQE~p_}D!!Ej2dE(6?D2NYX%2=n z5ekpM&%cghS%3TXc>QuRiqI!1{O1JP{e67JsV~{Rk~?(h*+636`cn<1Y&Sc$2CKHSW+DSWpu>nMlVbZQCgoeTvDi(C-uw6O^MzeSHwWX=hfI^P!$P(X#y1x6 z5=r;4J3>o{g<;ovBwQx!61`jW4A|_cF~=r-lPZ%|F9;h$f2joSx|7En#%aUS?fU*| z9?NOsBa@~?)Yyz&S3Y$1_<BC{ zW6aPj=oYQgn#y1lJ!)hPdi)N!R3K@7y-54-=p9BR&y+MeDgm+LQqD$n0v!n=y+H(XZ|xkJ=>JxPt49@tOP`%f1tzW;vx79^%vO|obyDCJD#d&SZw;IZu^ z?b!34-{r{~)JdVg4%YYHP~!f1>2TaL9{YFa+}&FOI>7Ebyzl$=S^Kt%MAoMLTKSJ? z5%uVZcg+JONMvWim69b$H0$hgQ-xW`fv8Nr|Q=7I65-M&K;Dk)azLtE84y$9{$Bd zi5qniV^@xH$TOiAjcs$}^U{3ALYI}(QIq)oiii`8{eNS!A7Z+T1Zr~rhezckQFCM-#xVyKI8fUQK>U19h(fTMT zl&uI!PyDhFLVsrDkFJkOkjnawn%Rbc4lUVVK%PLi*oWTzx_1Y{An7YN41|~nR-d4w z5N%@wg8Ot21ppze=o;vYII@S(D?;0JpMFFkM*1Mzkx2B7FZ(IsKeqgy&R61kxuK8T zR12OMl%T78Y$g4zh)x}-YPobAjL{O*X#Eg}r9U0#QdGNh!IU&*XWJc}e{f|zbxK`26$X_64l zl;fR&D`gz=gDoQ%=TTS-Q_mmRyJ43(5R420*<{eOU8S0GZ)J9DaozpxjsTy_dn`4A z9HglfiLQdlRmEL)tt2oHX5-?d;2-Dz8$11WCC><#`mo9WE<;Dg%FaEC>c?isR}(?92PPG#n~ zpZmVQ*V;uQWY8FU#E7wnvhWXJCnlGYSgucgMP8&tnectX)d^5pU!Ght>l8;3zX_xE z7OEG_XPN;l{lP%7di2U}CfkdwU#w2{XEBz^MVh`EpDa|dn_b*f+R|xnw^&J9!xG~s!vj}f`K94(_{@AhW83)vJ3D@x7@byw< zBpl_ej3)LU57*zFo410Y_+@keDX~0TC#m{PVtdL{{hfCYm`-rQN~##8mi<%2M>3IQ zar|cRHrd7PPu;hnHwN%xUDk!-_OP!Ff9VN`-S!Dm#AO3h3X=`2MM*WXE?XW#PMagX z+wdquW*XftD;b1PO;nB6c3bI4O4#wTx*FM67+jRAC+fdyHi*gAU~c^G@jw8_x)Fb8 z%E!f5SJ_7$-UBNL@{MJN1Qo%+n*%H2I0VA{2$W!A|=XvtVoMD0_j zGb?2Wte)q*`hb+AjZ_`0>q`aFC}G)g>o>K=4f*6C!D;ej^ojV!dzu1t1c=|S=Orb` zEy|hvSLyCiGT9y?UARkNmj_E#x&PMZ6)!(GtggGTr3{dNx&op!&!+_I|6IWZ&Fvi$K(#sS)-UR3XYgvxBXa0Me( ze2Z96-iswamk-rXPXcE|lsMn2SGe>m*nQH|eIqya8^)s0nlnQD+Ob#m35eZj0OQu!hM25XaqxIz#P2pmyGKf zg6hu9)#C*G-deC2aO^W+Y(&q4-Y;8-Pk|U#Aa}ey8T=9vHGpA{q@2{tPyS~G|0kFa z7hFNuKcV=N+`0Y_0(@X&=*!iE0B?zZMOKGmbe(W75ZSC{G9^myJZ%9_qNPe};ikgI z%h0fa5ZBgQraI3C)~sUbH^I6WfTGEmhrlF$p-|^_FUbs}7Zf4;uw|5|#={cIvtBYT z4VGY}ngEg#0-hUuxOJ3{ITIogd?qLxX!ZoPW+gMrJf@?QH;f%iyF;7v1;`FYMWOYbe&uG06;Sk(Iq=j#zk?wfAKN-7 z9p{6fJz{Z8D_!jsJ5cxY;LUY(K)a}l1^G+H5kg#2SW=}!p=lhjU(!keE>1woVh$rq zuaGENnVAss;qf4+09oq>$&Uf~>V_SJaDjH^zV5@(7`Z6z_=vYbP*$m-6MG{urVy&k zR4K?=Gh75ig0fmD9c3kD{15UFfPB*&cxWO)$3Aho7 zaJu&PQ~7%RfFe--h(L~$^%*VfWg*o>n@V?g_dbW$KHT1A@upcL2*IjenAt3w*|%DP z@|ej)Dh-A<+yi&qN;k;px?Jh=mh2WO|?6B z&L-A&o;?V`#18BD<~>koEi574a4ZaSo9*-6Utn?Z*M=pc=@ggz#K3i7`+mUSdUnUj z^6zfT6A*y7Wd%QBtwtI!!h;l}ts;3~janMG5WheqjO;xctFExe-WZM;la*AR+t{&? zTzqwH(PB;xNDPsqBX8;}U95o5eY-L~7ERmo`w9H@;r+|J2;bqSAjklIrCO0pI$a^7 za-z||At3)_s#R4N>D0p&XN0r!@TuSd4KU9Mtg=*tPQ;#i>YIvRLaISNy-QD_w^36P?Iy~ChOmke{pX2I@S_4C;UF+WkrG%~VE82%x88jmRNgVt) z;n5?bi(dMQQ~}R7ue{vc?noY3!m+Zi20IjX;;o&d=wTy5T$CBTY~l34{**9IYz$Z? ztG89;{d3Qj`U(c5;xj1<2na*>23ShNv*jiT!HSt0KztX^7lrEb{|unfB%8&8cLZ@) z^KZpifa*FJnMyzWoCzwYNvhpvmCelzzCmj!UK%jr@*vL(jFPz|RGx|{OTuxE&@GL| z-+!h2!GH|*jlBGaP*%ui!WM%7hO?z&6>N~NNXdVJFv{(Os#P`OCMcTE@w0vLxrF|0 zw-eXgklvjm7Elxfll3TWHd1i6|K`o1$yvxcGHs9u@S65fdfq^12vO;d%67y$q z9Yj(TIQ6F_?0wd>a8eZ7G1_}CwIE#l;W zjS=er8OQLqWLzWioWrU-plpCG85vp?hjbEcB{zSP`RAJ78Hn@100QNaJp$lSuI0g569gZF&_n>i-Me?63ZGfN0`D=P zBXFl-u}`n7u~BOSnV7yGk7^TCs|nzZfv3X+0-XV|jO%R;sj?a1Qcp{KXC9OAf)wPv%No*1B?CeM#2JQVBj$S62*HL zanivJ8Lof=!EI)&g<}D_-qp4EWHK5djY4I+26*3Wi?aL10@bSbr1nF9QhtSyc>vt3 z=pI^5-E4hg;>{5WJ0itPJhr;dFn!azLH&78bVtRdT?ekj?dYsIlb_}sVA4x642fi` zBwtyz!6f080V1LcTBFt!ov@C&_f^SwoEL)>d>)HHa%yQD*wC)+h|?(nXjf=QDoSg5cOJGeS!ay=;a2xtT%hrnnU%s*)@L?PQScUXvr7Jx}j=a z2!;?7gbG~bo`QS!>*(kR8+?f66%vx!zxq(%ZK#ALwRkqN1|UZ7+-p> zZB1YcT-(@!VJ;#r9qaXZ7#&O+d^tyMtqDa>TEkpxQAlrLr21Eo;Do+JRtYb zYD=)i$i4^bJ4yD(p|~O3l~4WS#lC?lsp`>2YRY7&={QLn}RetZsVkfD>Y z`M(OCm!PeQ-UGvpQWz`QW6EXJ{KiB9xAZV-VflHMA>b-6v8h`(gLh^&XFQnUL&QTcXHiFZQ!zv+I>hsJK3`Xpurmi9s|?~RAVoe@H{^Jv8HTC`uJCu zV$*aQ-m)xNQTm^w31&?dgzduMsXF`QjLy5ZwwRsKw~uUcmxc=S{eTPMIsJFbmQzRD z@)0j>tyYc0CI;J&madJMNNK2Gv{Ia8afKZtpy!s;O&S8Vh zW4vm#`8VNw`HOaa<_7n(;+MxYRrM>CcbB(F0S+`M(Vi^;DXe{83UTHcVZTiEx3m86 zOG97>X`J-Qi?@*VTWqwoUDJG!+`2%G4Qm-jX30>UT>&=?0gJe}wY0U>_NwLk_l$Cq zaAza($;^sf1Ym_(kGr{E*don1zVxz%@uEZ37&8Lj-@lh({iP!u0Wv}%%VPN^_Z^k3 z>l$puqYJ>dO-pk1+jsb^Zt{QLl+hj=iuP^;rIhrvHp3^zpV^$^L&QD0S@S zELg0k&tr7sWTMs!l5-o{^^Tc7Y$p;8qNk@W*%OAHzCiTvKoIqYdI*9?h>J{bqtO7j zHlL34oK+TP{ft=MhoX_O#Nct~1s#X;)bbObU7C4u!1p zM+y(o*qU{CWFYnIk;}98Tu+w|>vn=UwG!ZfK^|wxUeVMOTD9buyLV4p+1l8oruoF0 zQ6cd@H{CEdeN6AFbhT@^?#-adb79pjCf;Qt0iTD`lnTFu-f+d7_e84@bnK{? zNa{I8QD^^695`Jb9~stq@|!niTUgR=QcSa4&=jnw>T6anQySG6ldW?{?Vq06w6L_I zB8t(YlZz<0FVPlK#=)>i%neIO&M9^ZNA{lec0Pt3!L$_&SnJ7QXMkIBeVrLxl!ea- zEey16)a|kv2a(Cp4OOAR@_xc(uQh&j)Ctk5u%{rZ?D-}6N%inwlEt~{>FG)A(q?mNts`SxkZU#N^ z7B%jKsLG+Ek(@~KDSfc@V|#o3ub(&rAy9Z(K;Oug%H#f3$3ahd?GN7s{L#4NCe6jM zbfKna9V`P_L=?a6U9$Q zVFxZf9;~Wt$f^Jp*rp4s`6A z4(F%bh8-1Y_O;XZ(}sCSIr_qz#J1i2PyS6YC0jL;d>W}9L|QF`-q52NRx)~?N-!H^ zl(>j9b$lGcH{4H<2#;@q4?>+QTP9sHm;JD>+Pn7A@x|j;uW~%P`XFC@?u{A z*Xpr{3mbn!At70?it)2OS?4o=0fW{PL}vOf&xu?VOt*>?IkP`qA$s!Ybt(3`VVq2H zgPDU6*>2n=D~Xj%#FDY()j7TlyA72LdL3g8YL5kodAMTs08042Jf-#QVbrhzY#FTq zri_RUN94U2Hd4M%ZFr`*s5bn(>z@^<3K3}S(j!w-Q`RS?I4sa^vHIWeMK3`-!OwvE zpNYFWqE{aYIrWACfS8{Csv6Bj*Dimq-$=<6Y8v#PKIz}}j6J4k_w#Uq_LIdzA3SNy z0NE13l$PWc_UQB#grg&u_o%LJ1^N-{mcOllE8^1HWHvfwZ<78yuJoggsXgX;B;_{} zfOf>{{Pe)s5=B48+gFvCxM9Ho1k@t7jND&G}1u&S?Ey*k`s zrR9jMdo1!_EF@8WI256Sh|3g-N zT^%PzFk&^<$JX~sUVYOURblmR%@@6t2m>O@4TK@G2TcW~|Fvr?AEH2;i{oyD=T`1BI2@I z*sU_MYWr(ffR+Tc4P`P!YowUls|QP`6j3|88>Emh))yB$%e;TL+*tb;kDDmDK=xNn$Dcn&q@;t5lW2Q27fwf%uv4wh%;@-w>8U4?xAB)T-dxfDwKFkN7)= z=Vm+S!r$o?6L!au`6?+QkwmFkjIZ}S&j^My@50Dx`l+D*16CJ?HL zqB}9$*Z0Z^e7>QwLg3Qo@K7$oXM|=AUZXQLZw3j`4bh`G(}61k(6H~NqHpij&B)HtETNEYA63LLg)#@l z`-Nd8$w{vr*ye*UNaVlahTSBLO-*ZGu!}0>j%%?EXxo|KrVGOQiVnIIr)kcHJ&L@AV z6Cr{-uq%!}FV>fklercrCfk4R15T&>f=G2X&Rk`x7w8_XvLn{1NCY8*`d0U1z&xZ( zs!Fcp92rcl(zbiSQ?>g1)2jeUL)F-L;WXE|BDM}>Xt;dtbKR#fo{s8ZC_EOor|P+1 zSVJgZ4vfkWl&3w3Fr`uH+!f)P#$jr@jlaRtD)2GHI-<>_m7GsZ0JA3lNJAW|f#oDj zvYVNf386daRZlP2-3ncJOP_ZP&^$OyR;cf)9iQtu`0-vX@$W=K%w`P=wX`pq+5iiYOs!*F0)tPesue+D~urkY%$IN03W%(xAi&%@XCYK z4d0m*dPd^d{_&558Wd{h{*US&c5Po}3V$H_@ULg!1%QU@*nX=XhnORZ{G90kc9 z9w`D>lq^co;OCy5AVRBzu0q!r@_)8}@M}ul zvMvN_+G&C9<>)0|j6yOY%QWUPz06L)?@4dczGP&=`w9RB!1^uICw6)lQhHPlE!`wp ztXgPz!0FO?2M7AMF(BEeot(l*&qPMuSQNg|v7~pK0wZ55%O{Hmk$#A+7UqgT!nBFC zy!CS4g1zYthcRDc9&Qc5B@D936)RRq-|drrCqyXdaPyqmM)OZV z@*rD%u*>Q4!EpaNqN24MXUElsuO|fPJ+BnV1EeJsB}GMLgflp$y&HQ0k&uu1Ej*$M zG~Ufi5~5#mPK=sC!Hi4KowbsrlbcL12;2$T*=c_G_5A^m%=+kl_@#`~$?zzSSzJq9 zN-mv$S8$;3sg!YimRP*I3Zs;rUA$$-4x_8ARe@(6>jPPT9jv522H(d$^+@o<5f`JN z*&`ApcVUK$j(fqKhfJ|J&uF$cQ9O@*P97Bns2Rqs6LUY21&or*dYka}Ns7HEQWJ=U zPGYYx(=AsN8++g1%uYI~70;isDImY6+VwLa$~{|MArmf+rz76xnDjvY~6q0PMJ znFI6NQj+I|KSESHUi#$mqjfsFd`?W*`uws5oCE9aWNv=MU@sX;c0iejjCQM7-wr)@ z{Nx40TVB^io`HgahHsPg>x||S%a((WcHqs0(P>f3!BR0r8;cFbO0`-}Ch78(>X%W3 znc8JcyFHKqWJ$~il)H-pp^bx{K{8YL`A@CgOPl*VZd6&uY+7grC;`^z zj0ESrtrq9bQ(<3IvS6*D)ZIP#QcKpfC~?!velc?*9UQ4%s(+Fq&NTi81QY`VFle*P0ug6+)W(iat@ z5{+BP7q_10(Qc~P?)KbSRWUgJ8C#%btdJxq!b`AQn6?Nbj4?g;Ejm-4vvbOpE^zDi z7jMK{>#~cias{U;2BY|lvJHN$5Wu%L)yxZ5e&M2nLWmZn)Ridhj;;7ZHy;^FboTL4 zEd?Y@`#p(alm9^aA`+Z$mEcfT5TY}zS&MB^nWrBdF9Q(v8Aw;rMgf3?dM8iHtz57I zaWnz~kw%Jk&Js=>;W%`*tUwB5uKewU!{brcTE2|Rx?DLxF|iXASNQqK$#$jK+aPiR z$9haAx@LcXUu&|4Fzs3?*GKbklIq-}loXUt1SK?#z z@>%4apfS}fhhg}Q399OOGE4Z`u`-E7s*>@JAZWMq)oJv>K#Y@~LuyZd_h-ha(|GN} zD$ZLbXbe?NJqS^`8ILJ5<{(?2?`}*ZFXco;lWRfa=I5V>)7t!os<%5|jUG9>dtP7v zK0W`f&P&MRI6ht@U?jKJDo+>=ZR%;73-qM=ohYr;I5kB-R!+$;O6&BGg>*!N!qW34Rr}n=ELLj#K+3XA+O$13y%PY0BI0r zxBS{{RPFd?Q+^zb`e(1Q2=CV5%||M!i5@^yEn6p({h^?x<4IZ*PZA=-=Yl>H2dk`3 z$rlJciS&wxM|267BOb>;;LD}}Xokhlkk@8p`nMS8m}?McQ->$LOz@=xQbvf=hSF)&toY|czw$g;GbC3=me#I zh2}Z#NyH@$f!U>_$zUgSe!w)IH)Pf(At~_cfdfsOnN`>1i}ceY&dOaw)g|&3f!PPB zu~7zGoYhhn*aF~w8AGgp9AYS)pL-qTVM$J|q=C%Cf~fkPZZ^KbS{S-U5&Q_wgHF%b zPJLDS35Ru}5|1nChxvXOcp>OLv{0wxpf_&v4XW{r>HdR@T79!by*54$3l^l~TB3`b zZOk2^JufFpfVYBBxq#`;W+lR8W6I{jS3|i|E0+_omJ;M8NZwY}38g8bskRW#rjQ)Z z9y#mQQ8^uxV&b{3+h^iJRj}3tEFG~fL+N3|J~cKbZTMS$RYnShWE2(_s*3y$`8&yy zW5r&g9~5UB@8b`2*`RF@SJ3GWrd3H%Epx55@x+&L?%dLO&u-ivCZ1{EjQmbUDrk3* zDM=Mab#J>FH+iaMe$7eduq{j=ffqdhiC}?4;~vxlI^ym#?<0gYI&rdd{rPhsns&q@ zjy?gRtH25Drf3z{xOOjr$*M1k`p1t`(@x4>p#o0VnGxD;3n{sHLzD4tCmZlI_QkUXsoH&M3Yo{E8wP zRAHh(eAk|Ux}Y6+;xe#m9gaQ3JS(u(Q+`d--fVS~{5Z}0DmCM@BA6hsb8;<@aJ!^Kt|3J&;Z5WSGt)Q6z__dN8sI+}|pG^zgFh ziTT3gTw_rulrk2Ps(x-vKph!`qt+B-ZEA_pPaX+Mj-Q}HuzSj*n>1015AFy^i;yC+ zI55e5Mg*!HCq43o6Y|N64wdkbOL8jqe*myF)Ob*k-nPHZsZUsD@nNp)o~%L0Y4bPm zW*e`f5=S zW%Vak*t3Et><|fXc zHJ;d>z8?)09DDfCuhD7sd6 zIR&}WW0mBI8|5E6*oj|dt$1q}+|=G@T)FvB=7h2u8yz0qKt#;9wUn{25bL#ww2%lX zBFGQri5KhD2w5u8lt|;IUlP75g`ShjfN~v&KUKlUO(p;+q5=TJ<=uy46wNcAcep{KO~ z7v=8q#S&&?4K6sonAckH?|i zKg4B&Kv5P%2~ZZ+dhXPAP$%$4v`}ZK*Swo|1z2GW`!+auL|eNqrtlZ?oV}s-Bf5R( zH+MZA9bZ9ubg>paMyH#CSaY4SoaQN$%pzAhy9&M*5o`yhLN8^4a}Ka0Z{T-#Krm_! zUjm7bj#TZB=f*QS3+Niul6$`oDLgIxzXipof#j`_kgzzRm1mLquYw-t6pBA_qcv+v z+8L^e9l5db_*ItZu%et1FJ<8sMAr$>kHxEC*~m#>feP*Jg3Gu;VIh{{PBLFro#tnQ zRFoDG#^#2XOfGs$k+((Wc%G5-V6>XjazgxXAqLS&#;u4C3r6cW>Cu_X9vERNTrn?G zg-GMBC2#_FN{$V+9zU}rwM75-^ZCFUA!w!GxXbr`%t<#kp5_@^M38wEG5$m%C2bW2 zEpFU&3!j-Wd}!l*t6ZZ`UWGAAR8ct|I*YS)ecvny#O2OB=#t<<>eG+MQ<%qB-?A4WQDf%{}OytnPnNx*# z^QzllmGOdS7{Bg(?V#L%Q>S}k_%qE#xB{&8RaPC4<&Vz*aiBqjX@iQ-2QKsEN~Y8j zN{;_#CN6$3d;Tb5XW#VB`B)uI9``o=xp8Jr?#)6Cd*5fwjAIjxmlb|DW?NH1bK&hj zM;Iq|xqN>glR@b{NZj-|ajiFN_ISkPr?=cxK?Ym%N<*81NkMFiInBDo=%wYviGp;B zv;%C>>rf(xL~jMbh~N0)Sn#LTxNG$-MFqr@?yQV=n}-ZJwJLQo-(ZL-Ve1tiU@ z(K6(E>C*a8&8&2+|CT}8mD^}c}NE&Em ztzwu5{q_^2x2XH}sHUbBVNRUQHHsDUyi5FD$e^vC--w(i7ky3lGA$K56$*u-)zZA6k3t=(fWOC5kipMr z1v(-4gVICO>@Et$%7FZT=w{9bcovHLhNiv_3U%u-3U&7(3N>wtLOrNMp#s=YsQwoy z)VXC8ic|L2abh;=(1j|k3u=Zwqu-lvdl-y7+5B51RoVRHQpU5Yp{Cl$j)NcKj2vsU zorGm;9y_r_n>oApnr1qA#9^u3BzZK+*k_N}Gw`ab@_xMI9N_R>^YgP0&yJV9dwb_x z?Bfpng7Lrp1t?>qx7dvT5@Ks zE9I;|U8!-sbLXcXzR>AV^Y(nEoaZ7vYN~!ATf@brtn}^V&`{WqA8shsn>SBq`+XBK zil3Za<7T5FLFqn~3)vu!lsSHvb)UF!`7-(Yr}ANqKN_fub+cXEnfSyh_!Z=K&+JS8P9Jw00MVp{9WJQ1+2^C&&N%yHMG!b0uJ6>5Rg zr>p!noOjpH|2>x`VO^22b~;7Nb?hartlM}S{G+u|m&y|7<@5f(MZK3tBkJqrT}N@0 z5>2b2EQy#8IMQF!Q77}^okuFIqk8OLpZ~jlezv0V#|N%B0i7${R!x8R{~U|H;4vAv zSpx4_Y1KL3pLu)Zn~~DiRM>+Hys!TJXf!&O^Kp21x;yDqsn7d%8+xt;a@31^D^{+b zt1lX@k1wp}RaPEFdCYYmgQtmYpBd=yw;jkMNzta<+GAk!Z6IN0p^tj&Mj_lpvwxj)-p0?beYdw(ZH+XDjHh*OE-oTZb&FvW ze)$rgoy~=+%k{c)CARc!5PT;p>`_jI@YC5o>e4q@HHayv_3XYhc$JPm567c#6?fQS zl;z|e7?l~9oTV%&Eqy&T#f|K!;kX>bS<6Om+M~+9=y(47xxLc7S?ai(E@4g9A<2Z^ z{QY|-+yBS){;f{@=*ngpm1r}ptXb++u7t}*QDhlXUrI6_KUTea_bv<0cqpV)Kqtc4 z%}v*9jW>kgEc`*Uc*qRD^J{773VQ?fYzmx?*{!wN(g%8EWMtL38^4#wj5Y$5;6lJV z9~uuOcsE)yyF6e+pa1>oMycH)xFD}Qmlz@lWw68U%ra@Xq&cMjYG*wbLVzPCDmOCN zR{QL!-)y`rycq0{;?lL&oo{8OQ3UsO=g^(LkVly)`43A*70;+90$c)s81(y>@UOD)d zsu4e2p+R<{5iR!5pFc*2vBMsXCNx;;elIBxtW)-c&n&Iq@?|W(0oFTsCvRiABg%*p zJL$WSm7go!b=yNB>p`bo&giAu8(nlwn-l)OJdNV<8MAWZ_a*~N!wF(yV(hs6NARgc z`$`$mNS#?8tu2it=qas*lVPQu(7e4zu){bR=MSF6T5J+3t8Isoohgmuf}hMd6~AB4 zg=bRs_xD9HSeZTp9^C!u2v)-u{|CiInlFO|w$ff?ZqDY>=mnc@%fYT0+o9=J_3X~~u%Meu&B_0J_|K86shO7ad# z%_4nCHkvxG0tR*B#Do0+}aoNJ&bxv zAsSJ1PIz?6Gk)$FCuMp05;Yf{j5O1x=f;>XpFTZs8L7CAX?_&T5x&;*HvWXs4Qs;W zWWtTEhlj46MlOmVY*Z9%%uJbE=$|(P@H=1bOZ*2@k43Zc*v<}D1AR?;IiU# zZ%@zMk`gVW+4Im1k!B-m-NFF{eRA)|J)?8pJUDSeSBz_^eV9k%m#w)Jy(#a;D|9GI zoB({QV1jNjqjw`G{3rS3D%*(@9e6zbRe_Wlqq%z|I5%hK*DLoo70XSlNGeHvWXJ{8qdB|xe2T@(j-S}K{(})^dcWdk! z6{cU3=2>y^+G0V%OxOASD(76U%a<>wDR(cZoNm64E_+1?w~>52>|_#;Z-B1VCWh>u z=cQ|nUw(*Uns3iu8jiF4e#7W$mrYeA99R63=i`hFb%iYPB`BO|N1!m=K77dqL8M|G0=NERJR5WySr7Y;os{%&qF17{<2F1E1RA}oa zpX(cV^g51E=(M!dn<|2Fa=MP4Y!%SCml1wYYQKg29K3w8gbq!8;$qnm^ybD!2^X3? zObvCda3HnaCb-8wbc84-L`{Ei+-TA1s&<$?1Ol+2Sw(0qg5F9?N+v>q_~ewXN__ub z*GQe{AyR#&3*{D>V?1eC)LrB`!wgE8^h=oJ9%^W4bTqZ8 zIr%6{OGnJl&x>OAroxVv3R60{x*Ce%1WdYNE96w7Jx{9=Z)W>mf-e)Ts+%I9)2l^; z_4oIe#$dIE7@}Fr0Q68|BfRf8A5{1YmX=x0bi;pkcBa<1QK-gyE5`6*X?b_@q>l-C zP(^jf-!(~daHv9^!CBQf>I_zPtt-8rmV}2-w#4>1=z>GVdJig_L`AVY8~aNkP*`EK3_dj zv~^3s@y*Gg^U&E~GY>6EaRscZ{o33VA;G$vXbeP0Q$qEcJcCDzWj&7$$M39lo$Okh z?Sc&{duueD)yhYWT2smiP0|pseU>eWTy zroiWG?FT$N%2R=pot-^Vldo+(z$%uJU%2x0>C@7ftW%$yFqq(B=b{{ql7Af*V9|fQ z?bmz770f{;7d(S&VO&^vyqTXd)15p+YFR$9)-?iB! zoS|mEJ?&gAF_i1&t%AG1=lAN1TcN(t&H`Q3;SxhvS9?%d%>TaTp={EHiY7jtVpo{Fc(l96mPu<G6r-jbbTgtrFE-SDn7&WeL@`fGMZM$Dn@xupkPGhGQMuoj)c zev$eB837bYeL=2Oq(9}G&GPGoD0TLNtt6XG&1d@P3-f!NB}V-K>o6`ZeW3)$8Z*Kx z_nSe_mzI`9G5yuwlOqUkxC);=Bm45@OKJD#iTi(UQDIZxd!_wdjXLk?GB$hj@@w5j z=WxR11g=hK*oRQ$bR2D)t$zcJ;;kvL2`A6fW%fVIsA9zI{b*eI@UXqpYVr&l&5N;R zJaK~}ssny5E-nUJRYrBqJ{j42?D`<@+VjP-a#FO&=YWs}-+kRi>c4JWhQ( zAg9u*@^WBcbK$~0C^65T2~c6l$;q#qnF;;bcAsc^!o~jhs=!AAfkgGaFW+Ujq`JBQ zlY&;;$zjtx&dz?DA?<=687Wr4Gy}k*!dm-&Wj4}qsWYc;hC@h&9Kwvu%r$5YYY!s` zH8nLhW-KhR{1P^TA|eG$mwnwR{PDd}a`y{ElNXz_qZ-15v zE%7ze_Z}5)qS_(0bbdQeBWg7zXE$7(*wCQxxzg$ElfNw6sFW zLppkT1+}$C(g%&+=X+JxYQf1pP58Af6^;OVV}6`K@oyJGxthCsWohol_WAx!1qVIKa z(#FTfXW~B5yYafErOw~m3Rz|*gAsOSEVQ(=ziw*9@jV(LW{q@bJeZX;G%-2F5<5tm z_Qq7VIHko+L*ww?6A!tk8;U){TNaheNKFbPnonlPzBClRc*7vgVGZjZD6;TJV3x0n zYg_)Tz|T#rF)?&N-Qb7M?amlxIIF;iO^)DLkdi_UhanH&P*9)&46a{x(vS&FeK&V{ z+7`ANv`Q%{sW#%q2a+5Mqmc-VqoV-z0o!E33CP!sEnDHvKVnE7agHFI*2~^~rv~jd zE{y!>`>_sbkGN2Oz0G^V4vKt8LZmvL=lq;fPuB!*)fXO%Z{N}#_J7+kt##Ttp$dA*$!c(B?D48 zfofAxKyU?r-{0nlza?(*D!8iZjKwRDLnu5RFFEk@-IAxi>6HMSR-Sql@nqL+sE2UC zJOggrxbczw9dUz~CAOWo;TW$s?iy#2GqU9QOS++jwsm5-^jCd zibeM{6a)AyEOCF)S<$mPH^%iy5Es<}@j~ zObuZ8;*TF>9@J=A8JXVRCAYe8{OIgjH-fJ1vXzTE?Lzt;3!>aAP8Fg3N2~*m8!|3{_-BrU15FmSnS_M;Ggt=~vB5o4@Jr zI~tcsi;#1t`b~SV!H2Ut1q%irwZu@^W#x2yx27)Xcp^IsYD+prxX0y0N1voqr=QXc5Pfsg}3^_{QUPgMfZXE0(kb~I!ip?AaI6+~oPid(h> z$WtQ{3V;w9VQAAG8%FsUsf;7oRH`{Crw@F3u=8x$`nl{6ttlPNURYX|<9W&w^XYct zmHEC3AF-K>&$kC4c}p7tQb%dff2Ia{QOEO57qoU}P6 zV#3T*^>|3?ycM79`bRQsW@aYn3=wNR&vY^khXflM8#C1rZ2uVmSaY=b;-=ZdaW~o5 z(=S{xw830_$0t)G0Afx7_vjOtKx*FM(j z{gd-!+XknwZLwvoI#G7Q=PHc74Ok~{rVMj&m?UZ62pj* zz&EMY>OML$=#mx!DLOrWn3`%fj1UpM;7c{(lWi?Uc8b7TsBPZMbNkF%`naj#Cma2(qxH`!?7#ANNJ1fl(_z+s zsz-W%pdoxMADvf==PJa%{lfQ5j73oRSk9+q?_pJ97%XHpo4=5-4S)Pj1C=p;*84v)-2cn>T~q7p{2r9BHxQ+=of-VD(|YfNL%u-dgoV^l&IaiS6ABhuKw(+xe;ZXPp|f7h zvC9aS;42%ZO7FXPLbky|d{s&B=Xuw=U?!=UW3y z{q_4d35t$Gj++_{?#np|UZatEx2hmDqrwjvQqBB(c~GMQ=U-n+zB66RhR#t5^wZKHK6!Gy+_I4c zfmv78U8XlBlQi4xs<;`VRVzmd^70NT4GfjKK#j8fwzLHN*!-pI^GNljKE_k2)hJ5ImmFTxm06cf46%xa7Eg3<80#bd4vv}yqR|&nAD8Ax*jbFfY0u^A&mn-^$I<)-cH(B1pWQZkF z=#2R?I0%YAqMITDaxDXASVU@dA`f|A8W`W@eCj< zR26txAf-$VDZ-T1_?W}jeyV_QLB-X|hK^FtyNDG-Re& zWA?gar9#71G+U0+_FPJi8HU!L^ zI&idPCj%IvcbkaeRPN5lfjs=~UEB;lgO6)Q+bp*8Y-MkQ=_k!c)M(bxGq1qG^J~uD zaZ9?**hdT12cv5qxL=Jei+@Tu!-~5Pehn4Xe&>mhzOVUO#Un(^ z7oRnSk`wLnq@SF4JrMG|p&_HiI`@TJMzzOW=0KN|XplY-HVv7 z2ix8DYSCu?i@$GX_FqcTpC&4B&}jv#6+V#CVtOc_sy(<>^C>c#v^!BCl{DE5Ys{hK zBT1chmxH`+j5ejGu=Lrwc2}&n^p6%~NvY6iG~cG`F@JQUg?NU4;^UW06RWSc=6X)& z80r*YK)%ldiOZN2ow5=Ai-$KjW4xRnf6ipM)-YO3+zxPL8ye8Z ze8eIN+CFH;r42vO9?ExhX|N&YipOhSKx+0YV3dM-tI8_VBr@{beiTtD-Qj6`4H z_52%qf%j1{kY3>DY~txI6Sng5o*w{emAXyVYZD0{=_I{n=bzZ#-X5AKz1=*Q!4UEc4vv7~Oz>sE=1wmDz3T;hF4WUlciVGVs?i9d$0hMV=nK0$fd0TpQ+0)637U zpvi}hEoYNsziN+{Us*;RO;%dR*VC&?pRPG42LAqT1{Mi5s9w*@$_&JC#=MC`g<2_h zKID42`8H4Z>QG{hMU=PbNJ-X9XRZn`Hdp)sy#S$bh%kF`lj3&MEbt&5#h;3>t;gN& z5hg(R#oW=hN^d(3jnV&spb%*PIRoj#g-M2~mwA)&_pn;+!O#&_OtwUUlySw{fHi0aRhsgb$NtO=)JpvnrF<(YTE^h~ah*Ct94-^kQMcdaq z*Z*9e8ObU8)^H8%Z;{F-eJLE78>a^-Aw!XIZ!Q6#9Xum^sPd+xBYt!ghzKG*W-ceL zEqW>dJmF)Y^x#Nm1mQcT$0s}I-d%??K!=X1Y)t{GWR;2P#r@H|azAqEsfK}e#5U!(4flKorzA9%Oez$@t z6}*zbf1v@p!}5slRtCcUNie7X39y>LZ<)b(xyMR{)w&NFn9~~dc1>g?nX`tRv~()- zy72Lw=Oqhot8R2bSJ2xIw!rAPy^p!^$)cYPx|ta1hb2!4JtTQ1dacjvaL9S6o&mf0 zmzGzlqzS+8IVk_2iY|GA1q^n2^3gXGxE8QFf7CBYg-nVr!{8*Bg!Sk=@cc+hj8BHtI{i226S)K0KiVE5yACB7t5ggJC zZI$;oM4)+l5Hkw9W)Go0j*NuO%7F&<$yElV(7~M8PCNMQtAF;GnzTO)riK&j8R7DE zc6U?AJq*(=)&NcOeU5ZyKd7l1f=sWsw&ZTv@m+*gssV?w9r&u_&6{VWq{0E$fQb8{ z>dox!!XYP9(KO%8;C{yrc)ofbeQ$3sQ`s}{ZBovF97IZT2zlxWYOaJRE?&0yOYlK> z*yDMVG;O@S)80cDqe<_J$jD&VQcESn-VI{0Z}H$D&lxaD*3Jd362V>Y-aa$Yr&niU zB}%E#ts4aMt>U1a)2M@G7t*4@x;Q)IhlUPxN|lSzc^ib%BLs0}`)pF#to18fA}iWMm}fU72A(zAiK06&!;H>bX~lZgJRW*ECWR0H%PSwi;XiD4GqNO48(ha@DTuAtzk8OmeJN zwv?hGb&uQ=p zRA^{u1ZQqsoZ0}k(sp}1G&jA?rJCo;=hX_!#z=Ug7CuACoad>)z9VFEer4#0Css%` z?E_;TL=0mjIk46#asN8Og@vS2i~ETtAAS6#C8P1*zrD3i$aLKXTlLVuI>o z43IAfeuIa?XO57lz!-+Nv7~5L^SM>02U0)wXHWjs%=6;$zGFx4c=n0lQ-M1DXl(Hd zk4xfBpeh5f{Z!|kBb;5shS-%QizB?jtgjpj&cKDp%i|#hM>qF{UqArInvYW1RMecN z{>+5Mfq5w5w=3G0pPwHpBZ5O?AA^if4sE;B4(QEpJsT$Lsz8Zyj0NIz!&w5u;EHwZ ztXzf&u4aP%*v1E3nbb^jYuUX%EWT6^90)%8jZUiw7eHJ(yid zWg+CVhlJmXiukF~B3{~-6ipT7=VPTM-h2`ixJpWrNfm0|@I(`y(SG9k5{lNyq*DLt@HJF6Y~Bo!25JQdG1UOVh#xNh0R0LA?SFNfrgB^-|GRWddlBFRfVY& zO{{z`8oy_uivlUV8r9fiuYUH)o5jWFcK25yxJ3p*IU3Zb1}~A(v9Z|qLMKj~I0G*Y zMgt^-pycINRM1IFOXIq)_ud_8tL+7kN!x3**>bcs==_8qQH%-;8OP^{x2SyfZ0OIQ zcRcUi1C{0c`nz+lJf_tL@uSloxz*LlWPs;wy}iA;nwU(i06SBi7#kfGbhS5Qflv;F zRbok|0CC81&_QSGtNu77%aw47Jzl+d2w|mDDE;0gS8+_>-@Q%N+G9Yc;Ii6+p8$mq znrAHfF}+W-+n0v?Qh9AiG~BSDu}WDG-?;am<#>>+gP=#Hc^zG4%T8%NK0``C88$VN zi%H#qOZy1|i=}zeYt1A7EEvG=0<|Dwd_;cD$p@t3Jo`h>Tpe>uCUbCP#KdFPt=S3| zGa4hMy-csUJ_MDuaA@gieFVqBMj^!}a4E+?9^xu_ z&~(@EqZHX_>^wamy&keFz4iYo9{~%BlSzA5LB*5fi2ULf1s=)>5eY*1`T149?Y_;i zd;dJhp?qo!CuH4h#$MivQ3tW=P@2Q-x$Y$2`ldll;ct3UtCSOOpuzzO4DWXoc|~!R z29d1RhAZ#aE>;mY{Gg|YcTD^K=ARii*PbYmLI54KZy8ahdHdAVRGhx`kDEe~;9Ax| zU5q-OcZ~vG?U%RQQW4+Wg@}W~k_3L3ZkECk)hv8NO%3DuKc5F6QL->U|H6OMjp~4U zXk&DM=pV*r>7Jfh^C2v`>FFJXuW@J8f#L)ONnJw)d=dx=@TF*lci3JixDKv5mEgLN zN!JuorXJNE0_+IT;o(C%w7g|ZnLiQ+`uH&%i9(rH*&TtX(FSDp`l=BF`-@u_$QIQk zA?nj!Rrm%7)IPaNCXhl2);?$;YwCAFxagYgwmhiWb!8a};0Zwb%vUi7LO&-9#sS)ubV69zH;(`F6{9TQ(cGX)H zu~nb=Aem@VZp!1o3!c{nK879_b8U79mW;6M^Fdq#Du2rD5W}Jhgbe`q&n*Rxr!W|e zXsZ(~qK-qVc+H0c`UC|upUTQ8s6}0~LR<4;WEDodIRjDP&!Ose^Zu@#{CnMKcIEr` zH)HOtSTv^j=0LV08IYOS)_r1Y+AnrUsDa)C-WCu}@wnRBTC>FKO~>LB5)PwOw&xfD zN%DeqZD&UUEs`wk5LAbYYA*67p`ZoUY9Q|n@dF2kuS$Z&Oihpy1nuT^46_KZ5>qDJ zye}8LJS;j*hrP6XB1vVejymYIbRbToIWUJ1z)w%1A@C5pBuIzPKYyb_cq(17wx1`wlH+t%Q*9D-%t*+<%wYZI; z-Q5;&=VQoAI|~;MCk(4U==<$XJ=J~7Ge~|@sV zLbCy+kvzRIH^&Dm#%ku|E*X-U3T?N!E-zn2Jhl%tO%JPa_v_<1N0}v|+Qjz|f`F)! zJ|=K?>vq8YdQSRYoQQ}>l5TPPx)L1yvrlNC5+(QW35$pT$Pww=5rAf2lx{_W!o7TH z2aMukWgfgO9HZR(`*Vrm4rW^cDzLozraE-nRC{z{nNOeYro0>$zXckUK9@}0mH#&s z*2XRJ>dQ+kim`e=Nn(Ti8UM>!+%HuQQhCv)(Sic_RF*Pui9nf6WRx^R-F=C@yBu7n~r;x_NysCVul zwJ6?SK$8Qk2bBWAh$u^6{<o^@V*?k3Uz*SGmPU(SGz|JwnApl}kAJp%#{ zcqKEB)7q46D++lEEkhASAuK4UMD9g`e*7%u2J-_^!_x3LgPY4>YjKk;bWk7)WqJ6jTuL zVuimc{_v1PjSKhQuDAFlpS;QaPOUR1b=cXGK5ZeCppE8DR(fK~hSt>l6gTXAWMF;D z*XnE;pren~8g3P{K*|oWKj}~!Fu>>#lHa~= zU{HXF$X-D~t#bx)XXN-|=exVRn{-lk%lp2D4m)2IWjWke4HY+8#uNr9gdpX|IvfyU zcyXS@#jQ?}2&4q0D(EabDv+K;X)1hS2IK5x06nw>s44o_+a+l>NLdqZ@c7U&-Sdz< zb0%bd-jNEiyl)REZwfM)f>;QpSm9)ZS_`K-R8S!zJ(h=xoCIhqGM? z=``qbG#X*OAj!&x@J@0v$cgbG;q}52CT)Qf;5zLPX$X}F+U`RzsG);$q1I5AK=uMu zSxISWqiQa}qDL=o*MVAL=UzE-Wm-sn%Y@3x15`d1BYNm~9qBme|Z0Ca8N z40@ZC06pg)r_$)rlfd=BKa{~e?6gBzxQZ)Id z4zd*vCnLB#1xsG<*3y zAxS4ao0FNT;qR}A@HtvEwak5zx}Qc4e$5l*Ih%gX7cI?_z(GHOsp#NB4i(43;cpyW zdGOz22X9es?P?A169CwY-@f(M^9UU;PX+Noryl|?oKzHf(x35=&!H8Ndzd1X5RRk> zk+d8;?)@2)@I#p|*wud=Dj5Zv@_)>>gHeMpu&b7BVFKsPFEhl?b}%|dl~XJ1nTE&?OL$wLR7@dag{;A&F#CJBSeOvHMSFgR`i9jHvv>r`@vvku_FDJ_D{*+Cw>$E!qf^*{jce~;K3+kA? zw!=qlJUm`tFkS%xc47@fD>>q_ut!GFu@nEU*B`L{1Q zDJ%r^)FTO&6xcfVNeGjBcV`dGjFCVy1i_eE-@n;vbp2|nlt=RgC|!Db{}Rd5kYhIL z-vWiQO){>0o*J|Yx4IKNzpKtsu}Xk@2N*V5Z)U&5OQUPFe>p zsSc#=2QhCtj-GES6u}|^$SLUmBq&28qv^l5@=gX zdO@XtUmW|{!8q-WVLbtabX^HL?A_2O5mR0*PerT)@}Fg&C<-RbIXXi6v-UD~J$cpj zYa~|Sd`+%ML^}u$tbgnPUA*0~W^k-!`%X)QAr(gFr*!fu`b?_n0D&CZfpxR(9J!O= z^)U6$-#DbL0k)|jbS!!b?o@5~iAekaR#;*qjA>a%A0(*~k$EVHSXJNz>V_#z$=%E{ zfj0puGE1Gl03YS`CU=vVYUy$hPs-{G4P?nl`M=}J95I0-miMMpO{}hS;wEZcSl?$W z|9KKYh((fq(;nTS=G%pyT{d^bG-)ou7hQBrC2l7U>6T=MvZ0UC(ap5{`61#rK0_53 zpjIhIFY)_a4$LAM7%=`f{PsfB+_R|mgpSU;Ix`c(Sg*4>^1S8*^(--{=B5hL0rXqam06D3XAB&Kx0kv|Bo-=O(10joo+xg2<0@y~_-< z{%0Lm=XpVq#arw`a`{vrdy;7#{fR;K4C`zNYk&=GNP|ux;Z5nekaJERPrs9Qj^=Pw z$Dx!SL&I$TI6ato3RxbjW0khLGvx?D&6>~i+Yzy?1$O2qOAy|CklQsharBJ>hxh1z z{IHaY1+wv=yB5OnRI59TP9fE=9O-bCSs15y!&!a4f2z5>oCdC&0zM!#IYT?|O1ii$;2CyYOZ-}6MqX{kL=+jeCgkmM zGCdk*C<_q5vRtzX1HtFBPe5M*jn-C*9UcpvZ(}>xs5?(PhZ3UbIA81C|H=6O481tC zK7+33;J}aMHTIR*Xn462z(7MnLk!W73*-X44^t5kEq)(!i`wi8NEx71J$G1K4kn;% zq}UPVWposcNK(BeoyY{@N$WqOBlhv9;b4LhmzQU2WtHZl0$da>DFD=bU|=r0KtBe~ z|5bu9tS2`Bgn(9V((*Gk|Lu40Mi|GWPv`~9Qi_F5) zAa9TpMP)D4kf8EzR(K={%lMp*tscMG;`;e4d^gbL9ok)Bx}t12hMHCUS}-S71U)?H zqL6F!@ZrPIpvmDflPceJ$KCzS*7PF?aetqsNDf%A=5rk6q@f>xhOD)U)@Aq!T5myR zrQR_;7m^7e2FSnK;RHbj(m_D9pswGsM`n2!a)P)Z;Q0m#8A4XK)Om%LEX-%AC>_In+TjN{ zz$Kpl4WUV60#D4|12k6Kbd-N~Vl3(ATnsA|2cQZ}RLrT0Oa+L81pCsU{I+a}AKz)- zRRyku8=js_z@XN%k4DcH3<{Pb(PKTfod1YR>6QwYf+qzs8yrCZmF3Y!T+cbktc3K~ z_x7r3wI3~6^#nEHQUTaSlI-!&^^#prQsO`-K*nixvz2_ua%-=FjFOx?_ix;|GHB0* z3TuKz^D72%54Sqj$e%Vh6_nsN=7qius%<`tME%Tnke5Tqxe}Ee^)+uo_!aCeu9T|+ z5Ur<#ahQTZiZq7>=E@|cKi0{g6WvclZ1;y;4Paqo*4>%)`h zAGZE!Y&GcLLbM#Pj-iggz;gkNOCp`qp|t|PAPfD8J>JgSo8?kL)goiD1;Ql`(xHg* z4{>qJ>IG>P6}pGBn8YV#gP9+vnnAR0-R^g{zehvnw#}O&q6wg7$&(#nTIJfNvuXN9B=^?o1>_cZ%4gIMvVtxfehestLzSvk=@WZo9`8SEfq4-_IlAW9&-{(Mb@gJT1q0pze`WO9u> z0!g@D8=ipF@${Mx6EzYyEsO&$_u%C26gfmOz=DA^2P*hW<2}~p=`E+XE6@cW8KypO zPM9e)9QSYh8E3J^yA-1Tz1H1U7b>-lOs0eEp!wC;T!H|gri>3?N^_{O6DFyQij0&z zdp4QX${g%C=Fi(RjM5w9*Vuu39ERNy)*kGm^boY$jN<4#X%zbcM7qI4(VB8~bE88B zx@gdhE-4U)1R4OUfVxa~A3q89{MOXrabOTI+4RPGZ`iu$z9op8V1U@4J^r|VzG>UB zrAaCaX`nWCcA>^+7e-IOV9Y~c6T83bT2o;FS0$^*9zQr30tR0OF@?h)EE70dP>wGt zaix1czYSi$(&qTx#{mB=Ejf{iM>8l?K$oE}Ijt1K(IEPc9N}q$kn|DOQHt3VNCDD; zhZ<*hS5Hm=%r%f%-5&-)@TvOu43r7cKeqj|ew5t@_X4nkO$@gUNCXKV<|_qp_hDMa z=-hpn;mA_FoVNk9CQKpTG#$C6r7SNRyAEPXV!jz)>G;?jsWjJgFlC`h3fF@+Ie zn*TZ}n(@;mb_sexDwImjQHZz_Hz4Bre%(m?(m|4ZDPI{2V+lE%^7BLm-G&X8vE1qZ zW(1iaIWF|=7|6z!Ye z5gbnHA>woo-YRqGH*^)D4jBCGIgE(5x^jGMI;rV4o4R>N$w;~{D20B zLC>10u?RBd0DgrjB&HvNObv8TP~p7h?l&?>5)* z3M{b@c0mq0luP;8T+P`|kQY*Vq$=y@)D`~S72)E+7`DS#*TQW9Gu8*zuR86ndx|l= zJqJQ4rX_sj3=~XIJ$}X@J-%Ec0^- zZesveJ`73UQFZ|V6G}Vi9>3TNAx-oByXZp>`DCNOWbGm_0favP(O$;yz!;#<@6R_8 zQi9NK#NAUT8VX0ij&J@M&MPA|v(nymGU)0^ac6QlpoqXfzhR8@C=l?k>DJFeo+cki z(85-Lx%So?$*}GTkK+8@FJ~u-SXngtNt1*G+u<_=nW*ye^LZthQf9++{Bn0UgZ|1o zAK2-qsL`hxC|xI8IGLH5A&3(;h#?(VhlZUjQpp;t_Y$ZiD1fCie@v+$EGg{9!|jEL z&W=!d--iK!6!v*Iiw6_i!-^-80EBxBDuU&&$B?vu{sR&rK>kTR{cE+4FJ8?PK7!LN z(*M*Fs0cZPe#gF_Zs+g)7!O_l|@uRscT#Ial+ z6nPuSd^xLiK-J>Y__jNMSz&C;M~M!Fad+>6NW#q8D?8&{Z8ewdg|*%Ffr6Hn7Vdet z%<==17QHRm)ab(?Fck~kF8&e(af)lVUid)76fs(0gc+I~oFDSHCQk>) z^i?jGk`Fz!hIJ)c7=?y0=jqKq07e(RF37JcWa+{UMxxb;?d@s-OINIg{dW7(#5BO= zX}9V2KdV(SX=rQ=S$YE>%Xg_YAn`$l9!b%3vbL-qFWRR2$sx z0gV3ghOI9vo3rkJf4dvWntc4N^1s{9F#on}v{%H9vrn#S3Z%e+>py<9T2!%eG4C4X ziF;s$=YnbfvbeTm8r2~QKK#k60tRUVWpZ`&uZimHq*Swv($X>F%n+%P4xolZv~704 zc2KHtu~{@{<>)}Epy^<;Sb9Q@#M-;rYet9>gP3={NoHvmodnI8(*zwG5ZEZQ+~mBf%vsQ{rK}UFu_3$6eRerk>3ykQRIR2Fm&KvY zz<5aI+?g)Bs`83<`w3A`s*^zbV9XId8d#>xUUoS!9SHASy$}e%h0Av?sl3eWzzT_T z>wa_cmbbS|U)a^&XweV?WWG%sy~O~_mVgEVQ}<1~Kl`Avp&)qB_CH~wzOi4LGzf45 z^27Snz&Q%JQHRghR1?&}^l(uje4wMZZr$Q{(J#aK`TMVZE2|`Vbp#7h#{7ew6C|wD zrQ))pvGl6$qwl2(pX-!JmaM+io?-9=tS7iiCJHm?}ItmHWG|%E!v0K6HbEpgDYyugyESxk`*GF=D$aZzwxkZ7D|DH;ANR7SK%tD?EYSF0N+3^EB1!vUI z&=BA2B9DlS-M5%HX~=H>7?%gPu_wY&f79y>jzv*EK$kkzz4ZqvW)H@&VPppGFakGC zfh?>Lgx-Qlf_HXf!nCTdCA-M#U&xRUq{UJOLn096L8Rhcv+Cu)v!PWA^P;w0HuV6r zHZBQR-L=nS`SS~nHHOqx_CmX4+?=!Z!8qw_h>@4DvZ2`Rk4?U`2)YS3`0)P5f5@{+ z>jB&l2=?a9Q?69VeH=U$kVpj_Cjb-p%|1yQ@H=>u9u%V1J``PnNon&sT`&9&+!H9q zJKqXJ%e$U!==hbHM74V6*hVK`4ho~Yq-|3Ac z@DVIE->|^QqeJIbEOR#nl#h+^Ppv^gFqvbr6Wf2;EUo{^;UtUrcdP)DHTl%<7K3M= zy};kkNP>kUVM&FBDC=No7l;5gGcL9?x2jBG=reenmQRd@dU@rPQBfpeW>-}%9e#z* z#@S)#t8sATCc&JjpYf1;0kd=v^M(h^?>1w7vy1yFVpEgx=vP*;^%}fMZL6!2P*Y$( z0`G-a0Ls}UFCeY*8NvsmAQDV|`{wMyVe;#~es_zw>ld{1tkk9of?HLlS5v=qfp!ZF?R~PkOZAgW1=s({wZ83qgOJ{Z&<^J2+(EF5KrlYA zHP&h?19g7;^rZ67q?jB8QXr9&+ik>cyE-vG{*<|i)t~=?D;lsbAb98yFbD={0I(mV zh2%5)lHP^@iUW$DEF1_l3M%4S)cM^*|57wS&)B;IX=6?AgDQoN*Lizcc&2BV7sv#R z(hLp`hAs?1$QGJL987j6NM`oSd3}2X@Pv<&Roo&s69#qPjaDV_rJBy`Une%T=Tz&_>b36jnsH=%W)V)^>Y*MiNB zz$9dcIhuuao|K-pmCaL6uIlT3w2`F9(v>~>OS@;}jqnJIEd%Prt%%UATqc!PZT@w!HTx0!GSU=A{iwk`3E$8i${c+?5DPad2?Ju@8e~ z03Cf}W8=tVZYni4TJx}uojeFdNVE`C7uZqC*iNf)cx5nK<~<{{|D`$7gSOMF??wgO zFfIStK>z1N9@5efW(M1&159y*<+C2a9*@kE)rLGZ7|Xyef$e}xgJ94;22U_5ff+vg z7c?DTm>d2ByU70Rlk(T+?KsuTP0Z3FCRf1ghdWe3UArvBF18g}3zfEdArc0AZ(L8N zO$uy=@W&v=b1>f&Mtd&7O?UpUaAIirLhkI@{N79AMWF<+7XUWHoDJB~5Y4z$kmUD& z$a)iKF5C6}TQY={WGJKvnMEjt3@Jm#5E79x6(JciBtwQuh)S7?L?KfpQ;H;sRE7p* zNRiB$!h2j_?fu*D`mfb`*7NLLs;~RLuJb(3UaZp@a&c4(m(;7un*L+18i2f3b(Bc#*+l^7{2W=C(pjg%*^zVzjoA|15@VM`!x(j z6=#OHOmi$k!B)DRHmO#14kiVR3-IRoOToc{!ReBrV4@HL6?}UV_iS$o@F8U?7}P@L z;PoAE5?o3gu-U#EV@5h@JqSGjn{6q%k&aBSX~o`+FhjwJMclNom2!l%GHu{Tahf1; zXar^FeWzjQatLuB=x#Lh5Z@rxR(9&I?ilwu%*hXH zs83ixCy*^2UCl;l`!%={HOmjRAiOeHz~P-h)mGT@p_a zK7D);_!p=uA@EXYXwc#)w~N}B51PzF=T^zTpDX8Y;z**(t?fw*_=rLFMCGVrG&IXc zj~@9X_=890uDp{%pE>@wHEPoe9U}kH%-qPpZS2QHDhd8ea?e#f|66zzv8=OEA!M%&ix*s9578_mE#b8oU z66C=(wj#o=@NBxLd5Uw~Nf1ll64ZPm{MTTpnzPFC*2lUi26xZ@)E{2qkn?D-B&88t z`0l!}ckFzeYrcNwdlW6H+!CW*qEb@(WNrW;v4@nA>)cDf5^UNgnUrv)S45)wBt4zC zFpy`rn-h%*<2#`~Xmm5v~xo}?EB_Y(ga zc=5Edixz+v8ku;n--8mt`$yUZmK8L1>drP>H+7g@+Pitkdw=%x!GQs|C@aLJ)G4f@ ziXY2Xf;+Z@hj{*@$SmrLk{5~~+!7F$VFc6FWk!YN_%Ya9d1gKUv3>M`_?;@eNBILr zf;S@5$#m0~007~>FygV0`tT#zxRjGR&m*EO_%Fs-&+&kgd78;kImD=mr(M6lmPQrq zK#nGEj3jgs#YgZ+$0jNLYKWE%Xp8c$9S^dn4?DJrWo&FzBKvPMVNL*vKcxaP_SetMgp-?hAF zR{~9DdQ`iM!-4aqKACCpe&;?4P?=uliwgfam`g$bxmBok2ou<>{;(14N~5O4S4Xxs ziGDg(pI}3A&W3zHOC&nj$==Ze*n(gXdHsJ34b^O~oY6HuN<>)rU&pV%Lh>-KZWGU{ z%}IJhC`Y6b9gb|JiV~WyC-gQObrrJ^ zTQGxE#q{k5_Voqgn0nxw@YALTG9a0ytVU{D`HH}H11h$OTcM*7U-rJkxD~G!S}F89 zWY+okS$s%qdevBC;KKO%Bp%sQ{@en;i{{XPPi3#4Ljv{8a7PkcMaEguus>sJ+jX#V zmL0Ft?!OOv8>LXqNO;3I2>}y!DNq5Zcinjx{_dS2ig~!anBiB)3lABUr}o?PP$qc( zi?$8gZh5&B7DqGNchtn(T+6@hRhSruc`CfDkp-cA9RZc|L$1fXRtj;iEn#iPQ;uF5 z^O0E|&=r%}BVLX%_oMVQPcN_SP#Z$!p`TsN?w(pQq4s?4TzF)Ac6CYi$zlswmK+uD%9cs? z%?XEIjXbOMz{JpyTqJmpM-)+>s2sxV9gk{Qwx`K}D1YEh;G(HAeKqJmtUt6YrIy(tg+pw$(nXstMn!uI`4QJU(8 zh~jzRb>6!2z{p>mx}kr*bnRG$k=D4fI^5fM01+Z6DlR4}1knxf+-cQBTQR-84=H3jq7w(&Enk}E|c%d})B^W%yx~4=LJ`@E& zj?k?KC<@^#`{gSN&c%kEuI_X?abo4O96C~UM!A?_x~$XzIH|Lj zk;yuUB*@QIDPSs(491Uf4&`x#Rp3g31!egx22W}TB);67{&P`lf^gx zjo<%>y+GCNNNZ3oAb-IvV zdgcp-9j9(;wFzE!TkA7R0jP6ouGjzO$o7-_Dhm^uC zgemGJnLEgJ?R5F32y7Mxi1?fpa#A>=^wVV{pafvQktT~v$=?5x>jY|x_vK(}+sBWg_^N0hxk7rGc4|!>&RUYQqi$~q zuH)AN<`=^Bp1if940-WC*4=Xc)qN?#drIr4tW~)3-w}0SI1LC<=BI{!f>x^DOYNP9 zIayb(*uJtr`pT4+yi9YQqP5CZDF*Yx^-3oS;}B>xs~>J&!iOV2O}&3Zar zZnoGGdQKN%>h;UT81i)H@qom-x#p4w#AyHJ7~}>a89fxZ80?eWNZp1s`^pyvu7?$* z%O284vXN)p!K1$BNXib*H801XuiKybzG2taO-fh7{ln>U;)8;W+!^sU!LzsHa=`cQ z5}ohiTMr&OVbymaADR0qHuDq=<`4n=QDr3QEg>n-pK4_(T-cU)kA{+3Dg8RJ%dXf0 zhC{f;#^vue#BY?iTDZpHvBNP+1Z&1FGyBOZl()GKA+oocYxIGOSZHZRQ2jY=(!Nm1q&8+Th7?|ZMm?Z-(x zH&OwkOw1OGi>#j%K%0ZiVwTfV#uNqkDW!X5I+Of1!w7S<#)g%+!-;4^DoF4D((m zl@Nj_0q{2s)Zrae_r6AYAJ}{)$?Vbf{dXUTT@BR?ZZVT}g!8ZHMd63N8}0P^;s`jj z*_aVgQ6P9m$Lgh|93AE%hY{ZzA*0BKDKuoC z*c7exSfgtTPpC)6Y_+<|1bKm!U`NMh{AB-Z{^KREk^hfd`uS$te9f_XLDucR113Kn zWD0}d`G|vqu-Lx(W6UCNhn$?99e?jp%!|m`7?B_HOcc@;h|w5ekGq`DO6v~;$6<#X zb?3}mFT0xje6x$brktBa6hh%JTv99J;(JyxGgl3rAtboB7c4yxIM@t(uZp?(`jc$J z89Pn>8!|94lH`A*pjD`2dq{Q6IL##E;TAnKbV6}toN-Z8fV#4i;x|b73ctZ9s^tTO znQZpK>z44kmCc@e>RuKNmyNIb^Q--U3=C5baS5XWBr*8C7ci^9hlJtG^2TvYl;8*y zb?C&Xs75}LW4Kiy`Y-5e?!KqS6{YH}tt2t9X>?308vDP*ioN3As3R_#Y0J&tFvKenfJ?!KRx`Y~RwooFpO9|1Kw6vh) zN0G;nHPjUNKCe(;-~d-;$I(!2$s!Ib&b5)2Q6G@(+?k|MD}HNxja8C>)+=}cc>N~~ z@zk8EcMmlV=s%y1h7>V+(@AY4BRNgc10kBI#m?|5JmqZep|!n?&U~Gr_{}MRZG!HM z6Vf>S`%8(q!_cUAf+8Vu(55Oo=yrPv+PK0FTkB@dUNO_X2Zns;Ni@_!f>X-cd>K7f z1+MV@N<49m>t0_lRUg3_k#y^pHc+WLN`YF16PCkKHtPt_&}JP)BV@{sWE(_%X5RD^ zT$kscGpn~*UO!N6n@^jPiJVuUHBV!qI5;=Ua8=@;3CD2t9mzK{b|lwIgSb9HejmZ8 zNTZUst^wquTY6iH_Y3zWwzahEO`FU*kO=}>SL0(^)`&eF`Ej?RzbJ3A`WotlA_s#_ zF!5l&qg|Z0RIuldLFn}6wL^^UVefy2R2@O?IS9;3`6~cUjm-GbR$c(sj(C5Uuy-1} zJrH%MyxF@A55{SKw!Ansoy(yFXL$rRO*k;eZuB3TB19)MsMbh%R&YAvkPIra7RQAE}+e$EdLK?YD9zkmNW-LM2* zczS*BMJ8H>UY-3XSj-X*pL!v9@J9OSl|n&0Ki54l-nNQ7Y&?Ac+F0btONsUTSf;9Grm zuO9Q_yuWkPGEvalIOA3XCPL{>)3VvO4=ybNt={SNn};yjv>iZ(*gf9#2}Hf`^}QC` z9M5Uk%I5niTN|>dG&EW0eG#L(mp&3Idlo0n7MYd7X5vCWePI1|@6o`s0KE^Nokm(I z%Msl4P9jG4LX-?5gIZA5PqZ^eMOCx7rj5pNhjy#QpWdmvTPIeZfr4prkj(~ZO}GD* zuJxGDRcb3>N-!s>NiFtHW^tXd(o$dgjnQs$XwzY(vNq01jCEpd`>ATy^0n?=vCG zjJD^`EJq`5C3B0{gJ^|W8|+fAQ(t}B|0e_USj?-5_eMpV;w}>@N;trF-#k?K9wL5Z zPk@+D=2s)y^3pRy&nxFYS7zN_7HJ0O%G1*r_ThXJ8~bF})1H5n9^F;>U7X|6($dQc z+Z9)z8dF@2g4%Pig}tbae1bdamZx^;^=cdJ;JN#8JvGc4s-vVx#NmGc z&Vcb1q~h8xI&#yCQJDkr#cO=Nb%uAR-WjN9Y5r!gm3f#UqulBmXZ^zD^jF)@d zEvi?XRPVKV!8#DUTKU|IZw5RTaraZ~enE;{g1Zuh3+?##lOgcHNnX=wX8$(c-*^-` zW;TnBy90Pq7XS8}6fUfoe~0*|5qdy0D`q9`f-C9NTRv8!mBhHp_v67GfyhHZ#=z_h z&b_gUg(X}6GPb~D6dv&)ngMTQ>$hSMgJ!I3qFG0W%VN$?`PNR)NTHWCRuS{EJyU2A z{Kju~8uu2%!w*FSs&>I2UZZ81A?06&yrE3Qy5-gO1a%H)w$3usEhk>bOM77|^so?R zsceN%0{IrD{*z74YBpu}V2!MO4DpeQPo1_2e_isU?) zismh9CD)%p0lbfAdf_dKd~!`fX@eJ`;Q(jBxvOKzaL&F%mTh#@jWGu_AhsDjcOLpA zy?r^nHLvA{Cw-MJ?mb%7A`WZ>S@Q(fnNjjq467n(YzOavbZg#tk?s(Z(T6h4T`=dwUmOGVug z2AvlfhZkE((DbVdYNw*W(1zn+1dz-D?rw8)^Mv`htHtT%<%jc=eUL2He12aR05k-= zGT2ucrFLdYNEiKvd6&re?RoWXJP@2=B@ITueERh1H;1}Fn?O0WFUShdEaF`F6GBMY zt2@qVBtpphuv|>oMf)WqjbCTyZuL-u%1!zYn}GKsQPh@tS(QhbWR(FrdJ@ydV^zk@ z!te`v8bG?rp6GMgqH75iY1}j19&rgZ{J9l*_ld?ohmT{7jt$Tt#AH|He0A9lx?Z@Z zzUBQsN4pC zy9q?}e2A?;`IdzmG0ylYPfSj}o7dL`T5}jMDYL@kmtZ}62FX3cl+RAekk#titiP~C zMo$M!Zg0oabAS`W+rNY7<*#2SOeWkQSIS|!^q-~? z-^#B3-HQtUqDC_I8~H@WH^Wj1zqgf%n7R7ZkXH0vZ6zLCLgB*fc7+lf8K8t30h3p_ zaWRj^Ge3JHcHn@~CVu-|WQV1t!Fc1y`-T$+6$}$EM~qJ(raE;gv_XW}Tmy@h8=5Xe zJ@e)2iZ7d(nl`^o>@|nu4%7?ZBLaVJaNcKYN(@*0j3h25tefChV`DTtcNoSY_-tKI zuyLmV_CeLTxG=?JHC5eM4PO`Db`$-zokQ@<83^yW8HF3lX0Rm(3BzkE|C3@x962?} zS%YJGer~GMu*p}%y1u?xReELc;&k+4YLmrlTNP1lkCXCDCJKz4(+Gy+i{YPmsPKS% z`0$|%1#(nCUFH%cWN|ic@%cabrk%vSVgEwA0&nH}fn(IQn5Y%s*%becE;#L;s7AB& zj(F|5fpy{?cFQ)gF}~9ku|9?HFCH++X=_%}394fN&VU6kp=yJecW9j4iPM((nR^2_ zbuRE**S3fAaRchU0aN}paI@%-3DHpz8$L{$VTA1g2S#S*K6h4(E=ed^&J`%_@(hT=ZsjSd9ggg)q>qsI`qWC&1ZAGke4 zUJm1V;qIIc`_+m$8a&+?KBCmetgy&Q-!e!P+#-RV41f)cvbwF@*1D2ZEsv%Rm52a- z;*oV>0US_eOF#KJ&G15MSXnd*ja&PaV=JwZlRPa```q5_mI_dJBbd4#}2J-*-2em-c~WO4b} zy(cms?PL(|;KL&a-O#DHS^KoY$Si=7ZHV~dvcmR{)m@XV)-Y4oap`40V0f_ug;wbE znU{|8H-DZCQiJ3yg!<(klS)gnT6S(+otM z?d?q|Vkw=bwQ6&m0^7uU$t(##rJVYpos2mfSaTmwtE^NEW!4WrXd;;}&V&I)RE^s9 zM{0_Z*elS$3C8|0b!Yb^t?7VQDQgx#!-uT0=^TKv>6)f%89PC0&k&$1afBOzvHg)5>e@fAHtpZNe>sRfjrtX;;S< z=_1LyS`xSxd3oth4er&F_TR|(5sxdFK&!hriaLrM;|99Dj6&~LS8TpWuhq$1u)2@> z9E|}xQ;yE4vbG=&S--|WCnr&{yMir&&m;o-FztIV--(Kt&bp*R?76pL#7!Rozzf7b zMBg;lj-^YU>CllDedOkaUaa@j4n!L`PprcHgJ^IA?a-j1c^7vj3Q(jsp|F-3dHuEZ z6m=3Y2CxhShCSlAI~mg^|EZ$w{<$D|Hb{B&?T3O4(<+|s1)mB(xfH~iFH=&Ai1Qy) zb(UFW<0^&;Vd>Z0A6~J-|6?&DrrrYcy#lPuYTZ!Rk?vHUhpF!#lL*(P+l7U3#On3- z^Xxpoe(mD>4<#*cpC=&%%hLh^myoEC)>vX<#AFq#qm?l5-o>!iF z?nz;mi^9iySm}pRziRj#jnjxVJ_+9%?p~)0shFrm*TP}tKKlklG=$ngsPWfQalUOJ zT-0TWPXWq^PkAY4+*Sske@38tKLkQ9#uzi9vI#Ps?VW9hQ4_CqTAA_c?JDz4vncqz z7iRh$w>VLsi)YKPSY!G`#N-CV($9}wYf+4t6fai%gX!#FUZR%!hGYvSe4!4YrG@PV z6K9A~??0dTcFN4HKFCt*oBakryPi$pPQoy~sjY2A=~unEG8U;fcn>f+XRl;iyO_1X zf|Gmdu2ELm+?m|h&fPw^iFAfULIP8cnIq&uq$c~zw`GYV5@SDnZ#y^yOcGI-zH?xM zyb)<)m9iAbKVf*O6!!w?KZiDy8|ZWKcOQ1nH*;7hGN8SUG5p%1j#4kFg-Pp06GLRf z+h4mtFb6Z*wPW)|S0IxF8sZUh1PNq$Co!92eHrL8pXIH@*H$9#Vz6yr%7?HR*V z#`0gi3G3G^al4+ai|`~_7K$Z5;h3Phvk{-}-!QEj6%=tenlt?{^1`eM^($&$AJsKM zS3}Res;kpN0*8Dc07-oP+*IY)pO948rAkR?|?UArbyGXPPzTR+?`21&n{#RL8zE2`uo_({=mk zD|&$)i890S!L7kbe7B$Fs88C-C^W8;24`Y;3Wh~y*jzDCMFfNGDsmKck6CJz4AL>H z^XWNtyT-SfB}RE~R81L1UlK~&R}=*x)9K)u4lL5RA`rYsXZJId3AMz}R187_J5#EZ z_f=PNjl(?1H6Z3FTvmrA4;UU~vQ=%swp#u;`vxwAq}}eKIqGRF2x8^2DY-OTM@{HJ zlqCU@sRsy0!)4MvgS8sCZ}Jg&!mEa{JTP1*-Yws9`*CLgHz6S5eTF?M9Iav9+jpb~ zIe75khX89~F92jqwm%6S`GiR133(Lk2t71;4q>#4)E$^i8s(2M!UBt`hqH28qwW?4 zx`(T&JCUwIwWqOjsKW)kSTdNc{M#qByAa>?ZG2n9WsSd-`D~js;WtsPo_oMzVEpR& zZUqH~FdHmVBl^!-<=&@OxwOCW+kA*Sv_dR{ZW!i-NSfhiDfdB)@pZW1*!_|F(%w-} zCV?H4`1GyRV2y(k65Ws%f{&R)O>Dm!o^x^9I9{Ny=2Icr9D{K&ct?vl=sx+!gDxs{ z3Tdt4NH^smtEO=1i4^_uR^%$;XoyBo@eTkHAn8B`p4gQ`Qx<>~Z)Eox)icajBb5yo zi_$6MtGj#m?p*@Akj!GE|8I|2>kCvn+#OEJ+|cg6b{5-wZYle7k?j^xpfm%R-ADAg zavyF@{V+NQsr3^4i|q5I__!gL7IbGJrea~P+wDy4gmNV-S}rSHkd`Io``nWaMmv8C zGM92h+ShsL3dN0gdE&)qzW|H!zRNsyH!d*t)YzU)UD3aD{Q-)gTo-9mlP?i8D3F_% zlhfez%RIbSZBWfvQ=bc^3+7o#cYs!>o09>!lIcyBKHz++^E{t zs2Ge$kFcrZSGd42>Gi#d%6!04;!*3S?FO(c3N{QuMIx&q$=qCoLNgWcUtI&|4Qf-S z?}A90@kZAx8)#>~2X3c&=9hA&aeO1oyO-= zzBXz?Hg5I?CwGdl<1Q4qNR$KmQ;Sv-q7DSglZuD-Uj%*uFZCg#xo?fCap|-b6vLJA z$EMl8GvgB$$%z!)T2ujj{^ub)rW3=AVtz1a;zu#Bjd{ZC6LgpGZi0W0`AA(Q3~|9# zsWABD4gz?JqZ9utteiR1}1&6!vY<9yVkd7&!~{om*loMXkvoUbkp^BgOlIC?uw7> zj6YY7;WCV5n+?ZtG^1B%Te(rIwu^M;1v}}O;=u`of`c(Z%AF@MjBrJjSe`EAPq}b4fBCcj zN%sxkCL0;?#W;!;BK*hk%G=3ApddAJ7@C@kD)14RC{@i~`KpqsKZ(-A#`b>p`hRn1 zpb2(I|G~JZn=I^EybL{vn97-Vg?t^ViEkBnXr&3YOsaf>mC94i88a0eV(&KHzpATG zhIwSw1vYGa2-6h(;0)L@&Z);=s^@ZzT5pCn&4Tj@#t0Q~2&AtB_bSvq)RgUYL?^-p zE)QYznz>mSGnv@y!#JOF2QizmKpg2Sfib!dx<&33Gta?Uy#e#=vald{^7zwxDmEXq7vU*AOE*Y+~&XTQ!* z_e5i(3Jl9RRuZ!MWpI{|)l3B02mCYkt{P>?)lGWzJsb7*Gn`wQq;~<*gCWVSFw|%Sdn4M1#`X{;|3xb~g56h$Q&yu%H`%sufd%1@(*C-DsMWZ=`Lph=$*a#WZL75U@-(8vK+!)m@CUPcrQ1~V)*SnXl(VGx=wIMB%V zo$H?|b58s6+Bv%R&I;03pj$#TR-siaLzHnGE@xwQ>c~^e7;oVbAq#?>@}<_QI}0l2WPC~O^GVK)tNF6Pt`4y( z0LUZDtOu|OxR=22x4-uLnbMypjbm3YGby~w2TbMS_Ds>N=OWIcec`V?B3pd z-x&+3s>&ak!K%N{912=HB*7P3uV%6&8@`eF=&jM7|rLKeTNCaoy>d0{4$K^EU|t7 zJW!b;p~?%!t*HN?yTZ@NW~`*UUg~3r#h}tsJqS1hN$L{sIsow zQV1Cd#aLGjr#0DHC_ia%d+nrciri>o{ZzStfjyGCn0XIONrsVy$WZ8_H|*NGdWE(3 zx6m^Bi?G@~E$4!r640Incoq+G6mbl1Ujmm-ygVe?v_~{gOjMNdvOS`1*nD@wVd(VE zpNV_28EcGg-!|Z>?8Kg6O33L?tdlrI^T#$-%D@Z;pp?+C^bNpaffEX7`$2mk+% zAHrq{HK6zjPa|@=l)${hyb1+Biq;FHHrrJI3|#IcQ*V26c1b#NsOzb*RC2`AKzfoU-=$Ra+w(0jbr)D49ALIs z!udwk@RzJP3RKquO6VlDLECK4P>*7G-OzTzv@V~uS%V)@#qWN-&%%0JjTA3O;VaH3 ze32!>s02Y>>A5KU-_hs`_uDjnky|H!Di(vcDp9`lL(Hiyu8t_qs=?6*{mZe zZhROx6w!hqkr^eQ)bKa~ETsB^>6hCp49Dd5FK=biT$wW;uzTT;>!PV#&k|GZes>eN zRxgfhCBGb|eEhYLJn*S}BJhy!pxH9E2|?JquzQK*vqzVRLM=g%C1F2h_cNe`ClRZld4RoFusX5=q#0HQ{#P{#KyDnFY z&kgq;N+7)6kT4<$lSB3LL;BZ4=UeuSdf&3xq#4vApzMa#zaUN53Rb%OTjkD1p%-cd z=8g9$;*o%4uHf2aiaaR>Gq$#BMv@YiI>=GGVMnG$s@!@nYa7!s`om8aU}B9SUcWgr;+KgB)<*mB$JPQlr4eNnGW-9qp2rHo zRV1TGVYbAn1ss(8F)LtThhZ#|nq2w7g0_$EY*psP1RUQdOd&8R#t#&NPglh%Snc;4 z1OFTAYwU7ZUvd)I4P7vqM%LLSdJW!eyKv+PXi$+q>C7V3FHjgu z4m!GIF0F1_^>^T4rBUd$TV~J$X#Qfb^G?iGZ8*n|F;oq6>SI+=N=38rf=G5$H$Bco8r-h$;wP;9H=f{{$jjVqzi`v>C-547341#NP~`4!)%Y z)Sk8;{DM?;?&^bR(@K8`B=!63+{d{7Le-IH2q)t?i6U04u0VuxAG&=Qr0!DrtfLma>A0{$mr zQDOgtHWQnigwGv{_au;$j|=yg+I3*D+k}csT1eGQXc-Fge``e9er))MH47!!@Pdxr z3QdSCBBARe_Blk$RVXfohB0KcwE5xojRu0JFeW=*L*rXs@gsnXj9oBmA0}~h3D%JO zIIL385TFYV`m`E$O7xE~OjtCCz{v`6oL86v$hNh5pp%`eaQV)5{_qQKFn{6Wl^FRs zFc5osTl9oV`xCd#Rsl18pSh%BlVy9$bwXR59!k|?XB+IOznCpVoEd^ze9M(x4;W?f zdjLW~T-7+OFdu%F!}u3sEA34B04l%#_#zl{FyUIb{Zb^XwOiQ|9@6h#BwI$ci;a;F zKVZv7FuY4Blwf3=o0078GiJZp@cn_k*7f}u;bLBloF06y0+TGu&pqz&Wm=rjU!+k{ zCR|ZWqrhdiAC80_gdi&>&YZ7f)uU2d!J;Lj_ zku>rSA*O)2E5y9**s$&5Z1{jK*CSlTx!Lg`!(!%V5mxaE1ZA^FVku<@9uy4F<$hzA z6qXM3I9typ3TP&}R&8!|c*VZ4`4?J&{*%+!v@_tOheXTtNtp0BBn~|?Z~)F{BtFki z)W*54AXQmBb#+H{n3i3EL;vo2$4UUE@k0L za;f;=FaZ?8bDxJ2*iu)d6}O+*i#?g(Ia9bxHo)LxwvzDS>igq`?8VpP1niCL|vPzKxLc-3@OwCsO?Pla%N^Jm8NI!435z};3@8arEx^EMlT>Gl7L zp+%{Cuzo((tHXyLfcO~Z98QbnS&S*-f41w)(i( z`%xT42mmRLz1obAKlz~N;c%?&Ky@LYz7#|(be9qt`GhnfG(DtZihLf{_r;z*k}6O{ zw{T($x-9_gASuG0YiMP48D?~dJymuxHfWJB_!slOT!zgHh|TV%BHsp_Lf7P8LN3K> zS3VHAQ8d`eKt*EA+je6m&c3fxTB>Q3fYzLGn%p;Qi1UCw<;KNn5+sDPC>xXC?+7n~b&>vv4>2F(!%t5$kfRe@S}#SO&g67y zf^35sIK;ek`pxdLAe#f-gZ%?gMg4wz4E$UsUgp%&)+U@Klg1+P-A93x?5lA!mn(BJ zhB_SOh^2}9u8WdNR&{U*W#zHYCWDIj0aWG zV0mEKuYv2J?R|p?X#F_5@7xKN-yBujL(4u0jfU`!fOKMd`Ru=HJ_cmqDGSu%#>W{q zK_^jiBWr@$f;tCFlPKh+cecWOr?A8nBfHbXeDqonQUHBrx~k?m^hu7?XMjAz=IK2@ z*(zv)t**S_pFuYO$dIu>SLlH12p847`B?N-Y5~3?gy~6uz$p;RO=NdVgDe`VhCG^@P+1ZP7Gt8QAU{7p_1pnr>KqtEFl+Q<=T>VRGO&__VbCbLs%@geTCFl9TJKJo72q;zPl}DO& zr0U4Sciv_lWRihQ%U4se#`h%I=3=L545IyStRwqfyKi>>y(|6$2m%zY5t!kmA=vsa z7yVhgBNeC$I$R6d6iM9h@L`F;8_2*A--@vp)x7N=M@X(mdWnwV&18w)jo$#N7= zA>db6Ppl@}Wf?Qkj+-R_EgbySMe51eQ!{_Cj8I@8>WGFC8{#zl8{tF*8%HlEGekZ< zeXFjb9;gZh;wT(Bk8yoFb-iO2JfUTn)w~m`PLH(sdyAnA;o|TL_rjg<9>Q86t@AT!lci1qHHon3dSZINt-4HJYROzKA?hjRQW zwU`9V%{ZMR*GAR2&pNNklSiFO5|Ze}NU9ea4*Z(}s?Mw*L}+trs_c}#lf)QexXS8( zuDhj^F;T>d06D-i)_-fP+1UR|8t2EXw(1|J5f@_cfhFV{c+*?>kP{B5OrfKGK3q*a z`GdhWRYf(UXHf-IEKKH!jm^Xy3Wmdy#N}=_OsI5VZiiA4Hy}C) z926g1%_9`|)R8a+`xL8#0bY70UQLZmz05nQsw;i9M)w{(crE?>GPjsuRwV=Xh+h5b zGeDhDqsqiUUa?W<>07C*O?tVY#$Q;yF@YA@3s{Qx00~EXHl5lmLR}Cl(?Gryb^yPC zjy^(QI6z{U7w&CwrlVel@AmD?%nPQSQS*Uyz7kV(Ljbrwq)3AjnT_mq{hIF$Ae`d$ zU52%3cjb3HA9jQvEB)3Fpmn`xe`cZ?8U3&M5k}3IxGE5z(62QS_0~GhZO&!^L` zCv%rDa(Kw831&ZdK!(h^33WU%PxE%q{VHU$2>hfpE_-TzQEG(333yss%H6r}=P|U_ zU9{Mpdl2R&Ex_jQFnKC_FD**XDTDe*<&tCz3kObf!qd#pk2zy%y&q=eeUKFb=00~4 z{g^nI(>x^u#lG>2hP5K>YDIe>4V+L)dRlB%PEfOt1q0^gJgfF$mEzr-zG>{-&-cjT z;X8K^WVL%veT0xkzk7OFXiIJMMx^EupuaPI8}Mgrvha zYy8a*2JsLD<`XOD$aAJ_i$z!ZBD%=&GPc=6*q($|5BfJr3=W*bIs@-=E2@D|?6EeW zh_2F@cVQcxMr+;YaypKud6AS@W8~$^bmK54zV?ZUqI9w9k|TLW3poO5fJZ=mMY#M! z!AUe!;{d)BYYTX(o z+s8Qu=mj{I9i`E{936dtN>HPlSD3_+Pv{R)K!5o@$#dE~qA`@?aXo^UFyiXARf2%_ z%1Q@TX^6Pr{qsEfKEqM?gS$x0L06n?A%xKnaT>w|!j2cbDR@&q1zicdi1H0@jK=n( zW!QX)@Nlr9@5?teF>~vHX<@7 zF&U#qlwoHAr*W>v#Vwnj2nR7^ZYc$mt*@io`SeJBbQ|F^HAy5 z<6Qr%D-4_@aMMeB*HG;ChFetxn`SYt1iN?nGr%IP2I*|e8nGJk{N{`sQ9Ha{;r4>T zttz)U*;LJqhd#^(q5Uj&ZaZSAUw-cPE=z0d2l=nzp|2WA0QFtPKDh<_l=%K@|RQ=pTmE$XI4 zX06;pOJgK1UrpNfYqHmVgHwuj4b3S&b__P~CnC06YwOi8Dh(M#>bmI6P;#YtPnvb} zTH);>R@h~SAwdBPOKuTVd$>{IJHrVQYs@Z!ou=nns&|>aUZ?4{+VPJhc@EvVy*zj> zpf^BrjxlviHQBanGKo5;&+4bw&Lj-I*!Fy%b&)##-aN9JXy~xJwwXLCF0OJaK5jC{ zx{IaxikqL`E#B9fb@wq67TCRh{raHB{ulT}gk>dYtaM5;Xs963z(k2<+ZALl^o_Wg zE(`-yaM=6;b^-2H`>MOygwYBQKGmxWEdo-TA76r6MKsD=O^O@K9+`>L$_25*;Qp(= zdN6SbB0L`;+Q7+BWTpM*MT+Ao6xn&@e-eLvw|jg*z^v@_&sfp2-fBGjK)kbAV6E{} zVTbaj=fWNPap#lkW;4qQvOfgXeG&g{#Na-Kvl)H!ASLbg?FSsda~kcF3N&xohR`Yo z{_DR^DDmoBb$&yO{S0e*2WJnT7zvo2aP%9Evc4*J22*h2u8xOQi*2%ql|F}tTpV@M&7AJ6*0;BV0PH+%vk z9R&c?P2=JPCjFs9keAO+{f=FHYpWy$D`}2p7A4Ohh=3}EPF+qzr@&KAZ&cK z@g}*IGnaUSD9I=s%;Q5z86)!;8vlnKi43N}bKX@KfcB9d-kbc+LHwzVCF2j4m%~Ib zdNCZ@VGV-@`Y==5lZEXCU2+Nr!gOYxm#5N-P$-TcZd?_r#^xS=bQ}DoQ*K$bTeLwJ zn|Ra(+X*AJRLQw$wurN-6i&7C2q>1k(aTj@B#PB~rqw8uOyERc;K0D^jnJ^&Zv+z& z^f2JQVj0Vn2M+?&2TTvMF$#k-*qj5dr`&b~?c}qf_TC{hkbsvoN7gous|kj+5GNvM zT*NqSv)|#By5m(CC70Z@E;S==Fc+5uhzL)sVxrz%;VH(Yg}#u0orn8wx>jh7zkz>- zk)Ev*2VZMAt6EBL8AY3JWW;az)GsbqQ3L! zr?@cHF!j;=cwu8eIDjn=x(@5zQI%Q1O$SUNR$3i9kQR~|zk|<(vS1G}0un@yI^U9! z+a@f)V2F@g^)BA%9vIV$Ml-fXY-!*^5(8ta@_{cM9g;tv4(u8(3kLYpz(Im;LFX{A zSO4MmT$A^c=DGy0m2vfW0bsybrX@->sYVv^ty}6S_QJl1ZFpqw38rBEU*EeArMUXBTjB;#p=2qgH#RmMeNF$CR;J+i<<)gGjl372f%6yu!~*RQ)0&I$g6eWQ&B7 zi}0=f?o~Z2-I*4@^|JMw7OsC@HqoH5!!y0liipPtoT~& zmDofN0~MGPT^vt%p+g-ybf{&a+r0!M0EAWODmzo+t>eP{LI+TuwZYgGusGKVZ2%G3 zy0<+zaiP!pzbz3B@ThXmVm=VsyiH?6;z)z1w-b(*a55*WI0 zO;=BE;b$So^{8D#*=sD~#H^g2By7RsMX3E%^c#(TO`0cUFoZv3MXs$mx6EDTP*y6m zUpbJ-pss|L_s+8n9}BZ_DBK|O^+rwASsfiFl(9mkGt{T<+dd_5^gafkjcT~&pNham zWZ38?VzQI6lCKB*BWj%U%1x1~YGgtY8xs>#mTZ-t#i!L2Ia)|}j^O{`YJ`ar`)7bP z@X?YRResy&A3r$EcAFy7P5m~JDB?)|RR42Nl5;>*KZ9e-RqYHIfwA-EUY>BiFkg@r z60wh0aAeD}sSN^ot@ZWoweulbX-nwS*i7Q;LqI;Y>FK(Af+vjk*C>++ zzT?I?-fJpI(?EML1d37tTH#hrd?$E})`j341C!^K8c!BC8Y?YG51 z!*pYqdS~eo_3J(AZ&mB#x3_nA2j_BwvxHCGS=L+~-jAehGt-9B{2<&UbN8O|O}ksy zTWap`tEj1>0@#u=e3Nw^*>~9IcF*daZy^s~3*r{UCt{7!49Hr~y5n2lITSgpmgFn4 zTH4y?*{*Ebt=G^yzLJKzD6#g)RsvW9r+D4U^ETISCrXO~)QSHvS}mQ1&_hl#qVxnO z+}3v8PG2nT>VHl%vi6(c$_ZbmAbB@72L?;t*x&s6%vgtQzL{x{kMd$%m@9mWD$ zFe}f4N?&oW)n*+Xn(Xw7*VTvGDeD=pcUZ{WY$)&x%us`dV}seSg*`)g#H4Te?f7pc z-BZ{Ecn90QO=WblD@hy&wp47q`*gM5PR200!*Vni8~U;tZp04voY8dpQfhFlsImW! za$^ayY-s)p{~V{z@mEd}IJC;GOgNK1a_i*{So4X^V!wVp5YVB?GUBp`3%-uz69i72 zVTt`Seii3Wh;lsrC_;%F$Rl3~srT>LwMw9w3Glb0?8bKooP5wKh5P7#cb& zph^ks`cTsTL=dy3uQDq7pQkOxrVywiv)z|?aPlEPU<1&ruok=FFW|Ofy7e>d-YI1! zu{`)6kU;r*C*AKij0a2W0T3z!M4^}pZ`!LvYb5_J#P~;jd2Qve3f&ZL`hx8KDF2te zD(5DY*1qivP1Mqk0rKgWLUp2DnrD)+6&~i>fZ9Ct1K>#T>$c%-CT1n9a#RG-h(Xni z%6ZGNc1AJZunQM{{`8WrDt&nLAuB$GAsLAWUp93lz~%tUDdI#xR(&Ia}n^OqS1$gA+s?H_6fzO@%V(l{D|MdCD0t%F3BiOyzuXtPZWJtr)WWO;j zvTNF8urju3XXh*;SHOn3D<87SfNUA#H$p;^Slv#gg3(B_?|=vt61ROP$pWb&S!{hk z^(MjPix++mf6T43rAF*$jnayDI0}xkWo7>!775ZZiO86k!<`Ao4wb>_{f8o-TsvltFH|=E-l_ODjLXA?0)Z*UmP~0l+%(W9b#le{EkEaEr2e@W8~QH4MtIg{*@awF22*&^_1;;mcw zraS}t%MH6kj~+Rqvc^F-w*`&5`d58D#@bE!#L#UuckGioRpFFfFI6#Ggp2IAJ zfmJiu0jjo#jbJ?kn|FS4XeZ){k=;V>hmHe=tC)#RJzWX#Ic>s(;B zb)7@#w$ZW#U+<28yCGszi%-o9N^dMN(#u{kF2}Kr>r#Q}i};Z8ZhI}!9BgZSi1!}Y zC!*YA6of#cnU2Wn{TUtfSpxz}AnlHv@3>c!ef^0S*1T3lHX8`jMAgJ@U*s>*fH8u$ zOJ|uy+{oS%EW#joMG$FlqP+rhZv6`wEX?e`I0ZT7Kr6x<2e)vwFdYqU`ytM zGp^^!1G&UDbx^0*EOzoteaKIu#(&|*_{?p& z{*I!#^s7~q7ZDzb9IXL{>p$8fdx=aYcqn}ne?Gh3fh9f=qDWJ7^LaEc;)#DZAY&zU z53d1)H}BqSj8% z()1A<*X^kLdm}kH;cBa{zCP}wzq75C=w?Gp4nw;psu0Dzl;zJ~HwQ_n_=^Bf2Hwmr zA1O*pJl%Y)LSV2^Kt8&6eZR%Qu^}BJ&%W2}@O9(r$De$|h7D-v;2areObZ!F^z+({ zP!F6uc!l9q6rbjWg;&XecvqW{JCBtU;E1Zi7`uPm1`n^fGhgGl*<+UtkgKccKRloA z#p;7t_$>c2Y+?N!3aTN*NNkpISXI+XGqSPAt@zYz;3Th>c^VfR#K%)w@_C`R%1VXB}i zBFHAo)$l1@Cky5;n}@0`oUzlA6CFSfbxcP2^8ye{mR6|7aHSPLyz_`cX5r%hXA(pm zps~0rYcKnGMppVO*MS*?wTpkaxCLheF0cU&UsOpNdCxkqHV>~@s_=d{T#oGz zd7So=nks+OGk%-fw$&G4(eKh~ZdORX_+Dl(DC9pUo8B)igMt==g)YeC8oROyc4CL> zc}&ae`_wRH9-4W0eft0&Zm1;x)?naWg~mhRz(R4V;5y_S7ow-@hhb*K&hZ z7EG-yaJ&pvXzu2}*|2wtr#U#PEkZ)J#cwp?>dhl16-QO%%Y&3p2Y`#x zwJl5{tScK&sWs){KL~G$wHR#%@}g9Mm%$Q zjDI24lH-L{C*G&Lnf&^@E4cFzXYR~T<|CiI%`BS>03|6(S9WGT0>bYB? z@p@JbpJ%by_>b#g!juyYN%C~uT9TZ+{~!03@zx>^-U=pF+WG=`Ax=whn*K%X`FqHj zYK|djU>{r)jo0?+Fs|m=p%V8T)T*vsoilod!#CRmuiUf_eTG5HDo~iwL^?9BeL0Nv zjIq@+E7e^KacaLSk5}PAbAY2Adc)AW-d;ZU4tmFMkRba_JR|e2)d#g|zbwZH!`y)L ziOIYvR$GbP$EH4sUKD5;&;hE6+7RK02qLhf88cnWx{JrX{)*Ww5O#~vWj9&y&Y@xPW<^LZq) zMbe};&9>FJ=la!*D>X6&=0|eP_Dh+G_%&N*sAi@9JXWakz%cH*^ZRYtVjtv&*3U24 zDB52;c&&F{u>JKkmB#1l*x_i8|BtITfu?fp|Hf4k5~Y%i6`^B6v?C$*ZfFV)q+FuC$v`M4ZPj4U=$GiaKZl?}YK1|)UsX7P1MJyV1 zS-mvdVsqv|!PQ<4Eng9MfRK&WoWxwUG33DSen$j1Jg?fE(86?Uc<{Uex9Od}S_uh> zWFxT@xccC)4SgMEl=L}(?)E+Yx6$#H+zY00yV8I}9Cq8(;yMgg!q?&55F7f+-Cf)QgX9FC$-nbSrdPH_tIUJDX}Ik&3@3 zqB<_@-JI>k5&S%~cK_Mq>Cd_+exCO8+k%@I?~68LXT7cjBd*;2(XF=9c}Isod`Lt7 zF&a!b1n6uO2Q^a2&2Ume1Yv>(YNsK%b~hu*@W$RiMzyRGHK;ERW*ZqK+5rv6aD^!# zK0mUk^7GqB>j&+g5^inrRoO6C5pC7tDxX5$dq~AbD%Y-KT!tYAU)?w%n;&wKf{Guk zLBy3a7f-r!apGM#oRGosm*0KSzwMJJK@~2~gj@hw2Wi6Rr+-~$a}4Quj{V2(!oG## zL)&Vk1IgQU(?2unBd8vebS?rgDKuNQ=3XIWyg0vplpyDHJpjgYA~R~8rY&V&gv6CO^Ysy?U8v(QQ=XBF$r-aDj5{g3@P zu=gu)p0UcM`I?E66OZgLGq_%7qgH5U`?ticW!me(neZm3aF0S2b8%&PDeJ16Ao<_# zJn$<-n5;9;G+FcTwOp;ObhNRUX($}qxL>HoakY^)xzLQGSHKo3L7#aoO%APM( zhA2VY`M_)W|KQaSOIxm_N)dEOX|MkIeOIB zu}6FE<1c5BT{|LAnm}C&KGh|ipu0OhNo?m1IrY`JCn3*AuzV8b==}Qwztawm0Y_k> zSo_X&$EWvyD9y zGzbXmD__`S9w&E5&g~p9*ub)U6+ertm569^Pe?x(UQIzBuT_c@Dw%fr3$$ z^0Yns_d6*NYF?lrh-M@Na7tScX#EsFTYRht2CPdmzBH#M^nsCp+%lZFF8+*R@+jh9 z3NkLRJf^LuSD;AcI)L0nSc?ZIy&%-@^%_!O2e^cn+F0HbDJ0JzR*8EdyPVW8?26*x zqI2(tN*#ofXZTzyYOY#rCiOhrBEOTmWy=YN{#6vlQq#mA9kYD&6MQ`d&m@p~3g*(9pKo zZ*Na{>Om0*+zRdTe$~|y{gz=?GEKU-rc0+UrMm=3Xn#&f{}6m+M=Gx(d{9O8Z?&#e z#WUUE6Tojy-O~DL3L;qN2l}ac^t--1YGXud0a}nP^zOD`ZaxE5ZjvnH(Tx%90NtY5^xd?4fu|{x75|u75z-znb!8Z+tj+7jS?^>r`IvI*JhWztgM{~bwuITo(+Aw zj{WRpz(!~=3&mE{5Y2#{Eq7m^)PO>0PIP3ZdDpwf6o>1TZ-fK zKsv)c7am#uNdd^bXN&VlDHa3H_!=?T7eZRH!k`EhuYu3u!$)WC#@aFVAeJ_w?3 z=yi^^^8e2-%T-8Eq{9pZ#WBty-1A6 zx2g;Ua7Z+nwO6vFIAZpESy2ld7KhQ>N|vrKEmnS0E%JqDTDMrhEet(rEq2CC^JI$2 z^L4H_^v0hMLZp7OY@l>Oc2t;Fh~9mL0NgruDq}+t2c5RF8#FF&08EH9YoOX5Epm#r zZGAWHmilx(+)|HS=FFfD3zh4{r*&Of8{95<;}kkk01=XS>qe(S=;YDOQ&eO*nQOy zhB1xp;~$PZIa6#t`!^l?6SOesA~0tuBZ(h!wR?v?fLp)`MCeq!x*Mxy`^1lqud1EW zmX13l6-z|vEk!bC_mcJ4C_SORJhFO_cb#tgjd%*vAsJ&H{hT#U<*txAj+r~C2e zILkdWlYjERW!d+9pE^9wryFW#_5@!!IJa{d?{pEoC zknS_$yRC*s6ak!qe(;Y*3roEtO%K}awYa6`G#U~U zBUr8QV>2W-Cnt_}D;iv2&4bz(F6RTZsP7f#m^>zGM%FB){e9VV`Oelih?k-ZM&_M?ZaSxm zqhqI2W7W;%8Q7^C;xm1rJL2v(Rr)5n zzXx02R2+noDaRq%QAgh#c0WMh=$n46baWLjmU0R6s|tFQ`p=nqN%cr@2*L_vwugu& zfkfTzwCP$#s7W`SdvYmmmYs3A8Hsdo$)gk4?I>BivqQRdE!E1xLWYf0z*rHp6mwvF zI>ksVdO?{wz=Mi(RF}hbkMQB*^J!yeot#dGI78BkSnFN|di<*N--pIh6deS43v3RY z^{Kbio9V5IrH2gfm-h%rRZ2gQfo5lj6oitrey=7Ydk2 ze8yHKyhJ3DGi)BE7VH<_xURCgG%l;2EPFONv~Jtpw4H@`XyRND;iiu2M4k;l<`+=M z8LHd%>Va|?QTa(snli`l=RgfW=$CMaFq#KCFsO1U~p*b)F zjd4v3<$vzF8N%+#Yylwp@#y*kJph0n@6q3Wj+x~0uA-EUG~k9eNYzqsE#dxptrp<5 zt~;SnU)1lQp=ZB7k(zt`l?x+>*8|fxb#YbK4sFxl_-;i{^SG7oj4{JgD9Ky3R?S%L zjSdRk8wo2z~M_(mPc z#TIwPO6Rxf9?b}W&v=E^2LFmpjL5k_BN>sN*py5}j^zD%w{z!Cc%Pc5V`Qefmb$rY z@KeJ?r+~{rI__pp&~r43VraxSH#If&!oFC+`^OFxAmA|sk_>n|=GSA+*L3MjJ`aJY zL>@LK{3EksU5AJ6qF%9%?cE)fPd!$z{9!L2r#%PWv?A|EJ}0&P;im9FIz~sJo_W0x zhVbRiHQ7oxC(Di=d+^CvR%d5r2|SMUl7z3pQ8!l?_gZweDs5nmmNk#MWXcH8D8j(k z?fYPj>}m?_a_7*Q&9@s|0jUDk2XosyiN_O!{WVavgrz^W85V$zQn6t|V%gW|P&w>} z%1~C_Dexk|M?5XIJYCe=+i#Nr##l%-@G?LfA7iWl1C{hzGVDH2eH@QQe$L8Cicblx z?sb-HW?u;^A9)4{N40PD#(Alr@Pf#Ftxx*Xm_&|$E?zlC`mPwKO=rv_rO1Yl;^<&% zbf_Ml@rgBdJl;J4XBUEcSN#hLgV^o4P2tl~cN?q`_UW{x?fL0U5F(;rnXJ%uc~Rq3 zRM4@Uf)4jTA^!9v?(>r4)Jq5=i~p;Kx5!zpSlb_rH3~B~7M5h~;DUqP@9$JnfjRl@ zz(8yA%*&TIx3-b)pH} z2pe)r2MRut5S_fLW8RBH0;mi!b?~I!MDHs(kZ#1Kok>BQ4TyDT*Urd7{j=+TyxiM5 z2t;fSp!%&%R$eua+^~4F3|=`Voc{OCuged@UB&hrmPc?Re;x@eN)S`WtBHCL0c{e^ z$EC~O9}!wMjokaw@Lk1!;wv3Pr71!+PtpY@y)0ZcAKbnE2pl6?SGloLE6?8BdODcl z?)2Iatx<(rryped6uqrWIH=rmlvu90`3kE4DiXE*yM_#OXsL5lJ+CcDKe51`-0Vw7g8{7U zwiH<@Xh43Leka9j7q8vU!wfH-F|z- z7Z3Y+5lak0`;51KN227to;i>)?E?b^-uW2|%Ceg%?#%e~&G(Wzgxs@qoK>MI_D$VH z>Qn}!erwpQ_>0zelF#Rqm8A977R_zH*DuRYZzDNmT9&e0|MQdeTHv{Y{WP0NJbD)E z^eSkqlx4eTM9G2dmi3RDji6ok&?rafSeDRrcldJTo_Y)YolM^?+2;ATe{$uocC z>uw6_iE4~${&=tDXrbAm-P~O=^bfV=ckd=+u*Pfcp^rTHW`8cp4IM{iI75G zI5>s@#3_*Ou7~gMD=)J_bM&t4mei&mc(b#%^>TKk1k3H|lVfLo!-2jTY_k zxMv0BB4X=C6+bH4b;|O5?0t;N%d%`vbtlI+$EH~9*u*Raau(u{Vk5ol{B{%{R3`Xr zyK_+r8KTUc8l*lJbB_$>zs5)4X*;$1~q97K)xn<+ns(s{zHg%3sKPJ*wPLb_K6u;{6 z$NlI3%(*^KmbILK9s5L2qjNNLRhdbyv8>VEAiAc}NXRlX={Vc(x2o)Nwk7|SO0!16 z2)6eotu9keQm5ZBixzVhs|K4r=#@!1F7oK=GA&)LrAS*00mdHXMoD=>OL0wq;D^12 zMQ{ga`%232q=Le&=fD`TE#Sy~qFv2vd{po{9R;O#90`drdfJPA#y8qVphlZr5u)?^ zx}T&^yh1h|pfZ!0`^_JrdyiArO7|Wic8ReubxamSuqc{-hV|fSHf|9}D@C*!$~a&C z2>~t4o$Ri_4{{7w*@9GIbV&TdedzZQU5f+g-pJqMZagh+pbN3>M6`ZtuGgWBso-Qf z#{Cu{&qz7UTK%Wv?>lEXXu)F!MK&Rf0}SR+N}2(g(ol8t>qYFqx#yC#1WG4vxkvU@ zDyxB@4*K=$mu&CeiS;b`*`43?{C=!AZX;D>Z_?Y{btIp}(g~>j;h~9ee>#3nN%L<$ zvHg0B`y7|KUGIwSL0MUj)JPNQ_XR?!uv7y$-tghMrC4;6F0Jl6F8BmB!zcX|MfJF$ zhqqPGLN7SRefjI_JsLyG&@QZHel&7OCgs@9V?X>k&k&W45ErYjWyFU!yBYm2IXio! zlW7gZH4|4BFTHIetz`u3-mB>^-p;sosma!>@*OnC(_6B74MaBFJu7BDTIEy+cqf2} zzwBB=0VcKQzyT!tuK~~?Jq0wbnbDfXOHzd51o*!lT4BF~JpVO{Bv-ZWM5+^EfoAw6c zB;LC=&(2czhYIs!w6RF7kOq^7qmAIa6!@*|`3~;BknUdahITiRg>qYFHkzzS6I9FD z6rS}m(*Ep-+rAG|zwGEIaa-b$#w&zhc{ye}2R0QZ-tQkb=}y-BqinE}B-Fn)x4S7` z9wwHDVDa(N*$tPQN!XCdSwmj2Um|G+EShb<0ok7!sMtcpLqd^(UzprsUDsG}TpI5Y zV|p0_g6Yiu4?Z&y#scOro~q%sDpcPDaGosF6#so+qAqhF!=O)5G)@If{}{N9$-bD* zQEl|5yvyw|2B(*yFs7|RZI`oEiY+ZYJ>8Bt?juZ`c*L&JVUO&-?_epip~>Ho;yd-{ zj}nq<_8-Z4ETD*l1tb;NsVCFiuk3o2mhZWy)FMBR_1J1E-O*YOY95GA52hS9DHR`4 zcN<8Iv9e~QG|rAiE~oU!ln9d-Ad?acq<2VvcU-S6xhVON7(*ERU;^N_vMM39l@%0l z5DBf^)T-fI``s6<3h(W(b}G$dQtst7AftWf;%Ofrl020?__>`*W7k(bcB`>#7jYo0 z0}#7@!ZCi=aqru6JoeH&^u)MS%#9(3QuFxl3bz@F)y4C+rDl&XMlN+8wnOft9?b4A zOGSq{c+|Z19E;wE?caZoKN+Y;&|d%5uLIQrSEdhNv3>Cx&3Ji-!X)HDD`0DlIm-or zZhoKa@MyUFyOUK{fhpTuNa{P@A=>}ZjVHcctu0=69M3*suTmEb_R>WhA%H;~D|S7O zwZB0|STFwWSrZqVzWGC)$~j<-DoHNA*As>nP{IdlK$P={TbqyUyc)oznJoSTb2S_= zY3(9kr^_@L7rlyn^%3HGy9=x>&00nJ1!%g3_-<(6@Av?+b*}y!)Nnx}suocXTwyqG zlaV4N8!Xc&rIs^*qU7(_c3rNC_}MU}1R3l--R%)OTex;MZ`A5&W2J;waA;j$tF95a zA6bt?`XT@{lW<09r(Or1luPM7`;?T}fNw~w46U>2^?P=tMWj2-@h-nXc9e5(<^68| zF5bgzDp+vM>eTi0Zi@+ufi5e53yE0h6%(HYAfHQ2#NIHz!VE?4AGYQbqJ^6-U>PCI z_->^}YGbtHEEyX~rc>K8)b~H>ZyEXQ_}lpQnpbsUn=q)GF;UQlq-)%&`ep3c0DrHN zyQe2g3P9Cr>*~ggc4PemXDhAhQfLN#%Pg`-t5qbn`4mXjlJoDEL+FhmXhUnd+XH$> zo>kc@fP}ouPEhD}o<>GG$#TnXe)5LSO?53J(bPuNw;Lhho45|3VuOGtFEx$Me-D@y zkkroYzdyG>RB->imf`8Asg!~Oy{RV$<3_I?Tqc)5c{v1@&ctpV#J(@js%5LRJ6UU9 z`iSET_$70o|H<81+*V@&bewa9xMVt{y~K&r;uwK&*C#FhO6uX4!3(0b{-xG)C(f`g zhn~;c;oX6BpaXJfD7i=En#MJlr?VJ}6Z<|of8Msm3)kX%kJ+j!c$D1=`mt`i>zW}K zT_1)*vjZX79z^nUnVY)BD-2J1nO{);QRNI~u_e6AUmQ7};GeNiEzdw`E3V@~?<$+^ zst@J1xwZAZC`1TiP19B&@d%Se#`BBI>c`SK@l04&S6aE$X)iAYhD})agNSu7KHpp? z)0tP^r(!Fv{pJ=?jHsLMAJw?}U?w1W260xzW6aG&3HZVO!(B%vFvk5sjwMxUCg~pWj3?{3vVfw}UgW)|gGE!FFiYj^;tS9lXV^Zt6 zN_UI6&dcq_-;kqy7*WJiMJ7GN$ZkJinv z-Tp18XgvGQ6YT#zd!vzQ<5tSw`Bdv$4JPYviF*|ln<`q6IeT1!3u%PrvrpE=>vK?F zeVTe*<{^&nex6TJyUD&7{&k7uKZ_Zt8Db>i+n>Gn-xAMj|xlqa9u;<*4Ydt=5U=%n}kZZw2 z=`m=n(A!axk+Jf^g$qDk0Fi~BOsDdPm$^6T>=s{HuxS(V`j*(I5cD?E=Wi2IaDeIU zBFs{mS5|7vmh5B=p{PN_Q{ulq8m#!1qz zcE`K<`T0q-o0`OWW!8m!@+MyVD<>3ZHZlg-wHm}xywuWf4QNT2*G@tiavFUjWhovi zNvL)?t+RhLj_$~Kgm0bLB@@0(-Na|04A0MeF;<#=eOjWp@&ac1D;8qfnu+-nJ-)LIAO^PwTps( zA1scE%A4L^hZ~lGM%8?42rlS)*9HFy{ngiqvk${3quR-*2I366zo;nOLcvI0UpVgt zF4mO_{I~4d;sK_cFy@J8Ut)2yljcF_d~6L8HUU$j%ZCvGoTz*ceqJMk@D!tNs$tG1 z+Uv&l0S*5rDJjb!$hy|;7)@(R_S*>Mmfhm5Jo&C~r|LZ2{)cHH-F{(N-DqoLMRoh` zgC8?Q1>G}Eqmi_e)|zdKAg0L_YFc&7rai4w%@rvhsoOSx)|Yz}&uTA9MPxwPzN123 zYb;v7ZvsLK|!03MCu%iEL2jew|ZxYd3I87jx(>VUxg+hNCjPc3k1G;^Bw&S5xLyWaEyYe$vwGfN0}q$up#} zxJ(&dDXWUPU>XyJ=GiB7`tp~ES5r#!zuvz;W&dth;)l^gj;^ly^zC}#X476uWp&#u z7ct@^!-|d6`tl_n^{HP<49PH;;qeSa$i|=EuoN2oR*jZA>$eYzy-qBg6F&Qy!sN4X z?BW<=+rb+6v}{*rsy&SqyRc7k>6r(jQUZ#a$Os=qA$A8FC4GJM93N(H`*crDzn#RB zk7}moZ^G?9*OKRbT&7Rh>9hVQ_j1A9BioWP_`Ocq5!d{OrXU*_gnFXq}h7jE_@T zJ0LIeM;ZpU1{z(WDIWwhgW2_KoO8S0Zum0kol8KXZfzvJND?Wm_Cguw=K872<}r`% z>byr)-s_CxN9!Wq^ucP0PG2)m+I_Bv8B`x?m{E1^S;Y)tvSs>nXHqbP0Y83KKDc0mJfADAM1caD-7eqFnn6_{j$B^f&9riQK zaVGU$lTz6hhN4SG*;d;bL@&BHCd>9NB^aR&*5b}s=9R<4hnuThC|hz+ZN`G6YC0q3 zW0l5e@fw8B?4|WRK>(7z$Og0L>dHg`u13$Bo$vZzgjXp88EPm%GBl=Xo);>mdMlTDk-Kt5P1zcAH&`1!Pg^wOR%Hxv`_jMhSefy;E z5)jjXvGlV;-g_b&AL&3{(%vOHZy!Y8!HqkqS@CFQr^I&gXsxXPfL>lt9y#1CX9_No za4_SjC5;xmsW`eN7E|))uU~6Ff6lUL!-n>~0LZxq+48o}8(TyzP9{!VJ}gho@D8Ge zzV@TUut&}|?B*qzlKSyJ=dwkHA!>`LwrXh^71OhlBX zqJgyY+Rh28tt1_$`*$F8d{7vxn@PyHq~mhz?V;hAo}MqwuzG` z88BHchV1`VvV!=Sq{y4ugZC&Yy`0@|G_$>>BBS;$sAikOtTIPoAnsVhh}`@ZB}(*; zuJ20Lvu|oIrD??!(_Y`TBEN+c2FcbfEY3iO>TC*~&*7`W{6P?>h{o*oaVqY8gx%-$ z_-y?ADkwLgZQ-)+Si!o_QZ=rp>vZGrrt@IJLEd=$DY z=h5%?99OcuEf=d9DLrh&SaD!sR1Y&M=LvuyC`UOB*a>4lheL{> z?eCcEVQnqow=ibC_fkYFv^m#9+{K=Va)lLbJ~i`fj7V51C}=%S)_Hf9dQS_zDv2Iz zg}vT(cc+g&3c&o2x8_z2=wd_aaqvx;9!J!US~VJYZ4TFreY;Bef|xNvwd!p2J4-O+ z{QOR2W+Ty)5Y`hFH;_%paVWKJkJd^tlaLOJMD0Cs%3`5JWX<1IfX?CB*?VZM%iFSz zcwaDX;}^pt=l3~`1>Ln{1=Y7Ouy?nS&RHR%1h}{JU&}__UYljpl@q=kPiJ(yV1~G^ zJ_gMc?&s&jlaK5LfWj5t_M=TGA{?7HoNz=Cxn+OJQ7s}{YH&T9X^&J3`35FWPqU^|5mjquMzt353{Zm&v$S1}l=-#x zN{8++&E7`+*~;hdvvM?E$Ro=Q$W%*P{9qdZ0~CZ54)s{Cu`(?_bLUGW!5I5lM{_d3 z#D=O4cm;b?ZgMRkL;%!$3%P4E2Q>T!f}7+ zh(y00z39Fyr_~jV+=L%Ghz{#uyRnB(uoqR1vj?YxGshu`t#R7YCpMJ&K2f;EzYolV zEi*O4R#t7TS?a_4Qdx`z@Zl(J(Q64hjID76r7<``?AZ;L_F~4TBe3A)I3%K)1CSvR zOJ4#wcek?gLdbQx({hVr`^Po6ts_)B?PV5HY-`pSUtOn}bW8Go34t~1Dsf-%Hxx#u zVVOka)v31MaDB*6PYAXj3}^jN)R>+ioNjdiFbhE9Kch*1v%fjXCA4f*E;%yCNzKTA z4LU6Pr7{7A`b=jHUBd!IbbMSp7*LZ7&ZTIg!KN_zxX5n(U8@4HJGH%e!xmPTniFz| zpXxVRw@Fs*pG@T5B5z`bNz>JhyKJ#6#8+?ZyGlrMP_Jpck3_pf7-xXx;17I#VUxT= z1mFCQ-Ce44J=Rwe17->BC0?NT{8E6(^${}ppZiQw4IgupI&-c6>;ttrNO1lXX~mx&isL zRq$8wvQkW0t*r4fz+&ahL-oUtQ}!$~Vs7!b0&$9)E!!xk?^8-?X`Gq~?b51$;+;S9OgP7lx}QJ$JRflhwrXCvgtNUKM;q8?#?~?}>viS=Q~>J; zfs7;rSr^{~P%iJxO4(C8tgZJwI;Kt~S(t&dX2js*DO?9U} z)1I=wpitIOO-`_6q^GLxs<2`qTZUMFnDQo4Yl%EN+)^tlqe@g&rW~oi0HC!0lWpO6 z$qO4zj66I8c&EJT!Gi}yId=QJD02T1>%&AN1I)}|g2AKp89qQ4HnhQZtzkK*91FKs zI*+0*^(m4v9#N@RgSYrF6YV?hEg@9;@j8i_?L}r1673;_o{;gtb=ue8?z4qO z4~w=&8H7MpfnUl=rZgtm1A48U`fJv#VY}Kb*1U7wS-FIb(SeC5ZNcekhw*cSBFGG3 z8-}E>y{0F$Szc$atI`a+xX0@ifZbBKKu+(B*zrZ&V<^4Od^{u>{>-bl6jp>(=?6}_ z4TwnEQbh*X+7y#o9~z0h@5(l`3)^T}O}&%p^);6=2Qbg?X^}6Y*+L;XbEpD`Mbtnt zm`xJr{GrTQpJb2po4hy?4u92}5@Cr1W(4rY_`A>I-vzj~2(u8vY^r8y1rBAz3laFq zd-fvd3lr9^O}h;s2+!W=VIr4+>OZ43#Z$_edD?R0s3`C}K1iO_s=Na@|E zcjuF%^Nz@3$DCF@SGVi0p4wOfuZ3ae+oXlBXW~<6++OXf>vnz68l?5HXe!kp(?aYz zy<2Xrn?Pn)f|pP-4O6K~QbXd!cOgAims-{m;~h*Y=OL@0FGLG_2?;`LAijLpe-a}c zmJM2g)2d^aRfytcaQ|`#JL;m8rnS;JA6)vj4<7552O3JPum&?gc7^ziT0};q9;@gd zpDk)x=i#^Wl;$c{$MOu*P(tL2jpDkhQ{b3EK=ud!ki2zW^(R~^uboNq<$~7bIW&f^ z{`{RriKZQ&utTGvq!&fFwxw)Z)#>*Ld7ag$Zm-*N2+{};wUcJrl(ozshU(amA+1L{ zkW`$Kl9FeTNl$rC!E#-7v-W>NlaR z9hOO=YNs6>Sa4j~k%Xa5jBO^mFxN6;s1^A!7}FW1DYP%bFS@uQQswlIbpYQ`JQ9S~ z=`|Dt25KgG0TL^Q|IVmEkFe-rZ!$Wa!1{IL{{N^4Hn~=x~=k?86wXT zugPs-VN_t+(00ur?f|I0&5O2syBhAg51Pd1sB!=Hkcm-ERbtXOn8FbJJOEnM($dnR zeL_GyR_vOrIK1YI)A(j~L_?Tbd9Qrx!S~z+9;~wZ1VLtnD}VnKt%!4Mbd-7g*+0eP z#prt4OHC!sWxK^CMrGr)g|8k=kxr(_ipC_aJ(nih&|o7o zkNt^)cDb6djjISCq2VO!kDBm08(1DO0@`h{Kx7(p6*$E(sp3-0DUyXE;N7j7Xt|AD zUXvdhBlE7-eRRVQE@)WcZF)93YNSvUTc130Y**z~B953ovtK+~gzxOQdO`$v7in@O z?zHDs6bNj;g^&H;55D?E`E8*yEKzy0}M?S29Cd=34=WV7(|oUfhcEI;FsTt;5Z^5 zoQRN&g+epl{UNYW7Cx(j*cKN?)z7=P%nev=!R`WD_@+oY@9~_0hwWMKdCR%FQtYcC z0tf(1ZYz-bQ{_kyA^-wE{mStPqo;v(s8iOw*-;6JE$n6DvuTfyzVCMp>cRYJ%G z86^(pC1Vl;WK-C1jN9U;Q?dLhRXNoV5q^+JJIkSBHJ9}(g^~KozBrG^7n()T`9*~W zqrY>7IJsFU;^UHCMjJ#DSI5T05Kbob6j|e>2q{Fe+VyBCTHfc+kd?A1@kgp8?{dn~ zSODS(nL(c>-L{a6JB=y8k>Ij1^n$m^`KksYuZfepkqP?YqRJ4w|DN}!?}twls>`{z z6MmUIB*VL1h-cy{hM?jz)|nF=5HdoO4F{{oML!{4^JH$K?wKeGc5l^%KgsILHM zLVOTV+7xGf9Uax5wupXRq%{*lSNE7CJW4AWdJDA|l51CaL7^J$xWRH&k76=y%i_+- zR3izlWfCs__KXq~CW@1t!oMIB0)j67JeEy4!aUXPVi0P7%Lge zFUK-)_Fg7PB;Hv9f^-8G49@sp;Yf$x`yvna z0$sq(4fO@KNK_YQW$}kAI%XPV{{ztvl6|p)Gg06|l_}6bSlhTKc=mGPiVRH;AY08v zRL8Td1Ag;onJ5BYgUfV&o_*2};K?7>dI+C)UHR2)$9G^)MFvgm&Jl#mL)eF*)u8af zouEp`g%iN#E2hI9;UU?)k-m!apk8T{MGzXTxSIzU)ic0>O1Qr|5pR z;fGsZh>peAoBq?@T1dr;Efhf#w59^H78(3)rDE4-jiSh<@M7-~9?Ri-K1VgS-6?W0 zvM@-}%`|W2m+jdFgvTV1VyjVu&GjF){PHDR6$XSa@#;*gRsk|ZxLcFh#EWvE)kUGI z+h;Wq^sfqv2!vKKTQ@7EQC%4{Fz^VlEtqC@>fRUWw|)^&W00Mu*h%7`axK2KO;?Kv zF*YG-@F{UG&GB{0)FC5i|Vf zz#58+;(1?u83@%I*AjhY?J&qQ?fU1twyldXaFL|h=x2XU8`&tAum++R(8t&ZKvS|w zh3Y*3Sb&G2>Ex4jglyop8o`7;HCks&Pu62uhxT)%u~?4M>!S zoScL9X+Mh;C;;y**gA^^P~+uyqoziUzQ@bWt>Zjd(z1m4vEh^)61+<%KM^r-NF^hB zTjo%w5efyDV<1Mai@2U1OuRpQ;P*OWVj^}}A`rF^!q?{yieIk^le@Bm`@_{;ECNWB zg(n|=T6X`je<3(JZ9cf?@#6?kWx#iYLm^N5ghW@}z*)sadm#@J$KTrJNAz|&I;=!~ z@`qB9#6_oH<=8ASNq0*;A<~Adt}J*EL77PWdOEQ1c7SJ=;!|lwC#Q8>&&E=Y&kJQ> zw%zO5gM(%~jxVQl|0g(poJ<&|@v=eDf!%B)kiv8x?}eVe4JuIRqs)Dd17Z@S{SPnB zFaAC7HsPR{?`O(6iHLuOLfdAfDGyGVNJY&_>U zovP4y3d{wO_$xaq?ivxp+5h84rN`8-KSi4DTKOPhOoop83W>2|c{dQ~(;5z#U4sM< ztfxw$+1qw;vq|rAqFmZ8N`;ZU9oD)+DZ6=aT-c%L5qr4Viq4!EjVnMM8r>q%KnL})= z9E&v6-WrNFN2pjdEytv#L|if#aXX#t_4iTEGhrpImw=`bFJ!8zfshwv+V_Q;Q|0Pz z2)~+Hlcfd4SW@eKqG(5Xv`O;Y1^ni=E~#dKQ<>|NCD}nW<9fzz9i#DZmJdQmn1;!( zsI&76z;`zm1XO*5(p}iUF8BaRZmUWX-Z;y0PoCd5(?6bLEPxPF!;8X2GMoy|O!DI; zQY3uC0|if_ataq{9)Ca1`VPBNiAccemcMYyzmT$aPRb5?ST{o|ha zcWA;fPY6d2%B|@8rtAM0kQWf~*B#-y{c(w#0>5mr@8=U-Cmus-Vp?ET2kKQu_Me!( z$Q9DI$JqnW;vs(qP3~Yvi`R%pe>g@fq)r+maROOkFJ2sJIm7_f>`2=(y|EbU!0!yU=_# zALSC}PKZ|sj+FQ5s5i@CC3(?^aP^2i1S~MbwTLM`l9wk&j}&d2%=cVNJm2M@N$(bL!P%^02a zLunjgta7W>K=0%0IkfvNw$cQaDP>u96^A4@ zfoOIMgbpisMt~#~-nr9!AQ<=r{qr0qXMi;RxB>n)ch9o_Uy|)_9*C1T?e0$f>iu!b z`(}7}&HM8wAth*eZ_AfDqN<5I!YFVJ2M1x}2DmR0t(C_iQ1cP8Y)}$d1&eEC!MlqV z>a$XuW?tq7jqx#1p1*%2Oipb51ds|vc5T?EG4?-xD!%Rnsrd)NmY}U${MC7^m5^*W z#hp2cCbZ}8VLNY5UM;E8#UKfJ6r{T;DFJrB9YwdBI}i&qAqvCeKXS(`JLDFBg~<;U z+@g?ml0~Q)*H=S55$*i=36Twy0`0b>77#qlCV2DXn-8eW4Xz;K8C}@v0<&i_?Y6&`8X9UB}(q54v3)^`ra!WrTgKr`oEsa(;* z8&l|Expq)OJkSrv>03-lb0>DE{-=x#qPridLTMB{I{KTa4*-xQIDzt~C;5+PF5mvC zm4G}{MK++DHFsY%-%3jQ1?zONB(3krN6E_Jj{I_QNwrMMK=%-K2BCu(=pTRMlO5po z5O5Qkbbo8GCS#RVZg(YUfRy9pUY||)K;OKv$S_B8Z(Q^?hZ7jG@C{&>ysT2-Ft7s% zztM=XqH`>h@nP7u?BaSHr?(l8ASQexvMzek3Tih#8~QrouGk{8p}`f09AQpIRuKk2 zW<~VK<*XQ*Q#cFb7bJzF(a-fL78->2R8pI%8c;nfBR>AL2$u_c1Ymt#yqkYec zlWV?U>PP7zY>2!&Q6e^zxGdSx#4XU$)+8C#seFT>0^Dul_E zB_%JCXDCnJX%1Ou?~~8C0ctK#Z{3!8-EDj@K3Pd-lKr zcnhu$U{T1ZtXGWs+6#t!^c0o<K-*jn@ zKUA5`EFIZWP-kP#^r2goXo(~O3-i>+5>^s;5U5tjy>#>HS~kOfw5Fgtv+)p<3~F12BBB zbC5;@U_p})uIydwqlaA7eutyM{2?-sqJza)_K_()pD2)9Hngm!h}smsE@HBcO1}^L z>Xo3&Dy<9|9Xjvv41^+_*5NvxHd00UP73#n{_+!VCD8$Xz4G~GmD~7$;6jd>~~xDxYR)2_A561ji$muswAwW_eBwX2fd6>g5MLWZkq39d&n{l}jp*>@3}GmFcjGUi z?H+Q%4-3@a$zgN0qLpf(&TWI!-1$lTmBP(t3m+wzFJ$o^+yL(grI?p^#Ci z6Os413e^{jO#qHDK#^cg3- z7rf3v=vNFy*X@~Z6;U@??JP|8#RAPlA)G$ywTca{;AH@0eoZo+a)@MAkR-|>$F9?j zRAQPxa#wI3M!togcRM*s_H;!%1ed>{wf@6g7dfiMs5bV$aUxl)l-y-+ZKcgU<0*{D z^}lT)MZ8%$nf<`Ip)|5-Bjx^#dSkJJ`C#3df$r|QqDyt(NoRk32mb`s*wf^h44nk` z+Y9cBmL4iw)g+h$^M(1{+J56c>+u+O+bDs*V(5F>&8(j8?jmB*+sVGol1~N)Yk~m4 zx(;tH=xLVQ6J=)zx5cn4`pj`i*R^zhX)D_@Q?hRu&mmjR2_vQPx%@kJ|PU3C!}h-SF8T;?I!JUnD$LG$c~S@*2NgU!h(6W7LXt!VXaHaNS>3(kC?k$RpgXo zv{idir{%>*KU0V-=H|RK5=-w!pVUg|hJZk$#VP&&gU=zf+;#c=>d*q6KNpPyQK@mQ zw?Dme6e71-O<;d0BJ1YfckvrP#zYizQ%y6Q&X*=@F)I#UP~gwu-Sb0<<95UIc^LP=B-QH$Dji?oWlk?G%8~sr9b!eiS?~cscRFlTrg`)|jn24hAK4cNEWK_roUsQ_2LN6AbomRu z!{@dlBC{y+K+S4OT$4|VtOjT}fHB!dAlb!MxNFswa@Cv=*+A%d1`$63AfgTd4X_wq zUcRd*O9$Zi3d+QP=&(Fhc(MZ}=&+~V#<@+WN3&{?#v5jhKd^rI9G~_O>ovKdDr%ZBb_N4%c;X}pg;@oaB zwHZmzL~{<@B6a36!jai|%QVx0Dc~>G9W5lRLi>p^XGFd_d%ir~$KEH@pu$Q~?>3Z`IknY>u8a5~p1HI7su_^#qSKBvH~nkW0T_q?0y^W^S4> z8EL;51G(DNF*E_f3Hx{gx+S~cF~8+OnHj4ZSi}+06Gd0I2@yVC86$+p?dHDPIf{Im zoDw~qbOY@Zkt+pd*XE@On39sR987xNzHJ%wpzM$jq${=VB~voetaT$z0(-za0F9GS z)BN)i+QEcNT@{~DRdfmj4#D~SFEOMe;a?H*vHmQS#5ixeA2@PO-dxJIhaTmts=ku$ zX7*K(M>rXYKQMe@um5{5Dx_fkCT3$4$eORG3b)$*bMy$hZo4DWKY%H~ME2Ogo(5OA zar4SnZ6j9_-JZ~T=O9XV@%Re$NgursecQtb8<<{zP*r2z59$UIi*S{SLr1QAc-nwK zSe?629XmTaJ!PhaG5;UHJ5r=uZvAIylSjxQMenHfL^2C_MM+H?FUrbzD->A~t#IqZ zFz>_A>y#lBYw38%K7^n8ZEOqy6?2orI1&3q^n-4Jf0;iucC7~x5DvXL0O2m`icG5m z{c#3C;fsw^*iko8Q7B>j*rL^KqCcqybH{%A9y6!MYtFx|x_bF>cED;`soidGkQ|57 zQCDb%-7j7o2BdRq+ocG{h~0_0yTmPH&Kcn~`2PcxCC-t#JKkNM()s$Xl8>Om>cjbn zyaOJl&EuZ?=k;X0DuF*{WC(Z1tz@KdY*AunK>lO!$n*6MT;WT3D5^?Z3e4DJvFLo$2rzSe_2qI!-ibL!7wDpX!=S(eSp6m%~siNH6W`j4bz zEP3@x*S;Z*Q6~K6%|W0J^tbxu#H7=-w7?hcV4zK<%0wEn>uMD{HhKm$l|?(VBJt?^ z;@^SA=fu#1sl9qGtlF%*^ftA)FXMFDfM{;p5wfJ!)QSKGph$5WQM6)z!5#AIfr;Rr zv2I(_5`&+_izCY&Ilp&^DG82PapU2m%RFUx>tH8B2nj*o@@kK@hiUHE*LHDa(#xzk zA9vp4P1`CD_EuxB0)9L36Gf-Ty48Y9q+P(KV3W(u7~^shfob;eIhwE7OmfO1!_&{7 z$r>#?yLXDaX5~LN-`xA&Xg_}^oaIlQCim(IN5YJS_W~vkbPwee`QehVx7Wn{^8B7n zAu}KkM9RXw3wuCr@#wGIx6RyZDA{hs0H_=s9D4s~KIS7N?T<1#9bhp*;%_lih1M`U zS`CDKP2H(_;5H`mky7p9`u|BJDRQ|rtbnW6bDTKtZs!9<8N|~_5cha?GFeE+%yH*R z91X3{etQm6#UT``fq&q-F*GlMNQC;wFp=*w%ABmgqd|bu|J?jW=GO|`!wrfAav2Hy zD2U!pHi}Jj-E6_fNXhP$QgcdA^vn%-4JHLSZPh~!Js3XmfADO@e9YQN6cvpvt;0lJ z2v|k&_gS{#CwEj>9VJUv!m)UQZj{Ga@gO0=kgb53go>Z`wZv_VSpW{c+s<-fM1;-t zZ4g_R@qIGpoQRdOv>CE&JZRi#AC#w4yJowo%^RaYB22`Tk>aHG?6`>0p8a`fR5Jey z5he15!6IS|>R$aEeIX%8oY}opV66U59C#Pwa*5N)Cb3^n?tY;a0#X`?S4)pXOX^m# zYKw}5)#4$X9~|@2p+#U2>LyC6gTVY(;UZZMdArrn6m)J;74hAPABMte}TABUfZSK&{ z0F+UIygC>dfQpoTvmSesso8U5hG>F7p)y-Ak&8F-8EF+bH3)M(BrW(rauQDQdBd%a zI^Lw2*95e`W;QCS7G(!@adeV9g4PmS?3Y;-@JD=$tz}5yeYOcIg>ldBHC^dG`Yv~a z1ep=PRgXqs1kZyy8;je%N_ccXAUC!SbWIrh+!334;P=}>39%DpKl}I_h-?qpi=Yt~s9QpuBtc z)1p@hS^E1y@9&`=g>|OqI5Q*igQ4jFv`x5)qP6hnKopFuzZ~|ccUKmDogpZX-DO>G zTJ>WiMn&>0^&Q+pZ_fQJ+L47R3Frn=AUw}^0dxZviRPEkEz<^Mus3J93CO}9@u^sR zVtVJ6s~$dlIBw;()+s_qh(Hvn*wZXFj?*Dq$dX%H0rkVP1%e&$BVW#stzc8{gr|-T z{$@flz(LzWGpG`q+4|FQMxm|}acj^F8rO7a+2}i64=UMrb?&sm@&a0vMyN(`|9Cyf zZ9dF$Hc-SQ{d#$ZZNw3%v7gI6lsk!=arCVrl{ zNI@A+?UZJ<`Y(}3)*9)uH&Umfw3GySKtv0R#Ti41UIGqF|6vrb*TpLt1eE#NJQF`_{twpsMu zG?>(UITeuvN$lJcAAljj-H_YO3MkFtZ;IiiL7$yp5cg-fd~alobXPm3k=E+^ws@bsOJuyTrQB zSL1hO-xj?by_Q*Sqpda2;#8IiS_%8e&N!&Rk# zf#eE|`ZgWEpz@^OlK$FoHPvr4JyxbAgyB4*tFbHK&nohcf46eHe<_&cO!Q9A^2!ml z04$mHsxY2t@L7}O;Z47nF1*?A_>?YfiCVBL>h$s~e~b6)<^SpG%;TwC`*5$e2Bj2b zN=n9z$y`y0N|~oDQwd?Aj2WUdkR%N#lp*tC5f+)%E=tI}gisn}u8<;}>!E$l`#JAl z`}4MUX|3nE@857;-%GRR)u$RLQf*M{{jbQIw3XE7a8~=FH&Q_oJ{EPmK1Zosb%&dsXt|gcS!iZ-I@f@va=+q8q5Va_4^t5r{+uE>QN@VeBO=B=UgfaT zTS0|H07DjBWG2e0Fw8a>V43|zGld8|BVbcRq%0>V=Tl-4V7d3D8z=^K2k<7;TOZp~ znQ0MLc^e}rWT;SPZbod~8w?i{!`r0|!MeD()Q`_UoPAt#2x35Swz|*mhO|)Wo3f&G zzAt1*V$C(3)>^ha>ff*+OR7-sq}Pk$cc;edeX;(uq5(Q>g@9I(crv*QprMc6{f;C(R$8bOPoSdYj)OYtF0Ef42v>R zw{DjwA5ewCxbjKs9q~2^zs1@Gew^6@BI-bTBK>jQ;;QDs!(!2mVML>Vty8Mvb5x;_ z^VjP5fQ-Xzt>hpUEE)M7t5C$fxwWbeL&Qgn5wQ@6GUe)-vs_Oa9_3`VkdjHMcS5@- z^aVs#pza_B2CU6FctvRgx^WvApa%SJK#=Z(OQmms6`By9As7Mw#wfY-8EEZMP#1x!BLarCSr#oh{+ zM*;J0>O`*ov}yvk z=vzY?g;Boko@?azav39TI9N&PxbIp{T6^iKUp`J{jf%Sj7N{mxZ*{8lI45{zE%WgLgfE(yJ*Xdl8JtWH;fmJn#!}-A>k=bon zqm(-R1d8U$fBK5|5P9Lbw! z;62wVBZSk((|d@?ukk8hAUwvdau)ga0%15&5+o6BMo_gdUwTrP2q^cv6CVM|T zME4*XWfT66GPnMJ5yS-As zTZ}OvF<5#(ItvcT(9+T}gAQB_-SxdDH=08sRR88jyjWPPzkNrcCI7_G0=Vd`vj4kA z2Ck~_&ld&qJhPxW0C)vn2D(D&1}+}If7m&97p>d>yH@ubtWijS=OmKabIcU3OKe;H z@2!V$7ub0-k_J?i<^nOj?l0`HYF$TloR>s{8S)&s{FB=s=JWF}ib(68LdXLCC1r~= zxq_ucWlcZ2N%VBY14c48hXWWIKy+=*i1x#^gBdE!pfayg>=%+urdf|uB1ia5*H|B6 zY3kFB&mc`bvU1R7zYb#;>}dfBFc`@BFEmYS8T*lv78fq+}7D8CE*ab^86$b zc$1Zt)jtmj+l_rjxh7^JPo&N%@?4K=-$+aQ;t1^~RG?VJ7l>ZN6nghlQzom{LQp-R z)QI~s45l=ELfFZj9LLTRv@(dS#S1(ioiUUso+n-(Fj2)NBtHD7tmh>8@8kV4C_b<9 z{KL2Wp$_aESxL|{Z(JV|<8qDHhXCgQ6m(dcmLm(78)0+n{E+;1rp9(R#C=E;mOLeH zTcRW{Z{pR^hqDmwHt_OPW-@Zl=$}{I?wTTg&*2dFRqk=P#5DFDfRmkvQnyvpP^J$< z7tx7ovZ9=0+nzHUX;3GEBx;oWbx*MgVbDF@R2sX$ro9Wo!Q(=aZPCSdFGN`cGrV;3 zL81+87!;iY1ezVjZ^>qJCM(0!o{fk5Dhe95dHv06Qo^Whnku{HXfE4*a<|-1*0sb0^g*@dz zRKvFjrqk(47u$qW;F&;$Jye;}RNAE|aJUqUo0UhHBEb5s6&dS^H4YI~ zunhRxiONYuM&=Yug1?nFtll;5lxNQupc(xSemVvt1sl4@w#jKD%F}}5;&@dsxMr3o ziL+y_^7OMitYSDfH(uHV)eFO)!F9(yd?a;3WNUAeqG3z+7>;U4J#CxzaEFV=s@Db{%E_-Dp8D5zx3sd8 zd>rKA$5~khy@p2B{r3-@OA#`h!Ago?`Q4XjU2Ijsz=9zKIwJyh&cH9&eOov$@?(=< z`j-IcE~cv%0;+#*NAHHyqwa(fR@Tt?8;_@SBc&w*)5dT68hcruof&+V2VApDw>)Yx zVx)l)g6ENRxzBeN%>{$Jg}dAi62ZGX|J|}a#H?e&DeML0d3!&zOJTOhhaehwvfSJ@ zg0gb|G3k*4E^GXMV1Yn(h#4bJuqD?&vJyg$rYpnH5xcz?VTaNf#t|4(lNHoK&zsI$ zFAjHJ0M6F35x+Uah6F$1NFQE>y8P(Dhp52eR1p1X@aJoC1c74#o*VnL9=7m*ViR99 z$^#CE8a|=1;Hp;EFSf9A6MAyyIWe8W1|Mm zot83^GUCX!$vUG7=ZTuHt8guL?ZgBNv9mXzTRT2Ab^BL)siwoalAB$AOFDP#kDDcLJ% zU#(jBBL^)VB?K&O0LFZDkvPZAu2M}ZG8AfqatvJ;aG`bfeReO|bRpMivLAi*u3ftl z{m-M*Cq_i4cLuIvoNBXrVwB(zM3+@LT=r$cH*N0lFum&#%m{~geXj&06v}qM=m}Xk zXqc?qNU>R4*T2lKP)+@<=jwbtfiU9t<#QAK{+EeUhWhJhaIhc9C&AdE`E?J&<5|pNvOAWKYP8>UwckLTj0TYYXZ z`z@oj)WJ=+&-;E>i#0wiA9oufjgd$7$6m8HE{>cjb4CEFpaj9m1*6Z1nHkl@TibKF zT|p;SPoVs*$A<>{Wd7aV*YU=$yx!ybWJea`PQn2A>+b&FY&{?EXl3o=jd1o*etq*R zvUH%!kUb;6IK=KP@7(2}U3nP?HT|YivBqm7I>6qJ1vH5pICGLA3xC=r%dj8JN z67jhA_CfSXZS(-r{!3cEXIeQhYrdUM6mAW`5`i$#0)0lvRr8Tul~1D9%ZF;61(?$8 zCv!t4aZj3U!SO5JIt>N}ZD;1^qY9WY)f!q$(S-8oz;Zb=L~6=Oxu$yPFLvw+&VVX4 zzDN-=Ao+!g)P5=l28IY<#nOUnIdz$D-Kw1czTO+Xb1sDxR*s}d#!YC4Nzw6c+czAK z<~!u)T=;%(kiOeQ0md6}92F_-=-!RXLH3@-3IUh4Ooe)_L96A1lM-+nch-}&y0&k} zeHtwoFTfgVSJ~q<)i2YyFPVG;>Nf=O5-6c?%SDvXaen)uyrd^?6}%3XwX2j98WEt0 z5QMUkxFwQ39+><}x|Zm(l$lRb^ZimrWVbFheXnFpp3yG4AtCxpoKz1-Z9|ZenWBP% zsqvGrq^Ygv-UY$*sO>gEgIZLEtTi|*Sl8sl9*RjYvhT9Lmy!0vo*>6yV*Ib0g+>`8 z>P0<~7pyF!-esa$=|pZC?trSOD}m1R9Ax}JC6aW;}+DlCo?Tb?hOy}8tHXT43K=)69kYv1_~ z18nQh_s_NNCsO|u;l`aG8=u$tu6*6!^oZC*Eh{0~H_3`JJAS)+*__#rd+E=Y2~H#~ z;-n|FA#aIxl(1}+U|)-!!bf!!Cb1*_!%Z_nj2&2xAQ=QiC{qJ*_EVOnj*prQ`*l)R z8C6!GxUYx!nn3a?nk`Jn_As3lR>-ggO~T zJ1lhf1v$ptI$RE5P&MEhsbT^<27r7B*MwU0_)7oOZ%c0nDN7`Iw|Oe>*Q{k!rJL%= zd$6NTKKwa3d2zs3J{Y+7YU$LKq-{#>2RG7$UWu<(YiC}mv~XIwTu12cG23fpndFkd zJO&bz1GVN}POQr{R)?)?u6~1>v4fJMyJ(I>2STN6y;EF|FavN8SAg?L;W$T~c0+fv zZ>r632>^2iM4%v3>wwJ+-~LQA795kL>et#F*5!8|O#6mVJQ;MG;{CqycGMNigPqrWU?Ka1Ih9?BuyTMRtKSbaAKPFL<`n zIBIKhjYRX*0hB^qm45pV)rc|B$p)RfOwq*4%n7W@&D=DPj?}r4PvWZS-I3%&QrB~> zd1`IlV-l2>?bKp?bdV6-A^*0$;=&8R+jn@p$KHiP5o$a=Hu3xQm(|NVJ)a6dH)v=3 z555cJe-X7PBq%iovfNa^Cfh428^?94y$^d{gAVeZ;4`Dk9RR4HXoHAs^RxI(1ZxVs z3t1hTy!+0l^tt;A&$}0Niu=TOc-}e(aU4OVM|SzbRkS*gioTag_L}jyVMX4ulI+=~gbP1OLJ;~mVAgvj6%eSz z)udJ)zCuPp9f5n-Od4GEYU4+zI;>AO&ER#SJWAlNGjW8O9CEIbsWN!TU zmlvFc>=Cg842QM9?X$K&r8+*1@9jE=X#4==rSF4QEy+s(6~l^(C;=A|GRu78;WKj-}}HD_~%~nCSYZh9l}#v*y(?-BC@8P_zugLAzMC#g=m(e)XyKA{h zMyrtlRDwIs?<=47j>8)m<$r$8xp4OE22`2&XhybhyZSzZKlMzC2v9|AloNg0Z|t(O>|wSRRjHtV0ML~c7}R(j ziOD&!mjcU-eCJL;B&p}63C)u zfh|H{5ttPm4%*ZsZ1$jeT5DW;9ZjgB_^&p;T@e9)b{=qi*AVq`Hmf5u!c#C3fb`Tm z93MI!%AUFxFAi2qOVNd4lP;OdgkB3b1+Iy{OFq^Iqj>wLs~{Vn;WoZRFx@b*zcb$M z`sAM3PNOx0^MH1!Ae#3w-D%b$G{F>~M!~J5-w%2Z2}-In89CiwZnoYMFBFUN*52Gtn~oeab_~?>f0fNa3VXRK{AB)y%uP|Wi!I9C@Fu5l60DnOE*&OCTi=5} z5vhCM_!V6I(J>MVhs>!aCKAajNMvQB^jSQkM2>n~-JoUDJHFM+y9dZu>225Y7HN#M z^;EAbd|VxEj?;Lt1czy}zZ)-DZKkc9pJu!fORClWA*SE2^U!q znPJ@CKhqq6Ei*&*hlmDyF*ZYpqc^R=mPw{A71n5=d!E@Bz%O?S@W%k*w)erYEAdW~ z;_ebO;NxZv6&Dr)iG=J7rX#5yyBa)bKMkXp?S_o&%1!RpVnb`xOZ`G}ULN8d;F0%d-ow^ zVQ-99AH^sE3iEo{Fe`cUOgK(c4TR8d42sLp!V}V>GuY?gsI=>F?Fi{ay!TDfv}5==L^r4g@&@x8v_m;n3QtCxhD0bxSF z1g9U{g~>iBAYEjkY{FQifV+v*#TO2JIV|t}FlvBI2XA)^?X2F%f3?CeoraE3h?L3bg?Zg~pK|9P)=c_BJy%Aswv?d>^=V!DM(a#F zeOzP{V19bd2^HAfNF*{InmRCyZLCFeVcoFCiLMYYJg?Wnl6ohwW2i4yE0r@5 z;hzX+#b#(xn3XpxaN!3wXpnWF@quD^r5f#kN8z;UN6d{Rx{pD03Kb4qSNf(<)2y_r zCB1Me{MWu&vhTKRNb0%H=SMKcgRR5!Vxa^Mw&y)>L9Fx?Ck9SOUz08ZnD+_zD#*5{KD}B z?wL-^ao0n69L6pPzQlh*asoy|h|N}$Ja~l7=kiG=p}>VfoRyG}`&*(ALU?sSX^~Vp zqYaGsRPZXoM2`C)GnkH2l$b;E22ARs)5KRHY9-o0w(+sd;tuWAE|k0G$LDaBj_+i1 z$7ZeGJ6%zm!!)3-1dC+_kXhp9`{No!`wx;Pk4TIn(DW@27;~JtYy~?iLYloC0@yB* z3t`qUR^0%5rR41Rz`#J(jFNtI4V-Ca(dk_VV*DCXkV_vEl7Eje5}uO#jVuAhm>;DY zghm~&Mr4J80(oY&M+spT;G(7Fvr4G06Ho2TgFY4Li26&I(-M`+k#9Na>8Cqu9Hgs9_dgS>>HT)eHPvnsk%1;*R`}{A0fc7qTVq)d!_p7K&*g>>x?3Mkn?? zJ9N9WHe9hY^J}A7yjy*29W6~@73${ApRRlDkUN(yt-WsF;B=E!`5h@0L96CQ3|)w^ z?x?qE+i_r8r}XfJ6+92p>P!RD07e|-zT`JvIYENhW2|Z+5FBfhHZw*lp18|&Ev*?q zjWUf$Kj(n2g=n-+L8aKGapvgE%#uuZcnqRDr#*HEP7-^hoFmfNxAbX*TLV6a3Veu2%iYko zFh4C9#dt)O=5zUA5tn=T?jsqFdC|)*LJmwYuI&0Ny3|r_Pht&u%%@rP5V8X&L?b1+ z1wO$%JajpN$XdtyVcX=_7_S^#U1n5&O`+W?w_}&S&`n~E;Pc@s2Pdr;GWMYXiJ$HQ z&1zAs{hGme7L)W2n~3B11A8H}_X-gr4Y7lrjar>zihC>R^U+9SozJ96YU>v*NAGSY zb@FR&w$r+X!LUw3I!+|&bxy;4g!7mZ-_J%11RkFmzNShff#7#UJ^5_VGe3XSX-D*c zulKL?O{6Lu*TJ5P03l@1k+koUlup368r0j{Ye!D8FuBWVC8ixr(4#>JAOeo19RdLO z5usbz+<%K11Hkn6>IB!SRkIVG4BrG+@vlQe2IZ=eL({;XLq*&_jJ^_8B?fxOhT-{u z>}TKfI}f{6qcO*V&GtJs_xX(_llb4DdV%V{aCrnpsGX-20-wT*c-(EcGO_>obuhLF zM?u^Oe|wnLR4jcsJuM84M6K>J14W6bWzS)oL5; z-Gds))YNZ z(Ra_#DJrsc)N&5%RT?GGn?%`;Md;6;-Z;7JIg;D`?l0!7TqYDyxD=D06&4egf#g{B z4aH+4BiX<75h6oxH$NIW3x_Z`k*71h3f?+s;#KfeK`3Rj zeG`(EdR8?~EXCyH-d_eGq9~~>Tb7o?n46hBitUhHPhaZ(A zCkykLZEx~$MieC%Ys@iC6UElO25ZW1T%?n9%=hly>lL=)kVOYl0yp~!UjiqnLh^aOFWMo~0y@A{3h`@WM9-r3ojT zXGMQdx_3zqB>$J_pA}4xdN1d=tmHTB66~|BqMe&S!~s%sz16^kF9Eg?p|-qxHL*|e zW>$$Sl@3Vi(SiPPvy|j0=psfKTwEn5r}deJ^v(XDDA9Nr zcUXYa)10X%>!3m!5-$s5AhD_uay$q`r|0>)K@GVh>-}>2YzNsUv=z<5PZOLzgD`ST*PK#J;jSCZWh>wyvyCEF@)VbF(agdc^Am>oI1B)8*F*5=PGb2duWx-?@7#5g5gpAvx^)I`hH)bmW?tN zsodeXh5L+}y5JUE5-6gA9J(Z0w6S>&Rm!UT)jq)bcijvAb+8^+v`%3=J2ZeM1>)8` z1S?{6qNrlHbFH6?A=$~I@RkLM)>_b!pDfhjr6QuKlIS2~6eS0HH=ap0_$998c{pOUvo_TQ_V$K#v01N zJBInFvpCTUerBU)m4nnV<40RyV1yPP+lTw-Xmy`$ygl%oi(j4qyzJOfO0zlXF3*k9 zz?L%fwSp3vOcDe|91Uy|G?89{Cj<{XSipd|r2_3ImP(jwo z4PxU1UQ`WXY?uzo?;g$WPe*<<_LGvWU0tt59U!BRsc3XMKqjd}x@tGDN#a{9<#m+W z@I5O(rVF!AE|6bwCwn^M&88nxb^IDcf6@Dj@4!f%dbkD%LC$2ci`U#)!`2^ zHEW3H8ndW9G^-#7up9fgwH+YyBb%Mu2Pvq_OflDWO5hL)~z^^4ZQt3v=YyC_Xg*06k34a+x(NFj$2=5HT z@sfBDp(WBYR;=v zjre`0@yn?QxFp)GmmgAz{7OTsjKe7ZhED!63k!=#7aoU{F>2Zt^573*_q`CeSx1>{ zVkpJ!J4aH>=7>@wf8U!s6>!^&hXK>@$R7TlGPwC57yz(*&y(ylm5tVM@dIncL+E~S z>CF$ct;(SZY0X8+|I}+?7@w|*aWO{3BX=W%LHgOF5H>Krn5H3_We8maSGfrr@yIPP z-w42n`mokGKkSEYy%4+s6ZGXQ_2aVDwZZm?!y^CRn0Us zD^iN22ulxPL0w6$LJ$b_v2CRsd-fS~lcquq=={B_q~Lz>dcZ9m<`opX-67yheGDG8 z4|)&WD!3tD255P{vEOiiauT9wnN=oY8ae$&@iyXJADt>4vgJFyu5h7*RM5#>!ILk55x}lXG_4W$G(9ysAx8ok0UyC5` z#pt0#B`cAl5LLB^^b0yB^iNoIzH@V`=6#-*nQu05tW6|x$xlAaDE#%KW6h85O^xHS z!G!Zn+Ni>Zxoar*ATbuq70oC{Cp7Q5y6Y~5rnEa$PK zK{KYqyX>J{vsYP9EVn#$6D=pD71R&%uAQrw;}t?4n*S;U@rVs-3SQ)kYlxmI(wof= zZwk}2s_NP>Tn+o=d-J}T=>7!3?q^yjb}kC#__)J?g0}DBfAeDmcLF5H(_jNq4ku*S zB<-o-xcSj&^iT?s(LD*vAKtqtnEv;jHvCf9V2>yuyO}8NE-<>H*J;g_wmD27C*ggl zaQulyBlWM={d0zv9cPeJ6|QOK_0OpE4Vu>Z|AIZl)>8)qHe_3oNdIC-k2x(tV}fz5 z-Rk$#*LY3#Py{AQyF575hv6URx-g+|pNkh7__6mUj$sTDY7yy0nzDE2Eo-9~r&@ z@Pr?0vckWJ%f)vgb7MaAZN=WBB<+n(ZI@P9OiPJvT0^PZoaLeh`A(ki#1~_8A4io( z&gUfDP~CdpD*QX1-(~R%4ohelr7wa({d94F3q(fU_DpvF9fTOS{Z}$3D9`hb$=PVt{`$Bz zwr@CqOrpRA>)Eaj=02ags6;Z;qKIjY^-Rk><_fDWPhnOjs3IRh5r|nOWQrK|VD^B2 zfN8%ir4OK6SNK24^zqPxm&_CoU#9p&(hSYBxyNcNWJzOUr_C;`*%!hcpuW)4+WLI= zo+yi|jisi3$~XP9 zQz*SUnnCT6Bnlz)Soc)Pf+3Nb7yO~BgLsMP?AG&6@le2+SsdMV#&U#9IrB_z{Ev->l{F#wKsOvjpT?`SVF zD>0NOZFJC9wW@J)*(_QOdNuq?9$4cxPCy-bW&3JoQ8%7+O8vLLTzxEuc4iy6Q#8j_ zbE}^c{7H1AIO2^tXwhXXc`nx!XRm2pyg2N=2~t4BG@h>f=(Ho|m<_sMX433=70ZsC zG@}e;N1^vE6(>PR<@WyRvY+PwnXbK+N1ar0;L$)<#6;r~ie$z6Jv91|KgH7mI}89@ zcJF0NZ_RX+EcG7c{s}>*CjVp5IE|~*y2_}LW2wW^F~{Uwgkh(}iznxp6Gaab3z)O1 z$S7Q;g|#xu4nS*%8`S(AyXt<=&D(igBay4(R1+My25c5#DX{O_Yvl7gz7aaQCON)g zNi%s7jErZlPxyf+TJ9<((9pxImRbC=!zoJSDqRXDDGC<78yJH+&xnQ- zRu)Leu?jjjuN7?2y`e<88?5luKHhM-)CaFb0(PAKM~FkyOplcYX*)A%i{pL^mfsn% zZUOv>at!s2jmQW7`5|YsgZ7SxdsdMp*pjj4z(j@xxijX*{u_pb0tjw90~PaRpe?WK zFoa*BGek$Znv|_%UF)Y)THRlP0NK9ZZ_Y6*Sw`7gwFW(f?vmKV!eLvQ-dYHYISS&; zQVz(TnBt=pU8sdjogho_tx|Owhqek_caPxL`5#gX?hWGgZ4W-3-apGl*2xc?n<=%)M1I|+lisg&FfXubNdfLTJPl3|rXwpYp;CtqkeGVX z>uYWDcKK*?W!M*($@q{$XLo7!Wk=&{hqX6b>6~D35u^`v3%x8WSyoameF_koBQm$= z(`zn7@(oY`_Z&v8K_3-0=z#_S?#b)h+iyrJYvx=@`|=<`M=y;Y7H9~o@o zp#4$JDF)Lr5V|ai4w0Rmq3}8$?Ikfk?UYq}M#w>XI?>+Rk3X>xu|L%|cI_LqemcWr zpB3OwJ47av4UKwSQdH1+iISflAMAdwsB=#47X~L_G3!3ANx3vI;k&lKc=UF`B8%fkTiYfp*wYv~l90dqloDpOsLlhg zEoEjeyZSI7%v431{O*+HU%}?Vk4yR^fpZZac%%;C$^SKdVd2~&ML9@r;!mOX(jf6i zURM)ojT+og`d?Hj_J)cwGMA;0?VD9P2q6YWEQTv|Q)evCv`ViDt6mNoAPQcvg&1(F z-CH3GI@h2qHP2u=Nwbd-Ul(meM4M=HxYNZ$aup7?cb?-`L8bg>6c9CB(ocbtg(}+F zIeSRK2dgdyU%>m>ZPNL3((6=pZRpYFZnE1{|}?!9gaGA*G;tOoaAfT9dOV1){#RCPB%VUoWWxTiceNFINSIdt#u5_DT*pt`qz$ap9=-pmp#7uF|f+I zb*fJsGP(`4O3y)7WT;CS39y=zNYPOh)gRq})M*Ie#e(8(Wx(upRdUH}qPua$rOn0b zsna8!AXCA$XZoq@v)0wNw0%SFv(IZ3R7MKsHZji3T!BNcm<$Tn2l9aFv& z=Z@k-oowqW-cDx|X<8ssvtX+Pk1^ZaC)d7hk&-kK%t_j&c$UF>ZphShjvIJE&s(LK zcu1HRMY^m3^2v10PwA#%>T?tIst(a}=?15BJIL3RUxmL7$=E8DmFgc(4_CNr)#g5z z!m*6AXjM}_i~jE34vNZcwc&Qx__U6p+SLx0j=U)&WB?G)Dnj{vUwK>OME1b_Xdgs7 z=lv(qPnBCi)qS{UF+hS~yrOdq9!R(_pVn8fRpmS<%l<##C{~xb#Zuc_grl6*afB$| zY@OV?9HUK{7x_1a7qc(ZFF9#XAUJN+`=bIBps^ zQ;2|4fSzX+F>r^I#KO${zVmc~WgfZ1zspa?S|8pL4@*pSw5t~E@hxyk0kjj|7OoIy)%Fh+pP26#)$&+X6Q9DGSyH<& z-UoF84vTQKz6}oA9^37#pbyE4Wz)qQf_Vc5lmL@}$d&o?UXDCV*Qj@~g(T)W;7Nc8 z4M726l7_lf=hM5((RaTfprN=ENwaOil$wj}7RtgRd zx$h+y%_%(+|42g0^a!ntTh&J2CA}w3a5V`n=x&DqEG=?kh8vfNvx~9~tEj7@$dC;7 zL?J`y_Sn1HQM5Z22)Mk>kYB_qLF&%{mHfr6d%d$?7m}40?>V^pao`nGKAMgPV5frF z)L%zAMhDZezr8;%+V`X4`n!J9{_=^3h+uE8ui1PQfv#M*hL~+;Pcov z3KMR?z(2oGnJSb83Xgt;>j(Y=9GamA??1d2|0$+0pQS{<)HJu3H0%dX?Kc0Byv^H& z8D3`}P`r6+^VRm<8}J_REw;CR`x^SfLsOO$e6@#_bN|2QSv44>` zh_D02v|nLl*UW<7uCs{IC}U3|P!>%c9Z&3&W5_WNA&jsqH`I9TQtX+2v!SOaT?7WTl1%MSI$9oKRsVmPv7#A`liVvkb z1WT0l-&B|gQzavc;Id5I_Kii+iBsWC!hn9hSIk*Y-Oty2_IrQz{ zmBX9IvwF^}mfl|87S++~;6PP)5w`)%g(uw=X*t%+RMP^p4z1ORn1}S-a$PgEv@bj9 zjNf7iG~7A!_MsfLB!;q{oD${*`{IZ~ivNPtkj4owKR~b)g z)&?X1u|qEH+lmac0;(MTB2%H9q`t2!>!w5^f(gLJg<`H)_CMBa6$Xp&=e9PQJ@Kt~ z*t|TE=Tl|2cctlCXvp&I)&jpYDCaeYpV?z|qPc6y3J4!+zym0^&$&QVA8!Aefl$#l zb#sF91{_sQ>}5Lsnnc(w4?=#?kM>KQ}=BS;x G^nU;&#KIN; literal 0 HcmV?d00001 diff --git a/www/skins/lng/inclin-en.png b/www/skins/lng/inclin-en.png new file mode 100644 index 0000000000000000000000000000000000000000..3a95504d2111a0902bc2e7ed89fc1a1a5877daa1 GIT binary patch literal 76956 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 z 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�&cx|P!0sM5$MhuY+O>LJ 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

    1nd<0I31U;LE29To z;ZR(loOWBXQ)#{H87z`gjq%Xo@z#2}+M1evj&=i0;82y{!j6@b?D7Mtl24t<{ZuN3 z9BeGxh&>!VY*3~F3lN!F`+E8QGkvV7KU!bSKYK}WAQAQ;5vBj-dFQ^;c1J{|#H$COA#>xO-4p)4Fcx)6M2lSPz zyP)t0H(KpQ_YMO0HY-6Da3J5^L_D-c0CLX-EhiyW(8L~NcrZjJU z|3)+v6O+8lUOiDz^FP!*P-8;W6D_nt;eWWKw%1eXYubK%B|oJ}AC3S}f<&|ndG+Q9 zVm4mE62Mivx==)5Gla3nk(*>e8`kA7c;nzk``FH-uwxp!x|erzj4wi;%}zugW(>Nq zp5MEPE@eaDCVk_kn-rWbQ>a4l>f84wia}}cu zlKZ>6(L7710)GWjj^L8!D;bvND%(}UM|7#uW{wCmKoW~9hNuI*4 z65J&3*IW4zh>dlXg>+z{%OY>zW*!dx-UslgU=Z{aXaoQ#&0vt-8OfI4xTMWo7TKQz|vD{JmMT5@8k7zkEowl>;baD~eL3FPCyNkA5;=uhC2{uzWEwaZ@th8aRKZ4is zae@3J1VkUEcKkX8i5+N;_ls%tA;@F{#*a&@fbtId7u06`zEr!_O}a<(2oq_r`hrD_ z-`(KTu^}NZhSC>f{&_ulmhB`1sqR5xuaPRzGWpWDbTRWSS!n52J=;rddJWNz{QZ2$TLd zLE(iAs~GT)qVP3R`=G&a*=1MOmvc`IlPh7z!{`bS7XN@<2n!D{e)Q-n;Kjy-tI_qS z2Z_~~2p96#MRdsx9km?q9yA~9R8c9oa1bP_iII`y4rRSeb089Q;ZJe@LDck{XkKmV zm8g%j%Narn}=l`l86a+onm4pj96nPS4ff>5>1_;#RNZxdL)UjHDBPu*Y1XAl&pLEey#1eMWF?C78?aoIt@$1d#TmeHV|3~VQp?%%u&B!08s84jS zE5zq?e@`}I@K04(wnyw{y>eSQE<@swV1`h8{`?YzJv=WCCP)>m|IgYEtQGtgX%ZCV zecS7e&WHgo*j#`y1Lts)i+5ATEDRqIREWKW5dg&oE2CFdUG>OG80wfpZ9^qRPl4c~ zi}Kya>o3~2H2Z4HtJklueO1z{9FEOvX6)#6HE}fHjnc6gc?nNdF_3xmy)om_QERX3GR}&wBsgB3*Awh@zVi<;@$lQ_ekTGZ1J4pQw*cs&JAb z&>nZzHifp`UZB#K2(?rUrd5a7=vaOqYxs2)8si5a@oUyo%Eg&h3t|vW$wnZg*Lx3$f#l zN3D{(+MGqtomgiPResW=J4!!t(;G9ZoD5Sbm#;-55?`M0O1n$@BP|8H9h?bgU`ijIA@kuzL{R9GUP58u~)~VSp>)uOJSoH zGn|9R#ixF#pfeJPB!(uA2<`XHBpaKGb!r0r^ttOv`8BKF^#>oOm0J$aUHH#e%=^(s zp5MjsYkdmD%0mct#ls{DI|UY|Uw;Pw2H4%nRH)qPohHXil!!b=K~cjpis*bV zE;kt|LxeDSA0i8|88R0#jA_dMRe1at;SfjX)wM>PcSeL^xFF!_2l4z(uXvIy3q={z z(sU7o;D=y6gP@nto9w#H&lV0l=HbKS7>GeiTIqh@JpJ*>9o1

  1. Droits
  2. - {% if main_user is not empty %} + {% if main_user is not empty and main_user.is_template is empty %}
  3. Fiche
  4. @@ -402,7 +402,7 @@

    COKwa-i^AIRXMX zV4RB_kQ<71!w`?^H$0FSEzfmC!}Q z*@X>{B)*=z+wIVAOP{-3;p%EY|m zt3S2R!#IHKfkRBZR{bx10O+V_p!;R9t4gO|@ua9Qt zG2LBD;(8?M>Y9cl(m!X%@f6{(OYP*cR8x&7Vv#)?ONueWO79afWuO2pxwYH%U2F(7 zAH7$yWm(Rf$AheX1hk#s64l5wUyux`uN)rw*@+{61+c_`!?S=&RsOnnK`3|1r5}t$ z3FZH(w&o{Uuo+nqCQPi;Qt!Wn?%On#4RQ-3?0-nSsPtD_qNnLse%+EZ;T0sfDO=;_L1$FP#kg7xF?vCqUlLy99I&m2QH&}~%pbj;C#VSs&a1R%0|0=i zU>Aq+%ui+U@7#BmB_|~0se7=RDel>`_yI-z z!u0E&;%{Po+{Q%gBVHqKcpB4frWUxoA{(9GcHS*axfDl*!f+N;qF&a>kV!HhM5|IT>ML_8A6XG}U)QybKUC^8z z=$O0|x6;%3g1 zib=c)C6ZA}=1e7r*!%iXNc4(_?lcYqMHYI3xU(pe1fm35e7boAA@bRXVJU#wzU;52m-TO z+d3!XmU+~{dr7^S^kZeN^-F21+HMv?IV^uerkV=HW%LYyCRir`>ySH+lIHh2FmJYB zs}6x<=cLaR7Ql~($?xC2p=hK^9q;l3}d}ci}aPUB)w|egA%P}7$+_?W( z;hAW34u0C$s)09J2_n)(ePdrl~Is-mEgB9ZUsVrBjMa3G$aVixyGm)5dZnS z$x1+5O^hlz_q!m519&coYNH4)agczO)lE6&cq7kG^}z-*^dj6!!(-OfDDG|JPe0`q zgG_VW52E>Tnck0IgtLEX5>K)84Jh05#`h0X-4^HL^{o%6x(Q~l=Bj00Sv)k+ALGbe zl&C0@w)-p9<{ua20o~&-C**Ih*`VoYvM&1Dac=*lgWEQsR-T5q&N*hAMg7Yi>-ed6 z?sWEnZ zoH*^eqPH!K;?%;&!W8T&Te^mQ}344={L^BPM0p( z|Ck2H4+3+e8dJD0JS#qR_*?V1_V|CjzE?s*>?-~G^~G+TStTb)2VYFUln=G|mtb}^ zY{-o%NLD)L%0vt~%`fQpL!OeKCT zNP(lDHRzHZm?GN;MO8JY!@FGd=>$nb$pU1fv-cR7%nCK+4H=~4g6fFu8z(9QnIaON zx)NM4+~AS?$oBeo2S(fE#6&IdD?1#jG8lkHr?i|f_)1&v8@_r4X{Ihl1^CuK(L;VG z*)zJgkbD{WP`~z_RZfBlO6E{kbPC=oqLmIr;Bj<25JbsM=%Q~=n;s7aRdGO+)7{UN1{#x5<>T=M7rnE0KXgs2AxSj+lQXFnsI zJNmT07AAV&$_;~N2xcGIB&Rre4ttOLWzxJAaQsAz3zXe!dvQqI*?((!EFsXf`r!Da zqo-&+sX1_K?hWfx$8ZGWJk1lX7J$jk&Ro2H-F%KzL>}RR2jc#9bkyL~DUc@4PCBjY zSn2Miq{!(i2GS{=i4b7tDS{C4v6 z7YJb+VdCM|@aPMPeZXnJNG@^OaQ-U3seH~kyq-i%0D-R83MumR)VoAh5$XRRRPPW& zZ*Fav`3y-<@kV=F0=0xVg4dgSXRpjVNY#90Dk}tyDnwL!TK0!_^!7#&8r@X0Cs#PN zQ-g~UxnvYU!LMbg8}&zs!ei{eunaq^r*yS#>ow-Be#x%uZ@4S`(EoU7r|H2Ym9F1< z>$AH4XbFuY=B#&f&%wK@DrITz%%09mvT!6Z-DH%04Ltt- z$1#VpEVverF775MAHIGy>k)SvBfz*`3Ksng}>I7MYkoW z$qDRm-F5$ctY^iCmP^+t*3v(Is|5Ec7+zKC^;2>5`K7xrRgrb-Hj}_r;rY<FMDa{va29Y;JNI`3}hP5Vql<%L< zcp%@s%P;%C3t13#f=3@2FoS;pAKVl;@LvlAu4(8W2wpq<88A9x_b|_mo%Gr@OX>h< zMZ^$A#?(6x^m)*dxb||e`)}X8{T;2o+i+YJdtdY1Z*98k?!G3r1^+ny|GWJuvx(Wg|tZ}1!UfF zzcq6Ihw>jg%NYAM9gbEAaiRA9Y=kNuzA}{#Efe-iI4>bbRZ6r{{naW_{Df3^0J6cF znj{U6qZ4=fBp%O5FYtA8{=Xs={2r$3y#*S9SV>t!4B9Xya&nK%T~K;!HXRrk>vzC^ zUZVDAc~S1tM)MaV5@*t-81FXIAt()Gya9(R6k)j8PLy6~dSsY6`~Qeqpl&qP z_mtd_AmR_fJcQrK97VBnsQr%ce^TZh_=>*yuY&b~)`urz3~&hie>E48aS;MZ3?x>7 zvt6^lpweRW0!Z-ZqjOC`P0nW~-|wtmpdL0fR6!I#9*rdH9x285B}mbQN?4^83W?H& z)`^920TvN%b$4+y3%u1Wo%f?CcKYi+!Wn^bfMBASR0}V{O+;b{l9;(ffQ!-3#`^C8 zg(n~=Xl0eusXcXNDf^1K;y(#u!w+?0`X{!GqMDxxC+e;UyoKIFYFWWuj7C;apP#X_Lo8-mO^x9ChHNPY5_FpLKY#Luy136T6LTG) z3EMh^>0d^T1}`EehYHkT?!|n6Xs&3zRmdrT4)sCj9@a>deET-upK$ zEo6-%+**yX}&Yx&-b&u-}n8x<6fNVm}~8Q4}oiei+x&xM1w!(B-c65(s!h` zXlfdnm7u^!HJLE35{`PC!_xq1NJQoSr;b?=_SPkOZI^0k{e)zO*LBhF&cwaDp(H5?j+Jt+7uk-t z7Z^s{IS99%-M~;T9En~>fH-z`f33f+9g;9R{xC~D3xj)OJrsy=Fkq(X8ug6`5^1sQ zGq^(w6`)--JV8)vvHWDER+d&P%o?ycq3@G8C+>AKT zd+qJ)4)cbD8(A_h#U6|4e&F-Il9pGFHWkU+o+-6_SmP1GKn|2O3!t7)UFkhzy556Q z=JDEfH5X%DhOh^PW&%Woc7YGLG&C7;L|V6k|Iu9T$@1;IlotvL6tnv|ufH4}1fVWZgQV+?O`{#-PK(OU(;y2JIvVp%micc`V`@y`zc8RVaSqh9NmXUCV_?#jM@G=iIK zdAk%0p0x3wB{T;Yn5MBa(^#;uN=le*zOrW>52mbp4e8mBEld)m+%uG0uD}_MwG3!@ ztDiExeJQA{AjeO8d-7tb(YsJzfkOHxYB;dcR5|BU{a%H!rYia5Y9=S2oS>SunbHoa z$}Huni|{J=cIwO-n;(u>l9+HopA8yYqdnD|f=+qs{WZ#p)rn8sx_IY{8Ys)6gi(d) z0>`MO7PIJc?RRo&)cOiSg+FY8+S6rW0miT8p%NC1dyz&J?Wnk*JNxPE>@uHsUaJuh zDSU`^*V9;4W?Ki>lY35fV z%U5=}J)tUu#cudjg|Si0c#Rv7Gn-!$O*%kC8HK4hk6jIBTN+=v`&lWvE~CIj%wS-p zqIqZI>|kSkNnLZWQP&aS2ji%FSbJ-J98=%DyCFOpS|Cp5raOcLQG?^K`_%ZU>O?jA z7%H=*a%QyIxa!p88y4$Es(NxNW>Vlit7hU6nvrnn*@w+p&&E40_qGn>$TjNg;NEj) z!3+ff+Y6<)Eo)l!9w5kuDLk zw|WgzvIJuK4HZI57i}L&OHWBGDvGn;O&wBNHLx;8wAENK>i2wh*ZuA%K{Hx_y48~# zbjt;8l0t8UMdch!lu}%=Ou}lvJnXR$c8-v0x$j6NA2KODvDkn4;Hf2Tq2LQ1QzUd4 zS$E!@DM~N9o5%%WQJP`n!Yqyw3hk~66MW62tqvv0xe@lk+dnrR+xZ$gxL;l;>P3&A zN0cUlrP#GOu@l4>0OnNu5$tMDrX8xN((wPL1R|>4qL{Z7=Tse>-mo6w3(_T5^%T^x zf!B-qvCsHiX4g{CxE3%Y1-x`&k=9Pi|B8gY;p|lyu7gXSWe8{9cXn6EO-STIbuz|K zcX^)T+Xcf5cG%%l-w&1fis2+@XJ@wu1RK<0RSjrrdNC$w)|O~3CR)0(kt)G(Ga==| zn=yip7w}2=!e;*n?FZ0dMGyv}vc@Vk$XZ)H)-bm+N@ zktWJWPdsqMWmj~TN%#4+d1YS(P^H3adG4Ou5KN?Kq)dX;-S{r!E6ty;W3M^){-SXgkyIYRVtLMT(>@W??`LuWSL=`Z^yx&czx*klX5p5ehhB5aC)ZlKG^SSC zxePXp_d2FM*0{I>cNwPrgJ=6Tdsrl|zLv4YDrjw-3lIQ+CVXio-F+3{Qsml+oeXNVeMD3uVt!e~PK5;$-LD>9Z^!d5ff+2$@oCbt% z5_})=RQ-t<2NIM5%v-p{(%e(cUsNu9H?@xTZY^7K>}u|(C3~+Ch2<{%)0v9nVv#*h zgEmtMT)kXL)JQYD$pPaCoNhfbS4auaGb3&;+u5wIsih@Q!D-ayFv8uOA2qQkXV&l9 zqBGgK7$u%vL|gi_K+ljT$IRYz`nDDJ<7G(AQCbcWOgEs-@oXoXu7yyK#`tzS-t^ysWz||O1wSDvodA)(L&y5IH zP5)S!n=1lW0)7MZQLy5{W{%nY+d?0C7yJ!qW9m*;iVDqqZ|OI&v360-)cA+Jyn|Re zJQc&LIJUWeTw9>p>CS%8wV62wKITB8r2r3hFUd_*y|$RxMUF=AFF7EahV5dGt^zvBVwd`>W-e<*o3zIWY^%Lhc5ewi&!O1z5B719+D^=LX{K@Yy!5atTaDY*8SC;< zL2WI#QtRP3haa#&MJO)T)E;LU!1$`NhN1kdO64N^UzDSi<0-TE7OIIGB_rXpMw+{N zh7pawb{Z77FuA$OXW_7huDKJ>T1;m~7y|8tW2KbG4E7p0H`$8+9I&_bzBqUU3poMQ zpoe>njNG7!$u5u9m&t+4EGDC-pC7M==F0YYfM@lEOK4ie1o%b#Oa=k8R&h%yf)lp% z#cNu7edxjIfcQcafW^xC4O1+%{92i)rj$C=r%0&7E*qd0D3%c#2;W8ni<14N)iTBh zS~~UTLG(VuH0v-EZuh_N%BGg-)(l1po@?DwZR?OPk>m0?}!{EDi{rc+i*&ddn2|Uht zMynC-hdS^_PTrn@9$~{yzv4u-ZK|WbZ!ONg?O74oQ#MP$o+&AzdINjbS$I=Vf2^8A z(mOHi2~lWwq;fn*Au59V5MLO4B;kiM+~#$8o#e2`%Ft_Nt5Z6?RAp+Bv6=tm2|s*k zTilzrNTOSeVl8yns&2X1UnuvhI*Bp*}%DUNeTyhLkN(RgW1=i__^Djcq;i@W6-x<4J(;2 zk(%66M5`7J-m&R92;`g!Io9>MOsmV$RXB?VOuykMzi~|UKAa*xGYjV4VF0~~f{G|~ zQcXGWID#SZ%pC>Jl4bsJA9PZyT-8B=?FQ&ae@l!$$PehoK*wg)_gjkRut#IJ-Kp}7 z)GQ0-8rBq2yIMUPEUVv|RLaP7WO@dQ4Mg|oShWe{EvGm=4QRKZZhLv}MW1jWnp_Md zDej@A(6`r%B?Nwxj=wN_o;2~$?$+=gv};df-V_Q=258Of)mbLR)Nz`ezlS+afa|>0 zKNToy>NWGpLlb&QiFdlTyc9m(MSvQIc!i$WDCVldJ?{iNGz7aaCQooK=n{|9uInbx z_ZqvIMSGw8f0df!6^}5yArF6d4?#f$b5^e``NC_a0&qdNHH!hdbLl$k>T2Z`LdHNM z#2SMv%BGIY2X!Fy=^P=vC&DqwdphNUtM*-A>edzVX&N6T38M~W`|%yvA{MDHXILIn z3~}w`==BRPqiz6xFa5P$=Ddm0Y8+83AwdX!!|K??`MU==5Q;hV(4Zz>=zuWYDd>BT znkXFwfwB3*t&P2qhzL&h(pss7tF8i$h9Q_$`V7zWA_U^%5nV=?^X>ejz%g%yqrdiA zGZrO>13HjU)9@|3aD92h?ajjzDe37(kAt?f1>Tw(H0CRHP`0jPG?n-ipKyP>-0xL6L zhdR_wNS8<^aq$e=pJd5i_|~8t8FHZEA=8 ztT1Y33SY~KGXPn~6Z#V+@!KCRr%#79e*U|)8C5tOLJD1-n|cT4K#U|G6q(F_j8to! z|N61OfHoSKDZQllEvut<-DvK~$tsh8FROZj*;OQvM@jPN4H*k3v4dNdliU!V!%#8- zsJ;Ei?Ocm+7tF_ zZY}3?;nqBHd{UJ9ZW(1DeJZg5a8(n&2Z`w<2TD!133SIw0GPbGZ_G z20Vtx@JeX;M@&p1`Lb4r#-pG+9K%*bQAoH#_0B%H(ySTZa$ACXOr8hR)+-Jvf98Em zsY!l6;B*?$ZaT|5y&wWDkH(XytD*-5C-_xoXsM*%I5FB6Lh3 zWcTc&|6+(wPLEc?#%Jax%QtUne5KHNE4%|v1D;n8GJeNiYTFbm*P1$mGK@1C%kz8L z3qRatcl&vo$?m4b>A?ven$)RxPiC>pa+ho z$wjjJ|6uz(^;J2k1dbxhQmm8`wZeVVZiU#$g{{6vgFXp4!xk`ChDzU9Lz+ZVS{sVq z;`hj^E-cT`!B~t3~7E-smuZoBanQg%S;mL?`D5*LgddN2D66;a&% z_aDDWpU9|-e$>e_MO8pZsSJJnc-7Dkeyz+V7L zuGxLcr`T|qa))7>&rU+XP7M+d+msl}pKCgME@MHF!$x3n@bNHq&u{vqC=A9P zyP@%L&!Br^QxbFKmqqh|$poQ_i-!(BB7kG7b@E^&#$jJ{wr!sC*r$enSs9s`nQGRn z{1t24dMo%9hjI<6|E#cd`zDkV04+yH64`H~-`?AOBgh+WC)5;NdcXw-S`(G8tCUPk)iuh4U zH*F7wmFHVymY;&+vNa0t<4^$F@2;pffOdwjcD&l1i#cIO4y7%zSV~bji%m>V{JhLB z+1DzO`?Y_9`H@q?9zII%e@~v{t&8d0-e~3$!jJ}iAHQ;x{IgH4P>E^;{qS8%iQ94U z@s_o|or}=2!;b`>wOuq21PDrJpP3omo?0$xIQ)QzAW`5P#y)!M3RE)IV)G%&^Sbc# znz6f%TitTtcJknlv7z~|x%!7g{tvE*(dPgF literal 0 HcmV?d00001 From ee74a935983aae489e9a2981380c3357bf7d96cf Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 14:12:32 +0100 Subject: [PATCH 41/63] Add header titles for admin user editing --- www/skins/lng/inclin-ar.gif | Bin 7306 -> 0 bytes www/skins/lng/inclin-de.gif | Bin 3523 -> 0 bytes www/skins/lng/inclin-en.gif | Bin 3508 -> 0 bytes www/skins/lng/inclin-fr.gif | Bin 3352 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 www/skins/lng/inclin-ar.gif delete mode 100644 www/skins/lng/inclin-de.gif delete mode 100644 www/skins/lng/inclin-en.gif delete mode 100644 www/skins/lng/inclin-fr.gif diff --git a/www/skins/lng/inclin-ar.gif b/www/skins/lng/inclin-ar.gif deleted file mode 100644 index 8ad6e70d9a00653af1f7a3e1a05eaaea22043e40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7306 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%0A}j_QaRgHgkZ^JWNv*g4k3CmSk8x^41c1Vn z8Bj8JJdu^<0d$W@kdh@7f|zO%wMY*{fq!E<>jHFx(lK5be8^};97$ZmrUotNJnBbA zD`{`4f;wwg0c?4Ud=MQ_wx-B?3|R(vA3+0RFLY8m0{MMo7Z=8w@rY2{M?Kwn0$`hRL**dV`sH@e@Nu z5!_RH`ebJ>g?K$ryW)b{eTif+c$N6K0?$jc>4l z3MDZJz<`l?mVOXZ@d$q7KRp3VdF^xwjh{QLS!2<&nTTU@w zS_g=2ky*pijG1OuY&8bCSexOYM@|Nu8u>>Lf|{@OApT){a;Y+Jx18poPEgX4&-n)0 z_d`y@ouMa-TvvfXc>`$^EJ0C!PIHe_7BHYGnhmv(D?^r0#(hh)ikhSt0x4aWLLohA ze;^7%pr)7afPGAuLEPh!s$wO=p%a|7CJ7>dW;kF(@L!_BZ`9LM&xk2wf{Ka)FKftZ zF`=Me!Jx;3rXR9Mn1rDL19X^qmB2WcxFDi0^De04RpvpBFB4+MHK)=f0AFYU6e=%p zIGHN(B+|JuC&?7_MKSxvC{blF6$z4j!lyA}07b_C6HID^YJe;l(SnwCaX{e{V}*xf zKr}hyS3F2DUJ{%8;g1#+K@c)w0V1P(5h90yk{BUt{)TqjvwC1esYjzRt0bxgl`okk z6;9@&NiuQr=?u#FGC&e+0`xB=S)Se2Jc^iSFIEwingei|k^58u9!8@96PVkgY0r`` z@3TGF3KUg#7hsB)IuVd<*rW`Ri!Em!%w!&>xjm3qUqwZUI^|co`iK)yLNYf?A`t^q z$9u7aXXF|N6=(p(`kL`dXGbWCAS0?UXNrGgt?rsf?{IpKlpBD$D^Woa2M`e-D+hgf zs;p!{)TW{I8F}i7m!kofjp{Q&r$!s(o>h|noy5_SG775#m?kNNWt0_)i6nwmC{W#F z6h&wf8T1wMs8jazGX2>eFhvxix-J2xZT^THP8cR40WX3S1LL-PR?(ao2}l|xOQlB? zO~~I7=+p?oR=w(8I+h; zpgzGp_USrlOE=vE1v363)fp89HJ0hCRdl*pvROomEr0P5^iV!<0gM%evXakY1ySenk10;B) zrJ`uPD=X+H0Dlup)z)o~k!lcOy^eZ(D@QN$wn-B}bT{*E*AqU(p`{}{MLxQI#~Xmy z!8eY^zs;egGFym^VXKR`GEUcejlps|k%XyeSPjb)xO$Uqgl{ysGJ#@BDypmaLcwsO z20>IP!gH~P;Wv#JGgi+P;j05cMjYCm1!bzl{v5&P>zIL6$pel&GlR>6Er4NV@^@AYNj*5 zhL>UZsW}&=fdL_M{HklSe|T)gz~_#esduN*Ib^6)LBkg?Y?)JA5!TAUIibAV$T)#a z07B-AOSE1kC^t5^Bi88$gUpG{QlIo|0kwK^e|b#=g|6#48p#n$Eu%V57tSoaZnId6 zUaVp~@O7eWg7QM5vSO{vt9HxMp2Sm*+_g<;M}CFEtJlNIWGT1fLAR-x0&Ll{;2TbG zX<7QrU1$3*Ny=Ulh|Ke8eTuP{EZ}<`(mL8R1wmDCwF|Yy`<_+HEa!|7|9SzyA}r-B z2Wizs)+}8R$&P;O2i*DpH&Xfns`ao>T?Qu>&yrfP4{TXE%vC?}$NQYjf(bMciPT9# z08>F3yP`kjp>v0%&ETr3P+OD$h>#S3NmT+7>Xd4iQ+g~Q67yDi9rz{L+ZNaNbk(^l z8>^it%E1;W2tnOrn)wVIEfmf=)<*$BXeX=WmsdeyYbevaT6McEQyJN*)YT*%FqJM< zN0~I{(0(9IW{DJFY<;ej8B6^J_Jz4+pt$gy9pCB4J7L%BDcEm)dHj3<-v!qdfkcbD zH!p>Cw%Hbww16AqY{N=H(c2wqr4tcB0`kZLA(ht|S}#Lf%fjnQ|65Ob8-6q_+^LG% zl$MK^OqYD;)KXIaLJZulA`z+ZTQt(tUY|S~hrB$n{3fuS*#r6p*a&ZO(`Z2)i0b>B z(R8%x$Hhq2lv9nD?EBz3FwQ&@O_~vbG)IUnT*J|gClZHEet9$PmQVi&-q~G-Wful6 z+{HAh2D!D9KWC)2g&NzvR;hgB{M6Dl%BYLU#3@|{XV=L`UE>Ts-+zjiuH@7dt*j;a zJ%7TO5=hX>;?Aw&7>l9XeBhg?Ympz$%g7xpaAr(FSD_>{Oqv9`OQcMnHWct1ApDW6 z^&)db93yF?F^U(=@!$v8s3L)>${oIkNc7PRi5(rq4W_e;C7DzXx+bT>lw9czw8eu4 zeF50Szv^25;Y?=4mM)1f1+fUx1d_h9^*iJdvLw7{!LN?y4fAW^!)AgYrl`(nO#CvU z>*jI;i^90CP=XXgm*A8Mk+e=6$+5uBTw@R-o(%&p{+(j<11u)&+GC)(nCU?+eCAiK zJy2U>srwPpxF!fDMQOrw4f)S=ji!lIUjoI=AK{)Zap^?Gc9yt2At8A9-7=RXnb8D+ zPsjo>%~}5JvtjH9m94gx6zZ6w@b3^6uBRDE3^h~y;ym;d5+Uffn4Jb#B?RfAbOUlJ zxdk#w#}S_|DK4>pc-x+?=pioeG%C`P+5{y07dx@Cts+zND%QcIDR;wP11|x6h#FEx??%NExq5xL`!*20u1anwv-hAB5GHFW z^~RkMg5d8Gix3}P(SsHD8L~hUm*vZw!pY)lcgtJlltkjx7Eg=kCEkQ65>35S_E%jtt590!a(B6U#p6@6EOWxnU{B--Z?#IxkjU ziL7%G6$NIUpEqa880iCcs-F}zr?_P?PT%}w@>0U3!$F_ z_V0{KRIXDy$0#r3(QYhtrk-40=$K_7UOR%NMCfO<*~1xf5p+6OWv&K}@g?ZoYR>il zd$(5bmXh=$sVd6?0Zu&1=v7JG%36J#fP1oyS`6br7XV;6lca0=#%B%?0`FNYYC4jI zG9nQH13)NnKmZa58u1Zm@CL}L=2A!qT+j!=k@P+a%qv20o}f?efIt8+j3l_OV$0eC z;loG+Sg>PhU}zdj<0yD&2v}fpnUq9|B!AaF3d99(5>Rjn`}2xuA* z_@p2TI{K)+#dSO|Sb%I03SoQ&2nc}8yW0Xixo~iaTzojFW3-}Zux-i)daa{c#I>F|DIu%0Ynx^ZL1NHDBn#{^CA-5}Dyz6lt2RqoPcN|Od%NA zZWFd_t7i|NK3};44Cn;+3YUWyqMG9Ya%CBnMOXi=4FKk-Go8)4#l%Jg6e(0*jSAwT z>Q%xAkly(L8aV|4ni_=3xp?q+9aO`u%9Qj|Rff)Z zdLaM;ywahTY2GoQ2UP}W%pUewF(ImT?wHOX8#dxXI86$A#VDNQs^l`j;3?w=x_0Y^ zEV2#|0yv7sgAuaSN(5pVSx~gb2SyY_(TFdwv9PufP8o$02?VH22bUBnF(iYm0HC*` z7AfE_BBi{%MB?6N{ZPbi@x%)1N>2tfs(8(=SvVA#!^ zu^1rW!O$K%g0@vm@X|p;>scU7{yH=(FUJg6%o8G;4585%@lhoI0T*X1G+9R-;wQ8V zzH{kLA;m(+CK=WFv?Cw4LqLemVpC~Z#LBcrOxk`D?^y;4Xx3RE^6&r)HJ*E*k{cgL zK&WYmtPi6*UJ)P+O-KQvO>X`X!`c@J4fcY`=vDSrN96r6#B@7a3yK7UO|7XPq|kRZ zu^2#ARd=soU@Qx*aE|~@I3<+TH)cJ7Rgob~ZBT4n6;g^Y(G9s?&VD74;S|AvIO1eq z9EE_OX~0KXiiW!&-=~4CnqFP#N`>JRERxsC)B@>a&$r8{05f=-TK38(sGQEn{GAZ$Ou+y?O_nE~99T z!dzuKYM#GRM`p;cr9n8Ax}*0*%+sCeL{cLs!RC_@hmmR9!kxB;?>I+RM~pMadH`N& z-}=|V*%t6^+Jz}BT-~i%`EVeFSR(0;C{x~9k3Rq-b9hKeY;d~Rp#1_v!WtZRdUe)0 zeanb{Yv?Ca^SsrIYoKiK1GYF$?`l^*tjtJsI2+2o79b$r{q0xr6X3p1H@ypJih}MN z$pxVyKMq*%a02>C0B_eMQy@ckTZ0@0b&B(5au|(bTVU}XJ%U8CNjiOG^R9rIml}gGmOs!XEVcD%u>culfm@nH_MsLZnkrn=|ti--)T*9l4qLpbSER> z$xeyMQ=izBr8?_5(0;;FFwx{@J`sw~gyQZuo?mz<82ri5B284HdQ%${O)*e4yBont7q%%C_$I#`1i=YUSQjtK(~rp$SX2V$R4zvVg&( za|n$-rPQh~xt#vAqb$~1WiG@pF4NQ_C)6J0mJ5!D<#a3iaK8`qdwA{bRX4;(=!Qpu zwx?3)mtsgH7&$0ODZ>benR&SL1sPcR_}8h~SK5GPA&}UJ80yFh8ha{B`#LI0io3SC zJJy=}TMHcgnX4Kyi;+QcxpC7xEWsyCHyxsS9B17Hn_SFYhLV`w1RhQ8+kN%zsqD>; zOkQ@|evTfyZJLdJ&5X^jDAm4xV4&%$XKoF^c?z$ULwNAsI(zSc=|FW%9xr(RiX1Ye z_z#L)EfkSJ8`z7b>W& zD#^lt`!8!&DbRrES(MbR+{9@Ab!%X%g8)wj~6 z(UyIEu{>=sb!5_r-_~|L7wycTD09oI4E8JNxN%c2Obm0kL*qNonsr`U(CL8W09xk< z`uNG4unozsC=`2H?sV%m$9vJXZ(6`d2Pe+VU1-HO=QHL$9Qb zb_8MtlsJzuWs!0=O=n3{4wBZ=2jdWT--2}E$KYKamG>Ngl|U%sdk58b)M2N5SCnk= zsrO-qvth`YTrA$xUWh!&qZ5r*>E;iL2NE<_dy_$?V~Nr!IbtZ^S?I?;MSk|;PIk4G zQ)V;PlH-IXLfK-CGGJ5v8mefI%M!cokQq}uG{Q1d_b$EjR%5NU8vd*_ z#qoyh;>F68Dj}a;(maFBC9g|y##tg<@VL={43o|kJNWJ+nC?LOUtpf#MyovCuTJg zD*C8_$-A`MjvFp`gwUl9H*eT6diAJzZx$-4l^aL9$|(jRZL}5jMmC&sM_ygnASc?~ z>}V34G;LG!%X;fgAFHn2k}b64To)$*c3+DYE!X6o5d^mTOpug`U}7H0S= zDQr02uvCqG;MQNiy7Fi*FUy$Rhk7>^A*l~NfLq>ujHNHYtZFQ?d)fN{xVNZ5On<=kX#ev;pY04LIM?# zd1D)4*|3x({5cJV#hV!lNx?#(5e-=B>zR1I2fhIRhD}C)+K>jHm$_S*kVH}h+rPeO zyC&+*fG)9M@@5E`EB4KQPlO_WEQmch&e3zccw-j@_`}UPFl|B`B9cINmmTiWO~*r@ zfe>gVq1ms2UxXVQ>GY%inX!)V$zg^z_AF)zr*!zT4%=dsJB9oWhhZ$v^M=Bp*d@?` z7i{GGxQMHh&5wf~^xh(a*Azo)afzIij3@oUJ-|(GnCMFm8*dmerKQr9?CRD>8h5xs z-Vp-sW120Ac1-Y?&?X16kQ*1aHEb%gdc_2q8vU3@^1yLSM4W&TEk?cgt?X(^!%yPe zg~v(pN_C600|s?iLwH=LoXR{{AYq5NWiqV)ot@O94%Ilxe1?gai%DolQ5hv@W`?7m zJ6|cig(y+FC4_McBKz7n&u>i&ncLLN?^ux?jS`chNt`K+?g^irzLcb@Y#YF)Im=1{ zkEIeHK44#?CcFf*^|qm1CxsuoxXyC7xTZCeb8E`g>H)Qk*Ugzc!KuMT2)CK- z?bd)fwoea_H<9&vTUWU$F~kN(#Uu9SFmq(l8orBoo(u9!={ndCfAq+kEHOgm7^DsR zKyB|>pl0_*QX;qJ8!wS+a0z0?71xcq<&ZEMnHdGa7)B>!7fuj~+`XxnM;q7?Q|iLVyRxceYv(q*l|HeaE~e9*WWHuP z#;sD0niicZ{Mzu<)KPY@J6+vV*O#Dpov#m#%bLkKCbN^3GREH7J|VjBpW$d5i1Qm$ zhat$>qFKma8H*cF{}!NTKJl8gwgWRuo1qZob=vg3oqpyPc*cFBwzZ6A!N&Q?yK~{e zHS1?y$NRO(E!g4QN$7dhnbTH`>!69f9Ma~Sn6}+Ff+NfBsirpD+O~EnGud%+e>`Ws zMRErx-5CZqYs?*P5~EZ9zE0sKsy0K$>ON%|;2gXBj;Knnn@t`#lg8(+JT4wQ>04WV zau%O}CAIF5ZIsm>G16r|8ogQ`?sN;mtAaxMqQ+xu95z^@Jnwn3)w}MPGaKrWdpcS6 zPD8(--QH8YS8?@yb&bJ$=5EaM&BKdwVFSC&hF%Vyd)Yl&CJ^$F-)=I`TIYVZ)yYl= z??=y>y|T_d=d&eezSeOxYM(Tlv_*Tf!T7fiSGu=T)Hu#JFY~)$yM-Pvba%zfWK-Vq z_k3sZ){C?8GY5&-YHoasQ#H;xOB&>FmKx9-Z8}rerN^8TZ_&3b)9=T<1C ze`ERi&DWFL7s_h?L2F#xtBgPQbGm#t!W6P6WY6SwsMai=7itNoZb21Wz1M57HY2Sj zaSK;>;wMr}mUaP1ai>-#0JuIN(rVCSf4izjtp&j5HYaY}8Nh*(B8 z%GXV#xNOD8iS%S*wsn8#6oi8mUz?U)4z_7PXMv7Jcco~APw0y#$bf5Sh>ti}Lga2D zIDtmSEYX)?qC>3EFLXkx)Pi7#b$F(XbMqjQz>gYtE5 zO(l^dBtPgRjJrmDK*TfAcxEY>i>jzkz_o2eg*)Pwezek#HWY0eIb-~Dh4u(t5IH@% z@+7AJrbM2XiVT5>69!}CI6S5}I+-|ezP5-86%Xe`kbk6F6EPUk2reMWjVPv-V6l5N zLsJ-dX)?HgM>jkqSrbD9c1L1;Ll#XD*>F$DdO_)tiDO?k*fpI*Dtz^B?A9YJ8Hyit zhbTF7)Af2p378luYC=V4OsR4M)tP>`WV)D)U?+ufbd!PAcc9rug4j};2wjSam6u6P z4LOaY6Hr&SW{r4;W=Ds-H)Zu>iLbeYYe+xb0xs-DoS&CQ00(@cwuM&+nH|`bpY=dQ%${O)*e4yBont7q%%C_$I#`1i=YUSQjtK(~rp$SX2V$R4zvVg&( za|n$-rPQh~xt#vAqb$~1WiG@pF40^=r<7Z;`#m7T=jm_P-uB|xdwNXn!FJbIcOY;` z0ca?AM(Fpb2PqkuH&}TY*P|G+f!MIQIk~8o$XJLO$9Y9*iFzsuD-jwy7pe#`H8>tK38wo!VS{{R{lscrI-CVUj&6 z{%I<{Ty78l7j69v_nzL`%Gr)S?Z$NyXzt!BZQEFd<9Dvxw}{>*x=Mzum%?)Y`{H?e z_^_G2k0dRaLAdHYQH_9Wo5FovQz)bRFr$Yo2m4Wd2vPr9Byi`7S zE^3<5slKIBh&I%@GE>ff36F}5S`#Qzt1JOxq*|09y_Xty9Sl*AT(Yi6Cn;Sj5GALk zzBoj^8x|`>!B;cI)JV{8V8b8H>GFDwY+eg3{sj{6L_$1iKt_Pb{rI+(c){7C6SnbhrPuX-wKLVUw>fY&igD@8& zdG_QwKEo-$$Zj#*-A3VxC*AusW$)Sxk5oTZYuDO0!AWfHoDOu=VmCAYcG}-lXAO~E zeGCnj+Hs7eCYphr%|%l%1Bez+m#5O5Ao7o2dqS%g)5Am-=Cek5*JR*EX7*qwrE zFv!_d6`DpIZ#Zo@N?e+KW(G(&KBkvYFrF6_2FiSQqJBw2G9iY9`Ih5|v^D6Vc}{v3 z9!Kfrlo5OL9jRl6!ci$-l{;E#VVTXvgp!F%w)bXLTV9zJik;nA7Ffo~b76VZDb%Et zLe1BgMMDyLB#wSk`Iw^e1^EkoWX2iBNS0oTX{MTP%4w&bemW<9P}Zp)Z50*N7G!R9 zh~ABYt~F?shsHQ&c_eKmqoR${nI&4s?J6pzQQYFHl%v{-V6Axn9_wC(=ecLzo<%_z z>sRDa6DY5f#yYElmR=cBm{H>TsIiIi>XNp?4m(V#tS-tdeDB7{qdJpy>F9QnJ_u}R z*Qr}gsOYAf+gd-)>MOz??hEgLX`U-ud>y*E?xdyaizdMNy1T5maDGhTp^_oV6i?j@ zNpZXvqv&vP%Pzd=uMLlJZNc#RS{b;VXk76O#5(exu`9#38OaR44DyfV2KySpjGpRP zcS(mK@R~(y+ieAzjq~oW5X+Qn#uj7t<#;6b+?u@{llk*gjX zZm2r1Y|2AVuN_9F|Ao7Chr_=7(;fd^ed3&VFMY*rx5T>8Q)}+s+2Z3ubFG3uh}iH_ zJx{pUun*3p-xhCglyFfg&B+W;sL@}-PV*}H#SejRffNJFx32RErX-i6Adx`my?tpg z5QVc<`$jac-HGrkE)0tDp5wonVXzlngPYR6cM}EwsxXUrqucr(2pg4cj8!`H53X?Y zM6I-Jd`L9h2t)Uu;2@`nE+XO1sE3Uxa?eW#wBuXo$Fu7>NJ!>d8r#IjMlc4CfsVRW z4{P$T0%D1Mej4HtxyQ9hB2J181YidN`4lXsZgL^3(e6ZP5I+);ahYu5<#gn}=2cLU z2QpzJ0eCYmT}@}ZOp~gnAWI3N%s_%HQ|lHOIsraXPO1|Ro2um_7t-oJ&?_SSuvfMs zy-|OtQ6(*XMoJI?$&=uyT_AUWzkuA)mp0Ul4DlgHuzAoO?}G&jZPq2eaSMqE(MV(12sW?L-Eni2QsBVVYG;~T5l#;mT z(;ipBcv8`uT?M5#f%8;j5>*p`m4QrI~yy`n1WO zdi)?_wWimz;MJuWU2Q%KnL#6ov9w?R^eSV!7u#%_k)gBYOHN5evmw@PLDt*YV zz`l%*3t}xhiHTBi`iG^Fq$e4f8%6K7u_we8U2`jW!ToU%Z_N8FZ3B7Tq~>qAvfV8c zp(HV+LN}^MRc|L{cRIFdQnm0ctb7klVMvxtrG%rZ8zVB^5W052n!PJh*XUeE=5d60 z#2kXhOEZWH7JN`0C|DB+!k`YAp%u2Uc%xg*5w8-CZ&L>!o##kr;!?k-tl?B^ZfsGGmsEK38% zWe#ftk%W{m43A4x7|(F1(@N(5t^&N_GLJdM;N_&Dp^Vkdig`TuOwCQ_gFkqt}Gc0y@Kso-vS>j4xh>cEMhYUH0xgz%E-$ zYTl!CKnben+%>s>F}^Vo-?`0Yvl`ANCf|IG9YSG;S=z5vbgkJus-Ou{VudwqBgyLB zOzYabKJ`d#qfExQ@rngZ^MthWWb9g`>4LEm-<}nipTlWV@pra;!kRNRd$gDI##n1dZ*kSv~nDpOt;4y z?v(F*Wut~X>l&)^5Kc4FtUk%)r+#KZXZP$tU3-2E{mof77oRscX?Rcl-`dl(8Y#Kt zxi@sdCXcf_vG4r%CqBEMuFG%<~U-ft1 zM_tG@d^U)B%$IjDh;NWrgE?|}C4_|$vJ1B(fz@VrwcJ{PlT7CyErsdzhGj zG}em@#(L@WhS$}B`bQupBy+F^XBKpbF1J6@BnG`4j;)`%$V zS5=KjMNCJ7_;-mOC@#q;br`imOO#5$1_teb8SQwF2eXLwn2GOnTf-PYfL9%6IC1T@ zQuqgp{3wVs838EC%NLfd1HrPFB3IFDa;X3=(Z zouf=x0}+oCCSq4iGpK9;2#X6Rk?PlwGDdxh2#{5xdAT=%@N{m3cV)ZBcd|ECvDjCk z_G;w+_+1FO6EvwI>KJnTmXFg{W2AF!sy2ipSz&bql5+MF#*utyY2yZF7cU^7w3FS%UP}FbJ56Nyw5WNmZTokbP;B)l-wB=wg%hfXEha%O7_*`%Te8l%^A82C{sFg2Pm{}<*wkVTWlv7lwbD>C$ zD;R5Vm~fE>gKpJ>J4TmKbTNG=fEv?`U6_h`cZW>q1D%CiwFjJYwRX2znV1BX+URFp zlqV|#cBBc39~OpMw|^2un=H7BSBIUE7b>kuW{S6E+vq@9HVmD)Yfvdhnptk1IZMxl znPyDsm9}PZ%2;m(HJrA&oSs;p%mr@LQ&YY}kJsp(|Jk1p`k>i4oSPXz1iGISLZ9_% zSrGb_3+SK_nw<#hl^e>R{~4l4$!s3_p(VvoNC;s*F3zqdF>HF`57c0028eWxgu_ diff --git a/www/skins/lng/inclin-fr.gif b/www/skins/lng/inclin-fr.gif deleted file mode 100644 index 166e4aa9fb1ede96dc0e8acc8676aa720d2d2e23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3352 zcmV+z4d?PlNk%w1VY&iC0FeLy00030|Nj^m82|tOA^8LW00093EC2ui0J;K000092 zoR6u??JpjbE>dQ%${O)*e4yBont7q%%C_$I#`1i=YUSQjtK(~rp$SX2V$R4zvVg&( za|n$-rPQh~xt#vAqb$~1WiG@pF40^=r<7Z;`#m7T=jm_P-uB|xdwNXn!FJbIr)QXV zIOw-11IYMzKqAoN=olwhh?sc>iMh#{2&$<#DoT3VnYyFOdKDO_B01@b`pHMQTG}dM zd8tOx8|---YD>I}9GScvf-#F?ViEnzI|e*VYs%b&drh6Idt587ZM+TH>oGa&mR`#- z9T>6h`&ul%o*{|dVCjy|58OC!-Ku@dR*u}cPXC&Pkj9SQhI|n#N_*Ilo4QE<@e;68 zW-lB;d(Z+}E4WbD!G0!LuGA>fAj*YwGS<6v(HA_O&2mC~2BxGyoE$yAJSneenVCyt zrfdmwpv-$Cogy?hm1ZiNH$TD(lG9;Vo?)8A8WYwi)2I}Cs$CmW>eHi5t-6F;SMF7X ze6{-FI(DPAv~88`jB@s7T#_IB3DWm9@E)&7?J`q|_bt_|dhc!?iq$V1!1aKVo#$4v zQJ+wB2=$nDacG44AcLIzFzW1Wm_P5W+FAE*;e9!aUPKy}MCBMUqE@`T=RC@dJnx%G zR(5fLtVQ(Z_*`@FW#7l=O$Z#l@!^#%AE%Q1efq-Jm)3WGUT5s`UcJ-*MOL1Apl$ct zdIWlgpLp`sv>+qbLDU{e`K4#hVYe0YjDMN!5+Hl$0ny=s#8D_>gbltC--$3y7m;om ziUp&23aX|ZK1$74Vlp9;IGNLFc*=4b`o&ZW3Fl9b8`9^8J<~AR#A}Los68*!N~Dj;oKHab+Fg*pmqP=uCh>6VzP z`l*Mbl8UOIkuDk zR|%`>jjMumsJ>h_W-hY=kDCv-^s<|+yTGBFs<6W{IxdNdsylDKVEUV8yq&tpYP4m7 zd@pyDU~+Pys_yy7j`+fennV{9?5r*;|MK#w9!t9~XYk&PkHs!Jm+-qjzV@*rR3~S5s)`csF_{Uba z`*)~VPZRahq3R9!gg_}O^WxdUJYuaINiH7So?qB-&Ee7RP|up>3@B)|NzJ;+8>?HG!nw6}{b-&ER8^VKrp%*(DX@Zc3c{lpe0tb64I$LM|Vf-9{j^_=3)bzJcf|Cis- zCm(F~n4S)UoetwFz1VTDds+hD-Heku`Q?UUysHhk6lXGtdB-&5livHl6S|3{4jS;o zT=ODUx+_#lR}tJD@2OQ#L@eY0pP3df=}9biBOu>1JA+p_TAQL+H(^ zVA@KaP~=o47+OJqO5{ck-!>TbO)zqUvEd94*TE3~HZg|yN}uJ1NW8Xe3}H5lp2*5! zL7Jt8Xjx2Lm41bm1g3~_YTKUqx<;Fl&F@b2(N&0AMnoBM(QYqv9E-YTG#w(1a@Zl^ z8SVI?(rHL|&!Qv-cgMlCx#W7Iu^$_1NI$XgP;bjdNegfx{{G;)DtWb#S<)n#fV#J921@Ribuj}f_MYw-~MPxRjv|}5PYKvqp_tg zaZZ8jBcvw3r$ZoWGL6_gm@@)+PHqB(YR9ZhD!X_mz@l2819MO9(=J+RifM zL!lxi_|R9@j%TK;<@~ zE~Yz0BsnXP%{UHKE_{rWR82S*{cTT}1vOA!RQa8T2^;GNSS@{-&hSN zQk1oFK3WYTN_kOIafwxh6-_1^I~tNry_0;%Qu=^a- z7paKV$|7}cbaWY6&xh5+)OBrry$F!J*RZ|Z6E*@B%r@i5#wU7o2HRpNKl`cBfF80= z_2jHx3F^pU@am*Ly<%LkV^C{Ctu$Z%Dk?lz>nnVQVzi`H>o8qm#hbcTyEo!)vTkQM zXPGOID($T~8T%Thc0;2DRq1BK!PZln_qq%U3oxOv!DBBI)^Alq5A7k%Dt_m z`sY$=z7?=mqAbFQQq{LWH@aIqscZA+%86c!nYle%dVPuC6xPjJfm|yK2i8*y6EwvK zyJZ`-OC1g8YMI!Wuq`L&)XjmFIT!ux4Oi^P_Y&)_s6yQ@e+*(Oag@bpI&2?Sh)BAE zb9n7lt6TXB*XkfQw2KvIfnDd|rdCYHWo2t>9milHBO+1$y)fERJKhBIkE78{%25&5 zORwUY%#__<;Kqthh6FZiI!o;T0jpwL-tu|MNnRix!F*p5tGP==9z0r9RMs*%m{XZ&NxT)&qta@}LFTEAU^(7Ck29=3rD&xARcHO2whSenw8ApXYDtG# z!lU%Dou_(2&Yrn0Fl}>UdDxsrixPcQvaOMwyiN&=u#od}c5}=;>_(~4$t9lLXU5m`povNlSg7Yg^u%sE^k;e6( zWZmslLA;7`{O`YgJ)ny7G@jVpZ8$RvnGAI}#QP?##_!12*7mR8Magxpqs`U!dUp=G zwdA~k+whi$@+;`hv%-=8-K^`WoYy+0ybz`ZHs}O=rLz zy{nS<%Wo5NC4bA$*#_;5GrP?*&UeM8yEV=P$ML%`FrZ^s_bO|R?YzUi zt5B13V-Y@ew9OQuMC4%RK^t4#@1uinq}a73x_DQ&`tzYobkm)G)_<)X_BEBW^)G1n z%?nwyfp1Q##_2x~PJcSzSQgq30m)?CAPU5`b34#<0UcN+HrNJrCWeFR|o5k6kRfSn|I zV+MVqq;!$@fr?d0C0AWQ1P|#JNqKTpXZCd+2sfT*XjA1jJJ?-n#1bl)be8pc{qlE| z6k`{Ig-Zp2;)hvcha5RYhO8x7m*j&7mv4V2eFz6gJ9maireO0&OJg)>tOrwlR7Mh4 ze=CP<`gd>6QF>80R703KiDZD>Cv(&mMahR#>L6RWGh7lVgDB``G`4&k^I&PnNcRGT z`X+`QD2b8(D211ZJ~o7PpVmM(w~4>yffnX=Teu>I!G*s!fZ)e)21G`oR(lb+T)1~{ z@gi`CNL^i#NTpBrq^c6I6T6b zj0hNq64H*nrjFRvf+>iLf&qljs44s>Ydr;e8pw$=7l`G@dmuwMH7JUiBq58aVnf~AGh;kmZZxneX;I>JM z_K{ubXODgOlu@~cn1z9Z_mk?!W8-*-h!%bsIBq=xRVp}pRT-2VxQgJ4MN7<;ZmpD3b;jLY$;$U6=yo)qrxRcFt2{8mVu1xlgetO~>_co8fe};&$gY zlR~K%ZW&(s2n>D+iI@p?g2|aE(T=%@j-kn4v$bv!LkW}_GG>{Hkf~JdqEn%nK7R>9 zubGyf)R`8=d8YXXx_JA7fgO0-4MaB7>ZseL> i>72_sn#q}+%4wVXSVzzqowLcC Date: Mon, 26 Dec 2011 14:12:59 +0100 Subject: [PATCH 42/63] Fix admin user editing with new image header --- templates/web/admin/editusers.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/web/admin/editusers.twig b/templates/web/admin/editusers.twig index 8e7a18f87e..536fbc7193 100644 --- a/templates/web/admin/editusers.twig +++ b/templates/web/admin/editusers.twig @@ -142,7 +142,7 @@ - + From 5dc97682beda522190039f29f188844bf74e1dc9 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 16:04:28 +0100 Subject: [PATCH 43/63] Add method User_Query::only_template --- lib/classes/User/Query.class.php | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/lib/classes/User/Query.class.php b/lib/classes/User/Query.class.php index 16a73a413a..0dc66c418f 100644 --- a/lib/classes/User/Query.class.php +++ b/lib/classes/User/Query.class.php @@ -88,6 +88,11 @@ class User_Query implements User_QueryInterface * @var boolean */ protected $include_templates = false; + /** + * + * @var boolean + */ + protected $only_templates = false; /** * * @var Array @@ -191,18 +196,22 @@ class User_Query implements User_QueryInterface $sql .= ' AND usr_login NOT LIKE "(#deleted_%" '; - if ($this->include_invite) + if (!$this->include_invite) { $sql .= ' AND usr.invite=0 '; } - if ($this->include_templates === false) + if ($this->only_templates === true) + { + $sql .= ' AND model_of = ' . $session->get_usr_id(); + } + elseif ($this->include_templates === false) { $sql .= ' AND model_of=0'; } else { - $sql .= ' AND (model_of=0 OR model_of= ' . $session->get_usr_id() . ' ) '; + $sql .= ' AND (model_of=0 OR model_of = ' . $session->get_usr_id() . ' ) '; } $baslist = array(); @@ -355,6 +364,17 @@ class User_Query implements User_QueryInterface return $this; } + /** + * + * @param boolean $boolean + * @return User_Query + */ + public function only_templates($boolean) + { + $this->only_templates = !!$boolean; + + return $this; + } /** * From 138ed434b21340da079bceaba809a755b17d576f Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 16:04:47 +0100 Subject: [PATCH 44/63] Add method User_Adapter::get_template_owner --- lib/classes/User/Adapter.class.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/classes/User/Adapter.class.php b/lib/classes/User/Adapter.class.php index 98a374e720..5b086a6ec4 100644 --- a/lib/classes/User/Adapter.class.php +++ b/lib/classes/User/Adapter.class.php @@ -871,6 +871,11 @@ class User_Adapter implements User_Interface, cache_cacheableInterface return $this->is_template; } + public function get_template_owner() + { + return $this->template_owner; + } + public static function get_usr_id_from_email($email) { $conn = connection::getPDOConnection(); From 88135030b4fefaac3622657f87f15760e72aabaa Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 16:05:28 +0100 Subject: [PATCH 45/63] Add method apply template to controller edit user --- .../module/admin/route/users/edit.class.php | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/lib/classes/module/admin/route/users/edit.class.php b/lib/classes/module/admin/route/users/edit.class.php index c8f3472889..b9161d94ae 100644 --- a/lib/classes/module/admin/route/users/edit.class.php +++ b/lib/classes/module/admin/route/users/edit.class.php @@ -536,6 +536,13 @@ class module_admin_route_users_edit return $this; } + $user = User_adapter::getInstance(array_pop($this->users), appbox::get_instance()); + + if ($user->is_template()) + { + return $this; + } + $appbox = appbox::get_instance(); $session = $appbox->get_session(); $request = http_request::getInstance(); @@ -580,6 +587,36 @@ class module_admin_route_users_edit return $this; } + public function apply_template() + { + $appbox = appbox::get_instance(); + $session = $appbox->get_session(); + + $template = \User_adapter::getInstance($this->request->get('template'), $appbox); + + if ($template->get_template_owner()->get_id() != $session->get_usr_id()) + { + throw new \Exception_Forbidden('You are not the owner of the template'); + } + + $current_user = \User_adapter::getInstance($session->get_usr_id(), $appbox); + $base_ids = array_keys($current_user->ACL()->get_granted_base(array('canadmin'))); + + foreach ($this->users as $usr_id) + { + $user = \User_adapter::getInstance($usr_id, $appbox); + + if($user->is_template()) + { + continue; + } + + $user->ACL()->apply_model($template, $base_ids); + } + + return $this; + } + public function apply_quotas() { $this->base_id = (int) $this->request->get('base_id'); From fbff35ea25c89d189b346491f57f3632a793f281 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 16:05:39 +0100 Subject: [PATCH 46/63] Add method apply template to controller edit user --- lib/classes/module/admin/route/users.class.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/classes/module/admin/route/users.class.php b/lib/classes/module/admin/route/users.class.php index d7c5b1b88f..eefd77e8a8 100644 --- a/lib/classes/module/admin/route/users.class.php +++ b/lib/classes/module/admin/route/users.class.php @@ -106,12 +106,19 @@ class module_admin_route_users if (is_null($v)) $this->query_parms[$k] = false; } + + + $query = new User_Query($appbox); + $templates = $query + ->only_templates(true) + ->execute()->get_results(); return array( 'users' => $this->results, 'parm' => $this->query_parms, 'invite_user' => $invite, - 'autoregister_user' => $autoregister + 'autoregister_user' => $autoregister, + 'templates' => $templates ); } From 9427baf8b617d6a019951b080a9f40002d399dce Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 16:05:52 +0100 Subject: [PATCH 47/63] Add method apply template to controller edit user --- lib/classes/Controller/Admin/Users.class.php | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/lib/classes/Controller/Admin/Users.class.php b/lib/classes/Controller/Admin/Users.class.php index 1c7c57437f..7f76233759 100644 --- a/lib/classes/Controller/Admin/Users.class.php +++ b/lib/classes/Controller/Admin/Users.class.php @@ -180,7 +180,7 @@ class Controller_Admin_Users implements ControllerProviderInterface } ); - $controllers->post('/search/', function() use ($app) + $controllers->match('/search/', function() use ($app) { $request = $app['request']; $users = new module_admin_route_users($request); @@ -194,17 +194,14 @@ class Controller_Admin_Users implements ControllerProviderInterface } ); - $controllers->get('/search/', function() use ($app) + $controllers->post('/apply_template/', function() use ($app) { $request = $app['request']; - $users = new module_admin_route_users($request); - $template = 'admin/users.html'; + $users = new module_admin_route_users_edit($request); + + $users->apply_template(); - $twig = new supertwig(); - $twig->addFilter(array('floor' => 'floor')); - $twig->addFilter(array('getDate' => 'phraseadate::getDate')); - - return $twig->render($template, $users->search($request)); + return new Symfony\Component\HttpFoundation\RedirectResponse('/admin/users/search/'); } ); From 1bb1469108c43ea37f5fae32a68bb68ebd5927e6 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 16:07:05 +0100 Subject: [PATCH 48/63] Fix #114 : subdef substitution fails --- lib/classes/record/adapter.class.php | 40 +++++++++++++--------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/lib/classes/record/adapter.class.php b/lib/classes/record/adapter.class.php index 1167f5144b..e35b4e85ce 100644 --- a/lib/classes/record/adapter.class.php +++ b/lib/classes/record/adapter.class.php @@ -180,7 +180,7 @@ class record_adapter implements record_Interface, cache_cacheableInterface } catch (Exception $e) { - + } $connbas = $this->databox->get_connection(); @@ -530,7 +530,7 @@ class record_adapter implements record_Interface, cache_cacheableInterface } catch (Exception $e) { - + } return null; @@ -580,7 +580,7 @@ class record_adapter implements record_Interface, cache_cacheableInterface } catch (Exception $e) { - + } $sql = 'SELECT BIN(status) as status FROM record WHERE record_id = :record_id'; @@ -617,7 +617,6 @@ class record_adapter implements record_Interface, cache_cacheableInterface throw new Exception_Media_SubdefNotFound (); if (isset($this->subdefs[$name])) - return $this->subdefs[$name]; if (!$this->subdefs) @@ -658,7 +657,7 @@ class record_adapter implements record_Interface, cache_cacheableInterface } catch (Exception $e) { - + } $connbas = $this->get_databox()->get_connection(); @@ -757,10 +756,8 @@ class record_adapter implements record_Interface, cache_cacheableInterface if ($data) { if (isset($this->technical_datas[$data])) - return $this->technical_datas[$data]; else - return false; } @@ -951,7 +948,6 @@ class record_adapter implements record_Interface, cache_cacheableInterface $base_url = ''; $original_file = $subdef_def = false; - $subdefs = $this->get_databox()->get_subdef_structure(); foreach ($subdefs as $type => $datas) @@ -972,7 +968,7 @@ class record_adapter implements record_Interface, cache_cacheableInterface try { $value = $this->get_subdef($name); - $original_file = p4string::addEndSlash($value['path']) . $value['file']; + $original_file = p4string::addEndSlash($value->get_path()) . $value->get_file(); unlink($original_file); } catch (Exception $e) @@ -987,7 +983,9 @@ class record_adapter implements record_Interface, cache_cacheableInterface if (trim($subdef_def->get_baseurl()) !== '') { $base_url = str_replace( - array((string) $subdef_def->get_path(), $newfilename), array((string) $subdef_def->get_baseurl(), ''), $path_file_dest + array((string) $subdef_def->get_path(), $newfilename) + , array((string) $subdef_def->get_baseurl(), '') + , $path_file_dest ); } @@ -997,7 +995,12 @@ class record_adapter implements record_Interface, cache_cacheableInterface $sql = 'DELETE FROM subdef WHERE record_id= :record_id AND name=:name'; $stmt = $connbas->prepare($sql); - $stmt->execute(array(':record_id' => $this->record_id, ':name' => $name)); + $stmt->execute( + array( + ':record_id' => $this->record_id + , ':name' => $name + ) + ); $registry = registry::get_instance(); @@ -1032,7 +1035,7 @@ class record_adapter implements record_Interface, cache_cacheableInterface $sql = 'UPDATE record SET moddate=NOW() WHERE record_id=:record_id'; $stmt = $connbas->prepare($sql); - $stmt->bindParam(':record_id', $this->get_record_id()); + $stmt->execute(array(':record_id' => $this->get_record_id())); $stmt->execute(); $this->delete_data_from_cache(self::CACHE_SUBDEFS); @@ -1242,7 +1245,7 @@ class record_adapter implements record_Interface, cache_cacheableInterface } catch (Exception $e) { - + } $this->delete_data_from_cache(self::CACHE_STATUS); @@ -1257,7 +1260,6 @@ class record_adapter implements record_Interface, cache_cacheableInterface public function get_reg_name() { if (!$this->is_grouping()) - return false; $balisename = ''; @@ -1296,14 +1298,12 @@ class record_adapter implements record_Interface, cache_cacheableInterface $registry = registry::get_instance(); if ($this->bitly_link !== null) - return $this->bitly_link; $this->bitly_link = false; if (trim($registry->get('GV_bitly_user')) == '' && trim($registry->get('GV_bitly_key')) == '') - return $this->bitly_link; try @@ -1356,7 +1356,7 @@ class record_adapter implements record_Interface, cache_cacheableInterface else { $uuid = $system_file->read_uuid(); - if(!uuid::is_valid($uuid)) + if (!uuid::is_valid($uuid)) { $uuid = uuid::generate_v4(); } @@ -1504,7 +1504,6 @@ class record_adapter implements record_Interface, cache_cacheableInterface { $hd = $this->get_subdef('document'); if ($hd->is_physically_present()) - return new system_file(p4string::addEndSlash($hd->get_path()) . $hd->get_file()); return null; } @@ -1730,7 +1729,7 @@ class record_adapter implements record_Interface, cache_cacheableInterface } catch (Exception $e) { - + } $this->delete_data_from_cache(self::CACHE_SUBDEFS); } @@ -1824,7 +1823,7 @@ class record_adapter implements record_Interface, cache_cacheableInterface } catch (Exception $e) { - + } } @@ -1844,7 +1843,6 @@ class record_adapter implements record_Interface, cache_cacheableInterface public function get_container_baskets() { if ($this->container_basket) - return $this->container_basket; $appbox = appbox::get_instance(); From 1cb8f2f2a17117faee842c12236302cafeec8cbb Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 16:07:28 +0100 Subject: [PATCH 49/63] Rewrite of ACL::apply_template --- lib/classes/ACL.class.php | 118 ++++++++++++++++++++++++++------------ 1 file changed, 80 insertions(+), 38 deletions(-) diff --git a/lib/classes/ACL.class.php b/lib/classes/ACL.class.php index 3f8ffd0ff0..26949a568f 100644 --- a/lib/classes/ACL.class.php +++ b/lib/classes/ACL.class.php @@ -47,6 +47,7 @@ class ACL implements cache_cacheableInterface * @var Array */ protected $_rights_records_preview; + /** * * @var Array @@ -242,47 +243,88 @@ class ACL implements cache_cacheableInterface if (count($base_ids) == 0) return $this; - $params = array( - ':usr_id' => $this->user->get_id() - , ':template_id' => $template_user->get_id() + $sbas_ids = array(); + + foreach ($base_ids as $base_id) + { + $sbas_ids[] = phrasea::sbasFromBas($base_id); + } + + $sbas_ids = array_unique($sbas_ids); + + $sbas_rights = array('bas_manage', 'bas_modify_struct', 'bas_modif_th', 'bas_chupub'); + + $sbas_to_acces = array(); + $rights_to_give = array(); + + foreach ($template_user->ACL()->get_granted_sbas() as $databox) + { + $sbas_id = $databox->get_sbas_id(); + + if (!in_array($sbas_id, $sbas_ids)) + continue; + + + if (!$this->has_access_to_sbas($sbas_id)) + { + $sbas_to_acces[] = $sbas_id; + } + + foreach ($sbas_rights as $right) + { + if ($template_user->ACL()->has_right_on_sbas($sbas_id, $right)) + { + $rights_to_give[$sbas_id][$right] = '1'; + } + } + } + + $this->give_access_to_sbas($sbas_to_acces); + + foreach ($rights_to_give as $sbas_id => $rights) + { + $this->update_rights_to_sbas($sbas_id, $rights); + } + + $bas_rights = array('canputinalbum', 'candwnldhd' + , 'candwnldpreview', 'cancmd' + , 'canadmin', 'actif', 'canreport', 'canpush' + , 'canaddrecord', 'canmodifrecord', 'candeleterecord' + , 'chgstatus', 'imgtools' + , 'manage', 'modify_struct' + , 'nowatermark', 'order_master' ); - $sql = 'INSERT INTO sbasusr - (SELECT distinct null as sbasusr_id, sb.sbas_id, :usr_id as usr_id, bas_manage - , bas_modify_struct,bas_modif_th,bas_chupub - FROM sbasusr sb, bas b - WHERE b.base_id IN (' . implode(', ', $base_ids) . ') - AND b.sbas_id = sb.sbas_id - AND usr_id = :template_id)'; + $bas_to_acces = array(); + $rights_to_give = array(); - $stmt = $this->appbox->get_connection()->prepare($sql); - $stmt->execute($params); - $stmt->closeCursor(); + foreach ($template_user->ACL()->get_granted_base() as $collection) + { + $base_id = $collection->get_base_id(); - $this->delete_data_from_cache(self::CACHE_RIGHTS_SBAS); + if (!in_array($base_id, $base_ids)) + continue; - $sql = "INSERT INTO basusr - (SELECT null as id, base_id, :usr_id as usr_id, canputinalbum - , candwnldhd, candwnldsubdef, candwnldpreview, cancmd - , canadmin, actif, canreport, canpush, now() as creationdate - , basusr_infousr, mask_and, mask_xor, restrict_dwnld - , month_dwnld_max, remain_dwnld, time_limited, limited_from - , limited_to, canaddrecord, canmodifrecord, candeleterecord - , chgstatus, '0000-00-00 00:00:00' as lastconn, imgtools - , manage, modify_struct, bas_manage, bas_modify_struct - , nowatermark, order_master - FROM basusr - WHERE usr_id = - (SELECT usr_id - FROM usr WHERE usr_id = :template_id) - AND base_id IN (" . implode(', ', $base_ids) . "))"; + if (!$this->has_access_to_base($base_id)) + { + $bas_to_acces[] = $base_id; + } - $stmt = $this->appbox->get_connection()->prepare($sql); - $stmt->execute($params); - $stmt->closeCursor(); + foreach ($bas_rights as $right) + { + if ($template_user->ACL()->has_right_on_base($base_id, $right)) + { + $rights_to_give[$base_id][$right] = '1'; + } + } + } - $this->inject_rights(); - $this->delete_data_from_cache(self::CACHE_RIGHTS_BAS); + $this->give_access_to_base($bas_to_acces); + + foreach ($rights_to_give as $sbas_id => $rights) + { + $this->update_rights_to_base($base_id, $rights); + } $this->user->set_last_template($template_user); @@ -315,7 +357,7 @@ class ACL implements cache_cacheableInterface { return false; } - + if (!isset($this->_rights_bas[$base_id][$right])) throw new Exception('right ' . $right . ' does not exists'); @@ -750,7 +792,7 @@ class ACL implements cache_cacheableInterface { if ($this->_rights_bas && $this->_global_rights && is_array($this->_limited)) return $this; - + try { $this->_rights_bas = $this->get_data_from_cache(self::CACHE_RIGHTS_BAS); @@ -1399,12 +1441,12 @@ class ACL implements cache_cacheableInterface $this->load_rights_bas(); $datetime = new DateTime(); - + if (!isset($this->_limited[$base_id])) { return false; } - + $ret = ($this->_limited[$base_id]['dmin'] > $datetime || $this->_limited[$base_id]['dmax'] < $datetime); From ec105adfbca56b671b8fa1f06bfdb8cd3150a9db Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 16:07:46 +0100 Subject: [PATCH 50/63] Remove unused right --- lib/conf.d/bases_structure.xml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/lib/conf.d/bases_structure.xml b/lib/conf.d/bases_structure.xml index 702ceef86e..56efc01fbc 100644 --- a/lib/conf.d/bases_structure.xml +++ b/lib/conf.d/bases_structure.xml @@ -1349,16 +1349,6 @@ - - bas_manage - int(1) unsigned - - - - - 0 - - bas_modify_struct int(1) unsigned From 96fc59563b1d9c9fb6503453a71c6b687ced19eb Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 16:08:17 +0100 Subject: [PATCH 51/63] Add option to apply template to Twig templates --- templates/web/admin/editusers.twig | 4 ++-- templates/web/admin/users.html | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/templates/web/admin/editusers.twig b/templates/web/admin/editusers.twig index 536fbc7193..dd36b33274 100644 --- a/templates/web/admin/editusers.twig +++ b/templates/web/admin/editusers.twig @@ -111,7 +111,7 @@

    - {% if main_user is not empty %} + {% if main_user is not empty and main_user.is_template is empty %}
    diff --git a/templates/web/admin/users.html b/templates/web/admin/users.html index e396f3c187..355c3735b7 100644 --- a/templates/web/admin/users.html +++ b/templates/web/admin/users.html @@ -52,6 +52,18 @@

    + +

    + {% trans 'Apply a template' %} + + +

    +
    @@ -120,8 +132,8 @@ {{users.get_total}} resultats - {% set pages = users.get_total() / 20 %} - {% set modulo = users.get_total() % 20 %} + {% set pages = users.get_total() / parm['per_page'] %} + {% set modulo = users.get_total() % parm['per_page'] %} {% if modulo > 0 %}{% set pages = pages + 1 %}{% endif %} {{pages|floor}} pages @@ -188,6 +200,9 @@ el.addClass('selected'); } }); + $('#users_page_form select[name="per_page"]').bind('change', function(){ + $(this).closest('form').submit(); + }); }); From c6a60052c6160330f2a897f43d69e046fc114bcb Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 16:08:49 +0100 Subject: [PATCH 52/63] Add option to apply template to Twig templates --- www/admin/users.js | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/www/admin/users.js b/www/admin/users.js index 976eb621f3..13971c8631 100644 --- a/www/admin/users.js +++ b/www/admin/users.js @@ -168,8 +168,9 @@ $(document).ready(function(){ } if($(this).hasClass('last')) { - offset_start = Math.floor(parseInt($('input[name=total_results]').val()) / perPage); + offset_start = (Math.floor(parseInt($('input[name=total_results]').val()) / perPage))* perPage; } + $('input[name="offset_start"]', form).val(offset_start); }); @@ -261,6 +262,39 @@ $(document).ready(function(){ evt.cancelBubble = true; evt.preventDefault(); }); + + $('#users_apply_template').live('submit', function(){ + var users = p4.users.sel.join(';'); + if(users === '') + { + return false; + } + + var $this = $(this); + var template = $('select[name="template_chooser"]', $this).val(); + + if(template === '') + { + return false; + } + + $('#right-ajax').empty().addClass('loading'); + p4.users.sel = []; + + $.ajax({ + type: $this.attr('method'), + url: $this.attr('action'), + data: { + users : users, + template : template + }, + success: function(data){ + $('#right-ajax').removeClass('loading').html(data); + } + }); + return false; + }); + $('#users_page_form .user_modifier').live('click', function(){ var users = p4.users.sel.join(';'); if(users === '') From 206bf058d51ddd6087a27f2b83800a6dc9fac674 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 16:36:57 +0100 Subject: [PATCH 53/63] Fix #116 Thumbtitle lost with 3.5 migrate --- lib/classes/databox.class.php | 29 +++++++++++++++-------------- lib/classes/databox/field.class.php | 1 + 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/lib/classes/databox.class.php b/lib/classes/databox.class.php index 210fcad890..d2fed21d01 100644 --- a/lib/classes/databox.class.php +++ b/lib/classes/databox.class.php @@ -142,7 +142,7 @@ class databox extends base } catch (Exception $e) { - + } } @@ -157,7 +157,7 @@ class databox extends base } catch (Exception $e) { - + } $conn = connection::getPDOConnection(); @@ -450,7 +450,6 @@ class databox extends base $stmt->closeCursor(); if ($row) - return self::get_instance((int) $row['sbas_id']); try @@ -463,7 +462,7 @@ class databox extends base } catch (Exception $e) { - + } $sql = 'USE `' . $dbname . '`'; @@ -575,7 +574,6 @@ class databox extends base public function get_meta_structure() { if ($this->meta_struct) - return $this->meta_struct; try @@ -698,7 +696,6 @@ class databox extends base } } if ($n > $limit) - return true; return false; @@ -960,7 +957,14 @@ class databox extends base $this->saveStructure($dom_struct); $type = isset($field['type']) ? $field['type'] : 'string'; - $type = in_array($type, array(databox_field::TYPE_DATE, databox_field::TYPE_NUMBER, databox_field::TYPE_TEXT)) ? $type : databox_field::TYPE_TEXT; + $type = in_array($type + , array( + databox_field::TYPE_DATE + , databox_field::TYPE_NUMBER + , databox_field::TYPE_STRING + , databox_field::TYPE_TEXT + ) + ) ? $type : databox_field::TYPE_STRING; $meta_struct_field = databox_field::create($this, $fname); $meta_struct_field @@ -968,7 +972,7 @@ class databox extends base ->set_indexable(isset($field['index']) ? $field['index'] : '1') ->set_type($type) ->set_tbranch(isset($field['tbranch']) ? $field['tbranch'] : '') - ->set_thumbtitle(isset($field['thumbtitle']) ? $field['thumbtitle'] : '0') + ->set_thumbtitle(isset($field['thumbtitle']) ? $field['thumbtitle'] : (isset($field['thumbTitle']) ? $field['thumbTitle'] : '0')) ->set_multi(isset($field['multi']) ? $field['multi'] : 0) ->set_report(isset($field['report']) ? $field['report'] : '1') ->save(); @@ -979,7 +983,7 @@ class databox extends base } catch (Exception $e) { - + } if (isset($field['regname'])) @@ -1213,7 +1217,6 @@ class databox extends base public function get_structure() { if ($this->structure) - return $this->structure; $this->structure = $this->retrieve_structure(); @@ -1228,7 +1231,7 @@ class databox extends base } catch (Exception $e) { - + } $structure = null; @@ -1254,7 +1257,6 @@ class databox extends base public function get_cterms() { if ($this->cterms) - return $this->cterms; $sql = "SELECT value FROM pref WHERE prop='cterms'"; @@ -1421,7 +1423,6 @@ class databox extends base public function get_cgus() { if ($this->cgus) - return $this->cgus; $this->load_cgus(); @@ -1439,7 +1440,7 @@ class databox extends base } catch (Exception $e) { - + } $sql = 'SELECT value, locale, updated_on FROM pref WHERE prop ="ToU"'; diff --git a/lib/classes/databox/field.class.php b/lib/classes/databox/field.class.php index cb83c8b037..2c9f003fd3 100644 --- a/lib/classes/databox/field.class.php +++ b/lib/classes/databox/field.class.php @@ -124,6 +124,7 @@ class databox_field implements cache_cacheableInterface const TYPE_TEXT = "text"; const TYPE_DATE = "date"; + const TYPE_STRING = "string"; const TYPE_NUMBER = "number"; /** From 9f8dd943b3c867c857d99aa5c21021eab0b35a28 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 17:24:50 +0100 Subject: [PATCH 54/63] Fix #110 : make user management table sortable --- lib/classes/User/Query.class.php | 8 +++-- templates/web/admin/users.html | 62 +++++++++++++++++++++++++++----- www/admin/users.js | 23 ++++++++++++ www/skins/admin/admincolor.css | 16 +++++++++ 4 files changed, 98 insertions(+), 11 deletions(-) diff --git a/lib/classes/User/Query.class.php b/lib/classes/User/Query.class.php index 0dc66c418f..4794c485c2 100644 --- a/lib/classes/User/Query.class.php +++ b/lib/classes/User/Query.class.php @@ -128,10 +128,10 @@ class User_Query implements User_QueryInterface const SORT_FIRSTNAME= 'usr_prenom'; const SORT_LASTNAME= 'usr_nom'; const SORT_COMPANY = 'societe'; - const SORT_LOGIN = 'login'; + const SORT_LOGIN = 'usr_login'; const SORT_EMAIL = 'usr_mail'; const SORT_ID = 'usr_id'; - const SORT_CREATIONDATE = 'creationdate'; + const SORT_CREATIONDATE = 'usr_creationdate'; const SORT_COUNTRY = 'pays'; const SORT_LASTMODEL = 'lastModel'; @@ -410,6 +410,8 @@ class User_Query implements User_QueryInterface case self::SORT_COMPANY: case self::SORT_LOGIN: case self::SORT_EMAIL: + $sorter[$k] = ' usr.`' . $sort . '` COLLATE utf8_unicode_ci '; + break; case self::SORT_ID: case self::SORT_CREATIONDATE: case self::SORT_COUNTRY: @@ -430,7 +432,7 @@ class User_Query implements User_QueryInterface $sorter[$k] .= ' ASC '; break; case self::ORD_DESC: - $sorter[$k] .= ' ASC '; + $sorter[$k] .= ' DESC '; break; } } diff --git a/templates/web/admin/users.html b/templates/web/admin/users.html index 355c3735b7..47c1ea5099 100644 --- a/templates/web/admin/users.html +++ b/templates/web/admin/users.html @@ -68,29 +68,75 @@
    - - - - - - - - diff --git a/www/admin/users.js b/www/admin/users.js index 13971c8631..a64db944b0 100644 --- a/www/admin/users.js +++ b/www/admin/users.js @@ -18,6 +18,29 @@ $(document).ready(function(){ $(n).addClass('selected'); return true; } + + $('#users th.sortable').live('click', function(){ + + var $this = $(this); + + var sort = $('input', $this).val(); + + if((sort == $('#users_page_form input[name="srt"]').val()) + && ($('#users_page_form input[name="ord"]').val() == 'asc')) + { + var ord = 'desc'; + } + else + { + var ord = 'asc'; + } + + $('#users_page_form input[name="srt"]').val(sort); + $('#users_page_form input[name="ord"]').val(ord); + + $('#users_page_form').trigger('submit'); + }).live('mouseover', function(){$(this).addClass('hover');}) + .live('mouseout', function(){$(this).removeClass('hover');}); var buttons = {}; buttons[language.create_user] = function(){ diff --git a/www/skins/admin/admincolor.css b/www/skins/admin/admincolor.css index f45e65ee20..01ced53018 100644 --- a/www/skins/admin/admincolor.css +++ b/www/skins/admin/admincolor.css @@ -141,4 +141,20 @@ table.admintable tbody .dropdown{ .users_col.options{ cursor:pointer; color:#AFAFAF; +} +#users th.sortable span{ + margin:0 5px; +} +#users th.sortable{ + cursor:pointer; +} +#users th.sortable.hover, +#users th.sortable.sorted{ + background-color:#F0AD30; +} +#users th.sortable span.ord_notifier{ + display:none; +} +#users th.sortable.sorted span.ord_notifier{ + display:inline; } \ No newline at end of file From 1d5500e6e0d7cee44da4c9b853cf68046fe3753c Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 18:09:59 +0100 Subject: [PATCH 55/63] Databox field type is required and default is string --- lib/classes/databox/field.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/classes/databox/field.class.php b/lib/classes/databox/field.class.php index 2c9f003fd3..f08f639d2b 100644 --- a/lib/classes/databox/field.class.php +++ b/lib/classes/databox/field.class.php @@ -177,7 +177,7 @@ class databox_field implements cache_cacheableInterface $this->required = !!$row['required']; $this->multi = !!$row['multi']; $this->report = !!$row['report']; - $this->type = $row['type']; + $this->type = $row['type'] ?: self::TYPE_STRING; $this->tbranch = $row['tbranch']; if ($row['dces_element']) { From 5d197fb2fcff64e86aee2563c965822338582c62 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 18:10:39 +0100 Subject: [PATCH 56/63] Add databox_field::TYPE_STRING to api tests --- lib/unitTest/api/v1/aplicationTest.php | 2 +- lib/unitTest/api/v1/aplicationYamlTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/unitTest/api/v1/aplicationTest.php b/lib/unitTest/api/v1/aplicationTest.php index e5864bdf71..4e0d0d8bdd 100644 --- a/lib/unitTest/api/v1/aplicationTest.php +++ b/lib/unitTest/api/v1/aplicationTest.php @@ -246,7 +246,7 @@ class API_V1_test_adapter extends PhraseanetWebTestCaseAbstract $this->assertTrue((strlen($metadatas->separator) > 0)); $this->assertTrue(is_string($metadatas->thesaurus_branch)); - $this->assertTrue(in_array($metadatas->type, array(databox_field::TYPE_DATE, databox_field::TYPE_NUMBER, databox_field::TYPE_TEXT))); + $this->assertTrue(in_array($metadatas->type, array(databox_field::TYPE_DATE,databox_field::TYPE_STRING, databox_field::TYPE_NUMBER, databox_field::TYPE_TEXT))); $this->assertTrue(is_bool($metadatas->indexable)); $this->assertTrue(is_bool($metadatas->multivalue)); $this->assertTrue(is_bool($metadatas->readonly)); diff --git a/lib/unitTest/api/v1/aplicationYamlTest.php b/lib/unitTest/api/v1/aplicationYamlTest.php index 31fd492ad8..8f18e626c4 100644 --- a/lib/unitTest/api/v1/aplicationYamlTest.php +++ b/lib/unitTest/api/v1/aplicationYamlTest.php @@ -254,7 +254,7 @@ class API_V1_test_adapterYaml extends PhraseanetWebTestCaseAbstract $this->assertTrue((strlen($metadatas["separator"]) > 0)); $this->assertTrue(is_string($metadatas["thesaurus_branch"])); - $this->assertTrue(in_array($metadatas["type"], array(databox_field::TYPE_DATE, databox_field::TYPE_NUMBER, databox_field::TYPE_TEXT))); + $this->assertTrue(in_array($metadatas["type"], array(databox_field::TYPE_DATE,databox_field::TYPE_STRING, databox_field::TYPE_NUMBER, databox_field::TYPE_TEXT))); $this->assertTrue(is_bool($metadatas["indexable"])); $this->assertTrue(is_bool($metadatas["multivalue"])); $this->assertTrue(is_bool($metadatas["readonly"])); From 9eaac19f4d84e91e3b698b107d362465389408db Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 18:11:04 +0100 Subject: [PATCH 57/63] Fix test usr_mail --- lib/unitTest/userTest.php | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/unitTest/userTest.php b/lib/unitTest/userTest.php index 82e4fc5a3d..4bcc3d3912 100644 --- a/lib/unitTest/userTest.php +++ b/lib/unitTest/userTest.php @@ -37,12 +37,22 @@ class userTest extends PhraseanetPHPUnitAbstract $this->assertFalse(User_Adapter::get_usr_id_from_email(null)); self::$user->set_email(''); $this->assertFalse(User_Adapter::get_usr_id_from_email(null)); - self::$user->set_email('noonealt1@example.com'); - $this->assertEquals(self::$user->get_id(), User_Adapter::get_usr_id_from_email('noonealt1@example.com')); + self::$user->set_email('noone@example.com'); + $this->assertEquals(self::$user->get_id(), User_Adapter::get_usr_id_from_email('noone@example.com')); } catch(Exception $e) { $this->fail($e->getMessage()); + } + try + { + + self::$user->set_email('noonealt1@example.com'); + $this->fail('A user already got this address'); + } + catch(Exception $e) + { + } $this->assertFalse(User_Adapter::get_usr_id_from_email(null)); } From 0661d25cffd7ef0005346844fced9a7a33cc3b55 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 20:25:38 +0100 Subject: [PATCH 58/63] Add bootstrap to setup --- lib/Alchemy/Phrasea/Application/Setup.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Alchemy/Phrasea/Application/Setup.php b/lib/Alchemy/Phrasea/Application/Setup.php index 56a99be1a6..e620cd2db0 100644 --- a/lib/Alchemy/Phrasea/Application/Setup.php +++ b/lib/Alchemy/Phrasea/Application/Setup.php @@ -15,6 +15,7 @@ use Silex\Application; use Alchemy\Phrasea\Controller\Setup as Controller; use Alchemy\Phrasea\Controller\Utils as ControllerUtils; +require_once dirname(__FILE__) . '/../../../bootstrap.php'; /** * * @package From dc1ef6a3bf7b70c890e3f3392bdf184459cdfff5 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 20:38:29 +0100 Subject: [PATCH 59/63] Core should work when Phraseanet is not installed --- lib/Alchemy/Phrasea/Core.php | 65 ++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 21 deletions(-) diff --git a/lib/Alchemy/Phrasea/Core.php b/lib/Alchemy/Phrasea/Core.php index 77ca90737c..ae005151d9 100644 --- a/lib/Alchemy/Phrasea/Core.php +++ b/lib/Alchemy/Phrasea/Core.php @@ -24,6 +24,15 @@ require_once __DIR__ . '/../../vendor/Silex/vendor/pimple/lib/Pimple.php'; class Core extends \Pimple { + + protected static $availableLanguages = array( + 'ar_SA' => 'العربية' + , 'de_DE' => 'Deutsch' + , 'en_GB' => 'English' + , 'es_ES' => 'Español' + , 'fr_FR' => 'Français' + ); + public function __construct($isDev = false) { @@ -44,10 +53,23 @@ class Core extends \Pimple }); - $this['Registry'] = $this->share(function() - { - return \registry::get_instance(); - }); + if (\setup::is_installed()) + { + $this['Registry'] = $this->share(function() + { + return \registry::get_instance(); + }); + \phrasea::start(); + $this->enableEvents(); + } + else + { + + $this['Registry'] = $this->share(function() + { + return new \Setup_Registry(); + }); + } /** * Initialize Request @@ -72,22 +94,21 @@ class Core extends \Pimple $this->verifyTimeZone(); - \phrasea::start(); - $this->detectLanguage(); $this->enableLocales(); - $this->enableEvents(); define('JETON_MAKE_SUBDEF', 0x01); define('JETON_WRITE_META_DOC', 0x02); define('JETON_WRITE_META_SUBDEF', 0x04); define('JETON_WRITE_META', 0x06); - $gatekeeper = \gatekeeper::getInstance(); - $gatekeeper->check_directory(); - + if (\setup::is_installed()) + { + $gatekeeper = \gatekeeper::getInstance(); + $gatekeeper->check_directory(); + } return; } @@ -170,6 +191,7 @@ class Core extends \Pimple protected function enableEvents() { + \phrasea::load_events(); return; @@ -183,8 +205,8 @@ class Core extends \Pimple if ($this->getRegistry()->get('GV_debug')) { - ini_set('display_errors', 'on'); - ini_set('display_startup_errors', 'on'); + ini_set('display_errors', 'on'); + ini_set('display_startup_errors', 'on'); } else { @@ -204,23 +226,24 @@ class Core extends \Pimple return $this; } + /** + * + * @return Array + */ + public static function getAvailableLanguages() + { + return static::$availableLanguages; + } + protected function detectLanguage() { - $availables = array( - 'ar_SA' => 'العربية' - , 'de_DE' => 'Deutsch' - , 'en_GB' => 'English' - , 'es_ES' => 'Español' - , 'fr_FR' => 'Français' - ); - $this->getRequest()->setDefaultLocale( $this->getRegistry()->get('GV_default_lng', 'en_GB') ); $cookies = $this->getRequest()->cookies; - if (isset($availables[$cookies->get('locale')])) + if (isset(static::$availableLanguages[$cookies->get('locale')])) { $this->getRequest()->setLocale($cookies->get('locale')); } From cf5333bbf08e84cdb49268cd3cf9470d7b5d2649 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 20:38:53 +0100 Subject: [PATCH 60/63] Removed unused function --- lib/classes/User/Adapter.class.php | 89 ------------------------------ 1 file changed, 89 deletions(-) diff --git a/lib/classes/User/Adapter.class.php b/lib/classes/User/Adapter.class.php index 1680b2176e..4280d8ba0a 100644 --- a/lib/classes/User/Adapter.class.php +++ b/lib/classes/User/Adapter.class.php @@ -1398,95 +1398,6 @@ class User_Adapter implements User_Interface, cache_cacheableInterface return $lngs; } - public static function detectLanguage(registryInterface $registry, $setLng = null) - { - $avLanguages = self::avLanguages(); - $sel = $askLng = $askLocale = ''; - - if ($setLng !== null) - { - $askLng = substr($setLng, 0, 2); - $askLocale = $setLng; - } - elseif (Session_Handler::isset_cookie('locale')) - { - $askLng = substr(Session_Handler::get_cookie('locale'), 0, 2); - $askLocale = Session_Handler::get_cookie('locale'); - } - elseif (strlen($registry->get('GV_default_lng')) > 2) - { - $askLng = substr($registry->get('GV_default_lng'), 0, 2); - $askLocale = $registry->get('GV_default_lng'); - } - - - if ($askLng != '' && isset($avLanguages[$askLng]) && isset($avLanguages[$askLng][$askLocale])) - { - $avLanguages[$askLng][$askLocale]['selected'] = true; - $sel = $askLocale; - } - - if ($sel === '' && isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) - { - $languages = explode(';', $_SERVER['HTTP_ACCEPT_LANGUAGE']); - $found = false; - - foreach ($languages as $language) - { - $language = explode(',', strtolower($language)); - if (count($language) != 2) - continue; - - foreach ($language as $lang) - { - if (strpos($lang, '-') == 2 && strlen($lang) == 5) - { - $l = explode('-', $lang); - $l[0] = strtolower($l[0]); - $l[1] = strtoupper($l[1]); - - if ($sel != '') - { - $found = true; - break; - } - $lang = implode('_', $l); - if (isset($avLanguages[$l[0]])) - { - if (!isset($avLanguages[$l[0]][$lang])) - { - $lang = end(array_keys($avLanguages[$l[0]])); - } - $avLanguages[$l[0]][$lang]['selected'] = true; - $sel = $lang; - $found = true; - break; - } - } - } - if ($found) - break; - } - if (!$found && array_key_exists(substr($registry->get('GV_default_lng'), 0, 2), $avLanguages)) - { - $avLanguages[substr($registry->get('GV_default_lng'), 0, 2)][$registry->get('GV_default_lng')]['selected'] = true; - $sel = $registry->get('GV_default_lng'); - } - } - if ($sel == '') - { - $key = end(array_keys($avLanguages)); - $lang = end(array_keys($avLanguages[$key])); - $avLanguages[$key][$lang]['selected'] = true; - $sel = $lang; - } - Session_Handler::set_locale($sel); - - $sel = explode('_', $sel); - - return $avLanguages; - } - public static function get_wrong_email_users(appbox $appbox) { From d8644f0ad92bac2e0f92ac6cc0d72892f4f65efd Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 20:39:34 +0100 Subject: [PATCH 61/63] Fix Dev Install --- .../Phrasea/Controller/Setup/Installer.php | 30 +++++++------------ .../Phrasea/Controller/Setup/Upgrader.php | 3 +- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/lib/Alchemy/Phrasea/Controller/Setup/Installer.php b/lib/Alchemy/Phrasea/Controller/Setup/Installer.php index cf9f82a1c2..1e1e5fdd06 100644 --- a/lib/Alchemy/Phrasea/Controller/Setup/Installer.php +++ b/lib/Alchemy/Phrasea/Controller/Setup/Installer.php @@ -20,15 +20,6 @@ use Silex\ControllerProviderInterface; use Silex\ControllerCollection; date_default_timezone_set('Europe/Berlin'); -require_once dirname(__FILE__) . '/../../../../version.inc'; -require_once dirname(__FILE__) . '/../../../../classes/phrasea.class.php'; -require_once dirname(__FILE__) . '/../../../../classes/bootstrap.class.php'; -require_once dirname(__FILE__) . '/../../../../classes/cache/cacheableInterface.class.php'; -require_once dirname(__FILE__) . '/../../../../classes/cache/interface.class.php'; -require_once dirname(__FILE__) . '/../../../../classes/cache/nocache.class.php'; -require_once dirname(__FILE__) . '/../../../../classes/cache/adapter.class.php'; -require_once dirname(__FILE__) . '/../../../../classes/User/Interface.class.php'; -require_once dirname(__FILE__) . '/../../../../classes/User/Adapter.class.php'; /** * @@ -43,8 +34,6 @@ class Installer implements ControllerProviderInterface { $controllers = new ControllerCollection(); - $app['available_languages'] = \User_Adapter::detectLanguage(new \Setup_Registry()); - $controllers->get('/', function() use ($app) { $request = $app['request']; @@ -89,15 +78,15 @@ class Installer implements ControllerProviderInterface } - $ld_path = array(dirname(__FILE__) . '/../../../../templates/web'); - $loader = new Twig_Loader_Filesystem($ld_path); - $twig = new Twig_Environment($loader); + $ld_path = array(__DIR__ . '/../../../../../templates/web'); + $loader = new \Twig_Loader_Filesystem($ld_path); + $twig = new \Twig_Environment($loader); $html = $twig->render( '/setup/index.twig' , array_merge($constraints_coll, array( 'locale' => Session_Handler::get_locale() - , 'available_locales' => $app['available_languages'] + , 'available_locales' => $app['Core']::getAvailableLanguages() , 'version_number' => $app['Core']['Version']->getNumber() , 'version_name' => $app['Core']['Version']->getName() , 'current_servername' => $request->getScheme() . '://' . $request->getHttpHost() . '/' @@ -111,12 +100,12 @@ class Installer implements ControllerProviderInterface { \phrasea::use_i18n(\Session_Handler::get_locale()); - $ld_path = array(dirname(__FILE__) . '/../../../../templates/web'); + $ld_path = array(__DIR__ . '/../../../../../templates/web'); - $loader = new Twig_Loader_Filesystem($ld_path); - $twig = new Twig_Environment($loader); + $loader = new \Twig_Loader_Filesystem($ld_path); + $twig = new \Twig_Environment($loader); - $twig->addExtension(new Twig_Extensions_Extension_I18n()); + $twig->addExtension(new \Twig_Extensions_Extension_I18n()); $request = $app['request']; @@ -125,11 +114,12 @@ class Installer implements ControllerProviderInterface { $warnings[] = _('It is not recommended to install Phraseanet without HTTPS support'); } + $html = $twig->render( '/setup/step2.twig' , array( 'locale' => \Session_Handler::get_locale() - , 'available_locales' => $app['available_languages'] + , 'available_locales' => $app['Core']::getAvailableLanguages() , 'available_templates' => \appbox::list_databox_templates() , 'version_number' => $app['Core']['Version']->getNumber() , 'version_name' => $app['Core']['Version']->getName() diff --git a/lib/Alchemy/Phrasea/Controller/Setup/Upgrader.php b/lib/Alchemy/Phrasea/Controller/Setup/Upgrader.php index ca193f6eae..1dc98f8eea 100644 --- a/lib/Alchemy/Phrasea/Controller/Setup/Upgrader.php +++ b/lib/Alchemy/Phrasea/Controller/Setup/Upgrader.php @@ -33,7 +33,6 @@ class Upgrader implements ControllerProviderInterface $controllers = new ControllerCollection(); $app['registry'] = new \Setup_Registry(); - $app['available_languages'] = \User_Adapter::detectLanguage($app['registry']); $app['twig'] = function() { return new \supertwig(); @@ -50,7 +49,7 @@ class Upgrader implements ControllerProviderInterface , array( 'locale' => \Session_Handler::get_locale() , 'upgrade_status' => $upgrade_status - , 'available_locales' => $app['available_languages'] + , 'available_locales' => $app['Core']::getAvailableLanguages() , 'bad_users' => \User_Adapter::get_wrong_email_users(\appbox::get_instance()) , 'version_number' => $app['Core']['Version']->getNumber() , 'version_name' => $app['Core']['Version']->getName() From 03a0703441c620e380a4984c66e4876d44110709 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 20:40:02 +0100 Subject: [PATCH 62/63] Fix locale selector --- templates/web/setup/wrapper.twig | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/templates/web/setup/wrapper.twig b/templates/web/setup/wrapper.twig index 1c0001c82d..3cbbac7833 100644 --- a/templates/web/setup/wrapper.twig +++ b/templates/web/setup/wrapper.twig @@ -25,10 +25,8 @@ From cda51b468607b32748bbf812491bfc1f047cb362 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Mon, 26 Dec 2011 20:42:31 +0100 Subject: [PATCH 63/63] Removing `dirname(__FILE__)` --- lib/classes/API/OAuth2/Adapter.class.php | 2 +- lib/classes/API/OAuth2/Autoloader.class.php | 2 +- lib/classes/API/V1/result.class.php | 2 +- lib/classes/Bridge/Api/Auth/Flickr.class.php | 6 ++--- lib/classes/Bridge/Api/Dailymotion.class.php | 2 +- lib/classes/Bridge/Api/Flickr.class.php | 6 ++--- lib/classes/Bridge/Api/Youtube.class.php | 2 +- lib/classes/Setup/Upgrade.class.php | 2 +- lib/classes/User/Adapter.class.php | 2 +- lib/classes/appbox.class.php | 8 +++---- lib/classes/base.class.php | 4 ++-- .../video/progressive/moovRelocator.class.php | 2 +- lib/classes/connection.class.php | 4 ++-- lib/classes/connection/pdo.class.php | 2 +- lib/classes/databox.class.php | 2 +- lib/classes/eventsmanager/broker.class.php | 10 ++++----- .../module/console/aboutAuthors.class.php | 2 +- .../module/console/aboutLicense.class.php | 2 +- .../module/console/schedulerStart.class.php | 2 +- .../module/console/schedulerState.class.php | 2 +- .../module/console/schedulerStop.class.php | 2 +- .../module/console/systemBackupDB.class.php | 4 ++-- .../module/console/systemClearCache.class.php | 8 +++---- .../console/systemTemplateGenerator.class.php | 8 +++---- .../module/console/systemUpgrade.class.php | 8 +++---- lib/classes/module/console/tasklist.class.php | 2 +- lib/classes/module/console/taskrun.class.php | 2 +- lib/classes/patch/320aa.class.php | 6 ++--- lib/classes/phrasea.class.php | 6 ++--- lib/classes/registry.class.php | 6 ++--- .../adapter/sphinx/engine.class.php | 2 +- lib/classes/set/export.class.php | 2 +- lib/classes/setup.class.php | 22 +++++++++---------- lib/classes/sphinx/configuration.class.php | 2 +- lib/classes/task/Scheduler.class.php | 4 ++-- www/admin/adminFeedback.php | 2 +- www/admin/cgus.php | 2 +- www/admin/collection.php | 2 +- www/admin/collorder.php | 2 +- www/admin/database.php | 2 +- www/admin/databases.php | 6 ++--- www/admin/demand.php | 2 +- www/admin/description.php | 2 +- www/admin/getinfousr.php | 2 +- www/admin/global_values.php | 2 +- www/admin/import.php | 2 +- www/admin/import0.php | 2 +- www/admin/index.php | 2 +- www/admin/newcoll.php | 2 +- www/admin/runscheduler.php | 2 +- www/admin/sessionwhois.php | 2 +- www/admin/showlogtask.php | 2 +- www/admin/sitestruct.php | 2 +- www/admin/sphinxconf.php | 2 +- www/admin/statbits.php | 2 +- www/admin/structure.php | 2 +- www/admin/subdefs.php | 2 +- www/admin/sugval.php | 2 +- www/admin/task2.js.php | 2 +- www/admin/task2.php | 2 +- www/admin/task2utils.php | 2 +- www/admin/taskfacility.php | 2 +- www/admin/taskmanager.php | 2 +- www/api/login/login.php | 2 +- www/api/test.php | 2 +- www/api/test_upl.php | 2 +- www/api/upload/upload.php | 2 +- www/client/answer.php | 2 +- www/client/baskets.php | 2 +- www/client/clientFeedBack.php | 2 +- www/client/index.php | 2 +- www/include/cguUtils.php | 2 +- www/include/delses.php | 2 +- www/include/download.php | 2 +- www/include/download_anonymous.php | 2 +- www/include/download_prepare.exe.php | 2 +- www/include/download_prepare.php | 2 +- www/include/error.php | 2 +- www/include/geonames.feedback.php | 2 +- www/include/minify/builder/index.php | 6 ++--- www/include/minify/builder/ocCheck.php | 2 +- www/include/minify/config.php | 2 +- www/include/minify/index.php | 2 +- www/include/minify/utils.php | 4 ++-- www/include/multiexports.php | 2 +- www/include/printpage.php | 2 +- www/include/printpage_pdf.php | 2 +- www/include/sendmailpage.php | 2 +- www/include/updses.php | 2 +- www/login/account.php | 4 ++-- www/login/authenticate.php | 2 +- www/login/forgotpwd.php | 2 +- www/login/index.php | 2 +- www/login/logout.php | 2 +- www/login/register-confirm.php | 2 +- www/login/register.php | 2 +- www/login/reset-email.php | 4 ++-- www/login/reset-password.php | 2 +- www/login/sendmail-confirm.php | 2 +- www/prod/answer.php | 2 +- www/prod/chghddocument.php | 2 +- www/prod/chgstatus.php | 2 +- www/prod/chgthumb.php | 2 +- www/prod/chgtype.php | 2 +- www/prod/docfunction.php | 2 +- www/prod/imgfunction.php | 2 +- www/prod/newimg.php | 2 +- www/prod/prodFeedBack.php | 2 +- www/prod/publish.php | 2 +- www/prod/push.feedback.php | 2 +- www/prod/pushdoc.php | 2 +- www/prod/rotate.php | 2 +- www/prod/share.php | 2 +- www/report/ajax_chart.php | 2 +- www/report/ajax_info_dashboard.php | 2 +- www/report/ajax_liste_base.php | 2 +- www/report/ajax_table_content.php | 2 +- www/report/charts/drawLinePlotWithLegend.php | 6 ++--- www/report/charts/draw_pie.php | 6 ++--- www/report/export_csv.php | 2 +- www/report/index.php | 2 +- www/report/report.php | 2 +- www/report/tab.php | 2 +- www/setup/installer.php | 2 +- www/thesaurus2/accept.php | 2 +- www/thesaurus2/export_text.php | 2 +- www/thesaurus2/export_text_dlg.php | 2 +- www/thesaurus2/export_topics.php | 2 +- www/thesaurus2/export_topics_dlg.php | 2 +- www/thesaurus2/import.php | 2 +- www/thesaurus2/import_dlg.php | 2 +- www/thesaurus2/index.php | 2 +- www/thesaurus2/linkfield.php | 2 +- www/thesaurus2/linkfield2.php | 2 +- www/thesaurus2/linkfield3.php | 2 +- www/thesaurus2/loadth.php | 2 +- www/thesaurus2/newsy_dlg.php | 2 +- www/thesaurus2/newterm.php | 2 +- www/thesaurus2/properties.php | 2 +- www/thesaurus2/replace.php | 2 +- www/thesaurus2/replace2.php | 2 +- www/thesaurus2/replace3.php | 2 +- www/thesaurus2/rescan.php | 2 +- www/thesaurus2/rescan_dlg.php | 2 +- www/thesaurus2/search.php | 2 +- www/thesaurus2/thesaurus.php | 2 +- www/thesaurus2/xmlhttp/accept.x.php | 2 +- www/thesaurus2/xmlhttp/acceptcandidates.x.php | 2 +- www/thesaurus2/xmlhttp/changesylng.x.php | 2 +- www/thesaurus2/xmlhttp/changesypos.x.php | 2 +- www/thesaurus2/xmlhttp/deletenohits.x.php | 2 +- www/thesaurus2/xmlhttp/delsy.x.php | 2 +- www/thesaurus2/xmlhttp/delts.x.php | 2 +- www/thesaurus2/xmlhttp/gethtmlbranch.x.php | 2 +- www/thesaurus2/xmlhttp/getsy.x.php | 2 +- www/thesaurus2/xmlhttp/getterm.x.php | 2 +- www/thesaurus2/xmlhttp/killterm.x.php | 2 +- www/thesaurus2/xmlhttp/newsy.x.php | 2 +- www/thesaurus2/xmlhttp/newts.x.php | 2 +- www/thesaurus2/xmlhttp/openbranches.x.php | 2 +- www/thesaurus2/xmlhttp/reject.x.php | 2 +- www/thesaurus2/xmlhttp/searchcandidate.x.php | 2 +- www/thesaurus2/xmlhttp/searchnohits.x.php | 2 +- www/upload/index.php | 2 +- www/upload/lazaret_image.php | 2 +- www/upload/upload.php | 4 ++-- www/upload/uploadFeedback.php | 2 +- www/xmlhttp/acceptcandidates.j.php | 2 +- www/xmlhttp/checkcandidatetarget.j.php | 2 +- www/xmlhttp/deletecandidates.j.php | 2 +- www/xmlhttp/editing_presets.j.php | 2 +- www/xmlhttp/getsy_prod.x.php | 2 +- www/xmlhttp/getterm_prod.h.php | 2 +- www/xmlhttp/getterm_prod.x.php | 2 +- www/xmlhttp/openbranch_prod.j.php | 2 +- www/xmlhttp/openbranches_prod.h.php | 2 +- www/xmlhttp/openbranches_prod.x.php | 2 +- www/xmlhttp/replacecandidate.j.php | 2 +- www/xmlhttp/search_th_term_prod.j.php | 2 +- 179 files changed, 231 insertions(+), 231 deletions(-) diff --git a/lib/classes/API/OAuth2/Adapter.class.php b/lib/classes/API/OAuth2/Adapter.class.php index ec5dcaddbd..c70cf6f381 100644 --- a/lib/classes/API/OAuth2/Adapter.class.php +++ b/lib/classes/API/OAuth2/Adapter.class.php @@ -9,7 +9,7 @@ * file that was distributed with this source code. */ -require_once dirname(__FILE__) . '/../../../vendor/oauth2/lib/OAuth2.inc'; +require_once __DIR__ . '/../../../vendor/oauth2/lib/OAuth2.inc'; /** * diff --git a/lib/classes/API/OAuth2/Autoloader.class.php b/lib/classes/API/OAuth2/Autoloader.class.php index 6fd696ef08..1099c5eac6 100644 --- a/lib/classes/API/OAuth2/Autoloader.class.php +++ b/lib/classes/API/OAuth2/Autoloader.class.php @@ -41,7 +41,7 @@ class API_OAuth2_Autoloader */ static public function autoload($class) { - if (file_exists($file = dirname(__FILE__) . '/../../../vendor/oauth2/lib/' . str_replace(array('_', "\0"), array('/', ''), $class) . '.inc')) + if (file_exists($file = __DIR__ . '/../../../vendor/oauth2/lib/' . str_replace(array('_', "\0"), array('/', ''), $class) . '.inc')) { require $file; } diff --git a/lib/classes/API/V1/result.class.php b/lib/classes/API/V1/result.class.php index cf8f410e83..4469c26413 100644 --- a/lib/classes/API/V1/result.class.php +++ b/lib/classes/API/V1/result.class.php @@ -1,6 +1,6 @@ registry = $registry; $this->session = Session_Handler::getInstance($this); - require dirname(__FILE__) . '/../../config/connexion.inc'; + require __DIR__ . '/../../config/connexion.inc'; $this->host = $hostname; $this->port = $port; @@ -409,7 +409,7 @@ class appbox extends base { $credentials['dbname'] = $dbname; } - $connexion = dirname(__FILE__) . "/../../config/connexion.inc"; + $connexion = __DIR__ . "/../../config/connexion.inc"; if (is_file($connexion)) unlink($connexion); @@ -422,7 +422,7 @@ class appbox extends base } if (!file_put_contents($connexion, $connexionINI, FILE_APPEND) !== false) - throw new Exception(sprintf(_('Impossible d\'ecrire dans le dossier %s'), dirname(dirname(__FILE__)) . "/config/")); + throw new Exception(sprintf(_('Impossible d\'ecrire dans le dossier %s'), dirname(__DIR__) . "/config/")); if (function_exists('chmod')) chmod($connexion, 0700); @@ -545,7 +545,7 @@ class appbox extends base public static function list_databox_templates() { $files = array(); - $dir = new DirectoryIterator(dirname(__FILE__) . '/../conf.d/data_templates/'); + $dir = new DirectoryIterator(__DIR__ . '/../conf.d/data_templates/'); foreach ($dir as $fileinfo) { if ($fileinfo->isFile()) diff --git a/lib/classes/base.class.php b/lib/classes/base.class.php index d1e6f0ff7a..c6ad4c2fca 100644 --- a/lib/classes/base.class.php +++ b/lib/classes/base.class.php @@ -268,7 +268,7 @@ abstract class base implements cache_cacheableInterface protected function upgradeDb($apply_patches, Setup_Upgrade &$upgrader) { - require_once dirname(__FILE__) . '/../version.inc'; + require_once __DIR__ . '/../version.inc'; $recommends = array(); @@ -393,7 +393,7 @@ abstract class base implements cache_cacheableInterface return $this; - $structure = simplexml_load_file(dirname(__FILE__) . "/../../lib/conf.d/bases_structure.xml"); + $structure = simplexml_load_file(__DIR__ . "/../../lib/conf.d/bases_structure.xml"); if (!$structure) throw new Exception('Unable to load schema'); diff --git a/lib/classes/binaryAdapter/video/progressive/moovRelocator.class.php b/lib/classes/binaryAdapter/video/progressive/moovRelocator.class.php index 3fbf455407..5eac57d440 100644 --- a/lib/classes/binaryAdapter/video/progressive/moovRelocator.class.php +++ b/lib/classes/binaryAdapter/video/progressive/moovRelocator.class.php @@ -1,5 +1,5 @@ writeln(file_get_contents(dirname(__FILE__) . '/../../../../AUTHORS')); + $output->writeln(file_get_contents(__DIR__ . '/../../../../AUTHORS')); return; } diff --git a/lib/classes/module/console/aboutLicense.class.php b/lib/classes/module/console/aboutLicense.class.php index 246140dbbc..04c6ccf958 100644 --- a/lib/classes/module/console/aboutLicense.class.php +++ b/lib/classes/module/console/aboutLicense.class.php @@ -37,7 +37,7 @@ class module_console_aboutLicense extends Command public function execute(InputInterface $input, OutputInterface $output) { - $output->writeln(file_get_contents(dirname(__FILE__) . '/../../../../LICENSE')); + $output->writeln(file_get_contents(__DIR__ . '/../../../../LICENSE')); return; } diff --git a/lib/classes/module/console/schedulerStart.class.php b/lib/classes/module/console/schedulerStart.class.php index 52afd000be..d0b2591f55 100644 --- a/lib/classes/module/console/schedulerStart.class.php +++ b/lib/classes/module/console/schedulerStart.class.php @@ -45,7 +45,7 @@ class module_console_schedulerStart extends Command throw new RuntimeException('Phraseanet is not set up'); } - require_once dirname(__FILE__) . '/../../../../lib/bootstrap.php'; + require_once __DIR__ . '/../../../../lib/bootstrap.php'; $scheduler = new task_Scheduler(); $scheduler->run($output, true); diff --git a/lib/classes/module/console/schedulerState.class.php b/lib/classes/module/console/schedulerState.class.php index 4861e02224..cedf9fc9f1 100644 --- a/lib/classes/module/console/schedulerState.class.php +++ b/lib/classes/module/console/schedulerState.class.php @@ -40,7 +40,7 @@ class module_console_schedulerState extends Command throw new RuntimeException('Phraseanet is not set up'); } - require_once dirname(__FILE__) . '/../../../../lib/bootstrap.php'; + require_once __DIR__ . '/../../../../lib/bootstrap.php'; $appbox = appbox::get_instance(); $task_manager = new task_manager($appbox); diff --git a/lib/classes/module/console/schedulerStop.class.php b/lib/classes/module/console/schedulerStop.class.php index b806770dd1..ab487f4157 100644 --- a/lib/classes/module/console/schedulerStop.class.php +++ b/lib/classes/module/console/schedulerStop.class.php @@ -40,7 +40,7 @@ class module_console_schedulerStop extends Command throw new RuntimeException('Phraseanet is not set up'); } - require_once dirname(__FILE__) . '/../../../../lib/bootstrap.php'; + require_once __DIR__ . '/../../../../lib/bootstrap.php'; $appbox = appbox::get_instance(); $task_manager = new task_manager($appbox); diff --git a/lib/classes/module/console/systemBackupDB.class.php b/lib/classes/module/console/systemBackupDB.class.php index f477da44c3..6384e76bfc 100644 --- a/lib/classes/module/console/systemBackupDB.class.php +++ b/lib/classes/module/console/systemBackupDB.class.php @@ -31,7 +31,7 @@ class module_console_systemBackupDB extends Command $dir = sprintf( '%s/config/' - , dirname(dirname(dirname(dirname(dirname(__FILE__))))) + , dirname(dirname(dirname(dirname(__DIR__)))) ); $this->setDescription('Backup Phraseanet Databases'); @@ -48,7 +48,7 @@ class module_console_systemBackupDB extends Command throw new RuntimeException('Phraseanet is not set up'); } - require_once dirname(__FILE__) . '/../../../../lib/bootstrap.php'; + require_once __DIR__ . '/../../../../lib/bootstrap.php'; $output->write('Phraseanet is going to be backup...', true); diff --git a/lib/classes/module/console/systemClearCache.class.php b/lib/classes/module/console/systemClearCache.class.php index 262f20fb83..bb597514da 100644 --- a/lib/classes/module/console/systemClearCache.class.php +++ b/lib/classes/module/console/systemClearCache.class.php @@ -44,8 +44,8 @@ class module_console_systemClearCache extends Command ->exclude('.git') ->exclude('.svn') ->in(array( - dirname(__FILE__) . '/../../../../tmp/cache_minify/' - , dirname(__FILE__) . '/../../../../tmp/cache_twig/' + __DIR__ . '/../../../../tmp/cache_minify/' + , __DIR__ . '/../../../../tmp/cache_twig/' )) ; $count = 1; @@ -59,8 +59,8 @@ class module_console_systemClearCache extends Command $finder ->directories() ->in(array( - dirname(__FILE__) . '/../../../../tmp/cache_minify' - , dirname(__FILE__) . '/../../../../tmp/cache_twig' + __DIR__ . '/../../../../tmp/cache_minify' + , __DIR__ . '/../../../../tmp/cache_twig' )) ->exclude('.git') ->exclude('.svn') diff --git a/lib/classes/module/console/systemTemplateGenerator.class.php b/lib/classes/module/console/systemTemplateGenerator.class.php index 5ca41ac1ba..9410329704 100644 --- a/lib/classes/module/console/systemTemplateGenerator.class.php +++ b/lib/classes/module/console/systemTemplateGenerator.class.php @@ -36,16 +36,16 @@ class module_console_systemTemplateGenerator extends Command public function execute(InputInterface $input, OutputInterface $output) { - require_once dirname(__FILE__) . '/../../../../lib/vendor/Twig/lib/Twig/Autoloader.php'; - require_once dirname(__FILE__) . '/../../../../lib/vendor/Twig-extensions/lib/Twig/Extensions/Autoloader.php'; + require_once __DIR__ . '/../../../../lib/vendor/Twig/lib/Twig/Autoloader.php'; + require_once __DIR__ . '/../../../../lib/vendor/Twig-extensions/lib/Twig/Extensions/Autoloader.php'; Twig_Autoloader::register(); Twig_Extensions_Autoloader::register(); - $tplDir = dirname(__FILE__) . '/../../../../templates/'; - $tmpDir = dirname(__FILE__) . '/../../../../tmp/cache_twig/'; + $tplDir = __DIR__ . '/../../../../templates/'; + $tmpDir = __DIR__ . '/../../../../tmp/cache_twig/'; $loader = new Twig_Loader_Filesystem($tplDir); $twig = new Twig_Environment($loader, array( diff --git a/lib/classes/module/console/systemUpgrade.class.php b/lib/classes/module/console/systemUpgrade.class.php index 22d62f2a66..b8de9d1b5e 100644 --- a/lib/classes/module/console/systemUpgrade.class.php +++ b/lib/classes/module/console/systemUpgrade.class.php @@ -39,9 +39,9 @@ class module_console_systemUpgrade extends Command if (!setup::is_installed()) { - if (file_exists(dirname(__FILE__) . "/../../../../config/connexion.inc") - && !file_exists(dirname(__FILE__) . "/../../../../config/config.inc") - && file_exists(dirname(__FILE__) . "/../../../../config/_GV.php")) + if (file_exists(__DIR__ . "/../../../../config/connexion.inc") + && !file_exists(__DIR__ . "/../../../../config/config.inc") + && file_exists(__DIR__ . "/../../../../config/_GV.php")) { $output->writeln('This version of Phraseanet requires a config/config.inc'); @@ -76,7 +76,7 @@ class module_console_systemUpgrade extends Command } - require_once dirname(__FILE__) . '/../../../../lib/bootstrap.php'; + require_once __DIR__ . '/../../../../lib/bootstrap.php'; $output->write('Phraseanet is going to be upgraded', true); $dialog = $this->getHelperSet()->get('dialog'); diff --git a/lib/classes/module/console/tasklist.class.php b/lib/classes/module/console/tasklist.class.php index 58fd108ed0..91da2498d5 100644 --- a/lib/classes/module/console/tasklist.class.php +++ b/lib/classes/module/console/tasklist.class.php @@ -42,7 +42,7 @@ class module_console_tasklist extends Command throw new RuntimeException('Phraseanet is not set up'); } - require_once dirname(__FILE__) . '/../../../../lib/bootstrap.php'; + require_once __DIR__ . '/../../../../lib/bootstrap.php'; $appbox = appbox::get_instance(); $task_manager = new task_manager($appbox); diff --git a/lib/classes/module/console/taskrun.class.php b/lib/classes/module/console/taskrun.class.php index 6e22d6fd24..da62654ed0 100644 --- a/lib/classes/module/console/taskrun.class.php +++ b/lib/classes/module/console/taskrun.class.php @@ -50,7 +50,7 @@ class module_console_taskrun extends Command throw new RuntimeException('Phraseanet is not set up'); } - require_once dirname(__FILE__) . '/../../../../lib/bootstrap.php'; + require_once __DIR__ . '/../../../../lib/bootstrap.php'; $task_id = (int) $input->getArgument('task_id'); diff --git a/lib/classes/patch/320aa.class.php b/lib/classes/patch/320aa.class.php index a3b28f1fe6..5468abc4d5 100644 --- a/lib/classes/patch/320aa.class.php +++ b/lib/classes/patch/320aa.class.php @@ -54,9 +54,9 @@ class patch_320aa implements patchInterface function apply(base &$appbox) { - if(is_file(dirname(__FILE__) . '/../../../config/_GV.php')) - require dirname(__FILE__) . '/../../../config/_GV.php'; - require dirname(__FILE__) . '/../../../lib/conf.d/_GV_template.inc'; + if(is_file(__DIR__ . '/../../../config/_GV.php')) + require __DIR__ . '/../../../config/_GV.php'; + require __DIR__ . '/../../../lib/conf.d/_GV_template.inc'; define('GV_STATIC_URL', ''); define('GV_sphinx', false); diff --git a/lib/classes/phrasea.class.php b/lib/classes/phrasea.class.php index 70b22feae2..07d05537ce 100644 --- a/lib/classes/phrasea.class.php +++ b/lib/classes/phrasea.class.php @@ -105,7 +105,7 @@ class phrasea public static function start() { - require (dirname(__FILE__) . '/../../config/connexion.inc'); + require (__DIR__ . '/../../config/connexion.inc'); if (!extension_loaded('phrasea2')) printf("Missing Extension php-phrasea"); @@ -283,7 +283,7 @@ class phrasea putenv('LANGUAGE=' . $locale . '.' . $codeset); bind_textdomain_codeset($textdomain, 'UTF-8'); - bindtextdomain($textdomain, dirname(__FILE__) . '/../../locale/'); + bindtextdomain($textdomain, __DIR__ . '/../../locale/'); setlocale(LC_ALL , $locale . '.UTF-8' , $locale . '.UTF8' @@ -497,7 +497,7 @@ class phrasea else { $request->set_code($code); - include(dirname(__FILE__) . '/../../www/include/error.php'); + include(__DIR__ . '/../../www/include/error.php'); } die(); break; diff --git a/lib/classes/registry.class.php b/lib/classes/registry.class.php index e8c13dfd3b..ada342d04d 100644 --- a/lib/classes/registry.class.php +++ b/lib/classes/registry.class.php @@ -41,7 +41,7 @@ class registry implements registryInterface */ public static function get_instance() { - $prefix = crc32(dirname(__FILE__)); + $prefix = crc32(__DIR__); if (!self::$_instance instanceof self) self::$_instance = new self(new cache_opcode_adapter($prefix)); @@ -57,8 +57,8 @@ class registry implements registryInterface { $this->cache = $cache; - require dirname(__FILE__) . '/../../config/config.inc'; - $this->cache->set('GV_RootPath', dirname(dirname(dirname(__FILE__))) . '/'); + require __DIR__ . '/../../config/config.inc'; + $this->cache->set('GV_RootPath', dirname(dirname(__DIR__)) . '/'); $this->cache->set('GV_ServerName', p4string::addEndSlash($servername)); $this->cache->set('GV_debug', !!$debug); $this->cache->set('GV_maintenance', !!$maintenance); diff --git a/lib/classes/searchEngine/adapter/sphinx/engine.class.php b/lib/classes/searchEngine/adapter/sphinx/engine.class.php index 29b2c72346..124bb85f12 100644 --- a/lib/classes/searchEngine/adapter/sphinx/engine.class.php +++ b/lib/classes/searchEngine/adapter/sphinx/engine.class.php @@ -1,6 +1,6 @@ is_set('GV_timezone')) @@ -257,12 +257,12 @@ class setup { if (system_server::get_platform() == 'WINDOWS') { - $exiftool = dirname(dirname(__FILE__)) . '/vendor/exiftool/exiftool.exe'; - $indexer = dirname(dirname(dirname(__FILE__))) . '/bin/phraseanet_indexer.exe'; + $exiftool = dirname(__DIR__) . '/vendor/exiftool/exiftool.exe'; + $indexer = dirname(dirname(__DIR__)) . '/bin/phraseanet_indexer.exe'; } else { - $exiftool = dirname(dirname(__FILE__)) . '/vendor/exiftool/exiftool'; + $exiftool = dirname(__DIR__) . '/vendor/exiftool/exiftool'; $indexer = null; } @@ -453,7 +453,7 @@ class setup public static function check_writability(registryInterface $registry) { - $root = p4string::addEndSlash(realpath(dirname(__FILE__) . '/../../')); + $root = p4string::addEndSlash(realpath(__DIR__ . '/../../')); $pathes = array( $root . 'config', @@ -765,17 +765,17 @@ class setup public static function get_config_filepath() { - return dirname(__FILE__) . '/../../config/config.inc'; + return __DIR__ . '/../../config/config.inc'; } public static function get_connexion_filepath() { - return dirname(__FILE__) . '/../../config/connexion.inc'; + return __DIR__ . '/../../config/connexion.inc'; } public static function rollback(connection_pdo $conn, connection_pdo $connbas =null) { - $structure = simplexml_load_file(dirname(__FILE__) . "/../../lib/conf.d/bases_structure.xml"); + $structure = simplexml_load_file(__DIR__ . "/../../lib/conf.d/bases_structure.xml"); if (!$structure) throw new Exception('Unable to load schema'); @@ -814,7 +814,7 @@ class setup } } } - $connexion = dirname(__FILE__) . "/../../config/connexion.inc"; + $connexion = __DIR__ . "/../../config/connexion.inc"; if (file_exists($connexion)) unlink($connexion); diff --git a/lib/classes/sphinx/configuration.class.php b/lib/classes/sphinx/configuration.class.php index b2d1278466..92d9d43607 100644 --- a/lib/classes/sphinx/configuration.class.php +++ b/lib/classes/sphinx/configuration.class.php @@ -37,7 +37,7 @@ class sphinx_configuration public function get_available_charsets() { $available_charsets = array(); - $dir = dirname(__FILE__) . '/charsetTable/'; + $dir = __DIR__ . '/charsetTable/'; echo $dir; $registry = registry::get_instance(); foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::LEAVES_ONLY) as $file) diff --git a/lib/classes/task/Scheduler.class.php b/lib/classes/task/Scheduler.class.php index 782879a89b..14480851f8 100644 --- a/lib/classes/task/Scheduler.class.php +++ b/lib/classes/task/Scheduler.class.php @@ -45,14 +45,14 @@ class task_Scheduler protected static function get_connection() { - require dirname(__FILE__) . '/../../../config/connexion.inc'; + require __DIR__ . '/../../../config/connexion.inc'; return new connection_pdo('appbox', $hostname, $port, $user, $password, $dbname); } public function run(OutputInterface $output = null, $log_tasks = true) { - require_once dirname(__FILE__) . '/../../bootstrap.php'; + require_once __DIR__ . '/../../bootstrap.php'; $this->output = $output; $appbox = appbox::get_instance(); $registry = $appbox->get_registry(); diff --git a/www/admin/adminFeedback.php b/www/admin/adminFeedback.php index 08f26fbc53..d56108f2ca 100644 --- a/www/admin/adminFeedback.php +++ b/www/admin/adminFeedback.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; phrasea::headers(200, false, 'text/html', 'UTF-8', false); $request = http_request::getInstance(); diff --git a/www/admin/cgus.php b/www/admin/cgus.php index 646bf4cc77..a1ebeab16f 100644 --- a/www/admin/cgus.php +++ b/www/admin/cgus.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/admin/collection.php b/www/admin/collection.php index 746cc4c67f..c94728f945 100644 --- a/www/admin/collection.php +++ b/www/admin/collection.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/admin/collorder.php b/www/admin/collorder.php index bd65b4d4f6..15a35f7430 100644 --- a/www/admin/collorder.php +++ b/www/admin/collorder.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/admin/database.php b/www/admin/database.php index f050fbc8e5..7aa0608a4b 100644 --- a/www/admin/database.php +++ b/www/admin/database.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/admin/databases.php b/www/admin/databases.php index c203b9f71e..7a1072f574 100644 --- a/www/admin/databases.php +++ b/www/admin/databases.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $usr_id = $session->get_usr_id(); @@ -97,7 +97,7 @@ phrasea::headers(); { try { - require dirname(__FILE__) . '/../../config/connexion.inc'; + require __DIR__ . '/../../config/connexion.inc'; $data_template = new system_file($registry->get('GV_RootPath') . 'lib/conf.d/data_templates/' . $parm['new_data_template'] . '.xml'); $connbas = new connection_pdo('databox_creation', $hostname, $port, $user, $password, $parm['new_dbname']); @@ -159,7 +159,7 @@ phrasea::headers(); { try { - require dirname(__FILE__) . '/../../config/connexion.inc'; + require __DIR__ . '/../../config/connexion.inc'; $appbox->get_connection()->beginTransaction(); $base = databox::mount($appbox, $hostname, $port, $user, $password, $parm['new_dbname'], $registry); $base->registerAdmin($user_obj); diff --git a/www/admin/demand.php b/www/admin/demand.php index 794ec22250..8dc2af11f8 100644 --- a/www/admin/demand.php +++ b/www/admin/demand.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/admin/description.php b/www/admin/description.php index 0900b4d7fe..c46022c05c 100644 --- a/www/admin/description.php +++ b/www/admin/description.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/admin/getinfousr.php b/www/admin/getinfousr.php index b77ebb19d3..25f5c47e49 100644 --- a/www/admin/getinfousr.php +++ b/www/admin/getinfousr.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $request = http_request::getInstance(); $parm = $request->get_parms("u"); diff --git a/www/admin/global_values.php b/www/admin/global_values.php index 5e6a4f87ff..b53f037da7 100644 --- a/www/admin/global_values.php +++ b/www/admin/global_values.php @@ -22,7 +22,7 @@ require($registry->get('GV_RootPath') . "lib/classes/deprecated/countries.php"); $user = User_Adapter::getInstance($session->get_usr_id(), $appbox); -require(dirname(__FILE__) . "/../../lib/conf.d/_GV_template.inc"); +require(__DIR__ . "/../../lib/conf.d/_GV_template.inc"); $request = http_request::getInstance(); diff --git a/www/admin/import.php b/www/admin/import.php index 088273fc66..f6abfb9ffc 100644 --- a/www/admin/import.php +++ b/www/admin/import.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/admin/import0.php b/www/admin/import0.php index 203d250d84..65fed1c210 100644 --- a/www/admin/import0.php +++ b/www/admin/import0.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/admin/index.php b/www/admin/index.php index 6ae5529090..afbce2d6ff 100644 --- a/www/admin/index.php +++ b/www/admin/index.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry(); diff --git a/www/admin/newcoll.php b/www/admin/newcoll.php index 55ab6d7ce9..4a5a3e37f2 100644 --- a/www/admin/newcoll.php +++ b/www/admin/newcoll.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/admin/runscheduler.php b/www/admin/runscheduler.php index 2b0c9e83bc..e7805ac553 100644 --- a/www/admin/runscheduler.php +++ b/www/admin/runscheduler.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/admin/sessionwhois.php b/www/admin/sessionwhois.php index 3e000cf10f..1afa3964f7 100644 --- a/www/admin/sessionwhois.php +++ b/www/admin/sessionwhois.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); ?> diff --git a/www/admin/showlogtask.php b/www/admin/showlogtask.php index d9d59e73a2..fbb0d4b8a3 100644 --- a/www/admin/showlogtask.php +++ b/www/admin/showlogtask.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/admin/sitestruct.php b/www/admin/sitestruct.php index 6963f31d8c..b326abcb58 100644 --- a/www/admin/sitestruct.php +++ b/www/admin/sitestruct.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/admin/sphinxconf.php b/www/admin/sphinxconf.php index 0915ecb535..d05c67db9d 100644 --- a/www/admin/sphinxconf.php +++ b/www/admin/sphinxconf.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $registry = registry::get_instance(); $request = http_request::getInstance(); diff --git a/www/admin/statbits.php b/www/admin/statbits.php index 6fc90f1345..86ab9742d1 100644 --- a/www/admin/statbits.php +++ b/www/admin/statbits.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/admin/structure.php b/www/admin/structure.php index 3d4ed6fd0a..f3db7c10ed 100644 --- a/www/admin/structure.php +++ b/www/admin/structure.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/admin/subdefs.php b/www/admin/subdefs.php index 1cbfb0ce10..7dd77ea4e5 100644 --- a/www/admin/subdefs.php +++ b/www/admin/subdefs.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/admin/sugval.php b/www/admin/sugval.php index 756fae64ed..dabe4db13f 100644 --- a/www/admin/sugval.php +++ b/www/admin/sugval.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/admin/task2.js.php b/www/admin/task2.js.php index ff72f1a52a..822db2ea28 100644 --- a/www/admin/task2.js.php +++ b/www/admin/task2.js.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $request = http_request::getInstance(); $parm = $request->get_parms('tid' // task_id diff --git a/www/admin/task2.php b/www/admin/task2.php index 211bb18781..2dea002b6a 100644 --- a/www/admin/task2.php +++ b/www/admin/task2.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/admin/task2utils.php b/www/admin/task2utils.php index 9c7b470c03..60ca29801c 100644 --- a/www/admin/task2utils.php +++ b/www/admin/task2utils.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/admin/taskfacility.php b/www/admin/taskfacility.php index 26d248e462..1fa49cc287 100644 --- a/www/admin/taskfacility.php +++ b/www/admin/taskfacility.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(dirname(dirname(__FILE__))) . "/lib/bootstrap.php"; +require_once dirname(dirname(__DIR__)) . "/lib/bootstrap.php"; $request = http_request::getInstance(); $parm = $request->get_parms('cls', 'taskid'); diff --git a/www/admin/taskmanager.php b/www/admin/taskmanager.php index 2c59dc3b62..4c4ffc7a23 100644 --- a/www/admin/taskmanager.php +++ b/www/admin/taskmanager.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/api/login/login.php b/www/api/login/login.php index 65e3d8cbce..b282e2d81a 100644 --- a/www/api/login/login.php +++ b/www/api/login/login.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../../lib/bootstrap.php"; +require_once __DIR__ . "/../../../lib/bootstrap.php"; //SPECIAL ZINO diff --git a/www/api/test.php b/www/api/test.php index 51aa658d14..15343453b9 100644 --- a/www/api/test.php +++ b/www/api/test.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/api/test_upl.php b/www/api/test_upl.php index b3f5d3b541..a1005339ad 100644 --- a/www/api/test_upl.php +++ b/www/api/test_upl.php @@ -21,7 +21,7 @@ $session = $appbox->get_session();
    get_session(); diff --git a/www/client/baskets.php b/www/client/baskets.php index 00d37489c5..40384e33f0 100644 --- a/www/client/baskets.php +++ b/www/client/baskets.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/client/clientFeedBack.php b/www/client/clientFeedBack.php index c55c87f52b..8389d77a93 100644 --- a/www/client/clientFeedBack.php +++ b/www/client/clientFeedBack.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/client/index.php b/www/client/index.php index 6d0c78d655..55e19dfca7 100644 --- a/www/client/index.php +++ b/www/client/index.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry(); diff --git a/www/include/cguUtils.php b/www/include/cguUtils.php index 1bfadca584..9a67864e96 100644 --- a/www/include/cguUtils.php +++ b/www/include/cguUtils.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry(); diff --git a/www/include/delses.php b/www/include/delses.php index bb49af90aa..c88a732502 100644 --- a/www/include/delses.php +++ b/www/include/delses.php @@ -17,7 +17,7 @@ */ ignore_user_abort(true); set_time_limit(0); -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $request = http_request::getInstance(); diff --git a/www/include/download.php b/www/include/download.php index 59ccfce6b8..7404d422aa 100644 --- a/www/include/download.php +++ b/www/include/download.php @@ -16,7 +16,7 @@ * @link www.phraseanet.com */ /* @var $Core \Alchemy\Phrasea\Core */ -$Core = require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +$Core = require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/include/download_anonymous.php b/www/include/download_anonymous.php index 0b863296c6..03c19ffbe5 100644 --- a/www/include/download_anonymous.php +++ b/www/include/download_anonymous.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); diff --git a/www/include/download_prepare.exe.php b/www/include/download_prepare.exe.php index 43a1bd792a..501f5f3a27 100644 --- a/www/include/download_prepare.exe.php +++ b/www/include/download_prepare.exe.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $gatekeeper = gatekeeper::getInstance(); $gatekeeper->require_session(); diff --git a/www/include/download_prepare.php b/www/include/download_prepare.php index 758b8a13da..6703f9e7fa 100644 --- a/www/include/download_prepare.php +++ b/www/include/download_prepare.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $registry = $appbox->get_registry(); $session = $appbox->get_session(); diff --git a/www/include/error.php b/www/include/error.php index 0aacee20c4..4a88bb52e2 100644 --- a/www/include/error.php +++ b/www/include/error.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -include_once dirname(__FILE__) . '/../../lib/bootstrap.php'; +include_once __DIR__ . '/../../lib/bootstrap.php'; $appbox = appbox::get_instance(registry::get_instance()); $session = $appbox->get_session(); diff --git a/www/include/geonames.feedback.php b/www/include/geonames.feedback.php index 5098b429b3..a4cffb346d 100644 --- a/www/include/geonames.feedback.php +++ b/www/include/geonames.feedback.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -include(dirname(__FILE__) . '/../../lib/bootstrap.php'); +include(__DIR__ . '/../../lib/bootstrap.php'); $output = ''; $request = http_request::getInstance(); diff --git a/www/include/minify/builder/index.php b/www/include/minify/builder/index.php index bb5e000ad3..b2d28cc784 100644 --- a/www/include/minify/builder/index.php +++ b/www/include/minify/builder/index.php @@ -8,7 +8,7 @@ if (phpversion() < 5) { $encodeOutput = (function_exists('gzdeflate') && !ini_get('zlib.output_compression')); -require dirname(__FILE__) . '/../config.php'; +require __DIR__ . '/../config.php'; if (! $min_enableBuilder) { header('Location: /'); @@ -162,14 +162,14 @@ $serveOpts = array( ,'lastModifiedTime' => max( // regenerate cache if either of these change filemtime(__FILE__) - ,filemtime(dirname(__FILE__) . '/../config.php') + ,filemtime(__DIR__ . '/../config.php') ) ,'minifyAll' => true ,'encodeOutput' => $encodeOutput ); ob_end_clean(); -set_include_path(dirname(__FILE__) . '/../lib' . PATH_SEPARATOR . get_include_path()); +set_include_path(__DIR__ . '/../lib' . PATH_SEPARATOR . get_include_path()); require 'Minify.php'; diff --git a/www/include/minify/builder/ocCheck.php b/www/include/minify/builder/ocCheck.php index 001c012ce4..e78c13a123 100644 --- a/www/include/minify/builder/ocCheck.php +++ b/www/include/minify/builder/ocCheck.php @@ -8,7 +8,7 @@ $_oc = ini_get('zlib.output_compression'); // allow access only if builder is enabled -require dirname(__FILE__) . '/../config.php'; +require __DIR__ . '/../config.php'; if (! $min_enableBuilder) { header('Location: /'); exit(); diff --git a/www/include/minify/config.php b/www/include/minify/config.php index 32ba786f6a..b40ee41f4c 100644 --- a/www/include/minify/config.php +++ b/www/include/minify/config.php @@ -150,7 +150,7 @@ $min_uploaderHoursBehind = 0; * Path to Minify's lib folder. If you happen to move it, change * this accordingly. */ -$min_libPath = dirname(__FILE__) . '/lib'; +$min_libPath = __DIR__ . '/lib'; $min_cachePath = dirname( __FILE__ ) . '/../../../tmp/cache_minify'; diff --git a/www/include/minify/index.php b/www/include/minify/index.php index acc09b970d..8135ca21bd 100644 --- a/www/include/minify/index.php +++ b/www/include/minify/index.php @@ -7,7 +7,7 @@ * @package Minify */ -define('MINIFY_MIN_DIR', dirname(__FILE__)); +define('MINIFY_MIN_DIR', __DIR__); // load config require MINIFY_MIN_DIR . '/config.php'; diff --git a/www/include/minify/utils.php b/www/include/minify/utils.php index ca4abbaf53..c07dd54841 100644 --- a/www/include/minify/utils.php +++ b/www/include/minify/utils.php @@ -34,7 +34,7 @@ function Minify_groupUri($group, $forceAmpersand = false) : "/?g={$group}"; return _Minify_getBuild($group)->uri( - '/' . basename(dirname(__FILE__)) . $path + '/' . basename(__DIR__) . $path ,$forceAmpersand ); } @@ -83,7 +83,7 @@ function _Minify_getBuild($group) static $builds = array(); static $gc = false; if (false === $gc) { - $gc = (require dirname(__FILE__) . '/groupsConfig.php'); + $gc = (require __DIR__ . '/groupsConfig.php'); } if (! isset($builds[$group])) { $builds[$group] = new Minify_Build($gc[$group]); diff --git a/www/include/multiexports.php b/www/include/multiexports.php index 976f0378f8..f8752a2c9e 100644 --- a/www/include/multiexports.php +++ b/www/include/multiexports.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry(); diff --git a/www/include/printpage.php b/www/include/printpage.php index bf5bf09e0f..aa2c7093e3 100644 --- a/www/include/printpage.php +++ b/www/include/printpage.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry(); diff --git a/www/include/printpage_pdf.php b/www/include/printpage_pdf.php index 7f3172e932..b2805576ba 100644 --- a/www/include/printpage_pdf.php +++ b/www/include/printpage_pdf.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry(); diff --git a/www/include/sendmailpage.php b/www/include/sendmailpage.php index 5fd1c8840c..819742c169 100644 --- a/www/include/sendmailpage.php +++ b/www/include/sendmailpage.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . '/../../lib/bootstrap.php'; +require_once __DIR__ . '/../../lib/bootstrap.php'; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry(); diff --git a/www/include/updses.php b/www/include/updses.php index 78462fea10..cae2db95b1 100644 --- a/www/include/updses.php +++ b/www/include/updses.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/login/account.php b/www/login/account.php index 5c3e60e9f8..f4ff4226cd 100644 --- a/www/login/account.php +++ b/www/login/account.php @@ -14,9 +14,9 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; -require_once dirname(__FILE__) . "/../../lib/classes/API/OAuth2/Autoloader.class.php"; +require_once __DIR__ . "/../../lib/classes/API/OAuth2/Autoloader.class.php"; API_OAuth2_Autoloader::register(); diff --git a/www/login/authenticate.php b/www/login/authenticate.php index f05b9a4191..69e543ac31 100644 --- a/www/login/authenticate.php +++ b/www/login/authenticate.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/login/forgotpwd.php b/www/login/forgotpwd.php index 215119acc7..30073345bd 100644 --- a/www/login/forgotpwd.php +++ b/www/login/forgotpwd.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/login/index.php b/www/login/index.php index 26b17b9f24..d3546df22a 100644 --- a/www/login/index.php +++ b/www/login/index.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry(); diff --git a/www/login/logout.php b/www/login/logout.php index b336f4dacc..da46015a5b 100644 --- a/www/login/logout.php +++ b/www/login/logout.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $request = http_request::getInstance(); diff --git a/www/login/register-confirm.php b/www/login/register-confirm.php index 5bc5b93475..30070add09 100644 --- a/www/login/register-confirm.php +++ b/www/login/register-confirm.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $request = http_request::getInstance(); diff --git a/www/login/register.php b/www/login/register.php index cf354cefe7..c25f542ba4 100644 --- a/www/login/register.php +++ b/www/login/register.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/login/reset-email.php b/www/login/reset-email.php index f57157b38a..1f462a83a9 100644 --- a/www/login/reset-email.php +++ b/www/login/reset-email.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry(); @@ -133,7 +133,7 @@ if (isset($parm['form_password']) && isset($parm['form_email']) && isset($parm[' if (str_replace(array("\r\n", "\r", "\n", "\t"), '_', trim($parm['form_email'])) == $parm['form_email_confirm']) { - require_once(dirname(__FILE__) . '/../../lib/vendor/PHPMailer_v5.1/class.phpmailer.php'); + require_once(__DIR__ . '/../../lib/vendor/PHPMailer_v5.1/class.phpmailer.php'); if (PHPMailer::ValidateAddress($parm['form_email'])) { if (mail::reset_email($parm['form_email'], $session->get_usr_id()) === true) diff --git a/www/login/reset-password.php b/www/login/reset-password.php index fd58df4adc..30f6aeb40e 100644 --- a/www/login/reset-password.php +++ b/www/login/reset-password.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry(); diff --git a/www/login/sendmail-confirm.php b/www/login/sendmail-confirm.php index 363b5fba9d..b2ecbe96d3 100644 --- a/www/login/sendmail-confirm.php +++ b/www/login/sendmail-confirm.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $request = http_request::getInstance(); $parm = $request->get_post_datas('usr_id'); diff --git a/www/prod/answer.php b/www/prod/answer.php index 41ba1d37f9..43f44978ac 100644 --- a/www/prod/answer.php +++ b/www/prod/answer.php @@ -18,7 +18,7 @@ * @see http://developer.phraseanet.com * */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry(); diff --git a/www/prod/chghddocument.php b/www/prod/chghddocument.php index 81872143cf..4748020fe3 100644 --- a/www/prod/chghddocument.php +++ b/www/prod/chghddocument.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry(); diff --git a/www/prod/chgstatus.php b/www/prod/chgstatus.php index 22427b8c97..7bacc3fd7b 100644 --- a/www/prod/chgstatus.php +++ b/www/prod/chgstatus.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry(); diff --git a/www/prod/chgthumb.php b/www/prod/chgthumb.php index 1cd0b33892..94ce850028 100644 --- a/www/prod/chgthumb.php +++ b/www/prod/chgthumb.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry(); diff --git a/www/prod/chgtype.php b/www/prod/chgtype.php index 5ad7fbc29b..2509af63d3 100644 --- a/www/prod/chgtype.php +++ b/www/prod/chgtype.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); phrasea::headers(); diff --git a/www/prod/docfunction.php b/www/prod/docfunction.php index 779cc599f2..aa1042992c 100644 --- a/www/prod/docfunction.php +++ b/www/prod/docfunction.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $Core = bootstrap::getCore(); $em = $Core->getEntityManager(); diff --git a/www/prod/imgfunction.php b/www/prod/imgfunction.php index 5b7ee5a2fc..2a0f906272 100644 --- a/www/prod/imgfunction.php +++ b/www/prod/imgfunction.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -$Core = require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +$Core = require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry(); diff --git a/www/prod/newimg.php b/www/prod/newimg.php index 18dee3fe2c..a8e0087a86 100644 --- a/www/prod/newimg.php +++ b/www/prod/newimg.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $registry = registry::get_instance(); phrasea::headers(); diff --git a/www/prod/prodFeedBack.php b/www/prod/prodFeedBack.php index 59bb6f6ce9..cc76544a0f 100644 --- a/www/prod/prodFeedBack.php +++ b/www/prod/prodFeedBack.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry(); diff --git a/www/prod/publish.php b/www/prod/publish.php index 43ceb8076b..55da404848 100644 --- a/www/prod/publish.php +++ b/www/prod/publish.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $message = ''; try diff --git a/www/prod/push.feedback.php b/www/prod/push.feedback.php index a77fe208d3..cd1135acec 100644 --- a/www/prod/push.feedback.php +++ b/www/prod/push.feedback.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry(); diff --git a/www/prod/pushdoc.php b/www/prod/pushdoc.php index b197a6844e..42a5c546e7 100644 --- a/www/prod/pushdoc.php +++ b/www/prod/pushdoc.php @@ -15,7 +15,7 @@ * @link www.phraseanet.com */ define('ZFONT', 'freesans'); -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry(); diff --git a/www/prod/rotate.php b/www/prod/rotate.php index 4e67a9c3d3..9d6c158438 100644 --- a/www/prod/rotate.php +++ b/www/prod/rotate.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/prod/share.php b/www/prod/share.php index 01e7f6245b..54731e8709 100644 --- a/www/prod/share.php +++ b/www/prod/share.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; phrasea::headers(); $appbox = appbox::get_instance(); $registry = $appbox->get_registry(); diff --git a/www/report/ajax_chart.php b/www/report/ajax_chart.php index fb172be261..074c3c42dc 100644 --- a/www/report/ajax_chart.php +++ b/www/report/ajax_chart.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $request = http_request::getInstance(); diff --git a/www/report/ajax_info_dashboard.php b/www/report/ajax_info_dashboard.php index f1d7b108b7..bab9720ece 100644 --- a/www/report/ajax_info_dashboard.php +++ b/www/report/ajax_info_dashboard.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $request = http_request::getInstance(); diff --git a/www/report/ajax_liste_base.php b/www/report/ajax_liste_base.php index 3d1eed98e3..65fffcbd0f 100644 --- a/www/report/ajax_liste_base.php +++ b/www/report/ajax_liste_base.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $request = http_request::getInstance(); $parm = $request->get_parms( diff --git a/www/report/ajax_table_content.php b/www/report/ajax_table_content.php index d1e197e3b5..9c831bfaba 100644 --- a/www/report/ajax_table_content.php +++ b/www/report/ajax_table_content.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; /* get all the post parameters from report.php's form */ diff --git a/www/report/charts/drawLinePlotWithLegend.php b/www/report/charts/drawLinePlotWithLegend.php index a764f4f636..54ae2c8356 100644 --- a/www/report/charts/drawLinePlotWithLegend.php +++ b/www/report/charts/drawLinePlotWithLegend.php @@ -1,8 +1,8 @@ get_parms("value", 'legend', 'absc'); diff --git a/www/report/charts/draw_pie.php b/www/report/charts/draw_pie.php index dcc6d8e570..5ac850c623 100644 --- a/www/report/charts/draw_pie.php +++ b/www/report/charts/draw_pie.php @@ -1,8 +1,8 @@ get_parms("value", 'legend', 'title'); diff --git a/www/report/export_csv.php b/www/report/export_csv.php index 65c3f67351..7ad3a4d7bf 100644 --- a/www/report/export_csv.php +++ b/www/report/export_csv.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $request = http_request::getInstance(); $parm = $request->get_parms('name', 'csv'); diff --git a/www/report/index.php b/www/report/index.php index 1db463852e..47394970ea 100644 --- a/www/report/index.php +++ b/www/report/index.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry(); diff --git a/www/report/report.php b/www/report/report.php index 1369a3aef9..7d5bbfb979 100644 --- a/www/report/report.php +++ b/www/report/report.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $request = http_request::getInstance(); $registry = registry::get_instance(); diff --git a/www/report/tab.php b/www/report/tab.php index 7da2bbb74b..b6352c6d34 100644 --- a/www/report/tab.php +++ b/www/report/tab.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; /* get all the post parameters from report.php's form */ diff --git a/www/setup/installer.php b/www/setup/installer.php index 309847ec72..45a8007272 100644 --- a/www/setup/installer.php +++ b/www/setup/installer.php @@ -17,7 +17,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . '/../../lib/classes/bootstrap.class.php'; +require_once __DIR__ . '/../../lib/classes/bootstrap.class.php'; bootstrap::register_autoloads(); bootstrap::set_php_configuration(); diff --git a/www/thesaurus2/accept.php b/www/thesaurus2/accept.php index 1a05eae6b1..f8b3a849e5 100644 --- a/www/thesaurus2/accept.php +++ b/www/thesaurus2/accept.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; phrasea::headers(200, true); $appbox = appbox::get_instance(); diff --git a/www/thesaurus2/export_text.php b/www/thesaurus2/export_text.php index b74a58cef8..281caab130 100644 --- a/www/thesaurus2/export_text.php +++ b/www/thesaurus2/export_text.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/thesaurus2/export_text_dlg.php b/www/thesaurus2/export_text_dlg.php index 932008f1a3..df0df49320 100644 --- a/www/thesaurus2/export_text_dlg.php +++ b/www/thesaurus2/export_text_dlg.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; phrasea::headers(200, true); $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/thesaurus2/export_topics.php b/www/thesaurus2/export_topics.php index 808aff4d70..e3d396440b 100644 --- a/www/thesaurus2/export_topics.php +++ b/www/thesaurus2/export_topics.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; phrasea::headers(200, true); $appbox = appbox::get_instance(); diff --git a/www/thesaurus2/export_topics_dlg.php b/www/thesaurus2/export_topics_dlg.php index 0ea89aed32..b599457e79 100644 --- a/www/thesaurus2/export_topics_dlg.php +++ b/www/thesaurus2/export_topics_dlg.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; phrasea::headers(200, true); $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/thesaurus2/import.php b/www/thesaurus2/import.php index d48a1e094d..f2de0b25a7 100644 --- a/www/thesaurus2/import.php +++ b/www/thesaurus2/import.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; phrasea::headers(200, true); $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/thesaurus2/import_dlg.php b/www/thesaurus2/import_dlg.php index 80beeefb95..166d8ad6ed 100644 --- a/www/thesaurus2/import_dlg.php +++ b/www/thesaurus2/import_dlg.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); phrasea::headers(200, true); diff --git a/www/thesaurus2/index.php b/www/thesaurus2/index.php index db79401005..7b00fe45f7 100644 --- a/www/thesaurus2/index.php +++ b/www/thesaurus2/index.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry(); diff --git a/www/thesaurus2/linkfield.php b/www/thesaurus2/linkfield.php index 3467a9a91a..f8518718b9 100644 --- a/www/thesaurus2/linkfield.php +++ b/www/thesaurus2/linkfield.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; phrasea::headers(200, true); $appbox = appbox::get_instance(); diff --git a/www/thesaurus2/linkfield2.php b/www/thesaurus2/linkfield2.php index 0dc349a0f6..f84c76ecbe 100644 --- a/www/thesaurus2/linkfield2.php +++ b/www/thesaurus2/linkfield2.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; phrasea::headers(200, true); $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/thesaurus2/linkfield3.php b/www/thesaurus2/linkfield3.php index 0dcd1abd5f..ab32570ba3 100644 --- a/www/thesaurus2/linkfield3.php +++ b/www/thesaurus2/linkfield3.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; phrasea::headers(200, true); $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/thesaurus2/loadth.php b/www/thesaurus2/loadth.php index 4817286cec..3ce20dedbb 100644 --- a/www/thesaurus2/loadth.php +++ b/www/thesaurus2/loadth.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . '/../../lib/bootstrap.php'; +require_once __DIR__ . '/../../lib/bootstrap.php'; $registry = registry::get_instance(); phrasea::headers(); $debug = false; diff --git a/www/thesaurus2/newsy_dlg.php b/www/thesaurus2/newsy_dlg.php index e8c0f2a1c2..20de190d9a 100644 --- a/www/thesaurus2/newsy_dlg.php +++ b/www/thesaurus2/newsy_dlg.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; phrasea::headers(200, true); $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/thesaurus2/newterm.php b/www/thesaurus2/newterm.php index 417286df87..5ac3ae4217 100644 --- a/www/thesaurus2/newterm.php +++ b/www/thesaurus2/newterm.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; phrasea::headers(200, true); $appbox = appbox::get_instance(); diff --git a/www/thesaurus2/properties.php b/www/thesaurus2/properties.php index ffb6dc825b..6821d2cf07 100644 --- a/www/thesaurus2/properties.php +++ b/www/thesaurus2/properties.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; phrasea::headers(200, true); $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/thesaurus2/replace.php b/www/thesaurus2/replace.php index 58b3965949..11383977e3 100644 --- a/www/thesaurus2/replace.php +++ b/www/thesaurus2/replace.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; phrasea::headers(200, true); $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/thesaurus2/replace2.php b/www/thesaurus2/replace2.php index ff7b124550..f99b2c99b0 100644 --- a/www/thesaurus2/replace2.php +++ b/www/thesaurus2/replace2.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; phrasea::headers(200, true); $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/thesaurus2/replace3.php b/www/thesaurus2/replace3.php index 52de9a4ecc..c74cdd514e 100644 --- a/www/thesaurus2/replace3.php +++ b/www/thesaurus2/replace3.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; phrasea::headers(200, true); $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/thesaurus2/rescan.php b/www/thesaurus2/rescan.php index b6248a4ee4..7142412813 100644 --- a/www/thesaurus2/rescan.php +++ b/www/thesaurus2/rescan.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; phrasea::headers(200, true); $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/thesaurus2/rescan_dlg.php b/www/thesaurus2/rescan_dlg.php index aee025d95c..a07a3a4c7d 100644 --- a/www/thesaurus2/rescan_dlg.php +++ b/www/thesaurus2/rescan_dlg.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; phrasea::headers(200, true); $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/thesaurus2/search.php b/www/thesaurus2/search.php index 041e7feb55..1ecebcdc07 100644 --- a/www/thesaurus2/search.php +++ b/www/thesaurus2/search.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; phrasea::headers(200, true); $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/thesaurus2/thesaurus.php b/www/thesaurus2/thesaurus.php index 9ec547e088..bfc84b797d 100644 --- a/www/thesaurus2/thesaurus.php +++ b/www/thesaurus2/thesaurus.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; phrasea::headers(); $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/thesaurus2/xmlhttp/accept.x.php b/www/thesaurus2/xmlhttp/accept.x.php index 194e17bd8b..b84889a37c 100644 --- a/www/thesaurus2/xmlhttp/accept.x.php +++ b/www/thesaurus2/xmlhttp/accept.x.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../../lib/bootstrap.php"; +require_once __DIR__ . "/../../../lib/bootstrap.php"; $registry = registry::get_instance(); diff --git a/www/thesaurus2/xmlhttp/acceptcandidates.x.php b/www/thesaurus2/xmlhttp/acceptcandidates.x.php index 536456ac14..2b4f6d6c58 100644 --- a/www/thesaurus2/xmlhttp/acceptcandidates.x.php +++ b/www/thesaurus2/xmlhttp/acceptcandidates.x.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../../lib/bootstrap.php"; +require_once __DIR__ . "/../../../lib/bootstrap.php"; $registry = registry::get_instance(); diff --git a/www/thesaurus2/xmlhttp/changesylng.x.php b/www/thesaurus2/xmlhttp/changesylng.x.php index 47450fbe7d..c8b64ddecf 100644 --- a/www/thesaurus2/xmlhttp/changesylng.x.php +++ b/www/thesaurus2/xmlhttp/changesylng.x.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../../lib/bootstrap.php"; +require_once __DIR__ . "/../../../lib/bootstrap.php"; $registry = registry::get_instance(); diff --git a/www/thesaurus2/xmlhttp/changesypos.x.php b/www/thesaurus2/xmlhttp/changesypos.x.php index 8c7ba2c0d3..793d5fcdde 100644 --- a/www/thesaurus2/xmlhttp/changesypos.x.php +++ b/www/thesaurus2/xmlhttp/changesypos.x.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../../lib/bootstrap.php"; +require_once __DIR__ . "/../../../lib/bootstrap.php"; $registry = registry::get_instance(); diff --git a/www/thesaurus2/xmlhttp/deletenohits.x.php b/www/thesaurus2/xmlhttp/deletenohits.x.php index 3895ab8b8c..b48a8bb6be 100644 --- a/www/thesaurus2/xmlhttp/deletenohits.x.php +++ b/www/thesaurus2/xmlhttp/deletenohits.x.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../../lib/bootstrap.php"; +require_once __DIR__ . "/../../../lib/bootstrap.php"; $registry = registry::get_instance(); $request = http_request::getInstance(); diff --git a/www/thesaurus2/xmlhttp/delsy.x.php b/www/thesaurus2/xmlhttp/delsy.x.php index 70e46cf55c..5501328d80 100644 --- a/www/thesaurus2/xmlhttp/delsy.x.php +++ b/www/thesaurus2/xmlhttp/delsy.x.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../../lib/bootstrap.php"; +require_once __DIR__ . "/../../../lib/bootstrap.php"; $registry = registry::get_instance(); require("../xmlhttp.php"); diff --git a/www/thesaurus2/xmlhttp/delts.x.php b/www/thesaurus2/xmlhttp/delts.x.php index 33d17c7ea6..628210e29d 100644 --- a/www/thesaurus2/xmlhttp/delts.x.php +++ b/www/thesaurus2/xmlhttp/delts.x.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../../lib/bootstrap.php"; +require_once __DIR__ . "/../../../lib/bootstrap.php"; $registry = registry::get_instance(); $request = http_request::getInstance(); diff --git a/www/thesaurus2/xmlhttp/gethtmlbranch.x.php b/www/thesaurus2/xmlhttp/gethtmlbranch.x.php index c8b304d3b8..aaf1cdbeb3 100644 --- a/www/thesaurus2/xmlhttp/gethtmlbranch.x.php +++ b/www/thesaurus2/xmlhttp/gethtmlbranch.x.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../../lib/bootstrap.php"; +require_once __DIR__ . "/../../../lib/bootstrap.php"; $registry = registry::get_instance(); diff --git a/www/thesaurus2/xmlhttp/getsy.x.php b/www/thesaurus2/xmlhttp/getsy.x.php index 314d00447b..207c6177f4 100644 --- a/www/thesaurus2/xmlhttp/getsy.x.php +++ b/www/thesaurus2/xmlhttp/getsy.x.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../../lib/bootstrap.php"; +require_once __DIR__ . "/../../../lib/bootstrap.php"; $registry = registry::get_instance(); diff --git a/www/thesaurus2/xmlhttp/getterm.x.php b/www/thesaurus2/xmlhttp/getterm.x.php index 8baf058e6a..2a49f36cb5 100644 --- a/www/thesaurus2/xmlhttp/getterm.x.php +++ b/www/thesaurus2/xmlhttp/getterm.x.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../../lib/bootstrap.php"; +require_once __DIR__ . "/../../../lib/bootstrap.php"; $registry = registry::get_instance(); diff --git a/www/thesaurus2/xmlhttp/killterm.x.php b/www/thesaurus2/xmlhttp/killterm.x.php index 681b21ce23..e8112ec89b 100644 --- a/www/thesaurus2/xmlhttp/killterm.x.php +++ b/www/thesaurus2/xmlhttp/killterm.x.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../../lib/bootstrap.php"; +require_once __DIR__ . "/../../../lib/bootstrap.php"; $registry = registry::get_instance(); require("../xmlhttp.php"); diff --git a/www/thesaurus2/xmlhttp/newsy.x.php b/www/thesaurus2/xmlhttp/newsy.x.php index 7295bf8c98..62c84d63ee 100644 --- a/www/thesaurus2/xmlhttp/newsy.x.php +++ b/www/thesaurus2/xmlhttp/newsy.x.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../../lib/bootstrap.php"; +require_once __DIR__ . "/../../../lib/bootstrap.php"; $registry = registry::get_instance(); diff --git a/www/thesaurus2/xmlhttp/newts.x.php b/www/thesaurus2/xmlhttp/newts.x.php index 1cd95ddabf..39fc05b91a 100644 --- a/www/thesaurus2/xmlhttp/newts.x.php +++ b/www/thesaurus2/xmlhttp/newts.x.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../../lib/bootstrap.php"; +require_once __DIR__ . "/../../../lib/bootstrap.php"; $registry = registry::get_instance(); diff --git a/www/thesaurus2/xmlhttp/openbranches.x.php b/www/thesaurus2/xmlhttp/openbranches.x.php index a91e24716f..b0d024dc14 100644 --- a/www/thesaurus2/xmlhttp/openbranches.x.php +++ b/www/thesaurus2/xmlhttp/openbranches.x.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../../lib/bootstrap.php"; +require_once __DIR__ . "/../../../lib/bootstrap.php"; $registry = registry::get_instance(); diff --git a/www/thesaurus2/xmlhttp/reject.x.php b/www/thesaurus2/xmlhttp/reject.x.php index 57b341ebd7..fbdbe9f899 100644 --- a/www/thesaurus2/xmlhttp/reject.x.php +++ b/www/thesaurus2/xmlhttp/reject.x.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../../lib/bootstrap.php"; +require_once __DIR__ . "/../../../lib/bootstrap.php"; $registry = registry::get_instance(); require("../xmlhttp.php"); diff --git a/www/thesaurus2/xmlhttp/searchcandidate.x.php b/www/thesaurus2/xmlhttp/searchcandidate.x.php index 6b51c10e7a..cdb90ec346 100644 --- a/www/thesaurus2/xmlhttp/searchcandidate.x.php +++ b/www/thesaurus2/xmlhttp/searchcandidate.x.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../../lib/bootstrap.php"; +require_once __DIR__ . "/../../../lib/bootstrap.php"; $registry = registry::get_instance(); diff --git a/www/thesaurus2/xmlhttp/searchnohits.x.php b/www/thesaurus2/xmlhttp/searchnohits.x.php index 0f27c9ed0b..49754f3a55 100644 --- a/www/thesaurus2/xmlhttp/searchnohits.x.php +++ b/www/thesaurus2/xmlhttp/searchnohits.x.php @@ -1,6 +1,6 @@ get_session(); $registry = $appbox->get_registry(); diff --git a/www/upload/lazaret_image.php b/www/upload/lazaret_image.php index 8df9c736f1..7325858a02 100644 --- a/www/upload/lazaret_image.php +++ b/www/upload/lazaret_image.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $request = http_request::getInstance(); $parm = $request->get_parms('id'); diff --git a/www/upload/upload.php b/www/upload/upload.php index 627de1f1db..383e65e618 100644 --- a/www/upload/upload.php +++ b/www/upload/upload.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . '/../../lib/classes/http/request.class.php'; +require_once __DIR__ . '/../../lib/classes/http/request.class.php'; $request = http_request::getInstance(); $parm = $request->get_parms('session', 'coll', 'status'); @@ -25,7 +25,7 @@ if ($parm["session"]) session_id($parm["session"]); } -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/upload/uploadFeedback.php b/www/upload/uploadFeedback.php index 734b64ad8b..1e09c4e7c1 100644 --- a/www/upload/uploadFeedback.php +++ b/www/upload/uploadFeedback.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $request = http_request::getInstance(); $parm = $request->get_parms('action', 'from_id', 'to_id', 'actions', 'id'); diff --git a/www/xmlhttp/acceptcandidates.j.php b/www/xmlhttp/acceptcandidates.j.php index 6353c71a27..5ddb543fd4 100644 --- a/www/xmlhttp/acceptcandidates.j.php +++ b/www/xmlhttp/acceptcandidates.j.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $registry = registry::get_instance(); diff --git a/www/xmlhttp/checkcandidatetarget.j.php b/www/xmlhttp/checkcandidatetarget.j.php index 7b2406792c..8bb9d1c9c3 100644 --- a/www/xmlhttp/checkcandidatetarget.j.php +++ b/www/xmlhttp/checkcandidatetarget.j.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $registry = registry::get_instance(); diff --git a/www/xmlhttp/deletecandidates.j.php b/www/xmlhttp/deletecandidates.j.php index aec0cd1a3b..42065c4e4e 100644 --- a/www/xmlhttp/deletecandidates.j.php +++ b/www/xmlhttp/deletecandidates.j.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $registry = registry::get_instance(); $request = http_request::getInstance(); diff --git a/www/xmlhttp/editing_presets.j.php b/www/xmlhttp/editing_presets.j.php index d8be3d741c..fa302fb6c1 100644 --- a/www/xmlhttp/editing_presets.j.php +++ b/www/xmlhttp/editing_presets.j.php @@ -14,7 +14,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/xmlhttp/getsy_prod.x.php b/www/xmlhttp/getsy_prod.x.php index a7f9418435..a5150ceab6 100644 --- a/www/xmlhttp/getsy_prod.x.php +++ b/www/xmlhttp/getsy_prod.x.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $registry = registry::get_instance(); $request = http_request::getInstance(); diff --git a/www/xmlhttp/getterm_prod.h.php b/www/xmlhttp/getterm_prod.h.php index 8ed668a4c7..3de36ff492 100644 --- a/www/xmlhttp/getterm_prod.h.php +++ b/www/xmlhttp/getterm_prod.h.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $registry = registry::get_instance(); $request = http_request::getInstance(); diff --git a/www/xmlhttp/getterm_prod.x.php b/www/xmlhttp/getterm_prod.x.php index 77ce661f71..a92f4764dd 100644 --- a/www/xmlhttp/getterm_prod.x.php +++ b/www/xmlhttp/getterm_prod.x.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $request = http_request::getInstance(); $parm = $request->get_parms( "bid" diff --git a/www/xmlhttp/openbranch_prod.j.php b/www/xmlhttp/openbranch_prod.j.php index a7ccf7c12e..587b06d066 100644 --- a/www/xmlhttp/openbranch_prod.j.php +++ b/www/xmlhttp/openbranch_prod.j.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); diff --git a/www/xmlhttp/openbranches_prod.h.php b/www/xmlhttp/openbranches_prod.h.php index 5c91109a18..642224d104 100644 --- a/www/xmlhttp/openbranches_prod.h.php +++ b/www/xmlhttp/openbranches_prod.h.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $registry = registry::get_instance(); diff --git a/www/xmlhttp/openbranches_prod.x.php b/www/xmlhttp/openbranches_prod.x.php index ee6130178f..9664ddb6fe 100644 --- a/www/xmlhttp/openbranches_prod.x.php +++ b/www/xmlhttp/openbranches_prod.x.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $registry = registry::get_instance(); diff --git a/www/xmlhttp/replacecandidate.j.php b/www/xmlhttp/replacecandidate.j.php index 95bd8fdb68..52952e2162 100644 --- a/www/xmlhttp/replacecandidate.j.php +++ b/www/xmlhttp/replacecandidate.j.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $registry = registry::get_instance(); $request = http_request::getInstance(); diff --git a/www/xmlhttp/search_th_term_prod.j.php b/www/xmlhttp/search_th_term_prod.j.php index 4524ef9aea..870d7a2287 100644 --- a/www/xmlhttp/search_th_term_prod.j.php +++ b/www/xmlhttp/search_th_term_prod.j.php @@ -15,7 +15,7 @@ * @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @link www.phraseanet.com */ -require_once dirname(__FILE__) . "/../../lib/bootstrap.php"; +require_once __DIR__ . "/../../lib/bootstrap.php"; $appbox = appbox::get_instance(); $session = $appbox->get_session(); $registry = $appbox->get_registry();
    + {% trans 'admin::compte-utilisateur id utilisateur' %} + + {{ parm.ord == 'asc' ? '▼' : '▲' }} + + + + {% trans 'admin::compte-utilisateur identifiant' %} + + + {{ parm.ord == 'asc' ? '▼' : '▲' }} + + + + {% trans 'admin::compte-utilisateur nom/prenom' %} + + + {{ parm.ord == 'asc' ? '▼' : '▲' }} + + + + {% trans 'admin::compte-utilisateur societe' %} + + + {{ parm.ord == 'asc' ? '▼' : '▲' }} + + + + {% trans 'admin::compte-utilisateur email' %} + + + {{ parm.ord == 'asc' ? '▼' : '▲' }} + + + + {% trans 'admin::compte-utilisateur pays' %} + + + {{ parm.ord == 'asc' ? '▼' : '▲' }} + + + + {% trans 'admin::compte-utilisateur dernier modele applique' %} + + + {{ parm.ord == 'asc' ? '▼' : '▲' }} + + + + {% trans 'admin::compte-utilisateur date de creation' %} + + + {{ parm.ord == 'asc' ? '▼' : '▲' }} + +