From ac05fe9c3b7743e5c6ad3effbff82891c478c40c Mon Sep 17 00:00:00 2001 From: Chad Little Date: Wed, 21 May 2014 10:18:43 -0700 Subject: [PATCH] Replace action sprite with FontAwesome Summary: Replaces the action icons in action headers with FontAwesome Test Plan: - grep SPRITE_ACTIONS - grep sprite-actions - Replace on UIExamples - Replace on Workboards - Replace on Dashboards - Replace on FeedStories {F157840} {F157841} Reviewers: btrahan, epriestley Reviewed By: epriestley Subscribers: epriestley, Korvin Differential Revision: https://secure.phabricator.com/D9230 --- resources/celerity/map.php | 22 +- resources/sprite/manifest/actions.json | 206 ------------------ scripts/celerity/generate_sprites.php | 1 - .../ConpherenceWidgetController.php | 3 +- ...abricatorDashboardPanelRenderingEngine.php | 6 +- .../PhabricatorProjectBoardViewController.php | 3 +- .../examples/PHUIFeedStoryExample.php | 9 +- .../uiexample/examples/PHUIIconExample.php | 24 -- .../PhabricatorActionHeaderExample.php | 21 +- .../celerity/CeleritySpriteGenerator.php | 61 +----- .../layout/PhabricatorActionHeaderView.php | 52 +++-- src/view/phui/PHUIIconView.php | 2 - src/view/phui/PHUIWorkpanelView.php | 3 +- webroot/rsrc/css/font/phui-font-icon-base.css | 11 + .../layout/phabricator-action-header-view.css | 9 +- webroot/rsrc/css/phui/phui-feed-story.css | 3 + webroot/rsrc/css/phui/phui-icon.css | 9 +- webroot/rsrc/css/sprite-actions.css | 175 --------------- webroot/rsrc/image/sprite-actions-X2.png | Bin 18729 -> 0 bytes webroot/rsrc/image/sprite-actions.png | Bin 9036 -> 0 bytes 20 files changed, 86 insertions(+), 534 deletions(-) delete mode 100644 resources/sprite/manifest/actions.json delete mode 100644 webroot/rsrc/css/sprite-actions.css delete mode 100644 webroot/rsrc/image/sprite-actions-X2.png delete mode 100644 webroot/rsrc/image/sprite-actions.png diff --git a/resources/celerity/map.php b/resources/celerity/map.php index e630b74c33..c4d2e07819 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -7,7 +7,7 @@ return array( 'names' => array( - 'core.pkg.css' => '865102d6', + 'core.pkg.css' => '3445a3a7', 'core.pkg.js' => 'ab0d6d3d', 'darkconsole.pkg.js' => 'ca8671ce', 'differential.pkg.css' => '382ca868', @@ -113,8 +113,8 @@ return array( 'rsrc/css/diviner/diviner-shared.css' => '38813222', 'rsrc/css/font/font-awesome.css' => '73d075c3', 'rsrc/css/font/font-source-sans-pro.css' => '91d53463', - 'rsrc/css/font/phui-font-icon-base.css' => '74cfb6a9', - 'rsrc/css/layout/phabricator-action-header-view.css' => '0c333cad', + 'rsrc/css/font/phui-font-icon-base.css' => '3b2f9260', + 'rsrc/css/layout/phabricator-action-header-view.css' => '40134802', 'rsrc/css/layout/phabricator-action-list-view.css' => 'dcd9875f', 'rsrc/css/layout/phabricator-crumbs-view.css' => '6a23399c', 'rsrc/css/layout/phabricator-filetree-view.css' => 'a8c86ace', @@ -128,12 +128,12 @@ return array( 'rsrc/css/phui/phui-box.css' => '7b3a2eed', 'rsrc/css/phui/phui-button.css' => '3dbdbf0d', 'rsrc/css/phui/phui-document.css' => '3b078dc0', - 'rsrc/css/phui/phui-feed-story.css' => '3a59c2cf', + 'rsrc/css/phui/phui-feed-story.css' => '37216a85', 'rsrc/css/phui/phui-fontkit.css' => 'de84aa4a', 'rsrc/css/phui/phui-form-view.css' => '867463b4', 'rsrc/css/phui/phui-form.css' => 'b78ec020', 'rsrc/css/phui/phui-header-view.css' => '689dbc38', - 'rsrc/css/phui/phui-icon.css' => 'ef701b9b', + 'rsrc/css/phui/phui-icon.css' => 'cdcf2aca', 'rsrc/css/phui/phui-info-panel.css' => '27ea50a1', 'rsrc/css/phui/phui-list.css' => 'ce29d035', 'rsrc/css/phui/phui-object-box.css' => 'ce92d8ec', @@ -148,7 +148,6 @@ return array( 'rsrc/css/phui/phui-timeline-view.css' => '15ff2a9f', 'rsrc/css/phui/phui-workboard-view.css' => '2bf82d00', 'rsrc/css/phui/phui-workpanel-view.css' => 'fddd97bf', - 'rsrc/css/sprite-actions.css' => '969ad0e5', 'rsrc/css/sprite-apps-large.css' => '76d8716b', 'rsrc/css/sprite-apps-xlarge.css' => 'db66c878', 'rsrc/css/sprite-apps.css' => '600df7dd', @@ -308,8 +307,6 @@ return array( 'rsrc/image/phrequent_inactive.png' => 'bfc15a69', 'rsrc/image/search-white.png' => '64cc0d45', 'rsrc/image/search.png' => '82625a7e', - 'rsrc/image/sprite-actions-X2.png' => '7dfd5652', - 'rsrc/image/sprite-actions.png' => '2ddd18c3', 'rsrc/image/sprite-apps-X2.png' => '55b68035', 'rsrc/image/sprite-apps-large-X2.png' => 'becb43e7', 'rsrc/image/sprite-apps-large.png' => '6c673dd5', @@ -691,7 +688,7 @@ return array( 'paste-css' => 'aa1767d1', 'path-typeahead' => 'f7fc67ec', 'people-profile-css' => 'ba7b2762', - 'phabricator-action-header-view-css' => '0c333cad', + 'phabricator-action-header-view-css' => '40134802', 'phabricator-action-list-view-css' => 'dcd9875f', 'phabricator-application-launch-view-css' => 'd290ba21', 'phabricator-busy' => '6453c869', @@ -761,13 +758,13 @@ return array( 'phui-calendar-list-css' => 'c1d0ca59', 'phui-calendar-month-css' => 'a92e47d2', 'phui-document-view-css' => '3b078dc0', - 'phui-feed-story-css' => '3a59c2cf', - 'phui-font-icon-base-css' => '74cfb6a9', + 'phui-feed-story-css' => '37216a85', + 'phui-font-icon-base-css' => '3b2f9260', 'phui-fontkit-css' => 'de84aa4a', 'phui-form-css' => 'b78ec020', 'phui-form-view-css' => '867463b4', 'phui-header-view-css' => '689dbc38', - 'phui-icon-view-css' => 'ef701b9b', + 'phui-icon-view-css' => 'cdcf2aca', 'phui-info-panel-css' => '27ea50a1', 'phui-list-view-css' => 'ce29d035', 'phui-object-box-css' => 'ce92d8ec', @@ -800,7 +797,6 @@ return array( 'releeph-request-differential-create-dialog' => '8d8b92cd', 'releeph-request-typeahead-css' => '667a48ae', 'setup-issue-css' => '69e640e7', - 'sprite-actions-css' => '969ad0e5', 'sprite-apps-css' => '600df7dd', 'sprite-apps-large-css' => '76d8716b', 'sprite-apps-xlarge-css' => 'db66c878', diff --git a/resources/sprite/manifest/actions.json b/resources/sprite/manifest/actions.json deleted file mode 100644 index 400891105e..0000000000 --- a/resources/sprite/manifest/actions.json +++ /dev/null @@ -1,206 +0,0 @@ -{ - "version" : 1, - "sprites" : { - "actions-close-dark" : { - "name" : "actions-close-dark", - "rule" : ".actions-close-dark, .device-desktop .actions-close-grey.phui-icon-view:hover", - "hash" : "dc370e5777e6ac4ca06bc72adffea903" - }, - "actions-close-grey" : { - "name" : "actions-close-grey", - "rule" : ".actions-close-grey", - "hash" : "557249561ccfd1c44ce8b5ff52938195" - }, - "actions-close-white" : { - "name" : "actions-close-white", - "rule" : ".actions-close-white", - "hash" : "07ee0398d250301db4773a43a31ef2fa" - }, - "actions-down-dark" : { - "name" : "actions-down-dark", - "rule" : ".actions-down-dark, .device-desktop .actions-down-grey.phui-icon-view:hover", - "hash" : "56e0299b481c8cbd1104d4d06a9ad60f" - }, - "actions-down-grey" : { - "name" : "actions-down-grey", - "rule" : ".actions-down-grey", - "hash" : "62021593f80189ead4c16dbb6496eff9" - }, - "actions-down-white" : { - "name" : "actions-down-white", - "rule" : ".actions-down-white", - "hash" : "fbf8553693281e156a864cc10c90811c" - }, - "actions-flag-dark" : { - "name" : "actions-flag-dark", - "rule" : ".actions-flag-dark, .device-desktop .actions-flag-grey.phui-icon-view:hover", - "hash" : "c6d1f2054109fa35c61791ba6c8b3b4e" - }, - "actions-flag-grey" : { - "name" : "actions-flag-grey", - "rule" : ".actions-flag-grey", - "hash" : "f283ebb54b50a4dd4df6c968c327b1ae" - }, - "actions-flag-white" : { - "name" : "actions-flag-white", - "rule" : ".actions-flag-white", - "hash" : "e4ac2df6b75607b4a41a7be3a232340d" - }, - "actions-heart-dark" : { - "name" : "actions-heart-dark", - "rule" : ".actions-heart-dark, .device-desktop .actions-heart-grey.phui-icon-view:hover", - "hash" : "51063df4f5317c40fd3bbe55683c2eb8" - }, - "actions-heart-grey" : { - "name" : "actions-heart-grey", - "rule" : ".actions-heart-grey", - "hash" : "dc21c4569280ee297f556cc08a366f9a" - }, - "actions-heart-white" : { - "name" : "actions-heart-white", - "rule" : ".actions-heart-white", - "hash" : "5652d7ad050e93ef3795e8f3d535b0af" - }, - "actions-move-dark" : { - "name" : "actions-move-dark", - "rule" : ".actions-move-dark, .device-desktop .actions-move-grey.phui-icon-view:hover", - "hash" : "849975a0f7d870b2098b5df97a262e32" - }, - "actions-move-grey" : { - "name" : "actions-move-grey", - "rule" : ".actions-move-grey", - "hash" : "9f880792fcd0728a263685cf83c4c4ef" - }, - "actions-move-white" : { - "name" : "actions-move-white", - "rule" : ".actions-move-white", - "hash" : "0baa80bc68e08ee62a2ea00939d701dd" - }, - "actions-new-dark" : { - "name" : "actions-new-dark", - "rule" : ".actions-new-dark, .device-desktop .actions-new-grey.phui-icon-view:hover", - "hash" : "75f7db365f28cac6e8e4bef6582db4d5" - }, - "actions-new-grey" : { - "name" : "actions-new-grey", - "rule" : ".actions-new-grey", - "hash" : "edd7f1d803dc7c4991e484315e1690cd" - }, - "actions-new-white" : { - "name" : "actions-new-white", - "rule" : ".actions-new-white", - "hash" : "dded791b1ec55c32710845a1338bd31d" - }, - "actions-search-dark" : { - "name" : "actions-search-dark", - "rule" : ".actions-search-dark, .device-desktop .actions-search-grey.phui-icon-view:hover", - "hash" : "90e71b95196672296a329a9d2ba54b6f" - }, - "actions-search-grey" : { - "name" : "actions-search-grey", - "rule" : ".actions-search-grey", - "hash" : "041d1033d4500972791cc7cf752ed250" - }, - "actions-search-white" : { - "name" : "actions-search-white", - "rule" : ".actions-search-white", - "hash" : "8bfe4fb8c44c302c676d8b42740dfbe4" - }, - "actions-settings-dark" : { - "name" : "actions-settings-dark", - "rule" : ".actions-settings-dark, .device-desktop .actions-settings-grey.phui-icon-view:hover", - "hash" : "45a4a5f926b84dadffe036cb7cbda166" - }, - "actions-settings-grey" : { - "name" : "actions-settings-grey", - "rule" : ".actions-settings-grey", - "hash" : "73db9b654d8287d8e15be5bef8d72d89" - }, - "actions-settings-white" : { - "name" : "actions-settings-white", - "rule" : ".actions-settings-white", - "hash" : "ade04349a27cf2c223e8f4e7fea52cf1" - }, - "actions-star-dark" : { - "name" : "actions-star-dark", - "rule" : ".actions-star-dark, .device-desktop .actions-star-grey.phui-icon-view:hover", - "hash" : "ca65f112d09fed7854bb013de6e78323" - }, - "actions-star-grey" : { - "name" : "actions-star-grey", - "rule" : ".actions-star-grey", - "hash" : "23894980dd42da92451c355c844250c6" - }, - "actions-star-white" : { - "name" : "actions-star-white", - "rule" : ".actions-star-white", - "hash" : "fd709f3e1bebb17364bbfac7c0b8aaa5" - }, - "actions-tag-dark" : { - "name" : "actions-tag-dark", - "rule" : ".actions-tag-dark, .device-desktop .actions-tag-grey.phui-icon-view:hover", - "hash" : "7ca0e9df25c74a09e5111a8ce578c7fe" - }, - "actions-tag-grey" : { - "name" : "actions-tag-grey", - "rule" : ".actions-tag-grey", - "hash" : "02d0bb07ce65a12a8e653c7cced7e72d" - }, - "actions-tag-white" : { - "name" : "actions-tag-white", - "rule" : ".actions-tag-white", - "hash" : "dac6bff0b839a3430fda3de4a5c44bfd" - }, - "actions-token-dark" : { - "name" : "actions-token-dark", - "rule" : ".actions-token-dark, .device-desktop .actions-token-grey.phui-icon-view:hover", - "hash" : "4c289b5175df8375fc286127f47ddad9" - }, - "actions-token-grey" : { - "name" : "actions-token-grey", - "rule" : ".actions-token-grey", - "hash" : "93a9c3b4786480fd44ba4f17610f3926" - }, - "actions-token-white" : { - "name" : "actions-token-white", - "rule" : ".actions-token-white", - "hash" : "075f3f28279e73b793b612a61f4b1a07" - }, - "actions-up-dark" : { - "name" : "actions-up-dark", - "rule" : ".actions-up-dark, .device-desktop .actions-up-grey.phui-icon-view:hover", - "hash" : "e7f3352316b07244babe7a3ebab82132" - }, - "actions-up-grey" : { - "name" : "actions-up-grey", - "rule" : ".actions-up-grey", - "hash" : "a52ff86b194bf68f220668ba60013c0c" - }, - "actions-up-white" : { - "name" : "actions-up-white", - "rule" : ".actions-up-white", - "hash" : "e42262ba18632de2d3dfdab8c83324e6" - }, - "actions-wrench-dark" : { - "name" : "actions-wrench-dark", - "rule" : ".actions-wrench-dark, .device-desktop .actions-wrench-grey.phui-icon-view:hover", - "hash" : "aac832965a14438c2c161cdf347dfed7" - }, - "actions-wrench-grey" : { - "name" : "actions-wrench-grey", - "rule" : ".actions-wrench-grey", - "hash" : "1b27d1fe1776af2808503c6d3e842855" - }, - "actions-wrench-white" : { - "name" : "actions-wrench-white", - "rule" : ".actions-wrench-white", - "hash" : "fbb09cf182d70c99c74c360ce87724a2" - } - }, - "scales" : [ - 1, - 2 - ], - "header" : "\/**\n * @provides sprite-actions-css\n * @generated\n *\/\n\n.sprite-actions {\n background-image: url(\/rsrc\/image\/sprite-actions.png);\n background-repeat: no-repeat;\n}\n\n@media\nonly screen and (min-device-pixel-ratio: 1.5),\nonly screen and (-webkit-min-device-pixel-ratio: 1.5) {\n .sprite-actions {\n background-image: url(\/rsrc\/image\/sprite-actions-X2.png);\n background-size: {X}px {Y}px;\n }\n}\n", - "type" : "standard" -} diff --git a/scripts/celerity/generate_sprites.php b/scripts/celerity/generate_sprites.php index 4d75c97bda..048520e82a 100755 --- a/scripts/celerity/generate_sprites.php +++ b/scripts/celerity/generate_sprites.php @@ -30,7 +30,6 @@ $sheets = array( 'remarkup' => $generator->buildRemarkupSheet(), 'menu' => $generator->buildMenuSheet(), 'apps' => $generator->buildAppsSheet(), - 'actions' => $generator->buildActionsSheet(), 'minicons' => $generator->buildMiniconsSheet(), 'conpherence' => $generator->buildConpherenceSheet(), 'apps-large' => $generator->buildAppsLargeSheet(), diff --git a/src/applications/conpherence/controller/ConpherenceWidgetController.php b/src/applications/conpherence/controller/ConpherenceWidgetController.php index 288cfc1d14..809b04a64a 100644 --- a/src/applications/conpherence/controller/ConpherenceWidgetController.php +++ b/src/applications/conpherence/controller/ConpherenceWidgetController.php @@ -66,8 +66,7 @@ final class ConpherenceWidgetController extends $widgets = array(); $new_icon = id(new PHUIIconView()) - ->setSpriteSheet(PHUIIconView::SPRITE_ACTIONS) - ->setSpriteIcon('new-grey') + ->setIconFont('fa-plus') ->setHref($this->getWidgetURI()) ->setMetadata(array('widget' => null)) ->addSigil('conpherence-widget-adder'); diff --git a/src/applications/dashboard/engine/PhabricatorDashboardPanelRenderingEngine.php b/src/applications/dashboard/engine/PhabricatorDashboardPanelRenderingEngine.php index a8dea8d9dd..f4534a99ea 100644 --- a/src/applications/dashboard/engine/PhabricatorDashboardPanelRenderingEngine.php +++ b/src/applications/dashboard/engine/PhabricatorDashboardPanelRenderingEngine.php @@ -229,8 +229,7 @@ final class PhabricatorDashboardPanelRenderingEngine extends Phobject { $edit_uri->setQueryParam('dashboardID', $dashboard_id); } $action_edit = id(new PHUIIconView()) - ->setSpriteSheet(PHUIIconView::SPRITE_ACTIONS) - ->setSpriteIcon('settings-grey') + ->setIconFont('fa-pencil') ->setHref((string) $edit_uri); $header->addAction($action_edit); @@ -239,8 +238,7 @@ final class PhabricatorDashboardPanelRenderingEngine extends Phobject { '/dashboard/removepanel/'.$dashboard_id.'/')) ->setQueryParam('panelPHID', $panel->getPHID()); $action_remove = id(new PHUIIconView()) - ->setSpriteSheet(PHUIIconView::SPRITE_ACTIONS) - ->setSpriteIcon('close-grey') + ->setIconFont('fa-trash-o') ->setHref((string) $uri) ->setWorkflow(true); $header->addAction($action_remove); diff --git a/src/applications/project/controller/PhabricatorProjectBoardViewController.php b/src/applications/project/controller/PhabricatorProjectBoardViewController.php index 3936e1565f..ea95cf4c77 100644 --- a/src/applications/project/controller/PhabricatorProjectBoardViewController.php +++ b/src/applications/project/controller/PhabricatorProjectBoardViewController.php @@ -165,8 +165,7 @@ final class PhabricatorProjectBoardViewController $panel->setEditURI('column/'.$column->getID().'/'); } $panel->setHeaderAction(id(new PHUIIconView()) - ->setSpriteSheet(PHUIIconView::SPRITE_ACTIONS) - ->setSpriteIcon('new-grey') + ->setIconFont('fa-plus') ->setHref('/maniphest/task/create/') ->addSigil('column-add-task') ->setMetadata( diff --git a/src/applications/uiexample/examples/PHUIFeedStoryExample.php b/src/applications/uiexample/examples/PHUIFeedStoryExample.php index 2a220c3f24..5176f4e30a 100644 --- a/src/applications/uiexample/examples/PHUIFeedStoryExample.php +++ b/src/applications/uiexample/examples/PHUIFeedStoryExample.php @@ -66,8 +66,7 @@ final class PHUIFeedStoryExample extends PhabricatorUIExample { $text = hsprintf('harding (Tom Harding) awarded '. 'M10: Workboards a token.'); $action1 = id(new PHUIIconView()) - ->setSpriteSheet(PHUIIconView::SPRITE_ACTIONS) - ->setSpriteIcon('token-grey') + ->setIconFont('fa-trophy bluegrey') ->setHref('#'); $token = id(new PHUIIconView()) @@ -87,12 +86,10 @@ final class PHUIFeedStoryExample extends PhabricatorUIExample { $text = hsprintf('wgharding (Warren Harding) '. 'asked a new question.'); $action1 = id(new PHUIIconView()) - ->setSpriteSheet(PHUIIconView::SPRITE_ACTIONS) - ->setSpriteIcon('up-grey') + ->setIconFont('fa-chevron-up bluegrey') ->setHref('#'); $action2 = id(new PHUIIconView()) - ->setSpriteSheet(PHUIIconView::SPRITE_ACTIONS) - ->setSpriteIcon('down-grey') + ->setIconFont('fa-chevron-down bluegrey') ->setHref('#'); $story4 = id(new PHUIFeedStoryView()) ->setTitle($text) diff --git a/src/applications/uiexample/examples/PHUIIconExample.php b/src/applications/uiexample/examples/PHUIIconExample.php index 8b645bc94a..105e9b2d73 100644 --- a/src/applications/uiexample/examples/PHUIIconExample.php +++ b/src/applications/uiexample/examples/PHUIIconExample.php @@ -578,21 +578,6 @@ final class PHUIIconExample extends PhabricatorUIExample { ->setSpriteSheet(PHUIIconView::SPRITE_PAYMENTS) ->setSpriteIcon('googlecheckout'); - $actions = array( - 'settings-grey', - 'heart-grey', - 'tag-grey', - 'new-grey', - 'search-grey', - 'move-grey'); - $actionview = array(); - foreach ($actions as $action) { - $actionview[] = id(new PHUIIconView()) - ->setSpriteSheet(PHUIIconView::SPRITE_ACTIONS) - ->setSpriteIcon($action) - ->setHref('#'); - } - $tokens = array( 'like-1', 'like-2', @@ -628,10 +613,6 @@ final class PHUIIconExample extends PhabricatorUIExample { ->appendChild($ficons) ->addMargin(PHUI::MARGIN_LARGE); - $layout1 = id(new PHUIBoxView()) - ->appendChild($actionview) - ->addMargin(PHUI::MARGIN_MEDIUM); - $layout2 = id(new PHUIBoxView()) ->appendChild(array($person1, $person2, $person3)) ->addMargin(PHUI::MARGIN_MEDIUM); @@ -668,10 +649,6 @@ final class PHUIIconExample extends PhabricatorUIExample { ->setHeaderText(pht('Colors and Transforms')) ->appendChild($layout_cicons); - $wrap1 = id(new PHUIObjectBoxView()) - ->setHeaderText(pht('Action Icons!')) - ->appendChild($layout1); - $wrap2 = id(new PHUIObjectBoxView()) ->setHeaderText(pht('People!')) ->appendChild(array($layout2, $layout2a)); @@ -696,7 +673,6 @@ final class PHUIIconExample extends PhabricatorUIExample { array( $fontawesome, $transforms, - $wrap1, $wrap2, $wrap3, $wrap4, diff --git a/src/applications/uiexample/examples/PhabricatorActionHeaderExample.php b/src/applications/uiexample/examples/PhabricatorActionHeaderExample.php index 35a6adeef4..42ae82dd3a 100644 --- a/src/applications/uiexample/examples/PhabricatorActionHeaderExample.php +++ b/src/applications/uiexample/examples/PhabricatorActionHeaderExample.php @@ -106,33 +106,27 @@ final class PhabricatorActionHeaderExample extends PhabricatorUIExample { ->setHeader(pht('With Action Icons')); $action1 = new PHUIIconView(); - $action1->setSpriteSheet(PHUIIconView::SPRITE_ACTIONS); - $action1->setSpriteIcon('settings-grey'); + $action1->setIconFont('fa-cog'); $action1->setHref('#'); $action2 = new PHUIIconView(); - $action2->setSpriteSheet(PHUIIconView::SPRITE_ACTIONS); - $action2->setSpriteIcon('heart-white'); + $action1->setIconFont('fa-heart'); $action2->setHref('#'); $action3 = new PHUIIconView(); - $action3->setSpriteSheet(PHUIIconView::SPRITE_ACTIONS); - $action3->setSpriteIcon('tag-white'); + $action1->setIconFont('fa-tag'); $action3->setHref('#'); $action4 = new PHUIIconView(); - $action4->setSpriteSheet(PHUIIconView::SPRITE_ACTIONS); - $action4->setSpriteIcon('new-white'); + $action4->setIconFont('fa-plus'); $action4->setHref('#'); $action5 = new PHUIIconView(); - $action5->setSpriteSheet(PHUIIconView::SPRITE_ACTIONS); - $action5->setSpriteIcon('search-white'); + $action5->setIconFont('fa-search'); $action5->setHref('#'); $action6 = new PHUIIconView(); - $action6->setSpriteSheet(PHUIIconView::SPRITE_ACTIONS); - $action6->setSpriteIcon('move-white'); + $action6->setIconFont('fa-arrows'); $action6->setHref('#'); $header1 = id(new PhabricatorActionHeaderView()) @@ -200,8 +194,7 @@ final class PhabricatorActionHeaderExample extends PhabricatorUIExample { ->setName('Closed'); $action1 = new PHUIIconView(); - $action1->setSpriteSheet(PHUIIconView::SPRITE_ACTIONS); - $action1->setSpriteIcon('flag-grey'); + $action1->setIconFont('fa-flag'); $action1->setHref('#'); $header1 = id(new PhabricatorActionHeaderView()) diff --git a/src/infrastructure/celerity/CeleritySpriteGenerator.php b/src/infrastructure/celerity/CeleritySpriteGenerator.php index 6e0c995413..24f875337d 100644 --- a/src/infrastructure/celerity/CeleritySpriteGenerator.php +++ b/src/infrastructure/celerity/CeleritySpriteGenerator.php @@ -46,66 +46,7 @@ final class CeleritySpriteGenerator { return $sheet; } - public function buildActionsSheet() { - $icons = $this->getDirectoryList('actions_white_1x'); - - $colors = array( - 'dark', - 'grey', - 'white', - ); - - $scales = array( - '1x' => 1, - '2x' => 2, - ); - - $template = id(new PhutilSprite()) - ->setSourceSize(24, 24); - - $sprites = array(); - foreach ($colors as $color) { - foreach ($icons as $icon) { - $prefix = 'actions_'; - if (strlen($color)) { - $prefix .= $color.'_'; - } - - $suffix = ''; - if (strlen($color)) { - $suffix = '-'.$color; - } - - $sprite = id(clone $template) - ->setName('actions-'.$icon.$suffix); - - $tcss = array(); - $tcss[] = '.actions-'.$icon.$suffix; - if ($color == 'dark') { - $tcss[] = '.device-desktop '. - '.actions-'.$icon.'-grey.phui-icon-view:hover'; - } - - $sprite->setTargetCSS(implode(', ', $tcss)); - - foreach ($scales as $scale_key => $scale) { - $path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png'); - $sprite->setSourceFile($path, $scale); - } - $sprites[] = $sprite; - } - } - - $sheet = $this->buildSheet('actions', true); - $sheet->setScales($scales); - foreach ($sprites as $sprite) { - $sheet->addSprite($sprite); - } - - return $sheet; - } - - public function buildMiniconsSheet() { + public function buildMiniconsSheet() { $icons = $this->getDirectoryList('minicons_white_1x'); $colors = array( diff --git a/src/view/layout/PhabricatorActionHeaderView.php b/src/view/layout/PhabricatorActionHeaderView.php index eda01d392e..0446019a6a 100644 --- a/src/view/layout/PhabricatorActionHeaderView.php +++ b/src/view/layout/PhabricatorActionHeaderView.php @@ -2,9 +2,6 @@ final class PhabricatorActionHeaderView extends AphrontView { - const ICON_GREY = 'grey'; - const ICON_WHITE = 'white'; - const HEADER_GREY = 'grey'; const HEADER_DARK_GREY = 'dark-grey'; const HEADER_BLUE = 'blue'; @@ -18,8 +15,8 @@ final class PhabricatorActionHeaderView extends AphrontView { private $headerIcon; private $headerSigils = array(); private $actions = array(); - private $iconColor = PhabricatorActionHeaderView::ICON_GREY; private $headerColor; + private $tag = null; private $dropdown; public function setDropdown($dropdown) { @@ -33,7 +30,7 @@ final class PhabricatorActionHeaderView extends AphrontView { } public function setTag(PHUITagView $tag) { - $this->actions[] = $tag; + $this->tag = $tag; return $this; } @@ -57,16 +54,30 @@ final class PhabricatorActionHeaderView extends AphrontView { return $this; } - public function setIconColor($color) { - $this->iconColor = $color; - return $this; - } - public function setHeaderColor($color) { $this->headerColor = $color; return $this; } + private function getIconColor() { + switch ($this->headerColor) { + case self::HEADER_GREY: + return 'lightgreytext'; + case self::HEADER_DARK_GREY: + return 'lightgreytext'; + case self::HEADER_BLUE: + return 'white'; + case self::HEADER_GREEN: + return 'white'; + case self::HEADER_RED: + return 'white'; + case self::HEADER_YELLOW: + return 'white'; + case self::HEADER_LIGHTBLUE: + return 'bluegrey'; + } + } + public function render() { require_celerity_resource('phabricator-action-header-view-css'); @@ -84,16 +95,28 @@ final class PhabricatorActionHeaderView extends AphrontView { } $action_list = array(); - foreach ($this->actions as $action) { + if (nonempty($this->actions)) { + foreach ($this->actions as $action) { + $action->addClass($this->getIconColor()); + $action_list[] = phutil_tag( + 'li', + array( + 'class' => 'phabricator-action-header-icon-item' + ), + $action); + } + } + + if ($this->tag) { $action_list[] = phutil_tag( 'li', array( 'class' => 'phabricator-action-header-icon-item' ), - $action); + $this->tag); } - $header_icon = ''; + $header_icon = null; if ($this->headerIcon) { require_celerity_resource('sprite-minicons-css'); $header_icon = phutil_tag( @@ -126,8 +149,7 @@ final class PhabricatorActionHeaderView extends AphrontView { $header_title)); $icons = ''; - if (!empty($action_list)) { - $classes[] = 'phabricator-action-header-icon-'.$this->iconColor; + if (nonempty($action_list)) { $icons = phutil_tag( 'ul', array( diff --git a/src/view/phui/PHUIIconView.php b/src/view/phui/PHUIIconView.php index bac9a363ed..a6d6cc95af 100644 --- a/src/view/phui/PHUIIconView.php +++ b/src/view/phui/PHUIIconView.php @@ -3,11 +3,9 @@ final class PHUIIconView extends AphrontTagView { const SPRITE_MINICONS = 'minicons'; - const SPRITE_ACTIONS = 'actions'; const SPRITE_APPS = 'apps'; const SPRITE_TOKENS = 'tokens'; const SPRITE_PAYMENTS = 'payments'; - const SPRITE_ICONS = 'icons'; const SPRITE_LOGIN = 'login'; const SPRITE_PROJECTS = 'projects'; const SPRITE_BUTTONBAR = 'buttonbar'; diff --git a/src/view/phui/PHUIWorkpanelView.php b/src/view/phui/PHUIWorkpanelView.php index 94c25ff85d..1bf4574f1b 100644 --- a/src/view/phui/PHUIWorkpanelView.php +++ b/src/view/phui/PHUIWorkpanelView.php @@ -62,8 +62,7 @@ final class PHUIWorkpanelView extends AphrontTagView { $header_edit = null; if ($this->editURI) { $header_edit = id(new PHUIIconView()) - ->setSpriteSheet(PHUIIconView::SPRITE_ACTIONS) - ->setSpriteIcon('settings-grey') + ->setIconFont('fa-pencil') ->setHref($this->editURI); } $header = id(new PhabricatorActionHeaderView()) diff --git a/webroot/rsrc/css/font/phui-font-icon-base.css b/webroot/rsrc/css/font/phui-font-icon-base.css index 7a763cb7fe..18cc68106a 100644 --- a/webroot/rsrc/css/font/phui-font-icon-base.css +++ b/webroot/rsrc/css/font/phui-font-icon-base.css @@ -144,3 +144,14 @@ .phui-icon-view.grey { color: {$lightgreytext}; } + +/* Hovers */ + +.device-desktop a.phui-icon-view.lightgreytext:hover, +.device-desktop a.phui-icon-view.grey:hover { + color: {$darkgreytext}; +} + +.device-desktop a.phui-icon-view.bluegrey:hover { + color: {$darkbluetext}; +} diff --git a/webroot/rsrc/css/layout/phabricator-action-header-view.css b/webroot/rsrc/css/layout/phabricator-action-header-view.css index fd702bfbc6..35d5a32e60 100644 --- a/webroot/rsrc/css/layout/phabricator-action-header-view.css +++ b/webroot/rsrc/css/layout/phabricator-action-header-view.css @@ -14,8 +14,8 @@ font-weight: bold; line-height: 15px; padding: 8px 0; - text-shadow: 0 1px 1px #fff; white-space: nowrap; + -webkit-font-smoothing: antialiased; } .gradient-lightblue-header .phabricator-action-header-title { @@ -29,11 +29,15 @@ .phabricator-action-header-icon-item { float: right; - padding-left: 2px; + padding-left: 4px; } .phabricator-action-header-icon-item .phui-icon-view { display: inline-block; + font-size: 18px; + margin: 4px 0; + height: 18px; + width: 18px; } .phabricator-action-header-icon-item .phui-tag-view { @@ -53,7 +57,6 @@ .gradient-blue-header .phabricator-action-header-link, .gradient-yellow-header .phabricator-action-header-link { color: #fff; - text-shadow: 0 -1px 1px rgba(0,0,0,.7); } .phabricator-action-header-icon-list .phui-tag-view { diff --git a/webroot/rsrc/css/phui/phui-feed-story.css b/webroot/rsrc/css/phui/phui-feed-story.css index 382d34a0e0..c67b0e384e 100644 --- a/webroot/rsrc/css/phui/phui-feed-story.css +++ b/webroot/rsrc/css/phui/phui-feed-story.css @@ -84,6 +84,9 @@ .phui-feed-story-action-item { float: right; padding-left: 2px; + height: 18px; + width: 18px; + font-size: 18px; } .phui-feed-story-action-list .phui-icon-view { diff --git a/webroot/rsrc/css/phui/phui-icon.css b/webroot/rsrc/css/phui/phui-icon.css index a18768ce6b..5acce01f87 100644 --- a/webroot/rsrc/css/phui/phui-icon.css +++ b/webroot/rsrc/css/phui/phui-icon.css @@ -12,11 +12,6 @@ width: 16px; } -.phui-icon-view.sprite-actions { - height: 24px; - width: 24px; -} - .phui-icon-view.sprite-apps, .phui-icon-view.sprite-buttonbar { height: 14px; @@ -54,3 +49,7 @@ .phui-icon-has-text:before { margin-right: 8px; } + +a.phui-icon-view:hover { + text-decoration: none; +} diff --git a/webroot/rsrc/css/sprite-actions.css b/webroot/rsrc/css/sprite-actions.css deleted file mode 100644 index 63cdba2760..0000000000 --- a/webroot/rsrc/css/sprite-actions.css +++ /dev/null @@ -1,175 +0,0 @@ -/** - * @provides sprite-actions-css - * @generated - */ - -.sprite-actions { - background-image: url(/rsrc/image/sprite-actions.png); - background-repeat: no-repeat; -} - -@media -only screen and (min-device-pixel-ratio: 1.5), -only screen and (-webkit-min-device-pixel-ratio: 1.5) { - .sprite-actions { - background-image: url(/rsrc/image/sprite-actions-X2.png); - background-size: 150px 175px; - } -} - - -.actions-close-dark, .device-desktop .actions-close-grey.phui-icon-view:hover { - background-position: 0px 0px; -} - -.actions-down-dark, .device-desktop .actions-down-grey.phui-icon-view:hover { - background-position: -25px 0px; -} - -.actions-flag-dark, .device-desktop .actions-flag-grey.phui-icon-view:hover { - background-position: -50px 0px; -} - -.actions-heart-dark, .device-desktop .actions-heart-grey.phui-icon-view:hover { - background-position: -75px 0px; -} - -.actions-move-dark, .device-desktop .actions-move-grey.phui-icon-view:hover { - background-position: -100px 0px; -} - -.actions-new-dark, .device-desktop .actions-new-grey.phui-icon-view:hover { - background-position: -125px 0px; -} - -.actions-search-dark, .device-desktop .actions-search-grey.phui-icon-view:hover { - background-position: 0px -25px; -} - -.actions-settings-dark, .device-desktop .actions-settings-grey.phui-icon-view:hover { - background-position: -25px -25px; -} - -.actions-star-dark, .device-desktop .actions-star-grey.phui-icon-view:hover { - background-position: -50px -25px; -} - -.actions-tag-dark, .device-desktop .actions-tag-grey.phui-icon-view:hover { - background-position: -75px -25px; -} - -.actions-token-dark, .device-desktop .actions-token-grey.phui-icon-view:hover { - background-position: -100px -25px; -} - -.actions-up-dark, .device-desktop .actions-up-grey.phui-icon-view:hover { - background-position: -125px -25px; -} - -.actions-wrench-dark, .device-desktop .actions-wrench-grey.phui-icon-view:hover { - background-position: 0px -50px; -} - -.actions-close-grey { - background-position: -25px -50px; -} - -.actions-down-grey { - background-position: -50px -50px; -} - -.actions-flag-grey { - background-position: -75px -50px; -} - -.actions-heart-grey { - background-position: -100px -50px; -} - -.actions-move-grey { - background-position: -125px -50px; -} - -.actions-new-grey { - background-position: 0px -75px; -} - -.actions-search-grey { - background-position: -25px -75px; -} - -.actions-settings-grey { - background-position: -50px -75px; -} - -.actions-star-grey { - background-position: -75px -75px; -} - -.actions-tag-grey { - background-position: -100px -75px; -} - -.actions-token-grey { - background-position: -125px -75px; -} - -.actions-up-grey { - background-position: 0px -100px; -} - -.actions-wrench-grey { - background-position: -25px -100px; -} - -.actions-close-white { - background-position: -50px -100px; -} - -.actions-down-white { - background-position: -75px -100px; -} - -.actions-flag-white { - background-position: -100px -100px; -} - -.actions-heart-white { - background-position: -125px -100px; -} - -.actions-move-white { - background-position: 0px -125px; -} - -.actions-new-white { - background-position: -25px -125px; -} - -.actions-search-white { - background-position: -50px -125px; -} - -.actions-settings-white { - background-position: -75px -125px; -} - -.actions-star-white { - background-position: -100px -125px; -} - -.actions-tag-white { - background-position: -125px -125px; -} - -.actions-token-white { - background-position: 0px -150px; -} - -.actions-up-white { - background-position: -25px -150px; -} - -.actions-wrench-white { - background-position: -50px -150px; -} diff --git a/webroot/rsrc/image/sprite-actions-X2.png b/webroot/rsrc/image/sprite-actions-X2.png deleted file mode 100644 index 502f1264827a3de195ae7db0267c613fc3d9f06f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18729 zcmaIdRa6{Nw5 zp~k3DqgO5Is#SA-t13!OMHUr_2nhlL0##m4N&^A{lI3$VLV)=^lA3$M4FMr{B`+oZ z&1>yE$NyW(;@U?oPs~t4Ud$h}Cy)V4ARGQT24)nU1Pu)dM$oR8pVx$+xCE6kMjY7O zii}#=;y{s#vG6fiA@XLAoq#Zv5!_2m$_@goS?ycb4%(>94(BaL{X<4A)+9EZ~+k z0c#UIre~#Qy38}bWm*k_?$rZSYw5q{O2ANY5Uc)EMzxw*h7p;?50;bKVHBF}!>um9 zmy;qkNRqQX+GY*qE#UXMIG}> z+eJ?>JNdM%6<#~$WF8e*+xfJrPTo2$0^&A}yfrP*(E#(Ibql$F7lst#(oj@?mrn78 zEc$&wW}s>7HGVxuWD)4cjFiASd zMy!3r69BQ!e0fe~%THtXkj~s;s966;h5E2*Cyl ztqCi0xUb`^;$%c9<##JEIiN@}P*E&*GedDs{O}~hO!C}90i(PVMT^N1m&sL&l0wNx z_N6cXSX*sX(1(2nKB4;z5t%fBxwT!ZB&>`4gG$(>`K_oCAg>1Y6Zh1s6$d(O^-^_8 ztxs@Pso7ZSToLVa!`fur=|)HB|# z@L6jCf$76ch%K2rwt*()J%%)gW@!Bw;cCkGqQrd&{Yn$P`&VI}ZwnKQ97=iQiCl_h zd~<=C{K1&9&Rl_Uy(};Xua>=3!FH+x$cM9f1$|7Wa1zR9cThe=Z6-XNCem5<2MkhF zP`d~rD1GTsJK9#N53YGOaM_fR)U2;OBwV|H-hV;HAeaYMDsqIRiI&o0dec5-_1TgJ zR1N?fFG*QJD3nRQ_2dJGdNi0R1>V`wK}K^v_2_$QvgO+SAi9G6$K=8}r)oI&F{O^m+fI%uF=&+&~HT=P65n=n^Sru~= z-mT-!5D0&|mR}>X8bCg z=Tv{6U4IB}RNS4tVqHf>?R9s@h|#N7=~15PSLTr<1Z@&^?BQ6b5f9Tk!Flb`0S(25)=TrZ{d^>sV%cwgX;^-Zkjg{4fq`GxcdfG(?4 zBtch<_a>WmeRW-qh^G=P;=ZKBzAB}CJ!LL&S}=te!Gt=isf7&`@opi51r0y4{+J_A zzeEQA+5PJ_g{3VC6h_=eLIbw>Zwe%6VIJy&AR9g8Sv< zBs5trkUQMMx6?m)Qx|sR57T$!{IA+;4oTYwC{QQEyyLHhgRJ@Bj|?{=9&%c_$7g(8$aEoBt*Lj-VUE} zuYpjH(bWR_dV?jRAUX^gD=|Xb-QBOGO=Ji$dvIKC$JSx7y@UULVR zJma{@YWF&vk;OByzoT7rEVw{_6WvKv+xC_TDB}4D)t!DpG!f~sC2WJvl4G}a5RN-EqQQ8R?z^#L_vbeu6ImQk zh+8TPxt%B&dQO=#Sv#e32_Oxz@vF3?QH9E?Z(h;UMyCX*GjRb>Gf#Nfw@LI|(TS?jr>Z0_+yvlEBwr1MDo!b>qU1Hiu1kJVnf5#{3MlGl*l^Kca2B zXX$grxgwHhoZriJxB0p;ma}$W^Mj;e@EJU8XMUQ~=kJ6sN;V#mim+}@6PVl$K~S;y zQN6|lJ;C|L>b3VVvLI~q{9W{)>+yYJn~O&S*h&V_AJ|sigaVh~w>Ba2mM#G219&^* zkbo%O5Kt`~9#9lB=G1Tlr16rZ03Q)>OdGPaWj}3#N%;lUM(8LAJ(V0ecUf=&_=etn z91`0{AKY{Nl1Ewfb*Jz2{M19d=Kitx%4uU3CI$hCA(S&m7MaDg(^L}u_OX25o28G> zUkTqI^GbPJqiS%{BLIMjd3RJoh3lz;z*m+O6|{UNogPcq*s!Yj1EO)Ci4O6~QFb9e z{9`vZ0vZOst(#!ZN5ojG`VHCaQY+QV+aUDLT3@!hA>v|sD>FL3Fd<9< z=|e+WX$UJDjl%NzLSe+f$Nq5&`aHFtaWnVa2?PlQ1p!dQ%Pf!a72bPO z(8+$SX9qc0ks@hoF`-`$SyN7#~xU7BT8x5VaEr2 z$4qyb?6<utD5Y$nmJe{0|0Z!ZEbkYs@i|$neZ=*XOdKR(dHRS` z^izcN&>3!~wA$bXFl~A%1ytDJY8FOCmJW-=V}w$wQ8fCQ<@Re{MPb5KmGH;gLDcN> zr^Qp~%?kx%1Tkb^gn#$cqPbi+gUgAzjXlK3DP~hg=!-pM+?e)Oaq+GfkXqMam8G4D z6S9{?(Wpb!>f$d)Z2uiEc9JuSTj>m@lx2A3@K07f!bXtzZ3NS%CWI)eHAo@<)8 z+P>UGF!@9BvFbMzY56p2cpwjoB_zImM|qSg#Rv%u2&G0&iu>)#*l5t+V_ zTe>yh&-r1W86?bco)xCFKi zDIn%sr9KcV(dQwOQ58)+cW(6e8`chhB8X>OP?vcEr54Hil2@qkjXV7$Qq-A8Ccopr zXLf45+aOH#{W58xC(lkpgh}UQ3Taa%BR%H$a2!Hd&c#SezxaGJ| zhIN%eaKFYg8x`Cz`oAI|2#M^ai0znDs6+;_6U_?2OY#5;u6Q8Em-!YBxujHEGB!;U z%@G}K;7ZE`sW5^jn4t*H_o3FT1~e!-R}p|&{cQbv+eiz=G6k`aOo?5^ZGr^zB~`Q0 ztR_)uBxSLM-(5%%7N_^Q2+-~T9}es|?+*p+#De5PG+Y&u7-0+x?iEGXUWyX%MHumg z_V3g8wY+&z7X0KqFW*dfu_$|%q3>l+LLwk*BPjMhf zFxJSp64G8);`@l@{ivddeuBos73(Z+r%+LLpZW7Dk{UBfXJ(?$8C(bX(0JSMsB9WJ zEHtsjt#yQ*IZZ3l&+mNH_?QuE_F|{O%AU|6O6)2{jpf9SCYOUGP>2}>Sh`L6&1?!M zEeG>8BI4^{A=hlanA_C@TmazdaB?ZjeCn{XlWG3CWik|}JJGB(mp)!pPh(=nC}Drr zUrN&eN>GAwgsW9ukR<=LZOmDUnne8T1G-^=SEC&gwWOu3*bk;y7l{aVnBS#vptG$8 zf{wo2%XkTHs%rzj^>7Z7QGCcr8DXAv)kpWho(f z8+}6K zmKHK=0!>0jPo=?_Q52O<*?W&th6v+W(o`_23(77QkV~RW8F>ByfjG<{DCL8TZ$0z> z{Lt%m;ldEjTaA$sS$8rsD#Ki=M&kxjl8%%1zr{m#o1`smtDR%U z9#s|q)y1cyyP0GRt=m3JB6$mC+yS+$CeO@#d^lrQzva2f<5FG7kXCi|l~^m2q+*Bx zWY|UqwHLJqaSfP=0{6~xe?iT{bAz5n;|>|bY=oJ#KtiY*l{$p+Z#EG9Jhd;y;oj6J z$4+p=zKNr{rfLb@*YA8PNj%lM`hLkjouyA1g)+Zz0}}W}u(NXCWj?!)X#L3s2VS^u zBxycN=`b<3?@^aA_`u~5GAHhYw6cXBozkEy9(Kevhu=CV8>p05JU8Y~C+DWI;Uu-r z26#c^PH|}lzYLOpUP&@TaZz#uRN*Qj`X-&G$q*t)POnB}4J2TZQSdfYA7pKkS>H<^5ehE+@qhHuo2ddtk?Nz3-HzndVsUb;C%S@GOr+ z)^iO-KuL>OM=n1xbq+9RI7p8;gp1wPAPefFk~mROR>cV_+kwBVVC48pTHRqCtZD}l z?%(Jd+TXLB%%c~nZ_Iyk>uejQcr3{`Unhw!ApTY*UhkX3ioy>yf-Z)!5Po(ZgW7(>FwS9K8~!rR@Gx)CfDbIvW@r`&!z>dL2olQN{Cth2BU2K^8IxdjtLDjx{_pWGb$-Q^cySLH z&V*A>g}9Iiz)s&*y0YI9eIMnTmvxVaOeAMWEL0W&(SP6sr|-~f90w%GfZjt-)Ui!E zLMZR)M76}gwlDa|~)t0_~p($LwR{33F=c-Fp?xT%X_$}_=vd6^n=cL1YHR2&s0wM(1 zE>r30t3_{m>AK|%mi>jrNyHR?CY5bW(;DYD;W@BmxJFM%o>1oOk$3zd*CnnuntIL~FNl=D>24qX zLY}1Dry+=+6fN}4rp6(X@cz+R8abl*6t%LfZjJ>QDbixG@t5$v zmU=h*KC~FcbX1D^vpUI#8V*2@6`gnuhcXpLG=&f(W3d;>J3_A#3>6IK33dVGtAdFe zsLIqjR=XD!E{_>Jqk=91$6IjhX5Y7c7k%w%-xnc9&+A{+#Rt9PjP)FN(*HTDph4U{ z>+0{u``k%M6a0e4ZloftCHfnZx*#1|_i*y15T}GeD%i>vH=I4xG~UYGnC8F>O<32j z=Yt`{5~-R(W-&aNk5U$=d+}^gf}1ISPS^|`muVq@c`yJ$;J_;xTU*MsLQW`7b&|wJ z^03T{2otJ}q^baS)Qm#`zv^Sy*Ii1=c~GL53ODPbDR%&==;#Brw(y*Yuk5#BkY((W zed!At(w0o6_^)bW9I5S`XOVm7!7*99VARJhc#cDQrk)3TF$6!0W*O$6n?z+bJ{;3K zwefNi4eGA_;@@s2OC0D;j*DnVVkRC)Ny1y&wtp9>5+UyV#Q>=J;ry=e#6!UUMmiL1 z)@LV!UJZt4@Z8IqEbaAa@DA;PE8e~vrvA*zAu3u$NANJ;5~CbqFV@4Ah!;>ifTi$) zWWQ6gR~$KYPw$gHs5Ba(cET3HVbLVBnWM|x3L;TNO)?lk}-`i_6&UZoMxEs+>RTh_2T^#?C?g|3OyfP~FwV$&Rn2Mo9Onk#~=> zBPwUZ%>L7yQp{{7=G%^EgU|N>^qTFLoI`&wPwV||j@3JA!(Naf=QR7L>*~OL+^8mb zx11arqV}OIp&K4H6_}GxEtx`q8K)Ix#m0pXRoK+ct6Z=i-ea7)v3A0zM0FZ=edr)HDmuRSk+Z zg`q#7bE9h_V!Y)GH=?$w;77PX_^(gGZ8c9NGQk+lM%E_oXi!I?9aBf6RdB|rMH`IJ z?>|`#3SpQHC`4FY0VA@m2e}hDnKmiU>M<#T^*6iVMgbvO)#JB#r>mJUo4<~#ZM8n! z-906?G*+Qu(tg>8_tkl^`L-HgkPO=*R7`yy21)8wE#xuC@ETn-(u2kl z6Huz`4AV@If8%us)p`*Ut|Ul;hs4hYJUT=Ftf4NCw{(S`uSA4^hbYfv;f#iFqlehg z5dZ~uoLd0QKjqQiDbzzWq77c%oZAo^)22U;OlruqCA+k9$8vj_WC>MF$&CiqE~KPi zn@j3x>!mq^o|$YE%;DnqxN+19Nfa2Ii6TI_%(tHb|DnSWWk?U1G@J&}FNObbZOZjgQ@&o-y9y3_wJPASGjkY-tXa zeM1siwtFhlEJ8X1IcHVbAo;2VAa2nLjrK_k9tA1lg$LRaO9*>|8#}a-4De}B9xi}2 z_PmxWZb`kEk|XMGTQT=7V9}JNg)oo#}Q z9N_hul|@cWgg0?*=-B>}gqk$-vg+c@tpoVUNwjeD^rS0Mc+|A6ko|$^CUtc+?^Gtj zrIS*oNUUu}=_{(b(sjZ6I~hbVz|;b`kP`bkh2OfX`GM6=VD(f2;Vu|~in~vfrd#+Q zlScAF4})Fe42&y1+QdJBm{#ha9u9V>r`J zV=<`xAPEuN9v)c^g|9@2_GvD8EdGS)clm@(ACMnrKb6PR5eZxx(n$TG8JCu3Y{N1W zKT5D%xeUkDi2+hd#^W2aI$YS6|IlwZ4SUEX$11Z`^G%_#yfZ{1k<{C6sIq5i<;vPf&$~gu zjO8nxjPqq{M4A*Im2}K(Xg0};_J?`9$$8o9%I}rx7nF=HCGk9%Hn$ya1dYCi( zdzU%Lhy86PiooV!pkIf5$?438V?w{A&EjDer!CfS!t%+%TK3SFM<+@xb?1)L=&i8| z4HOLOKll>CV{^g(^o$uJ!iwztl}gpAFC0M&`qEH$V9744Qr$2mHXA4W1YJ*4dL)9c za>yX;(+d0sk0h#h&H+mUShi2oeg#P4BIDCgsA9+Ao@buY`^Cu^NYSQjuvDjOr!@R+ zN@0*?{$y>05KCBQ$f;r$vRjEewq!u+ZvE&7Yp-KxFJyIJRRSS*G#0seqNGTK0WvOf z#$j|Hue~I$UXX`hnAsv+S{j~Nz`3QZ9b>^@ZI_a;6*bZlf(g%k*xDw)r7PyMVE&_E za?DH_i1>?vZojK1G)>^Q9_teI6fg9^Z<16j04tOAa3;__P~4~GNK!^L5#8mN^xi*A znDKi6D`A#~HBlueH>A9joGtIH9iw_=OOnP2QMF4?Gb77qyO3Vj!d*6geRq}JF`zV1 z3mlE!RSQ=X6V4hurats0hpaL%u38U~NbXuh7yDV-%N)SIYKLovu0fmz+7L&&B!5w4 zC1@ADAIQ?TkwIgjqB>~W$F^1V^<%R(EvV};Kn1b|9GS@61nRA3M zBYEPMY|i==l@(VDd3v^DF>A$y+4HukzF$PhfmoR^#PR6K2Muu$TxCcW1VV#4J>Pk+}LN;j3i@BH~`OGwBv+tmn^WKGW%TTA;WrG9E1xqDIHV zG*}{q$VD>4HdqmM1Yp~j)cJ}dsU@HnxjxO%sQaThV*K&Pd2m56xQ|q(yIKM%^)uMbK$$i61DIpLqTl5J=oX zyd_3(c#INu%XG9tF+%3&=-E?-dR;IW_urJB1+8#SKUL5XL#%BpI>#4+6gT@mncu{> z&IOPHS4!Ycd+$X4xa*=q5x*ME!;;{p9i$gU*ySDVhn-$0J<1QoQh1#kv53R$>-krH zDH^d(dbM+R@7}~9NocEk)?Tj)ip>8Z5qark4%&Ga?#F-;ee6dUM`+S@<@5UP*_q(_ zS^E1dK4j0o)P3lGjkg2Qk$;VhXqj9tLosLx4MCyL@4OG4l56pNnBi)nyUJOID1#Q< z1v!&OP%!zVIvnypJOvBkcwW)1g-}f5(vL_l%w*KqP^p(f|KDr+|2Mq<*K+?GZIi^` z&iukN&6tww4Ccz8+;LrSl^xi)<5(+)*`_rpl()h0GpfB-qpsB_gk_Isi~e>XIOf_f z`Zv8|P2Za9ZK3Dt-~}>=MMCY*2Jwn_1VXa?Bp7vCJM+^5**Rj&KY^UU*f;Sj6_A#E zGyLr{Y_c%J-U}fQ%^myWJ;b~cN6lZ7%&&q78=aUC;)VU?Zm{gef4p9@4pFI3?~K$J z(0b$01-c7X6Ag037WaNgfY6)vF5aiX$+T~Uuj}f+aKLuQ>o#ZLbTjEhDN73BR#p+I z(K7@Q5?>pTV1v@Ui_NgL@e#C)kD-sDo1yJ2W_+r-@sYmm@OB47g@HR9kDBGP|NYtO zT4V83=!^*5w|fnx<1W9gNn|8fj8?BdM*xVosC6 z#vB@Pl;Vx2l%!}}8a^8ksfxpdVxip{S#CxBJpb@jfxdoG>fdWTl_DI}&BOo=tx&3L z+m=4N&<5qS_Rh8J>f_23FLF_cP4EEkAO-Ha8qbef9&!Bf#00)NretRACx#Fx*()M# zCxwfRSVR6`teovv%(Fo{8lLK{M%XrnSt%i0sA^$+l^vLSgB|1j&km5c{|~80Ts+7i zR5x<9spZ4?mrGgW!geOJu8>qMM0XKY;rxcyLzUF+gq{e+h4P%Rj|*Wz zDCj-6BZy|S`ERxv7ia~e{E@``4wNa8)y&RoeefO-Qc;xdzazSR< zJjCy1I745PfMbaf36)Q1p{r_QLH0%=rZsfhFAs3(fq}oBVeG2|@eU<|%>Fr0P%+g7 zg5I@i9bIAB1~gVkTmSJ@n2V>Hd|9Fa`671)N+OQ@OJdz2MgvZVVXH}uy0I_FSlsh4 zWI5$dPCgz{b2<}QyOiLoNJ)7&!7@m=WNijFX|xkdXZ|2rD(oNlrrGYD#*bNeZL|yr zrIYb=IJS&NhX?n!b8C&|dP zx(D(SSxP<$lHY`Lq}YUfN)gHB-i+lEE>2FEM$unzHH2D>Uj8CO@}TaSY`qCI<#wMl zP}>V;y&ZcV{{@TnURh~-$$wBu!uTG@svI|Oq==386$_IV#({Vu0*ZXEn|E$kFe_d> z%CFcVdig2z&@F1Zbqx|A@R`C$^H1|rG_Cy*jiauzrg1V7sDY2iItrTFEkLXLE9B%n zB7bJP6QQMG6h8$~C5EPP^SIE8Mav(2zVZXdzSo0fRu^JFW(lsdrtLFX2YJY9m zN5E0rX<6I7I*4GpEs%oru)8FG->3vE<1&-FgBDZ;!V(DJfkKP^cz+mV0{BjIp{3zm zAZG0ssCiFi30V5qQ50K*oSLEx;lG%c8T~b)MXJO8lF{nMlXk>$*O@0xdE*S@&A@%i zyBoY@gafScOp2)@mLlGol0a0LSqnk@y4e>uueQgc@?Z5Lo(<8_VVWvCEv-OpmL#%f zx40hI!Zpu_DIpur7zVqhxue|0s>+C^lVX5BIIT`)iI zPd2(st}fmE)-4UN%alO=f;3}qxx%o&fv6yeQ^{}NHHCV6;*-Ch;85MNO}!JHkrh-j z+EQAFfH!7#jjnehcaD6sQ5RG=1;Zx&L2knaZ{I#P7Y{3ymlg7*&;Z>^kAwK$pMPN( z*v7Jzd%vC>DWwPjUvKpT>5h1QgMOmVv`a_{JINV6$3ed_w$G=f1Lm@D!q#Z%K%Sm2 zrG$B26wGL1OR|brg_H{QhoO(G>bt2%T`g_pn^D=-F` z`3xtjw#bwoUF_w>Capj>b&l?cZ~Dp zyuO!|rKxGLpWmJIKejFTY1^m4H}lbRF>})vXLgJ~u)K@VwXI#dt&GxVdp0(0BeI^+ z6x8B5zXc!HZfvNf$GFqY8sKM*dox&=J8-mA$)K@1ny}_3cD;Z1QTLI5z8EG+5etf8 zk_lsHHQdi}qfrP}OtnIM#xQDYU!Y zNmjaqw_QwQFzW+vcN+$KN;pzocVc?Ali|;g3d^=bmRCY%=m|{@zxQRRL`@=!>P*^p zAFBa4ByW5!i~>8R9-h!A!ofZZ4|fr6-w8Yz@u?Fae!d7t=TAdpdyA8{%4&^t)4&P< z<_vovATMS1Cfi7Vj#}B)7MB_XEEC7oXOP$@;gA*dqVr}Qk<4mnY=xEar@WRzRx{Pw zMXo7r!0AmvGD*DRQmJ#LO-Yb~Eyll&Yu;qpAG5~!zSEi}k9)nBKIwmC+Y*e2Q#IuH zqPaM*BN!)JAcpvrh&^1VE_7WydO=maRNRi-XsDuMg&?P9NtlhY&7By{?iU*lfAD0N zOVzA|K~i6^GG_fX(UPgwdBvK$7wRf|cgRa=#v9L*6)`{gi(RA)bhQCwpWffAXR14P zuT~S$==|PaOkS%)RR3m#PPkC@Xu$*PE3xhX-KIiYODzpMCZiES@N$MVqk1s3R~WRO z&hr$}Io_l!TYX}f!9mdi5c3%+VH4E}9YBP%O-4cF-8goY^uwh3UbL=+p^Kr*c{#V+ zvp@{?Tb4Jz{7OhJxT8>9Hp(n}kn(JZ%z}zoR?VbwVhpuv-7G(el}`qthp{iD?7_6X<}V-{SfWoBtL z4p$Y1_F<4u2A7b%5<$gqHI%;Q$4N#cw+1g&&{(YJ(8m812PsJ`-Iao0;NKh4gftB5#d*8G;twW!}hDy@? z;C+0}YW;c3s9vtDXQ9JR?Ou3@BbjHV!^?@;;b%G%;;YBme%t*Fks!q&2{DU%T%}HP zP7Kfh<(pXWiQ1p|&1`sYOXSON%xADum_^bF$FrD1Cgw-%jNSzEYM;u^B1iftFYbwfezbb|~7a zR!c=30SHeA; zU?j@3RJdl~9 zG4<*R%^r>007s1ok^)JT3rFFWX^3Re%tC}nTW5z{PjEMXVwWDLqm_pmAFI-b-Pk5!GF9bMq;75cC6Siev5)0O);d3z z@#!yZv9NHeKtzgjPsD+zus=GWv}+p9v&<|j^^BKBJA5GY`;eG>%J?elG>TH| zW1wuZb=7FNL@ec?)Or{^{UdSY|fqI%3Qpl%KDAdAHojp*jAxb0#r}{Bw?%Ckd zs$KVW= zdRRoV;^CkApqDxZ36~WN>!&SyjU$nJAj8HTo()#V0Mi^O<#LO<8#}y_D)($IYU-0W zXY|`p2_!-*7hi!Uo9+ySPkOcpe^;w+%HED94^^!L6m$4^txsW%#)pRwOQ!nGQz?8& zNAA!v>$e7k-&I=5OS?qV10sV*wQ7lI4ivamz2+yMCP%GGh=&N_Nb%j&~NgAL$bqx4#3PbupL@X;X(pc zNj!IIAr4tp^?Y}-Q*e6`)qEn+T`C@ODj#C*-v4@X1sm^K}f4P)@YUQX>Q49 z4%$H7$>prtKI~+yz*cYtj5&R8%zK@N}@JzVdz^>KzN2tA@iu5k;JJzV{OF2 zcAP_QqLlm>EqvBmT0AyVm9UTOmsI|!YOg7T>ThQjJIh~rx@)%#q)FIHa3d5cg|t0j z(kgUDSv(d8rV`1phrs>MCqqzATCONtCB5p!g!!q_Zw&pA zaLvoPE?vJSw1$q958vl}ZAA0Pqc?xJ^8^(fi?o%+d;tg>a%V_;FIk-T+f<5QtD564 zA>eq^EFU;m#%MF$7lmG{YbpXW25ixL-j`K+ZKuu83i41O2cfEt_P1wXE?d%E8OWV> zp1de~ITr;_3Y&PpC~^Tfg$G`jR<;2Ir9H;{JN*p^9*}sFr?%X^(db@=sU!TNN@PYl zL&zB6m4&BO8S?$wRn>uY?(`}RXh`+5Z4s1u!uY)PZg&DdnU%R)i&@=Eb2l|)HHv%< z38zZv*1_#W-k`L$uC)w1I+vtl7`ZmDCbtaY%K}j43Q9Y@3k1B2!u~x&AH2gvUi)m@ zOZHvG)A_4RGnoZGQlT_XnP)YS`}i-gQ-K-f!az#=z$~Wp!wi;r`bA2-*UYT*i_5F* zW1)rlyI&CA8{OBn5Px;t`1`1P zc|y*9j88n%b1EY{61R?u!uL@Jb*ccXYyrE}+Ktu?xN~QB zC4W2P0%MuJ8%mpGoPn=~9s zJil&}H~KvB^J=A0G03v-jj-U}F`OE}xix0TtLQn41LXq;2hXoborxoNb2D%bv|fCR zLL2XJwZ`zJxd6@un9i8DGF$fTDcF4>ug}iINH7N7Mf~Vliaxf7P403RyX!^dGkgC0 zWS|P?G24)iUDoxZhePM28inHS!xIv}QN!>ZxO0H(Bxku*3G6%R9zIxod%InlwZJ2W zA{E5(1D&X`SMV+5_g%IB)<_5L#4zm(s+-$YbwgFAd&P6FdKd6iLF|l&yCBM=NWhREQ*)SQ@D=Wh@A8Y;mkm zx0cYBqpIJz>ho8i?$*uLg1W#`yp{bP`er4Aum*jw%75Q%7k2T~hHNpuQ=uPzPVSi) ztSspbn%r9Jnxc8!z(Hli4@R#@I4Ljx@>8I z1@I1!+1d6tomvUY5szL!%QOT!WMzsO+0TCEt?QXQ@vA;xkwPmmMaDyC9C_g4Bz?|G z*@yMYxiVSBspL4|;kl-Fn-p4U4kC$^yP5Y%Url?}Twjp7vGRUYys_DN3yA5tepiJS zcpH|*V4-q-Jda)cQ_BUFBP&r}l&T8|>KGa0x27KGN=!tf(rF|MMgnUKS zk@U3aqx!ia$16&+b=j4~veG7F+NU6mXM2tO!`OM%gs%$%QE(W3s3}YTjmTbkPV{{- z^IsWZQpnVK6_AW6Wrt#U~M%#o)XrW0Eb9RNjnZNX$NX1W#xat z#Hu>y55E*4dVladnnuVn0>;{?KIT=V0p?}TCJWqalLs(;*LdFJXLlO}Svwxn+l!#^ zl3e`~wi1fVG%!LowM{Jd2`~y9LUCLrR;sjqjt4OnHOz!SZ?kff;~cD~ix*9@Ra}g3 zC^=MIsUJTLYY87cl^l@Kf+E2Mio_}9l`C+&a-lHH__9eA(Au_O^@8LA!U7(CXZP+u z>@qq>r$r?vd(pU<@+W5DtSzGOr+8P53Nq*{ta`kC3ILEuKSyT?7f!d9cR!rKJ=@df zJkiy|OXi_2dZ!1^NjGl_xGSD0z&~~%uo?Kki;hqhvXVH3g?77uif{LVvg<2hA>_PiRx0b4uTivtXJ2$<5 zs?A}&7GPKb==#6q?D+)9x2LXc=Ez>Z#P2f17wAn80u5F4K-q(1pgFrJLUHN;{juNw z3BCXKkyaaqU8-%ne&YaT#TL4uwHZ2t1K(BSei=l8S^iA1i?5^KH^Hk`jBDTR=DO!~ z^e&WOp4Abs;^r>yQRRUs$`p*!Ggx{B4i_+bVtohF`wnw?N@N9ViHX<|DM}N9$ruEmHrV#wy6-2C;al|$iV|AT*Jo0Fcts3-L(5GtY6BVQgz={<8nb*Yy~Q3Qtpkh^gG zq<_;gpNaoTID-G# zQb%rpGiYcETn>7GQ+<4`4v1DNGS0fW`k+2z>OeOKgA4|un=A^9oVyFJ$ls=|0>7-q5jMvdx66qI_t=ul*w74L~4GBsUPwvku zF7Kp7eT8~wuE7Y{D#X0JV*wqJmp3=gzX%ZDCTY=!ex*;W1J^mT{5tv-j)BQuKJtL#E0 zC&OOXzsfp4JRa@xi{0Ig?ZQt!`lGPs;lRsHmz2WMgidfmp(n{(mkxi=(g0N2JtJ!> zN<*cc+r7W$5NC9rerePdbj5`+7LV}HgI`knK*Qcq|Jbd4v6`=foZ(-L_3|%^PA|(~ z5A60-JYAa*vQ^?9{^eBbwZ<&5Zn!sBl&Q-7ItF`hO-_o2+~s0TxJ;E-SA9`oCt0D} zm^t{}=8`%)X#V&D@9&hddFWW#$M?P6u2K8xO$*6PEtlg!`Id1O=#!$M@6>rB&nWXi zJLktdnkcq%X@&}5RcZb}Ub@A-Isf$MX*bkFiSTJeSJT6z+ zERn!;heMxhM;V8(zCJjj&%ov^)?4pmPF?1mqG9{PDnvDa++()izM<)Tg=6V=bF=fmaZ=O9kb;#tFhD+SocMRL1P0p>E<)jRj0^_nff|g(B znVQjl@!4$#9Ld?%q5n)|4)e5AK5d%lm(qKDr{S{fOpblH;K5tMgC17^H12^1u)x&t zc(qSucO1e)<|{qas!fU5vJ&QuJ1M-Tk6#v1@MT#1KAoc2TTkvRzAm6y8rXgxZ zMDoT$);JXOn2;3kaj8ZJ!lnpoQYR{!AW8>0blT}zh}v-7y-^1$8j<(nuSC8$QrE;e zz)dNw|K~f!ed2p5LI*ifJuQHWr)~YM47rUV!s>9vgLfT>nCRjGfq17zUph?;<%N*( zpy4?SB;z!Wv%dG{AgCrWcB8ptc7-2LcKEbEV})#}lxb9ds_)erhCh5a*lR7`f3-*{ z$qeL-Ue>@wZ)9m&8fZM)-1S+zN_O-tvzVtsqEgM2!v;dNC8LL_Z(O@Qk5eJ8gY#(h zetuE*`u+ZQU0qHdN7f~!v1n$YX707O9T zABU&MTz8#%u%Mm>hsKuswhw2m5Z0TZUXOXb z+CN=R!PM|9_?NQtE@Lk%m69#9;c17b|4ExY@6zwyL6V9RH8>i6@eb5Dc|{mRBbJ9U z0iLW@E?w(RAXBH%nf8)K-Bu_;m>6)uDZAYWm0KeXcdi7ds`Hco<>bD}G-jNy!01}C zv5Hx1EG>gxnrQ&wv$;I)akNY^^1U6R8h5Tz;~B3HIXkv&RjX5`ISzYa8X>~Q%AP2G zH~0!Rg%qN$^t(!V5th>(m-__E7uty~jNbYcA5@LKHoKVe$AdWZCg9uz5s;`N`IIOcecB09 z1`6~GhHP==<>s1qreNPl<^wA(4E`F3WBoLk&)nKXS^~&}_kAbHe3Idvo3K-BZDE`R z*d=1hi;Fe}R}T5QlAeb2jHq4mdQ&S`gTVJkZHW&fVR07-}6Gy1XxcUL++BrQC8Xf*}i zZv%k-S{~V)Cp-lGw=vk7b&S4Z`}VRw%yJTc-J(Q^5+zEMC{dzBi4rABlqgZ6M2Qk5 zN|dP4lLL*TNt%7_V+Gvvqbo;pC08EnbfO+OInpEwrvyr(RkVZxIUQiK{*K8MMN#BF z0%+;yU3C|69xaWZF#qDEdny39-II0L>Yi{eJ>rD%F|Dnwt^XCnD~BKxsGMmM`RU|c zO{8%9K6Lr8%87hG*E@x~eS;t;*mN7)mBKDv0f0-FDU4igG}sb3(0B@8d~VHhW#YAaFyBrNDQ!XP4hCra)fVu`KqB6rQ^8cK1WGLGi)vuj(!V zz@5&M^BRf);KwV1f;EPGU)?nv6KD{x>>^*m2U|_Qc%k|s+V}ck+gGux{u~5=tJ}!+ zVz%I5Ig;n!Q|{=+CAiZcokE_18`NXSzpz-u%3kJ!zW=TTfPtlzQe2}$ zgkFAl{zJM>$~h6M(bZTA`s@+_40Ol25s_=G6_AwqnS*Ro9m z1D3!V7+AK+LgZt1(x#jnR(1i&^w4r5A4&k4>lvMd7G)J7XBw-$#*l-0YW{yBzHb45 zKXG{;Nr=eNMXDMAfTJsDoX#iImoqC<+kxDr@m*b3{f0X?)dSdDO4 zl80C>B&9ITB_n^DK#t^00cSPwRDOC})3DAj$E*LxGhTcD@aF=_!(`}dGn0Zb(ciZ) zIa~dG%a~}L)UrH!EYr`|qUAsy6gLX-ZXRMyD$759Zs^L%pAb&t$zy%G+GW{uSvF+l zxE8$)0CxwDo*%w{=*m9xcoIXmri8{(h$%;N!eTJjzW#L^7`Y*w$^QVWK#K=XkUwuD-mR-Do1ePc;!Q{~f2(Q;fUaU>Sg$tqgwYPUN#LT{XxCEY;w;be{R~ zoXGb}3*oHWI&|YHGfXijiZxjNZH)l%twPVO;MiZ;e@XYcbLo%Ezt!DtxZTj%!q7Hx zq{$(xerKJ9@Aux2RWzBicgcx-DE>w})3;qK5FMvB0_#Q-0G!XTG5|TyxRM2x$?vZ_ zvx5;>4m4r>f}h&B1W5X+ZTtd`JGFFXd(2c6WwUKNB3KN-l92O`z>ktDla(p?nT)_1 zOF>sIbB(=qvl~i2c=Qg5^Nt3S%mh-(Od-aqqq#+W_ExzZIj`ap3a6RsHLa=6fbndED#& zquKD@0k)C$IAGOzSPU*UnqW!Dd27H&NgpJatk245(S)Mz;1Xlg?Z+#o8d!j>Ib5*X zC1N$YU^&g0s2&Cnr@ddP31VHdk&A6&E3jB&b>~u>Xta+qSPnF6 zSlJs`emAcI!2SY?qeV22{AmI?lOs8j^W;hA65d~@OgXxxRI^{}`aWJ$bRofVAP|vVBNe*?mr(gIE>Z2_Rx}DOLje*nRRAw@!sOh;xC)j+m@^N z`hJ82%e~g@~2ifb~lwjXyPhIK84J-Qd3fA|zOo0iZBJ`<)z4#fw;t zo(z)8b=8tHQIXTFxZ9gcU!meKPDw;j|Bh}Fx+ENfQZ%TNiVU`pM5_q z(jVLojpaVKtttNM9wO;0s-`MGw zb3ok{T1WxpLjkm~?uv-jUsYqudL%Suu62m*@1iBUvF9De{M#z!`Y#3f|>M>H&94I0BUnM{aL zqi7UZQG-el`Oy(wg2s>uLBbkkiA!8U(6EF@2pWZP#1Yx?ywg3+OwUZ;?gl0)-JRPt zX1LQmeb3kTo_p>&_e?0tS)An&ErDBtVFGgmL*SNw3z7XjgDwW1@prSUcMCidbkX0F zd}T^~I4GDS98&6q?=lX?!LKRBIQFrT4+q?Ttf#zTDuhBvr8O>pw~)$EmXD`{Ccp$*vCdb!bT2DerX1ZIuAwR;-XPa!`eug0rE>^SWzsj zC{b7n{I;nup)F7~R^hLZ(BHiRvx9r+0X|MUR*nxxmMzDGY1H)~w-O1U+v8hFBSu&fUn z#3J}xi~ZT*22%@SSj5rzvRpL}!VQjA@RDHJ;)=jS8mf`QqA~or59Ib|&*Y%ugFF)) zt>7iXvc@$Z4`EbeHwCKbV}dHK%K|H|Yl6yDKX#M!p0y1?DIKklvL2~|mkf)GYfubw zuS%<)f|@22hwN3lGD0 z`yFeW&B3Rt!(m9V>c4Yf zYG0tt{_LAYF9^VT0d5vKLcuGBGibTS!k`$D_|zv7aDhjAOB~M);-I|+JV>x+GkQe(l3P_Jy!+v0i=S_$*#NG*6tvtfvx3CcAj7+eGk9#VF36#OoL6ye4w zhP;pk`5j#f=N>6=N5^NC{bm+?e2={eYHg;zL|hvh4!p*m^%@ush&4trj8#8)L1Qj^ zk6b`~=k;s3Xe7bvy|kWLFk9PIgSZyJdg#4Gw$8fi6Y-ox=&lF1Ujr6%m+Z5sdd~u6 z|C%luX=_8z-iBAVz%~kca3)^nr4J*+kWBH1}r1M3uiRkf{xjaKiwtbhjLR%z%&~;tKEx z)6d0~#Z;KFR1zwm(5_Gj?HVg)Tn8ziWr7qt-~!`g+Q7v3CK1IBkUy&rN2F8qa+n5@ zOgwrT+NM*O+Gj;^jg!k^oLt-UB4TR)SL z`q}!iLd&*5Sy491gPO|$yv(E%x&VF78s$DXpFng5#Nn7L*j z(+6-AUxPlUxlkM<+_VXbnJD;7n4l1b6%7e2tb~qeHoPGXS5U-Md}v*JC`wru0cSRd zoUNE@oXhc<&4sDPAX3{Ra0r$01h4XXB4O?TL6ovN>{p+q2d@eW&a$_g1Bx<1?I4S; zox=nwqHD*>gnQOZn5Z3>JyAQ;97rMKdP?q($5XzjQN6=%D&X=>x_`fLYc{Ck#xkGb zr+z&8R~D+D4b~pt*$}D^kP(_S4{|f@>o?a#V$=90bve)@+&V-G%5BUo=}|AYo9cr! zrcG~8!!tMqm_h^L_@3P!0zn!+ofV0=rr|4+BMb@G1ib4+m|zT)P0@tIA%F-RUaoYA zYbt(XI-Z6g8~rubV@eA*re%q2O=%hH!3%3Hr1EUD_(OdpECIereGa1x>4v|@3E98b z7|j5T!q08pY@j*L8YY9+n$9zA4ml2>v3IycGqK2MPHa*L*L3{0IjChf$4rA2@IXb^ zE%JTWxE;2_dw9GH??4=av%YFlrRmYx2Y=E)rhv6LPXe!72`{ zRpxyUd~P;KYlS49W+l6#3K z^$v+(^)#zq8)Fp+oCd-6!Q$MWNS=A`X%(%@3LE&HY)9FiWw|a`IRi{R>nOp^26A2d zTQ=I^Ezq@-9fw1~Wq~yd)^^!F;84|;w|2xD=2~5oS^W``Jc`F3I12s`OwAGa2r}(8 zdDpgB9Eek39OwCtQ_+*@{}5fdO?x8Qc=8koE(lZw7fgXU%nc){N6!E-p)E)i zs0zw{x@{_$W~@nsZA5RxEHa1RXV6Ou7F7%^f;R+Ahebv6I0DauMMdJy;%G@8buz4{ zTwjP&s}nUdArp**EpQo}ty39|B3|_G^e;2Uei$MPW0pQ~%!M=HX`V|1F?~X2#;fwLLzX5n!>60E-zRqG5YH|6PJ*w8iuyu0KKh4gQz5q=IF` z!4++%6-luCy;rY)N4>B`0cZMPv_oK-EG1lt^O(|~W_((@R|KxOhepgNS%^Box#MLpm8C0bO2DjmE) z^CdjrDzPnQT+zI9tp(OrMvqQ`iTd$1!8H+0kyjP{3*d)Zp>KBpEEBHzaFW*$7!=y% z&oToLaJ}5FwcY&!vA1g_x5d0Eh~(0td-$1oaHtb)w~ygDpdCi^=I{mZNk7Pbbyzem z5ZUk{J$%V$CWv_`q~3{*qV~ZUeD8;kaueJ#$5suHDE!T;dP}B=s@@qY5Pl3>IAQB8 zP9DzUEY9LA!zf8x)<6n#tbwF|1yvfL9M{N%HhV~CEb&xceC15MUC=1r?Uggii%SG{ zbRDeU1NqFc2M&r%(ko%*uNvuI$v!snA$tFD1<#@dJPS>^zw7zWNbpQ;$O1L2t6XA* zYl+*sN;PCbYC{4MS7~E0oMw(1gPw!(Hu{uOgyx3Z6od~6klHBLE|NzD*ier0jSvzVAORa^wrcn%h2y*>-!-Kwh|f+*1S=C7lFM2e}q?YSkQv6&>}pZq=5vl^-b^K+4~_6+x5DBweofSc6`4d>)wI& zO$iRqeWhlwE3nyyU>4R`d7zE%8mQDFl+zqs7F4GZ)@RVKbqp-}+fL$urJcM7@j35@ z9N3AXzrmCHn!arZwm^edR6r?0`T$?0%wHO;-vQ|k&wZt4u`U+{OlI~h1jr}pC)>tq z+y*MY;NVKDOyi)chJJyB&Y{AxKIr~jhJ&+%C-*hWP>7!oo_7*Ko#gyo2w4V)EBJ++ zkicYpuxheCf+uU#8rMENq@fxqEc!SJ&AhpK>X&Yk3hNZq62d6^&Hae)sK6oYPz4{P z425|%>E86Kn0Lp61=nD6$i3=d^%m4L@4zu;Sg)D)#{wRxYI1EFtJCLuDoJ zldphEFjSIsRuRC4zvAp#!4di+*wXhhkKa>Ybb{EoD&Pd@iyWljtx+w2bHIcy=q#*Q z5-N+aFxa4D_|#t|-~x}^EvM{+p=Y<-#N5|>9H^Gu*DmI`2H!y0zy{vj*A9I-0oDn) z#*_OxECp|is!BAe$l9*@66)A@g1BTI`V)3SbO_|W=36OPZtiOzA@{Wf&hYdu4Sdg= z`#KB-PoqjRZ`v3-s%m&pGpOoCa4D`DHC94g70i9jC(cIX+}E4>3M*XnU%xmm_jPLD zVtVgp+shJBQPes+6Vx&@vbc!3ul44EdkX4BLLvELYcsw($nWbu24>R|*ftf=!&>)!mIt&HB z9OfJ4+GpA#B%-3Idza2K-P_u(8pKrrXW^be?(3cU(+sXVqPefbgT>q>yA_R$R*~G- zVJP_Crsc*6SYZ4_A}TtW)6j61#{{KuX%Uq{B=@zu>m+nb$bB6?ENQu~!%*;aw*}f% zP!6Ff&fHgLaTaHB7H4sm5tWrvB69y)Wr<8#KnI@an9HiRB-LV(omPwGi{%z$aM0Yd z)H>o33?V$qQxcc1G9<&Y+9gjo7*&$;HC-0$gZ(J@pI|qrV7+dsfY^!hSM{&zUzRVC zrKt{~xpxTCR7+$pGqs5laQ$91_tn}S-vwzy#Fgmrrk;)^s3Co+Lx;#RWhUg}7yku* zWPD83PzWEwMxxk>@{Ri4h;)nob=Zze?bG<$4zJ_ibnQk_Tr1@1utF|wk5@nqTG%y= z7k1weaiwSOhQ@*Ky8Z;mawJ}|RXk`-CCT3EI|wJ}eTe4V*K2Sba$qAN_q93vsIe5v znD}2YyT~mDIvJ!4*KkLT%_6z4?-gx__lm?|(Gg2i?(1hm#+Bs$p8gQr*>>(wE}T3h z@uGb3pf$C*EEmz-u*rS>7VEMhncs8d)!AYSf7<$*=n!b9XzuGy-9gx?6Ki=noM+QH z&v%qFAra}gUfa3{F7$&}S>Zl7o##MU+xv^)OP<_U4fd4ngxuGeubUOESwd;qdNwZ)Benx-#Dl9uhv`{kPFn;}E{I8I` zl8-~@FwZuNWA#PwG4M?qA0d)cjKF6(A^Wq9r3}F1`1w}5+}F!E-_k}v0hF+j?-G1Z z*W|)w-rU!6My;1}Vv|C+cHmtw#KnD;&K^=3%>1wP>ko_#_GAPBjyq)-?i zE>o*Mg6jAjIAxdnI#Bp+_0^hB4Ijb~JcfKjvbLufjlMND^WHjD4sCf6a$o<(XsA+r zl7rW+QSM}hmj*v0<-Qu)YdMig(@qD2VD77QT!XN*@p*9EF86g~Xvvn7JB}LiK)_>Y z>RH0R!rpBq2>)$Z&UwBoRarO$i;1q>&OOD9u!r%wH3hGz))c&r?@uw?B|8OjUpus= zR>AuY(cD)uu3bb}#Wt{(_h z+OqH}4eFGQgl$B}Vm@YP!^7CSvha17oee*RV*;i_c2OZm;6lijko#ILX_Sy*#ku}( zT(LS=vll*vhucOt8`1;hhW-q*g>fscrMBW6_%Zw$1uwy;w~hzb%knLHi=9G@`+bI+h ztR>#N)|aSvx8%cBf!x<2!7^D&wz;oo3AjMst=B*${G!*R^=?`lHh~`huEclU#C_54 zs`If=-Dh)O@9S!@ZSP9VeJvM6#f7yW@(rm+64mj{hN(@9iq-o|_F`*=a$koGi>HY! zuJ?IzU%T}NHuu%!bui_=8rr)Ba$i4ay>65HdL2HHocmfXfQoB6e2)L_f-Ufxes#^7 znm3!aUft7w7;e@|xW&k#Wi+mGxFVSQYVv290SLHW?(*cm-W@{jYdI0spiAcnG|q!V zy>Ju$3I~C97}1-Ng{gJ6Lqzn=SxEld;VUzvT-e}g%v#{RDsGLJHBo9jN6BnD+@NG1)PVLe!_#We(azHY2xByP&GBv^*?q@h$mneGOX=I zR1yLUqvTW&qv>SWGORwJxAEOPM zUZ3D58I@9v%Y|}WmE0gLT)b~J4~lEX#X&`vUs@am3*eTnT)RH+4|}N;M$;{);!*VR zl!x8a;TN3rX`R79U-Nz2%W5j_W%c)Mj7@6zv@SRa+ew~I)*Yb33KdKUVch|#u-vFHZrTui(ku7%G&U;d9SEuDXgJDO7 z37n~Pbxw*UYRFY7Sy04oyDow(Sd}6T)-GlRRt6s$*2v9z&qjA;c=TG~`p=dBxzY+% z{Vr0oMhweT?zT|2+dX{GYlQccp4Z^OAnBCG-Zml1Y4%kREH7}k9Q z#TPeBl)b4x2-c}02jNY9qJ))q0oxnPAs2D2QN5wh<;fbg#U;|KJW$6dP}4+Fv0rE{ z=YF9@1x(i}cyy2etgGof>fKMmUS)e&FL`9NjX7s4PFA0&F4z8pqgVdXS*|@%eX{y&MPrV1Sl?=KIN8JU zl>p0r7^YV4X7bc+BXo2OIJHs;)iR|DxM|!P)Lr!JGXIVTxBm`lZR9qlz4@8Ryc4u* z=N@4(I`>E)hM(6^;gr2&XVil};d?yjv(u1k)Z4AX-KVWG2)Dx;H5t_wIAoW`P0V7p zF&603di}|z{Pv8@y{DQiMo+cOouuIFbL`LGolQ-!yNg@5h=T9d*v-(#tG|XT@Hc3J z&pCbMbNu^nSpPK~ua<(!6nvm}NVW6lzVe_F#&L{t=C!-qBzi&SXEkBxD(`E5m*9iS+t{o~36WtNWeI=k0##I$EpyLrjR}~_- z+!<8LF1P0W6!lZo&E(tL?$tkN;<Xue;YXOku=Mgfqg^^v_fpd!llB>>^scl zzW$k+|GpPby&KhW(cZ4I#`V(`f^F`4qu6rRjbcIP-*8}Isqnea(Q)^$R!DIpNQJcv zikaNkvi@=@sBm@PcZJUc<>KnQLR#am_S849*EXycPR<)9Ec%h$I>0W%4@mUIN`+Mn z2aK<4Gum>XMPfqdF&`5yTWdYT!?eWiyK+q6X%_k2@4_eERV0RC34Y%{@{NB7=?R_3eEJ*i*W`NHTlI!>4;qdMcYK%TFk@G9n5ZD`46NVA ztz1!W`H8s-f#2gBPVVc!Tyg$ruCq9cvycO6W6&UY1R{c_h6o>yY9<|M9gHqNi3?j{ zi^c^%cV%WkIv$veuQ67&j+R`4l%|FVAB%=*yI70vMNOb$C?)fatEoh49u+`&5XE+( zJaN6~k5{=<6IfRq?Pl>}YCT19x#4%a4N3BN9yiX=ovVUYv9uxLLitePkr`h#48~7x z_h`-st)?as#HLYAUb%VYW-1)diDg?6i|@mk+Q}lgT&U4h2)m7ZsjcXs`(o7z|1kC8zk3Y+WhYnhXP$B|B%S%UKUaxptO%$xga)c9lGJ{8Q}thmTA_B3_Dfs z{g*<3{ysZcbZ<|sYqSZGx?D{+@6&3eQf>OX2jVmBfJuo^f5ZA^ziEz8GuuPxT{0my z4~vz&rM;@YrCpk;AC7|O4qa9NDqUdEGO%{1+3ni%sV(LWWm@(2mh)yG>Zq3U#QyH4 zKPN1M{+vzE5|Nw_*KicP-w+4wlg$5ZGtWldx>5lbQ24vul#ftv*OsyIWEaX;TPD!o zU4Pz8Zqv_vzWX8L8jgY=GeoP*s}FV4_3LP}`Tif6_2^Z@)+Yp2Vsgt&MKuk&RV zO7kvW5;SOBnx^-6+P9~_vxyXd5W^L3Ez58ey!#NXGS?sW()Ig_nEiD0MqD3ykLf99 z;C!a$HA~&E?jQWVy~Wt*7%G0RIdpM#KWR36-?y{YCeUB|zArUwJJVY7ky`LlW<#`^ zOyQ=(XRvE8L}ZI7<;iN3S&AU+V}`hrRK{8EUwfroTYJUww=xdb1TJKAlv_khQxRO& zlK&PKJPLm~+=Q#Ahu#HquCAxY{N%fMaJf?cD>oYmc9y|_t3!Xna>w^88%6)sIm%ax z?_P@Jzl87SCmIrq8d(P_EZw zOy99Aj`9@uZb=zWBemeih-x)KuhSr|U)rfBZ3nJVH_*{I{Yt?1d8Tu|&$|-PIDMeQ zs3V|4jn%LNjghLsm~w^B-70{F9U@wb7nh?fc%EAf+m~v_Ww#~BrFT-ZxBUZY_U@fT zTpqjMuj@>(`qZT};eMUO*13ym>5(eJKozwj{kk?t9 z#aW!?F)4J~8Gp{zzlHFgXz|F^Pd5S9xyikfqw-eTonsHf&& zow(>@3iAei2SqWg!@ zZm_PJ%1YFao{X}egt}|=qYucFar1i8aW~g_Emr_qHc?|fD+DOcz~+xKe`;Nxph7n8 zFxq547>yfu;JhgI1L1yFdmTb?P7GD5`um2pCHprm-q;sn@SvLuJ+j{C|UC* zfLW=`C-kA90;~|YQ2`56@A3FC?->@R;<;{u!#9ZQ^GwX55)!j$pQv5*@R2LNe>r!q z{#^ap3h$`5)DPi)*Fie$U!AKvf8l(Mw(49$GG~zBaP>?0xtkDj>h?Z1OiN}A0wloT4Q#Jla zC}C=#Q7LkY_^$e;@zFOS%&=0@0se8x^mMiE-G1GE9sZYt4o$9FeKM=9#cGgvT+0*o zeqGDs60)nC;D+~rS0lKz_uyr@j!g#N2Gj^M`-mMb;t zSp4D5$BQ4ry^f>&GnG_W%#PAO9kE8$mioBa?pCm_HBkO&BDk7{;QQev8}{wd-Fj&J zDvBVMR9LvcDLC-BqvF6?p9au;g<8mL{u)h) z=z5${abRs)jnj8$X-VDzFD3OmDt6;NgT9Vt{msW2)rgnjx3^kg y-QG&Jl`4GbpQSMBhLBe4EY9LA&f+Y?F8>eDX1}JwC6X=x0000